diff --git a/README.md b/README.md index 96052d4..6535b3a 100644 --- a/README.md +++ b/README.md @@ -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 — 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 @@ -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. 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 - 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. --- diff --git a/UPDATING.md b/UPDATING.md index 712d161..616e1c1 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -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`, > 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 +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 `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 diff --git a/instructions.md b/instructions.md index f96fa3b..ed4f168 100644 --- a/instructions.md +++ b/instructions.md @@ -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 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 Run this whenever you need the current join secret again, or want to shut out anyone still diff --git a/startos/versions/current.ts b/startos/versions/current.ts index 9692bf9..e453dd8 100644 --- a/startos/versions/current.ts +++ b/startos/versions/current.ts @@ -4,28 +4,38 @@ export const current = VersionInfo.of({ // `:` — 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. - version: '0.6.0:0', + version: '0.7.0:3', releaseNotes: { en_US: - 'Bundles Station Master v0.6.0. Games in progress now survive an update of this service, so long ' + - 'as the rules did not change. The lobby lets the host set every game setting, and the Employee ' + - 'Rotation optional rule is playable.', + 'Bundles Station Master v0.7.0. Setting a multiplayer game up is a different screen: pick a game ' + + 'type \u2014 Co-op, Competitive or Cutthroat \u2014 and every rule it sets is yours to change. Read a ' + + '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: - 'Incluye Station Master v0.6.0. Las partidas en curso sobreviven a una actualización de este ' + - 'servicio, siempre que las reglas no hayan cambiado. La sala permite al anfitrión ajustar todas ' + - 'las opciones, y la regla opcional de Rotación de Empleados ya se puede jugar.', + 'Incluye Station Master v0.7.0. Crear una partida multijugador es otra pantalla: elige un tipo de ' + + 'partida \u2014 Cooperativa, Competitiva o A muerte \u2014 y cambia cualquiera de sus reglas. Lee todas ' + + '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: - 'Enthält Station Master v0.6.0. Laufende Spiele überstehen jetzt ein Update dieses Dienstes, ' + - 'sofern sich die Regeln nicht geändert haben. In der Lobby stellt der Gastgeber alle ' + - 'Spieloptionen ein, und die optionale Regel Employee Rotation ist spielbar.', + 'Enth\u00e4lt Station Master v0.7.0. Ein Mehrspielerspiel wird jetzt anders eingerichtet: W\u00e4hle einen ' + + 'Spieltyp \u2014 Koop, Wettkampf oder Cutthroat \u2014 und \u00e4ndere jede seiner Regeln. Das ganze Regelwerk ' + + '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: - 'Zawiera Station Master v0.6.0. Gry w toku przetrwają teraz aktualizację tej usługi, o ile ' + - 'zasady się nie zmieniły. W poczekalni gospodarz ustawia wszystkie opcje gry, a zasada ' + - 'opcjonalna Employee Rotation jest już grywalna.', + 'Zawiera Station Master v0.7.0. Tworzenie gry wieloosobowej wygl\u0105da inaczej: wybierz typ gry \u2014 ' + + 'Kooperacja, Rywalizacja lub Cutthroat \u2014 i zmie\u0144 dowoln\u0105 z jego zasad. Przeczytaj ca\u0142y zestaw ' + + '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: - 'Inclut Station Master v0.6.0. Les parties en cours survivent désormais à une mise à jour de ce ' + - 'service, tant que les règles n’ont pas changé. Le salon permet à l’hôte de régler toutes les ' + - 'options, et la règle optionnelle Employee Rotation est jouable.', + 'Inclut Station Master v0.7.0. La cr\u00e9ation d\u2019une partie multijoueur a chang\u00e9 : choisissez un type ' + + 'de partie \u2014 Coop, Comp\u00e9titif ou Cutthroat \u2014 et modifiez chacune de ses r\u00e8gles. Lisez tout le ' + + '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: { up: async ({ effects }) => {}, diff --git a/station-master b/station-master index 40f07b0..06db36e 160000 --- a/station-master +++ b/station-master @@ -1 +1 @@ -Subproject commit 40f07b0710628c226467b25b017d3395d2ee72a7 +Subproject commit 06db36e5b50d95a4f6c75ef2ed7ffa4a03397ef0