feat: add world notifier
This commit is contained in:
@@ -13,7 +13,7 @@ namespace td {
|
||||
namespace game {
|
||||
|
||||
World::World(Game* game) : m_Game(game) {
|
||||
|
||||
bindListener(this);
|
||||
}
|
||||
|
||||
TilePtr World::getTile(std::int32_t x, std::int32_t y) const {
|
||||
@@ -400,30 +400,31 @@ TowerPtr World::getTowerById(TowerID towerID) {
|
||||
|
||||
void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) {
|
||||
bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom;
|
||||
notifyListeners(&WorldListener::OnArrowShot, target, shooter);
|
||||
if (explosiveArrows) {
|
||||
OnArrowShot(target, shooter);
|
||||
OnExplosion({ target->getCenterX(), target->getCenterY(), 1.0f }, 10.0f, shooter);
|
||||
} else {
|
||||
OnArrowShot(target, shooter);
|
||||
notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), 1.0f }, 10.0f, shooter);
|
||||
}
|
||||
}
|
||||
|
||||
void World::OnArrowShot(MobPtr target, Tower* shooter) {
|
||||
OnMobDamage(target, shooter->getStats()->getDamage(), shooter);
|
||||
notifyListeners(&WorldListener::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)) {
|
||||
if (mob->isAlive() && mob->collidesWith(explosion)) {
|
||||
// linear distance damage reduction
|
||||
float explosionDamage = mob->distance(explosion) / explosion.getRadius() * centerDamage;
|
||||
OnMobDamage(mob, explosionDamage, shooter);
|
||||
notifyListeners(&WorldListener::OnMobDamage, mob, explosionDamage, shooter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void World::OnMobDamage(MobPtr target, float damage, Tower* source){
|
||||
void World::OnMobDamage(MobPtr target, float damage, Tower* source) {
|
||||
target->damage(damage, source);
|
||||
if (target->isDead()) {
|
||||
notifyListeners(&WorldListener::OnMobDead, target);
|
||||
}
|
||||
}
|
||||
|
||||
Team& World::getRedTeam() {
|
||||
|
||||
Reference in New Issue
Block a user