#include "game/World.h" #include "protocol/PacketDispatcher.h" #include "protocol/Protocol.h" #include "game/BaseGame.h" #include "misc/Random.h" #include #include "misc/Compression.h" #include #define WRITE_MAP 0 namespace td { namespace game { World::World(Game* game) : m_Game(game) { #if WRITE_MAP loadMapFromFile(""); #endif } 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; std::uint16_t subChunkX = x % Chunk::ChunkWidth; std::uint16_t subChunkY = y % Chunk::ChunkHeight; auto chunkIt = m_Chunks.find({ chunkX, chunkY }); if (chunkIt == m_Chunks.end()) return nullptr; ChunkPtr chunk = chunkIt->second; return getTilePtr(chunk->getTileIndex(subChunkY * Chunk::ChunkWidth + subChunkX)); } bool World::loadMap(const protocol::WorldBeginDataPacket* worldHeader) { m_TowerPlacePalette = worldHeader->getTowerTilePalette(); m_WalkablePalette = worldHeader->getWalkableTileColor(); m_DecorationPalette = worldHeader->getDecorationPalette(); getRedTeam().getSpawn() = worldHeader->getRedSpawn(); getBlueTeam().getSpawn() = worldHeader->getBlueSpawn(); m_SpawnColorPalette = worldHeader->getSpawnPalette(); getRedTeam().getCastle() = worldHeader->getRedCastle(); getBlueTeam().getCastle() = worldHeader->getBlueCastle(); m_TilePalette = worldHeader->getTilePalette(); return true; } bool World::loadMap(const protocol::WorldDataPacket* worldData) { m_Chunks = worldData->getChunks(); return true; } bool World::loadMapFromFile(const std::string& fileName) { #if !WRITE_MAP DataBuffer buffer; if (!buffer.ReadFile(fileName)) { std::cerr << "Failed to load map from file " << fileName << " !\n"; } std::cout << "Read file : " << fileName << " (File size : " << buffer.GetSize() << ")" << std::endl; DataBuffer mapHeaderPacketBuffer = utils::Decompress(buffer); DataBuffer mapDataPacketBuffer = utils::Decompress(buffer); protocol::PacketType packetType; mapHeaderPacketBuffer >> packetType; protocol::WorldBeginDataPacket headerPacket; headerPacket.Deserialize(mapHeaderPacketBuffer); mapDataPacketBuffer >> packetType; protocol::WorldDataPacket dataPacket; dataPacket.Deserialize(mapDataPacketBuffer); loadMap(&headerPacket); loadMap(&dataPacket); return true; #else m_WalkablePalette = { 102, 102, 153 }; m_TowerPlacePalette[0] = { 204, 51, 0 }; m_TowerPlacePalette[1] = { 255, 153, 0 }; WalkableTile walkableTileDown; // 1 walkableTileDown.direction = Direction::PositiveY; m_TilePalette.push_back(std::make_shared(walkableTileDown)); WalkableTile walkableTileUp; // 2 walkableTileUp.direction = Direction::NegativeY; m_TilePalette.push_back(std::make_shared(walkableTileUp)); WalkableTile walkableTileLeft; // 3 walkableTileLeft.direction = Direction::NegativeX; m_TilePalette.push_back(std::make_shared(walkableTileLeft)); WalkableTile walkableTileRight; // 4 walkableTileRight.direction = Direction::PositiveX; m_TilePalette.push_back(std::make_shared(walkableTileRight)); TowerTile redTile0; // 5 redTile0.color_palette_ref = 0; redTile0.team_owner = TeamColor::Red; m_TilePalette.push_back(std::make_shared(redTile0)); TowerTile redTile1; // 6 redTile1.color_palette_ref = 1; redTile1.team_owner = TeamColor::Red; m_TilePalette.push_back(std::make_shared(redTile1)); TowerTile blueTile0; // 7 blueTile0.color_palette_ref = 0; blueTile0.team_owner = TeamColor::Blue; m_TilePalette.push_back(std::make_shared(blueTile0)); TowerTile blueTile1; // 8 blueTile1.color_palette_ref = 1; blueTile1.team_owner = TeamColor::Blue; m_TilePalette.push_back(std::make_shared(blueTile1)); getRedTeam().getCastle().x = 58; getRedTeam().getCastle().y = 43; getRedTeam().getSpawn().x = 13; getRedTeam().getSpawn().y = 13; getRedTeam().getSpawn().direction = Direction::PositiveY; m_SpawnColorPalette[(unsigned int)TeamColor::Red] = { 255, 0, 0 }; //Chunks Chunk chunk0; for (int i = 0; i <= 6; i++) { chunk0.palette.push_back(i); } chunk0.tiles = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5, 0,0,0,0,0,0,6,5,6,5,6,0,0,0,0,0,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,5,6,5,6,5,0,0,0,0,0,5,5,5,2,4,4,4,4,4,4,4,4,4,4,4,4, 0,0,0,0,0,0,6,5,6,5,6,0,0,0,0,0,5,5,5,2,2,4,4,4,4,4,4,4,4,4,4,1, 0,0,0,0,0,0,5,6,5,6,5,0,0,0,0,0,0,0,0,2,2,2,4,4,4,4,4,4,4,4,1,1, 0,0,0,0,0,0,6,5,6,5,6,0,0,0,0,0,0,0,0,2,2,2,2,4,4,4,4,4,4,1,1,1, 0,0,0,0,0,6,6,6,5,5,5,0,0,0,0,0,6,6,6,2,2,2,2,2,5,5,5,5,5,1,1,1, 0,0,0,0,0,6,6,6,5,5,5,1,1,1,1,1,6,6,6,2,2,2,2,2,5,6,6,6,5,1,1,1, 0,0,0,0,0,6,6,6,5,5,5,1,1,1,1,1,6,6,6,2,2,2,2,2,5,6,5,6,5,1,1,1, 0,0,0,0,0,5,5,5,6,6,6,1,1,1,1,1,5,5,5,2,2,2,2,2,5,6,6,6,5,1,1,1, 0,0,0,0,0,5,5,5,6,6,6,1,1,1,1,1,5,5,5,2,2,2,2,2,5,5,5,5,5,1,1,1, 0,0,0,0,0,5,5,5,6,6,6,1,1,1,1,1,5,5,5,2,2,2,2,2,6,6,6,6,6,1,1,1, 0,0,0,0,0,6,6,6,5,5,5,1,1,1,1,4,4,4,4,2,2,2,2,2,6,5,5,5,6,1,1,4, 0,0,0,0,0,6,6,6,5,5,5,1,1,1,4,4,4,4,4,4,2,2,2,2,6,5,6,5,6,1,4,4, 0,0,0,0,0,6,6,6,5,5,5,1,1,4,4,4,4,4,4,4,4,2,2,2,6,5,5,5,6,4,4,4, 0,0,0,0,0,5,5,5,6,6,6,1,4,4,4,4,4,4,4,4,4,4,2,2,6,6,6,6,6,0,0,0, 0,0,0,0,0,5,5,5,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,2,0,0,0,0,0,0,0,0, 0,0,0,0,0,5,5,5,6,6,6,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6, 0,0,0,0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6, 0,0,0,0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6, 0,0,0,0,0,6,6,6,5,5,5,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, 0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, 0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, }; Chunk chunk1; for (int i = 0; i <= 6; i++) { chunk1.palette.push_back(i); } chunk1.tiles = { 0,0,0,0,0,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, 0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, 0,0,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5,6,6,6,5,5,5, 0,0,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,6,6,6, 6,6,5,5,5,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,6,6,6, 6,6,5,5,5,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,6,6,6, 6,6,5,5,5,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,5,5,5, 5,5,6,6,6,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,1,1,1,1,1,5,5,5, 5,5,6,6,6,2,2,2,2,2,0,0,5,5,5,6,6,6,5,5,5,6,6,6,1,1,1,1,1,5,5,5, 5,5,6,6,6,2,2,2,2,2,0,0,5,5,5,6,6,6,5,5,5,6,6,6,1,1,1,1,1,6,6,6, 4,1,5,5,5,2,2,2,2,2,0,0,5,5,5,6,6,6,5,5,5,6,6,6,1,1,1,1,1,6,6,6, 1,1,5,5,5,2,2,2,2,2,3,3,3,3,3,3,3,3,3,5,5,5,5,5,1,1,1,1,1,6,6,6, 1,1,5,5,5,2,2,2,2,3,3,3,3,3,3,3,3,3,2,5,6,6,6,5,1,1,1,1,1,5,5,5, 1,1,6,6,6,2,2,2,3,3,3,3,3,3,3,3,3,2,2,5,6,5,6,5,1,1,1,1,1,5,5,5, 1,1,6,6,6,2,2,3,3,3,3,3,3,3,3,3,2,2,2,5,6,6,6,5,1,1,1,1,1,5,5,5, 1,1,6,6,6,2,3,3,3,3,3,3,3,3,3,2,2,2,2,5,5,5,5,5,1,1,1,1,1,6,6,6, 1,1,5,5,5,6,6,6,5,5,5,6,6,6,2,2,2,2,2,6,6,6,6,6,1,1,1,1,1,6,6,6, 1,1,5,5,5,6,6,6,5,5,5,6,6,6,2,2,2,2,2,6,5,5,5,6,1,1,1,1,1,6,6,6, 1,1,5,5,5,6,6,6,5,5,5,6,6,6,2,2,2,2,2,6,5,6,5,6,1,1,1,1,1,5,5,5, 1,4,4,4,4,4,4,4,4,4,1,5,5,5,2,2,2,2,2,6,5,5,5,6,1,1,1,1,1,5,5,5, 4,4,4,4,4,4,4,4,4,1,1,5,5,5,2,2,2,2,2,6,6,6,6,6,1,1,1,1,1,5,5,5, 4,4,4,4,4,4,4,4,1,1,1,5,5,5,2,2,2,2,2,5,5,5,5,5,1,1,1,1,1,6,6,6, 4,4,4,4,4,4,4,1,1,1,1,6,6,6,2,2,2,2,2,5,6,6,6,5,1,1,1,1,1,6,6,6, 4,4,4,4,4,4,1,1,1,1,1,6,6,6,2,2,2,2,2,5,6,5,6,5,1,1,1,1,1,6,6,6, 6,6,6,5,5,5,1,1,1,1,1,6,6,6,2,2,2,2,2,5,6,6,6,5,1,1,1,1,1,5,5,5, 6,6,6,5,5,5,1,1,1,1,1,5,5,5,2,2,2,2,2,5,5,5,5,5,1,1,1,1,1,5,5,5, 6,6,6,5,5,5,1,1,1,1,1,5,5,5,2,2,2,2,2,6,6,6,6,6,1,1,1,1,1,5,5,5, 0,6,6,6,6,6,1,1,1,1,1,5,5,5,2,2,2,2,2,6,5,5,5,6,1,1,1,1,1,6,6,6, 0,6,5,5,5,6,1,1,1,1,1,6,6,6,2,2,2,2,2,6,5,6,5,6,1,1,1,1,1,6,6,6, 0,6,5,6,5,6,1,1,1,1,1,6,6,6,2,2,2,2,2,6,5,5,5,6,1,1,1,1,1,6,6,6, 0,6,5,5,5,6,1,1,1,1,1,6,6,6,2,2,2,2,2,6,6,6,6,6,1,1,1,1,1,5,5,5, 0,6,6,6,6,6,1,1,1,1,1,5,5,5,2,2,2,2,2,5,5,5,5,5,1,1,1,1,1,5,5,5, }; Chunk chunk2; for (int i = 0; i <= 6; i++) { chunk2.palette.push_back(i); } chunk2.tiles = { 0,5,5,5,5,5,1,1,1,1,1,5,5,5,2,2,2,2,2,5,6,6,6,5,1,1,1,1,1,5,5,5, 0,5,6,6,6,5,1,1,1,1,1,5,5,5,2,2,2,2,2,5,6,5,6,5,1,1,1,1,1,6,6,6, 0,5,6,5,6,5,1,1,1,1,1,0,0,0,2,2,2,2,2,5,6,6,6,5,1,1,1,1,1,6,6,6, 0,5,6,6,6,5,1,1,1,1,1,0,0,0,2,2,2,2,2,5,5,5,5,5,1,1,1,1,1,6,6,6, 0,5,5,5,5,5,1,1,1,1,4,4,4,4,2,2,2,2,2,6,6,6,6,6,1,1,1,1,1,5,5,5, 0,6,6,6,6,6,1,1,1,4,4,4,4,4,4,2,2,2,2,6,5,5,5,6,1,1,1,1,1,5,5,5, 0,6,5,5,5,6,1,1,4,4,4,4,4,4,4,4,2,2,2,6,5,6,5,6,1,1,1,1,1,5,5,5, 0,6,5,6,5,6,1,4,4,4,4,4,4,4,4,4,4,2,2,6,5,5,5,6,1,1,1,1,1,6,6,6, 0,6,5,5,5,6,4,4,4,4,4,4,4,4,4,4,4,4,2,6,6,6,6,6,1,1,1,1,1,6,6,6, 0,6,6,6,6,6,5,5,5,5,5,6,6,6,6,6,5,5,5,5,5,0,0,0,0,0,0,0,0,6,6,6, 0,0,0,0,0,0,5,6,6,6,5,6,5,5,5,6,5,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,5,6,6,6,5,6,5,5,5,6,5,6,6,6,5,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,5,5,5,5,5,6,6,6,6,6,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; m_Chunks.insert({ {0, 0}, std::make_shared(chunk0) }); m_Chunks.insert({ {1, 0}, std::make_shared(chunk1) }); m_Chunks.insert({ {1, 1}, std::make_shared(chunk2) }); // blue map = same but with offset of 64 (in x coordinate) getBlueTeam().getCastle().x = 58 + 64; getBlueTeam().getCastle().y = 43; getBlueTeam().getSpawn().x = 13 + 64; getBlueTeam().getSpawn().y = 13; getBlueTeam().getSpawn().direction = Direction::PositiveY; m_SpawnColorPalette[(unsigned int)TeamColor::Blue] = { 0, 0, 255 }; Chunk chunk01; chunk01.palette = { 0, 1, 2, 3, 4, 7, 8 }; chunk01.tiles = chunk0.tiles; // the tiles indicies are the same, only the palette has changed Chunk chunk11; chunk11.palette = { 0, 1, 2, 3, 4, 7, 8 }; chunk11.tiles = chunk1.tiles; // the tiles indicies are the same, only the palette has changed Chunk chunk21; chunk21.palette = { 0, 1, 2, 3, 4, 7, 8 }; chunk21.tiles = chunk2.tiles; // the tiles indicies are the same, only the palette has changed m_Chunks.insert({ {2, 0}, std::make_shared(chunk01) }); m_Chunks.insert({ {3, 0}, std::make_shared(chunk11) }); m_Chunks.insert({ {3, 1}, std::make_shared(chunk21) }); return saveMap("tdmap_linux.tdmap"); #endif } bool World::saveMap(const std::string& fileName) const { protocol::WorldBeginDataPacket headerPacket(this); protocol::WorldDataPacket dataPacket(this); DataBuffer mapHeaderCompressed = utils::Compress(headerPacket.Serialize()); DataBuffer mapDataCompressed = utils::Compress(dataPacket.Serialize()); std::cout << "Header Packet Size : " << mapHeaderCompressed.GetSize() << std::endl; std::cout << "World Data Packet Size : " << mapDataCompressed.GetSize() << std::endl; DataBuffer buffer = mapHeaderCompressed << mapDataCompressed; std::cout << "Total Size : " << buffer.GetSize() << std::endl; return buffer.WriteFile(fileName); } void World::tick(std::uint64_t delta) { moveMobs(delta); for(Tower& tower : m_Towers){ tower.tick(delta); } } void World::spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir) { MobPtr mob = MobFactory::createMob(id, type, level, sender); mob->setX(x); mob->setY(y); mob->setDirection(dir); m_Mobs.push_back(mob); } void World::moveMobs(std::uint64_t delta) { for (MobPtr mob : m_Mobs) { TilePtr tile = getTile(mob->getX(), mob->getY()); if (tile != nullptr && tile->getType() == TileType::Walk) { WalkableTile* walkTile = dynamic_cast(tile.get()); mob->setDirection(walkTile->direction); } float mobWalkSpeed = mob->getStats()->getMovementSpeed(); float walkAmount = mobWalkSpeed * ((float)delta / 1000.0f); switch (mob->getDirection()) { case Direction::NegativeX: { mob->setX(mob->getX() - walkAmount); break; } case Direction::PositiveX: { mob->setX(mob->getX() + walkAmount); break; } case Direction::NegativeY: { mob->setY(mob->getY() - walkAmount); break; } case Direction::PositiveY: { mob->setY(mob->getY() + walkAmount); break; } } } } const Color* World::getTileColor(TilePtr tile) const { switch (tile->getType()) { case TileType::Tower: { TowerTile* towerTile = (TowerTile*)tile.get(); return &m_TowerPlacePalette[towerTile->color_palette_ref]; } case TileType::Walk: { return &m_WalkablePalette; } case TileType::Decoration: { DecorationTile* towerTile = (DecorationTile*)tile.get(); return &m_DecorationPalette[towerTile->color_palette_ref]; break; } case TileType::None: { return nullptr; } } 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(); } const Team& World::getRedTeam() const { return m_Game->getRedTeam(); } Team& World::getBlueTeam() { return m_Game->getBlueTeam(); } const Team& World::getBlueTeam() const { return m_Game->getBlueTeam(); } Team& World::getTeam(TeamColor team) { return m_Game->getTeam(team); } const Team& World::getTeam(TeamColor team) const { return m_Game->getTeam(team); } } // namespace game } // namespace td