diff --git a/assets/worldIcons/down-arrow.png b/assets/worldIcons/down-arrow.png new file mode 100644 index 0000000..05e1f5d Binary files /dev/null and b/assets/worldIcons/down-arrow.png differ diff --git a/assets/worldIcons/up-arrow.png b/assets/worldIcons/up-arrow.png new file mode 100644 index 0000000..d7aa133 Binary files /dev/null and b/assets/worldIcons/up-arrow.png differ 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); };