#pragma once #include #include #include #include "Blueprint.h" #include "BuildingId.h" #include "BuildingType.h" #include "ItemType.h" #include "ShipLayout.h" class Simulation; struct BuildingsConfig; // The user-configurable settings of a single building or construction site: the // selected recipe / ship schematic, the shipyard module layout, and (for // splitters) the two output filters. This is what blueprint capture records per // constituent building (REQ-UI-BLUEPRINT-STORAGE). struct BuildingConfig { BuildingType type = BuildingType::Miner; // Selected recipe (Miner / Assembler) or ship schematic id (Shipyard); unset // when nothing is selected. std::optional recipeId; // Shipyard module layout (REQ-MOD-LAYOUT). std::optional shipLayout; // Splitter output filters (empty = accept all). isSplitter distinguishes an // empty-filter splitter (a valid accept-all configuration) from a building // type that has no splitter filters at all. bool isSplitter = false; std::vector splitterFilterA; std::vector splitterFilterB; }; // Reads the current configuration of the building or construction site identified // by id, handling operational buildings and sites alike. Returns std::nullopt if // no such building or site exists. std::optional readBuildingConfig(const Simulation& sim, BuildingId id); // Captures a blueprint from a selection of building / construction-site ids, keeping // only player-placeable buildings and recording each one's type, rotation, offset // from the selection's bounding-box center, and configuration. Operational buildings // and construction sites are treated identically (REQ-UI-BLUEPRINT-CREATE, // REQ-UI-BLUEPRINT-STORAGE). The returned blueprint is unnamed. Blueprint captureBlueprintFromSelection(const Simulation& sim, const std::vector& selectedIds); // True if any selected id refers to a player-placeable building or construction site // (the condition under which Ctrl+C opens the blueprint save dialog, // REQ-UI-BLUEPRINT-CREATE). bool selectionHasPlaceableBuilding(const Simulation& sim, const std::vector& selectedIds); // One " x " entry of a blueprint card's contents line // (REQ-UI-BLUEPRINT-CARD). struct BlueprintContentEntry { std::string buildingName; int count; }; // Summarizes what a blueprint holds: one entry per building type it contains, ordered // by descending count with ties broken by the order the types appear in buildings.toml // (which is the order of the build button bar, REQ-UI-BUILD-BAR). Building types absent // from the config sort last. Derived display data for the blueprint card, kept here so // it is unit-testable rather than buried in the dialog (REQ-UI-BLUEPRINT-CARD). std::vector summarizeBlueprintContents( const Blueprint& blueprint, const BuildingsConfig& buildings); // Plain sum of the placement cost of every building in the blueprint // (REQ-UI-BLUEPRINT-CARD). Distinct from the total charged on placement // (REQ-UI-BLUEPRINT-PLACE), which additionally excludes locked building types and // rotate-in-place targets; see GameWorldView's placement path. int computeBlueprintCost(const Blueprint& blueprint, const BuildingsConfig& buildings);