diff --git a/include/game/Mobs.h b/include/game/Mobs.h index 3be75b2..722fa2d 100644 --- a/include/game/Mobs.h +++ b/include/game/Mobs.h @@ -80,7 +80,7 @@ private: MobLevel m_Level; Direction m_Direction; std::vector m_Effects; - const Tower* m_KillTower; // the tower that killed the mob + const Tower* m_LastDamage; // the tower that damaged the mob utils::Timer m_EffectFireTimer; utils::Timer m_EffectPoisonTimer; @@ -107,10 +107,9 @@ public: float getHealth() const { return m_Health; } bool isDead() const { return m_Health <= 0; } bool isAlive() const { return m_Health > 0; } - const Tower* getKillTower() { return m_KillTower; } - void setKillTower(const Tower* killTower) { m_KillTower = killTower; } + const Tower* getLastDamageTower() { return m_LastDamage; } - void damage(float dmg) { m_Health -= dmg; } + void damage(float dmg, const Tower* damager) { m_Health -= dmg; m_LastDamage = damager; } void heal(float heal) { m_Health = std::min((float)getStats()->getMaxLife(), m_Health + heal); } float getX() const { return m_X; } diff --git a/src/game/Mobs.cpp b/src/game/Mobs.cpp index 01c211a..dc22446 100644 --- a/src/game/Mobs.cpp +++ b/src/game/Mobs.cpp @@ -63,18 +63,12 @@ void Mob::updateEffects(std::uint64_t delta) { } if(hasEffect(EffectType::Fire)){ if(m_EffectFireTimer.update(delta)){ - damage(3); - if(isDead()){ - setKillTower(getEffect(EffectType::Fire).tower); - } + damage(3, getEffect(EffectType::Fire).tower); } } if(hasEffect(EffectType::Poison)){ if(m_EffectPoisonTimer.update(delta)){ - damage(1); - if(isDead()){ - setKillTower(getEffect(EffectType::Poison).tower); - } + damage(3, getEffect(EffectType::Poison).tower); } } if(hasEffect(EffectType::Heal)){ diff --git a/src/game/Towers.cpp b/src/game/Towers.cpp index 1d72d49..17c5f7b 100644 --- a/src/game/Towers.cpp +++ b/src/game/Towers.cpp @@ -233,7 +233,7 @@ void IceTower::tick(std::uint64_t delta, World* world) { for (MobPtr mob : world->getMobList()) { if (isMobInRange(mob)) { mob->addEffect(EffectType::Slowness, 1, this); // slowness for 1s every second - mob->damage(damage); + mob->damage(damage, this); wasTowerActive = true; } } diff --git a/src/game/World.cpp b/src/game/World.cpp index 2b638e7..8d0d29c 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -251,7 +251,7 @@ void World::cleanDeadMobs() { Player& sender = m_Game->getPlayerById(mob->getSender()); sender.addExp(mob->getStats()->getExpReward()); - Player& killer = m_Game->getPlayerById(mob->getKillTower()->getBuilder()); + Player& killer = m_Game->getPlayerById(mob->getLastDamageTower()->getBuilder()); killer.addGold(mob->getStats()->getMoneyCost()); m_Mobs.erase(m_Mobs.begin() + i); @@ -287,9 +287,7 @@ void World::OnArrowShot(MobPtr target, Tower* shooter) { if (explosiveArrows) { // aoe damage } else { - target->damage(shooter->getStats()->getDamage()); - if (target->isDead()) - target->setKillTower(shooter); + target->damage(shooter->getStats()->getDamage(), shooter); } }