correct the belt subsystem interface description in architecture.md
This commit is contained in:
@@ -136,17 +136,43 @@ Belts and splitters are their own specialized subsystem. Belt items are **not**
|
|||||||
|
|
||||||
### Public Interface
|
### Public Interface
|
||||||
|
|
||||||
Narrow and representation-agnostic:
|
`BeltSystem.h` is authoritative. The surface is wider than the original design sketch — 15 public methods in five groups, not the 5-method port interface this section used to describe:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
class BeltSystem {
|
class BeltSystem {
|
||||||
public:
|
public:
|
||||||
bool tryPutItem(Port port, Item item);
|
// Placement — belts/splitters/tunnels are Buildings for cost and
|
||||||
|
// construction, so BuildingSystem registers and unregisters their tiles.
|
||||||
|
void placeBelt(QPoint tile, Rotation direction);
|
||||||
|
void placeTunnelEntry(QPoint tile, Rotation direction, int maxDistance);
|
||||||
|
void placeTunnelExit(QPoint tile, Rotation direction);
|
||||||
|
void placeSplitter(QPoint tile, Rotation outputA, Rotation outputB);
|
||||||
|
void removeTile(QPoint tile);
|
||||||
|
|
||||||
|
// Splitter filter configuration (REQ-BLD-SPLITTER). A splitter's filters
|
||||||
|
// live here, not on Building, so callers that re-register a tile must
|
||||||
|
// carry them across (see BuildingSystem::reregisterBeltTile).
|
||||||
|
void setSplitterFilters(QPoint tile, const std::vector<ItemType>& filterA,
|
||||||
|
const std::vector<ItemType>& filterB);
|
||||||
|
std::optional<SplitterInfo> getSplitterInfo(QPoint tile) const;
|
||||||
|
|
||||||
|
// Port interface (buildings <-> belts)
|
||||||
|
bool tryPutItem(QPoint tile, Item item, Rotation fromDir = Rotation::West);
|
||||||
std::optional<Item> tryTakeItem(Port port);
|
std::optional<Item> tryTakeItem(Port port);
|
||||||
|
std::optional<ItemType> peekItem(Port port) const;
|
||||||
|
double getProgressPerTick_tpt() const; // shared so building output items
|
||||||
|
// travel at belt speed (REQ-MAT-OUTPUT-EMERGE)
|
||||||
|
|
||||||
|
// Maintenance
|
||||||
void clearTiles(const std::vector<QPoint>& tiles); // REQ-UI-BELT-CLEAR
|
void clearTiles(const std::vector<QPoint>& tiles); // REQ-UI-BELT-CLEAR
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
|
// Rendering
|
||||||
void forEachVisualItem(QRect viewportTiles,
|
void forEachVisualItem(QRect viewportTiles,
|
||||||
std::function<void(VisualItem)> visit) const;
|
std::function<void(VisualItem)> visit) const;
|
||||||
|
|
||||||
|
// Determinism (docs/replay_design.md)
|
||||||
|
void appendChecksum(Hasher& hasher) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VisualItem {
|
struct VisualItem {
|
||||||
@@ -155,12 +181,12 @@ struct VisualItem {
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
Buildings interact with belts only through port-level push and pull. Rendering reads only through `forEachVisualItem`. No other system ever asks "what is on tile X".
|
Item *transport* is still reached only through push and pull: `tryPutItem` / `tryTakeItem` move items, `peekItem` reveals the leading item's type but never an identity, and rendering reads only through `forEachVisualItem`. The growth is in tile **topology** — placement, removal and splitter filters — which `BuildingSystem` drives because belts are `Building`s for cost, construction and deconstruction. That coupling is real and is not going away.
|
||||||
|
|
||||||
### Implementation Strategy
|
### Implementation Strategy
|
||||||
|
|
||||||
- v1: per-tile representation. Each belt tile stores up to 2 items with a progress value in `[0, 1]` along the tile's belt direction. Sufficient for the scale this game targets.
|
- v1: per-tile representation. Each belt tile stores up to 2 items with a progress value in `[0, 1]` along the tile's belt direction. Sufficient for the scale this game targets.
|
||||||
- v2 (optional, only if v1 profiles poorly): Factorio-style belt-segment compression. Because the public interface never exposes tile-level item identity, migration is internal to the subsystem.
|
- v2 (optional, only if v1 profiles poorly): Factorio-style belt-segment compression. The migration argument still holds for the item representation, since no method exposes tile-level item identity — but a v2 would have to keep the placement and splitter-filter methods working per tile, which is a stronger constraint than this section originally implied.
|
||||||
|
|
||||||
### Rendering Note
|
### Rendering Note
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user