0.7.2:0 — bundle Station Master v0.7.2

Two engine bugs and two rules corrections, plus the Division map redrawn. The submodule pin moves to
v0.7.2 and the version follows it; the downstream digit resets to :0.

- Backing into a cut through a curve's 45° leg no longer couples it back to front, and a crew pulling
  out through one takes its own cut with it instead of leaving it standing.
- The card deck is the published counts exactly, which halves the track and drops two long-standing
  density multipliers — 206 cards to 121.
- Crossing a Mainline card counts the regions printed on it rather than the printed speed, which was
  only ever scenery. Most trains cross faster, slow trains much faster, and Fast/Slow now matters on
  the Hilly card alone.
- The Division map is one row read left to right, so east is always to the right.

GAMES IN PROGRESS DO NOT SURVIVE THIS UPDATE, and this is the first release of which that is true. A
save is a seed plus the moves played, and the deck changing size means a card id recorded under 0.7.1
refers to a different card or to none — so a save stops replaying at its first card.play. There is no
migration because there is no data to move: those moves were made against a deck that no longer
exists, and re-dealing would invent a game nobody played.

It fails safe. The server refuses to resume a save the rules reject, logs which move it stopped at,
and leaves the file untouched, so an operator can put 0.7.1 back on to finish a game that matters.
The release notes lead with this, in all five locales.

