0.7.4:0 — bundle Station Master v0.7.4

Submodule pinned to v0.7.4 (19a6a47), `current.ts` at `0.7.4: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.3:0's `up` is empty, `versions.md`'s common
case, so `current.ts` bumps in place.

Three rules corrections, all places where the code and the cards disagreed. The Yard
Office is offered rather than imposed, must be reachable in one move, and cars on the
lead collide — none of which it checked. Circus, Campaign and Military trains run
loaded where the yard can supply it, and the per-stop point is earned once per Office
Area by a fully loaded train. Red Flags becomes a directional flag on your own Limits,
spent on the train it stops, playable at the moment the engine sees a certain
collision.

GAMES IN PROGRESS MAY NOT SURVIVE THIS ONE, and the notes lead with it in every locale
— the opposite of 0.7.3 and for a different reason from 0.7.2. Nothing about the save
format changed; what changed is what the rules accept. The Red Flags intent changed
shape, a make-up that was legal may now be refused, and a Yard Office arrival asks a
question no older history has an answer for. It fails safe: the server declines a save
the rules reject, names the move, and leaves the file untouched. A game that never
meets one of the three carries on, which is why this is "may not" rather than 0.7.2's
"will not".

README.md's diagnosing note is extended: the Mainline Phase now stops to ask three
different questions of three different players, and a game sitting on one is waiting
on a person rather than stuck — it shows as active with nobody to wait for, because an
interruption is not a turn.

Verified: `npm run check` clean, prettier clean, `make x86` packs as v0.7.4:0.
NOT verified: not yet installed on a box, and none of the three rules has been played
by a human — upstream TODO.md #35 still stands for extended play too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAgJSmeV8zrMh55Mj85ESb
This commit is contained in:
Jesse
2026-08-29 08:20:30 -04:00
co-authored by Claude Opus 5
parent 74aea24d74
commit 085b88bb38
4 changed files with 164 additions and 92 deletions
+32 -20
View File
@@ -13,28 +13,40 @@ 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.3.** Two features, both about the end of a game (Gitea#11 and #16). A game no **Bundled version: 0.7.4.** Three rules corrections off the tracker (Gitea#13, #5, #19), all of them
longer stops dead when the timetable runs out — it enters a fourth state, `awaitingExtension`, and places where the code and the cards disagreed.
asks the table whether to play one more Day; agreement is unanimous in multiplayer and one refusal
ends it. The official result is frozen at the ORIGINAL `config.days` and never rewritten, so playing
on is explicitly an exhibition; a §3.4 collision breach is not extendable and does not overwrite a
recorded result. And the end of a game now renders a full results screen in place of the raw
`outcome.reason` enum the page used to print, backed by a new event tally on the game state.
**GAMES IN PROGRESS SURVIVE THIS UPDATE.** No card data changed and the engine changes are additive: **The Yard Office is offered rather than imposed (Gitea#5).** It was implemented in a form missing
every intent in a 0.7.2 save is still legal, so the save replays intact and the game simply pauses on all three of its conditions: a qualifying train was teleported onto the card, so nobody was asked, no
the new question when its timetable runs out. This is worth stating plainly because the previous route was walked — the card's printed "that can reach the yard office in one move" was unenforced —
release was the opposite — 0.7.2 took the deck from 206 cards to 121 and declined every game in and nothing was ever met on the way in. The arrival now interrupts the Mainline Phase to ask the
progress. That still applies to anyone updating from **0.7.1 or earlier**: `src/server/index.ts` district's owner, reachability is the engine's own move walk, and cars on the lead collide. Where no
refuses to resume a save the rules reject, logs which move it stopped at, and **leaves the file route exists the offer is withheld and the history says why.
untouched**, so an operator who wants a particular game back can put the older version on and finish
it.
**Diagnosing the new state.** A game sitting in `awaitingExtension` is waiting on its players, not **Some Extras must run loaded (Gitea#13).** Circus, Campaign and Military trains take a loaded car
broken: it is persisted and listed as `active`, it is resumed on restart like any other live game, while the Division Yard can supply one, an empty once it cannot, and may depart short. The per-stop
and the only move the rules will accept from it is `game.extend`. If a table appears stuck at the end point is earned once per Office Area rather than once per game, and only by a fully loaded train.
of its last Day, check whether every seat has voted — `Games in Progress` will show it as active with Two long-standing bugs went with it: `emptiesOnly` was rendered to the player and enforced nowhere,
nobody to wait for, because a vote is not a turn. and a set-up out on the Mainline paid its point to player 0 whoever was playing.
**Red Flags is a different card (Gitea#19).** The old rule protected a stopped train on the Mainline
and was played 4 times in 4,212 offers across 600 games. It is now a directional flag on your own
Limits, spent on the train it stops, playable either in phase or at the moment the engine sees a
certain collision.
**GAMES IN PROGRESS MAY NOT SURVIVE THIS UPDATE.** Unlike 0.7.3, which changed no rules, each of the
three above can stop an older history replaying: the Red Flags intent changed shape, a make-up that
was legal may now be refused, and a Yard Office arrival asks a question no older history has an
answer for. It fails safe — `src/server/index.ts` 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.3 back on to
finish a game that matters. A game that never meets one of the three carries on normally, which is
why this is "may not" rather than 0.7.2's "will not".
**Diagnosing the interruptions.** The Mainline Phase can now stop and ask three different questions,
of three different players: §8.1's clearance goes to the Superintendent, the Yard Office offer and
the Red Flag prompt to the owner of the district a train is arriving at. A game sitting on one is
waiting on a person, not stuck. `Games in Progress` shows it as active with nobody to wait for,
because an interruption is not a turn — the same reading as an extension vote.
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
+28
View File
@@ -43,6 +43,34 @@ 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.4.** Before anything else: **a game already in progress may not carry over.**
These are rules changes, and three of them alter what a saved game is allowed to contain, so an
old game may stop replaying. The server declines to resume one rather than breaking it — it says
which move it stopped at and leaves the save alone — so if you are mid-game and it matters, finish
it before updating or put 0.7.3 back on afterwards. A game that never runs into one of the three
carries on as normal.
**The Yard Office asks you now.** A freight train arriving in your district used to be sent into the
yard automatically, whether you wanted it there or not. Now you are asked. Three things it never
checked before it does now: it has to be able to **reach the yard in one move** — if it cannot, you
are not offered the choice, and the history tells you why rather than staying silent — and if there
are **cars standing on the way in, the train hits them**, exactly as it would anywhere else. Taking
the yard still keeps your Train Order Office free, which is the whole point of the card.
**Circus, Campaign and Military trains run loaded.** They take loaded cars from the Division Yard
while there are any, empties once there are not, and will run short rather than wait. A Circus or
Campaign train earns its point for setting up **once in each player's district** rather than once in
the whole game — so a train that tours the Division is worth more than one that parks — and only
when every car is full. Not much of a circus if the cars are empty. The Campaign train earns that
point for the first time; it never scored at all before, and it needs its candidate aboard.
**Red Flags does something else entirely.** It used to protect one stopped train out on the line.
Now you plant it on the **east or west side of your own district**, and it holds the next train
coming from that way — which is how you buy yourself a Stage to finish switching. It comes down with
the train it stops: one card, one train. You can also play it at the moment it matters. If a train
is arriving into a certain collision and you are holding the card, the game stops and asks whether
you want to flag it; say no and the collision happens.
**What changed in 0.7.3.** **Your games in progress survive this one** — unlike the last update, **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 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. where it left off.
+103 -71
View File
@@ -4,91 +4,123 @@ 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, 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.
// was released. version: '0.7.4:0',
version: '0.7.3:0',
releaseNotes: { releaseNotes: {
en_US: en_US:
'Bundles Station Master v0.7.3. Games in progress carry over: unlike v0.7.2, neither the deck nor the ' + 'Bundles Station Master v0.7.4 \u2014 three rules corrections. IMPORTANT: a game already in progress may ' +
'save format has changed. When the last Day on the timetable runs out, the game now asks instead of ' + 'not carry over. These change what the rules accept, so a saved game can stop replaying; the server ' +
'stopping \u2014 you may play one more Day, and at the end of that Day it asks again. In a multiplayer ' + 'declines to resume one rather than breaking it, says which move it stopped at, and leaves the file ' +
'game every player has to agree, and a single refusal ends it. The result is settled at the ORIGINAL ' + 'untouched, so you can put v0.7.3 back on to finish a game you care about. THE YARD OFFICE IS NOW ' +
'length and never changes: in a five-Day game played on to eight, the winner is still whoever led at ' + 'OFFERED, NOT AUTOMATIC. A freight train arriving in your district is asked where it should go, it ' +
'the end of Day 5. A game that ends on too many collisions is final and is offered no extra Day. And ' + 'must be able to reach the yard in one move, and if there are cars standing on the way in it crashes ' +
'the end of a game now brings up a full results screen \u2014 why it ended, in plain words rather than an ' + 'into them \u2014 none of which the game checked before. When it cannot be offered, the history says why. ' +
"internal code; who won; every player's Revenue; the rules the game was dealt under; and what the " + 'SOME EXTRA TRAINS MUST RUN LOADED. The Circus, Campaign and Military trains take loaded cars while ' +
'railroad actually did, from trains through the Division and loads made up and broken to passengers ' + 'the yard can supply them, empties once it cannot, and may run short. A Circus or Campaign train ' +
'carried, cars switched and trains lost.', "earns its point for setting up ONCE IN EACH PLAYER'S DISTRICT rather than once in the game, and only " +
'when every car is full \u2014 not much of a circus if the cars are empty. RED FLAGS ARE A DIFFERENT CARD. ' +
'Instead of protecting one stopped train out on the line, a flag is planted on the east or west side ' +
'of your own district and holds the next train coming from that way, buying you a Stage to finish ' +
'switching. It comes down with the train it stops. You may also play it the moment danger appears: if ' +
'an arriving train is about to hit something, you are asked whether to flag it.',
es_ES: es_ES:
'Incluye Station Master v0.7.3. Las partidas en curso se conservan: a diferencia de la v0.7.2, no han ' + 'Incluye Station Master v0.7.4: tres correcciones de reglas. IMPORTANTE: una partida ya en curso ' +
'cambiado ni la baraja ni el formato de guardado. Cuando se agota el \u00faltimo D\u00eda del horario, la ' + 'puede no conservarse. Estos cambios alteran lo que las reglas aceptan, as\u00ed que una partida guardada ' +
'partida ahora pregunta en vez de terminar: pod\u00e9is jugar un D\u00eda m\u00e1s, y al final de ese D\u00eda vuelve a ' + 'puede dejar de reproducirse; el servidor se niega a reanudarla en vez de estropearla, indica en qu\u00e9 ' +
'preguntar. En una partida multijugador deben estar de acuerdo todos los jugadores, y una sola ' + 'jugada se detuvo y deja el archivo intacto, de modo que puedes volver a instalar la v0.7.3 para ' +
'negativa la termina. El resultado se decide con la duraci\u00f3n ORIGINAL y no cambia nunca: en una ' + 'terminar una partida que te importe. LA OFICINA DE PATIO AHORA SE OFRECE, NO ES AUTOM\u00c1TICA. A un ' +
'partida de cinco D\u00edas prolongada hasta ocho, gana quien iba en cabeza al final del D\u00eda 5. Una ' + 'tren de mercanc\u00edas que llega a tu distrito se le pregunta ad\u00f3nde debe ir, tiene que poder alcanzar ' +
'partida que termina por exceso de colisiones es definitiva y no recibe ning\u00fan D\u00eda adicional. Y al ' + 'el patio en un solo movimiento, y si hay vagones parados en el camino choca contra ellos: nada de ' +
'terminar aparece una pantalla de resultados completa: por qu\u00e9 termin\u00f3, explicado con palabras y no ' + 'esto se comprobaba antes. Cuando no puede ofrecerse, el historial explica por qu\u00e9. ALGUNOS TRENES ' +
'con un c\u00f3digo interno; qui\u00e9n gana; los Ingresos de cada jugador; las reglas con las que se reparti\u00f3 ' + 'EXTRA DEBEN CIRCULAR CARGADOS. Los trenes de Circo, de Campa\u00f1a y Militar toman vagones cargados ' +
'la partida; y lo que hizo realmente el ferrocarril, desde los trenes que cruzaron la Divisi\u00f3n y las ' + 'mientras el patio pueda suministrarlos, vac\u00edos cuando ya no, y pueden circular incompletos. Un tren ' +
'cargas formadas y deshechas hasta los pasajeros transportados, los vagones maniobrados y los trenes ' + 'de Circo o de Campa\u00f1a gana su punto por instalarse UNA VEZ EN EL DISTRITO DE CADA JUGADOR, en lugar ' +
'perdidos.', 'de una vez por partida, y solo si todos sus vagones van llenos: poco circo es si los vagones van ' +
'vac\u00edos. LAS BANDERAS ROJAS SON OTRA CARTA. En vez de proteger a un tren parado en la l\u00ednea, la ' +
'bandera se planta en el lado este u oeste de tu propio distrito y detiene al siguiente tren que ' +
'venga por ah\u00ed, d\u00e1ndote una Etapa para terminar de maniobrar. Se retira con el tren que detiene. ' +
'Tambi\u00e9n puedes jugarla en el momento del peligro: si un tren que llega va a chocar, se te pregunta ' +
'si quieres detenerlo con la bandera.',
de_DE: de_DE:
'Enth\u00e4lt Station Master v0.7.3. Laufende Partien bleiben erhalten: anders als bei v0.7.2 hat sich ' + 'Enth\u00e4lt Station Master v0.7.4 \u2014 drei Regelkorrekturen. WICHTIG: Eine bereits laufende Partie geht ' +
'weder am Deck noch am Speicherformat etwas ge\u00e4ndert. Wenn der letzte Tag des Fahrplans abgelaufen ' + 'm\u00f6glicherweise nicht mit. Diese \u00c4nderungen betreffen, was die Regeln akzeptieren, daher kann ein ' +
'ist, fragt das Spiel jetzt, statt einfach aufzuh\u00f6ren \u2014 ihr d\u00fcrft einen weiteren Tag spielen, und am ' + 'gespeichertes Spiel nicht mehr nachspielbar sein; der Server verweigert die Fortsetzung, statt das ' +
'Ende dieses Tages fragt es erneut. In einer Mehrspielerpartie m\u00fcssen alle zustimmen, eine einzige ' + 'Spiel zu besch\u00e4digen, nennt den Zug, an dem er stehen blieb, und l\u00e4sst die Datei unangetastet \u2014 wer ' +
'Ablehnung beendet sie. Das Ergebnis wird \u00fcber die URSPR\u00dcNGLICHE Spiell\u00e4nge entschieden und \u00e4ndert ' + 'eine Partie retten will, spielt sie mit v0.7.3 zu Ende. DAS BAHNHOFSB\u00dcRO WIRD JETZT ANGEBOTEN, NICHT ' +
'sich nie: Wer eine F\u00fcnf-Tage-Partie auf acht Tage verl\u00e4ngert, sieht immer noch den Sieger vom Ende ' + 'ERZWUNGEN. Ein G\u00fcterzug, der in deinem Bezirk ankommt, wird gefragt, wohin er soll; er muss den ' +
'des 5. Tages. Eine Partie, die an zu vielen Kollisionen endet, ist endg\u00fcltig und bekommt keinen ' + 'Bahnhof in einem Zug erreichen k\u00f6nnen, und stehen Wagen im Weg, f\u00e4hrt er hinein \u2014 nichts davon wurde ' +
'weiteren Tag. Und am Ende erscheint jetzt eine vollst\u00e4ndige Ergebnisanzeige: warum die Partie ' + 'vorher gepr\u00fcft. Ist das Angebot nicht m\u00f6glich, sagt die Chronik warum. EINIGE EXTRAZ\u00dcGE M\u00dcSSEN ' +
'endete, in Worten statt als interner Code; wer gewinnt; die Einnahmen jedes Spielers; die Regeln, ' + 'BELADEN FAHREN. Zirkus-, Wahlkampf- und Milit\u00e4rzug nehmen beladene Wagen, solange der Bahnhof sie ' +
'mit denen ausgeteilt wurde; und was die Eisenbahn tats\u00e4chlich geleistet hat, von Z\u00fcgen durch die ' + 'liefern kann, sonst leere, und d\u00fcrfen auch kurz fahren. Ein Zirkus- oder Wahlkampfzug bekommt seinen ' +
'Division und gebildeten wie aufgel\u00f6sten Ladungen bis zu bef\u00f6rderten Fahrg\u00e4sten, rangierten Wagen und ' + 'Punkt f\u00fcrs Aufbauen EINMAL IN JEDEM BEZIRK statt einmal im Spiel, und nur wenn jeder Wagen voll ist ' +
'verlorenen Z\u00fcgen.', '\u2014 kein gro\u00dfer Zirkus, wenn die Wagen leer sind. ROTE FLAGGEN SIND EINE ANDERE KARTE. Statt einen ' +
'haltenden Zug auf der Strecke zu sch\u00fctzen, wird die Flagge an der Ost- oder Westseite des eigenen ' +
'Bezirks gesetzt und h\u00e4lt den n\u00e4chsten Zug von dort auf \u2014 eine Stufe Zeit, um das Rangieren zu ' +
'beenden. Sie kommt mit dem Zug herunter, den sie gestoppt hat. Sie l\u00e4sst sich auch im Moment der ' +
'Gefahr spielen: Steht ein ankommender Zug vor einem Zusammensto\u00df, wirst du gefragt, ob du ihn ' +
'abflaggen willst.',
pl_PL: pl_PL:
'Zawiera Station Master v0.7.3. Trwaj\u0105ce partie zostaj\u0105 zachowane: w odr\u00f3\u017cnieniu od v0.7.2 nie ' + 'Zawiera Station Master v0.7.4 \u2014 trzy poprawki zasad. WA\u017bNE: trwaj\u0105ca partia mo\u017ce nie zosta\u0107 ' +
'zmieni\u0142a si\u0119 ani talia, ani format zapisu. Gdy ko\u0144czy si\u0119 ostatni Dzie\u0144 rozk\u0142adu, gra teraz pyta, ' + 'przeniesiona. Te zmiany dotycz\u0105 tego, co zasady dopuszczaj\u0105, wi\u0119c zapisana gra mo\u017ce przesta\u0107 si\u0119 ' +
'zamiast po prostu si\u0119 sko\u0144czy\u0107: mo\u017cecie zagra\u0107 jeszcze jeden Dzie\u0144, a na jego koniec zapyta ' + 'odtwarza\u0107; serwer odmawia wznowienia, zamiast j\u0105 zepsu\u0107, podaje ruch, na kt\u00f3rym stan\u0105\u0142, i zostawia ' +
'ponownie. W grze wieloosobowej musz\u0105 zgodzi\u0107 si\u0119 wszyscy, a jedna odmowa ko\u0144czy parti\u0119. Wynik ' + 'plik nietkni\u0119ty \u2014 mo\u017cna wr\u00f3ci\u0107 do v0.7.3 i doko\u0144czy\u0107 wa\u017cn\u0105 parti\u0119. BIURO STACYJNE JEST TERAZ ' +
'rozstrzyga si\u0119 na PIERWOTNEJ d\u0142ugo\u015bci gry i nigdy si\u0119 nie zmienia: w pi\u0119ciodniowej partii ' + 'PROPONOWANE, NIE NARZUCANE. Poci\u0105g towarowy przyje\u017cd\u017caj\u0105cy do twojego okr\u0119gu jest pytany, dok\u0105d ma ' +
'przed\u0142u\u017conej do o\u015bmiu Dni wygrywa ten, kto prowadzi\u0142 na koniec Dnia 5. Partia zako\u0144czona zbyt ' + 'jecha\u0107; musi m\u00f3c dotrze\u0107 do stacji w jednym ruchu, a je\u015bli po drodze stoj\u0105 wagony, wje\u017cd\u017ca w nie \u2014 ' +
'wieloma kolizjami jest ostateczna i nie dostaje kolejnego Dnia. A na ko\u0144cu pojawia si\u0119 pe\u0142ny ekran ' + 'czego wcze\u015bniej gra w og\u00f3le nie sprawdza\u0142a. Gdy propozycja nie mo\u017ce pa\u015b\u0107, historia m\u00f3wi dlaczego. ' +
'wynik\u00f3w: dlaczego partia si\u0119 sko\u0144czy\u0142a \u2014 s\u0142owami, nie wewn\u0119trznym kodem; kto wygrywa; Przych\u00f3d ' + 'NIEKT\u00d3RE POCI\u0104GI DODATKOWE MUSZ\u0104 JECHA\u0106 ZA\u0141ADOWANE. Poci\u0105g cyrkowy, kampanijny i wojskowy bior\u0105 ' +
'ka\u017cdego gracza; zasady, wed\u0142ug kt\u00f3rych rozdano gr\u0119; i co kolej naprawd\u0119 zrobi\u0142a, od poci\u0105g\u00f3w przez ' + 'wagony \u0142adowne, dop\u00f3ki stacja mo\u017ce je dostarczy\u0107, potem puste, i mog\u0105 jecha\u0107 niepe\u0142ne. Poci\u0105g ' +
'Dywizj\u0119 i \u0142adunk\u00f3w utworzonych oraz rozformowanych po przewiezionych pasa\u017cer\u00f3w, przetoczone wagony i ' + 'cyrkowy lub kampanijny zdobywa punkt za rozstawienie RAZ W OKR\u0118GU KA\u017bDEGO GRACZA, a nie raz na gr\u0119, ' +
'stracone poci\u0105gi.', 'i tylko gdy wszystkie wagony s\u0105 pe\u0142ne \u2014 marny to cyrk, gdy wagony s\u0105 puste. CZERWONE FLAGI TO INNA ' +
'KARTA. Zamiast chroni\u0107 stoj\u0105cy poci\u0105g na szlaku, flag\u0119 stawia si\u0119 po wschodniej lub zachodniej ' +
'stronie w\u0142asnego okr\u0119gu i zatrzymuje ona nast\u0119pny poci\u0105g z tamtej strony, daj\u0105c Etap na doko\u0144czenie ' +
'manewr\u00f3w. Znika razem z poci\u0105giem, kt\u00f3ry zatrzyma\u0142a. Mo\u017cna j\u0105 te\u017c zagra\u0107 w chwili zagro\u017cenia: je\u015bli ' +
'przyje\u017cd\u017caj\u0105cy poci\u0105g ma si\u0119 zderzy\u0107, gra pyta, czy go zaflagowa\u0107.',
fr_FR: fr_FR:
'Inclut Station Master v0.7.3. Les parties en cours sont conserv\u00e9es : contrairement \u00e0 la v0.7.2, ni ' + 'Inclut Station Master v0.7.4 \u2014 trois corrections de r\u00e8gles. IMPORTANT : une partie d\u00e9j\u00e0 en cours ' +
'le jeu de cartes ni le format de sauvegarde n\u2019ont chang\u00e9. Quand le dernier Jour de l\u2019horaire est ' + 'peut ne pas \u00eatre conserv\u00e9e. Ces changements modifient ce que les r\u00e8gles acceptent, donc une ' +
'\u00e9coul\u00e9, la partie pose d\u00e9sormais la question au lieu de s\u2019arr\u00eater : vous pouvez jouer un Jour de ' + "sauvegarde peut cesser d'\u00eatre rejouable ; le serveur refuse de la reprendre au lieu de l'ab\u00eemer, " +
'plus, et \u00e0 la fin de ce Jour elle repose la question. En multijoueur, tous les joueurs doivent \u00eatre ' + "indique le coup o\u00f9 il s'est arr\u00eat\u00e9 et laisse le fichier intact : vous pouvez r\u00e9installer la v0.7.3 " +
'd\u2019accord, et un seul refus y met fin. Le r\u00e9sultat est \u00e9tabli sur la dur\u00e9e INITIALE et ne change ' + 'pour terminer une partie qui compte. LE BUREAU DE TRIAGE EST D\u00c9SORMAIS PROPOS\u00c9, PAS IMPOS\u00c9. Un train ' +
'jamais : dans une partie de cinq Jours prolong\u00e9e jusqu\u2019\u00e0 huit, le vainqueur reste celui qui menait \u00e0 ' + 'de marchandises qui arrive dans votre district se voit demander o\u00f9 aller ; il doit pouvoir atteindre ' +
'la fin du Jour 5. Une partie qui se termine sur trop de collisions est d\u00e9finitive et ne se voit ' + 'le triage en un seul mouvement, et si des wagons stationnent sur le chemin, il les percute \u2014 rien de ' +
'proposer aucun Jour suppl\u00e9mentaire. Et la fin d\u2019une partie affiche maintenant un \u00e9cran de r\u00e9sultats ' + "tout cela n'\u00e9tait v\u00e9rifi\u00e9 auparavant. Quand la proposition ne peut pas \u00eatre faite, l'historique dit " +
'complet : pourquoi elle s\u2019est termin\u00e9e, en toutes lettres plut\u00f4t qu\u2019en code interne ; qui gagne ; ' + 'pourquoi. CERTAINS TRAINS SUPPL\u00c9MENTAIRES DOIVENT ROULER CHARG\u00c9S. Les trains de Cirque, de Campagne ' +
'les Recettes de chaque joueur ; les r\u00e8gles avec lesquelles la partie a \u00e9t\u00e9 distribu\u00e9e ; et ce que le ' + 'et Militaire prennent des wagons charg\u00e9s tant que le d\u00e9p\u00f4t peut en fournir, des vides ensuite, et ' +
'chemin de fer a r\u00e9ellement fait, des trains ayant travers\u00e9 la Division et des chargements form\u00e9s et ' + "peuvent rouler incomplets. Un train de Cirque ou de Campagne gagne son point d'installation UNE FOIS " +
'd\u00e9faits aux voyageurs transport\u00e9s, wagons man\u0153uvr\u00e9s et trains perdus.', "DANS LE DISTRICT DE CHAQUE JOUEUR au lieu d'une fois par partie, et seulement si tous ses wagons " +
"sont pleins : ce n'est pas un grand cirque si les wagons sont vides. LES DRAPEAUX ROUGES SONT UNE " +
'AUTRE CARTE. Au lieu de prot\u00e9ger un train arr\u00eat\u00e9 sur la ligne, le drapeau se plante du c\u00f4t\u00e9 est ou ' +
'ouest de votre propre district et retient le prochain train venant de l\u00e0, vous offrant une \u00c9tape ' +
"pour finir vos man\u0153uvres. Il tombe avec le train qu'il arr\u00eate. Vous pouvez aussi le jouer au moment " +
'du danger : si un train qui arrive va percuter quelque chose, on vous demande si vous voulez le ' +
'drapeauter.',
}, },
migrations: { migrations: {
/** /**
* NOTHING TO CARRY, AND THIS TIME NOTHING IS LOST EITHER. * NOTHING TO CARRY, AND THIS TIME SOME GAMES WILL NOT SURVIVE.
* *
* A migration moves DATA a previous version wrote. There is none to move: the package keeps its * A migration moves DATA a previous version wrote. There is none to move: the package keeps its
* saved games as a seed plus the moves played, and nothing about their shape has changed. * saved games as a seed plus the moves played, and nothing about their shape has changed.
* *
* THE DIFFERENCE FROM v0.7.2, which is the thing worth writing down. That release emptied this * WHAT HAS CHANGED IS WHAT THE RULES ACCEPT, and that is what decides whether a save replays.
* same function for a much worse reason — the deck went from 206 cards to 121, so a card id * v0.7.4 carries three rules corrections, and each can stop an older history:
* recorded under v0.7.1 meant a different card or none, and every game in progress was declined
* on startup. v0.7.3 changes no card data and adds only new moves, so a v0.7.2 save replays
* intact: every intent in it is still legal, and the game simply pauses on the new
* "play one more Day?" question when its timetable runs out instead of finishing outright.
* *
* Proven rather than assumed: the upstream suite replays the three recorded games in * - Red Flags is a different card. `maneuver.redFlags` no longer names a train to protect; it
* `public/replays`, all made under an older ruleset, and asserts every intent still applies * names the side of a district to flag. A save containing the old form stops there.
* (`test/harness.test.ts`). The release notes lead with it, since the last release's notes had * - Some Extras must now take a loaded car while the yard can supply one, so a make-up that
* to lead with the opposite. * was legal under v0.7.3 may be refused.
* - A Yard Office arrival now ASKS the district's owner. An older history has no answer
* recorded for a question that did not exist, so a replay reaching one stops.
*
* None of that can be migrated: the moves were made under rules that no longer hold, and
* re-deciding them would invent a game nobody played. It FAILS SAFE, which is why this is empty
* rather than an 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. A game in progress is declined, never silently corrupted, and an operator
* who wants it back can put v0.7.3 on and finish it. The release notes say so first.
*
* A game that never met one of the three simply carries on, so this is "may not" rather than
* "will not" — unlike v0.7.2, where a deck change condemned every save without exception.
*/ */
up: async ({ effects }) => {}, up: async ({ effects }) => {},
down: IMPOSSIBLE, down: IMPOSSIBLE,