From 7a6fdc30b627e55e803665c0ba3ee5e5ff6d73f0 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Fri, 3 Dec 2021 18:30:45 +0100 Subject: [PATCH] add fire arrow and fix world events --- include/game/Towers.h | 1 + include/game/World.h | 16 ++++++++-------- include/game/client/WorldClient.h | 1 - include/game/server/ServerWorld.h | 1 - src/game/World.cpp | 11 ++++++++--- src/game/client/WorldClient.cpp | 4 ---- src/game/server/ServerWorld.cpp | 4 ---- 7 files changed, 17 insertions(+), 21 deletions(-) diff --git a/include/game/Towers.h b/include/game/Towers.h index c4a2b77..7349e87 100644 --- a/include/game/Towers.h +++ b/include/game/Towers.h @@ -164,6 +164,7 @@ public: ArcherTower(TowerID id, std::uint16_t x, std::uint16_t y, PlayerID builder) : LittleTower(id, getType(), x, y, builder) {} constexpr static float ExplosionRadius = 1.5f; + constexpr static float FireDurationSec = 10.0f; virtual TowerType getType() const { return TowerType::Archer; } virtual void tick(std::uint64_t delta, World* world); diff --git a/include/game/World.h b/include/game/World.h index f16242c..395404d 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -118,21 +118,21 @@ typedef std::vector TowerList; class WorldListener { public: - WorldListener(){} + WorldListener() {} - virtual void OnArcherTowerShot(MobPtr target, ArcherTower* 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 OnArrowShot(MobPtr target, bool fire, Tower* shooter) {} + virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) {} - virtual void OnMobDamage(MobPtr target, float damage, Tower* damager){} + virtual void OnMobDamage(MobPtr target, float damage, Tower* damager) {} - virtual void OnMobDead(MobPtr mob){} + virtual void OnMobDead(MobPtr mob) {} }; typedef utils::ObjectNotifier WorldNotifier; -class World : public WorldNotifier, public WorldListener{ +class World : public WorldNotifier, public WorldListener { protected: TowerTileColorPalette m_TowerPlacePalette; Color m_WalkablePalette; @@ -211,7 +211,7 @@ public: virtual void OnArcherTowerShot(MobPtr target, ArcherTower* shooter); - virtual void OnArrowShot(MobPtr target, Tower* shooter); + virtual void OnArrowShot(MobPtr target, bool fire, Tower* shooter); virtual void OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter); virtual void OnMobDamage(MobPtr target, float damage, Tower* source); diff --git a/include/game/client/WorldClient.h b/include/game/client/WorldClient.h index ca0df32..fd6ae9b 100644 --- a/include/game/client/WorldClient.h +++ b/include/game/client/WorldClient.h @@ -19,7 +19,6 @@ public: virtual void HandlePacket(const protocol::SpawnMobPacket* packet) override; virtual void HandlePacket(const protocol::UpgradeTowerPacket* packet) override; - virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override; }; } // namespace client diff --git a/include/game/server/ServerWorld.h b/include/game/server/ServerWorld.h index 1d373b6..2aa1647 100644 --- a/include/game/server/ServerWorld.h +++ b/include/game/server/ServerWorld.h @@ -19,7 +19,6 @@ public: void spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count); game::TowerPtr placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder); - virtual void OnArrowShot(game::MobPtr target, game::Tower* shooter) override; }; } // namespace server diff --git a/src/game/World.cpp b/src/game/World.cpp index 8038465..7b53c1a 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -399,15 +399,20 @@ TowerPtr World::getTowerById(TowerID towerID) { } void World::OnArcherTowerShot(MobPtr target, ArcherTower* shooter) { - bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom; - notifyListeners(&WorldListener::OnArrowShot, target, shooter); + bool fireArrows = shooter->getLevel().getPath() == TowerPath::Bottom; + bool explosiveArrows = shooter->getLevel().getLevel() == 4 && fireArrows; + + notifyListeners(&WorldListener::OnArrowShot, target, fireArrows, shooter); if (explosiveArrows) { notifyListeners(&WorldListener::OnExplosion, utils::shape::Circle{ target->getCenterX(), target->getCenterY(), ArcherTower::ExplosionRadius }, shooter->getStats()->getDamage(), shooter); } } -void World::OnArrowShot(MobPtr target, Tower* shooter) { +void World::OnArrowShot(MobPtr target, bool fireArrow, Tower* shooter) { notifyListeners(&WorldListener::OnMobDamage, target, shooter->getStats()->getDamage(), shooter); + if (fireArrow) { + target->addEffect(EffectType::Fire, ArcherTower::FireDurationSec, shooter); + } } void World::OnExplosion(utils::shape::Circle explosion, float centerDamage, Tower* shooter) { diff --git a/src/game/client/WorldClient.cpp b/src/game/client/WorldClient.cpp index 9cdf705..bd2d7f4 100644 --- a/src/game/client/WorldClient.cpp +++ b/src/game/client/WorldClient.cpp @@ -32,9 +32,5 @@ void WorldClient::HandlePacket(const protocol::UpgradeTowerPacket* packet) { tower->upgrade(packet->getTowerLevel().getLevel(), packet->getTowerLevel().getPath()); } -void WorldClient::OnArrowShot(game::MobPtr target, game::Tower* tower) { - World::OnArrowShot(target, tower); -} - } // namespace client } // namespace td diff --git a/src/game/server/ServerWorld.cpp b/src/game/server/ServerWorld.cpp index e106b48..96a0cae 100644 --- a/src/game/server/ServerWorld.cpp +++ b/src/game/server/ServerWorld.cpp @@ -49,9 +49,5 @@ game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, s return tower; } -void ServerWorld::OnArrowShot(game::MobPtr target, game::Tower* shooter) { - World::OnArrowShot(target, shooter); -} - } // namespace server } // namespace td