0.8.0.12:0 — bundle Station Master v0.8.0.12, and a Restore a Seat action
A player who has lost their browser storage can be put back in their seat (Gitea#33 in the game repo). The session token is the only identity the game has and it lives in one browser's localStorage, scoped to the origin joined at, so a cleared profile, a private window or a different browser locks a player out of a game that is still running with their session still on disk. Seen at a real table: of two humans in one game, the host reloaded straight back in and the joiner met an empty lobby. New action, restore-seat: pick a seat from a dropdown of the players actually holding a session — bots never appear, since seatedPlayers is read from the server's session map rather than guessed from display names — and get back a link built from this interface's own address. serverApi gained mintClaim; the dictionary gained 57-64 in all five locales. THE LINK CARRIES A CODE, NOT THE TOKEN. lobby-and-sessions.md §1 says to keep the token out of URLs so it is not shoulder-surfed or pasted into a chat, and a recovery link is exactly what gets pasted into a chat. The code is single-use, expires in 30 minutes, and the page trades it for the real token over a POST. Minting is admin-gated because deciding that somebody has lost a seat is a judgement no route can make safely; spending needs no secret, because the player following the link holds none. GAMES IN PROGRESS RESUME NORMALLY, measured rather than assumed: `git diff v0.8.0.11..v0.8.0.12 -- src/engine/` is EMPTY. The release is the server's HTTP surface, the client and the docs. The codes live in memory and are deliberately not persisted, so nothing new reaches the volume and there is nothing to migrate. README, instructions.md and the release notes in all five locales say so. NOT YET EXERCISED END TO END: the two routes and the action are typechecked and the claim store is unit-tested, but nothing has run them against a live server. This build is what makes that possible. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017nnuCv8UodHucFfx3LWEoX
This commit is contained in:
+86
-106
@@ -10,118 +10,84 @@ export const current = VersionInfo.of({
|
||||
// — 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.11:0',
|
||||
version: '0.8.0.12:0',
|
||||
releaseNotes: {
|
||||
en_US:
|
||||
'Bundles Station Master v0.8.0.11 — sixteen fixes from the second multiplayer playtest. ' +
|
||||
'**Games already running on this server resume normally.** No rule changed: the whole engine ' +
|
||||
'difference is one field added to one event and one card description reworded, so nothing ' +
|
||||
'that was legal has become illegal. **Making up a train is far clearer.** The panel now says ' +
|
||||
'what the train STILL needs rather than only what its card calls for, says that you add ONE ' +
|
||||
'car before the round passes to the next player, marks the train being loaded on the Division ' +
|
||||
'map, and highlights the cars you may add in the same amber every other button uses — the ' +
|
||||
'cars in the Division Yard have always been the buttons, but they did not look like it. **A ' +
|
||||
'train’s arrival now says whose Office it reached**, and no longer tells every player they ' +
|
||||
'can work it when it is standing in somebody else’s district. **While your board catches up** ' +
|
||||
'on other players’ moves you can now PAUSE it and look as long as you like — a paused move ' +
|
||||
'keeps the time it had left — and you can open any other player’s Office Area for a look. The ' +
|
||||
'Day, Stage and phase on screen now match the move you are watching instead of running ahead ' +
|
||||
'of it, so being five moves behind looks the same everywhere on the page. When nobody is ' +
|
||||
'being waited on, the screen says what the Division is doing — “the Division is moving ' +
|
||||
'trains” — instead of “waiting on nobody”. **Saved games download named after the game**, ' +
|
||||
'with the join code, Day and Stage in the filename. Also: the LIMITS sign is printed below ' +
|
||||
'its card instead of through the middle of the word, the dividing line on a Mainline card can ' +
|
||||
'actually be seen, a Restaurant or Hotel next to a Whistle Post says it is dormant until the ' +
|
||||
'Office is upgraded rather than appearing to do nothing, only the one card that reads ' +
|
||||
'FAST/SLOW mentions it, and the version number appears once in the page header instead of ' +
|
||||
'twice.',
|
||||
'Bundles Station Master v0.8.0.12 — a player who has lost their browser storage can be put ' +
|
||||
'back in their seat. **Games already running on this server resume normally**: no rule ' +
|
||||
'changed. **The problem this fixes.** The only proof of who you are is kept by your own ' +
|
||||
'browser, so clearing your browsing data, returning in a private window, or sitting down at a ' +
|
||||
'different browser leaves you looking like a stranger — an empty lobby, no game code, no name ' +
|
||||
'— while the game is still running on the server and your seat is still yours. It happened at ' +
|
||||
'a real table: of two players in one game, one reloaded straight back in and the other could ' +
|
||||
'not get in at all. **The fix is a new Restore a Seat action.** Pick the player from a list of ' +
|
||||
'whoever is actually holding a seat, and it hands you a link. Send it to them, and opening it ' +
|
||||
'in their own browser puts them straight back where they were. The link works once and expires ' +
|
||||
'after 30 minutes, and whoever opens it takes that seat — so send it to that person rather ' +
|
||||
'than posting it somewhere public. If it expires first, just run the action again. The link ' +
|
||||
'carries a one-time code and never the seat itself, so a link left in a chat window is worth ' +
|
||||
'nothing once it has been used.',
|
||||
es_ES:
|
||||
'Incluye Station Master v0.8.0.11 — dieciséis correcciones de la segunda partida de prueba ' +
|
||||
'multijugador. **Las partidas en curso en este servidor se reanudan con normalidad**: no ha ' +
|
||||
'cambiado ninguna regla. **Formar un tren es mucho más claro.** El panel indica ahora lo que ' +
|
||||
'al tren le FALTA, y no solo lo que pide su carta; explica que añades UN vagón y el turno ' +
|
||||
'pasa al siguiente jugador; marca en el mapa de la División el tren que se está formando; y ' +
|
||||
'resalta los vagones que puedes añadir con el mismo ámbar que los demás botones — los vagones ' +
|
||||
'del Patio de División siempre fueron los botones, pero no lo parecían. **La llegada de un ' +
|
||||
'tren dice a qué Oficina llegó**, y ya no le dice a todo el mundo que puede trabajarlo cuando ' +
|
||||
'está en el distrito de otro jugador. **Mientras tu tablero se pone al día** con los ' +
|
||||
'movimientos de otros, ahora puedes PAUSARLO el tiempo que quieras — el movimiento pausado ' +
|
||||
'conserva el tiempo que le quedaba — y abrir el Área de Oficina de cualquier otro jugador ' +
|
||||
'para verla. El Día, la Etapa y la fase en pantalla coinciden con el movimiento que estás ' +
|
||||
'viendo, así que ir cinco movimientos por detrás se ve igual en toda la página. Cuando no se ' +
|
||||
'espera a nadie, la pantalla dice qué está haciendo la División — «la División está moviendo ' +
|
||||
'trenes» — en lugar de «esperando a nadie». **Las partidas guardadas se descargan con el ' +
|
||||
'nombre de la partida**: el código de acceso, el Día y la Etapa en el nombre del archivo. ' +
|
||||
'Además: el letrero LIMITS se imprime debajo de su carta y no atravesando la palabra, la ' +
|
||||
'línea divisoria de una carta de Línea Principal se ve de verdad, un Restaurante u Hotel ' +
|
||||
'junto a un Whistle Post indica que está inactivo hasta que se mejore la Oficina, solo la ' +
|
||||
'única carta que lee RÁPIDO/LENTO lo menciona, y el número de versión aparece una vez en la ' +
|
||||
'cabecera en lugar de dos.',
|
||||
'Incluye Station Master v0.8.0.12 — un jugador que haya perdido los datos de su navegador ' +
|
||||
'puede volver a su asiento. **Las partidas en curso en este servidor se reanudan con ' +
|
||||
'normalidad**: no ha cambiado ninguna regla. **El problema que corrige.** La única prueba de ' +
|
||||
'quién eres la guarda tu propio navegador: si borras los datos de navegación, vuelves en una ' +
|
||||
'ventana privada o te sientas ante otro navegador, apareces como un desconocido — una sala ' +
|
||||
'vacía, sin código de partida ni nombre — aunque la partida siga en el servidor y el asiento ' +
|
||||
'siga siendo tuyo. Ocurrió en una mesa real: de dos jugadores, uno volvió sin problemas y el ' +
|
||||
'otro no pudo entrar. **La solución es la nueva acción Restaurar un asiento.** Elige al ' +
|
||||
'jugador de la lista de quienes ocupan un asiento y se te entrega un enlace. Envíaselo y, al ' +
|
||||
'abrirlo en su propio navegador, volverá justo donde estaba. El enlace funciona una sola vez y ' +
|
||||
'caduca a los 30 minutos, y quien lo abra ocupará ese asiento: envíaselo a esa persona en ' +
|
||||
'lugar de publicarlo. Si caduca antes, ejecuta la acción de nuevo. El enlace lleva un código ' +
|
||||
'de un solo uso y nunca el asiento en sí, así que un enlace olvidado en un chat no sirve de ' +
|
||||
'nada una vez usado.',
|
||||
de_DE:
|
||||
'Enthält Station Master v0.8.0.11 — sechzehn Korrekturen aus der zweiten Mehrspieler-' +
|
||||
'Testpartie. **Laufende Spiele auf diesem Server werden normal fortgesetzt**: keine Regel ' +
|
||||
'wurde geändert. **Das Zusammenstellen eines Zuges ist viel klarer.** Das Panel nennt jetzt, ' +
|
||||
'was dem Zug noch FEHLT, statt nur, was seine Karte verlangt; es sagt, dass Sie EINEN Wagen ' +
|
||||
'anhängen und die Runde dann zum nächsten Spieler weitergeht; es markiert den Zug, der gerade ' +
|
||||
'beladen wird, auf der Divisionskarte; und die Wagen, die Sie anhängen dürfen, leuchten im ' +
|
||||
'selben Bernstein wie jede andere Schaltfläche — die Wagen im Divisionsbahnhof waren immer ' +
|
||||
'schon die Schaltflächen, sahen aber nicht danach aus. **Die Ankunft eines Zuges nennt jetzt, ' +
|
||||
'wessen Office er erreicht hat**, und sagt nicht mehr allen, sie könnten ihn bearbeiten, wenn ' +
|
||||
'er im Bezirk eines anderen steht. **Während Ihr Spielfeld die Züge der anderen nachholt**, ' +
|
||||
'können Sie es nun PAUSIEREN, so lange Sie wollen — der pausierte Zug behält die Zeit, die ' +
|
||||
'ihm blieb — und das Office-Gebiet jedes anderen Spielers ansehen. Tag, Etappe und Phase auf ' +
|
||||
'dem Bildschirm stimmen mit dem Zug überein, den Sie gerade sehen; fünf Züge im Rückstand zu ' +
|
||||
'sein sieht überall auf der Seite gleich aus. Wartet das Spiel auf niemanden, zeigt der ' +
|
||||
'Bildschirm, was die Division tut — „die Division bewegt Züge“ — statt „wartet auf niemanden“. ' +
|
||||
'**Gespeicherte Spiele werden nach dem Spiel benannt**: Beitrittscode, Tag und Etappe im ' +
|
||||
'Dateinamen. Außerdem: Das LIMITS-Schild steht unter seiner Karte statt mitten im Wort, die ' +
|
||||
'Trennlinie auf einer Hauptstreckenkarte ist tatsächlich zu sehen, ein Restaurant oder Hotel ' +
|
||||
'neben einem Whistle Post meldet sich als ruhend, bis das Office ausgebaut wird, nur die eine ' +
|
||||
'Karte, die SCHNELL/LANGSAM liest, erwähnt es, und die Versionsnummer erscheint einmal in der ' +
|
||||
'Kopfzeile statt zweimal.',
|
||||
'Enthält Station Master v0.8.0.12 — wer die Daten seines Browsers verloren hat, kann wieder ' +
|
||||
'auf seinen Platz gesetzt werden. **Laufende Spiele auf diesem Server werden normal ' +
|
||||
'fortgesetzt**: keine Regel wurde geändert. **Das behobene Problem.** Der einzige Nachweis, ' +
|
||||
'wer Sie sind, liegt in Ihrem eigenen Browser. Browserdaten gelöscht, im privaten Fenster ' +
|
||||
'zurückgekehrt oder an einem anderen Browser gesessen — und Sie erscheinen als Fremder: leere ' +
|
||||
'Lobby, kein Spielcode, kein Name, obwohl das Spiel weiterläuft und der Platz Ihnen gehört. An ' +
|
||||
'einem echten Tisch geschehen: von zwei Spielern kam einer sofort zurück, der andere gar ' +
|
||||
'nicht. **Die Lösung ist die neue Aktion „Einen Platz wiederherstellen".** Wählen Sie den ' +
|
||||
'Spieler aus der Liste der tatsächlich besetzten Plätze, und Sie erhalten einen Link. ' +
|
||||
'Schicken Sie ihn; wird er im eigenen Browser geöffnet, sitzt der Spieler wieder genau dort, ' +
|
||||
'wo er war. Der Link funktioniert einmal und verfällt nach 30 Minuten, und wer ihn öffnet, ' +
|
||||
'nimmt diesen Platz ein — schicken Sie ihn also dieser Person und posten Sie ihn nicht ' +
|
||||
'öffentlich. Verfällt er vorher, führen Sie die Aktion einfach erneut aus. Der Link enthält ' +
|
||||
'einen Einmal-Code und niemals den Platz selbst; ein Link in einem Chatfenster ist nach dem ' +
|
||||
'Einlösen wertlos.',
|
||||
pl_PL:
|
||||
'Zawiera Station Master v0.8.0.11 — szesnaście poprawek z drugiej testowej partii ' +
|
||||
'wieloosobowej. **Gry w toku na tym serwerze wznawiają się normalnie**: żadna zasada się nie ' +
|
||||
'zmieniła. **Kompletowanie pociągu jest dużo jaśniejsze.** Panel pokazuje teraz, czego ' +
|
||||
'pociągowi jeszcze BRAKUJE, a nie tylko czego wymaga jego karta; mówi, że dodajesz JEDEN ' +
|
||||
'wagon, po czym kolejka przechodzi do następnego gracza; zaznacza kompletowany pociąg na ' +
|
||||
'mapie Dywizji; a wagony, które możesz dodać, świecą tym samym bursztynem co pozostałe ' +
|
||||
'przyciski — wagony na Stacji Dywizyjnej zawsze były przyciskami, ale tak nie wyglądały. ' +
|
||||
'**Przyjazd pociągu podaje, czyje Biuro osiągnął**, i nie mówi już wszystkim, że mogą go ' +
|
||||
'obsłużyć, gdy stoi w dzielnicy innego gracza. **Gdy twoja plansza nadrabia ruchy innych**, ' +
|
||||
'możesz ją teraz ZATRZYMAĆ na dowolnie długo — zatrzymany ruch zachowuje pozostały mu czas — ' +
|
||||
'i obejrzeć Biuro dowolnego innego gracza. Dzień, Etap i faza na ekranie zgadzają się z ' +
|
||||
'ruchem, który oglądasz, więc pięć ruchów w tyle wygląda tak samo na całej stronie. Gdy gra ' +
|
||||
'na nikogo nie czeka, ekran mówi, co robi Dywizja — „Dywizja przesuwa pociągi” — zamiast ' +
|
||||
'„czeka na nikogo”. **Zapisane gry pobierają się nazwane po grze**: kod dołączenia, Dzień i ' +
|
||||
'Etap w nazwie pliku. Ponadto: napis LIMITS jest drukowany pod kartą, a nie przez środek ' +
|
||||
'słowa, linia podziału na karcie Magistrali jest wreszcie widoczna, Restauracja lub Hotel ' +
|
||||
'obok Whistle Post informuje, że jest uśpiony do czasu rozbudowy Biura, tylko ta jedna karta, ' +
|
||||
'która czyta SZYBKO/WOLNO, o tym wspomina, a numer wersji pojawia się w nagłówku raz zamiast ' +
|
||||
'dwa razy.',
|
||||
'Zawiera Station Master v0.8.0.12 — gracz, który stracił dane swojej przeglądarki, może ' +
|
||||
'wrócić na swoje miejsce. **Gry w toku na tym serwerze wznawiają się normalnie**: żadna zasada ' +
|
||||
'się nie zmieniła. **Naprawiony problem.** Jedynym dowodem tożsamości jest to, co trzyma twoja ' +
|
||||
'przeglądarka. Wyczyść dane, wróć w oknie prywatnym albo usiądź przy innej przeglądarce, a ' +
|
||||
'wyglądasz jak ktoś obcy — pusta poczekalnia, brak kodu gry i nazwy — chociaż gra nadal działa ' +
|
||||
'na serwerze, a miejsce wciąż należy do ciebie. Zdarzyło się to przy prawdziwym stole: z ' +
|
||||
'dwóch graczy jeden wrócił od razu, a drugi w ogóle nie mógł wejść. **Rozwiązaniem jest nowa ' +
|
||||
'akcja „Przywróć miejsce".** Wybierz gracza z listy osób faktycznie zajmujących miejsca, a ' +
|
||||
'otrzymasz link. Wyślij mu go — po otwarciu we własnej przeglądarce wróci dokładnie tam, gdzie ' +
|
||||
'był. Link działa raz i wygasa po 30 minutach, a kto go otworzy, zajmie to miejsce — wyślij ' +
|
||||
'go więc tej osobie, zamiast publikować. Jeśli wygaśnie, po prostu uruchom akcję ponownie. ' +
|
||||
'Link zawiera jednorazowy kod, a nigdy samo miejsce, więc link zostawiony na czacie po ' +
|
||||
'wykorzystaniu jest bezwartościowy.',
|
||||
fr_FR:
|
||||
'Inclut Station Master v0.8.0.11 — seize corrections issues de la deuxième partie de test ' +
|
||||
'multijoueurs. **Les parties en cours sur ce serveur reprennent normalement** : aucune règle ' +
|
||||
'n’a changé. **Composer un train est bien plus clair.** Le panneau indique désormais ce qu’il ' +
|
||||
'MANQUE au train, et non plus seulement ce que sa carte demande ; il précise que vous ajoutez ' +
|
||||
'UN wagon avant que le tour ne passe au joueur suivant ; il marque sur la carte de la ' +
|
||||
'Division le train en cours de composition ; et les wagons que vous pouvez ajouter ' +
|
||||
's’allument dans le même ambre que tous les autres boutons — les wagons du Dépôt de Division ' +
|
||||
'ont toujours été les boutons, mais n’en avaient pas l’air. **L’arrivée d’un train indique à ' +
|
||||
'quel Office il est parvenu**, et ne dit plus à tout le monde qu’il peut le manœuvrer alors ' +
|
||||
'qu’il stationne dans le district d’un autre. **Pendant que votre plateau rattrape** les ' +
|
||||
'coups des autres, vous pouvez maintenant le METTRE EN PAUSE aussi longtemps que vous voulez ' +
|
||||
'— le coup mis en pause conserve le temps qu’il lui restait — et ouvrir l’Aire de Bureau de ' +
|
||||
'n’importe quel autre joueur. Le Jour, l’Étape et la phase affichés correspondent au coup que ' +
|
||||
'vous regardez : avoir cinq coups de retard se voit de la même façon partout sur la page. ' +
|
||||
'Quand la partie n’attend personne, l’écran dit ce que fait la Division — « la Division fait ' +
|
||||
'circuler les trains » — au lieu de « en attente de personne ». **Les parties sauvegardées ' +
|
||||
'portent le nom de la partie** : code d’accès, Jour et Étape dans le nom du fichier. ' +
|
||||
'Également : le panneau LIMITS est imprimé sous sa carte au lieu de traverser le mot, la ' +
|
||||
'ligne de séparation d’une carte de Ligne principale est enfin visible, un Restaurant ou un ' +
|
||||
'Hôtel à côté d’un Whistle Post indique qu’il est en sommeil jusqu’à l’amélioration de ' +
|
||||
'l’Office, seule la carte qui lit RAPIDE/LENT le mentionne, et le numéro de version apparaît ' +
|
||||
'une fois dans l’en-tête au lieu de deux.',
|
||||
'Inclut Station Master v0.8.0.12 — un joueur qui a perdu les données de son navigateur peut ' +
|
||||
'être remis à sa place. **Les parties en cours sur ce serveur reprennent normalement** : ' +
|
||||
'aucune règle n’a changé. **Le problème corrigé.** La seule preuve de votre identité est ' +
|
||||
'conservée par votre propre navigateur : effacez vos données, revenez dans une fenêtre privée ' +
|
||||
'ou installez-vous devant un autre navigateur, et vous apparaissez comme un inconnu — salle ' +
|
||||
'vide, ni code de partie ni nom — alors que la partie tourne toujours et que la place est ' +
|
||||
'toujours la vôtre. C’est arrivé à une vraie table : de deux joueurs, l’un est revenu ' +
|
||||
'directement, l’autre n’a pas pu entrer. **La solution est la nouvelle action « Restaurer une ' +
|
||||
'place ».** Choisissez le joueur dans la liste de ceux qui occupent réellement une place, et ' +
|
||||
'vous obtenez un lien. Envoyez-le-lui : ouvert dans son propre navigateur, il le remet ' +
|
||||
'exactement où il était. Le lien fonctionne une seule fois et expire au bout de 30 minutes, et ' +
|
||||
'quiconque l’ouvre prend cette place — envoyez-le donc à cette personne plutôt que de le ' +
|
||||
'publier. S’il expire avant, relancez simplement l’action. Le lien porte un code à usage ' +
|
||||
'unique et jamais la place elle-même : un lien laissé dans une conversation ne vaut plus rien ' +
|
||||
'une fois utilisé.',
|
||||
},
|
||||
migrations: {
|
||||
/**
|
||||
@@ -233,6 +199,20 @@ export const current = VersionInfo.of({
|
||||
* look at another player's Office Area, the turn chart following the step being replayed rather
|
||||
* than the live game, "still needs" on the make-up panel, the amber on an addable yard chip, and
|
||||
* save filenames carrying the join code. None of it is a rule and none of it is on disk.
|
||||
*
|
||||
* v0.8.0.12 TOUCHES THE ENGINE NOT AT ALL, which is the shortest entry this comment has ever
|
||||
* had a right to: `git diff v0.8.0.11..v0.8.0.12 -- src/engine/` is EMPTY. The release is the
|
||||
* server's HTTP surface, the browser client and the docs — a seat recovery flow (Gitea#33) for
|
||||
* a player whose browser has lost the token that is their only identity.
|
||||
*
|
||||
* WHAT IT ADDS, AND WHY NONE OF IT IS A MIGRATION: two routes (`POST /api/games/<id>/claim`
|
||||
* behind the admin secret, `POST /api/claim` for the player following the link), a `?claim=`
|
||||
* entry path in the client, and `seatedPlayers` on the administrative game listing. The codes
|
||||
* themselves live in memory and are deliberately NOT persisted — minted on demand and spent
|
||||
* within minutes, so a restart dropping them is the right failure rather than a loss. Nothing
|
||||
* new is written to the volume, no predicate was edited, and `check()` and `legal.ts` are
|
||||
* untouched, so no once-legal move became illegal. Games in progress resume, and the release
|
||||
* notes say so in all five locales.
|
||||
*/
|
||||
up: async ({ effects }) => {},
|
||||
down: IMPOSSIBLE,
|
||||
|
||||
Reference in New Issue
Block a user