From 085b88bb387b83dce7aa7c05796ab8d60a2001a2 Mon Sep 17 00:00:00 2001 From: Jesse Date: Sat, 29 Aug 2026 08:20:30 -0400 Subject: [PATCH] =?UTF-8?q?0.7.4:0=20=E2=80=94=20bundle=20Station=20Master?= =?UTF-8?q?=20v0.7.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01EAgJSmeV8zrMh55Mj85ESb --- README.md | 52 ++++++----- instructions.md | 28 ++++++ startos/versions/current.ts | 174 +++++++++++++++++++++--------------- station-master | 2 +- 4 files changed, 164 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index 4c7fc28..2ddf0b7 100644 --- a/README.md +++ b/README.md @@ -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 — 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 -longer stops dead when the timetable runs out — it enters a fourth state, `awaitingExtension`, and -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. +**Bundled version: 0.7.4.** Three rules corrections off the tracker (Gitea#13, #5, #19), all of them +places where the code and the cards disagreed. -**GAMES IN PROGRESS SURVIVE THIS UPDATE.** No card data changed and the engine changes are additive: -every intent in a 0.7.2 save is still legal, so the save replays intact and the game simply pauses on -the new question when its timetable runs out. This is worth stating plainly because the previous -release was the opposite — 0.7.2 took the deck from 206 cards to 121 and declined every game in -progress. That still applies to anyone updating from **0.7.1 or earlier**: `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 who wants a particular game back can put the older version on and finish -it. +**The Yard Office is offered rather than imposed (Gitea#5).** It was implemented in a form missing +all three of its conditions: a qualifying train was teleported onto the card, so nobody was asked, no +route was walked — the card's printed "that can reach the yard office in one move" was unenforced — +and nothing was ever met on the way in. The arrival now interrupts the Mainline Phase to ask the +district's owner, reachability is the engine's own move walk, and cars on the lead collide. Where no +route exists the offer is withheld and the history says why. -**Diagnosing the new state.** A game sitting in `awaitingExtension` is waiting on its players, not -broken: it is persisted and listed as `active`, it is resumed on restart like any other live game, -and the only move the rules will accept from it is `game.extend`. If a table appears stuck at the end -of its last Day, check whether every seat has voted — `Games in Progress` will show it as active with -nobody to wait for, because a vote is not a turn. +**Some Extras must run loaded (Gitea#13).** Circus, Campaign and Military trains take a loaded car +while the Division Yard can supply one, an empty once it cannot, and may depart short. The per-stop +point is earned once per Office Area rather than once per game, and only by a fully loaded train. +Two long-standing bugs went with it: `emptiesOnly` was rendered to the player and enforced nowhere, +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 (Solitaire, Co-op, Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before diff --git a/instructions.md b/instructions.md index 686864c..2f6425d 100644 --- a/instructions.md +++ b/instructions.md @@ -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 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, 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. diff --git a/startos/versions/current.ts b/startos/versions/current.ts index 61ae14b..4ac4d40 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -4,91 +4,123 @@ export const current = VersionInfo.of({ // `:` — 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 // 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 - // was released. - version: '0.7.3:0', + // upstream half moves. + version: '0.7.4:0', releaseNotes: { en_US: - 'Bundles Station Master v0.7.3. Games in progress carry over: unlike v0.7.2, neither the deck nor the ' + - 'save format has changed. When the last Day on the timetable runs out, the game now asks instead of ' + - 'stopping \u2014 you may play one more Day, and at the end of that Day it asks again. In a multiplayer ' + - 'game every player has to agree, and a single refusal ends it. The result is settled at the ORIGINAL ' + - 'length and never changes: in a five-Day game played on to eight, the winner is still whoever led at ' + - 'the end of Day 5. A game that ends on too many collisions is final and is offered no extra Day. And ' + - 'the end of a game now brings up a full results screen \u2014 why it ended, in plain words rather than an ' + - "internal code; who won; every player's Revenue; the rules the game was dealt under; and what the " + - 'railroad actually did, from trains through the Division and loads made up and broken to passengers ' + - 'carried, cars switched and trains lost.', + 'Bundles Station Master v0.7.4 \u2014 three rules corrections. IMPORTANT: a game already in progress may ' + + 'not carry over. These change what the rules accept, so a saved game can stop replaying; the server ' + + 'declines to resume one rather than breaking it, says which move it stopped at, and leaves the file ' + + 'untouched, so you can put v0.7.3 back on to finish a game you care about. THE YARD OFFICE IS NOW ' + + 'OFFERED, NOT AUTOMATIC. A freight train arriving in your district is asked where it should go, it ' + + 'must be able to reach the yard in one move, and if there are cars standing on the way in it crashes ' + + 'into them \u2014 none of which the game checked before. When it cannot be offered, the history says why. ' + + 'SOME EXTRA TRAINS MUST RUN LOADED. The Circus, Campaign and Military trains take loaded cars while ' + + 'the yard can supply them, empties once it cannot, and may run short. A Circus or Campaign train ' + + "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: - 'Incluye Station Master v0.7.3. Las partidas en curso se conservan: a diferencia de la v0.7.2, no han ' + - 'cambiado ni la baraja ni el formato de guardado. Cuando se agota el \u00faltimo D\u00eda del horario, la ' + - 'partida ahora pregunta en vez de terminar: pod\u00e9is jugar un D\u00eda m\u00e1s, y al final de ese D\u00eda vuelve a ' + - 'preguntar. En una partida multijugador deben estar de acuerdo todos los jugadores, y una sola ' + - 'negativa la termina. El resultado se decide con la duraci\u00f3n ORIGINAL y no cambia nunca: en una ' + - 'partida de cinco D\u00edas prolongada hasta ocho, gana quien iba en cabeza al final del D\u00eda 5. Una ' + - 'partida que termina por exceso de colisiones es definitiva y no recibe ning\u00fan D\u00eda adicional. Y al ' + - 'terminar aparece una pantalla de resultados completa: por qu\u00e9 termin\u00f3, explicado con palabras y no ' + - 'con un c\u00f3digo interno; qui\u00e9n gana; los Ingresos de cada jugador; las reglas con las que se reparti\u00f3 ' + - 'la partida; y lo que hizo realmente el ferrocarril, desde los trenes que cruzaron la Divisi\u00f3n y las ' + - 'cargas formadas y deshechas hasta los pasajeros transportados, los vagones maniobrados y los trenes ' + - 'perdidos.', + 'Incluye Station Master v0.7.4: tres correcciones de reglas. IMPORTANTE: una partida ya en curso ' + + 'puede no conservarse. Estos cambios alteran lo que las reglas aceptan, as\u00ed que una partida guardada ' + + 'puede dejar de reproducirse; el servidor se niega a reanudarla en vez de estropearla, indica en qu\u00e9 ' + + 'jugada se detuvo y deja el archivo intacto, de modo que puedes volver a instalar la v0.7.3 para ' + + 'terminar una partida que te importe. LA OFICINA DE PATIO AHORA SE OFRECE, NO ES AUTOM\u00c1TICA. A un ' + + 'tren de mercanc\u00edas que llega a tu distrito se le pregunta ad\u00f3nde debe ir, tiene que poder alcanzar ' + + 'el patio en un solo movimiento, y si hay vagones parados en el camino choca contra ellos: nada de ' + + 'esto se comprobaba antes. Cuando no puede ofrecerse, el historial explica por qu\u00e9. ALGUNOS TRENES ' + + 'EXTRA DEBEN CIRCULAR CARGADOS. Los trenes de Circo, de Campa\u00f1a y Militar toman vagones cargados ' + + 'mientras el patio pueda suministrarlos, vac\u00edos cuando ya no, y pueden circular incompletos. Un tren ' + + 'de Circo o de Campa\u00f1a gana su punto por instalarse UNA VEZ EN EL DISTRITO DE CADA JUGADOR, en lugar ' + + '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: - 'Enth\u00e4lt Station Master v0.7.3. Laufende Partien bleiben erhalten: anders als bei v0.7.2 hat sich ' + - 'weder am Deck noch am Speicherformat etwas ge\u00e4ndert. Wenn der letzte Tag des Fahrplans abgelaufen ' + - 'ist, fragt das Spiel jetzt, statt einfach aufzuh\u00f6ren \u2014 ihr d\u00fcrft einen weiteren Tag spielen, und am ' + - 'Ende dieses Tages fragt es erneut. In einer Mehrspielerpartie m\u00fcssen alle zustimmen, eine einzige ' + - 'Ablehnung beendet sie. Das Ergebnis wird \u00fcber die URSPR\u00dcNGLICHE Spiell\u00e4nge entschieden und \u00e4ndert ' + - 'sich nie: Wer eine F\u00fcnf-Tage-Partie auf acht Tage verl\u00e4ngert, sieht immer noch den Sieger vom Ende ' + - 'des 5. Tages. Eine Partie, die an zu vielen Kollisionen endet, ist endg\u00fcltig und bekommt keinen ' + - 'weiteren Tag. Und am Ende erscheint jetzt eine vollst\u00e4ndige Ergebnisanzeige: warum die Partie ' + - 'endete, in Worten statt als interner Code; wer gewinnt; die Einnahmen jedes Spielers; die Regeln, ' + - 'mit denen ausgeteilt wurde; und was die Eisenbahn tats\u00e4chlich geleistet hat, von Z\u00fcgen durch die ' + - 'Division und gebildeten wie aufgel\u00f6sten Ladungen bis zu bef\u00f6rderten Fahrg\u00e4sten, rangierten Wagen und ' + - 'verlorenen Z\u00fcgen.', + 'Enth\u00e4lt Station Master v0.7.4 \u2014 drei Regelkorrekturen. WICHTIG: Eine bereits laufende Partie geht ' + + 'm\u00f6glicherweise nicht mit. Diese \u00c4nderungen betreffen, was die Regeln akzeptieren, daher kann ein ' + + 'gespeichertes Spiel nicht mehr nachspielbar sein; der Server verweigert die Fortsetzung, statt das ' + + 'Spiel zu besch\u00e4digen, nennt den Zug, an dem er stehen blieb, und l\u00e4sst die Datei unangetastet \u2014 wer ' + + 'eine Partie retten will, spielt sie mit v0.7.3 zu Ende. DAS BAHNHOFSB\u00dcRO WIRD JETZT ANGEBOTEN, NICHT ' + + 'ERZWUNGEN. Ein G\u00fcterzug, der in deinem Bezirk ankommt, wird gefragt, wohin er soll; er muss den ' + + 'Bahnhof in einem Zug erreichen k\u00f6nnen, und stehen Wagen im Weg, f\u00e4hrt er hinein \u2014 nichts davon wurde ' + + 'vorher gepr\u00fcft. Ist das Angebot nicht m\u00f6glich, sagt die Chronik warum. EINIGE EXTRAZ\u00dcGE M\u00dcSSEN ' + + 'BELADEN FAHREN. Zirkus-, Wahlkampf- und Milit\u00e4rzug nehmen beladene Wagen, solange der Bahnhof sie ' + + 'liefern kann, sonst leere, und d\u00fcrfen auch kurz fahren. Ein Zirkus- oder Wahlkampfzug bekommt seinen ' + + 'Punkt f\u00fcrs Aufbauen EINMAL IN JEDEM BEZIRK statt einmal im Spiel, und nur wenn jeder Wagen voll ist ' + + '\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: - 'Zawiera Station Master v0.7.3. Trwaj\u0105ce partie zostaj\u0105 zachowane: w odr\u00f3\u017cnieniu od v0.7.2 nie ' + - 'zmieni\u0142a si\u0119 ani talia, ani format zapisu. Gdy ko\u0144czy si\u0119 ostatni Dzie\u0144 rozk\u0142adu, gra teraz pyta, ' + - 'zamiast po prostu si\u0119 sko\u0144czy\u0107: mo\u017cecie zagra\u0107 jeszcze jeden Dzie\u0144, a na jego koniec zapyta ' + - 'ponownie. W grze wieloosobowej musz\u0105 zgodzi\u0107 si\u0119 wszyscy, a jedna odmowa ko\u0144czy parti\u0119. Wynik ' + - 'rozstrzyga si\u0119 na PIERWOTNEJ d\u0142ugo\u015bci gry i nigdy si\u0119 nie zmienia: w pi\u0119ciodniowej partii ' + - 'przed\u0142u\u017conej do o\u015bmiu Dni wygrywa ten, kto prowadzi\u0142 na koniec Dnia 5. Partia zako\u0144czona zbyt ' + - 'wieloma kolizjami jest ostateczna i nie dostaje kolejnego Dnia. A na ko\u0144cu pojawia si\u0119 pe\u0142ny ekran ' + - 'wynik\u00f3w: dlaczego partia si\u0119 sko\u0144czy\u0142a \u2014 s\u0142owami, nie wewn\u0119trznym kodem; kto wygrywa; Przych\u00f3d ' + - 'ka\u017cdego gracza; zasady, wed\u0142ug kt\u00f3rych rozdano gr\u0119; i co kolej naprawd\u0119 zrobi\u0142a, od poci\u0105g\u00f3w przez ' + - 'Dywizj\u0119 i \u0142adunk\u00f3w utworzonych oraz rozformowanych po przewiezionych pasa\u017cer\u00f3w, przetoczone wagony i ' + - 'stracone poci\u0105gi.', + 'Zawiera Station Master v0.7.4 \u2014 trzy poprawki zasad. WA\u017bNE: trwaj\u0105ca partia mo\u017ce nie zosta\u0107 ' + + 'przeniesiona. Te zmiany dotycz\u0105 tego, co zasady dopuszczaj\u0105, wi\u0119c zapisana gra mo\u017ce przesta\u0107 si\u0119 ' + + 'odtwarza\u0107; serwer odmawia wznowienia, zamiast j\u0105 zepsu\u0107, podaje ruch, na kt\u00f3rym stan\u0105\u0142, i zostawia ' + + '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 ' + + 'PROPONOWANE, NIE NARZUCANE. Poci\u0105g towarowy przyje\u017cd\u017caj\u0105cy do twojego okr\u0119gu jest pytany, dok\u0105d ma ' + + '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 ' + + 'czego wcze\u015bniej gra w og\u00f3le nie sprawdza\u0142a. Gdy propozycja nie mo\u017ce pa\u015b\u0107, historia m\u00f3wi dlaczego. ' + + 'NIEKT\u00d3RE POCI\u0104GI DODATKOWE MUSZ\u0104 JECHA\u0106 ZA\u0141ADOWANE. Poci\u0105g cyrkowy, kampanijny i wojskowy bior\u0105 ' + + 'wagony \u0142adowne, dop\u00f3ki stacja mo\u017ce je dostarczy\u0107, potem puste, i mog\u0105 jecha\u0107 niepe\u0142ne. Poci\u0105g ' + + 'cyrkowy lub kampanijny zdobywa punkt za rozstawienie RAZ W OKR\u0118GU KA\u017bDEGO GRACZA, a nie raz na gr\u0119, ' + + '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: - 'Inclut Station Master v0.7.3. Les parties en cours sont conserv\u00e9es : contrairement \u00e0 la v0.7.2, ni ' + - 'le jeu de cartes ni le format de sauvegarde n\u2019ont chang\u00e9. Quand le dernier Jour de l\u2019horaire est ' + - '\u00e9coul\u00e9, la partie pose d\u00e9sormais la question au lieu de s\u2019arr\u00eater : vous pouvez jouer un Jour de ' + - 'plus, et \u00e0 la fin de ce Jour elle repose la question. En multijoueur, tous les joueurs doivent \u00eatre ' + - 'd\u2019accord, et un seul refus y met fin. Le r\u00e9sultat est \u00e9tabli sur la dur\u00e9e INITIALE et ne change ' + - 'jamais : dans une partie de cinq Jours prolong\u00e9e jusqu\u2019\u00e0 huit, le vainqueur reste celui qui menait \u00e0 ' + - 'la fin du Jour 5. Une partie qui se termine sur trop de collisions est d\u00e9finitive et ne se voit ' + - 'proposer aucun Jour suppl\u00e9mentaire. Et la fin d\u2019une partie affiche maintenant un \u00e9cran de r\u00e9sultats ' + - 'complet : pourquoi elle s\u2019est termin\u00e9e, en toutes lettres plut\u00f4t qu\u2019en code interne ; qui gagne ; ' + - 'les Recettes de chaque joueur ; les r\u00e8gles avec lesquelles la partie a \u00e9t\u00e9 distribu\u00e9e ; et ce que le ' + - 'chemin de fer a r\u00e9ellement fait, des trains ayant travers\u00e9 la Division et des chargements form\u00e9s et ' + - 'd\u00e9faits aux voyageurs transport\u00e9s, wagons man\u0153uvr\u00e9s et trains perdus.', + 'Inclut Station Master v0.7.4 \u2014 trois corrections de r\u00e8gles. IMPORTANT : une partie d\u00e9j\u00e0 en cours ' + + 'peut ne pas \u00eatre conserv\u00e9e. Ces changements modifient ce que les r\u00e8gles acceptent, donc une ' + + "sauvegarde peut cesser d'\u00eatre rejouable ; le serveur refuse de la reprendre au lieu de l'ab\u00eemer, " + + "indique le coup o\u00f9 il s'est arr\u00eat\u00e9 et laisse le fichier intact : vous pouvez r\u00e9installer la v0.7.3 " + + 'pour terminer une partie qui compte. LE BUREAU DE TRIAGE EST D\u00c9SORMAIS PROPOS\u00c9, PAS IMPOS\u00c9. Un train ' + + 'de marchandises qui arrive dans votre district se voit demander o\u00f9 aller ; il doit pouvoir atteindre ' + + 'le triage en un seul mouvement, et si des wagons stationnent sur le chemin, il les percute \u2014 rien de ' + + "tout cela n'\u00e9tait v\u00e9rifi\u00e9 auparavant. Quand la proposition ne peut pas \u00eatre faite, l'historique dit " + + 'pourquoi. CERTAINS TRAINS SUPPL\u00c9MENTAIRES DOIVENT ROULER CHARG\u00c9S. Les trains de Cirque, de Campagne ' + + 'et Militaire prennent des wagons charg\u00e9s tant que le d\u00e9p\u00f4t peut en fournir, des vides ensuite, et ' + + "peuvent rouler incomplets. Un train de Cirque ou de Campagne gagne son point d'installation UNE FOIS " + + "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: { /** - * 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 * 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 - * same function for a much worse reason — the deck went from 206 cards to 121, so a card id - * 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. + * WHAT HAS CHANGED IS WHAT THE RULES ACCEPT, and that is what decides whether a save replays. + * v0.7.4 carries three rules corrections, and each can stop an older history: * - * Proven rather than assumed: the upstream suite replays the three recorded games in - * `public/replays`, all made under an older ruleset, and asserts every intent still applies - * (`test/harness.test.ts`). The release notes lead with it, since the last release's notes had - * to lead with the opposite. + * - Red Flags is a different card. `maneuver.redFlags` no longer names a train to protect; it + * names the side of a district to flag. A save containing the old form stops there. + * - Some Extras must now take a loaded car while the yard can supply one, so a make-up that + * 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 }) => {}, down: IMPOSSIBLE, diff --git a/station-master b/station-master index 45580d8..19a6a47 160000 --- a/station-master +++ b/station-master @@ -1 +1 @@ -Subproject commit 45580d8b61bb74917f7df1339c1d7528af3c5277 +Subproject commit 19a6a47ab605a18173a567ca100b1e3c64d71cf2