From 46932e4abf75409f52606ed700f2ebbcf018d589 Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Wed, 5 Aug 2026 06:43:52 +0200 Subject: [PATCH] move FactoryState ownership out of BuildingSystem to Simulation --- src/balancing/ArenaSimulation.cpp | 1 + src/balancing/ArenaSimulation.h | 2 + src/lib/sim/BuildingSystem.cpp | 2 + src/lib/sim/BuildingSystem.h | 11 ++-- src/lib/sim/FactoryState.h | 7 +- src/lib/sim/Simulation.cpp | 2 + src/lib/sim/Simulation.h | 4 ++ src/test/BehaviorSystemTest.cpp | 4 +- src/test/BuildingTest.cpp | 103 ++++++++++++++++++++---------- src/test/CombatSystemTest.cpp | 4 +- 10 files changed, 97 insertions(+), 43 deletions(-) diff --git a/src/balancing/ArenaSimulation.cpp b/src/balancing/ArenaSimulation.cpp index 7419bad..901e77a 100644 --- a/src/balancing/ArenaSimulation.cpp +++ b/src/balancing/ArenaSimulation.cpp @@ -48,6 +48,7 @@ ArenaSimulation::ArenaSimulation(const GameConfig& gameConfig, { m_buildingSystem = std::make_unique( m_gameConfig, + m_factoryState, m_beltSystem, [this]() { return allocateBuildingId(); }, [](int) {}, diff --git a/src/balancing/ArenaSimulation.h b/src/balancing/ArenaSimulation.h index 0b95ba7..3fc8edc 100644 --- a/src/balancing/ArenaSimulation.h +++ b/src/balancing/ArenaSimulation.h @@ -10,6 +10,7 @@ #include "BalancingConfig.h" #include "BeltSystem.h" +#include "FactoryState.h" #include "EntityAdmin.h" #include "BuildingId.h" @@ -107,6 +108,7 @@ private: BuildingId m_nextBuildingId; EntityAdmin m_admin; + FactoryState m_factoryState; BeltSystem m_beltSystem; std::unique_ptr m_buildingSystem; std::unique_ptr m_shipSystem; diff --git a/src/lib/sim/BuildingSystem.cpp b/src/lib/sim/BuildingSystem.cpp index 124408d..45c462c 100644 --- a/src/lib/sim/BuildingSystem.cpp +++ b/src/lib/sim/BuildingSystem.cpp @@ -23,6 +23,7 @@ bool inputLaneEntryFree(const std::vector& lane) } // namespace BuildingSystem::BuildingSystem(const GameConfig& config, + FactoryState& state, BeltSystem& belts, std::function allocateBuildingId, std::function addBuildingBlocks, @@ -31,6 +32,7 @@ BuildingSystem::BuildingSystem(const GameConfig& config, std::function isItemUnlocked, std::mt19937& rng) : m_config(config) + , m_state(state) , m_belts(belts) , m_allocateBuildingId(std::move(allocateBuildingId)) , m_addBuildingBlocks(std::move(addBuildingBlocks)) diff --git a/src/lib/sim/BuildingSystem.h b/src/lib/sim/BuildingSystem.h index 3a70f0c..89a7a99 100644 --- a/src/lib/sim/BuildingSystem.h +++ b/src/lib/sim/BuildingSystem.h @@ -47,6 +47,7 @@ class BuildingSystem { public: BuildingSystem(const GameConfig& config, + FactoryState& state, BeltSystem& belts, std::function allocateBuildingId, std::function addBuildingBlocks, @@ -285,6 +286,11 @@ private: QPoint anchor) const; const GameConfig& m_config; + + // The factory's world data — buildings, queued work, tile ownership. Owned by + // Simulation, not by this system (see FactoryState.h). + FactoryState& m_state; + BeltSystem& m_belts; std::function m_allocateBuildingId; std::function m_addBuildingBlocks; @@ -293,9 +299,4 @@ private: std::function m_isItemUnlocked; std::mt19937& m_rng; int m_asteroidWidth_tiles; - - // The factory's world data — buildings, queued work, tile ownership. Held here - // for now; the intent is for Simulation to own it and pass it into the tick - // methods, leaving this system stateless over it (see FactoryState.h). - FactoryState m_state; }; diff --git a/src/lib/sim/FactoryState.h b/src/lib/sim/FactoryState.h index 3624076..62e5966 100644 --- a/src/lib/sim/FactoryState.h +++ b/src/lib/sim/FactoryState.h @@ -31,8 +31,11 @@ struct DeconstructionEntry // data/behaviour split the ecs/system/ classes already follow, where world data // arrives as a tick argument instead of being owned by the system. // -// Owned by BuildingSystem for now. The intent is to hand ownership to Simulation -// and pass this into the tick methods, so the systems become stateless over it. +// Owned by Simulation (and by ArenaSimulation in the balancing tool), not by the +// systems that operate on it. BuildingSystem holds a reference. The remaining step +// is to pass this into the tick methods instead, so the systems become stateless +// over it — that one is gated on the query surface, which today reaches the data +// through BuildingSystem's ~180 const call sites. struct FactoryState { std::vector buildings; diff --git a/src/lib/sim/Simulation.cpp b/src/lib/sim/Simulation.cpp index 53275de..4bc36af 100644 --- a/src/lib/sim/Simulation.cpp +++ b/src/lib/sim/Simulation.cpp @@ -94,6 +94,7 @@ void Simulation::reset(unsigned int seed) m_pendingSchematicChoices.clear(); m_admin.clear(); + m_factoryState = FactoryState{}; m_beltSystem = BeltSystem(m_config.world.beltSpeed_tps); initializeSubsystems(); @@ -105,6 +106,7 @@ void Simulation::initializeSubsystems() { m_buildingSystem = std::make_unique( m_config, + m_factoryState, m_beltSystem, [this]() { return allocateBuildingId(); }, [this](int amount) { m_buildingBlocksStock += amount; }, diff --git a/src/lib/sim/Simulation.h b/src/lib/sim/Simulation.h index 3c58ec9..e38e728 100644 --- a/src/lib/sim/Simulation.h +++ b/src/lib/sim/Simulation.h @@ -9,6 +9,7 @@ #include #include "BeltSystem.h" +#include "FactoryState.h" #include "EntityAdmin.h" #include "entt/entity/entity.hpp" #include "SchematicChoiceOption.h" @@ -209,6 +210,9 @@ private: UnlockState m_unlockState; EntityAdmin m_admin; + // The factory's world data. Owned here, not by BuildingSystem, so the systems + // that operate on it can be handed the same state (see FactoryState.h). + FactoryState m_factoryState; BeltSystem m_beltSystem; std::unique_ptr m_buildingSystem; std::unique_ptr m_shipSystem; diff --git a/src/test/BehaviorSystemTest.cpp b/src/test/BehaviorSystemTest.cpp index 8e95ca3..055e9c2 100644 --- a/src/test/BehaviorSystemTest.cpp +++ b/src/test/BehaviorSystemTest.cpp @@ -14,6 +14,7 @@ #include "BeltSystem.h" #include "Building.h" #include "BuildingSystem.h" +#include "FactoryState.h" #include "BuildingType.h" #include "ConfigLoader.h" #include "DeliverScrapBehavior.h" @@ -54,6 +55,7 @@ struct Fixture { GameConfig cfg; + FactoryState state; BeltSystem belts; BuildingId nextBuildingId; int stock; @@ -76,7 +78,7 @@ struct Fixture , nextBuildingId(1) , stock(0) , rng(42) - , buildings(cfg, belts, + , buildings(cfg, state, belts, [this]() { return nextBuildingId++; }, [this](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, diff --git a/src/test/BuildingTest.cpp b/src/test/BuildingTest.cpp index b886a5a..51c547e 100644 --- a/src/test/BuildingTest.cpp +++ b/src/test/BuildingTest.cpp @@ -12,6 +12,7 @@ #include "BeltSystem.h" #include "Building.h" #include "BuildingSystem.h" +#include "FactoryState.h" #include "BuildingType.h" #include "ConfigLoader.h" #include "Item.h" @@ -83,6 +84,7 @@ static std::vector outputSideItems(const Building& b) struct PlacementFixture { GameConfig cfg = loadTestConfig(); + FactoryState state; BeltSystem belts{cfg.world.beltSpeed_tps}; int stock = 0; std::mt19937 rng{0}; @@ -90,7 +92,7 @@ struct PlacementFixture BuildingSystem bs; PlacementFixture() - : bs(cfg, belts, + : bs(cfg, state, belts, [this]() { return nextBuildingId++; }, [this](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -111,7 +113,8 @@ TEST_CASE("BuildingSystem: place miner occupies expected body tiles", "[building int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -219,7 +222,8 @@ TEST_CASE("BuildingSystem: placing a belt registers it with BeltSystem after con int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -248,7 +252,8 @@ TEST_CASE("BuildingSystem: placed building enters construction queue", "[buildin int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -290,7 +295,8 @@ TEST_CASE("BuildingSystem: first queued building starts construction immediately int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -308,7 +314,8 @@ TEST_CASE("BuildingSystem: second queued building waits (completesAt == 0)", "[b int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -330,7 +337,8 @@ TEST_CASE("BuildingSystem: construction completes after configured duration", "[ int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -496,7 +504,8 @@ TEST_CASE("BuildingSystem: second building starts after first completes", "[buil int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -526,7 +535,8 @@ TEST_CASE("BuildingSystem: miner produces iron_ore after recipe duration", "[bui int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -559,7 +569,8 @@ TEST_CASE("BuildingSystem: miner output buffer stalls when full", "[building]") int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -599,7 +610,8 @@ TEST_CASE("BuildingSystem: productionBuildingCount excludes construction sites", int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -639,7 +651,8 @@ TEST_CASE("BuildingSystem: activeProductionBuildingCount tracks production cycle int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -681,7 +694,8 @@ TEST_CASE("BuildingSystem: smelter input buffer fills from adjacent west-flowing int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -723,7 +737,8 @@ TEST_CASE("BuildingSystem: accepted input travels inward before entering the buf int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -764,7 +779,8 @@ TEST_CASE("BuildingSystem: input reservation caps buffered plus in-transit at th int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -806,7 +822,8 @@ TEST_CASE("BuildingSystem: smelter auto-smelts ore without a recipe selection", int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -852,7 +869,8 @@ TEST_CASE("BuildingSystem: smelter runs a satisfiable recipe while an incomplete int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -906,7 +924,8 @@ TEST_CASE("BuildingSystem: miner output buffer drains onto adjacent belt", "[bui int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -945,7 +964,8 @@ TEST_CASE("BuildingSystem: output port couples directly into an adjacent input p int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -985,7 +1005,8 @@ TEST_CASE("BuildingSystem: direct coupling to a non-consumer leaves the item stu int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1024,7 +1045,8 @@ TEST_CASE("BuildingSystem: setRecipe clears output buffer and active production" int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1067,7 +1089,8 @@ TEST_CASE("BuildingSystem: reprocessing plant output buffer capacity equals max int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1099,7 +1122,8 @@ TEST_CASE("BuildingSystem: reprocessing plant produces one cycle output then sta // Seed chosen so first roll produces 2-item output (iron_ingot), filling buffer. std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1157,7 +1181,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget returns nullopt when tile is int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1176,7 +1201,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget returns the site id for a que int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1199,7 +1225,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget returns the building id for a int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1226,7 +1253,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget returns nullopt when building int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1248,7 +1276,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget never rotates a tunnel in pla int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1274,7 +1303,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget returns nullopt when footprin int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1298,7 +1328,8 @@ TEST_CASE("BuildingSystem: findRotateInPlaceTarget works for a symmetric multi-t int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1327,7 +1358,8 @@ TEST_CASE("BuildingSystem: rotateInPlace updates the rotation field of a constru int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1350,7 +1382,8 @@ TEST_CASE("BuildingSystem: rotateInPlace preserves the construction progress of int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1374,7 +1407,8 @@ TEST_CASE("BuildingSystem: rotateInPlace updates rotation and output port direct int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, @@ -1405,7 +1439,8 @@ TEST_CASE("BuildingSystem: rotateInPlace re-registers a belt tile with BeltSyste int stock = 0; std::mt19937 rng(0); BuildingId nextBuildingId = 1; - BuildingSystem bs(cfg, belts, + FactoryState state_bs; + BuildingSystem bs(cfg, state_bs, belts, [&nextBuildingId]() { return nextBuildingId++; }, [&stock](int n) { stock += n; }, [](const std::string&, QVector2D, const std::optional&) {}, diff --git a/src/test/CombatSystemTest.cpp b/src/test/CombatSystemTest.cpp index 7afccd8..10ac73d 100644 --- a/src/test/CombatSystemTest.cpp +++ b/src/test/CombatSystemTest.cpp @@ -5,6 +5,7 @@ #include "BeltSystem.h" #include "Building.h" #include "BuildingSystem.h" +#include "FactoryState.h" #include "BuildingType.h" #include "CombatSystem.h" #include "ConfigLoader.h" @@ -51,6 +52,7 @@ static entt::entity findWeaponChild(EntityAdmin& admin, entt::entity ship) struct CombatFixture { GameConfig cfg; + FactoryState state; std::mt19937 rng; EntityAdmin admin; BuildingId nextBuildingId; @@ -65,7 +67,7 @@ struct CombatFixture , nextBuildingId(1) , belts(cfg.world.beltSpeed_tps) , ships(cfg, admin) - , buildings(cfg, belts, + , buildings(cfg, state, belts, [this]() { return nextBuildingId++; }, [](int){}, [](const std::string&, QVector2D, const std::optional&) {},