All four reported from a table on Day 1 of v0.8.0.16, and all the same shape. ABS SIGNALS COULD ONLY BE PLAYED ON ONE MAINLINE CARD, while its tooltip said "any Mainline card". The engine was never wrong: check accepts any node whose kind is mainline and legalActions filters by check, so all of them were legal. The failure was the LABEL — describeIntent named i.placement and never i.node, so every placement described itself as plain "play ABS Signals", and the action list drops duplicate labels. All but the lowest-index node were discarded before the menu saw them. This is the THIRD time that trap has fired and the file documents the other two three lines apart: a turnout's two rotations, and three Department discards. Same fix — name what distinguishes them. The card is also called what the card face calls it. prettyKey rendered absSignals as "Abs Signals" beside a tooltip saying ABS, an acronym no key-splitter can recover, so the authored names now win. Three of those names were transcribed in sentence case and were CORRECTED rather than adopted: the repository says "Yard Office" 36 times against "Yard office" twice. A lookup that imports its own source's typos is the drift it exists to prevent. NOTHING ON A MAINLINE CARD SHOWED WHAT WAS STANDING ON IT. Played, ABS left no mark and you found out by hovering — the same complaint the Heavy Grade wedge answered, and it matters more here because ABS decides whether a second train on that card is safe. It draws a signal mast with a lit lamp now; a signal is the literal object and needs no room for words, which is what lets it sit clear of a name as long as "Uncontrolled Siding" on a 152px cell. The Mainline modifiers draw as BRK, AIR and HLP. Realignment is deliberately not among them: reduce takes the `became` branch and changes node.card, so a realigned Trestle IS an Uncontrolled Siding afterwards. Asserted, so the absence reads as a finding. A FREIGHT AGENT TURN SAID A CAR MOVED WHEN NONE HAD. Three faults behind one line. It asserted an outcome, where §6.3 requires no action and the bot declines deliberately — unjamming a healthy box destroys a load that cost a whole action to stock. An idle Agent was then silent, which read as a dropped turn; a new freightAgentIdled event says so and why, reducing to nothing exactly like switchingEnded. And the work named a coordinate rather than the industry, though a `place` helper has existed for precisely that since the switching lines moved to it. "Loaded a loaded boxcar INTO the green Outbound box at the Freight House", with the direction in capitals because to-or-from was the question asked. THE LOG AND THE ACTION MENU SPELLED THE SAME SQUARE DIFFERENTLY. view.ts wrote (col,row) — X,Y, east/west then north/south — with a comment saying why; narrate.ts wrote the internal storage order with no comment at all. So the menu offered a move to "(1,-1)" and the log reported it at "(-1,1)", side by side. Pinned by a test that renders one square through BOTH describers and compares them to each other: a test written against either file alone would have passed. THE DOCUMENTATION IS REACHABLE FROM A RUNNING GAME, AND ALL OF IT IS PUBLISHED. v0.8.0.16 published the Quickstart and nothing it points at — its §8 links five documents by relative path and every one 404'd on the package, verified against the running container. The build publishes the full set, and the test reads the links OUT OF the guide rather than listing them. They are linked from the This Game card, where reference already lives, rather than the header that must not wrap; no mode awareness is needed, because solitaire and multiplayer are the same page on the same origin. THE REFERENCES DROPPED THE VERSION FROM THEIR NAMES. Four described v0.8.0.16 and had since the v0.8.0.15 audit; the v0.4.5 was the prototype edition they were first written against, kept only because 36 citations pointed at it — and it read as documentation five minor versions stale. They are quickstart.md, rules.md, home-deck.md, mainline-deck.md and components.md now, kept current with each release rather than published as editions. Two errors surfaced while checking them against this release, which is the argument for doing it: home-deck.md filed ABS Signals under Enhancements "played into your district" that "change what a square does" — it does neither, this release's bug written down — and mainline-deck.md, which lists everything playable onto a Mainline card, never mentioned it at all. 1010 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
296 lines
14 KiB
Markdown
296 lines
14 KiB
Markdown
# Station Master — Card Reference
|
||
|
||
> **⚠ SUPERSEDED.** This described an invented 52-card placeholder. The real catalogue arrived on
|
||
> 2026-07-30 in `docs/Deck cards2.xlsx`, `Trains3.pdf` and `Mainline Cards.pdf`, and is transcribed
|
||
> in `src/engine/content.ts`. See [`implications.md`](implications.md) for the full comparison.
|
||
>
|
||
> **For what the cards say today, read [`as-built.md`](as-built.md)** — generated from
|
||
> `content.ts` and checked against it by the test suite, so it cannot fall behind the way this file
|
||
> did. For several releases `content.ts` named *this* page as the current reference while the banner
|
||
> here said otherwise, and a reader following the code landed on the v0.4.5 deck.
|
||
>
|
||
> Kept for the reasoning it records — the economy analysis in §7 was how we knew what questions to
|
||
> ask the design. **Do not use its numbers.**
|
||
|
||
The per-card catalogue: what is printed on every card. This is the specification the rules engine
|
||
instantiates from and that any print-and-play layout renders. It says *what each card says*, not how
|
||
it looks.
|
||
|
||
Derived from [`rules-v0.2.md`](rules-v0.2.md) §12 and the Gap 10 decisions in
|
||
[`open-questions.md`](open-questions.md#gap-10--card-face-specifications).
|
||
|
||
*All values provisional — calibration targets to retune after play.*
|
||
|
||
---
|
||
|
||
## 1. The Home Office deck — 52 cards
|
||
|
||
| Category | Cards | §12.1 |
|
||
| --- | ---: | --- |
|
||
| [Timetabled Trains](#3-train-cards) | 12 | one each, 1–12 |
|
||
| [Extra Trains](#3-train-cards) | 4 | X9–X12 |
|
||
| [Office upgrades](#4-office-cards) | 9 | Depot ×4, Station ×3, Terminal ×2 |
|
||
| [Freight Facilities](#2-freight-facility-cards) | 10 | 5 types × 2 |
|
||
| [Modifier Facilities](#5-modifier-cards) | 5 | one each |
|
||
| [Plain track](#6-track-cards) | 12 | turnout ×6, straight ×3, run-around ×3 |
|
||
| **Total** | **52** | |
|
||
|
||
---
|
||
|
||
## 2. Freight Facility cards
|
||
|
||
Ten cards, **five types in identical pairs**. Every freight facility card carries: a track with the
|
||
Operational Rail wheel icon, an industry track of the stated length, Laborer icons, the
|
||
`MEN | AT | WORK` three-box turn track, and its green Outbound and/or red Inbound boxes.
|
||
|
||
| Facility | Car type | Direction | Laborers | Outbound | Inbound | Industry track | Copies |
|
||
| --- | --- | --- | ---: | ---: | ---: | ---: | ---: |
|
||
| Mine Tipple | Hopper | Outbound only | 3 | 3 | — | 4 | 2 |
|
||
| Produce Shed | Reefer | Outbound only | 2 | 2 | — | 3 | 2 |
|
||
| Grocer's Warehouse | Boxcar or reefer | Inbound only | 1 | — | 1 | 3 | 3 |
|
||
| Oil Refinery | Tank car | Outbound only | 1 | 1 | — | 4 | 3 |
|
||
| Power Plant | Hopper or tank car | Inbound only | 3 | — | 3 | 4 | 2 |
|
||
| Freight House | Boxcar | Both | 1 | 1 | 1 | — | 6 |
|
||
|
||
Directions follow the commodity: coal originates at a Mine Tipple and is consumed at a Power Plant;
|
||
produce ships out; a warehouse receives. This gives §9 all three of its cases — outbound-only,
|
||
inbound-only, and both — with the **Freight House the one card that does both**.
|
||
|
||
**"Freight House" IS a card** (corrected v0.5.0) — a sixth industry, dealt 6 copies, one Laborer and
|
||
one slot each direction. An earlier pass here read §9.3/Appendix A's "Passenger Facilities and
|
||
Freight Houses permit cars to move each direction" as meaning "Freight House" was only ever a
|
||
*collective term* for the Grocer's Warehouse and the Oil Refinery, never a card of its own — that
|
||
reading was wrong; the engine deals it as a real sixth industry (`content.ts`'s `freightHouse`
|
||
profile) and this table follows the engine.
|
||
|
||
**The Grocer's Warehouse and the Oil Refinery are ONE-WAY** (corrected v0.4.9e). The Direction column
|
||
read "Both" for both of them, and that was the *other half* of the same mistaken reading: if "Freight
|
||
House" named those two, §9.3 had to be describing them, so they had to be two-way. Once the Freight
|
||
House is its own card the argument evaporates, and playtesting settled it — "Grocer's Warehouse
|
||
should be receive only, does not ship anything out"; "Refinery: only ships out tanks, does not
|
||
receive anything" (Jesse). `home-deck.md` prints both that way, and the modifier
|
||
set agrees: all three Refinery modifiers (Pipelines, Oil Depot, Viscosity Breakers) grant **+1
|
||
outbound**, which would be an odd card set for a facility that receives half the time.
|
||
<!-- TODO v0.5.0: Mine Tipple, Produce Shed and Power Plant above (3/3/4, 2/2/3, 3/3/4) were NOT
|
||
re-verified against the engine in this pass — only Grocer's Warehouse, Oil Refinery and Freight
|
||
House were. `mineTipple` and `powerPlant` in `content.ts` are also base 1/1/1, same as the three
|
||
corrected here, so these three rows and the "Throughput" reasoning below (built on the OLD
|
||
2–3-Laborer numbers) may be stale too. Flagged in TODO.md rather than silently rewritten — this
|
||
needs the same kind of decision Jesse made for Grocer's/Refinery/Freight House, not an assumption
|
||
that the same correction applies. -->
|
||
|
||
### Throughput — why these Laborer counts
|
||
|
||
A complete freight load takes **four Laborer-actions** (§9.3): Green → MEN → AT → WORK → onto the
|
||
car. Laborers are usable once each per Stage.
|
||
|
||
**`MEN | AT | WORK` is a pipeline, not a queue.** §9.1 allows one Load on each of its three boxes, so
|
||
up to three loads are in flight at once and each Laborer advances one of them per Stage. This is the
|
||
key to reading the numbers: **Laborer count is throughput, not latency.**
|
||
|
||
```
|
||
single load, 2 Laborers → completes in 2 Stages
|
||
single load, 3 Laborers → completes in 2 Stages (no faster!)
|
||
|
||
pipeline full, 3 Laborers → one load completes EVERY Stage
|
||
```
|
||
|
||
The extra Laborer buys nothing on one load and triples output on a full pipeline.
|
||
|
||
**And the pipeline can only be fed one load per Stage**, because stocking the green box costs a whole
|
||
Local Operations action (§6.3). So a 3-Laborer facility is exactly balanced against the feed rate —
|
||
it completes loads as fast as a player can possibly supply them. The 2-Laborer facilities are the
|
||
deliberately slower industries, unable to quite keep up with a dedicated player.
|
||
|
||
That is why Laborer counts track Outbound capacity: Mine Tipple 3/3, Power Plant 3/3, Produce Shed
|
||
2/2, Grocer's Warehouse 2/2. The numbers are derived from the action budget, not chosen freely.
|
||
|
||
<!-- The paragraph that stood here explained the Oil Refinery's third Laborer as the price of serving
|
||
two flows through one pipeline. It serves one flow (v0.4.9e), so the explanation is gone with the
|
||
premise; whether the Laborer count is still right is part of the same unverified block flagged
|
||
above and in TODO.md. -->
|
||
|
||
Even so, Laborers are rarely what limits a player — spotting the empty car and hauling the loaded one
|
||
away both cost switching actions from the same budget. See §7.
|
||
|
||
---
|
||
|
||
## 3. Train cards
|
||
|
||
Sixteen cards. Each carries its number, a direction from the card image, the consist specification,
|
||
and the required order: **engine at the front, revenue cars, caboose last where required**.
|
||
|
||
Odd numbers run westbound, even eastbound. Pairs are sister trains under the optional rule (Appendix
|
||
B). Seniority runs passenger-first — low numbers are the varnish, high numbers the drags and locals.
|
||
|
||
| Trains | Class | Consist | Direction |
|
||
| --- | --- | --- | --- |
|
||
| 1 / 2 | Limited | 4 coaches, no caboose | W / E |
|
||
| 3 / 4 | Mail-Express | 3 coaches, no caboose | W / E |
|
||
| 5 / 6 | Manifest Freight | 3 boxcars or reefers + caboose | W / E |
|
||
| 7 / 8 | Coal Drag | 3 hoppers + caboose | W / E |
|
||
| 9 / 10 | Oil Train | 3 tank cars + caboose | W / E |
|
||
| 11 / 12 | Way Freight | 3 cars of any type + caboose | W / E |
|
||
| X9, X10, X11, X12 | Extra | Any 3 cars + caboose, player's choice | Head-on — player chooses |
|
||
|
||
A Crew Tray holds at most **four** Rolling Stock and a caboose counts toward that four (§A.4), which
|
||
is why no caboose train carries more than three revenue cars.
|
||
|
||
Only trains 1–4 carry coaches, so passenger work at any Office depends on those four trains' visits.
|
||
|
||
---
|
||
|
||
## 4. Office cards
|
||
|
||
Nine upgrade cards in the deck (Depot ×4, Station ×3, Terminal ×2 — the pyramid Gap 3b requires).
|
||
Whistle Posts are a fixed supply outside the deck (§12.2).
|
||
|
||
| Office | Control Point | Passenger Facility | A/D tracks | Porters | Green slots | Red slots | In deck |
|
||
| --- | :---: | :---: | ---: | ---: | ---: | ---: | ---: |
|
||
| Whistle Post | no | no | 1 | — | — | — | supply |
|
||
| Depot | yes | yes | 2 | 1 | 2 | 2 | 4 |
|
||
| Station | yes | yes | 3 | 2 | 3 | 3 | 3 |
|
||
| Terminal | yes | yes | 4 | 3 | 4 | 4 | 2 |
|
||
|
||
**Slot capacity deliberately exceeds Porter count.** Only trains 1–4 carry coaches, so an Office needs
|
||
somewhere to bank boarding passengers between visits and room to absorb a whole trainload of
|
||
arrivals. Slot counts mirror the A/D track progression.
|
||
|
||
**All four tiers carry identical track geometry** (§11.3): a through track plus a plain junction stub
|
||
above and below. Upgrades are drop-in and must never disturb a connection.
|
||
|
||
---
|
||
|
||
## 5. Modifier cards
|
||
|
||
Five cards, one each. A Modifier is **not track**. It is placed adjacent to a Facility, on any of the
|
||
nine nearby spots — **diagonals included** — and if adjacent to two Facilities its effect may be used
|
||
on only one per Stage (§9).
|
||
|
||
Two placement rules follow from it not being track. It is **not bounded by the Limits**: a host
|
||
standing at the edge of the district keeps all nine of its spots, or the card would be unplayable
|
||
exactly where the district ends. And it may **never stand in the Running Track's row**, which inside
|
||
the Limits is always full anyway — beyond the sign that row is the ground the main grows onto, and a
|
||
Modifier parked there would block the Limits sign from moving outward (§2.1).
|
||
|
||
| Card | Effect | Applies to |
|
||
| --- | --- | --- |
|
||
| Team Track | +1 car on the industry track | Freight |
|
||
| Loading Dock | +1 green Outbound capacity | Freight |
|
||
| Storage Shed | +1 red Inbound capacity | Freight |
|
||
| Extra Platform | +1 green **and** +1 red slot | Passenger |
|
||
| Section Gang | +1 Laborer **or** +1 Porter | Either |
|
||
|
||
Capacity modifiers matter more than they sound: banking room, not worker count, is what limits
|
||
output. Section Gang is the only way to speed a facility up, and is deliberately the sole
|
||
worker-adding card.
|
||
|
||
---
|
||
|
||
## 6. Track cards
|
||
|
||
Twelve plain track cards. Every one carries the Operational Rail wheel icon **except turnouts**, which
|
||
a train may pass through but not stop on (§A.1).
|
||
|
||
| Geometry | Count | Notes |
|
||
| --- | ---: | --- |
|
||
| Turnout | 6 | Enter from A → B or C; enter from B or C → A only. Not Operational Rail. |
|
||
| Straight | 3 | Operational Rail |
|
||
| Run-around | 3 | Operational Rail. Required for the facing-point move of §A.5. |
|
||
|
||
Turnout-heavy because turnouts are how Secondary Track branches onward once the Office card's own
|
||
junction stubs are built out (§11.3).
|
||
|
||
---
|
||
|
||
## 7. Economy summary
|
||
|
||
**Local Operations actions are the main currency.** One per Stage, twelve per Day, and each is
|
||
exclusive — switch, *or* draw, *or* work the Freight Agent (§6).
|
||
|
||
| Revenue source | Local Ops cost |
|
||
| --- | --- |
|
||
| Freight load **out** | 1 to stock the green box, plus amortized switching |
|
||
| Freight **unload** | **none up front** — 1 later, only once the red box fills |
|
||
| Passenger boarding | 1 to stock a loaded coach |
|
||
| Passenger de-training | **none up front** — 1 later to clear the slot |
|
||
|
||
> **⚠ Corrected against simulation.** An earlier version of this section claimed every Revenue point
|
||
> costs about one action, giving a ceiling of 12/Day. **That is wrong**, and the error is
|
||
> instructive: the two *inbound* operations need no Local Ops action at all at the moment they
|
||
> score. A loaded car arrives on a train, per-Stage Laborers walk it off, and the point is earned
|
||
> using only free per-Stage resources. The action is spent later, and only when a box actually
|
||
> fills.
|
||
>
|
||
> That earlier correction was itself measured against a **scoring bug** — unloads were paying a full
|
||
> Revenue point after one Laborer action instead of four. With the pipeline corrected, simulation
|
||
> gives **~0.9 Revenue/player/Day and a 0% win rate** against these targets.
|
||
>
|
||
> **Treat the 5–6/Day figure as unfounded.** It was derived from the mistaken model above and has not
|
||
> been re-derived. The measured cost of one freight point is four Laborer actions plus a stocking
|
||
> action plus the switching to spot a car. See `open-questions.md` Gap 12.
|
||
|
||
### The development ramp
|
||
|
||
Players open with a Whistle Post — not a Passenger Facility — and no freight facilities at all. The
|
||
timetable also starts empty, so no trains run until someone draws and plays a train card.
|
||
|
||
```
|
||
Day 1 ~0 no facilities, no trains yet
|
||
Day 2 ~2 first facility placed, first train running
|
||
Day 3 ~5 developed
|
||
Day 4+ ~6 steady state
|
||
|
||
cumulative: 3 Days ≈ 7 5 Days ≈ 19 10 Days ≈ 49
|
||
```
|
||
|
||
The §3 victory targets (10 / 20 / 45) are set just under these cumulative figures, so a game is
|
||
winnable by a player running well and missed by one who is not. The Competitive collective floor of
|
||
`3 × players × Days` is about half of expected output and is comfortably met by a functioning
|
||
Division.
|
||
|
||
---
|
||
|
||
## 8. Fixed supplies (outside the deck)
|
||
|
||
| Component | Count |
|
||
| --- | --- |
|
||
| Mainline cards (tarot, 2 regions each) | N + 1 for N players |
|
||
| Division Point cards | 2 (East, West) |
|
||
| Whistle Post cards | N + spares |
|
||
| Limits cards | 2N + spares |
|
||
| Crew Trays and engines | player count + 3 |
|
||
| Number Boards | 12, numbered 1–12 |
|
||
| Red Flag cards | 1 per player *(optional rule only; removed from game when played)* |
|
||
| Fedora | 1 |
|
||
| Pocket Watch | 1 |
|
||
| D12 | 1 |
|
||
|
||
### Rolling Stock — 62 pieces
|
||
|
||
| Type | Loaded | Empty |
|
||
| --- | ---: | ---: |
|
||
| Coaches (blue) | 8 | 8 |
|
||
| Boxcars (brown) | 6 | 6 |
|
||
| Hoppers (brown) | 6 | 6 |
|
||
| Reefers (brown) | 4 | 4 |
|
||
| Tank cars (brown) | 4 | 4 |
|
||
| Cabooses (red) | 6 | — |
|
||
| **Total** | | **62** |
|
||
|
||
**Supply check against facility demand.** Worst case is every copy of every facility in play at once
|
||
with all boxes full:
|
||
|
||
| Car | Facility demand | Supply | Headroom |
|
||
| --- | ---: | ---: | --- |
|
||
| Hopper | Mine Tipple 3×2 + Power Plant 3×2 = 12 | 12 | exactly met |
|
||
| Tank | Oil Refinery 2×2 = 4 | 8 | 4 spare (was "exactly met" while the Refinery was two-way) |
|
||
| Boxcar | Grocer's 2×2 = 4 | 12 | 8 spare (same correction) |
|
||
| Reefer | Produce Shed 2×2 = 4 | 8 | 4 spare |
|
||
| Coach | Terminal 4+4, per Office | 16 | scales with Office count |
|
||
|
||
Hoppers are exactly met in the theoretical worst case, which cannot occur in practice —
|
||
only 10 freight facility cards exist across a 52-card deck shared by all players, and the §2.2
|
||
Classification Yard recycle returns stock to the Division Yard whenever it empties. Both are worth
|
||
watching in playtesting.
|