123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- * 2D Game Engine
- * Damage.h:
- * Based on pikuma.com 2D game engine in C++ and Lua course
- * Copyright (c) 2021 986-Studio. All rights reserved.
- *
- * Created by Manoël Trapier on 16/02/2021.
- */
- #ifndef GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H
- #define GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H
- #include <ECS.h>
- #include <EventBus.h>
- #include <Logger.h>
- #include <Events/Collision.h>
- #include <Components/BoxCollider.h>
- #include <Components/Projectile.h>
- #include <Components/Heakth.h>
- class DamageSystem : public System
- {
- public:
- DamageSystem()
- {
- this->requireComponent<BoxColliderComponent>();
- }
- void subscriptToEvents(std::unique_ptr<EventBus> &eventBus)
- {
- eventBus->subscribeToEvent<CollisionEvent>(this, &DamageSystem::onCollision);
- }
- void onProjectileHitPlayer(Entity projectileEntity, Entity playerEntity)
- {
- auto projectile = projectileEntity.getComponent<ProjectileComponent>();
- if (!projectile.isFriendly)
- {
- Logger::Debug("Damage: Player id#%d got hit by projectile id#%d",
- playerEntity.getId(),
- projectileEntity.getId());
- auto &playerHealth = playerEntity.getComponent<HealthComponent>();
- playerHealth.healthPercentage -= projectile.hitPercentDamage;
- if (playerHealth.healthPercentage <= 0)
- {
- playerEntity.kill();
- }
- projectileEntity.kill();
- }
- }
- void onProjectileHitEnemy(Entity projectileEntity, Entity enemyEntity)
- {
- auto projectile = projectileEntity.getComponent<ProjectileComponent>();
- if (projectile.isFriendly)
- {
- Logger::Debug("Damage: Enemy id#%d got hit by projectile id#%d",
- enemyEntity.getId(),
- projectileEntity.getId());
- auto &enemyHealth = enemyEntity.getComponent<HealthComponent>();
- enemyHealth.healthPercentage -= projectile.hitPercentDamage;
- if (enemyHealth.healthPercentage <= 0)
- {
- enemyEntity.kill();
- }
- projectileEntity.kill();
- }
- }
- void onCollision(CollisionEvent &event)
- {
- if (event.a.belongsToGroup("projectiles") && event.b.hasTag("player"))
- {
- this->onProjectileHitPlayer(event.a, event.b);
- }
- if (event.b.belongsToGroup("projectiles") && event.a.hasTag("player"))
- {
- this->onProjectileHitPlayer(event.b, event.a);
- }
- if (event.a.belongsToGroup("projectiles") && event.b.belongsToGroup("enemies"))
- {
- this->onProjectileHitEnemy(event.a, event.b);
- }
- if (event.b.belongsToGroup("projectiles") && event.a.belongsToGroup("enemies"))
- {
- this->onProjectileHitEnemy(event.b, event.a);
- }
- }
- void Update()
- {
- }
- };
- #endif /* GAMEENGINE_SOURCE_INCLUDE_SYSTEMS_DAMAGE_H */
|