feat: add archer tower aoe

This commit is contained in:
2021-11-30 18:01:48 +01:00
parent 6a51638b7e
commit 1843fc6f4d
3 changed files with 45 additions and 8 deletions

View File

@@ -114,7 +114,19 @@ typedef std::array<Color, 2> SpawnColorPalette;
typedef std::vector<TowerPtr> TowerList; typedef std::vector<TowerPtr> TowerList;
class World { class WorldListener {
public:
WorldListener(){}
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter){}
virtual void OnArrowShot(MobPtr target, Tower* shooter){}
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter){}
virtual void OnMobDamage(MobPtr target, float damage){}
};
class World : public WorldListener{
protected: protected:
TowerTileColorPalette m_TowerPlacePalette; TowerTileColorPalette m_TowerPlacePalette;
Color m_WalkablePalette; Color m_WalkablePalette;
@@ -189,8 +201,14 @@ public:
const TowerList& getTowers() const { return m_Towers; }; const TowerList& getTowers() const { return m_Towers; };
TowerPtr getTowerById(TowerID tower); TowerPtr getTowerById(TowerID tower);
// Archer Tower // WorldListener
virtual void OnArrowShot(MobPtr target, Tower* shooter);
virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter){}
virtual void OnArrowShot(MobPtr target, Tower* shooter){}
virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter){}
virtual void OnMobDamage(MobPtr target, float damage, Tower* source){}
private: private:
void moveMobs(std::uint64_t delta); void moveMobs(std::uint64_t delta);
void moveMob(MobPtr mob, std::uint64_t delta); void moveMob(MobPtr mob, std::uint64_t delta);

View File

@@ -213,11 +213,11 @@ void ArcherTower::tick(std::uint64_t delta, World* world) {
std::uint8_t arrows = explosiveArrows ? 2 : getLevel().getLevel(); std::uint8_t arrows = explosiveArrows ? 2 : getLevel().getLevel();
for (MobPtr mob : world->getMobList()) { for (MobPtr mob : world->getMobList()) {
if (isMobInRange(mob)) { if (isMobInRange(mob)) {
world->OnArrowShot(mob, this); world->OnArcherTowerShot(mob, this);
m_Timer.applyCooldown();
arrowsShot++; arrowsShot++;
if (arrowsShot >= arrows) if (arrowsShot >= arrows)
break; break;
m_Timer.applyCooldown();
} }
} }
} }

View File

@@ -398,15 +398,34 @@ TowerPtr World::getTowerById(TowerID towerID) {
return *it; return *it;
} }
void World::OnArrowShot(MobPtr target, Tower* shooter) { void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom; bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
if (explosiveArrows) { if (explosiveArrows) {
// aoe damage OnArrowShot(target, shooter);
OnExplosion({ target->getCenterX(), target->getCenterY(), 1.0f }, 10.0f, shooter);
} else { } else {
target->damage(shooter->getStats()->getDamage(), shooter); OnArrowShot(target, shooter);
} }
} }
void World::OnArrowShot(MobPtr target, Tower* shooter) {
OnMobDamage(target, shooter->getStats()->getDamage(), shooter);
}
void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {
for (MobPtr mob : m_Mobs) {
if (mob->collidesWith(explosion)) {
// linear distance damage reduction
float explosionDamage = mob->distance(explosion) / explosion.getRadius() * centerDamage;
OnMobDamage(mob, explosionDamage, shooter);
}
}
}
void World::OnMobDamage(MobPtr target, float damage, Tower* source){
target->damage(damage, source);
}
Team& World::getRedTeam() { Team& World::getRedTeam() {
return m_Game->getRedTeam(); return m_Game->getRedTeam();
} }