refactor: move tower place detection to World.cpp
This commit is contained in:
@@ -4,6 +4,8 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
#include "Mobs.h"
|
#include "Mobs.h"
|
||||||
#include "Team.h"
|
#include "Team.h"
|
||||||
|
|
||||||
@@ -140,7 +142,7 @@ public:
|
|||||||
|
|
||||||
void spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir);
|
void spawnMobAt(MobID id, MobType type, std::uint8_t level, PlayerID sender, float x, float y, Direction dir);
|
||||||
|
|
||||||
TilePtr getTile(std::int32_t x, std::int32_t y);
|
TilePtr getTile(std::int32_t x, std::int32_t y) const;
|
||||||
|
|
||||||
const TowerTileColorPalette& getTowerTileColorPalette() const { return m_TowerPlacePalette; }
|
const TowerTileColorPalette& getTowerTileColorPalette() const { return m_TowerPlacePalette; }
|
||||||
const Color& getWalkableTileColor() const { return m_WalkablePalette; }
|
const Color& getWalkableTileColor() const { return m_WalkablePalette; }
|
||||||
@@ -154,6 +156,9 @@ public:
|
|||||||
return m_TilePalette.at(index - 1);
|
return m_TilePalette.at(index - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CanPlaceLittleTower(const glm::vec2& worldPos) const;
|
||||||
|
bool CanPlaceBigTower(const glm::vec2& worldPos) const;
|
||||||
|
|
||||||
const std::unordered_map<ChunkCoord, ChunkPtr>& getChunks() const { return m_Chunks; }
|
const std::unordered_map<ChunkCoord, ChunkPtr>& getChunks() const { return m_Chunks; }
|
||||||
|
|
||||||
const Color& getSpawnColor(TeamColor color) const { return m_SpawnColorPalette[(std::size_t)color]; }
|
const Color& getSpawnColor(TeamColor color) const { return m_SpawnColorPalette[(std::size_t)color]; }
|
||||||
|
|||||||
@@ -33,14 +33,12 @@ public:
|
|||||||
|
|
||||||
std::uint32_t getLobbyTime() const { return m_LobbyTime; }
|
std::uint32_t getLobbyTime() const { return m_LobbyTime; }
|
||||||
const game::Player* getPlayer() const { return m_Player; }
|
const game::Player* getPlayer() const { return m_Player; }
|
||||||
|
const WorldClient& getWorld() const { return m_WorldClient; }
|
||||||
|
|
||||||
render::Renderer* getRenderer() const { return m_Renderer; }
|
render::Renderer* getRenderer() const { return m_Renderer; }
|
||||||
|
|
||||||
void PlaceTower(game::TowerType type, const glm::vec2& position);
|
void PlaceTower(game::TowerType type, const glm::vec2& position);
|
||||||
|
|
||||||
bool CanPlaceLittleTower(const glm::vec2& worldPos);
|
|
||||||
bool CanPlaceBigTower(const glm::vec2& worldPos);
|
|
||||||
|
|
||||||
virtual void HandlePacket(protocol::ConnexionInfoPacket* packet);
|
virtual void HandlePacket(protocol::ConnexionInfoPacket* packet);
|
||||||
virtual void HandlePacket(protocol::PlayerJoinPacket* packet);
|
virtual void HandlePacket(protocol::PlayerJoinPacket* packet);
|
||||||
virtual void HandlePacket(protocol::PlayerLeavePacket* packet);
|
virtual void HandlePacket(protocol::PlayerLeavePacket* packet);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ World::World(Game* game) : m_Game(game) {
|
|||||||
#endif
|
#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 chunkX = x / Chunk::ChunkWidth;
|
||||||
std::int16_t chunkY = y / Chunk::ChunkHeight;
|
std::int16_t chunkY = y / Chunk::ChunkHeight;
|
||||||
|
|
||||||
@@ -389,6 +389,50 @@ const Color* World::getTileColor(TilePtr tile) const {
|
|||||||
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() {
|
Team& World::getRedTeam() {
|
||||||
return m_Game->getRedTeam();
|
return m_Game->getRedTeam();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,49 +116,5 @@ void ClientGame::PlaceTower(game::TowerType type, const glm::vec2& position) {
|
|||||||
m_Client->getConnexion().sendPacket(&packet);
|
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 client
|
||||||
} // namespace td
|
} // namespace td
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ void WorldRenderer::changeZoom(float zoomStep) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WorldRenderer::click() {
|
void WorldRenderer::click() {
|
||||||
if (m_Client->CanPlaceLittleTower(getClickWorldPos())) {
|
if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos())) {
|
||||||
ImGui::OpenPopup("TowerPlace");
|
ImGui::OpenPopup("TowerPlace");
|
||||||
m_TowerPlacePopupOpened = true;
|
m_TowerPlacePopupOpened = true;
|
||||||
}
|
}
|
||||||
@@ -127,7 +127,7 @@ void WorldRenderer::renderPopups() const {
|
|||||||
for (int i = 0; i < (int)game::TowerType::TowerCount; i++) {
|
for (int i = 0; i < (int)game::TowerType::TowerCount; i++) {
|
||||||
game::TowerType towerType = game::TowerType(i);
|
game::TowerType towerType = game::TowerType(i);
|
||||||
const game::TowerInfo& towerInfo = game::getTowerInfo(towerType);
|
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())) {
|
if (ImGui::Button(game::getTowerInfo(towerType).getName().c_str())) {
|
||||||
m_Client->PlaceTower(towerType, getClickWorldPos());
|
m_Client->PlaceTower(towerType, getClickWorldPos());
|
||||||
ImGui::CloseCurrentPopup();
|
ImGui::CloseCurrentPopup();
|
||||||
|
|||||||
Reference in New Issue
Block a user