v0.8.0.15 wrote a Quickstart for a tester who has never played and then left it in docs/, where a tester does not look — reachable only by somebody who already has the repository. Nobody handed the box had it. build-web.ts now copies it to dist/quickstart.md and the splash page offers it under the three doors, as a line rather than a fourth door: reading the guide is not a way to play, and giving it equal weight in that grid would say it is. COPIED, NEVER RE-WRITTEN. The Markdown document stays the one copy. A hand-written HTML twin drifts from it on the first edit, which is the failure #15a was raised about and precisely what the v0.8.0.15 pass spent itself undoing. It is served as PLAIN TEXT, which is honest rather than good — tables render as pipes and the links do not click. Rendering it into a styled page wants a small Markdown converter and is filed as TODO #109; build-web.ts's comment names that number rather than gesturing at "the next step", so the file and the worklist cannot drift the way the references just did. Two things had to be true and tsc checks neither, so both are tests. The href on the splash page and the filename the build writes are two strings with nothing connecting them: rename the document and the build quietly publishes nothing while the page keeps offering a link that 404s. And a .md file must not arrive as a download — the server's MIME fallback is application/octet-stream, which a browser saves instead of displaying, so the link would have handed a tester a file to save rather than a page to read. '.md' is in http.ts's table now, and the test reads that table out of the source rather than asserting on a copy of it, which would pass while the real one was wrong. VERIFIED AGAINST A RUNNING SERVER, not only compiled: 200, text/plain; charset=utf-8, the guide's own first lines, and the splash link resolving. THE sortsCars COMMENT. Asked after v0.8.0.15 whether everything now agreed, and the audit turned up one place that did not — the field's own doc comment named the card's printed text as though it were the flag's meaning. Nothing reads it to permit a sort; its two readers, resolveExtraStart in apply.ts and the enumeration in legal.ts, both ask whether this is the one Mainline card with a Yard Limit and therefore the one an Extra may be made up and started on. Comment only, and worth the bump because of where it is: it is what a developer reads before using the flag, and it is the likeliest source of the sentence v0.8.0.15 had to correct off the board. The name is kept for its link to the card face and the comment now says outright that the name is not the meaning. The five references and docs/design.md read v0.8.0.16. They describe this build because the audit re-checked them against it, not because the number was swept forward — a stamp bumped without a reading is worth less than none. 1001 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUizFYCMHRWhbWwXhp7WPR
129 lines
6.6 KiB
Markdown
129 lines
6.6 KiB
Markdown
# Station Master — Mainline Deck
|
||
|
||
**Describes the game as built at v0.8.0.16** (2026-09-20). Previously stamped "v0.4.5", the
|
||
prototype rules edition these references were first written against; the filename keeps that stamp
|
||
because `src/`, `CHANGELOG.md` and `docs/rules/` all cite this file by name.
|
||
|
||
**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.
|
||
|
||
## 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).
|