0.7.1:0 — bundle Station Master v0.7.1

Four playtest fixes off the Gitea tracker. The submodule pin moves to v0.7.1 and the version follows
it; the downstream digit resets to :0, since v0.7.0 only ended on :3 because three test packs were
played before it was released.

- An empties-only train may couple a caboose again — a caboose carries the crew, not freight.
- The end of a Day is a modal carrying the standings, the Days left and the combined target, instead
  of passing between one click and the next inside the automatic phases.
- A Timetabled train may be discarded to a Department pile for a rival to pick up, governed by a new
  discardTimetabled setting that appears in both the New Game dialog and the lobby, on by default. An
  Extra never may.
- A blocked passenger platform now gives its reason, including the coach shortage and what ends it.

No new version file and no migration: current.ts's migrations.up is empty and nothing is carried from
0.7.0. GAMES IN PROGRESS SURVIVE THIS UPDATE — all three engine-visible changes only widen what is
legal, so every intent a 0.7.0 game recorded still replays, and the server resumes a save by replaying
it rather than by comparing version strings (src/server/index.ts in the game repo).

README.md and instructions.md both named 0.7.0 and carry the three user-visible changes now.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FLnYR4XtXQNamYJXGYT8oC
This commit is contained in:
Jesse
2026-08-25 10:58:14 -04:00
co-authored by Claude Opus 5
parent d26d44d9e2
commit ea8e9dbcb8
4 changed files with 75 additions and 33 deletions
+15 -5
View File
@@ -13,11 +13,21 @@ Station Master is a railroad operations board game with an authoritative multipl
solitaire needs no server and is not what this package is for. This package runs that server — solitaire needs no server and is not what this package is for. This package runs that server —
the browser client, the lobby, and the intent/SSE API — as a single StartOS service. the browser client, the lobby, and the intent/SSE API — as a single StartOS service.
**Bundled version: 0.7.0.** The lobby sets a game up from one of four game types (Solitaire, Co-op, **Bundled version: 0.7.1.** Four playtest fixes on top of 0.7.0. An empties-only train may couple a
Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before a seat is taken, caboose again (a caboose carries the crew, so it is never a load); the end of a Day is a modal
and lets a player leave a lobby or a running game and come back to it. Sound, the timetable flash, carrying the standings, the Days left and the combined target, because a Day turns over inside the
announcements and the just-drawn card badge reach a multiplayer client for the first time. None of automatic phases and used to pass unremarked; a Timetabled train may be discarded to a Department
that changes anything this package does: the submodule pin is the version, and the service is the pile for a rival to pick up, governed by a new `discardTimetabled` New Game setting that is on by
default, while an Extra never may; and a blocked passenger platform now reports its reason — the
coach shortage behind Gitea#2 is a ruled-in part of the game, and what was actually broken was the
silence. **Games in progress survive this update**: all three engine-visible changes only WIDEN what
is legal, so every intent a 0.7.0 game recorded still replays, and the server resumes a save by
replaying it rather than by comparing version strings.
0.7.0 remains the shape of the service: the lobby sets a game up from one of four game types
(Solitaire, Co-op, Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before
a seat is taken, and lets a player leave a lobby or a running game and come back to it. None of this
changes anything the package itself does: the submodule pin is the version, and the service is the
same server it always was. same server it always was.
--- ---
+12
View File
@@ -43,6 +43,18 @@ changing any of them marks the game **Custom**, which keeps the scoring of the t
from. The seed, the number of players and the number of Days sit above the type and do not make a 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. game Custom — the targets re-derive from them.
**What changed in 0.7.1.** Three things you will see at the table. The **end of a Day now stops and
says so** — a dialog with the standings, how many Days are left and the combined target, because a
Day used to turn over inside the phases that run themselves and pass between one click and the next.
A **Timetabled train may now be thrown away**: toss it face-up to a Department slot and a rival may
pick it up. That is a New Game setting (*A Timetabled train may be discarded*, on by default) — turn
it off and a train card can only ever be played onto the timetable. An **Extra is never discardable**
either way. And a **platform where nothing can be worked now tells you why** — no train for the
passengers waiting, a train whose card bars Porters, coaches already full, the same-district rule, or
the Division Yard being out of coaches, in which case it says how many are stranded in the
Classification Yard and what brings them back. Running out of coaches is part of the game, not a
fault; what was missing was the explanation.
**Leaving, and coming back.** Anyone may leave a lobby, and the host can clear a chair, so a **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 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 taken. A **Leave game** button appears once a game is running: it keeps your seat and the table
+47 -27
View File
@@ -3,41 +3,61 @@ import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk'
export const current = VersionInfo.of({ export const current = VersionInfo.of({
// `<upstream>:<downstream>` — the upstream half tracks the bundled Station Master tag exactly // `<upstream>:<downstream>` — the upstream half tracks the bundled Station Master tag exactly
// (`versions.md`'s consistency checklist), so bumping the submodule pin and bumping this are one // (`versions.md`'s consistency checklist), so bumping the submodule pin and bumping this are one
// action. The downstream half moves only for packaging-only changes. // action. The downstream half moves only for packaging-only changes, and RESETS to `:0` when the
version: '0.7.0:3', // upstream half moves — v0.7.0 ended on `:3` only because three test packs were played before it
// was released.
version: '0.7.1:0',
releaseNotes: { releaseNotes: {
en_US: en_US:
'Bundles Station Master v0.7.0. Setting a multiplayer game up is a different screen: pick a game ' + 'Bundles Station Master v0.7.1, four fixes from playtesting. A train restricted to empties can ' +
'type \u2014 Co-op, Competitive or Cutthroat \u2014 and every rule it sets is yours to change. Read a ' + 'couple its caboose again — a caboose carries the crew, not freight, so it was never a load. ' +
'game\u2019s whole rule set before taking a seat, leave a table or a running game and come back to ' + 'The end of a Day now stops and says so, with the standings and how long is left, instead of ' +
'it, and let the host clear a chair. Multiplayer games now have sound, say who else is at the ' + 'passing between one click and the next. A Timetabled train may be thrown away to a Department ' +
'table, and name the Superintendent.', 'slot for a rival to pick up, which is a New Game setting you can turn off; an Extra still ' +
'cannot. And a platform where nothing can be worked now says why, including when the coaches ' +
'have run out and what brings them back.',
es_ES: es_ES:
'Incluye Station Master v0.7.0. Crear una partida multijugador es otra pantalla: elige un tipo de ' + 'Incluye Station Master v0.7.1, cuatro correcciones surgidas de las partidas de prueba. Un tren ' +
'partida \u2014 Cooperativa, Competitiva o A muerte \u2014 y cambia cualquiera de sus reglas. Lee todas ' + 'limitado a vagones vacíos vuelve a poder enganchar su furgón de cola: lleva a la tripulación, ' +
'las reglas antes de sentarte, sal de una mesa o de una partida en curso y vuelve cuando quieras, ' + 'no carga, así que nunca fue una carga. El final de cada Día se detiene y lo anuncia, con la ' +
'y el anfitri\u00f3n puede liberar una silla. El multijugador ya tiene sonido, dice qui\u00e9n est\u00e1 en la ' + 'clasificación y lo que queda por jugar, en vez de pasar entre un clic y el siguiente. Un tren ' +
'mesa y se\u00f1ala al Superintendente.', 'con horario puede descartarse a una casilla de Departamento para que otro lo recoja — es una ' +
'opción de partida nueva que puedes desactivar —; un Extra sigue sin poder. Y un andén donde no ' +
'se puede trabajar ahora explica por qué, incluso cuando se han agotado los coches y qué los ' +
'devuelve.',
de_DE: de_DE:
'Enth\u00e4lt Station Master v0.7.0. Ein Mehrspielerspiel wird jetzt anders eingerichtet: W\u00e4hle einen ' + 'Enthält Station Master v0.7.1 mit vier Korrekturen aus dem Spieltest. Ein Zug, der nur Leerwagen ' +
'Spieltyp \u2014 Koop, Wettkampf oder Cutthroat \u2014 und \u00e4ndere jede seiner Regeln. Das ganze Regelwerk ' + 'aufnehmen darf, kann seinen Kabuse wieder ankuppeln — ein Kabuse trägt die Mannschaft, keine ' +
'ist vor dem Platznehmen lesbar, man kann einen Tisch oder ein laufendes Spiel verlassen und ' + 'Fracht, war also nie eine Ladung. Das Ende eines Tages hält jetzt an und sagt es, mit dem Stand ' +
'zur\u00fcckkehren, und der Gastgeber kann einen Platz r\u00e4umen. Mehrspielerpartien haben jetzt Ton, ' + 'und der verbleibenden Zeit, statt zwischen zwei Klicks zu verstreichen. Ein fahrplanmäßiger Zug ' +
'zeigen wer am Tisch ist und nennen den Superintendenten.', 'darf auf ein Abteilungsfeld abgeworfen werden, wo ein Mitspieler ihn aufnehmen kann — eine neue ' +
'Spieleinstellung, die sich abschalten lässt; ein Extrazug weiterhin nicht. Und ein Bahnsteig, an ' +
'dem nichts geht, nennt jetzt den Grund, auch wenn die Wagen ausgegangen sind und was sie ' +
'zurückbringt.',
pl_PL: pl_PL:
'Zawiera Station Master v0.7.0. Tworzenie gry wieloosobowej wygl\u0105da inaczej: wybierz typ gry \u2014 ' + 'Zawiera Station Master v0.7.1 z czterema poprawkami z testów. Pociąg ograniczony do pustych ' +
'Kooperacja, Rywalizacja lub Cutthroat \u2014 i zmie\u0144 dowoln\u0105 z jego zasad. Przeczytaj ca\u0142y zestaw ' + 'wagonów znowu może podpiąć swój służbowy — wiezie załogę, nie ładunek, więc nigdy ' +
'zasad przed zaj\u0119ciem miejsca, opu\u015b\u0107 st\u00f3\u0142 lub trwaj\u0105c\u0105 gr\u0119 i wr\u00f3\u0107 do niej, a gospodarz ' + 'ładunkiem nie był. Koniec Dnia zatrzymuje się i to ogłasza, z wynikami i tym, ile zostało, ' +
'mo\u017ce zwolni\u0107 krzes\u0142o. Gra wieloosobowa ma teraz d\u017awi\u0119k, pokazuje kto jest przy stole i ' + 'zamiast przemykać między jednym kliknięciem a drugim. Pociąg rozkładowy można odrzucić na ' +
'wskazuje Superintendenta.', 'pole Wydziału, skąd weźmie go rywal — to nowe ustawienie gry, które można wyłączyć; ' +
'Dodatkowy nadal nie. A peron, na którym nic się nie da zrobić, mówi teraz dlaczego — także ' +
'wtedy, gdy skończyły się wagony, i co je przywraca.',
fr_FR: fr_FR:
'Inclut Station Master v0.7.0. La cr\u00e9ation d\u2019une partie multijoueur a chang\u00e9 : choisissez un type ' + 'Inclut Station Master v0.7.1, quatre corrections issues des parties d’essai. Un train limité aux ' +
'de partie \u2014 Coop, Comp\u00e9titif ou Cutthroat \u2014 et modifiez chacune de ses r\u00e8gles. Lisez tout le ' + 'wagons vides peut de nouveau atteler son fourgon de queue : il transporte l’équipe, pas du fret, ' +
'r\u00e8glement avant de vous asseoir, quittez une table ou une partie en cours et revenez-y, et ' + 'il n’a donc jamais été un chargement. La fin d’une Journée s’arrête et l’annonce, avec le ' +
'l\u2019h\u00f4te peut lib\u00e9rer une chaise. Le multijoueur a maintenant du son, indique qui est \u00e0 la table ' + 'classement et ce qu’il reste à jouer, au lieu de passer entre deux clics. Un train à horaire ' +
'et nomme le Superintendent.', 'peut être jeté sur une case de Département où un rival peut le reprendre — un nouveau réglage ' +
'de partie, désactivable ; un Extra ne le peut toujours pas. Et un quai où rien ne peut être ' +
'fait en donne désormais la raison, y compris quand les voitures sont épuisées et ce qui les ' +
'ramène.',
}, },
migrations: { migrations: {
// NOTHING TO CARRY FROM 0.7.0. The three engine-visible changes all WIDEN what is legal — a
// caboose may now be coupled by an empties-only train, and a Timetabled train may now be
// discarded — so every intent a 0.7.0 game recorded is still accepted. The server resumes a
// saved game by REPLAYING it rather than by comparing version strings (`src/server/index.ts`),
// so games in progress survive this update rather than being set aside.
up: async ({ effects }) => {}, up: async ({ effects }) => {},
down: IMPOSSIBLE, down: IMPOSSIBLE,
}, },