Somewhere to look while another player moves. The Home Office deck is drawn at last — face down with its count, a number the Frame has carried since it existed and nothing ever read — and whichever pile a move just touched lights up for as long as that move is on screen: the deck when somebody draws from it, the Department a card is taken from or discarded onto, the Salvage Yard when a played card ends there. What lights follows what is public, measured across four seeds rather than reasoned about: a card drawn face down stays private and only the deck getting shorter is shown, while a Department pile is face up so the card taken from it is not a secret. Release notes updated in all five locales. Still no migration — git diff v0.8.0.2..v0.8.0.5 -- src/engine/ is empty; the highlight is a diff of two frames the client already holds, so nothing joined the protocol either. Games in progress resume. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X6cF1iYvJ1kNmzYBzu4QX6
265 lines
24 KiB
TypeScript
265 lines
24 KiB
TypeScript
import { IMPOSSIBLE, VersionInfo } from '@start9labs/start-sdk'
|
||
|
||
export const current = VersionInfo.of({
|
||
// `<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
|
||
// action. The downstream half moves only for packaging-only changes, and RESETS to `:0` when the
|
||
// upstream half moves.
|
||
//
|
||
// FOUR COMPONENTS IS FINE. ExVer's upstream half is an arbitrary-length dotted number, not semver
|
||
// — checked against the SDK's own parser rather than assumed, since every example in `versions.md`
|
||
// has three: `0.7.9.8:0` parses to upstream `[0,7,9,8]`, which sorts above `[0,7,9]`, so a box on
|
||
// 0.7.9:0 sees this as an update rather than refusing it as a downgrade.
|
||
version: '0.8.0.5:0',
|
||
releaseNotes: {
|
||
en_US:
|
||
'Bundles Station Master v0.8.0.5 — you can watch the other players now. GAMES IN PROGRESS ON ' +
|
||
'THIS SERVER ARE UNAFFECTED and will resume normally. Until now another player could move a ' +
|
||
'train the length of their district and the only trace on your screen was a line of text: your ' +
|
||
'board showed your own Office Area and nobody else’s, and a bot’s whole turn arrived as a ' +
|
||
'position that had simply changed. Now every move is replayed on your screen in the order it ' +
|
||
'happened. The Office Area follows whoever is acting, so you watch their switching moves step ' +
|
||
'across their board — which is the part worth seeing, and the part reading the history could ' +
|
||
'never convey. A row above the board says how many moves behind you are and counts down, with ' +
|
||
'a Skip button when you would rather not wait; nothing is lost by skipping, since every line ' +
|
||
'is already in the History panel. The automatic phases — New Train, the Mainline, the shift ' +
|
||
'change — used to resolve between one click and the next without ever being drawn, and now ' +
|
||
'take a visible beat when something happens in them and none at all when nothing does. ' +
|
||
'Switching moves in the history finally say who made them and name the train, instead of ' +
|
||
'reading as an anonymous “CREW moved”. Playback speed is a per-player setting and can be ' +
|
||
'turned off entirely — and it now goes both ways, so you can slow it to twice or three times ' +
|
||
'the default if you would rather linger. Fixes over v0.8.0, from the first game played on it: ' +
|
||
'a player’s last move in a run used to vanish the instant it appeared, snapping the board back ' +
|
||
'to your own district before you could look at it, and bot turns went by far too fast to ' +
|
||
'follow — a bot now announces what it is about to do, and takes a beat over each thing it ' +
|
||
'does. **Playback speed is a control on the play screen now**, next to the zoom: press − to ' +
|
||
'watch other players more slowly, all the way to a full minute for one switching turn, or turn ' +
|
||
'it off to have every move drawn at once. It was previously only settable through the address ' +
|
||
'bar, which did not survive arriving from the front page — so it never took effect for anyone ' +
|
||
'who reached the game the ordinary way. Also fixed: the end-of-Day summary reported "0 today" ' +
|
||
'beside a running collision total that disagreed with it, because the Day had already ticked ' +
|
||
'over by the time you read it. It names the Day instead — "2 on Day 1, 2 in all". And from ' +
|
||
'playing that: Skip has moved to the left of the row, where your eye already is; the row says ' +
|
||
'WHO you are waiting on and what they are doing, instead of only how far behind you are; and ' +
|
||
'the speed setting now stretches other players\u2019 moves without stretching the clock, so ' +
|
||
'finishing your own turn no longer leaves you waiting on the phases behind it. And there is ' +
|
||
'somewhere to look: the Home Office deck is drawn at last, face down with its count, and ' +
|
||
'whichever pile a move just touched lights up for as long as that move is on screen — the deck ' +
|
||
'when somebody draws from it, the Department a card is taken from or discarded onto, the ' +
|
||
'Salvage Yard when a played card ends up there. What lights follows what is public: a card ' +
|
||
'drawn face down from the deck stays private, and only the deck getting shorter is shown.',
|
||
es_ES:
|
||
'Incluye Station Master v0.8.0.5 — ahora puedes ver jugar a los demás. LAS PARTIDAS EN CURSO EN ' +
|
||
'ESTE SERVIDOR NO SE VEN AFECTADAS y se reanudarán con normalidad. Hasta ahora otro jugador ' +
|
||
'podía mover un tren a lo largo de todo su distrito y el único rastro en tu pantalla era una ' +
|
||
'línea de texto: tu tablero mostraba tu propia Área de Oficina y la de nadie más, y el turno ' +
|
||
'completo de un bot llegaba como una posición que simplemente había cambiado. Ahora cada ' +
|
||
'movimiento se reproduce en tu pantalla en el orden en que ocurrió. El Área de Oficina sigue a ' +
|
||
'quien está jugando, así que ves sus maniobras avanzar por su tablero, que es lo que merece la ' +
|
||
'pena ver y lo que el historial nunca podía transmitir. Una fila sobre el tablero indica ' +
|
||
'cuántos movimientos llevas de retraso y va descontando, con un botón Saltar por si prefieres ' +
|
||
'no esperar; no se pierde nada al saltar, porque cada línea ya está en el panel de Historial. ' +
|
||
'Las fases automáticas — Tren Nuevo, la Línea Principal, el cambio de turno — se resolvían ' +
|
||
'entre un clic y el siguiente sin dibujarse nunca, y ahora tienen una pausa visible cuando algo ' +
|
||
'ocurre en ellas y ninguna cuando no ocurre nada. Las maniobras en el historial por fin dicen ' +
|
||
'quién las hizo y nombran el tren, en lugar de leerse como un anónimo «CREW moved». La ' +
|
||
'velocidad de reproducción es un ajuste por jugador y se puede desactivar por completo, y ahora ' +
|
||
'funciona en ambos sentidos: puedes ralentizarla al doble o al triple si prefieres detenerte. ' +
|
||
'Correcciones sobre la v0.8.0, salidas de la primera partida jugada con ella: el último ' +
|
||
'movimiento de una serie desaparecía en el instante en que aparecía, devolviendo el tablero a tu ' +
|
||
'propio distrito antes de que pudieras verlo, y los turnos de los bots pasaban demasiado rápido ' +
|
||
'para seguirlos — ahora un bot anuncia lo que va a hacer y se detiene un momento en cada cosa ' +
|
||
'que hace. **La velocidad de reproducción es ahora un control en la pantalla de juego**, junto ' +
|
||
'al zoom: pulsa − para ver a los demás más despacio, hasta un minuto entero para una maniobra, ' +
|
||
'o desactívala para que cada movimiento se dibuje de golpe. Antes solo se podía ajustar desde ' +
|
||
'la barra de direcciones, y eso no sobrevivía al entrar desde la página inicial, así que nunca ' +
|
||
'surtía efecto para quien llegaba al juego por el camino normal. También corregido: el resumen ' +
|
||
'de fin de Día decía «0 hoy» junto a un total de colisiones que lo contradecía, porque el Día ' +
|
||
'ya había cambiado cuando lo leías. Ahora nombra el Día: «2 en el Día 1, 2 en total». Y a raíz ' +
|
||
'de jugarlo: Saltar se ha movido a la izquierda de la fila, donde ya está tu mirada; la fila ' +
|
||
'dice a QUIÉN estás esperando y qué está haciendo, en vez de sólo cuánto te falta; y el ajuste ' +
|
||
'de velocidad alarga ahora los movimientos de los demás sin alargar el reloj, así que terminar ' +
|
||
'tu turno ya no te deja esperando las fases que vienen detrás. Y ahora hay dónde mirar: por fin ' +
|
||
'se dibuja el mazo de la Oficina Central, boca abajo y con su recuento, y la pila que acaba de ' +
|
||
'tocar un movimiento se ilumina mientras ese movimiento está en pantalla: el mazo cuando ' +
|
||
'alguien roba de él, el Departamento del que se toma o en el que se descarta una carta, el ' +
|
||
'Depósito de Chatarra cuando allí acaba una carta jugada. Lo que se ilumina respeta lo que es ' +
|
||
'público: una carta robada boca abajo del mazo sigue siendo privada, y sólo se muestra que el ' +
|
||
'mazo mengua.',
|
||
de_DE:
|
||
'Enthält Station Master v0.8.0.5 — Sie können den anderen jetzt beim Spielen zusehen. LAUFENDE ' +
|
||
'PARTIEN AUF DIESEM SERVER SIND NICHT BETROFFEN und werden normal fortgesetzt. Bisher konnte ' +
|
||
'ein anderer Spieler einen Zug durch sein ganzes Revier bewegen, und die einzige Spur auf ' +
|
||
'Ihrem Bildschirm war eine Textzeile: Ihr Brett zeigte nur Ihren eigenen Dienstbereich und den ' +
|
||
'von niemandem sonst, und der komplette Zug eines Bots erschien als eine Stellung, die sich ' +
|
||
'einfach geändert hatte. Jetzt wird jeder Zug auf Ihrem Bildschirm in der Reihenfolge ' +
|
||
'wiedergegeben, in der er geschah. Der Dienstbereich folgt demjenigen, der am Zug ist, sodass ' +
|
||
'Sie seine Rangierbewegungen über sein Brett wandern sehen — das ist der sehenswerte Teil und ' +
|
||
'der, den das Protokoll nie vermitteln konnte. Eine Zeile über dem Brett zeigt, wie viele Züge ' +
|
||
'Sie im Rückstand sind, und zählt herunter, mit einer Überspringen-Schaltfläche, wenn Sie ' +
|
||
'nicht warten möchten; dabei geht nichts verloren, denn jede Zeile steht schon im Protokoll. ' +
|
||
'Die automatischen Phasen — Neuer Zug, die Hauptstrecke, der Schichtwechsel — liefen zwischen ' +
|
||
'einem Klick und dem nächsten ab, ohne je gezeichnet zu werden, und halten nun sichtbar inne, ' +
|
||
'wenn darin etwas passiert, und gar nicht, wenn nichts passiert. Rangierbewegungen im ' +
|
||
'Protokoll nennen endlich den Spieler und den Zug, statt als anonymes „CREW moved“ zu ' +
|
||
'erscheinen. Die Wiedergabegeschwindigkeit ist eine Einstellung pro Spieler und lässt sich ' +
|
||
'ganz abschalten — und sie wirkt jetzt in beide Richtungen, sodass Sie sie auf das Doppelte ' +
|
||
'oder Dreifache verlangsamen können, wenn Sie lieber verweilen. Korrekturen gegenüber v0.8.0, ' +
|
||
'aus der ersten damit gespielten Partie: der letzte Zug einer Folge verschwand in dem Moment, in ' +
|
||
'dem er erschien, und das Brett sprang zu Ihrem eigenen Revier zurück, bevor Sie hinsehen ' +
|
||
'konnten; und Bot-Züge liefen viel zu schnell ab, um ihnen zu folgen — ein Bot kündigt jetzt an, ' +
|
||
'was er vorhat, und hält bei jedem Schritt kurz inne. **Die Wiedergabegeschwindigkeit ist jetzt ' +
|
||
'ein Bedienelement im Spielbildschirm**, neben dem Zoom: mit − sehen Sie den anderen langsamer ' +
|
||
'zu, bis zu einer ganzen Minute für einen Rangiervorgang, oder Sie schalten sie aus, damit jeder ' +
|
||
'Zug auf einmal gezeichnet wird. Bisher war sie nur über die Adresszeile einstellbar, was den ' +
|
||
'Weg über die Startseite nicht überlebte — für jeden, der das Spiel auf dem normalen Weg ' +
|
||
'erreichte, wirkte sie also nie. Ebenfalls behoben: die Tagesabschluss-Übersicht meldete „0 ' +
|
||
'heute" neben einer Kollisionssumme, die dem widersprach, weil der Tag beim Lesen schon ' +
|
||
'umgeschlagen war. Sie nennt jetzt den Tag: „2 an Tag 1, 2 insgesamt". Und aus dem Spielen ' +
|
||
'heraus: Überspringen sitzt jetzt links in der Zeile, wo Ihr Blick ohnehin ist; die Zeile sagt, ' +
|
||
'auf WEN Sie warten und was er tut, statt nur wie weit Sie zurück sind; und die ' +
|
||
'Geschwindigkeit dehnt die Züge der anderen, ohne die Uhr mitzudehnen — nach Ihrem eigenen Zug ' +
|
||
'warten Sie also nicht mehr auf die Phasen dahinter. Und es gibt jetzt etwas anzusehen: der ' +
|
||
'Stapel der Hauptverwaltung wird endlich gezeichnet, verdeckt und mit seiner Anzahl, und der ' +
|
||
'Stapel, den ein Zug gerade berührt hat, leuchtet so lange, wie dieser Zug zu sehen ist — der ' +
|
||
'Stapel, wenn jemand daraus zieht, die Abteilung, aus der eine Karte genommen oder auf die ' +
|
||
'abgeworfen wird, der Schrottplatz, wenn dort eine gespielte Karte landet. Was leuchtet, folgt ' +
|
||
'dem, was öffentlich ist: eine verdeckt gezogene Karte bleibt privat, gezeigt wird nur, dass ' +
|
||
'der Stapel kürzer wird.',
|
||
pl_PL:
|
||
'Zawiera Station Master v0.8.0.5 — teraz możesz obserwować grę pozostałych. TRWAJĄCE PARTIE NA ' +
|
||
'TYM SERWERZE NIE SĄ NARUSZONE i zostaną normalnie wznowione. Do tej pory inny gracz mógł ' +
|
||
'przeprowadzić pociąg przez cały swój okręg, a jedynym śladem na twoim ekranie była linijka ' +
|
||
'tekstu: twoja plansza pokazywała wyłącznie twój własny Obszar Biura i niczyj inny, a cała ' +
|
||
'tura bota pojawiała się jako pozycja, która po prostu się zmieniła. Teraz każdy ruch jest ' +
|
||
'odtwarzany na twoim ekranie w kolejności, w jakiej nastąpił. Obszar Biura podąża za tym, kto ' +
|
||
'wykonuje ruch, więc widzisz, jak jego manewry przesuwają się po jego planszy — a to właśnie ' +
|
||
'warto zobaczyć i tego historia nigdy nie potrafiła przekazać. Wiersz nad planszą pokazuje, o ' +
|
||
'ile ruchów jesteś z tyłu, i odlicza, z przyciskiem Pomiń, jeśli wolisz nie czekać; pominięcie ' +
|
||
'nic nie kosztuje, bo każda linijka jest już w panelu Historii. Fazy automatyczne — Nowy ' +
|
||
'Pociąg, Linia Główna, zmiana warty — rozstrzygały się między jednym kliknięciem a drugim, ' +
|
||
'nigdy nie będąc narysowane, a teraz zatrzymują się na widoczną chwilę, gdy coś się w nich ' +
|
||
'dzieje, i wcale, gdy nic się nie dzieje. Manewry w historii wreszcie mówią, kto je wykonał, i ' +
|
||
'nazywają pociąg, zamiast brzmieć jak anonimowe „CREW moved”. Szybkość odtwarzania jest ' +
|
||
'ustawieniem dla każdego gracza osobno i można ją całkiem wyłączyć — a teraz działa w obie ' +
|
||
'strony, więc możesz ją zwolnić dwu- lub trzykrotnie, jeśli wolisz się zatrzymać. Poprawki w ' +
|
||
'stosunku do v0.8.0, z pierwszej rozegranej na niej partii: ostatni ruch w serii znikał w chwili, ' +
|
||
'gdy się pojawiał, a plansza wracała do twojego własnego okręgu, zanim zdążyłeś spojrzeć; tury ' +
|
||
'botów przebiegały o wiele za szybko, by dało się je śledzić — teraz bot zapowiada, co zamierza ' +
|
||
'zrobić, i zatrzymuje się na chwilę przy każdej czynności. **Szybkość odtwarzania jest teraz ' +
|
||
'sterowana na ekranie gry**, obok powiększenia: naciśnij −, aby obserwować pozostałych wolniej, ' +
|
||
'aż do całej minuty na jeden manewr, albo wyłącz ją, by każdy ruch był rysowany od razu. ' +
|
||
'Wcześniej dawała się ustawić tylko z paska adresu, co nie przetrwało wejścia ze strony ' +
|
||
'startowej — więc dla każdego, kto trafiał do gry zwykłą drogą, nigdy nie działała. Poprawiono ' +
|
||
'także: podsumowanie końca Dnia pokazywało „0 dzisiaj" obok sumy kolizji, która temu przeczyła, ' +
|
||
'bo Dzień już się przewinął, gdy je czytałeś. Teraz nazywa Dzień: „2 w Dniu 1, 2 łącznie". A z ' +
|
||
'samej gry: Pomiń przeniesiono na lewą stronę wiersza, tam gdzie i tak patrzysz; wiersz mówi, na ' +
|
||
'KOGO czekasz i co robi, a nie tylko o ile jesteś z tyłu; a ustawienie szybkości wydłuża teraz ' +
|
||
'ruchy innych, nie wydłużając zegara — po własnej turze nie czekasz już na fazy za nią. I jest ' +
|
||
'wreszcie na co patrzeć: talia Centrali jest w końcu narysowana, zakryta i z liczbą kart, a ' +
|
||
'stos, którego właśnie dotknął ruch, podświetla się na tak długo, jak długo ten ruch jest na ' +
|
||
'ekranie — talia, gdy ktoś z niej dobiera, Dział, z którego bierze się kartę lub na który się ' +
|
||
'ją odrzuca, Złomowisko, gdy trafia tam zagrana karta. To, co się świeci, idzie za tym, co ' +
|
||
'jawne: karta dobrana zakryta z talii pozostaje prywatna, widać tylko, że talia maleje.',
|
||
fr_FR:
|
||
'Contient Station Master v0.8.0.5 — vous pouvez maintenant regarder jouer les autres. LES ' +
|
||
'PARTIES EN COURS SUR CE SERVEUR NE SONT PAS AFFECTÉES et reprendront normalement. Jusqu’ici ' +
|
||
'un autre joueur pouvait déplacer un train sur toute la longueur de son district et la seule ' +
|
||
'trace sur votre écran était une ligne de texte : votre plateau ne montrait que votre propre ' +
|
||
'Zone de Bureau et celle de personne d’autre, et le tour entier d’un bot arrivait comme une ' +
|
||
'position qui avait simplement changé. Désormais chaque coup est rejoué sur votre écran dans ' +
|
||
'l’ordre où il a eu lieu. La Zone de Bureau suit celui qui joue, si bien que vous voyez ses ' +
|
||
'manœuvres progresser sur son plateau — c’est la partie qui vaut d’être vue, et celle que lire ' +
|
||
'l’historique ne pouvait jamais rendre. Une ligne au-dessus du plateau indique de combien de ' +
|
||
'coups vous êtes en retard et décompte, avec un bouton Passer si vous préférez ne pas ' +
|
||
'attendre ; rien n’est perdu en passant, puisque chaque ligne est déjà dans le panneau ' +
|
||
'Historique. Les phases automatiques — Nouveau Train, la Grande Ligne, la relève — se ' +
|
||
'résolvaient entre un clic et le suivant sans jamais être dessinées, et marquent maintenant un ' +
|
||
'temps visible quand quelque chose s’y produit, et aucun quand rien ne s’y produit. Les ' +
|
||
'manœuvres dans l’historique disent enfin qui les a faites et nomment le train, au lieu de se ' +
|
||
'lire comme un « CREW moved » anonyme. La vitesse de relecture est un réglage par joueur et ' +
|
||
'peut être entièrement désactivée — et elle joue maintenant dans les deux sens, vous pouvez donc ' +
|
||
'la ralentir au double ou au triple si vous préférez prendre le temps. Corrections par rapport à ' +
|
||
'la v0.8.0, issues de la première partie jouée avec elle : le dernier coup d’une série ' +
|
||
'disparaissait à l’instant où il apparaissait, ramenant le plateau à votre propre district avant ' +
|
||
'que vous puissiez le voir, et les tours des bots défilaient bien trop vite pour être suivis — un ' +
|
||
'bot annonce désormais ce qu’il va faire et marque un temps sur chacune de ses actions. **La ' +
|
||
'vitesse de relecture est maintenant un réglage sur l’écran de jeu**, à côté du zoom : appuyez ' +
|
||
'sur − pour regarder les autres plus lentement, jusqu’à une minute entière pour une manœuvre, ' +
|
||
'ou désactivez-la pour que chaque coup soit dessiné d’un coup. Elle ne se réglait auparavant ' +
|
||
'que depuis la barre d’adresse, ce qui ne survivait pas à l’arrivée depuis la page d’accueil — ' +
|
||
'elle n’a donc jamais pris effet pour quiconque atteignait le jeu par le chemin normal. Corrigé ' +
|
||
'aussi : le récapitulatif de fin de Journée affichait « 0 aujourd’hui » à côté d’un total de ' +
|
||
'collisions qui le contredisait, la Journée ayant déjà tourné au moment de la lecture. Il nomme ' +
|
||
'la Journée : « 2 le Jour 1, 2 en tout ». Et à l’usage : Passer est désormais à gauche de la ' +
|
||
'ligne, là où se porte déjà le regard ; la ligne dit QUI vous attendez et ce qu’il fait, et pas ' +
|
||
'seulement de combien vous êtes en retard ; et le réglage de vitesse étire les coups des autres ' +
|
||
'sans étirer l’horloge, si bien qu’après votre propre tour vous n’attendez plus les phases qui ' +
|
||
'le suivent. Et il y a enfin où regarder : la pioche de la Direction est dessinée, face cachée ' +
|
||
'avec son compte, et la pile qu’un coup vient de toucher s’allume tant que ce coup est à ' +
|
||
'l’écran — la pioche quand quelqu’un y prend une carte, le Département d’où une carte est tirée ' +
|
||
'ou sur lequel elle est défaussée, la Casse quand une carte jouée y aboutit. Ce qui s’allume ' +
|
||
'suit ce qui est public : une carte piochée face cachée reste privée, et seule la pioche qui ' +
|
||
'raccourcit est montrée.',
|
||
},
|
||
migrations: {
|
||
/**
|
||
* NOTHING TO CARRY, AND CHECKED THE SAME NARROW WAY v0.7.9.8's ENTRY WAS.
|
||
*
|
||
* The rule this package lives by is in the game's README: a save is a seed plus the moves
|
||
* played, replayed through the CURRENT rules, so the only thing that strands an older save is a
|
||
* change that makes a once-legal move illegal. So the question is never "how big was the
|
||
* release" — v0.8.0 is a large one — but "did any predicate change its answer".
|
||
*
|
||
* Measured with `git diff v0.7.9.8..v0.8.0.1 -- src/engine/`. The WHOLE engine diff is eight
|
||
* lines:
|
||
* four `GameEvent` types (`trayMoved`, `carsCoupled`, `carsDropped`, `consistSorted`) gained a
|
||
* `player` field, and the four places that build them pass it. `check()` is untouched, `legal.ts`
|
||
* and `advance.ts` are untouched, and no predicate anywhere was edited. Games in progress resume,
|
||
* and the release notes say so in all five locales rather than leaving it to be discovered.
|
||
*
|
||
* EVENTS ARE NOT PERSISTED, so widening four of them cannot invalidate anything on disk: a
|
||
* `SavedGame` is `{ seed, config, history: Intent[], … }` and the events are derived by replaying
|
||
* it. The narration TEXT of two lines changed with them ("Moved Train 3 …" where it used to read
|
||
* "CREW moved …"), which a resumed game simply regenerates — the log is not stored either.
|
||
*
|
||
* WHAT IS NOT COVERED BY THAT ARGUMENT, and why it still does not need a migration: the wire
|
||
* between this server and a browser gained a lot. `Push` now carries ordered presentation steps
|
||
* and a public-board baseline, and the board deltas changed shape. None of it is on disk, and a
|
||
* browser reloads onto the new page as part of the update, so there is no version skew to
|
||
* migrate — the same reasoning v0.7.9.8 used for its own `Frame` changes.
|
||
*
|
||
* v0.8.0.1 ADDED NOTHING TO THIS ARGUMENT: `git diff v0.8.0..v0.8.0.1 -- src/engine/` is empty.
|
||
* It changed `sim/pacing.ts`, `web/step-queue.ts` and `web/main.ts` — how long a step is shown
|
||
* and when the queue calls itself idle — which is presentation and touches neither the rules nor
|
||
* anything on disk.
|
||
*
|
||
* v0.8.0.2 DOES TOUCH THE ENGINE, and it is worth being exact about why that is still nothing to
|
||
* migrate. `git diff v0.8.0.1..v0.8.0.2 -- src/engine/` is three added lines: `collisionsPrevDay`
|
||
* declared on `GameState`, initialised to 0 in `setup.ts`, and assigned at the Day rollover in
|
||
* `advance.ts`. It is a counter that nothing checks — no predicate reads it, so no once-legal move
|
||
* became illegal.
|
||
*
|
||
* v0.8.0.3 THROUGH v0.8.0.5 ADD NOTHING AGAIN: `git diff v0.8.0.2..v0.8.0.5 -- src/engine/` is empty.
|
||
* One moved the Skip button, changed what the waiting row says, and stopped the speed control
|
||
* stretching the clock; one took a hostname out of comments; the last drew the Home Office deck
|
||
* and lit the pile a watched move touched, which is a diff of two frames the client already
|
||
* holds. None of it is a rule, and none of it is on disk.
|
||
*
|
||
* A NEW STATE FIELD CANNOT STRAND A SAVE HERE, which is the property worth naming rather than
|
||
* re-deriving: a `SavedGame` holds `{ seed, config, history }` and NOT a serialised `GameState`.
|
||
* Resuming calls `createGame` — which fills the new field from `setup.ts` — and then replays the
|
||
* intents through the current rules, so the field is populated on the way past. There is no old
|
||
* shape on disk for a new field to be missing from.
|
||
*
|
||
* THE ONE THING THAT WOULD HAVE NEEDED CARE, had it been built the way the plan first described:
|
||
* the display-step collector runs inside `submit()`, and the resume path (`fromMultiplayerSave`)
|
||
* deliberately does not go through `submit()`. So replaying a saved game emits no steps and burns
|
||
* no sequence numbers. A test in the game pins that, because it is a property rather than an
|
||
* accident.
|
||
*/
|
||
up: async ({ effects }) => {},
|
||
down: IMPOSSIBLE,
|
||
},
|
||
})
|