v0.8.0.15 — the reference documents, and a card that advertised what it cannot do
The four hand-written references brought up to the game as it actually runs, ahead of the next testing round, plus a Quickstart to hand a tester who has never played. They had not been touched since v0.6.2 — a month and two minor versions — and each now says at the top which build it describes. ONE LIVE BUG CAME OUT OF THE PASS. mainlineDescription told players "Cars may be sorted into any new order here" on the Interchange. It is the printed capability and has never been implemented: nothing reads sortsCars to permit a sort, and its one live use is marking the card an Extra may be made up on, because it is the Mainline card with a yard. That sentence is not only documentation — view.ts renders it as a Mainline card's `what`, so it is what a player reads on the board, and the generated reference printed a "Sorts cars: yes" column beside it. A card advertising a button that does not exist sends a player hunting for it and then concluding the game is broken. What the documents had wrong, all of it verified against the code rather than read for tone: the victory model in the Rules book (firstToTarget / highestAfterDays and the target-bearing length presets stopped existing in 2026-08 — it is a free days count and a combined floor of 3 x players x days); "there is no lobby, no server, no multiplayer"; crossing time in mph rather than regions; Extras launched automatically eastbound; the Uncontrolled Siding listed as a passing card; industry track length taken from the box count; and a "Sister Trains" optional rule that never existed. The Home deck's counts table came out under TODO #15a — Jesse's own ruling that counts move with balance — and it had been wrong for a month, which is the argument made twice. The Home and Mainline deck references are restructured to explain how a deck is USED and to defer every per-card table to rules/as-built.md. Duplicating it by hand is precisely the drift #15a was raised about: as-built needed no correction beyond the Interchange, because build:cards regenerates it and a test fails when the checked-in file disagrees. Everything hand-maintained around it had drifted; it had not. docs/design.md, the index everything starts from, said v0.4.3, "what is not: the server", and 493 tests. It now also lists the player-facing references, which it never has, so the Quickstart is findable at all. 999 fast tests and 35 sim tests pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DmdqqCNoiqE7GBo6wthBnR
This commit is contained in:
co-authored by
Claude Opus 5
parent
a6657241de
commit
f308a2d94d
@@ -1,7 +1,15 @@
|
||||
# Station Master — Rules
|
||||
|
||||
**First-draft rules reference for v0.4.5**
|
||||
**Authority:** observed v0.4.5 code paths and tests. Where a card face, prototype document, and executable behavior differ, this document reports executable behavior and marks unimplemented material.
|
||||
**Describes the game as built at v0.8.0.15** (2026-09-20). Previously stamped "v0.4.5", the
|
||||
prototype rules edition this reference was first written against; the filename keeps that stamp
|
||||
because `src/`, `CHANGELOG.md` and `docs/rules/` all cite this file by name.
|
||||
|
||||
**Authority:** observed code paths and tests. Where a card face, a prototype document and executable
|
||||
behaviour differ, this document reports **executable behaviour** and marks unimplemented material.
|
||||
Per-card numbers are not repeated here — [`rules/as-built.md`](rules/as-built.md) is generated from
|
||||
`src/engine/content.ts` and is the table of record.
|
||||
|
||||
**New to the game? Start with the [Quickstart](StationMaster-Quickstart.md).**
|
||||
|
||||
## 1. Overview and background
|
||||
|
||||
@@ -19,11 +27,14 @@ This book is divided as follows:
|
||||
6. the implemented multiplayer/engine status; and
|
||||
7. FAQs and implementation limits.
|
||||
|
||||
The companion references are [Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md), [Home deck](StationMaster-Home-Deck-v0.4.5.md), and [components](StationMaster-Components-v0.4.5.md).
|
||||
The companion references are the [Quickstart](StationMaster-Quickstart.md) for a new player,
|
||||
[Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md), [Home deck](StationMaster-Home-Deck-v0.4.5.md),
|
||||
[components](StationMaster-Components-v0.4.5.md), and the generated per-card table
|
||||
[`rules/as-built.md`](rules/as-built.md).
|
||||
|
||||
## 2. Definitions
|
||||
|
||||
| Term | Meaning in v0.4.5 |
|
||||
| Term | Meaning |
|
||||
| --- | --- |
|
||||
| A/D track | An Office arrival/departure capacity. A Whistle Post has 1; Depot, Station, and Terminal have 2, 3, and 4. |
|
||||
| Card location | A square in an Office Area grid. A train may end a switching Move only on Operational Rail. |
|
||||
@@ -43,7 +54,7 @@ The companion references are [Mainline deck](StationMaster-Mainline-Deck-v0.4.5.
|
||||
| Operational Rail | A card on which a train may finish a Move. Turnouts are pass-through only; a locked industry is not usable at all. |
|
||||
| Running Track | The east–west track between an Office Area’s Limits, including its Office. |
|
||||
| Secondary Track | All local rail inside the Limits that is not Running Track. |
|
||||
| Stage | One of twelve turns in a Day. Its phases are Local Operations, New Train, Mainline, Load/Unload, and Shift Change. |
|
||||
| Stage | One of twelve turns in a Day. Its phases are Local Operations, New Train, Mainline, Load/Unload and Shift Change. **On screen the last two are labelled "Cargo" and "Supervisor Shift"** — same phases, the names the interface uses. |
|
||||
| Subdivision | Mainline between Division Points or Control Points. Clearance checks look through the whole next Subdivision. |
|
||||
| Superintendent | The player with the Fedora. The role decides same-direction clearances and rotates every three Stages. |
|
||||
| Timetabled train | A numbered train card scheduled to one of the 12 Stage slots, then due at that slot each Day. Odd numbers go west; even numbers go east. |
|
||||
@@ -52,11 +63,18 @@ The companion references are [Mainline deck](StationMaster-Mainline-Deck-v0.4.5.
|
||||
|
||||
### 3.1 Starting a new game in the shipped client
|
||||
|
||||
The v0.4.5 browser page creates a **one-player solitaire Standard game**. Select **New game**, then choose:
|
||||
The front page has three doors: **Play multiplayer**, **Play solitaire**, and **Browse replays**.
|
||||
|
||||
**Solitaire** runs entirely in your own browser and needs nothing from the server. Select **New
|
||||
game**, then choose:
|
||||
|
||||
1. a numeric seed, or leave it blank for a fresh browser-generated seed;
|
||||
2. a starting hand;
|
||||
3. passenger, freight, and train-transit Revenue rates.
|
||||
3. passenger, freight, and train-transit Revenue rates;
|
||||
4. the number of Days, and the optional rules.
|
||||
|
||||
**Multiplayer** goes to the lobby — see §3.5. It needs the server, because the game is authoritative
|
||||
there rather than in any one browser.
|
||||
|
||||
The browser writes those choices into the URL. A particular game is defined by the **seed plus these house rules**, not the seed alone.
|
||||
|
||||
@@ -87,7 +105,7 @@ In a multi-player engine game, every player receives two seeded D12 rolls:
|
||||
- The **division roll** orders seats from low west to high east; equal results put the lower player index farther east.
|
||||
- The **Superintendent roll** gives the initial Fedora to the first player tied for highest.
|
||||
|
||||
The opening deal starts at the Superintendent’s seat and proceeds left (eastward in the engine’s seat ordering).
|
||||
The opening deal starts at the Superintendent’s seat and proceeds **eastward** — increasing seat index, which is how the Division map draws the table.
|
||||
|
||||
### 3.3 Saving, resuming, and replaying solitaire
|
||||
|
||||
@@ -97,25 +115,61 @@ The browser also stores the current local game and resumes it automatically when
|
||||
|
||||
**Undo is solitaire-only.** It removes the final accepted intent and rebuilds the game from the earlier history. Random outcomes are not rerolled: replaying the same action consumes the same seeded result. Undo can therefore change the player’s decision after seeing an outcome, but cannot fish for a different timetable die roll.
|
||||
|
||||
### 3.4 Engine game modes and endings
|
||||
### 3.4 Game modes and endings
|
||||
|
||||
The engine defines Solitaire, Competitive, and Co-op modes. The browser exposes only Solitaire.
|
||||
Three modes: **Solitaire**, **Competitive** and **Co-op**. All three are playable.
|
||||
|
||||
| Length | Target | Days |
|
||||
| --- | ---: | ---: |
|
||||
| Short | 10 | 3 |
|
||||
| Standard | 20 | 5 |
|
||||
| Campaign | 45 | 10 |
|
||||
**Length is a free `days` count**, not a preset. The old `short`/`standard`/`campaign` presets
|
||||
carried a `target` and were dropped in 2026-08; they survive only as a convenience argument for the
|
||||
simulation tooling, resolving to 3, 5 and 10 Days. The default is 5.
|
||||
|
||||
With `firstToTarget`, competitive mode ends when any individual reaches the target; co-op uses target × player count and total Revenue. With `highestAfterDays`, competitive mode requires the table’s combined Revenue to reach `3 × players × days`; otherwise everyone loses. If that floor is met, the highest individual score wins. Solitaire and co-op win only if their score reaches their target at the end of the length.
|
||||
**How a game ends and who wins:**
|
||||
|
||||
Competitive mode also ends in a collective loss after three collisions in one Day.
|
||||
1. **The timetable runs out** at the end of the last Day. Then:
|
||||
2. **The combined Revenue floor** is checked first — `3 × players × days`. Fall short and
|
||||
**everybody loses**, whatever anyone individually scored.
|
||||
3. **Co-op** wins as a table if the floor is met.
|
||||
4. **Competitive** is won by the **highest individual Revenue** once the floor is met.
|
||||
5. **Collisions end it early.** Breaching the per-Day or total collision limit ends play at once in a
|
||||
collective loss — the railroad has been declared unsafe.
|
||||
|
||||
The configuration contains four optional-rule flags. Only two have engine effects: **Reduced Visibility** gives five rather than six switching Moves in Stages 1, 2, 3, 11, and 12; **Emergency Toolbox** initially sets the Red Flags hand-limit status, allowing four cards. Sister Trains and Employee Rotation are represented in configuration/state design but are not executed by v0.4.5.
|
||||
**Extended play (Gitea#11).** Both days-based endings — running out of timetable, and closing short
|
||||
of the Revenue floor — offer **another Day**, because they are the same event seen twice: the last
|
||||
Day ended, and this is what the books say. A collision ending is **not** extendable, and neither is a
|
||||
collision breach during an extended Day. The official result is frozen when the timetable first ran
|
||||
out, so a railroad declared unsafe on Day 9 does not retract who won on Day 5.
|
||||
|
||||
### 3.5 Multiplayer setup status
|
||||
**Three optional rules, all implemented:**
|
||||
|
||||
There is no multiplayer lobby, room creation flow, remote server, invitation flow, or network session in v0.4.5. The engine can be called with multiple player names (and rejects a Solitaire configuration with more than one), but the delivered page always calls it for one local player. See section 6.
|
||||
| Rule | Effect |
|
||||
| --- | --- |
|
||||
| Reduced Visibility | Five switching Moves instead of six, in Stages 1, 2, 3, 11 and 12 — the night Stages. |
|
||||
| Employee Rotation | Every player moves one chair at the end of each Day. Revenue and the Fedora travel with the player; the Office Areas stay with the seats. |
|
||||
| Emergency Toolbox | Starts every player holding the Red Flags status, so the hand limit opens at four. |
|
||||
|
||||
(There is no "Sister Trains" flag. It appeared in an earlier draft of this document and never in the
|
||||
configuration.)
|
||||
|
||||
### 3.5 Multiplayer setup
|
||||
|
||||
Multiplayer is delivered and is what this package is for. The flow:
|
||||
|
||||
1. **Create or join.** The host creates a game and gets a **game code**; everyone else joins with
|
||||
that code. Seats fill as people arrive, and any seat left empty can be **filled with a bot**.
|
||||
2. **Start.** Once the host starts, that same page is where every player plays their turns and
|
||||
watches the table. There is nothing else to open.
|
||||
3. **The server is authoritative.** The game lives on the server, not in a browser: it survives a
|
||||
page reload, a browser restart and a service update, replaying its intent history to get back to
|
||||
where it was.
|
||||
4. **Your seat is a token in YOUR browser**, scoped to the origin you joined at. A reload finds it
|
||||
and puts you straight back. Clearing site data, a private window, or a different browser does not:
|
||||
the seat is still yours and still on the server, but that browser can no longer prove it is you.
|
||||
An administrator can mint a **single-use recovery link** (StartOS action **Restore a Seat**) that
|
||||
trades a code for the token and expires in 30 minutes.
|
||||
5. **Watching the table.** Other players' turns arrive as an ordered replay rather than as a board
|
||||
that has silently rearranged itself, with a `[N behind]` counter, Pause and Skip.
|
||||
|
||||
Solitaire needs none of this and runs with the page alone.
|
||||
|
||||
## 4. Basic game mechanics
|
||||
|
||||
@@ -124,13 +178,16 @@ There is no multiplayer lobby, room creation flow, remote server, invitation flo
|
||||
Each of 12 Stages follows this sequence:
|
||||
|
||||
```text
|
||||
1. Local Operations — each player, starting with the Superintendent and proceeding left
|
||||
2. New Train — make up due timetabled trains, then queued second sections and Extras
|
||||
3. Mainline — automatic train movement in numeric order
|
||||
4. Load/Unload — each player, starting with the Superintendent and proceeding left
|
||||
5. Shift Change — expedited departures, clocks/workers, and possibly the Fedora
|
||||
1. Local Operations — each player, starting with the Superintendent and proceeding eastward
|
||||
2. New Train — make up due timetabled trains, then queued second sections and Extras
|
||||
3. Mainline — automatic train movement in numeric order
|
||||
4. Load/Unload — each player, same order. On screen: "Cargo"
|
||||
5. Shift Change — expedited departures, workers. On screen: "Supervisor Shift"
|
||||
```
|
||||
|
||||
**"Proceeding left" is seat order, west to east**, which is how the Division map draws it — the
|
||||
screen says "eastward" for that reason, because a table has no shared left.
|
||||
|
||||
At a Shift Change, Laborers and Porters reset. The Fedora moves after Stages 3, 6, 9, and 12. At Day end, dispatch-device use resets, collision count resets, the Day and Stage roll over, and victory is checked.
|
||||
|
||||
### 4.2 Local Operations: choose one option
|
||||
@@ -139,13 +196,19 @@ On a player’s Local Operations turn, choose exactly one available option.
|
||||
|
||||
**Switch.** Select any Crew Tray currently in that player’s Office Area. It gets six Moves, or five under Reduced Visibility on the listed night Stages. A Move travels any connected distance in one direction and must end on Operational Rail. Reversing is a separate Move. A train may pass through a turnout but cannot stop on it. It may not share or pass through another train except through an Office with a free A/D track.
|
||||
|
||||
Standing cars couple automatically when the train reaches them; it may not pass them, and the resulting consist may not exceed four cars. Coupling forward places cars ahead of the engine; coupling while backing places them behind it. Setting out cars does not spend a Move, but the cut must come from an outer end of the consist and may not be left on the Office. A Small Yard can reorder a consist for one Move. Flying Switch spends one Move to roll a tail cut into a connected Freight Facility.
|
||||
Standing cars couple automatically when the train reaches them; it may not pass them, and the resulting consist may not exceed four cars. Coupling forward places cars ahead of the engine; coupling while backing places them behind it. Setting out cars does not spend a Move, but the cut must come from an outer end of the consist and may not be left on the Office. A **Small Yard** re-orders a consist for one Move, and since v0.8.0.14 may also place cars **ahead
|
||||
of the engine** — which is how a cut is set up to be shoved into a facing industry. Each option on
|
||||
the menu shows the train it would build, laid out west to east as the board draws it, and says
|
||||
whether the result may leave the Office or would be held there. Flying Switch spends one Move to
|
||||
roll a tail cut into a connected Freight Facility.
|
||||
|
||||
**Draw.** Take one card from the face-down Home Office or the exposed top of one Department pile. During this option, play eligible cards and/or discard cards to Department piles, then finish at the hand limit. Track, facilities, offices, modifiers, enhancements, and train cards have the placement or scheduling rules in the deck references. Mainline modifiers are played from this option as well.
|
||||
|
||||
**Freight Agent.** Make one of these operations, then the turn ends: stock one green outbound box from a matching loaded Division Yard car; clear one red inbound box to the Classification Yard; unjam one outbound, inbound, or MEN | AT | WORK load to the Classification Yard; or explicitly end without acting. Freight can be stocked only when an unclaimed empty matching car is already spotted at that industry. Passengers may wait in a green Office box without a train present.
|
||||
|
||||
Implementation note: `card.discard` is accepted by the v0.4.5 engine during Local Operations without checking that Draw was chosen. This unusual implementation behavior is not a separate published turn option.
|
||||
Implementation note, still true at v0.8.0.15: `card.discard` is accepted during Local Operations
|
||||
without checking that the Draw option was chosen — unlike `card.play`, which does check. This is an
|
||||
implementation quirk rather than a fourth published turn option.
|
||||
|
||||
### 4.3 Track, switching, and local safety
|
||||
|
||||
@@ -159,18 +222,36 @@ Train-card restrictions also apply while switching. No-switching trains cannot m
|
||||
|
||||
At the Stage shown on the timetable, the engine makes up the matching timetabled train if a Crew Tray is free. It starts at the Division Point appropriate to its direction. A train may receive matching loaded or empty cars from the Division Yard until its listed maximum consist is reached or no suitable car remains. It is permitted to leave under-strength.
|
||||
|
||||
A Second Section order on the due train creates another identical timetabled train behind it when a free tray is available. A played Extra is made up after timetabled trains and Second Sections when a tray is free; v0.4.5 automatically sends every Extra east from the Western Division Point.
|
||||
A Second Section order on the due train creates another identical timetabled train behind it when a
|
||||
free tray is available. A played Extra is made up after timetabled trains and Second Sections when a
|
||||
tray is free, and **the player who played the card chooses where it starts** — either Division
|
||||
Point, the Interchange, or an Office, according to the `extraStart` house rule — and loads it as they
|
||||
choose rather than going round the table.
|
||||
|
||||
A timetabled train's consist is built by the table: **starting with the Superintendent and working
|
||||
eastward, each player adds ONE car**, going round again until the train is full or the Division Yard
|
||||
holds nothing it can take.
|
||||
|
||||
**When the yard can supply nothing, the game says so.** The round is skipped — there is no point
|
||||
asking for a car that cannot be given — and the train is reported as made up short, naming what its
|
||||
card wanted, how many such cars are waiting in the Classification Yard, and how far the Division Yard
|
||||
is from bare. See §4.6 for why that happens to coaches in particular.
|
||||
|
||||
### 4.5 Mainline movement and Office arrival
|
||||
|
||||
Mainline movement is automatic and processes lower train numbers first; a timetabled train outranks an Extra with the same number. A train at a Division Point, at an Office A/D track, or already crossing a Mainline card attempts its applicable movement.
|
||||
|
||||
Crossing time comes from the Mainline card and train speed. On a normal card, a train must check the entire next Subdivision before entering it:
|
||||
**Crossing time is the card's REGIONS**, one per Stage — not its printed mph, which is scenery, and
|
||||
not the train's Fast/Slow rating, which only **Hilly** reads. See the
|
||||
[Mainline deck](StationMaster-Mainline-Deck-v0.4.5.md) reference for what moves a train's entry
|
||||
point. On a normal card, a train must check the entire next Subdivision before entering it:
|
||||
|
||||
- an opposing train normally blocks entry;
|
||||
- a following same-direction train asks the Superintendent to allow or deny clearance;
|
||||
- Red Flags or ABS Signals hold the follower automatically; and
|
||||
- passing cards allow entry without this occupancy check.
|
||||
- **Double Track** — the one card two trains may stand on — allows entry without that check. The
|
||||
**Uncontrolled Siding** is not a passing card: a train arriving to find it occupied takes the
|
||||
siding a region behind, which costs it the extra Stage instead of a collision.
|
||||
|
||||
An Office arrival normally takes a free A/D track. If the Office is full, the inbound train collides and the local Office player loses 5 Revenue; Interlocking instead holds it at the Limits. A coachless inbound train may divert to a Yard Office. Cars fouling the Running Track at the Office also cause a collision.
|
||||
|
||||
@@ -185,7 +266,22 @@ Passenger work occurs during Load/Unload, at a Depot, Station, or Terminal. Each
|
||||
- **Board:** replace an empty coach on an eligible train at the Office with a loaded coach from a green outbound box. The removed empty coach goes to the Classification Yard. Earn configured passenger Revenue.
|
||||
- **Detrain:** replace a loaded coach on an eligible train with an empty coach from the Division Yard, placing the loaded coach into an available red inbound box. Earn configured passenger Revenue.
|
||||
|
||||
Crack Limited trains permit passenger work at Terminals only. Military Train and Director’s Private Car permit no passenger work. A Whistle Post has no Porters.
|
||||
Crack Limited trains permit passenger work at Terminals only. Military Train and Director's Private
|
||||
Car permit no passenger work. A Whistle Post has no Porters.
|
||||
|
||||
> **Coaches travel one way, and it is worth knowing before you plan around passengers.** Boarding
|
||||
> sends the emptied coach to the **Classification** Yard; detraining draws a fresh empty out of the
|
||||
> **Division** Yard; and §2.2 returns the Classification Yard only when the Division Yard runs
|
||||
> completely bare. Measured over one three-Day game: sixteen coaches in the Division Yard at setup,
|
||||
> **none from Day 2 Stage 8 onward**, fifteen piled in Classification while the Division Yard held
|
||||
> steady at 46–47 freight cars and stopped draining — so the refill never fired and no passenger
|
||||
> could board or detrain anywhere for the rest of the game, while trains whose cards call for coaches
|
||||
> were made up empty.
|
||||
>
|
||||
> **This is the rules working as printed and the ruling is that it stands** (Jesse, 2026-09-17, the
|
||||
> same ruling Gitea#2 got: running out is part of the game). What changed is that the game now says
|
||||
> it — the yard panel warns while the shortage lasts, and a train made up short reports why. Whether
|
||||
> the ratchet should be broken is open as TODO #108, to be decided on a second game's evidence.
|
||||
|
||||
### 4.7 Freight work
|
||||
|
||||
@@ -197,43 +293,77 @@ For an **inbound unload**, a matching loaded car must be spotted at an inbound-c
|
||||
|
||||
## 5. Solitaire
|
||||
|
||||
The implemented game is solitaire: one named player, one Office Area, local browser execution, Standard length, highest-after-days victory, and the default house rules unless changed in New Game. The game has no AI opponent. “Multiplayer” gameplay does not occur locally by simulating other players.
|
||||
Solitaire is one named player and one Office Area, running entirely in the browser with no server.
|
||||
It is **not** the only implemented game any more — see §6 — but it is the one that needs nothing but
|
||||
the page.
|
||||
|
||||
Solitaire-specific features are:
|
||||
|
||||
- a local browser save, automatic resume, and JSON download/load;
|
||||
- unlimited step-by-step Undo back through accepted action history; and
|
||||
- **unlimited step-by-step Undo** back through accepted action history — multiplayer has none,
|
||||
because a shared game cannot be rewound under the other players; and
|
||||
- a seed/rules URL suitable for sharing or reproducing a game.
|
||||
|
||||
Automatic phases get a visible beat in solitaire too, so the board plays its own moves out rather
|
||||
than jumping.
|
||||
|
||||
The active deck removes all 22 opponent-directed cards. Therefore, the defensive cards whose only purpose is to answer them (Facing Point Locks and Water Column) can be placed but have no opportunity to fire; Overpass has no effect at all. The game still includes shared-rail mechanics such as Mainline clearance, but with one player no other player can occupy the Division.
|
||||
|
||||
To win the default game, finish Day 5 with at least 20 Revenue. A result below 20 is a loss. Train-transit Revenue defaults to zero, so the default score must principally come from passenger and freight work.
|
||||
To win the default one-player game, finish Day 5 having met the combined Revenue floor —
|
||||
`3 × players × days`, which at one player over five Days is **15**. Below it is a loss, and the game
|
||||
offers you another Day rather than simply ending. Train-transit Revenue defaults to zero, so the
|
||||
score has to come principally from passenger and freight work.
|
||||
|
||||
## 6. Multiplayer
|
||||
|
||||
### 6.1 What the engine supports
|
||||
|
||||
The engine has player, seat, score, Office Area, Director/Division, phase-order, co-op, and competitive-mode data for multiple named players. It deals each player a hand, creates one Office Area per seat, starts acting order at the Superintendent and proceeds left, and models the following multiplayer-specific outcomes:
|
||||
The rules engine has always supported multiple named players; since v0.7 the lobby, server and
|
||||
client around it are delivered too, so this section now describes a game people actually play. The
|
||||
engine has player, seat, score, Office Area, Division, phase-order, co-op and competitive-mode data
|
||||
for multiple named players. It deals each player a hand, creates one Office Area per seat, starts acting order at the Superintendent and proceeds eastward, and models the following multiplayer-specific outcomes:
|
||||
|
||||
- the D12 seating and Superintendent rolls described in section 3;
|
||||
- individual Revenue in competitive play and shared total Revenue in co-op;
|
||||
- a competitive collective loss after three collisions in one Day;
|
||||
- a collective Revenue floor for competitive highest-after-days games; and
|
||||
- a collective loss on breaching the collision limits;
|
||||
- the combined Revenue floor, `3 × players × days`; and
|
||||
- train-transit Revenue awarded to every player, if that revenue setting is nonzero.
|
||||
|
||||
The engine’s setup checks only that there is at least one player and that Solitaire has exactly one player. It does not enforce a maximum player count, although the test and design material exercise two through four players.
|
||||
|
||||
### 6.2 What is not delivered in v0.4.5
|
||||
### 6.2 What IS delivered
|
||||
|
||||
There is no implemented multiplayer game setup for end users: no server, lobby, invitation, room code, player join flow, authoritative remote state, or remote Session. The browser page creates a local single-player session only. Accordingly, there is no supported procedure for resuming a multiplayer game, and no multiplayer Undo.
|
||||
Everything in §3.5: a lobby with game codes, seating, bots filling empty chairs, an authoritative
|
||||
server that survives restarts and updates by replaying its intent history, per-seat reconnection, an
|
||||
administrator's single-use seat-recovery link, and an ordered replay of other players' turns on each
|
||||
player's own screen.
|
||||
|
||||
The 12 space-use cards and 10 action cards are not dealt in competitive or co-op either. The engine rejects attempts to play either category. Thus, **no card can currently be played on another player**. This includes Derail, Broken Coupler, Railroad Crossing, score-penalty cards, Vandalism, Hotbox, Outlawed, and all table-space cards. Facing Point Locks and Water Column are implemented only as dormant defences for these unavailable effects.
|
||||
The package also exposes administrative **actions** on StartOS — list games in progress, get the
|
||||
join secret, manage a game, restore a seat — documented in the wrapper repository rather than here.
|
||||
|
||||
### 6.3 Difference from solitaire, if a multi-player engine session is created
|
||||
### 6.3 What is NOT delivered
|
||||
|
||||
Players have separate local districts, hands, and scores, but they share the Home Office deck, Department piles, yards, timetable, Mainline, and traffic consequences. Turn order is sequential; one current actor acts at a time. The Superintendent role is attached to a player while Offices are attached to fixed seats. Employee Rotation is not active, so players do not actually change seats in v0.4.5.
|
||||
**No card may be played at another player.** The 12 space-use and 10 action cards are excluded from
|
||||
every dealt deck in every mode, and `check` rejects playing one. That includes Derail, Broken
|
||||
Coupler, Railroad Crossing, the score-penalty cards, Vandalism, Hotbox, Outlawed and all
|
||||
table-space cards. Facing Point Locks and Water Column exist only as dormant defences against
|
||||
effects nothing can currently cause, and Overpass has no effect at all.
|
||||
|
||||
The deck is still 213 cards and still excludes opponent-directed content. Therefore multi-player engine mode changes shared traffic, scores, turns, and win/loss evaluation—not card attacks or a remote user experience.
|
||||
**No multiplayer Undo.** A shared game cannot be rewound under the other players.
|
||||
|
||||
### 6.4 How multiplayer differs from solitaire
|
||||
|
||||
Players have separate districts, hands and scores, and share the Home Office deck, the Department
|
||||
piles, the yards, the timetable, the Mainline and every traffic consequence. One player acts at a
|
||||
time.
|
||||
|
||||
**A seat is not a player**, and the distinction is load-bearing. Offices belong to seats; Revenue,
|
||||
hands, the Fedora and identity belong to players. With **Employee Rotation** on, players move one
|
||||
chair at the end of each Day and take their Revenue and the Fedora with them, while the districts
|
||||
stay where they are.
|
||||
|
||||
So multiplayer changes shared traffic, scores, turn order and how the game is won or lost — not card
|
||||
attacks, which do not exist in any mode.
|
||||
|
||||
## 7. Frequently asked questions
|
||||
|
||||
@@ -271,20 +401,42 @@ It may be on Secondary Track rather than the Office, or be badly made up: its en
|
||||
|
||||
### Why did an expedited train leave after passenger/freight work?
|
||||
|
||||
Expedite means it departs in the Stage it arrived, but v0.4.5 waits until Shift Change so it remains present for that Stage’s Load/Unload phase.
|
||||
Expedite means it departs in the Stage it arrived, but the departure waits until Shift Change so the
|
||||
train is still present for that Stage's Load/Unload phase.
|
||||
|
||||
### Can I choose the direction of an Extra or a Heavy Grade?
|
||||
|
||||
Not in v0.4.5. The engine launches Extras eastbound from the Western Division Point. Heavy Grade orientation is seeded automatically at setup.
|
||||
**An Extra, yes** — the player who played the card chooses where it starts and which way it runs, and
|
||||
loads it as they choose (v0.6.2). **A Heavy Grade, no**: orientation is rolled from the seed. That is
|
||||
a decision rather than a gap — the card sits between two districts and belongs to neither, so handing
|
||||
the choice to one neighbour would advantage them permanently. See the Mainline deck reference.
|
||||
|
||||
### Can I use an Interchange to reorder a train?
|
||||
|
||||
No. The card is catalogued with a sorting concept, but there is no implemented Interchange sorting action. Small Yard is the available local sorting mechanism.
|
||||
**No, and the card used to claim otherwise.** Its printed car-sorting has never been implemented; the
|
||||
description was corrected on 2026-09-20 to stop advertising it. What the Interchange actually offers
|
||||
is the one Mainline card with a yard, so an **Extra may be made up and started there**. Re-ordering a
|
||||
consist is done at a **Small Yard** in a district.
|
||||
|
||||
### Can I play attack cards on another player?
|
||||
|
||||
No. All action and space-use cards are excluded from every dealt deck in v0.4.5 and their play is rejected.
|
||||
No. All action and space-use cards are excluded from every dealt deck in every mode, and playing one
|
||||
is rejected.
|
||||
|
||||
### Is multiplayer playable?
|
||||
|
||||
No. Multi-player state and rules-engine support exist, but the lobby, server, remote client, and opponent-directed card mechanics are not implemented.
|
||||
**Yes.** Lobby, game codes, seating, bots, an authoritative server that survives restarts, per-seat
|
||||
reconnection and a replayed view of everyone else's turns are all delivered — see §3.5 and §6. The
|
||||
opponent-directed cards remain unimplemented in every mode, so there are still no card attacks.
|
||||
|
||||
### Why did my passenger train arrive with no coaches?
|
||||
|
||||
Almost certainly the coach ratchet in §4.6: every coach has ended up in the Classification Yard,
|
||||
which comes back only when the Division Yard runs completely bare. The yard panel warns when this
|
||||
has happened, and a train made up short says so in the log.
|
||||
|
||||
### Why is every option in the Small Yard marked "HELD at the Office"?
|
||||
|
||||
Because that train is **already made up**, so every re-order on offer would break it — most often by
|
||||
moving the caboose off the rear, which §8.2 will not let a train depart with. If the train is *not*
|
||||
currently fit to run, at least one option will be marked "MADE UP, ready to leave".
|
||||
|
||||
Reference in New Issue
Block a user