From f1f1dde9b5621e2a65e0ed1b29d2a23a448f48c0 Mon Sep 17 00:00:00 2001 From: sebastian Date: Sat, 14 Feb 2026 16:16:29 +0100 Subject: [PATCH] ADD: Create WorldSprits when Inventory of Building is full --- assets/worldIcons/error.png | Bin 0 -> 27051 bytes src/engine/core/ECS/WorldSpriteComponent.h | 1 + src/game/GameLayer.cpp | 20 +------ .../hexWorld/ecs/systems/ProducingSystem.cpp | 54 ++++++++++++++++++ .../hexWorld/ecs/systems/ProducingSystem.h | 13 +++++ 5 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 assets/worldIcons/error.png diff --git a/assets/worldIcons/error.png b/assets/worldIcons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..6352566d5b4104f90745e4df288c64c9c538428d GIT binary patch literal 27051 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 H^^5-j3vrAm literal 0 HcmV?d00001 diff --git a/src/engine/core/ECS/WorldSpriteComponent.h b/src/engine/core/ECS/WorldSpriteComponent.h index 5602369..4c3fce3 100644 --- a/src/engine/core/ECS/WorldSpriteComponent.h +++ b/src/engine/core/ECS/WorldSpriteComponent.h @@ -13,6 +13,7 @@ class WorldSpriteComponent : public Component { public: + std::string iconName; std::shared_ptr texture; glm::vec3 offset = {0.f, 6.0f, 0.f}; diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index f742d78..5f66d55 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -59,25 +59,7 @@ void GameLayer::onAttach() AssetManager::loadAsset("assets/buildings/forest_hut/cabin.json", loader); auto modelTexture = AssetManager::loadTexture("warning", "assets/worldIcons/warning.png", loader); - - TransformComponent transformComponent(glm::vec3(0,0,0), glm::vec3(0), 1.0f); - testEntity = BuildingFactory::create(*entityManager, TemporaryBuildingDefinitionFactory::createForestHutDefinition(), transformComponent, 0, 0); - auto worldSpritePtr = std::make_shared(); - worldSpritePtr->texture = modelTexture; - entityManager->addComponent(testEntity, worldSpritePtr); - - auto anim = std::make_shared(); - - float baseY = worldSpritePtr->offset.y; - - anim->tracks.push_back({ - AnimationCurve{CurveType::Sine, 0.3f, 5.f}, - [worldSpritePtr, baseY](float v) { - worldSpritePtr->offset.y = baseY + v; - } - }); - - entityManager->addComponent(testEntity, anim); + AssetManager::loadTexture("error", "assets/worldIcons/error.png", loader); events.subscribe([this](const TurnChangedEvent& event) { diff --git a/src/game/hexWorld/ecs/systems/ProducingSystem.cpp b/src/game/hexWorld/ecs/systems/ProducingSystem.cpp index 8fe078d..a512b3c 100644 --- a/src/game/hexWorld/ecs/systems/ProducingSystem.cpp +++ b/src/game/hexWorld/ecs/systems/ProducingSystem.cpp @@ -7,10 +7,18 @@ #include #include +#include "../../../../engine/core/animations/AnimationComponent.h" #include "../../../../engine/core/ECS/EntityManager.h" #include "../../../../engine/core/ECS/ModelStateComponent.h" +#include "../../../../engine/core/ECS/WorldSpriteComponent.h" +#include "../../../../engine/renderer/loader/AssetManager.h" #include "../components/ProducingComponent.h" +std::vector ProducingSystem::storageIcons = { + {0.75f, 0.99f, "warning"}, + {0.99f, 1.0f, "error"} +}; + void ProducingSystem::onTurnEnded(EntityManager &em) { for (const EntityID e : em.getAllEntities()) { const auto prod = em.getComponent(e); @@ -30,5 +38,51 @@ void ProducingSystem::onTurnEnded(EntityManager &em) { float fillRatio = static_cast(prod->getStorage()) / static_cast(prod->getMaxStorage()); modelState->params["fillRatio"] = fillRatio; + + // -- Icon / Animation Logik + for (const auto& status : storageIcons) { + if (fillRatio >= status.minRatio && fillRatio <= status.maxRatio) { + auto spriteComp = em.getComponent(e); + if (spriteComp) { + if (spriteComp->iconName != status.iconName) { + spriteComp->iconName = status.iconName; + spriteComp->texture = AssetManager::getTexture(status.iconName); + } + } else { + createWorldSprite(em, e, status.iconName); + } + break; + } + } + } +} + +void ProducingSystem::createWorldSprite(EntityManager &em, EntityID e, const std::string &iconName) { + auto iconTexture = AssetManager::getTexture(iconName); + + auto worldSpritePtr = std::make_shared(); + std::weak_ptr weakSprite = worldSpritePtr; + worldSpritePtr->texture = iconTexture; + worldSpritePtr->iconName = iconName; + + 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/ProducingSystem.h b/src/game/hexWorld/ecs/systems/ProducingSystem.h index 84bce98..3740697 100644 --- a/src/game/hexWorld/ecs/systems/ProducingSystem.h +++ b/src/game/hexWorld/ecs/systems/ProducingSystem.h @@ -4,14 +4,27 @@ #ifndef DICEWARS_SIEDLER_PRODUCINGSYSTEM_H #define DICEWARS_SIEDLER_PRODUCINGSYSTEM_H +#include + +#include "../../../../engine/core/ECS/WorldSpriteComponent.h" #include "../../../player/Player.h" +struct StorageStatus { + float minRatio = 0.0; + float maxRatio = 1.0; + std::string iconName; +}; class EntityManager; class ProducingSystem { public: static void onTurnEnded(EntityManager &em); + +private: + static std::vector storageIcons; + + static void createWorldSprite(EntityManager &em, uint32_t e, const std::string &iconName); };