feat: add upgrade popup prototype

This commit is contained in:
2021-11-06 14:12:22 +01:00
parent 6825a6327f
commit ae802b4253
4 changed files with 84 additions and 45 deletions

View File

@@ -38,7 +38,8 @@ enum class TowerSize : std::uint8_t {
}; };
enum class TowerPath : std::uint8_t { enum class TowerPath : std::uint8_t {
Top = 0, // Base path Top = 0,
Base, // Base Path
Bottom Bottom
}; };
@@ -62,9 +63,9 @@ private:
// 1, 2, 3, 4 // 1, 2, 3, 4
std::uint8_t m_Level : 3; 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) // 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: 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) {} TowerLevel(std::uint8_t level, TowerPath path) : m_Level(level), m_Path(path) {}
std::uint8_t getLevel() const { return m_Level; } std::uint8_t getLevel() const { return m_Level; }
@@ -75,8 +76,8 @@ public:
// operator to sort maps // operator to sort maps
friend bool operator<(const TowerLevel& level, const TowerLevel& other) { friend bool operator<(const TowerLevel& level, const TowerLevel& other) {
return level.getLevel() * static_cast<std::uint8_t>(level.getPath()) < return level.getLevel() + static_cast<std::uint8_t>(level.getPath()) * 4 <
other.getLevel() * static_cast<std::uint8_t>(other.getPath()); other.getLevel() + static_cast<std::uint8_t>(other.getPath()) * 4;
} }
}; };

View File

@@ -26,6 +26,7 @@ private:
glm::vec2 m_CamPos; glm::vec2 m_CamPos;
glm::vec2 m_CursorPos; glm::vec2 m_CursorPos;
glm::vec2 m_HoldCursorPos; glm::vec2 m_HoldCursorPos;
glm::vec2 m_LastClicked;
float m_Zoom; float m_Zoom;
float m_CamSensibility = 1; float m_CamSensibility = 1;
bool m_PopupOpened = false; bool m_PopupOpened = false;
@@ -52,9 +53,9 @@ private:
void renderTowers() const; void renderTowers() const;
void renderMobs() const; void renderMobs() const;
void renderTileSelect() const; void renderTileSelect() const;
void renderPopups() const; void renderPopups();
void renderTowerPlacePopup() const; void renderTowerPlacePopup();
void renderTowerUpgradePopup() const; void renderTowerUpgradePopup();
void renderMobTooltip() const; void renderMobTooltip() const;
void detectClick(); void detectClick();
glm::vec2 getCursorWorldPos() const; glm::vec2 getCursorWorldPos() const;

View File

