From ca526e02532810f824a67398f729d5ab1f4609bf Mon Sep 17 00:00:00 2001 From: sebastian Date: Sat, 21 Feb 2026 07:48:00 +0100 Subject: [PATCH] ADD: Visualize Upgradeable Buildings --- assets/worldIcons/down-arrow.png | Bin 0 -> 4863 bytes assets/worldIcons/up-arrow.png | Bin 0 -> 1050965 bytes src/game/GameLayer.cpp | 11 ++- .../hexWorld/ecs/systems/UpgradeSystem.cpp | 65 ++++++++++++++++++ src/game/hexWorld/ecs/systems/UpgradeSystem.h | 4 ++ 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 assets/worldIcons/down-arrow.png create mode 100644 assets/worldIcons/up-arrow.png diff --git a/assets/worldIcons/down-arrow.png b/assets/worldIcons/down-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..05e1f5d74e031042203dde9c1d5a07c11dbb26c6 GIT binary patch literal 4863 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�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 literal 0 HcmV?d00001 diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index 71667be..17522d7 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -66,6 +66,7 @@ void GameLayer::onAttach() auto modelTexture = AssetManager::loadTexture("warning", "assets/worldIcons/warning.png", loader); AssetManager::loadTexture("error", "assets/worldIcons/error.png", loader); + AssetManager::loadTexture("upgrade", "assets/worldIcons/up-arrow.png", loader); events.subscribe([this](const TurnChangedEvent& event) { @@ -108,7 +109,15 @@ void GameLayer::onUpdate() if (gameInputUser->isKeyboardEnabled()) { if (Application::getInstance().keyboard->keyPressEvent(GLFW_KEY_U)) { - gameMode->setUpgradeMode(!gameMode->isUpgradeMode()); + if (gameMode->isUpgradeMode()) { + // Disable upgrade mode in upgrade system + UpgradeSystem::disableUpgradeMode(*entityManager, gameMode->getCurrentPlayer(), *gameMode); + gameMode->setUpgradeMode(false); + } else { + UpgradeSystem::enableUpgradeMode(*entityManager, gameMode->getCurrentPlayer(), *gameMode, *turnState); + gameMode->setUpgradeMode(true); + } + } } diff --git a/src/game/hexWorld/ecs/systems/UpgradeSystem.cpp b/src/game/hexWorld/ecs/systems/UpgradeSystem.cpp index 86c2ac7..eede14b 100644 --- a/src/game/hexWorld/ecs/systems/UpgradeSystem.cpp +++ b/src/game/hexWorld/ecs/systems/UpgradeSystem.cpp @@ -15,7 +15,13 @@ #include "../../../../engine/core/ECS/TileRenderComponent.h" #include "../../../../engine/core/ECS/ModelComponent.h" #include "../../../../engine/core/ECS/ModelStateComponent.h" +#include "../../../../engine/renderer/loader/AssetManager.h" #include "../components/TileGameplayComponent.h" +#include "../../../../engine/core/ECS/WorldSpriteComponent.h" +#include "../../../../engine/core/animations/AnimationComponent.h" + +class AnimationComponent; +class WorldSpriteComponent; void UpgradeSystem::tryUpdate(EntityManager &em, GameMode &gm, PlayerID player, const TurnState &turnState) { EntityID tileEntityID = SelectionSystem::selectedEntity; @@ -55,6 +61,34 @@ void UpgradeSystem::tryUpdate(EntityManager &em, GameMode &gm, PlayerID player, } +void UpgradeSystem::enableUpgradeMode(EntityManager &em, PlayerID player, GameMode& gameMode, const TurnState &turnState) { + for (EntityID entityID : em.getAllEntities()) { + auto buildingComponent = em.getComponent(entityID); + auto ownerComponent = em.getComponent(entityID); + + if (buildingComponent && ownerComponent && ownerComponent->playerID == player) { + const auto upgradeResult = canUpgrade(em, player, gameMode, entityID, turnState); + if (upgradeResult == UpgradeResult::Ok || upgradeResult == UpgradeResult::NotPlayersTurn) { + createWorldSprite(em, entityID); + } + } + } +} + +void UpgradeSystem::disableUpgradeMode(EntityManager &em, PlayerID player, GameMode &gameMode) { + for (EntityID entityID : em.getAllEntities()) { + const auto buildingComponent = em.getComponent(entityID); + const auto ownerComponent = em.getComponent(entityID); + const auto worldSpriteComponent = em.getComponent(entityID); + const auto animComponent = em.getComponent(entityID); + + if (buildingComponent && ownerComponent && ownerComponent->playerID == player && worldSpriteComponent) { + em.removeComponent(entityID); + em.removeComponent(entityID); + } + } +} + UpgradeResult UpgradeSystem::canUpgrade(EntityManager &em, PlayerID player, GameMode& gameMode, EntityID buildingEntity, const TurnState &turnState) { if (!gameMode.hasTurn(player, turnState.currentTurn)) return UpgradeResult::NotPlayersTurn; @@ -78,3 +112,34 @@ UpgradeResult UpgradeSystem::canUpgrade(EntityManager &em, PlayerID player, Game return UpgradeResult::Ok; } + +void UpgradeSystem::createWorldSprite(EntityManager &em, EntityID e) { + auto iconTexture = AssetManager::getTexture("upgrade"); + + auto worldSpritePtr = std::make_shared(); + std::weak_ptr weakSprite = worldSpritePtr; + worldSpritePtr->texture = iconTexture; + worldSpritePtr->iconName = "upgrade"; + + auto anim = std::make_shared(); + + float baseY = worldSpritePtr->offset.y; + + anim->tracks.push_back({ + AnimationCurve{CurveType::Sine, 0.3f, 5.f}, + [weakSprite, baseY](float v) { + if (auto sprite = weakSprite.lock()) { + sprite->offset.y = baseY + v; + } + } + }); + + if (!em.getComponent(e)) { + em.addComponent(e, worldSpritePtr); + } + + if (!em.getComponent(e)) { + em.addComponent(e, anim); + } +} + diff --git a/src/game/hexWorld/ecs/systems/UpgradeSystem.h b/src/game/hexWorld/ecs/systems/UpgradeSystem.h index d122edb..790b77e 100644 --- a/src/game/hexWorld/ecs/systems/UpgradeSystem.h +++ b/src/game/hexWorld/ecs/systems/UpgradeSystem.h @@ -21,7 +21,11 @@ class EntityManager; class UpgradeSystem { public: static void tryUpdate(EntityManager &em, GameMode &gm, PlayerID player, const TurnState &turnState); + static void enableUpgradeMode(EntityManager &em, PlayerID player, GameMode& gameMode, const TurnState &turnState); + static void disableUpgradeMode(EntityManager &em, PlayerID player, GameMode& gameMode); +private: + static void createWorldSprite(EntityManager &em, EntityID e); static UpgradeResult canUpgrade(EntityManager &em, PlayerID player, GameMode &gameMode, EntityID buildingEntity, const TurnState &turnState); };