From 5e2986e2982eb70a86113adefee9653ba9d03fda Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 4 Nov 2021 19:41:47 +0100 Subject: [PATCH] feat: add mob tooltip --- include/game/BaseGame.h | 3 +++ include/game/Mobs.h | 1 + include/render/WorldRenderer.h | 1 + src/game/Mobs.cpp | 27 +++++++++++++++++++++++++++ src/render/WorldRenderer.cpp | 28 ++++++++++++++++++++++++++++ 5 files changed, 60 insertions(+) diff --git a/include/game/BaseGame.h b/include/game/BaseGame.h index 660d218..8db9566 100644 --- a/include/game/BaseGame.h +++ b/include/game/BaseGame.h @@ -46,6 +46,9 @@ public: const PlayerList& getPlayers() const { return m_Players; } PlayerList& getPlayers() { return m_Players; } + const Player& getPlayerById(PlayerID id) const { return m_Players.find(id)->second; } + Player& getPlayerById(PlayerID id) { return m_Players.find(id)->second; } + }; } // namespace game diff --git a/include/game/Mobs.h b/include/game/Mobs.h index 63be38f..721e025 100644 --- a/include/game/Mobs.h +++ b/include/game/Mobs.h @@ -192,6 +192,7 @@ public: namespace MobFactory { MobPtr createMob(MobID id, MobType type, std::uint8_t level, PlayerID sender); +std::string getMobName(MobType type); } diff --git a/include/render/WorldRenderer.h b/include/render/WorldRenderer.h index dc850a6..d498b17 100644 --- a/include/render/WorldRenderer.h +++ b/include/render/WorldRenderer.h @@ -53,6 +53,7 @@ private: void renderMobs() const; void renderTileSelect() const; void renderPopups() const; + void renderMobTooltip() const; void detectClick(); glm::vec2 getCursorWorldPos() const; glm::vec2 getClickWorldPos() const; diff --git a/src/game/Mobs.cpp b/src/game/Mobs.cpp index b5094ae..f38d981 100644 --- a/src/game/Mobs.cpp +++ b/src/game/Mobs.cpp @@ -268,5 +268,32 @@ MobPtr MobFactory::createMob(MobID id, MobType type, std::uint8_t level, PlayerI return mobFactory[type](id, level, sender); } +std::string MobFactory::getMobName(MobType type){ + switch(type){ + case MobType::Zombie: + return "Zombie"; + case MobType::Spider: + return "Spider"; + case MobType::Skeleton: + return "Skeleton"; + case MobType::Pigman: + return "Pigman"; + case MobType::Creeper: + return "Creeper"; + case MobType::Silverfish: + return "Silverfish"; + case MobType::Blaze: + return "Blaze"; + case MobType::Witch: + return "Witch"; + case MobType::Slime: + return "Slime"; + case MobType::Giant: + return "Giant"; + default: + return "Unknow"; + } +} + } // namespace game } // namespace td diff --git a/src/render/WorldRenderer.cpp b/src/render/WorldRenderer.cpp index c3cf5fc..adf5610 100644 --- a/src/render/WorldRenderer.cpp +++ b/src/render/WorldRenderer.cpp @@ -84,6 +84,7 @@ void WorldRenderer::render() { renderTowers(); renderTileSelect(); detectClick(); + renderMobTooltip(); renderPopups(); } @@ -154,6 +155,33 @@ void WorldRenderer::detectClick() { } } +void WorldRenderer::renderMobTooltip() const { + glm::vec2 cursorWorldPos = getCursorWorldPos(); + for (game::MobPtr mob : m_World->getMobList()) { + // mob size is currently 1x1 for all mobs + float mobCenterX = mob->getX(); + float mobCenterY = mob->getY(); + if (cursorWorldPos.x > mobCenterX - 0.5f && cursorWorldPos.x < mobCenterX + 0.5f + && cursorWorldPos.y > mobCenterY - 0.5f && cursorWorldPos.y < mobCenterY + 0.5f) { + ImGui::BeginTooltip(); + ImGui::Text("Sender : %s", m_Client->getPlayerById(mob->getSender()).getName().c_str()); + ImGui::Text("Mob HP : %.1f/%i", mob->getHealth(), mob->getStats()->getMaxLife()); + ImGui::Text("Mob Type : %s", game::MobFactory::getMobName(mob->getType()).c_str()); + ImGui::Text("Mob Level : %i", mob->getLevel()); + ImGui::NewLine(); + ImGui::Text("Mob Stats :"); + ImGui::Text("\tMax health : %i", mob->getStats()->getMaxLife()); + ImGui::Text("\tSpeed : %.1f", mob->getStats()->getMovementSpeed()); + ImGui::Text("\tDamage : %.1f", mob->getStats()->getDamage()); + ImGui::Text("\tMoney cost : %i", mob->getStats()->getMoneyCost()); + ImGui::Text("\tEXP cost : %i", mob->getStats()->getExpCost()); + ImGui::Text("\tEXP reward : %i", mob->getStats()->getExpReward()); + ImGui::EndTooltip(); + break; + } + } +} + void WorldRenderer::addTower(game::TowerPtr tower) { const WorldLoader::RenderData& renderData = WorldLoader::loadTowerModel(tower); m_TowersCache.addData(tower->getID(), renderData.positions, renderData.colors);