@@ -14,7 +14,8 @@ bool Tower::isMobInRange(MobPtr mob) {
const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = { const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
// // rate damage range // // 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, {2, TowerPath::Top}}, {1, 0, 12}},
{{TowerType::Archer, {3, TowerPath::Top}}, {1, 0, 13}}, {{TowerType::Archer, {3, TowerPath::Top}}, {1, 0, 13}},
{{TowerType::Archer, {4, TowerPath::Top}}, {0.8, 0, 15}}, {{TowerType::Archer, {4, TowerPath::Top}}, {0.8, 0, 15}},
@@ -25,15 +26,16 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Ice, {1, TowerPath::Top}}, {1, 0, 10}}, {{TowerType::Ice, {1, TowerPath::Base}}, {1, 0, 10}},
{{TowerType::Ice, {2, TowerPath::Top}}, {1, 0, 12}}, {{TowerType::Ice, {2, TowerPath::Base}}, {1, 0, 12}},
{{TowerType::Ice, {3, TowerPath::Top}}, {1, 0, 13}}, {{TowerType::Ice, {3, TowerPath::Base}}, {1, 0, 13}},
{{TowerType::Ice, {4, TowerPath::Top}}, {1, 4, 15}}, {{TowerType::Ice, {4, TowerPath::Base}}, {1, 4, 15}},
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Sorcerer, {1, TowerPath::Top}}, {5, 0, 10}}, {{TowerType::Sorcerer, {1, TowerPath::Base}}, {5, 0, 10}},
{{TowerType::Sorcerer, {2, TowerPath::Top}}, {4, 0, 12}}, {{TowerType::Sorcerer, {2, TowerPath::Base}}, {4, 0, 12}},
{{TowerType::Sorcerer, {3, TowerPath::Top}}, {4, 0, 14}}, {{TowerType::Sorcerer, {3, TowerPath::Top}}, {4, 0, 14}},
{{TowerType::Sorcerer, {4, TowerPath::Top}}, {4, 0, 15}}, {{TowerType::Sorcerer, {4, TowerPath::Top}}, {4, 0, 15}},
@@ -42,8 +44,9 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Zeus, {1, TowerPath::Top}}, {5, 0, 10}}, {{TowerType::Zeus, {1, TowerPath::Base}}, {5, 0, 10}},
{{TowerType::Zeus, {2, TowerPath::Top}}, {4, 0, 12}}, {{TowerType::Zeus, {2, TowerPath::Base}}, {4, 0, 12}},
{{TowerType::Zeus, {3, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Zeus, {3, TowerPath::Top}}, {0, 0, 0}},
{{TowerType::Zeus, {4, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Zeus, {4, TowerPath::Top}}, {0, 0, 0}},
@@ -52,15 +55,16 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Mage, {1, TowerPath::Top}}, {5, 0, 10}}, {{TowerType::Mage, {1, TowerPath::Base}}, {5, 0, 10}},
{{TowerType::Mage, {2, TowerPath::Top}}, {4, 0, 12}}, {{TowerType::Mage, {2, TowerPath::Base}}, {4, 0, 12}},
{{TowerType::Mage, {3, TowerPath::Top}}, {3, 0, 13}}, {{TowerType::Mage, {3, TowerPath::Base}}, {3, 0, 13}},
{{TowerType::Mage, {4, TowerPath::Top}}, {1, 30, 15}}, {{TowerType::Mage, {4, TowerPath::Base}}, {1, 30, 15}},
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Artillery, {1, TowerPath::Top}}, {7, 0, 10}}, {{TowerType::Artillery, {1, TowerPath::Base}}, {7, 0, 10}},
{{TowerType::Artillery, {2, TowerPath::Top}}, {7, 0, 12}}, {{TowerType::Artillery, {2, TowerPath::Base}}, {7, 0, 12}},
{{TowerType::Artillery, {3, TowerPath::Top}}, {7, 0, 13}}, {{TowerType::Artillery, {3, TowerPath::Top}}, {7, 0, 13}},
{{TowerType::Artillery, {4, TowerPath::Top}}, {7, 0, 15}}, {{TowerType::Artillery, {4, TowerPath::Top}}, {7, 0, 15}},
@@ -69,15 +73,16 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Quake, {1, TowerPath::Top}}, {5, 5, 10}}, {{TowerType::Quake, {1, TowerPath::Base}}, {5, 5, 10}},
{{TowerType::Quake, {2, TowerPath::Top}}, {4, 7, 12}}, {{TowerType::Quake, {2, TowerPath::Base}}, {4, 7, 12}},
{{TowerType::Quake, {3, TowerPath::Top}}, {3, 9, 13}}, {{TowerType::Quake, {3, TowerPath::Base}}, {3, 9, 13}},
{{TowerType::Quake, {4, TowerPath::Top}}, {2, 11, 15}}, {{TowerType::Quake, {4, TowerPath::Base}}, {2, 11, 15}},
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Poison, {1, TowerPath::Top}}, {5, 0, 10}}, {{TowerType::Poison, {1, TowerPath::Base}}, {5, 0, 10}},
{{TowerType::Poison, {2, TowerPath::Top}}, {5, 0, 12}}, {{TowerType::Poison, {2, TowerPath::Base}}, {5, 0, 12}},
{{TowerType::Poison, {3, TowerPath::Top}}, {6, 0, 13}}, {{TowerType::Poison, {3, TowerPath::Top}}, {6, 0, 13}},
{{TowerType::Poison, {4, TowerPath::Top}}, {5, 0, 15}}, {{TowerType::Poison, {4, TowerPath::Top}}, {5, 0, 15}},
@@ -86,13 +91,14 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Leach, {1, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Leach, {1, TowerPath::Base}}, {0, 0, 0}},
{{TowerType::Leach, {2, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Leach, {2, TowerPath::Base}}, {0, 0, 0}},
{{TowerType::Leach, {3, TowerPath::Top}}, {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, {2, TowerPath::Top}}, {0, 0, 0}},
{{TowerType::Turret, {3, TowerPath::Top}}, {0, 0, 0}}, {{TowerType::Turret, {3, TowerPath::Top}}, {0, 0, 0}},
@@ -101,8 +107,9 @@ const std::map<std::pair<TowerType, TowerLevel>, TowerStats> TowerConstants = {
//----------------------------------------------------------------- //-----------------------------------------------------------------
{{TowerType::Necromancer, {1, TowerPath::Top}}, {2, 0, 11}}, {{TowerType::Necromancer, {1, TowerPath::Base}}, {2, 0, 11}},
{{TowerType::Necromancer, {2, TowerPath::Top}}, {1, 0, 14}}, {{TowerType::Necromancer, {2, TowerPath::Base}}, {1, 0, 14}},
{{TowerType::Necromancer, {3, TowerPath::Top}}, {1, 0, 15}}, {{TowerType::Necromancer, {3, TowerPath::Top}}, {1, 0, 15}},
{{TowerType::Necromancer, {3, TowerPath::Bottom}}, {0, 30, 0}}, {{TowerType::Necromancer, {3, TowerPath::Bottom}}, {0, 30, 0}},

View File

@@ -2,6 +2,7 @@
#include "render/loader/WorldLoader.h" #include "render/loader/WorldLoader.h"
#include "render/Renderer.h" #include "render/Renderer.h"
#include "render/gui/imgui/imgui.h" #include "render/gui/imgui/imgui.h"
#include "gui/imgui/imgui_internal.h"
#include "window/Display.h" #include "window/Display.h"
#include "game/client/ClientGame.h" #include "game/client/ClientGame.h"
@@ -88,7 +89,7 @@ void WorldRenderer::renderTileSelect() const {
m_Renderer->renderModel(tileSelectModel); m_Renderer->renderModel(tileSelectModel);
} }
void WorldRenderer::renderPopups() const { void WorldRenderer::renderPopups() {
renderTowerPlacePopup(); renderTowerPlacePopup();
renderTowerUpgradePopup(); renderTowerUpgradePopup();
} }
@@ -100,9 +101,9 @@ void WorldRenderer::render() {
renderMobs(); renderMobs();
renderTowers(); renderTowers();
renderTileSelect(); renderTileSelect();
detectClick();
renderMobTooltip(); renderMobTooltip();
renderPopups(); renderPopups();
detectClick();
} }
WorldRenderer::~WorldRenderer() { WorldRenderer::~WorldRenderer() {
@@ -134,10 +135,8 @@ void WorldRenderer::click() {
const game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos()); 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"); 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"); ImGui::OpenPopup("TowerPlace");
m_PopupOpened = true;
} }
} }
@@ -146,8 +145,9 @@ void WorldRenderer::setCamPos(float camX, float camY) {
m_Renderer->setCamPos(m_CamPos); m_Renderer->setCamPos(m_CamPos);
} }
void WorldRenderer::renderTowerPlacePopup() const { void WorldRenderer::renderTowerPlacePopup() {
if (ImGui::BeginPopup("TowerPlace")) { if (ImGui::BeginPopup("TowerPlace")) {
m_PopupOpened = true;
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);
@@ -164,16 +164,45 @@ void WorldRenderer::renderTowerPlacePopup() const {
} }
ImGui::EndPopup(); ImGui::EndPopup();
} }
m_PopupOpened = false;
} }
void WorldRenderer::renderTowerUpgradePopup() const { void WorldRenderer::renderTowerUpgradePopup() {
if (ImGui::BeginPopup("TowerUpgrade")) { if (ImGui::BeginPopup("TowerUpgrade")) {
m_PopupOpened = true;
game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos()); game::TowerPtr tower = m_Client->getWorld().getTower(getClickWorldPos());
if (tower == nullptr) { if (tower == nullptr) {
ImGui::EndPopup(); ImGui::EndPopup();
return; return;
} }
ImGui::Text("Tower : %s", game::TowerFactory::getTowerName(tower->getType()).c_str()); 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(); ImGui::EndPopup();
} }
} }
@@ -183,6 +212,7 @@ void WorldRenderer::detectClick() {
if (ImGui::IsMouseReleased(0) && !ImGui::IsAnyItemHovered() && !ImGui::IsAnyItemFocused()) { if (ImGui::IsMouseReleased(0) && !ImGui::IsAnyItemHovered() && !ImGui::IsAnyItemFocused()) {
glm::vec2 cursorPos = { io.MousePos.x, io.MousePos.y }; glm::vec2 cursorPos = { io.MousePos.x, io.MousePos.y };
if (cursorPos == m_HoldCursorPos) { if (cursorPos == m_HoldCursorPos) {
m_LastClicked = m_HoldCursorPos;
click(); click();
} }
} }
@@ -239,7 +269,7 @@ glm::vec2 WorldRenderer::getCursorWorldPos() const {
} }
glm::vec2 WorldRenderer::getClickWorldPos() 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 } // namespace render