move two placement queries out of the view into PlacementRules
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
|
||||
#include <QPoint>
|
||||
|
||||
#include "BeltDragPath.h"
|
||||
#include "BuildingId.h"
|
||||
#include "BuildingType.h"
|
||||
#include "FactoryState.h"
|
||||
@@ -36,3 +37,35 @@ std::optional<BuildingId> findRotateInPlaceTarget(const FactoryState& state,
|
||||
const GameConfig& config,
|
||||
BuildingType type, QPoint anchor,
|
||||
Rotation rot);
|
||||
|
||||
// True if placing here would actually do something: the terrain and bounds rules of
|
||||
// isPlacementValid hold, and the body cells are either all free or occupied only by
|
||||
// a building this placement would rotate in place. This is the question the ghost
|
||||
// asks to colour itself and the click path asks before enqueuing a command
|
||||
// (REQ-BLD-GHOST, REQ-BLD-PLACE-VALID, REQ-BLD-ROTATE-IN-PLACE).
|
||||
bool canPlaceBuilding(const FactoryState& state, const GameConfig& config,
|
||||
BuildingType type, QPoint anchor, Rotation rotation);
|
||||
|
||||
// What a belt drag would do to one tile of its path (REQ-BLD-BELT-DRAG).
|
||||
enum class BeltTileAction
|
||||
{
|
||||
PlaceNew, // empty, valid cell: a new belt, subject to affordability
|
||||
RotateInPlace, // already a belt (or belt site): re-oriented, free
|
||||
Invalid // occupied by something else, or invalid terrain
|
||||
};
|
||||
|
||||
struct BeltDragResolved
|
||||
{
|
||||
BeltTileAction action;
|
||||
bool affordable; // meaningful only for PlaceNew
|
||||
std::optional<BuildingId> rotateId; // set only for RotateInPlace
|
||||
};
|
||||
|
||||
// Classifies every tile of a belt drag path against the current factory state,
|
||||
// spending `buildingBlocksStock` cumulatively across the PlaceNew tiles so a path
|
||||
// longer than the player can afford is only partly buildable (REQ-BLD-BELT-DRAG).
|
||||
// Shared so the previewed ghosts and the placement on release cannot disagree.
|
||||
std::vector<BeltDragResolved> resolveBeltDragPath(const std::vector<BeltPathTile>& path,
|
||||
const FactoryState& state,
|
||||
const GameConfig& config,
|
||||
int buildingBlocksStock);
|
||||
|
||||
Reference in New Issue
Block a user