A second-digit bump, deliberately. 0.8.1 had been reserved for the seatless display table; that work is getting more thought, and this table pass over v0.8.0.17 earned the number on its own. Six reports: one was a rules question, one a wording complaint with a real bug underneath, four straightforward. A CAR CLEARED FROM A RED INBOUND BOX CAME BACK STILL LOADED. Reported as wording — "technically accurate but doesn't make any sense" — and the wording was the visible half. `inboundCleared` pushed `pooled(e.stock)` under a comment reading "a car back in a yard is back in the common supply, carrying nothing", and `pooled` does not do that: it strips the load's origin stamp and keeps `loaded` ON PURPOSE, because a train can retire at a Division Point with freight aboard. So the comment described an intention the call never carried out, and every car the Freight Agent cleared reached the Classification Yard carrying a load already delivered and already paid for. It bites hardest on coaches: `passengersDetrained` takes `coach && !loaded` out of the Division Yard and §2.2 refills that yard from Classification, so a cleared coach came back as stock that could never unload another passenger. Measured over five three-Day solitaire games: 18 loaded coaches in Classification against 6 empty. The red box is where a journey ENDS; clearing it sends the passengers out of the station, or the delivered load into the industry, and returns the CAR, empty. The option says that now instead of describing the counter that moves. SCOPED TO THE RED BOX ON PURPOSE. `retireTrain` also returns loaded cars and is left alone: that is what `pooled`'s own documentation describes, and a loaded car in a yard is pre-loaded cargo rather than dead stock — it can be made up and delivered, and a loaded coach can still detrain. Only the red box's contents had already finished their journey. GAMES IN PROGRESS DO RESUME, MEASURED RATHER THAN ARGUED. Yard contents change, so the worry was real. All twelve saves on the test server were pulled and replayed through `tryResumeSession` — the server's own boot check — against this build. Six resume, six refuse, and the six refusals are the SAME six, at the same moves, with the same codes, that 0.8.0.17 already logged. Nothing new was stranded. That pre-install replay is a better check than reading the next boot log, because it answers before the install rather than after. THE HISTORY SAID "Mainline card 7" and left the reader to remember what card 7 was — with two Plains dealt, which is why the slot is kept beside the name rather than replaced by it. A second fault sat one word to its left and nobody reported it: the name was built as `e.key.replace(/([A-Z])/g, ' $1')`, so `absSignals` printed as "abs Signals" while the action list directly above said "ABS Signals". `narrate` takes `mainlineAt` and `enhancementName` beside the `facilityAt` it already had, and `simpleCardName` is exported so the log reads the same table the buttons do. `mainlineModified` had both faults and is fixed with it. LEAVING A RUNNING GAME WAS A DEAD END. `enterSeating` hides the choice section and only the lobby's own two leave paths put it back; leaving a running game is a third route, so the lobby came back holding nothing but "Games you are in" with both doors on the page at display:none and no control able to reveal them. Reset in `runLobby`, which is the one function every route onto that screen goes through — which is exactly why the two paths that did it themselves missed a third. THE LOBBY'S ACTION BUTTONS CARRY THE BOARD'S AMBER. A list of the actions rather than `#lobby button`: the settings form under Create is a field of inputs, and amber on all of it would say everything is a move and so say nothing. A disabled Start game drops back to chrome. THE DEPARTMENT REFILL IS A RULE AND IS NOW WRITTEN DOWN. §6.2 — "if any of the Department decks is empty, draw a Home Office card and place it in the empty spot" — firing only when the draw actually empties the pile. Kept as implemented (Jesse's ruling) and stated in rules.md and home-deck.md, neither of which had ever mentioned it. A rule implemented from the prototype and never written down is a rule that surprises the table. 1016 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
144 lines
7.6 KiB
Markdown
144 lines
7.6 KiB
Markdown
# Station Master — Mainline Deck
|
||
|
||
**Describes the game as built at v0.8.1.0** (2026-09-22). These references are kept current with
|
||
every release rather than versioned as editions, so there is no version in the filename: this file
|
||
is always the latest, and the build it describes is stated here.
|
||
|
||
**Scope:** the tarot-sized Mainline cards placed between Offices — how the deck is dealt, what a
|
||
card does to a train crossing it, and the Home Deck cards played onto one.
|
||
|
||
> **Per-card numbers live in [`rules/as-built.md`](rules/as-built.md)**, which is GENERATED from
|
||
> `src/engine/content.ts` and checked by `test/card-reference.test.ts`, so it cannot disagree with
|
||
> the game. This document explains how the deck is used; that one is the table of record. Where the
|
||
> two ever differ, as-built is right.
|
||
|
||
## How Mainline cards work
|
||
|
||
At setup the game lays one Mainline card between each neighbouring pair of Offices and one beyond
|
||
each end Office, between it and a Division Point — so a game with *N* players uses **N + 1** cards.
|
||
They are **dealt from a finite deck without replacement** (since v0.6.2), so no Division can hold
|
||
two of a card printed once. The two Division Points are the fixed ends of the Division and are not
|
||
in the deck: `buildDivision` lays them itself.
|
||
|
||
A card does not belong to either neighbouring Office. It is shared Division.
|
||
|
||
### Crossing time is REGIONS, not mph
|
||
|
||
A card is divided into **regions**, and a train advances **one region per Stage**. Crossing time is
|
||
therefore `regions − startRegion`, and nothing else. **The printed mph is scenery.**
|
||
|
||
This is the part most likely to be remembered wrong, because it used to work the other way: mph set
|
||
the cost and a Slow train added a Stage to *every* card. It does not. Four things move a train's
|
||
start region and nothing else does:
|
||
|
||
1. **The card's own back region.** The Uncontrolled Siding and the Interchange print a back region
|
||
that is not part of the road, so a train running through begins past it.
|
||
2. **A card that prints a Fast and a Slow start — and only Hilly does.** A fast train starts one
|
||
region along and crosses in 1 Stage; a slow one takes 2. **No other card reads a train's
|
||
Fast/Slow rating at all.**
|
||
3. **The permanent Heavy Grade modifiers**, each moving a train one region up the hill.
|
||
4. **Occupancy**: arriving to find the card occupied can put a train in the siding, a region behind.
|
||
|
||
No crossing ever takes less than one Stage.
|
||
|
||
### Traffic
|
||
|
||
Only **Double Track** lets two trains stand on one card, so a following train is not held behind a
|
||
slower one. Every other card holds one train at a time. The **Uncontrolled Siding** is not a passing
|
||
card: arriving to find a train already there puts you in the siding a region behind it — you do not
|
||
run into it, and it costs you the extra Stage instead.
|
||
|
||
Whether a following train may enter an occupied card at all is the Superintendent's ruling (§8.1,
|
||
Rules §4.5). Getting it wrong is what causes collisions.
|
||
|
||
## The deck
|
||
|
||
Ten drawable cards — Plains twice, the other eight once each — plus the two Division Point cards,
|
||
which are not drawn.
|
||
|
||
| Card | Copies |
|
||
| --- | ---: |
|
||
| Plains | 2 |
|
||
| Curves | 1 |
|
||
| Hilly | 1 |
|
||
| Heavy Grade | 1 |
|
||
| Double Track | 1 |
|
||
| Uncontrolled Siding | 1 |
|
||
| Tunnel | 1 |
|
||
| Trestle | 1 |
|
||
| Interchange | 1 |
|
||
| East / West Division Point | 1 each, not dealt |
|
||
|
||
The PDF art labels the Interchange "Yard". This reference uses **Interchange** throughout, to keep
|
||
it apart from the Division Yard, the Classification Yard, the Yard Office and the Small Yard — five
|
||
different things.
|
||
|
||
**Region counts and entry points per card are in [`rules/as-built.md`](rules/as-built.md).**
|
||
|
||
## The Interchange, and what it does NOT do
|
||
|
||
The Interchange prints a car-sorting capability. **It is not implemented, and never has been.** The
|
||
one thing the card's `sortsCars` flag actually gates is that an **Extra Train may be made up and
|
||
started here** — it is the Mainline card with a yard, which is why §7 allows it (v0.6.2). An Extra
|
||
starting here begins in the back region and takes the extra Stage.
|
||
|
||
Re-ordering a consist is done at a **Small Yard** in an Office Area, for one switching Move. See
|
||
Rules §4.3.
|
||
|
||
> **Corrected 2026-09-20.** Until this pass the card said "Cars may be sorted into any new order
|
||
> here" — on the board, in the tooltip a player reads, and in the generated reference. A card
|
||
> advertising an action the game will not offer sends a player hunting for a button that does not
|
||
> exist. The description now says what the card does.
|
||
|
||
## Heavy Grade modifiers
|
||
|
||
Home Office cards, played onto a Mainline card during a player's Draw option.
|
||
|
||
| Card | Placement and effect |
|
||
| --- | --- |
|
||
| Brakeman | Heavy Grade only. A **downhill** train starts one region further on. |
|
||
| Airbrakes | Heavy Grade only, and **Brakeman must already be on that card**. A downhill train starts one region further again. |
|
||
| Helpers | Heavy Grade only. An **uphill** train starts one region further on. |
|
||
| Realignment | Only onto an **unoccupied** Mainline card. Plains → Double Track, Curves → Plains, Uncontrolled Siding → Double Track, Trestle → Uncontrolled Siding. No other card may be realigned. |
|
||
|
||
A Heavy Grade is 3 regions, so it is 3 Stages to climb and 3 to run down before help. Modifiers
|
||
never reduce a crossing below one Stage.
|
||
|
||
### ABS Signals — an Enhancement, but it lives out here
|
||
|
||
**ABS Signals is dealt from the Home Office deck as an Enhancement, and it is the one Enhancement
|
||
that is not played into a district.** It goes onto a **Mainline card — any of them**, not only a
|
||
grade — and takes no square in anybody's Office Area.
|
||
|
||
What it does: trains on that card **will not rear-end each other**. A following train is held short
|
||
of the one ahead instead of running into it, so the Superintendent has no §8.1 judgment to make and
|
||
no collision is scored. It is the only thing besides a Red Flag that prevents a rear-end collision
|
||
out on the Mainline, and unlike a Red Flag it stays on the card for the rest of the game.
|
||
|
||
On the board a card carrying it draws a **signal mast with a lit lamp** at its top-right corner; the
|
||
three grade helpers draw as **BRK**, **AIR** and **HLP** beside the card's name. Realignment draws
|
||
nothing, because a realigned card simply becomes the card it was converted into.
|
||
|
||
## Heavy Grade orientation is settled, not missing
|
||
|
||
Heavy Grade orientation is **rolled from the seed**, not chosen by a player. **This is a decision,
|
||
not a gap.**
|
||
|
||
The card prints "(Up)" and "Player sets orientation", which assumes the card has an owner. This one
|
||
does not: the Division is laid `DP · Mainline · Office · Mainline · … · DP`, so a Heavy Grade always
|
||
sits **between two districts**, or beyond an end Division Point beside one — never inside a single
|
||
player's district.
|
||
|
||
Orientation is not cosmetic. Brakeman and Airbrakes help a train running **downhill**, Helpers helps
|
||
one running **uphill**, and odd-numbered trains run west while even run east. Turning the card
|
||
around decides which modifiers are worth anything and which direction of traffic is favoured, for
|
||
the whole game. Handing that to one of two neighbours advantages them over the other, and neither
|
||
has a fair claim to it.
|
||
|
||
**Re-opened and closed again on 2026-08-23**, when giving the choice to the Superintendent was
|
||
considered and rejected. Jesse's call: v0.5.0's ruling stands. Rolling from the seed is
|
||
deterministic, roughly even (51/49 east/west over 400 games), identical in solitaire and
|
||
multiplayer, and keeps setup non-interactive — the game has no setup phase, so the question would
|
||
have to interrupt play before the first Local Operations, in the minority of games that deal the
|
||
card at all (20% at one player, rising to 50% at four).
|