diff --git a/include/game/Towers.h b/include/game/Towers.h index 886e5a6..fa9a3e2 100644 --- a/include/game/Towers.h +++ b/include/game/Towers.h @@ -38,7 +38,8 @@ enum class TowerSize : std::uint8_t { }; enum class TowerPath : std::uint8_t { - Top = 0, // Base path + Top = 0, + Base, // Base Path Bottom }; @@ -62,9 +63,9 @@ private: // 1, 2, 3, 4 std::uint8_t m_Level : 3; // 0 : base path 1 : top path (if there is bottom path) 2 : bottom path (if there is top path) - TowerPath m_Path : 1; + TowerPath m_Path : 2; public: - TowerLevel() : m_Level(1), m_Path(TowerPath::Top) {} + TowerLevel() : m_Level(1), m_Path(TowerPath::Base) {} TowerLevel(std::uint8_t level, TowerPath path) : m_Level(level), m_Path(path) {} std::uint8_t getLevel() const { return m_Level; } @@ -75,8 +76,8 @@ public: // operator to sort maps friend bool operator<(const TowerLevel& level, const TowerLevel& other) { - return level.getLevel() * static_cast(level.getPath()) < - other.getLevel() * static_cast(other.getPath()); + return level.getLevel() + static_cast(level.getPath()) * 4 < + other.getLevel() + static_cast(other.getPath()) * 4; } }; diff --git a/include/render/WorldRenderer.h b/include/render/WorldRenderer.h index 1bdd48e..ad83092 100644 --- a/include/render/WorldRenderer.h +++ b/include/render/WorldRenderer.h @@ -26,6 +26,7 @@ private: glm::vec2 m_CamPos; glm::vec2 m_CursorPos; glm::vec2 m_HoldCursorPos; + glm::vec2 m_LastClicked; float m_Zoom; float m_CamSensibility = 1; bool m_PopupOpened = false; @@ -52,9 +53,9 @@ private: void renderTowers() const; void renderMobs() const; void renderTileSelect() const; - void renderPopups() const; - void renderTowerPlacePopup() const; - void renderTowerUpgradePopup() const; + void renderPopups(); + void renderTowerPlacePopup(); + void renderTowerUpgradePopup(); void renderMobTooltip() const; void detectClick(); glm::vec2 getCursorWorldPos() const; diff --git a/src/game/Towers.cpp b/src/game/Towers.cpp index 5ab0809..1d72d49 100644 --- a/src/game/Towers.cpp +++ b/src/game/Towers.cpp @@ -14,7 +14,8 @@ bool Tower::isMobInRange(MobPtr mob) { const std::map, TowerStats> TowerConstants = { // // rate damage range - {{TowerType::Archer, {1, TowerPath::Top}}, {2, 5, 10}}, + {{TowerType::Archer, {1, TowerPath::Base}}, {2, 5, 10}}, + {{TowerType::Archer, {2, TowerPath::Top}}, {1, 0, 12}}, {{TowerType::Archer, {3, TowerPath::Top}}, {1, 0, 13}}, {{TowerType::Archer, {4, TowerPath::Top}}, {0.8, 0, 15}}, @@ -25,15 +26,16 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Ice, {1, TowerPath::Top}}, {1, 0, 10}}, - {{TowerType::Ice, {2, TowerPath::Top}}, {1, 0, 12}}, - {{TowerType::Ice, {3, TowerPath::Top}}, {1, 0, 13}}, - {{TowerType::Ice, {4, TowerPath::Top}}, {1, 4, 15}}, + {{TowerType::Ice, {1, TowerPath::Base}}, {1, 0, 10}}, + {{TowerType::Ice, {2, TowerPath::Base}}, {1, 0, 12}}, + {{TowerType::Ice, {3, TowerPath::Base}}, {1, 0, 13}}, + {{TowerType::Ice, {4, TowerPath::Base}}, {1, 4, 15}}, //----------------------------------------------------------------- - {{TowerType::Sorcerer, {1, TowerPath::Top}}, {5, 0, 10}}, - {{TowerType::Sorcerer, {2, TowerPath::Top}}, {4, 0, 12}}, + {{TowerType::Sorcerer, {1, TowerPath::Base}}, {5, 0, 10}}, + {{TowerType::Sorcerer, {2, TowerPath::Base}}, {4, 0, 12}}, + {{TowerType::Sorcerer, {3, TowerPath::Top}}, {4, 0, 14}}, {{TowerType::Sorcerer, {4, TowerPath::Top}}, {4, 0, 15}}, @@ -42,8 +44,9 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Zeus, {1, TowerPath::Top}}, {5, 0, 10}}, - {{TowerType::Zeus, {2, TowerPath::Top}}, {4, 0, 12}}, + {{TowerType::Zeus, {1, TowerPath::Base}}, {5, 0, 10}}, + {{TowerType::Zeus, {2, TowerPath::Base}}, {4, 0, 12}}, + {{TowerType::Zeus, {3, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Zeus, {4, TowerPath::Top}}, {0, 0, 0}}, @@ -52,15 +55,16 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Mage, {1, TowerPath::Top}}, {5, 0, 10}}, - {{TowerType::Mage, {2, TowerPath::Top}}, {4, 0, 12}}, - {{TowerType::Mage, {3, TowerPath::Top}}, {3, 0, 13}}, - {{TowerType::Mage, {4, TowerPath::Top}}, {1, 30, 15}}, + {{TowerType::Mage, {1, TowerPath::Base}}, {5, 0, 10}}, + {{TowerType::Mage, {2, TowerPath::Base}}, {4, 0, 12}}, + {{TowerType::Mage, {3, TowerPath::Base}}, {3, 0, 13}}, + {{TowerType::Mage, {4, TowerPath::Base}}, {1, 30, 15}}, //----------------------------------------------------------------- - {{TowerType::Artillery, {1, TowerPath::Top}}, {7, 0, 10}}, - {{TowerType::Artillery, {2, TowerPath::Top}}, {7, 0, 12}}, + {{TowerType::Artillery, {1, TowerPath::Base}}, {7, 0, 10}}, + {{TowerType::Artillery, {2, TowerPath::Base}}, {7, 0, 12}}, + {{TowerType::Artillery, {3, TowerPath::Top}}, {7, 0, 13}}, {{TowerType::Artillery, {4, TowerPath::Top}}, {7, 0, 15}}, @@ -69,15 +73,16 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Quake, {1, TowerPath::Top}}, {5, 5, 10}}, - {{TowerType::Quake, {2, TowerPath::Top}}, {4, 7, 12}}, - {{TowerType::Quake, {3, TowerPath::Top}}, {3, 9, 13}}, - {{TowerType::Quake, {4, TowerPath::Top}}, {2, 11, 15}}, + {{TowerType::Quake, {1, TowerPath::Base}}, {5, 5, 10}}, + {{TowerType::Quake, {2, TowerPath::Base}}, {4, 7, 12}}, + {{TowerType::Quake, {3, TowerPath::Base}}, {3, 9, 13}}, + {{TowerType::Quake, {4, TowerPath::Base}}, {2, 11, 15}}, //----------------------------------------------------------------- - {{TowerType::Poison, {1, TowerPath::Top}}, {5, 0, 10}}, - {{TowerType::Poison, {2, TowerPath::Top}}, {5, 0, 12}}, + {{TowerType::Poison, {1, TowerPath::Base}}, {5, 0, 10}}, + {{TowerType::Poison, {2, TowerPath::Base}}, {5, 0, 12}}, + {{TowerType::Poison, {3, TowerPath::Top}}, {6, 0, 13}}, {{TowerType::Poison, {4, TowerPath::Top}}, {5, 0, 15}}, @@ -86,13 +91,14 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Leach, {1, TowerPath::Top}}, {0, 0, 0}}, - {{TowerType::Leach, {2, TowerPath::Top}}, {0, 0, 0}}, - {{TowerType::Leach, {3, TowerPath::Top}}, {0, 0, 0}}, + {{TowerType::Leach, {1, TowerPath::Base}}, {0, 0, 0}}, + {{TowerType::Leach, {2, TowerPath::Base}}, {0, 0, 0}}, + {{TowerType::Leach, {3, TowerPath::Base}}, {0, 0, 0}}, //----------------------------------------------------------------- - {{TowerType::Turret, {1, TowerPath::Top}}, {0.5, 0, 0}}, + {{TowerType::Turret, {1, TowerPath::Base}}, {0.5, 0, 0}}, + {{TowerType::Turret, {2, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Turret, {3, TowerPath::Top}}, {0, 0, 0}}, @@ -101,8 +107,9 @@ const std::map, TowerStats> TowerConstants = { //----------------------------------------------------------------- - {{TowerType::Necromancer, {1, TowerPath::Top}}, {2, 0, 11}}, - {{TowerType::Necromancer, {2, TowerPath::Top}}, {1, 0, 14}}, + {{TowerType::Necromancer, {1, TowerPath::Base}}, {2, 0, 11}}, + {{TowerType::Necromancer, {2, TowerPath::Base}}, {1, 0, 14}}, + {{TowerType::Necromancer, {3, TowerPath::Top}}, {1, 0, 15}}, {{TowerType::Necromancer, {3, TowerPath::Bottom}}, {0, 30, 0}}, diff --git a/src/render/WorldRenderer.cpp b/src/render/WorldRenderer.cpp index 592cde3..58f7c94 100644 --- a/src/render/WorldRenderer.cpp +++ b/src/render/WorldRenderer.cpp @@ -2,6 +2,7 @@ #include "render/loader/WorldLoader.h" #include "render/Renderer.h" #include "render/gui/imgui/imgui.h" +#include "gui/imgui/imgui_internal.h" #include "window/Display.h" #include "game/client/ClientGame.h" @@ -88,7 +89,7 @@ void WorldRenderer::renderTileSelect() const { m_Renderer->renderModel(tileSelectModel); } -void WorldRenderer::renderPopups() const { +void WorldRenderer::renderPopups() { renderTowerPlacePopup(); renderTowerUpgradePopup(); } @@ -100,9 +101,9 @@ void WorldRenderer::render() { renderMobs(); renderTowers(); renderTileSelect(); - detectClick(); renderMobTooltip(); renderPopups(); + detectClick(); } WorldRenderer::~WorldRenderer() { @@ -132,12 +133,10 @@ void WorldRenderer::changeZoom(float zoomStep) { void WorldRenderer::click() { const game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos()); - if(tower != nullptr){ // there is a tower here + if (tower != nullptr) { // there is a tower here ImGui::OpenPopup("TowerUpgrade"); - m_PopupOpened = true; - }else if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos(), m_Client->getPlayer()->getID())) { + } else if (m_Client->getWorld().CanPlaceLittleTower(getClickWorldPos(), m_Client->getPlayer()->getID())) { ImGui::OpenPopup("TowerPlace"); - m_PopupOpened = true; } } @@ -146,8 +145,9 @@ void WorldRenderer::setCamPos(float camX, float camY) { m_Renderer->setCamPos(m_CamPos); } -void WorldRenderer::renderTowerPlacePopup() const { +void WorldRenderer::renderTowerPlacePopup() { if (ImGui::BeginPopup("TowerPlace")) { + m_PopupOpened = true; for (int i = 0; i < (int)game::TowerType::TowerCount; i++) { game::TowerType towerType = game::TowerType(i); const game::TowerInfo& towerInfo = game::getTowerInfo(towerType); @@ -164,16 +164,45 @@ void WorldRenderer::renderTowerPlacePopup() const { } ImGui::EndPopup(); } + m_PopupOpened = false; } -void WorldRenderer::renderTowerUpgradePopup() const { +void WorldRenderer::renderTowerUpgradePopup() { if (ImGui::BeginPopup("TowerUpgrade")) { + m_PopupOpened = true; game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos()); - if(tower == nullptr){ + if (tower == nullptr) { ImGui::EndPopup(); return; } ImGui::Text("Tower : %s", game::TowerFactory::getTowerName(tower->getType()).c_str()); + + for (int y = 0; y < 3; y++) { // path: 0 -> top 1 -> middle 2 -> bottom + for (int x = 0; x < 4; x++) { // level: 1, 2, 3, 4 + + if (x > 0) + ImGui::SameLine(); + + const game::TowerStats* towerStats = game::getTowerStats(tower->getType(), { x + 1, game::TowerPath(y) }); + + bool disabled = towerStats == nullptr; + + ImGui::PushID(x * 4 + y); + if (disabled) { + ImGui::BeginDisabled(); + ImGui::PushStyleColor(ImGuiCol_Button, ImGui::GetStyleColorVec4(ImGuiCol_PopupBg)); + ImGui::Button("", ImVec2(100, 100)); + ImGui::PopStyleColor(); + ImGui::EndDisabled(); + } else { + if (ImGui::Button("Upgrade", ImVec2(100, 100))) { + std::cout << "Clicked !\n"; + } + } + ImGui::PopID(); + } + } + ImGui::EndPopup(); } } @@ -183,6 +212,7 @@ void WorldRenderer::detectClick() { if (ImGui::IsMouseReleased(0) && !ImGui::IsAnyItemHovered() && !ImGui::IsAnyItemFocused()) { glm::vec2 cursorPos = { io.MousePos.x, io.MousePos.y }; if (cursorPos == m_HoldCursorPos) { + m_LastClicked = m_HoldCursorPos; click(); } } @@ -239,7 +269,7 @@ glm::vec2 WorldRenderer::getCursorWorldPos() const { } glm::vec2 WorldRenderer::getClickWorldPos() const { - return m_Renderer->getCursorWorldPos(m_HoldCursorPos, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight()); + return m_Renderer->getCursorWorldPos(m_LastClicked, Display::getAspectRatio(), m_Zoom, Display::getWindowWidth(), Display::getWindowHeight()); } } // namespace render