refactor: mob move lock (Castle)
This commit is contained in:
@@ -76,7 +76,7 @@ const MobStats* getMobStats(MobType type, std::uint8_t level);
|
|||||||
const TowerImmunities& getMobTowerImmunities(MobType type, std::uint8_t level);
|
const TowerImmunities& getMobTowerImmunities(MobType type, std::uint8_t level);
|
||||||
const EffectImmunities& getMobEffectImmunities(MobType type, std::uint8_t level);
|
const EffectImmunities& getMobEffectImmunities(MobType type, std::uint8_t level);
|
||||||
|
|
||||||
class Mob : public utils::shape::Rectangle{
|
class Mob : public utils::shape::Rectangle {
|
||||||
protected:
|
protected:
|
||||||
float m_Health;
|
float m_Health;
|
||||||
private:
|
private:
|
||||||
@@ -86,6 +86,7 @@ private:
|
|||||||
Direction m_Direction;
|
Direction m_Direction;
|
||||||
std::vector<EffectDuration> m_Effects;
|
std::vector<EffectDuration> m_Effects;
|
||||||
const Tower* m_LastDamage; // the last tower that damaged the mob
|
const Tower* m_LastDamage; // the last tower that damaged the mob
|
||||||
|
bool m_HasReachedCastle; // if true, no need to walk anymore
|
||||||
|
|
||||||
utils::Timer m_EffectFireTimer;
|
utils::Timer m_EffectFireTimer;
|
||||||
utils::Timer m_EffectPoisonTimer;
|
utils::Timer m_EffectPoisonTimer;
|
||||||
@@ -93,7 +94,8 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
Mob(MobID id, MobLevel level, PlayerID sender) : m_Sender(sender), m_Level(level),
|
Mob(MobID id, MobLevel level, PlayerID sender) : m_Sender(sender), m_Level(level),
|
||||||
m_EffectFireTimer(1000), m_EffectPoisonTimer(1000), m_EffectHealTimer(1000) {
|
m_HasReachedCastle(false), m_EffectFireTimer(1000), m_EffectPoisonTimer(1000),
|
||||||
|
m_EffectHealTimer(1000) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,9 +114,11 @@ public:
|
|||||||
bool isDead() const { return m_Health <= 0; }
|
bool isDead() const { return m_Health <= 0; }
|
||||||
bool isAlive() const { return m_Health > 0; }
|
bool isAlive() const { return m_Health > 0; }
|
||||||
const Tower* getLastDamageTower() { return m_LastDamage; }
|
const Tower* getLastDamageTower() { return m_LastDamage; }
|
||||||
|
bool hasReachedEnemyCastle() { return m_HasReachedCastle; }
|
||||||
|
|
||||||
void damage(float dmg, const Tower* damager) { m_Health = std::max(0.0f, m_Health - dmg); m_LastDamage = damager; }
|
void damage(float dmg, const Tower* damager) { m_Health = std::max(0.0f, m_Health - dmg); m_LastDamage = damager; }
|
||||||
void heal(float heal) { m_Health = std::min(static_cast<float>(getStats()->getMaxLife()), m_Health + heal); }
|
void heal(float heal) { m_Health = std::min(static_cast<float>(getStats()->getMaxLife()), m_Health + heal); }
|
||||||
|
void setMobReachedCastle() { m_HasReachedCastle = true; } // used when mob is in front of the castle
|
||||||
|
|
||||||
bool isImmuneTo(TowerType type);
|
bool isImmuneTo(TowerType type);
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ void World::moveMobs(std::uint64_t delta) {
|
|||||||
mob->setDirection(walkTile->direction);
|
mob->setDirection(walkTile->direction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mob->hasReachedEnemyCastle()) continue;
|
||||||
|
|
||||||
moveMob(mob, delta);
|
moveMob(mob, delta);
|
||||||
|
|
||||||
TeamColor mobTeam = m_Game->getPlayerById(mob->getSender()).getTeamColor();
|
TeamColor mobTeam = m_Game->getPlayerById(mob->getSender()).getTeamColor();
|
||||||
@@ -151,6 +153,7 @@ void World::moveMobs(std::uint64_t delta) {
|
|||||||
|
|
||||||
if (isMobTouchingCastle(mob, *enemyCastle)) {
|
if (isMobTouchingCastle(mob, *enemyCastle)) {
|
||||||
moveBackMob(mob, *enemyCastle);
|
moveBackMob(mob, *enemyCastle);
|
||||||
|
mob->setMobReachedCastle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user