0.8.0.2:0 — bundle Station Master v0.8.0.2

Playback speed is a control on the play screen now, next to the zoom. It was only
ever settable through the address bar, and arriving from the front page replaces
the query string — so it never took effect for anyone who reached the game the
ordinary way, and a whole session was played at 1x believing it was at 7x.

Also the end-of-Day summary reported "0 today" beside a collision total that
disagreed with it, because the Day had already ticked over by the time it was read.

Release notes updated in all five locales. Still no migration, and this time the
engine IS touched, so the note says why that is still nothing to carry: three added
lines for a counter no predicate reads, and a SavedGame holds { seed, config,
history } rather than a serialised GameState — resuming calls createGame and
replays, so a new field is filled on the way past. Games in progress resume.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X6cF1iYvJ1kNmzYBzu4QX6
This commit is contained in:
Jesse
2026-09-09 20:33:45 -04:00
co-authored by Claude Opus 5
parent 0814b90507
commit d72ad24a17
2 changed files with 60 additions and 15 deletions
+59 -14
View File
@@ -10,10 +10,10 @@ export const current = VersionInfo.of({
// — checked against the SDK's own parser rather than assumed, since every example in `versions.md` // — 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 // 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. // 0.7.9:0 sees this as an update rather than refusing it as a downgrade.
version: '0.8.0.1:0', version: '0.8.0.2:0',
releaseNotes: { releaseNotes: {
en_US: en_US:
'Bundles Station Master v0.8.0.1 — you can watch the other players now. GAMES IN PROGRESS ON ' + 'Bundles Station Master v0.8.0.2 — 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 ' + '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 ' + '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 ' + 'board showed your own Office Area and nobody else’s, and a bot’s whole turn arrived as a ' +
@@ -32,9 +32,15 @@ export const current = VersionInfo.of({
'a player’s last move in a run used to vanish the instant it appeared, snapping the board back ' + '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 ' + '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 ' + 'follow — a bot now announces what it is about to do, and takes a beat over each thing it ' +
'does.', '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".',
es_ES: es_ES:
'Incluye Station Master v0.8.0.1 — ahora puedes ver jugar a los demás. LAS PARTIDAS EN CURSO EN ' + 'Incluye Station Master v0.8.0.2 — 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 ' + '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 ' + '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 ' + 'línea de texto: tu tablero mostraba tu propia Área de Oficina y la de nadie más, y el turno ' +
@@ -54,9 +60,15 @@ export const current = VersionInfo.of({
'movimiento de una serie desaparecía en el instante en que aparecía, devolviendo el tablero a tu ' + '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 ' + '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 ' + 'para seguirlos — ahora un bot anuncia lo que va a hacer y se detiene un momento en cada cosa ' +
'que hace.', '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».',
de_DE: de_DE:
'Enthält Station Master v0.8.0.1 — Sie können den anderen jetzt beim Spielen zusehen. LAUFENDE ' + 'Enthält Station Master v0.8.0.2 — Sie können den anderen jetzt beim Spielen zusehen. LAUFENDE ' +
'PARTIEN AUF DIESEM SERVER SIND NICHT BETROFFEN und werden normal fortgesetzt. Bisher konnte ' + '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 ' + '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 ' + 'Ihrem Bildschirm war eine Textzeile: Ihr Brett zeigte nur Ihren eigenen Dienstbereich und den ' +
@@ -77,9 +89,16 @@ export const current = VersionInfo.of({
'aus der ersten damit gespielten Partie: der letzte Zug einer Folge verschwand in dem Moment, in ' + '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 ' + '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, ' + '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.', '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".',
pl_PL: pl_PL:
'Zawiera Station Master v0.8.0.1 — teraz możesz obserwować grę pozostałych. TRWAJĄCE PARTIE NA ' + 'Zawiera Station Master v0.8.0.2 — 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ł ' + '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 ' + '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 ' + 'tekstu: twoja plansza pokazywała wyłącznie twój własny Obszar Biura i niczyj inny, a cała ' +
@@ -98,9 +117,15 @@ export const current = VersionInfo.of({
'stosunku do v0.8.0, z pierwszej rozegranej na niej partii: ostatni ruch w serii znikał w chwili, ' + '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 ' + '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 ' + '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.', '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".',
fr_FR: fr_FR:
'Contient Station Master v0.8.0.1 — vous pouvez maintenant regarder jouer les autres. LES ' + 'Contient Station Master v0.8.0.2 — vous pouvez maintenant regarder jouer les autres. LES ' +
'PARTIES EN COURS SUR CE SERVEUR NE SONT PAS AFFECTÉES et reprendront normalement. Jusqu’ici ' + '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 ' + '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 ' + 'trace sur votre écran était une ligne de texte : votre plateau ne montrait que votre propre ' +
@@ -121,7 +146,15 @@ export const current = VersionInfo.of({
'la v0.8.0, issues de la première partie jouée avec elle : le dernier coup d’une série ' + '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 ' + '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 ' + '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.', '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 ».',
}, },
migrations: { migrations: {
/** /**
@@ -150,11 +183,23 @@ export const current = VersionInfo.of({
* browser reloads onto the new page as part of the update, so there is no version skew to * 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. * migrate — the same reasoning v0.7.9.8 used for its own `Frame` changes.
* *
* v0.8.0.1 ADDS NOTHING TO THIS ARGUMENT: `git diff v0.8.0..v0.8.0.1 -- src/engine/` is empty. * v0.8.0.1 ADDED NOTHING TO THIS ARGUMENT: `git diff v0.8.0..v0.8.0.1 -- src/engine/` is empty.
* It changes `sim/pacing.ts`, `web/step-queue.ts` and `web/main.ts` — how long a step is shown and * It changed `sim/pacing.ts`, `web/step-queue.ts` and `web/main.ts` — how long a step is shown
* when the queue calls itself idle — which is presentation and touches neither the rules nor * and when the queue calls itself idle — which is presentation and touches neither the rules nor
* anything on disk. * 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.
*
* 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 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`) * 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 * deliberately does not go through `submit()`. So replaying a saved game emits no steps and burns