diff --git a/README.md b/README.md index 96e9523..6142be6 100644 --- a/README.md +++ b/README.md @@ -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 — 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 -caboose again (a caboose carries the crew, so it is never a load); the end of a Day is a modal -carrying the standings, the Days left and the combined target, because a Day turns over inside the -automatic phases and used to pass unremarked; a Timetabled train may be discarded to a Department -pile for a rival to pick up, governed by a new `discardTimetabled` New Game setting that is on by -default, while an Extra never may; and a blocked passenger platform now reports its reason — the -coach shortage behind Gitea#2 is a ruled-in part of the game, and what was actually broken was the -silence. **Games in progress survive this update**: all three engine-visible changes only WIDEN what -is legal, so every intent a 0.7.0 game recorded still replays, and the server resumes a save by -replaying it rather than by comparing version strings. +**Bundled version: 0.7.2.** Two engine bugs and two rules corrections on top of 0.7.1. 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 driving away and leaving it standing (Gitea#17). The card +deck is the published counts exactly — which halves the track and removes two long-standing density +multipliers, taking the deck from 206 cards to 121 (Gitea#14). 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 a train's Fast/Slow rating now matters on the Hilly card alone +(Gitea#3). And the Division map is drawn as a single row read left to right, so east is always to the +right (Gitea#18). + +**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 (Solitaire, Co-op, Competitive, Cutthroat) plus Custom, offers the whole rule set for reading before diff --git a/instructions.md b/instructions.md index 9015ab9..a8250f4 100644 --- a/instructions.md +++ b/instructions.md @@ -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 game Custom — the targets re-derive from them. -**What changed in 0.7.1.** Three things you will see at the table. The **end of a Day now stops and -says so** — a dialog with the standings, how many Days are left and the combined target, because a -Day used to turn over inside the phases that run themselves and pass between one click and the next. -A **Timetabled train may now be thrown away**: toss it face-up to a Department slot and a rival may -pick it up. That is a New Game setting (*A Timetabled train may be discarded*, on by default) — turn -it off and a train card can only ever be played onto the timetable. An **Extra is never discardable** -either way. And a **platform where nothing can be worked now tells you why** — no train for the -passengers waiting, a train whose card bars Porters, coaches already full, the same-district rule, or -the Division Yard being out of coaches, in which case it says how many are stranded in the -Classification Yard and what brings them back. Running out of coaches is part of the game, not a -fault; what was missing was the explanation. +**What changed in 0.7.2.** First, the thing to know before you update: **a game already in progress +will not carry over.** The card deck has changed size, so a game saved under 0.7.1 can no longer be +replayed, and the server declines to resume one rather than breaking it — it says which move it +stopped at and leaves the save file alone. If you are mid-game and want to finish it, do that before +updating, or put 0.7.1 back on afterwards. + +At the table, three things look different. **Crossing a Mainline card is quicker, and counted +differently**: the speed sign printed on the card was always just scenery, and what decides the time +is the number of regions drawn on it — Plains and Double Track one, Curves and Tunnel two, Heavy +Grade three unless you have Helpers or Brakeman on it. A train's **Fast/Slow rating only matters on +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 mis-join or somebody who wanders off no longer blocks a table that cannot start until every seat is diff --git a/startos/versions/current.ts b/startos/versions/current.ts index 348ee36..761b7cb 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -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 // upstream half moves — v0.7.0 ended on `:3` only because three test packs were played before it // was released. - version: '0.7.1:0', + version: '0.7.2:0', releaseNotes: { en_US: - 'Bundles Station Master v0.7.1, four fixes from playtesting. A train restricted to empties can ' + - 'couple its caboose again — a caboose carries the crew, not freight, so it was never a load. ' + - 'The end of a Day now stops and says so, with the standings and how long is left, instead of ' + - 'passing between one click and the next. A Timetabled train may be thrown away to a Department ' + - 'slot for a rival to pick up, which is a New Game setting you can turn off; an Extra still ' + - 'cannot. And a platform where nothing can be worked now says why, including when the coaches ' + - 'have run out and what brings them back.', + 'Bundles Station Master v0.7.2. IMPORTANT — GAMES IN PROGRESS DO NOT CARRY OVER: the deck has ' + + 'changed size, so a game saved under v0.7.1 no longer replays. The server refuses to resume ' + + 'one rather than breaking it, says which move it stopped at, and leaves the file untouched, so ' + + 'you can put v0.7.1 back on to finish a game you care about. Crossing a Mainline card is now ' + + 'counted in the regions printed on it rather than the speed sign, which was only ever scenery ' + + '— most trains cross faster, slow trains much faster, and a train\u2019s Fast/Slow rating now ' + + '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: - 'Incluye Station Master v0.7.1, cuatro correcciones surgidas de las partidas de prueba. Un tren ' + - 'limitado a vagones vacíos vuelve a poder enganchar su furgón de cola: lleva a la tripulación, ' + - 'no carga, así que nunca fue una carga. El final de cada Día se detiene y lo anuncia, con la ' + - 'clasificación y lo que queda por jugar, en vez de pasar entre un clic y el siguiente. Un tren ' + - 'con horario puede descartarse a una casilla de Departamento para que otro lo recoja — es una ' + - 'opción de partida nueva que puedes desactivar —; un Extra sigue sin poder. Y un andén donde no ' + - 'se puede trabajar ahora explica por qué, incluso cuando se han agotado los coches y qué los ' + - 'devuelve.', + 'Incluye Station Master v0.7.2. IMPORTANTE: LAS PARTIDAS EN CURSO NO SE CONSERVAN. La baraja ha ' + + 'cambiado de tama\u00f1o, as\u00ed que una partida guardada con la v0.7.1 ya no se puede ' + + 'reproducir. 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.1 ' + + 'para terminar una partida que te importe. Cruzar una carta de L\u00ednea Principal se cuenta ' + + 'ahora por las regiones impresas en ella y no por la se\u00f1al de velocidad, que siempre fue ' + + 'decorativa: casi todos los trenes cruzan m\u00e1s r\u00e1pido, los lentos mucho m\u00e1s, y ' + + '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: - 'Enthält Station Master v0.7.1 mit vier Korrekturen aus dem Spieltest. Ein Zug, der nur Leerwagen ' + - 'aufnehmen darf, kann seinen Kabuse wieder ankuppeln — ein Kabuse trägt die Mannschaft, keine ' + - 'Fracht, war also nie eine Ladung. Das Ende eines Tages hält jetzt an und sagt es, mit dem Stand ' + - 'und der verbleibenden Zeit, statt zwischen zwei Klicks zu verstreichen. Ein fahrplanmäßiger Zug ' + - 'darf auf ein Abteilungsfeld abgeworfen werden, wo ein Mitspieler ihn aufnehmen kann — eine neue ' + - 'Spieleinstellung, die sich abschalten lässt; ein Extrazug weiterhin nicht. Und ein Bahnsteig, an ' + - 'dem nichts geht, nennt jetzt den Grund, auch wenn die Wagen ausgegangen sind und was sie ' + - 'zurückbringt.', + 'Enth\u00e4lt Station Master v0.7.2. WICHTIG \u2014 LAUFENDE PARTIEN GEHEN NICHT MIT: Das Deck ' + + 'hat seine Gr\u00f6\u00dfe ge\u00e4ndert, daher l\u00e4sst sich ein unter v0.7.1 ' + + 'gespeichertes Spiel nicht mehr nachspielen. 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.1 zu Ende. Die ' + + '\u00dcberquerung einer Streckenkarte z\u00e4hlt jetzt die darauf gedruckten Regionen statt ' + + 'des Tempo-Schilds, das immer nur Kulisse war: Die meisten Z\u00fcge sind schneller dr\u00fcben, ' + + '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: - 'Zawiera Station Master v0.7.1 z czterema poprawkami z testów. Pociąg ograniczony do pustych ' + - 'wagonów znowu może podpiąć swój służbowy — wiezie załogę, nie ładunek, więc nigdy ' + - 'ładunkiem nie był. Koniec Dnia zatrzymuje się i to ogłasza, z wynikami i tym, ile zostało, ' + - 'zamiast przemykać między jednym kliknięciem a drugim. Pociąg rozkładowy można odrzucić na ' + - 'pole Wydziału, skąd weźmie go rywal — to nowe ustawienie gry, które można wyłączyć; ' + - 'Dodatkowy nadal nie. A peron, na którym nic się nie da zrobić, mówi teraz dlaczego — także ' + - 'wtedy, gdy skończyły się wagony, i co je przywraca.', + 'Zawiera Station Master v0.7.2. WA\u017bNE \u2014 TRWAJ\u0104CE PARTIE NIE ZOSTAJ\u0104 ' + + 'PRZENIESIONE: talia zmieni\u0142a rozmiar, wi\u0119c gra zapisana w v0.7.1 nie da si\u0119 ' + + 'ju\u017c odtworzy\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.1 i doko\u0144czy\u0107 wa\u017cn\u0105 parti\u0119. ' + + 'Przejazd przez kart\u0119 Magistrali liczy si\u0119 teraz wed\u0142ug wydrukowanych na niej ' + + '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: - 'Inclut Station Master v0.7.1, quatre corrections issues des parties d’essai. Un train limité aux ' + - 'wagons vides peut de nouveau atteler son fourgon de queue : il transporte l’équipe, pas du fret, ' + - 'il n’a donc jamais été un chargement. La fin d’une Journée s’arrête et l’annonce, avec le ' + - 'classement et ce qu’il reste à jouer, au lieu de passer entre deux clics. Un train à horaire ' + - 'peut être jeté sur une case de Département où un rival peut le reprendre — un nouveau réglage ' + - 'de partie, désactivable ; un Extra ne le peut toujours pas. Et un quai où rien ne peut être ' + - 'fait en donne désormais la raison, y compris quand les voitures sont épuisées et ce qui les ' + - 'ramène.', + 'Inclut Station Master v0.7.2. IMPORTANT \u2014 LES PARTIES EN COURS NE SONT PAS ' + + 'CONSERV\u00c9ES : la taille du jeu de cartes a chang\u00e9, donc une partie sauvegard\u00e9e ' + + 'sous v0.7.1 ne peut plus \u00eatre rejou\u00e9e. Le serveur refuse de la reprendre au lieu de ' + + 'l\u2019ab\u00eemer, indique le coup o\u00f9 il s\u2019est arr\u00eat\u00e9 et laisse le ' + + 'fichier intact : vous pouvez r\u00e9installer la v0.7.1 pour terminer une partie qui compte. ' + + 'La travers\u00e9e d\u2019une carte de Ligne Principale se compte d\u00e9sormais en r\u00e9gions ' + + 'imprim\u00e9es sur la carte plut\u00f4t qu\u2019au panneau de vitesse, qui n\u2019a jamais ' + + '\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: { - // NOTHING TO CARRY FROM 0.7.0. The three engine-visible changes all WIDEN what is legal — a - // caboose may now be coupled by an empties-only train, and a Timetabled train may now be - // discarded — so every intent a 0.7.0 game recorded is still accepted. The server resumes a - // saved game by REPLAYING it rather than by comparing version strings (`src/server/index.ts`), - // so games in progress survive this update rather than being set aside. + /** + * STILL NOTHING TO CARRY, AND THIS TIME THAT IS NOT THE WHOLE STORY. + * + * 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. + * + * 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 }) => {}, down: IMPOSSIBLE, }, diff --git a/station-master b/station-master index 4414476..2ab25e3 160000 --- a/station-master +++ b/station-master @@ -1 +1 @@ -Subproject commit 441447648db48717b51ec1fd085a8a47c4749237 +Subproject commit 2ab25e320c8575b1a233def40dd26f833b119fca