1 #include "damagedealer.h"
2 #include <msp/game/stage.h>
9 DamageDealer::DamageDealer(Game::Stage &s):
11 observer(stage.get_event_bus())
13 declare_dependency<HitPoints>(UPDATE);
14 declare_dependency<DamageSource>(READ_OLD);
15 declare_dependency<Physics>(RUN_AFTER);
17 observer.observe<Events::Collision>([this](auto &e){ collision(e); });
20 void DamageDealer::tick(Time::TimeDelta)
22 for(DamagingCollision &c: collisions)
24 Game::Handle<HitPoints> hits1 = c.entity1->get_hitpoints();
25 Game::Handle<DamageSource> damage1 = c.entity1->get_damage();
26 Game::Handle<HitPoints> hits2 = c.entity2->get_hitpoints();
27 Game::Handle<DamageSource> damage2 = c.entity2->get_damage();
29 hits2->take_damage(damage1->get_amount(), damage1->get_type());
31 hits1->take_damage(damage2->get_amount(), damage2->get_type());
36 void DamageDealer::collision(const Events::Collision &e)
38 Game::Handle<Hittable> hittable1 = dynamic_handle_cast<Hittable>(e.collider1->get_entity());
39 Game::Handle<Hittable> hittable2 = dynamic_handle_cast<Hittable>(e.collider2->get_entity());
40 if(hittable1 && hittable2)
41 collisions.emplace_back(hittable1, hittable2);