refactor: move tower place detection to World.cpp

This commit is contained in:
2021-09-19 18:20:26 +02:00
parent 3bc58b12a6
commit 3771ea4a27
5 changed files with 54 additions and 51 deletions

View File

@@ -20,7 +20,7 @@ World::World(Game* game) : m_Game(game) {
#endif
}
TilePtr World::getTile(std::int32_t x, std::int32_t y) {
TilePtr World::getTile(std::int32_t x, std::int32_t y) const {
std::int16_t chunkX = x / Chunk::ChunkWidth;
std::int16_t chunkY = y / Chunk::ChunkHeight;
@@ -389,6 +389,50 @@ const Color* World::getTileColor(TilePtr tile) const {
return nullptr;
}
bool World::CanPlaceLittleTower(const glm::vec2& worldPos) const {
TilePtr tile = getTile(worldPos.x, worldPos.y);
if (tile == nullptr) {
return false;
}
if (tile->getType() == game::TileType::Tower) {
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower) {
return false;
}
}
}
return true;
}
return false;
}
bool World::CanPlaceBigTower(const glm::vec2& worldPos) const {
TilePtr tile = getTile(worldPos.x, worldPos.y);
if (tile == nullptr) {
return false;
}
if (tile->getType() == game::TileType::Tower) {
for (int x = -2; x < 3; x++) {
for (int y = -2; y < 3; y++) {
game::TilePtr adjacentTile = getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower) {
return false;
}
}
}
return true;
}
return false;
}
Team& World::getRedTeam() {
return m_Game->getRedTeam();
}

View File

@@ -116,49 +116,5 @@ void ClientGame::PlaceTower(game::TowerType type, const glm::vec2& position) {
m_Client->getConnexion().sendPacket(&packet);
}
bool ClientGame::CanPlaceLittleTower(const glm::vec2& worldPos) {
game::TilePtr tile = m_WorldClient.getTile(worldPos.x, worldPos.y);
if (tile == nullptr) {
return false;
}
if (tile->getType() == game::TileType::Tower) {
for (int x = -1; x < 2; x++) {
for (int y = -1; y < 2; y++) {
game::TilePtr adjacentTile = m_WorldClient.getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower) {
return false;
}
}
}
return true;
}
return false;
}
bool ClientGame::CanPlaceBigTower(const glm::vec2& worldPos) {
game::TilePtr tile = m_WorldClient.getTile(worldPos.x, worldPos.y);
if (tile == nullptr) {
return false;
}
if (tile->getType() == game::TileType::Tower) {
for (int x = -2; x < 3; x++) {
for (int y = -2; y < 3; y++) {
game::TilePtr adjacentTile = m_WorldClient.getTile(worldPos.x + x, worldPos.y + y);
if (adjacentTile == nullptr || adjacentTile->getType() != game::TileType::Tower) {
return false;
}
}
}
return true;
}
return false;
}
} // namespace client
} // namespace td

View File

@@ -111,7 +111,7 @@ void WorldRenderer::changeZoom(float zoomStep) {
}
void WorldRenderer::click() {
if (m_Client->CanPlaceLittleTower(getClickWorldPos())) {
if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos())) {
ImGui::OpenPopup("TowerPlace");
m_TowerPlacePopupOpened = true;
}
@@ -127,7 +127,7 @@ void WorldRenderer::renderPopups() const {
for (int i = 0; i < (int)game::TowerType::TowerCount; i++) {
game::TowerType towerType = game::TowerType(i);
const game::TowerInfo& towerInfo = game::getTowerInfo(towerType);
if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->CanPlaceBigTower(getClickWorldPos()))) {
if (!towerInfo.isBigTower() || (towerInfo.isBigTower() && m_Client->getWorld().CanPlaceBigTower(getClickWorldPos()))) {
if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) {
m_Client->PlaceTower(towerType, getClickWorldPos());
ImGui::CloseCurrentPopup();