Files
station-master-startos/startos/versions/current.ts
T
JesseandClaude Opus 5 cf148129d7 0.8.0.4:0 — bundle Station Master v0.8.0.4
Skip moved to the left of the waiting row, where the eye already is. The row now
says who you are waiting on and what they are doing, rather than only how far
behind you are — half the waiting is automatic phases, which narrate as "Mainline"
and answer nobody's question about who is acting. And the speed setting stretches
other players' moves without stretching the clock, so finishing your own turn no
longer leaves you waiting on the phases behind it.

Plus housekeeping: the test server's hostname is out of the tracked comments and
docs, both repositories being publicly clonable.

Release notes updated in all five locales. Still no migration —
git diff v0.8.0.2..v0.8.0.4 -- src/engine/ is empty. Games in progress resume.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X6cF1iYvJ1kNmzYBzu4QX6
2026-09-09 21:46:11 -04:00

236 lines
21 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.4:0',
releaseNotes: {
en_US:
'Bundles Station Master v0.8.0.4 — 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.',
es_ES:
'Incluye Station Master v0.8.0.4 — 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.',
de_DE:
'Enthält Station Master v0.8.0.4 — 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.',
pl_PL:
'Zawiera Station Master v0.8.0.4 — 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ą.',
fr_FR:
'Contient Station Master v0.8.0.4 — 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.',
},
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 AND v0.8.0.4 ADD NOTHING AGAIN: `git diff v0.8.0.2..v0.8.0.4 -- src/engine/` is empty.
* One moved the Skip button, changed what the waiting row says, and stopped the speed control
* stretching the clock; the other took a hostname out of comments. Neither is a rule.
*
* 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,
},
})