#pragma once #include #include #include #include #include "Building.h" #include "GameConfig.h" #include "RecipesConfig.h" // Production state of a building for the UI status light (REQ-UI-STATUS-LIGHT). // The simulation owns the classification so it stays in sync with the // production-cycle predicates (REQ-MAT-CYCLE); the UI maps each value to a fill // color. enum class ProductionStatus { Unconfigured, // no recipe/schematic selected (grey) Producing, // a production cycle is active (green) Starved, // idle: a required input is missing / Salvage Bay empty (red) Blocked, // idle: output buffer full, inputs otherwise present (yellow) }; // The rules deciding what a building can produce and whether it can start. // Pure functions of the config and the building itself — they read no factory // state, so they are free functions rather than BuildingSystem members. // Recipes this building could run: every recipe of its type for an auto-recipe // building (REQ-BLD-SMELTER, REQ-BLD-REPROCESSING), otherwise just its selected one. std::vector gatherCandidateRecipes(const GameConfig& config, const Building& b); // True when the building's input buffer holds every ingredient the recipe needs. bool recipeInputsAvailable(const Building& b, const RecipeDef& recipe); // Total materials a shipyard needs for its schematic plus its placed modules // (REQ-BLD-SHIPYARD), keyed by item id. std::map computeShipyardRequiredMaterials(const GameConfig& config, const Building& b); // True when a production cycle could start right now, ignoring output-buffer space. bool hasInputsToStart(const GameConfig& config, const Building& b); // Status light for a building, or nullopt for types that show none — belts, // splitters, tunnels, HQ and defence stations (REQ-UI-STATUS-LIGHT). std::optional getProductionStatus(const GameConfig& config, const Building& building);