0.7.0:3 — bundle Station Master v0.7.0
The submodule pin is the version; nothing else about the package changed. Four game types in the lobby, the whole rule set readable before taking a seat, leaving and rejoining a game, and sound in a multiplayer game for the first time — all upstream, all through the same server this package has always run. - startos/versions/current.ts — 0.7.0:3, with release notes in all five languages. - instructions.md — how a game is set up now, and what Leave / Forget mean for a seat. - README.md — the bundled version, and a limitation spelled out: a player's identity lives in their browser, so a lost token cannot be recovered from this package. - UPDATING.md — how to pack a test build from work that is not pushed yet, which is how v0.7.0 was played before release, and why the downstream digit moves for each one. The downstream digit is :3 rather than :0 because three test packs were installed on the box while v0.7.0 was being played; publishing :0 now would be a downgrade it would refuse. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016JczK5i33ZNSf2PtzZqdhS
This commit is contained in:
@@ -13,6 +13,13 @@ 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 —
|
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.
|
the browser client, the lobby, and the intent/SSE API — as a single StartOS service.
|
||||||
|
|
||||||
|
**Bundled version: 0.7.0.** 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 a seat is taken,
|
||||||
|
and lets a player leave a lobby or a running game and come back to it. Sound, the timetable flash,
|
||||||
|
announcements and the just-drawn card badge reach a multiplayer client for the first time. None of
|
||||||
|
that changes anything this package does: the submodule pin is the version, and the service is the
|
||||||
|
same server it always was.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
@@ -178,7 +185,14 @@ server resumes every saved game on boot the same way it does after an ordinary r
|
|||||||
visibility into who a player is once they've joined.
|
visibility into who a player is once they've joined.
|
||||||
3. **No accounts, and one game at a time per person is expected but not enforced** — a deliberate
|
3. **No accounts, and one game at a time per person is expected but not enforced** — a deliberate
|
||||||
upstream design decision (`docs/architecture/multiplayer.md` §11 D13), not a StartOS-specific
|
upstream design decision (`docs/architecture/multiplayer.md` §11 D13), not a StartOS-specific
|
||||||
limitation.
|
limitation. Since 0.7.0 a browser can hold seats in several games at once and picks between them
|
||||||
|
in the lobby, which is a client convenience rather than a change to that decision.
|
||||||
|
4. **A player's identity lives in their browser.** The session token issued at join is the only
|
||||||
|
proof of who a player is; it is kept in that browser's `localStorage` and nowhere else. A player
|
||||||
|
may leave a running game and rejoin it (the lobby lists every game the browser is in), but a
|
||||||
|
token lost with the browser — cleared site data, a different device — cannot be recovered from
|
||||||
|
this package, and the seat stays in the game waiting. Upstream `TODO.md` tracks an
|
||||||
|
administrator-issued rejoin link; it does not exist yet.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
+37
@@ -40,6 +40,43 @@ change is packaging-only and the bundled game has not moved.
|
|||||||
> anywhere, which is the only reason a downgrade was harmless: `0.5.2:0` sorts *below* `1.0.0:0`,
|
> anywhere, which is the only reason a downgrade was harmless: `0.5.2:0` sorts *below* `1.0.0:0`,
|
||||||
> so an installed copy had to be removed rather than updated over.
|
> so an installed copy had to be removed rather than updated over.
|
||||||
|
|
||||||
|
## Building a test package from work that is not pushed yet
|
||||||
|
|
||||||
|
The Dockerfile copies `station-master/` out of the build context, so what is packed is whatever is
|
||||||
|
in that directory — the submodule's *pin* only matters for reproducibility, not for `make`. That is
|
||||||
|
what makes it possible to put a build on a test box before the game is committed, tagged or pushed,
|
||||||
|
which is how v0.7.0 was played before release:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# point the submodule at a local commit that exists nowhere else yet
|
||||||
|
cd station-master && git fetch --no-tags /path/to/station-master main && git checkout --detach FETCH_HEAD
|
||||||
|
|
||||||
|
# or, for work that is not even committed, copy the working tree in
|
||||||
|
rsync -a --delete --exclude .git --exclude node_modules --exclude dist \
|
||||||
|
/path/to/station-master/ station-master/
|
||||||
|
|
||||||
|
cd .. && make x86 && make install
|
||||||
|
```
|
||||||
|
|
||||||
|
**Move the DOWNSTREAM digit for each test build** — `0.7.0:1`, `:2`, `:3`. StartOS installs an
|
||||||
|
update, not a re-install, so a rebuild at the same version has nothing to install over; and the
|
||||||
|
downstream half is exactly the right one to move, since the upstream game has not been released
|
||||||
|
again between two test packs. Whichever digit the box ends up on is the one the real release should
|
||||||
|
carry: publishing a *lower* one afterwards is a downgrade the box will refuse.
|
||||||
|
|
||||||
|
**Before committing the wrapper**, put the pin back on a real tag — a submodule pointing at a commit
|
||||||
|
that only exists on one machine is a package nobody else can build:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd station-master && git fetch --tags origin && git checkout v<version>
|
||||||
|
cd .. && git add station-master
|
||||||
|
```
|
||||||
|
|
||||||
|
The pack's git stamp says `-modified` for the whole of this, which is the flag that a build came
|
||||||
|
from a dirty tree. Never publish one of those.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
If the jump carries a multiplayer protocol or persistence-format change (check the game repo's
|
If the jump carries a multiplayer protocol or persistence-format change (check the game repo's
|
||||||
`CHANGELOG.md` and `docs/architecture/multiplayer.md`), read it before bumping: a running
|
`CHANGELOG.md` and `docs/architecture/multiplayer.md`), read it before bumping: a running
|
||||||
server's saved games are stamped with `engineVersion` and refuse to resume under a mismatched
|
server's saved games are stamped with `engineVersion` and refuse to resume under a mismatched
|
||||||
|
|||||||
@@ -35,6 +35,22 @@ watches the table — there is nothing else to open.
|
|||||||
Solitaire runs entirely in your own browser and needs nothing from the server, so it works here
|
Solitaire runs entirely in your own browser and needs nothing from the server, so it works here
|
||||||
exactly as it does on the public Station Master site.
|
exactly as it does on the public Station Master site.
|
||||||
|
|
||||||
|
**Setting a game up (new in 0.7.0).** The lobby opens on **Join a game**: type the code you were
|
||||||
|
given and you will see the whole rule set — the opening hand, what the work pays, every way the game
|
||||||
|
can end — *before* you take a seat. Creating a game instead starts from a **game type**: Co-op,
|
||||||
|
Competitive or Cutthroat. A type just fills in the rules; every one of them is yours to change, and
|
||||||
|
changing any of them marks the game **Custom**, which keeps the scoring of the type you started
|
||||||
|
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.
|
||||||
|
|
||||||
|
**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
|
||||||
|
taken. A **Leave game** button appears once a game is running: it keeps your seat and the table
|
||||||
|
waits for you, and the lobby lists every game this browser is in so you can rejoin it — or join a
|
||||||
|
different one without losing the first. **Forget** on that list is the one thing that cannot be
|
||||||
|
undone: the token kept in your browser is the only proof of who you are, so a forgotten game cannot
|
||||||
|
be rejoined from that browser.
|
||||||
|
|
||||||
### Get Join Secret
|
### Get Join Secret
|
||||||
|
|
||||||
Run this whenever you need the current join secret again, or want to shut out anyone still
|
Run this whenever you need the current join secret again, or want to shut out anyone still
|
||||||
|
|||||||
+26
-16
@@ -4,28 +4,38 @@ export const current = VersionInfo.of({
|
|||||||
// `<upstream>:<downstream>` — the upstream half tracks the bundled Station Master tag exactly
|
// `<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
|
// (`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.
|
// action. The downstream half moves only for packaging-only changes.
|
||||||
version: '0.6.0:0',
|
version: '0.7.0:3',
|
||||||
releaseNotes: {
|
releaseNotes: {
|
||||||
en_US:
|
en_US:
|
||||||
'Bundles Station Master v0.6.0. Games in progress now survive an update of this service, so long ' +
|
'Bundles Station Master v0.7.0. Setting a multiplayer game up is a different screen: pick a game ' +
|
||||||
'as the rules did not change. The lobby lets the host set every game setting, and the Employee ' +
|
'type \u2014 Co-op, Competitive or Cutthroat \u2014 and every rule it sets is yours to change. Read a ' +
|
||||||
'Rotation optional rule is playable.',
|
'game\u2019s whole rule set before taking a seat, leave a table or a running game and come back to ' +
|
||||||
|
'it, and let the host clear a chair. Multiplayer games now have sound, say who else is at the ' +
|
||||||
|
'table, and name the Superintendent.',
|
||||||
es_ES:
|
es_ES:
|
||||||
'Incluye Station Master v0.6.0. Las partidas en curso sobreviven a una actualización de este ' +
|
'Incluye Station Master v0.7.0. Crear una partida multijugador es otra pantalla: elige un tipo de ' +
|
||||||
'servicio, siempre que las reglas no hayan cambiado. La sala permite al anfitrión ajustar todas ' +
|
'partida \u2014 Cooperativa, Competitiva o A muerte \u2014 y cambia cualquiera de sus reglas. Lee todas ' +
|
||||||
'las opciones, y la regla opcional de Rotación de Empleados ya se puede jugar.',
|
'las reglas antes de sentarte, sal de una mesa o de una partida en curso y vuelve cuando quieras, ' +
|
||||||
|
'y el anfitri\u00f3n puede liberar una silla. El multijugador ya tiene sonido, dice qui\u00e9n est\u00e1 en la ' +
|
||||||
|
'mesa y se\u00f1ala al Superintendente.',
|
||||||
de_DE:
|
de_DE:
|
||||||
'Enthält Station Master v0.6.0. Laufende Spiele überstehen jetzt ein Update dieses Dienstes, ' +
|
'Enth\u00e4lt Station Master v0.7.0. Ein Mehrspielerspiel wird jetzt anders eingerichtet: W\u00e4hle einen ' +
|
||||||
'sofern sich die Regeln nicht geändert haben. In der Lobby stellt der Gastgeber alle ' +
|
'Spieltyp \u2014 Koop, Wettkampf oder Cutthroat \u2014 und \u00e4ndere jede seiner Regeln. Das ganze Regelwerk ' +
|
||||||
'Spieloptionen ein, und die optionale Regel Employee Rotation ist spielbar.',
|
'ist vor dem Platznehmen lesbar, man kann einen Tisch oder ein laufendes Spiel verlassen und ' +
|
||||||
|
'zur\u00fcckkehren, und der Gastgeber kann einen Platz r\u00e4umen. Mehrspielerpartien haben jetzt Ton, ' +
|
||||||
|
'zeigen wer am Tisch ist und nennen den Superintendenten.',
|
||||||
pl_PL:
|
pl_PL:
|
||||||
'Zawiera Station Master v0.6.0. Gry w toku przetrwają teraz aktualizację tej usługi, o ile ' +
|
'Zawiera Station Master v0.7.0. Tworzenie gry wieloosobowej wygl\u0105da inaczej: wybierz typ gry \u2014 ' +
|
||||||
'zasady się nie zmieniły. W poczekalni gospodarz ustawia wszystkie opcje gry, a zasada ' +
|
'Kooperacja, Rywalizacja lub Cutthroat \u2014 i zmie\u0144 dowoln\u0105 z jego zasad. Przeczytaj ca\u0142y zestaw ' +
|
||||||
'opcjonalna Employee Rotation jest już grywalna.',
|
'zasad przed zaj\u0119ciem miejsca, opu\u015b\u0107 st\u00f3\u0142 lub trwaj\u0105c\u0105 gr\u0119 i wr\u00f3\u0107 do niej, a gospodarz ' +
|
||||||
|
'mo\u017ce zwolni\u0107 krzes\u0142o. Gra wieloosobowa ma teraz d\u017awi\u0119k, pokazuje kto jest przy stole i ' +
|
||||||
|
'wskazuje Superintendenta.',
|
||||||
fr_FR:
|
fr_FR:
|
||||||
'Inclut Station Master v0.6.0. Les parties en cours survivent désormais à une mise à jour de ce ' +
|
'Inclut Station Master v0.7.0. La cr\u00e9ation d\u2019une partie multijoueur a chang\u00e9 : choisissez un type ' +
|
||||||
'service, tant que les règles n’ont pas changé. Le salon permet à l’hôte de régler toutes les ' +
|
'de partie \u2014 Coop, Comp\u00e9titif ou Cutthroat \u2014 et modifiez chacune de ses r\u00e8gles. Lisez tout le ' +
|
||||||
'options, et la règle optionnelle Employee Rotation est jouable.',
|
'r\u00e8glement avant de vous asseoir, quittez une table ou une partie en cours et revenez-y, et ' +
|
||||||
|
'l\u2019h\u00f4te peut lib\u00e9rer une chaise. Le multijoueur a maintenant du son, indique qui est \u00e0 la table ' +
|
||||||
|
'et nomme le Superintendent.',
|
||||||
},
|
},
|
||||||
migrations: {
|
migrations: {
|
||||||
up: async ({ effects }) => {},
|
up: async ({ effects }) => {},
|
||||||
|
|||||||
+1
-1
Submodule station-master updated: 40f07b0710...06db36e5b5
Reference in New Issue
Block a user