Files
station-master-startos/instructions.md
T
JesseandClaude Opus 5 74aea24d74 0.7.3:0 — bundle Station Master v0.7.3
Submodule pinned to v0.7.3 (45580d8), `current.ts` at `0.7.3:0`, release notes
rewritten in all five locales, README.md and instructions.md updated. No new
version file and no migration: the outgoing 0.7.2:0's `up` is empty, which is
`versions.md`'s common case, so `current.ts` bumps in place and `index.ts` is
untouched.

Two features, both about the end of a game. A game no longer stops dead when the
timetable runs out — it enters a fourth state, `awaitingExtension`, and asks the
table whether to play one more Day, unanimously in multiplayer with one refusal
decisive. The official result is frozen at the original `config.days` and never
rewritten, so playing on is explicitly an exhibition, and a §3.4 collision breach
is neither extendable nor able to overwrite a recorded result. And the end of a
game renders a full results screen in place of the raw `outcome.reason` enum the
page used to print.

GAMES IN PROGRESS SURVIVE THIS ONE, which is the opposite of the last release and
is why the notes lead with it in every locale. No card data changed and the engine
changes are additive, so every intent in a 0.7.2 save is still legal: the save
replays intact and the game simply pauses on the new question at the end. Upstream
proves it rather than asserting it — the suite replays the three recorded games in
`public/replays`, all made under an older ruleset, and asserts every intent still
applies. Anyone updating from 0.7.1 or earlier is still in the old boat, and both
docs say so.

README.md gains a short diagnosing note, since `awaitingExtension` is a state an
administrator can meet and misread: such a game is persisted and listed as
`active`, resumes on restart like any live game, and shows nobody to wait for —
because a vote is not a turn.

Verified: `npm run check` clean, prettier clean, `make x86` packs as v0.7.3:0.
NOT verified: not installed on a box and not played. Extended play has never been
exercised against a running service — upstream `TODO.md` #35.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAgJSmeV8zrMh55Mj85ESb
2026-08-29 05:07:03 -04:00

125 lines
7.8 KiB
Markdown

