]> git.tdb.fi Git - libs/game.git/blob - examples/bassteroids/source/damagedealer.cpp
Adjust system dependencies to resolve scheduling ambiguities
[libs/game.git] / examples / bassteroids / source / damagedealer.cpp
1 #include "damagedealer.h"
2 #include <msp/game/stage.h>
3 #include "collider.h"
4 #include "hittable.h"
5 #include "physics.h"
6
7 using namespace Msp;
8
9 DamageDealer::DamageDealer(Game::Stage &s):
10         System(s),
11         observer(stage.get_event_bus())
12 {
13         declare_dependency<HitPoints>(UPDATE);
14         declare_dependency<DamageSource>(READ_OLD);
15         declare_dependency<Physics>(RUN_AFTER);
16
17         observer.observe<Events::Collision>([this](auto &e){ collision(e); });
18 }
19
20 void DamageDealer::tick(Time::TimeDelta)
21 {
22         for(DamagingCollision &c: collisions)
23         {
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();
28                 if(damage1 && hits2)
29                         hits2->take_damage(damage1->get_amount(), damage1->get_type());
30                 if(damage2 && hits1)
31                         hits1->take_damage(damage2->get_amount(), damage2->get_type());
32         }
33         collisions.clear();
34 }
35
36 void DamageDealer::collision(const Events::Collision &e)
37 {
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);
42 }