diff --git a/include/game/Towers.h b/include/game/Towers.h index 22071d3..e7dd915 100644 --- a/include/game/Towers.h +++ b/include/game/Towers.h @@ -32,9 +32,9 @@ enum class TowerType : std::uint8_t { TowerCount }; -enum class TowerSize : bool { - Little = 0, // 3x3 - Big, // 5x5 +enum class TowerSize : std::uint8_t { + Little = 3, // 3x3 + Big = 5, // 5x5 }; enum class TowerPath : std::uint8_t { diff --git a/include/game/World.h b/include/game/World.h index f7933c9..684267c 100644 --- a/include/game/World.h +++ b/include/game/World.h @@ -162,6 +162,8 @@ public: bool CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID player) const; bool CanPlaceBigTower(const glm::vec2& worldPos, PlayerID player) const; + TowerPtr GetTower(const glm::vec2& position); // returns null if no tower is here + const std::unordered_map& getChunks() const { return m_Chunks; } const Color& getSpawnColor(TeamColor color) const { return m_SpawnColorPalette[(std::size_t)color]; } diff --git a/src/game/World.cpp b/src/game/World.cpp index f79e573..6c6765e 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -322,7 +322,7 @@ bool World::saveMap(const std::string& fileName) const { void World::tick(std::uint64_t delta) { moveMobs(delta); tickMobs(delta); - for(TowerPtr tower : m_Towers){ + for (TowerPtr tower : m_Towers) { tower->tick(delta, this); } cleanDeadMobs(); @@ -343,7 +343,7 @@ TowerPtr World::placeTowerAt(TowerID id, TowerType type, std::int32_t x, std::in } void World::tickMobs(std::uint64_t delta) { - for(MobPtr mob : m_Mobs) { + for (MobPtr mob : m_Mobs) { mob->tick(delta); } } @@ -361,7 +361,7 @@ void World::moveMobs(std::uint64_t delta) { float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f); - if(mob->hasEffect(EffectType::Slowness)) + if (mob->hasEffect(EffectType::Slowness)) walkAmount *= 0.70; switch (mob->getDirection()) { @@ -415,8 +415,8 @@ bool World::CanPlaceLittleTower(const glm::vec2& worldPos, PlayerID playerID) co } if (tile->getType() == game::TileType::Tower) { - const TowerTile* towerTile = (const TowerTile*) tile.get(); - if(towerTile->team_owner != player.getTeamColor()) + const TowerTile* towerTile = (const TowerTile*)tile.get(); + if (towerTile->team_owner != player.getTeamColor()) return false; for (int x = -1; x < 2; x++) { for (int y = -1; y < 2; y++) { @@ -441,8 +441,8 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const } if (tile->getType() == game::TileType::Tower) { - const TowerTile* towerTile = (const TowerTile*) tile.get(); - if(towerTile->team_owner != player.getTeamColor()) + const TowerTile* towerTile = (const TowerTile*)tile.get(); + if (towerTile->team_owner != player.getTeamColor()) return false; for (int x = -2; x < 3; x++) { for (int y = -2; y < 3; y++) { @@ -458,20 +458,37 @@ bool World::CanPlaceBigTower(const glm::vec2& worldPos, PlayerID playerID) const return false; } -void World::cleanDeadMobs(){ - for(std::size_t i = 0; i < m_Mobs.size(); i++){ +void World::cleanDeadMobs() { + for (std::size_t i = 0; i < m_Mobs.size(); i++) { MobPtr mob = m_Mobs[i]; - if(!mob->isAlive()){ + if (!mob->isAlive()) { m_Mobs.erase(m_Mobs.begin() + i); } } } -void World::OnArrowShot(MobPtr target, Tower* shooter){ +TowerPtr World::GetTower(const glm::vec2& position) { + for (TowerPtr tower : m_Towers) { + if (tower->getSize() == TowerSize::Big) { + if (tower->getX() - 2 <= position.x && tower->getX() + 3 >= position.x && + tower->getY() - 2 <= position.y && tower->getY() + 3 >= position.y) { + return tower; + } + } else { + if (tower->getX() - 1 <= position.x && tower->getX() + 2 >= position.x && + tower->getY() - 1 <= position.y && tower->getY() + 2 >= position.y) { + return tower; + } + } + } + return nullptr; +} + +void World::OnArrowShot(MobPtr target, Tower* shooter) { bool explosiveArrows = shooter->getLevel().getPath() == TowerPath::Bottom; - if(explosiveArrows){ + if (explosiveArrows) { // aoe damage - }else{ + } else { target->damage(shooter->getStats()->getDamage()); } }