# Station Master
## Documentation
- [Rules and design docs](https://draco.local:53871/Jesse.Markowitz/station-master/src/branch/main/docs)
— the rulebook implications, the multiplayer design, and the game's architecture.
## What you get on StartOS
This service runs the multiplayer server: a lobby, and a table for 2 to 4 players to play a
competitive or cooperative game together from their own browsers. Everything a player needs — the
game itself, the lobby, and the connection back to this server — is served from the single web
interface below; there is nothing else to install or configure on a player's side.
## Getting set up
1. Run the **Get Join Secret** action from this service's Actions menu, and copy the value it
returns.
2. Share that secret, and this service's address, with everyone you want to play with. Anyone
holding the secret can create a new game or join one that hasn't started yet.
3. Open this service's **Multiplayer Table** interface. You'll land on the front page, which
offers three ways in: solitaire, the replay viewer, and multiplayer.
4. Click **Play multiplayer**, then **Create Game** (or **Join Game** with a game code someone
else created), and enter the join secret when asked.
## Using Station Master
### Multiplayer Table
The front page offers solitaire, the replay viewer, and multiplayer. **Play multiplayer** takes you
to the lobby: create or join a game, seat players (including filling empty seats with a bot), and
start. Once a game is underway, this same interface is where every player plays their turns and
watches the table — there is nothing else to open.
Solitaire runs entirely in your own browser and needs nothing from the server, so it works here
exactly as it does on the public Station Master site.
**Setting a game up (new in 0.7.0).** The lobby opens on **Join a game**: type the code you were
given and you will see the whole rule set — the opening hand, what the work pays, every way the game
can end — *before* you take a seat. Creating a game instead starts from a **game type**: Co-op,
Competitive or Cutthroat. A type just fills in the rules; every one of them is yours to change, and
changing any of them marks the game **Custom**, which keeps the scoring of the type you started
from. The seed, the number of players and the number of Days sit above the type and do not make a
game Custom — the targets re-derive from them.
**What changed in 0.7.3.** **Your games in progress survive this one** — unlike the last update,
nothing about the deck or the way a game is saved has changed, so a game saved under 0.7.2 picks up
where it left off.
**The game asks before it ends.** When the last Day on the timetable runs out, you are no longer
simply told the game is over: you are asked whether to play one more Day. Say yes and you get one
Day — not two, not the rest of the evening — and at the end of it you are asked again. In a
multiplayer game **everybody has to agree**, and one "no" ends it there and then, so nobody is kept
playing a game they have finished with.
**Playing on cannot change who won.** The result is decided at the length you dealt the game for. If
you set up five Days and carry on to eight, the winner is still whoever was ahead at the end of Day
5, and the results screen says so — everything after that is recorded as what it is, an exhibition.
One exception: a game that ends because of **too many collisions** is over for good and is not
offered another Day, whether that happens on a scheduled Day or an extra one. A railroad that has
been declared unsafe does not carry on regardless.
**The end of a game now tells you what happened.** In place of one line and a number there is a full
results screen: why the game ended, in plain English rather than a code; who won and by how much;
every player's Revenue side by side; the rules the game was actually dealt under, including the pay
rates and any optional rules; who did what; and what the railroad managed — trains that ran the
length of the Division and how many of them did any switching on the way, loads made up and broken,
passengers boarded and set down, cars coupled and set out, and any trains lost to a collision along
with the cars that went with them. It comes up by itself when the game ends and there is a button to
open it again, so playing on never costs you the results.
**What changed in 0.7.2.** Before you read on: that update was the one where **a game already in
progress did not carry over**, because the card deck changed size. If you are updating from 0.7.1 or
earlier, that still applies to you.
At the table, three things looked different. **Crossing a Mainline card is quicker, and counted
differently**: the speed sign printed on the card was always just scenery, and what decides the time
is the number of regions drawn on it — Plains and Double Track one, Curves and Tunnel two, Heavy
Grade three unless you have Helpers or Brakeman on it. A train's **Fast/Slow rating only matters on
the Hilly card** now, instead of adding a Stage to every card, so slow trains in particular get
across the Division far quicker than they used to. **The deck is smaller and holds less track**,
matching the published card counts, so building a district is a slower business and the cards you
draw are worth more. And **the Division map is one row you read left to right**, west on the left and
east on the right, instead of wrapping around the screen — it no longer shows the inside of anyone's
district, which is what your own Office map is for, but every train in a district still appears on
it, with the ones holding an arrival track drawn on the rail and any crew switching drawn below it.
**Leaving, and coming back.** Anyone may leave a lobby, and the host can clear a chair, so a
mis-join or somebody who wanders off no longer blocks a table that cannot start until every seat is
taken. A **Leave game** button appears once a game is running: it keeps your seat and the table
waits for you, and the lobby lists every game this browser is in so you can rejoin it — or join a
different one without losing the first. **Forget** on that list is the one thing that cannot be
undone: the token kept in your browser is the only proof of who you are, so a forgotten game cannot
be rejoined from that browser.
### Get Join Secret
Run this whenever you need the current join secret again, or want to shut out anyone still
holding an old one. Every run replaces the secret and immediately puts the new one into effect —
players already seated in a game are unaffected, but the old secret stops working for creating or
joining games from that point on.
### Games in Progress
Shows every game on the server: who is playing, which Day and Stage they have reached, and whose
turn it is. It changes nothing, so run it whenever you are curious. It is also how you spot a game
nobody is coming back to — one whose last move was days ago, still waiting on a particular player.
### Manage Game
Pick a game, then either save a copy of it or end it.
**Export** hands you the whole game as text and leaves it running. Save that text as a `.json`
file and you can open it in the replay viewer later to watch the game back.
**End the game** deletes it and disconnects anyone still watching. This is the only way to clear
a game that will never be finished — otherwise it sits there, and comes back every time the
service restarts. It cannot be undone, so the game's save is handed back to you when it happens:
that text is the only copy left, so keep it if the game was worth watching.
> **Games in progress normally survive an update of this service.** When the update changes the
> rules of the game itself, a half-played game cannot be resumed under rules it was not played by,
> and that game is set aside rather than continued — you would see it disappear from the lobby.
> Nothing is ever deleted, so going back to the previous version makes it playable again.