Packed and verified as v0.7.2:0 on x86_64.
This commit is contained in:
Jesse
2026-08-26 15:32:26 -04:00
parent ea8e9dbcb8
commit 1bfea8d49f
4 changed files with 113 additions and 66 deletions
+18 -10
View File
@@ -13,16 +13,24 @@ 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.1.** Four playtest fixes on top of 0.7.0. An empties-only train may couple a **Bundled version: 0.7.2.** Two engine bugs and two rules corrections on top of 0.7.1. Backing into
caboose again (a caboose carries the crew, so it is never a load); the end of a Day is a modal a cut through a curve's 45° leg no longer couples it back to front, and a crew pulling out through
carrying the standings, the Days left and the combined target, because a Day turns over inside the one takes its own cut with it instead of driving away and leaving it standing (Gitea#17). The card
automatic phases and used to pass unremarked; a Timetabled train may be discarded to a Department deck is the published counts exactly — which halves the track and removes two long-standing density
pile for a rival to pick up, governed by a new `discardTimetabled` New Game setting that is on by multipliers, taking the deck from 206 cards to 121 (Gitea#14). Crossing a Mainline card counts the
default, while an Extra never may; and a blocked passenger platform now reports its reason — the regions printed on it rather than the printed speed, which was only ever scenery: most trains cross
coach shortage behind Gitea#2 is a ruled-in part of the game, and what was actually broken was the faster, slow trains much faster, and a train's Fast/Slow rating now matters on the Hilly card alone
silence. **Games in progress survive this update**: all three engine-visible changes only WIDEN what (Gitea#3). And the Division map is drawn as a single row read left to right, so east is always to the
is legal, so every intent a 0.7.0 game recorded still replays, and the server resumes a save by right (Gitea#18).
replaying it rather than by comparing version strings.
**GAMES IN PROGRESS DO NOT SURVIVE THIS UPDATE**, and this is the first release of which that is
true. A saved game is a seed plus the moves played, replayed on startup — and the deck changing size
means a card id recorded under 0.7.1 refers to a different card, or to none, so a save stops
replaying at its first `card.play`. It fails safe rather than silently: `src/server/index.ts` refuses
to resume a save the rules reject, logs which move it stopped at and why, and **leaves the file
untouched**, so an operator who wants a particular game back can put 0.7.1 on and finish it. There is
no migration, because there is no data to move — the moves were made against a deck that no longer
exists, and re-dealing would invent a game nobody played.
0.7.0 remains the shape of the service: the lobby sets a game up from one of four game types 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 (Solitaire, Co-op, Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before
+17 -11
View File
@@ -43,17 +43,23 @@ 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 **What changed in 0.7.2.** First, the thing to know before you update: **a game already in progress
says so** — a dialog with the standings, how many Days are left and the combined target, because a will not carry over.** The card deck has changed size, so a game saved under 0.7.1 can no longer be
Day used to turn over inside the phases that run themselves and pass between one click and the next. replayed, and the server declines to resume one rather than breaking it — it says which move it
A **Timetabled train may now be thrown away**: toss it face-up to a Department slot and a rival may stopped at and leaves the save file alone. If you are mid-game and want to finish it, do that before
pick it up. That is a New Game setting (*A Timetabled train may be discarded*, on by default) — turn updating, or put 0.7.1 back on afterwards.
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 At the table, three things look different. **Crossing a Mainline card is quicker, and counted
passengers waiting, a train whose card bars Porters, coaches already full, the same-district rule, or differently**: the speed sign printed on the card was always just scenery, and what decides the time
the Division Yard being out of coaches, in which case it says how many are stranded in the is the number of regions drawn on it — Plains and Double Track one, Curves and Tunnel two, Heavy
Classification Yard and what brings them back. Running out of coaches is part of the game, not a Grade three unless you have Helpers or Brakeman on it. A train's **Fast/Slow rating only matters on
fault; what was missing was the explanation. 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 **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
+77 -44
View File
@@ -6,58 +6,91 @@ export const current = VersionInfo.of({
// action. The downstream half moves only for packaging-only changes, and RESETS to `:0` when the // action. The downstream half moves only for packaging-only changes, and RESETS to `:0` when the
// upstream half moves — v0.7.0 ended on `:3` only because three test packs were played before it // upstream half moves — v0.7.0 ended on `:3` only because three test packs were played before it
// was released. // was released.
version: '0.7.1:0', version: '0.7.2:0',
releaseNotes: { releaseNotes: {
en_US: en_US:
'Bundles Station Master v0.7.1, four fixes from playtesting. A train restricted to empties can ' + 'Bundles Station Master v0.7.2. IMPORTANT — GAMES IN PROGRESS DO NOT CARRY OVER: the deck has ' +
'couple its caboose again — a caboose carries the crew, not freight, so it was never a load. ' + 'changed size, so a game saved under v0.7.1 no longer replays. The server refuses to resume ' +
'The end of a Day now stops and says so, with the standings and how long is left, instead of ' + 'one rather than breaking it, says which move it stopped at, and leaves the file untouched, so ' +
'passing between one click and the next. A Timetabled train may be thrown away to a Department ' + 'you can put v0.7.1 back on to finish a game you care about. Crossing a Mainline card is now ' +
'slot for a rival to pick up, which is a New Game setting you can turn off; an Extra still ' + 'counted in the regions printed on it rather than the speed sign, which was only ever scenery ' +
'cannot. And a platform where nothing can be worked now says why, including when the coaches ' + '— most trains cross faster, slow trains much faster, and a train\u2019s Fast/Slow rating now ' +
'have run out and what brings them back.', 'matters on the Hilly card alone. The card deck matches the published counts exactly, which ' +
'means less track and fewer industries in a smaller deck. And the Division map is drawn as one ' +
'row you read left to right, west to east, so east is always to the right.',
es_ES: es_ES:
'Incluye Station Master v0.7.1, cuatro correcciones surgidas de las partidas de prueba. Un tren ' + 'Incluye Station Master v0.7.2. IMPORTANTE: LAS PARTIDAS EN CURSO NO SE CONSERVAN. La baraja ha ' +
'limitado a vagones vacíos vuelve a poder enganchar su furgón de cola: lleva a la tripulación, ' + 'cambiado de tama\u00f1o, as\u00ed que una partida guardada con la v0.7.1 ya no se puede ' +
'no carga, así que nunca fue una carga. El final de cada Día se detiene y lo anuncia, con la ' + 'reproducir. El servidor se niega a reanudarla en vez de estropearla, indica en qu\u00e9 ' +
'clasificación y lo que queda por jugar, en vez de pasar entre un clic y el siguiente. Un tren ' + 'jugada se detuvo y deja el archivo intacto, de modo que puedes volver a instalar la v0.7.1 ' +
'con horario puede descartarse a una casilla de Departamento para que otro lo recoja — es una ' + 'para terminar una partida que te importe. Cruzar una carta de L\u00ednea Principal se cuenta ' +
'opción de partida nueva que puedes desactivar —; un Extra sigue sin poder. Y un andén donde no ' + 'ahora por las regiones impresas en ella y no por la se\u00f1al de velocidad, que siempre fue ' +
'se puede trabajar ahora explica por qué, incluso cuando se han agotado los coches y qué los ' + 'decorativa: casi todos los trenes cruzan m\u00e1s r\u00e1pido, los lentos mucho m\u00e1s, y ' +
'devuelve.', 'la clasificaci\u00f3n R\u00e1pido/Lento solo cuenta ya en la carta Ondulada. La baraja ' +
'coincide exactamente con las cantidades publicadas: menos v\u00eda y menos industrias en una ' +
'baraja m\u00e1s peque\u00f1a. Y el mapa de la Divisi\u00f3n se dibuja en una sola fila que ' +
'se lee de izquierda a derecha, de oeste a este, as\u00ed que el este siempre queda a la ' +
'derecha.',
de_DE: de_DE:
'Enthält Station Master v0.7.1 mit vier Korrekturen aus dem Spieltest. Ein Zug, der nur Leerwagen ' + 'Enth\u00e4lt Station Master v0.7.2. WICHTIG \u2014 LAUFENDE PARTIEN GEHEN NICHT MIT: Das Deck ' +
'aufnehmen darf, kann seinen Kabuse wieder ankuppeln — ein Kabuse trägt die Mannschaft, keine ' + 'hat seine Gr\u00f6\u00dfe ge\u00e4ndert, daher l\u00e4sst sich ein unter v0.7.1 ' +
'Fracht, war also nie eine Ladung. Das Ende eines Tages hält jetzt an und sagt es, mit dem Stand ' + 'gespeichertes Spiel nicht mehr nachspielen. Der Server verweigert die Fortsetzung, statt das ' +
'und der verbleibenden Zeit, statt zwischen zwei Klicks zu verstreichen. Ein fahrplanmäßiger Zug ' + 'Spiel zu besch\u00e4digen, nennt den Zug, an dem er stehen blieb, und l\u00e4sst die Datei ' +
'darf auf ein Abteilungsfeld abgeworfen werden, wo ein Mitspieler ihn aufnehmen kann — eine neue ' + 'unangetastet \u2014 wer eine Partie retten will, spielt sie mit v0.7.1 zu Ende. Die ' +
'Spieleinstellung, die sich abschalten lässt; ein Extrazug weiterhin nicht. Und ein Bahnsteig, an ' + '\u00dcberquerung einer Streckenkarte z\u00e4hlt jetzt die darauf gedruckten Regionen statt ' +
'dem nichts geht, nennt jetzt den Grund, auch wenn die Wagen ausgegangen sind und was sie ' + 'des Tempo-Schilds, das immer nur Kulisse war: Die meisten Z\u00fcge sind schneller dr\u00fcben, ' +
'zurückbringt.', 'langsame deutlich schneller, und die Einstufung Schnell/Langsam z\u00e4hlt nur noch auf der ' +
'H\u00fcgelkarte. Das Kartendeck entspricht exakt den ver\u00f6ffentlichten St\u00fcckzahlen ' +
'\u2014 weniger Gleise und weniger Industrie in einem kleineren Deck. Und die Streckenkarte ' +
'wird als EINE Reihe gezeichnet, von links nach rechts, West nach Ost, sodass Osten immer ' +
'rechts liegt.',
pl_PL: pl_PL:
'Zawiera Station Master v0.7.1 z czterema poprawkami z testów. Pociąg ograniczony do pustych ' + 'Zawiera Station Master v0.7.2. WA\u017bNE \u2014 TRWAJ\u0104CE PARTIE NIE ZOSTAJ\u0104 ' +
'wagonów znowu może podpiąć swój służbowy — wiezie załogę, nie ładunek, więc nigdy ' + 'PRZENIESIONE: talia zmieni\u0142a rozmiar, wi\u0119c gra zapisana w v0.7.1 nie da si\u0119 ' +
'ładunkiem nie był. Koniec Dnia zatrzymuje się i to ogłasza, z wynikami i tym, ile zostało, ' + 'ju\u017c odtworzy\u0107. Serwer odmawia wznowienia, zamiast j\u0105 zepsu\u0107, podaje ' +
'zamiast przemykać między jednym kliknięciem a drugim. Pociąg rozkładowy można odrzucić na ' + 'ruch, na kt\u00f3rym stan\u0105\u0142, i zostawia plik nietkni\u0119ty \u2014 mo\u017cna ' +
'pole Wydziału, skąd weźmie go rywal — to nowe ustawienie gry, które można wyłączyć; ' + 'wr\u00f3ci\u0107 do v0.7.1 i doko\u0144czy\u0107 wa\u017cn\u0105 parti\u0119. ' +
'Dodatkowy nadal nie. A peron, na którym nic się nie da zrobić, mówi teraz dlaczego — także ' + 'Przejazd przez kart\u0119 Magistrali liczy si\u0119 teraz wed\u0142ug wydrukowanych na niej ' +
'wtedy, gdy skończyły się wagony, i co je przywraca.', 'region\u00f3w, a nie znaku pr\u0119dko\u015bci, kt\u00f3ry zawsze by\u0142 tylko ozdob\u0105: ' +
'wi\u0119kszo\u015b\u0107 poci\u0105g\u00f3w przeje\u017cd\u017ca szybciej, powolne du\u017co ' +
'szybciej, a ocena Szybki/Powolny liczy si\u0119 ju\u017c tylko na karcie Pag\u00f3rkowatej. ' +
'Talia odpowiada dok\u0142adnie opublikowanym liczbom \u2014 mniej tor\u00f3w i mniej ' +
'przemys\u0142u w mniejszej talii. A mapa Dywizji rysowana jest jako JEDEN rz\u0105d czytany ' +
'od lewej do prawej, z zachodu na wsch\u00f3d, wi\u0119c wsch\u00f3d zawsze jest po prawej.',
fr_FR: fr_FR:
'Inclut Station Master v0.7.1, quatre corrections issues des parties d’essai. Un train limité aux ' + 'Inclut Station Master v0.7.2. IMPORTANT \u2014 LES PARTIES EN COURS NE SONT PAS ' +
'wagons vides peut de nouveau atteler son fourgon de queue : il transporte l’équipe, pas du fret, ' + 'CONSERV\u00c9ES : la taille du jeu de cartes a chang\u00e9, donc une partie sauvegard\u00e9e ' +
'il n’a donc jamais été un chargement. La fin d’une Journée s’arrête et l’annonce, avec le ' + 'sous v0.7.1 ne peut plus \u00eatre rejou\u00e9e. Le serveur refuse de la reprendre au lieu de ' +
'classement et ce qu’il reste à jouer, au lieu de passer entre deux clics. Un train à horaire ' + 'l\u2019ab\u00eemer, indique le coup o\u00f9 il s\u2019est arr\u00eat\u00e9 et laisse le ' +
'peut être jeté sur une case de Département où un rival peut le reprendre — un nouveau réglage ' + 'fichier intact : vous pouvez r\u00e9installer la v0.7.1 pour terminer une partie qui compte. ' +
'de partie, désactivable ; un Extra ne le peut toujours pas. Et un quai où rien ne peut être ' + 'La travers\u00e9e d\u2019une carte de Ligne Principale se compte d\u00e9sormais en r\u00e9gions ' +
'fait en donne désormais la raison, y compris quand les voitures sont épuisées et ce qui les ' + 'imprim\u00e9es sur la carte plut\u00f4t qu\u2019au panneau de vitesse, qui n\u2019a jamais ' +
'ramène.', '\u00e9t\u00e9 que du d\u00e9cor : la plupart des trains traversent plus vite, les lents ' +
'beaucoup plus vite, et la cote Rapide/Lent ne compte plus que sur la carte Vallonn\u00e9e. Le ' +
'jeu de cartes correspond exactement aux quantit\u00e9s publi\u00e9es \u2014 moins de voie et ' +
'moins d\u2019industries dans un jeu plus petit. Et la carte de la Division est dessin\u00e9e ' +
'sur UNE seule rang\u00e9e qui se lit de gauche \u00e0 droite, d\u2019ouest en est : l\u2019est ' +
'est donc toujours \u00e0 droite.',
}, },
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 * STILL NOTHING TO CARRY, AND THIS TIME THAT IS NOT THE WHOLE STORY.
// 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`), * A migration moves DATA a previous version wrote. There is none to move: the package keeps its
// so games in progress survive this update rather than being set aside. * saved games as a seed plus the moves played, and nothing about their shape has changed.
*
* WHAT HAS CHANGED IS WHETHER THEY STILL MEAN ANYTHING. v0.7.2 takes the deck from 206 cards to
* 121 (Gitea#14), so a card id recorded under v0.7.1 refers to a different card or to no card at
* all, and a saved game stops replaying at its first `card.play`. That cannot be migrated: the
* moves were made against a deck that no longer exists, and re-dealing would invent a game
* nobody played.
*
* IT FAILS SAFE, and that is why this is empty rather than a `down: IMPOSSIBLE` argument for
* holding the release. `src/server/index.ts` replays each save on startup and REFUSES to resume
* one the rules reject, naming the move it stopped at and leaving the file untouched — so a
* game in progress is declined, never silently corrupted, and an operator who wants it back can
* put v0.7.1 on and finish it. The release notes say so first, before anything else.
*/
up: async ({ effects }) => {}, up: async ({ effects }) => {},
down: IMPOSSIBLE, down: IMPOSSIBLE,
}, },