Pin moves to v0.5.3, package version to 0.5.3:0.
The health check no longer just probes a port. It fetches the server's own
/api/health and reports what it says — "Multiplayer server is ready — 3
games in progress", with ", 1 waiting to start" appended only when a lobby
exists and "no games in progress" on an idle server. A server that doesn't
answer is reported as STARTING, never failed: the server replays its saved
games before binding its port, so a boot legitimately looks like nothing is
listening, and calling that a failure makes an ordinary restart look like a
crash.
Two new actions, both only-running. Games in Progress is read-only and
lists every game and lobby with players, Day/Stage/phase, who it waits on,
when it started and when it last moved. Manage Game picks one from a
dropdown built live from the server and either exports it or ends it —
ending being the only way a game finishes other than being played out,
since an abandoned game otherwise stays active and is resumed on every
restart forever. Ending always returns the deleted game's save, so nothing
is destroyed without being handed back first.
They are only-running because none of it is readable from disk: a save is a
seed plus a list of moves, so whose-turn-it-is exists only after a replay
through the engine, which lives in the game repo rather than here. The
running server has already done that work and is asked for the answer.
startos/serverApi.ts is the single place that asks.
store.json gained adminSecret (32 chars) beside joinSecret, seeded on
install and backfilled on update for a volume written before the field
existed. It is deliberately NOT the join secret: every player holds that
one, so gating a delete with it would let anyone at the table destroy
anyone else's game. init/generateJoinSecret.ts is renamed generateSecrets.ts
now that it mints both.
Also brought getJoinSecret's result strings under i18n(). They shipped as
plain strings two commits ago, which actions.md is explicit about — every
user-facing string including result titles, messages and thrown errors.
The new actions follow it, so the old one shouldn't be the odd one out.
Verified on phoenix.local, installed as an UPDATE from 0.5.2:0 rather than
a fresh install, which exercised three things at once: the boot log line
("Resuming 1 saved game(s)…"), the engine-version refusal firing for real
on a game recorded under 0.5.2, and the adminSecret backfill (store.json
came out with both secrets, 24 and 32 chars). Then, from inside the
container: the package-generated admin secret authenticating against
/api/games (200) while a wrong one is refused (403), health counts tracking
0 -> lobby 1 -> active 1 through a create/bot/start, and every field the
actions render present and correct on the listing.
NOT verified: the actions' own forms and result rendering. `start-cli
package action run` fails with a client-side deserialization error on every
action on this box — including the already-shipped get-join-secret and
actual-budget's equivalent — so it is a start-cli problem, not this
package's. The data path underneath them is verified above; the SDK
form/result rendering needs the web UI.
A test game (TRESTLE-3221, Alice + a bot) is left running on the box so
there is something for Games in Progress to show.
42 lines
2.8 KiB
TypeScript
42 lines
2.8 KiB
TypeScript
export const short = {
|
|
en_US: 'Railroad operations board game — solitaire or multiplayer',
|
|
es_ES: 'Juego de mesa de operaciones ferroviarias: solitario o multijugador',
|
|
de_DE: 'Eisenbahn-Betriebs-Brettspiel — Solitär oder Mehrspieler',
|
|
pl_PL: 'Gra planszowa o zarządzaniu koleją — pasjans lub tryb wieloosobowy',
|
|
fr_FR: 'Jeu de plateau de gestion ferroviaire — solo ou multijoueur',
|
|
}
|
|
|
|
export const long = {
|
|
en_US:
|
|
'Station Master is a railroad operations game: switch cars, load and unload freight, and ' +
|
|
'dispatch trains through a shared Division. This package runs the authoritative multiplayer ' +
|
|
'server — 2 to 4 players connect from their browsers and play a competitive or cooperative ' +
|
|
'game together. Solitaire needs no server at all; it runs entirely in the browser from the ' +
|
|
'static client this server also hosts.',
|
|
es_ES:
|
|
'Station Master es un juego de operaciones ferroviarias: maniobra vagones, carga y descarga ' +
|
|
'mercancías, y despacha trenes por una División compartida. Este paquete ejecuta el servidor ' +
|
|
'multijugador autoritativo — de 2 a 4 jugadores se conectan desde sus navegadores y juegan una ' +
|
|
'partida competitiva o cooperativa. El modo solitario no necesita servidor: se ejecuta ' +
|
|
'enteramente en el navegador desde el mismo cliente estático que este servidor aloja.',
|
|
de_DE:
|
|
'Station Master ist ein Eisenbahn-Betriebsspiel: Waggons rangieren, Fracht laden und löschen ' +
|
|
'und Züge durch eine gemeinsame Division disponieren. Dieses Paket betreibt den ' +
|
|
'autoritativen Mehrspieler-Server — 2 bis 4 Spieler verbinden sich über den Browser und ' +
|
|
'spielen gemeinsam kompetitiv oder kooperativ. Solitär benötigt keinen Server; es läuft ' +
|
|
'vollständig im Browser über denselben statischen Client, den dieser Server ebenfalls hostet.',
|
|
pl_PL:
|
|
'Station Master to gra o zarządzaniu koleją: manewruj wagonami, załaduj i rozładuj towar oraz ' +
|
|
'dysponuj pociągami we wspólnej Dywizji. Ten pakiet uruchamia autorytatywny serwer trybu ' +
|
|
'wieloosobowego — od 2 do 4 graczy łączy się z przeglądarek i rozgrywa partię rywalizacyjną ' +
|
|
'lub kooperacyjną. Pasjans nie wymaga serwera — działa w całości w przeglądarce, z tego ' +
|
|
'samego statycznego klienta, który hostuje ten serwer.',
|
|
fr_FR:
|
|
'Station Master est un jeu de gestion ferroviaire : manœuvrez des wagons, chargez et ' +
|
|
'déchargez du fret, et dispatchez des trains à travers une Division partagée. Ce paquet ' +
|
|
'exécute le serveur multijoueur faisant autorité — 2 à 4 joueurs se connectent depuis leur ' +
|
|
'navigateur pour une partie compétitive ou coopérative. Le mode solitaire ne nécessite aucun ' +
|
|
'serveur : il tourne entièrement dans le navigateur, à partir du même client statique que ce ' +
|
|
'serveur héberge.',
|
|
}
|