Damage.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * 2D Game Engine
  3. * Damage.h:
  4. * Based on pikuma.com 2D game engine in C++ and Lua course
  5. * Copyright (c) 2021 986-Studio. All rights reserved.
  6. *
  7. * Created by Manoël Trapier on 16/02/2021.
  8. */
  9. #ifndef GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H
  10. #define GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H
  11. #include <ECS.h>
  12. #include <EventBus.h>
  13. #include <Logger.h>
  14. #include <Events/Collision.h>
  15. #include <Components/BoxCollider.h>
  16. #include <Components/Projectile.h>
  17. #include <Components/Heakth.h>
  18. class DamageSystem : public System
  19. {
  20. public:
  21. DamageSystem()
  22. {
  23. this->requireComponent<BoxColliderComponent>();
  24. }
  25. void subscriptToEvents(std::unique_ptr<EventBus> &eventBus)
  26. {
  27. eventBus->subscribeToEvent<CollisionEvent>(this, &DamageSystem::onCollision);
  28. }
  29. void onProjectileHitPlayer(Entity projectileEntity, Entity playerEntity)
  30. {
  31. auto projectile = projectileEntity.getComponent<ProjectileComponent>();
  32. if (!projectile.isFriendly)
  33. {
  34. auto &playerHealth = playerEntity.getComponent<HealthComponent>();
  35. playerHealth.healthPercentage -= projectile.hitPercentDamage;
  36. if (playerHealth.healthPercentage <= 0)
  37. {
  38. playerEntity.kill();
  39. }
  40. projectileEntity.kill();
  41. }
  42. }
  43. void onProjectileHitEnemy(Entity projectileEntity, Entity enemyEntity)
  44. {
  45. auto projectile = projectileEntity.getComponent<ProjectileComponent>();
  46. if (projectile.isFriendly)
  47. {
  48. auto &enemyHealth = enemyEntity.getComponent<HealthComponent>();
  49. enemyHealth.healthPercentage -= projectile.hitPercentDamage;
  50. if (enemyHealth.healthPercentage <= 0)
  51. {
  52. enemyEntity.kill();
  53. }
  54. projectileEntity.kill();
  55. }
  56. }
  57. void onCollision(CollisionEvent &event)
  58. {
  59. Logger::Debug("Damage: Got an event from A id#%d and B id#%d", event.a.getId(), event.b.getId());
  60. if (event.a.belongToGroup("projectiles") && event.b.hasTag("player"))
  61. {
  62. this->onProjectileHitPlayer(event.a, event.b);
  63. }
  64. if (event.b.belongToGroup("projectiles") && event.a.hasTag("player"))
  65. {
  66. this->onProjectileHitPlayer(event.b, event.a);
  67. }
  68. if (event.a.belongToGroup("projectiles") && event.b.belongToGroup("enemies"))
  69. {
  70. this->onProjectileHitEnemy(event.a, event.b);
  71. }
  72. if (event.b.belongToGroup("projectiles") && event.a.belongToGroup("enemies"))
  73. {
  74. this->onProjectileHitEnemy(event.b, event.a);
  75. }
  76. }
  77. void Update()
  78. {
  79. }
  80. };
  81. #endif /* GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H */