]> git.tdb.fi Git - libs/game.git/blobdiff - examples/bassteroids/source/damagedealer.cpp
Make asteroids take damage when shot and eventually be destroyed
[libs/game.git] / examples / bassteroids / source / damagedealer.cpp
diff --git a/examples/bassteroids/source/damagedealer.cpp b/examples/bassteroids/source/damagedealer.cpp
new file mode 100644 (file)
index 0000000..37be786
--- /dev/null
@@ -0,0 +1,37 @@
+#include "damagedealer.h"
+#include <msp/game/stage.h>
+#include "collider.h"
+#include "hittable.h"
+
+using namespace Msp;
+
+DamageDealer::DamageDealer(Game::Stage &s):
+       System(s),
+       observer(stage.get_event_bus())
+{
+       observer.observe<Events::Collision>([this](auto &e){ collision(e); });
+}
+
+void DamageDealer::tick(Time::TimeDelta)
+{
+       for(DamagingCollision &c: collisions)
+       {
+               Game::Handle<HitPoints> hits1 = c.entity1->get_hitpoints();
+               Game::Handle<DamageSource> damage1 = c.entity1->get_damage();
+               Game::Handle<HitPoints> hits2 = c.entity2->get_hitpoints();
+               Game::Handle<DamageSource> damage2 = c.entity2->get_damage();
+               if(damage1 && hits2)
+                       hits2->take_damage(damage1->get_amount(), damage1->get_type());
+               if(damage2 && hits1)
+                       hits1->take_damage(damage2->get_amount(), damage2->get_type());
+       }
+       collisions.clear();
+}
+
+void DamageDealer::collision(const Events::Collision &e)
+{
+       Game::Handle<Hittable> hittable1 = dynamic_handle_cast<Hittable>(e.collider1->get_entity());
+       Game::Handle<Hittable> hittable2 = dynamic_handle_cast<Hittable>(e.collider2->get_entity());
+       if(hittable1 && hittable2)
+               collisions.emplace_back(hittable1, hittable2);
+}