Damage.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. Logger::Debug("Damage: Player id#%d got hit by projectile id#%d",
  35. playerEntity.getId(),
  36. projectileEntity.getId());
  37. auto &playerHealth = playerEntity.getComponent<HealthComponent>();
  38. playerHealth.healthPercentage -= projectile.hitPercentDamage;
  39. if (playerHealth.healthPercentage <= 0)
  40. {
  41. playerEntity.kill();
  42. }
  43. projectileEntity.kill();
  44. }
  45. }
  46. void onProjectileHitEnemy(Entity projectileEntity, Entity enemyEntity)
  47. {
  48. auto projectile = projectileEntity.getComponent<ProjectileComponent>();
  49. if (projectile.isFriendly)
  50. {
  51. Logger::Debug("Damage: Enemy id#%d got hit by projectile id#%d",
  52. enemyEntity.getId(),
  53. projectileEntity.getId());
  54. auto &enemyHealth = enemyEntity.getComponent<HealthComponent>();
  55. enemyHealth.healthPercentage -= projectile.hitPercentDamage;
  56. if (enemyHealth.healthPercentage <= 0)
  57. {
  58. enemyEntity.kill();
  59. }
  60. projectileEntity.kill();
  61. }
  62. }
  63. void onCollision(CollisionEvent &event)
  64. {
  65. if (event.a.belongsToGroup("projectiles") && event.b.hasTag("player"))
  66. {
  67. this->onProjectileHitPlayer(event.a, event.b);
  68. }
  69. if (event.b.belongsToGroup("projectiles") && event.a.hasTag("player"))
  70. {
  71. this->onProjectileHitPlayer(event.b, event.a);
  72. }
  73. if (event.a.belongsToGroup("projectiles") && event.b.belongsToGroup("enemies"))
  74. {
  75. this->onProjectileHitEnemy(event.a, event.b);
  76. }
  77. if (event.b.belongsToGroup("projectiles") && event.a.belongsToGroup("enemies"))
  78. {
  79. this->onProjectileHitEnemy(event.b, event.a);
  80. }
  81. }
  82. void Update()
  83. {
  84. }
  85. };
  86. #endif /* GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H */