diff --git a/CMakeLists.txt b/CMakeLists.txt index a2d17b5..1327b8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -260,6 +260,8 @@ add_executable(Dicewars_Siedler src/main.cpp src/game/hexWorld/ecs/systems/BuildPreviewSystem.h src/game/hexWorld/ecs/components/BuildingPreviewComponent.cpp src/game/hexWorld/ecs/components/BuildingPreviewComponent.h + src/game/GameWorldSystems.cpp + src/game/GameWorldSystems.h ) target_compile_options(Dicewars_Siedler PRIVATE diff --git a/src/engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h b/src/engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h index 1ff50ba..a602828 100644 --- a/src/engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h +++ b/src/engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h @@ -17,13 +17,11 @@ struct KeyboardIntent { class GameInputUser : public InputUser { public: - GameInputUser(TileHighlightSystem& highlightSystem, - EntityManager& em, + GameInputUser(EntityManager& em, MousePicker& picker, Camera& camera, GameMode& gameMode) - : highlightSystem(highlightSystem), - em(em), + :em(em), picker(picker), camera(camera), gameMode(gameMode) {} @@ -32,13 +30,10 @@ public: if (!isMouseEnabled()) { return; } - - highlightSystem.update(em, picker, camera, gameMode); } KeyboardIntent processKeyboard(); private: - TileHighlightSystem& highlightSystem; EntityManager& em; MousePicker& picker; Camera& camera; diff --git a/src/game/GameLayer.cpp b/src/game/GameLayer.cpp index a78380e..eabc716 100644 --- a/src/game/GameLayer.cpp +++ b/src/game/GameLayer.cpp @@ -74,7 +74,7 @@ void GameLayer::onAttach() ProducingSystem::onTurnEnded(*entityManager); }); - gameInputUser = std::make_unique(*tileHighlightSystem, *entityManager, *mousePicker, *camera, *gameMode); + gameInputUser = std::make_unique(*entityManager, *mousePicker, *camera, *gameMode); Application::getInstance().stateManager->registerMouseUser(gameInputUser.get(), {StateRegistry::get().game}); events.subscribe([this](const BuildingTypeSelectEvent& event) { @@ -100,7 +100,7 @@ void GameLayer::onUpdate() } if (intent.nextTurn) { - turnSystem->nextTurn(*turnState, Application::getInstance().getEventBus()); + worldSystems->onTurnEnd(*entityManager, *gameMode, *turnState); } if (intent.toggleUpgrade) { @@ -120,18 +120,7 @@ void GameLayer::onUpdate() } AnimationSystem::update(*entityManager, EngineTime::totalTime); - if (gameInputUser->isMouseEnabled()) { - tileHighlightSystem->update(*entityManager, *mousePicker, *camera, *gameMode); - BuildPreviewSystem::updateBuildPreview(*entityManager, *gameMode, gameMode->getCurrentPlayer(), *turnState); - SelectionSystem::update(*entityManager, *gameInputUser, *mousePicker); - if (gameMode->isUpgradeMode()) { - UpgradeSystem::tryUpdate(*entityManager, *gameMode, gameMode->getCurrentPlayer(), *turnState); - } - } else { - tileHighlightSystem->reset(*entityManager); - } - buildingPlacementSystem->update(*entityManager, *gameMode, 0, *turnState); - CollectResourceSystem::update(*entityManager, *gameMode); + worldSystems->update(*entityManager, *gameMode, *mousePicker, *camera, *gameInputUser, *turnState); } diff --git a/src/game/GameLayer.h b/src/game/GameLayer.h index f7e363c..a22bb80 100644 --- a/src/game/GameLayer.h +++ b/src/game/GameLayer.h @@ -4,6 +4,7 @@ #ifndef DICEWARS_SIEDLER_GAMELAYER_H #define DICEWARS_SIEDLER_GAMELAYER_H +#include "GameWorldSystems.h" #include "../engine/core/ECS/RenderSystem.h" #include "../engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h" #include "../engine/layer/Layer.h" @@ -42,17 +43,15 @@ private: std::vector> mapEntities; std::vector> entities; - std::unique_ptr tileHighlightSystem = std::make_unique(); - std::unique_ptr buildingPlacementSystem = std::make_unique(); std::unique_ptr entityManager = std::make_unique(); std::unique_ptr map; - std::unique_ptr turnSystem = std::make_unique(); std::unique_ptr turnState = std::make_unique(); std::unique_ptr gameInputUser; - EntityID testEntity; + + std::unique_ptr worldSystems; }; diff --git a/src/game/GameWorldSystems.cpp b/src/game/GameWorldSystems.cpp new file mode 100644 index 0000000..fea2c15 --- /dev/null +++ b/src/game/GameWorldSystems.cpp @@ -0,0 +1,33 @@ +// +// Created by sebastian on 17.04.26. +// + +#include "GameWorldSystems.h" + +#include "hexWorld/ecs/systems/BuildingPlacementSystem.h" +#include "hexWorld/ecs/systems/BuildPreviewSystem.h" +#include "hexWorld/ecs/systems/CollectResourceSystem.h" +#include "hexWorld/ecs/systems/ProducingSystem.h" +#include "hexWorld/ecs/systems/SelectionSystem.h" +#include "hexWorld/ecs/systems/UpgradeSystem.h" +#include "hexWorld/gameplay/TurnSystem.h" + +void GameWorldSystems::update(EntityManager &em, GameMode &gm, MousePicker &mp, const Camera &cam, GameInputUser &gameInputUser, const TurnState &turnState) { + if (gameInputUser.isMouseEnabled()) { + TileHighlightSystem::update(em, mp, cam, gm); + BuildPreviewSystem::updateBuildPreview(em, gm, gm.getCurrentPlayer(), turnState); + SelectionSystem::update(em, gameInputUser, mp); + if (gm.isUpgradeMode()) { + UpgradeSystem::tryUpdate(em, gm, gm.getCurrentPlayer(), turnState); + } + BuildingPlacementSystem::update(em, gm, gm.getCurrentPlayer(), turnState); + CollectResourceSystem::update(em, gm); + } else { + TileHighlightSystem::reset(em); + } +} + +void GameWorldSystems::onTurnEnd(EntityManager& em, GameMode& gm, TurnState& turnState) { + ProducingSystem::onTurnEnded(em); + TurnSystem::nextTurn(turnState, Application::getInstance().getEventBus()); +} diff --git a/src/game/GameWorldSystems.h b/src/game/GameWorldSystems.h new file mode 100644 index 0000000..5f07a72 --- /dev/null +++ b/src/game/GameWorldSystems.h @@ -0,0 +1,26 @@ +// +// Created by sebastian on 17.04.26. +// + +#ifndef DICEWARS_SIEDLER_GAMEWORLDSYSTEMS_H +#define DICEWARS_SIEDLER_GAMEWORLDSYSTEMS_H +#include "../engine/core/inputsOutputs/stateControl/inputUser/GameInputUser.h" +#include "../engine/platform/glfw/MousePicker.h" + +class EntityManager; +class GameMode; +class MousePicker; +class Camera; +class GameInputUser; +struct TurnState; + + +class GameWorldSystems { +public: + void update(EntityManager& em, GameMode& gm, MousePicker& mp, const Camera& cam, GameInputUser& gameInputUser, const TurnState& turnState); + void onTurnEnd(EntityManager& em, GameMode& gm, TurnState& turnState); +}; + + + +#endif //DICEWARS_SIEDLER_GAMEWORLDSYSTEMS_H diff --git a/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.h b/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.h index e64b845..0e81113 100644 --- a/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.h +++ b/src/game/hexWorld/ecs/systems/BuildingPlacementSystem.h @@ -11,7 +11,7 @@ class BuildingPlacementSystem { public: - void update(EntityManager &entityManager, GameMode &gameMode, EntityID player, const TurnState &turnState); + static void update(EntityManager &entityManager, GameMode &gameMode, EntityID player, const TurnState &turnState); }; diff --git a/src/game/hexWorld/ecs/systems/TileHighlightSystem.h b/src/game/hexWorld/ecs/systems/TileHighlightSystem.h index 95f5271..acdd3b6 100644 --- a/src/game/hexWorld/ecs/systems/TileHighlightSystem.h +++ b/src/game/hexWorld/ecs/systems/TileHighlightSystem.h @@ -12,10 +12,10 @@ class Camera; class TileHighlightSystem { public: - void update(EntityManager &entityManager, const MousePicker &picker, const Camera &camera, GameMode& gameMode); - void reset(EntityManager& entityManager); + static void update(EntityManager &entityManager, const MousePicker &picker, const Camera &camera, GameMode& gameMode); + static void reset(EntityManager& entityManager); private: - bool intersectTile(const glm::vec3 & rayOrigin, const glm::vec3 & rayDirection, glm::vec3 worldPos, float hexRadius, glm::vec3 &interectionPoint); + static bool intersectTile(const glm::vec3 & rayOrigin, const glm::vec3 & rayDirection, glm::vec3 worldPos, float hexRadius, glm::vec3 &interectionPoint); }; diff --git a/src/game/hexWorld/gameplay/TurnSystem.h b/src/game/hexWorld/gameplay/TurnSystem.h index 4b7dfdd..c1f1d4e 100644 --- a/src/game/hexWorld/gameplay/TurnSystem.h +++ b/src/game/hexWorld/gameplay/TurnSystem.h @@ -11,7 +11,7 @@ class TurnSystem { public: - void nextTurn(TurnState& turn, EventBus& events); + static void nextTurn(TurnState& turn, EventBus& events); };