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