The FactoryState migration finished some time ago -- every system that touches the factory takes the state as an argument and holds none of it, and the const surface has become free functions over the struct -- but the comments still described the state of affairs two refactors back. FactoryState.h claimed BuildingSystem holds a reference and that passing the state into the tick methods was the remaining step, gated on ~180 const call sites that no longer exist. It now says what is true, and names what genuinely has not moved: the id counter and the block stock, factory data still living on Simulation behind callbacks. architecture.md described neither FactoryState nor FactoryQueries at all, so the Buildings section told a reader that buildings are a plain vector and nothing about who owns it or how it is read. It gains that section, including why ConstructionSystem completes a building itself. BuildingSystem.h had collected ten comment blocks whose declarations had moved out from under them -- the whole Queries section was four comments and no functions, and the deconstruction-queue tick comment sat above tickBeltPull, documenting the wrong function. Those are gone; tickBeltPull gets a comment describing what it actually does, and the Queries banner now points at where the queries went. No code changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ne3mejABZoLWKLh8fgpM3x
72 lines
3.2 KiB
C++
72 lines
3.2 KiB
C++
#pragma once
|
|
|
|
#include <deque>
|
|
#include <vector>
|
|
|
|
#include "Building.h"
|
|
#include "GameConfig.h"
|
|
#include "BuildingGrid.h"
|
|
#include "BuildingId.h"
|
|
#include "ItemType.h"
|
|
#include "Tick.h"
|
|
|
|
// One pending demolition of a fully-built building (REQ-BLD-DECON-QUEUE).
|
|
// completesAt == 0 means "queued but its timer has not started yet"
|
|
// (mirrors ConstructionSite). For a Splitter, the filters it had are captured
|
|
// here so cancelDeconstruction can restore them on re-registration.
|
|
struct DeconstructionEntry
|
|
{
|
|
BuildingId id = kInvalidBuildingId;
|
|
Tick completesAt = 0;
|
|
std::vector<ItemType> splitterFilterA;
|
|
std::vector<ItemType> splitterFilterB;
|
|
};
|
|
|
|
// The factory's world data: every building, the work queued on them, and the
|
|
// tile ownership index. This is the buildings-side counterpart to EntityAdmin —
|
|
// data with no behaviour of its own beyond what BuildingGrid encapsulates.
|
|
//
|
|
// Buildings deliberately stay a plain vector rather than becoming EnTT entities
|
|
// (see docs/architecture.md). Separating this data from the systems that operate
|
|
// on it is not a step toward putting them in the entity model; it is the same
|
|
// 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 Simulation (and by ArenaSimulation in the balancing tool), not by the
|
|
// systems that operate on it. Every system that touches the factory —
|
|
// BuildingSystem, ConstructionSystem, DeconstructionSystem — takes it as an argument
|
|
// and holds none of it, so each is stateless over the world it works on. Reading it
|
|
// needs no system at all: the queries are free functions over this struct
|
|
// (FactoryQueries.h, PlacementRules.h, ProductionRules.h).
|
|
//
|
|
// What is not here yet is the data those systems still reach back into Simulation
|
|
// for through callbacks: the building-id counter and the global building block stock,
|
|
// both of which are factory data living outside the factory's state.
|
|
struct FactoryState
|
|
{
|
|
std::vector<Building> buildings;
|
|
std::deque<ConstructionSite> constructionQueue;
|
|
std::deque<DeconstructionEntry> deconstructionQueue;
|
|
|
|
// The authority on which building owns which tile; every placement and removal
|
|
// path claims and releases its body cells here.
|
|
BuildingGrid grid;
|
|
|
|
// Current buildable asteroid width, the left bound for placement. Grows as the
|
|
// player buys expansions (REQ-EXP-UNLOCK). Deliberately not checksummed: it is
|
|
// derived from config and Simulation's expansion count, which is folded already.
|
|
// Seeded from config by BuildingSystem's constructor.
|
|
int asteroidWidth_tiles = 0;
|
|
};
|
|
|
|
// A fresh factory for a new run: nothing built, and the asteroid bound seeded from
|
|
// config. Every owner of a FactoryState creates it this way — the bound has no
|
|
// sensible default without the config, so a default-constructed state would refuse
|
|
// every placement on the asteroid.
|
|
inline FactoryState makeFactoryState(const GameConfig& config)
|
|
{
|
|
FactoryState state;
|
|
state.asteroidWidth_tiles = config.world.regions.asteroidWidth_tiles;
|
|
return state;
|
|
}
|