feat: add archer tower aoe
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user