Docs: spilregistret, menuen og skift af spil

PROTOCOL.md: /host/ er menuen (med ?code ved skift), /host/intro/<spil>,
/host/new's felter pr. spil, "game" i alle snapshots (også Fup og Fakta's)
og hvordan et skift af spil virker for telefonerne. README: menuen, skift
af spil, hvor et nyt spil registreres, og dev.html?game=menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
agw
2026-10-20 21:50:36 +02:00
co-authored by Claude Opus 5.5
parent 25ea21a4fb
commit c26a0d52f9
2 changed files with 30 additions and 6 deletions
+25 -3
View File
@@ -7,8 +7,9 @@ Al spilkommunikation går over én WebSocket pr. skærm. Serveren er autoritativ
| Sti | Hvem | Hvad |
| --- | --- | --- |
| `GET /` | spillere/publikum | Join-side (`?code=ABCD` udfylder koden) |
| `GET /host/` | vært (Authentik) | Opret nyt spil |
| `POST /host/new` | vært | Opretter rum, redirect til `/host/<CODE>/` |
| `GET /host/` | vært (Authentik) | Spilmenuen (`?code=ABCD`: vælg næste spil i et kørende rum) |
| `GET /host/intro/<spil>` | vært | Speakerens intro til menuen: `{"url", "ms"}`, eller `{}` uden stemme |
| `POST /host/new` | vært | `game=<spil>` + spillets indstillinger (+ `code` ved skift); redirect til `/host/<CODE>/` |
| `GET /host/<CODE>/` | vært | Storskærm |
| `GET /qr/<CODE>.svg` | alle | QR-kode til `https://<host>/?code=<CODE>` |
| `WS /ws/play/<CODE>/` | spillere/publikum | |
@@ -16,6 +17,26 @@ Al spilkommunikation går over én WebSocket pr. skærm. Serveren er autoritativ
Koder er 4 store bogstaver (`BCDFGHJKLMNPQRSTVWXZ`), fx `KLMT`.
## Spillene og skift af spil
Spillene står i ét register, `party/games.py`: nøgle, navn, tagline, min/max spillere, ca. minutter, trin, ikon,
spillets egne skærme (JS), indstillinger og en funktion, der laver rummet. Menuen, `/host/new`, storskærmen og
telefonen læser derfra; et nyt spil registrerer sig dér, og dets JS melder sig i `window.WPPGameUI[<nøgle>]`.
| Spil | `game` | Indstillinger på `/host/new` |
| --- | --- | --- |
| Fup og Fakta | `fof` | `pack` = `alle` \| `familie` \| `nørd` \| `arbejde` \| `fest` |
| Tegn og Gæt | `tegn` | `rules` = `1` (vis reglerne først) \| `0` |
Uden `game` oprettes det første spil i registret (Fup og Fakta); et ukendt spil giver 400, ukendte indstillinger
giver spillets standard. Hvert snapshot, til storskærm og telefon, har `"game"`.
**Skift af spil:** podiet har "Vælg andet spil", som går til `/host/?code=ABCD`. Menuen sender `code` med, og så
laves det nye spil under samme kode: spillerne kommer med i den rækkefølge de kom, med samme navn og `token`; er der
flere end det nye spils max, bliver resten publikum. Point starter forfra. Telefonerne bliver på deres WebSocket og
får det nye spils lobby som et almindeligt `state`; de skal ikke joine igen, og `resume` med det gamle token virker.
Det gamle rum lukkes. Mens værten er i menuen, viser telefonerne stadig podiet.
## Klient → server
Alle beskeder er JSON `{"action": "...", ...}`.
@@ -56,6 +77,7 @@ Fejlkoder: `unknown_room`, `unknown_token`, `name_taken`, `name_invalid`, `not_a
```jsonc
{
"game": "fof", // spillets nøgle i party/games.py
"code": "KLMT",
"phase": "lobby", // lobby | category | intro | lie | present | guess | reveal | scores | final
"server_time": 1790000000000,// ms epoch; klienten udregner sin forskydning
@@ -198,7 +220,7 @@ Oprettes med `pack=fest` på `/host/new`. Snapshot har altid `fest` (bool). I et
## Tegn og Gæt
Oprettes med `game=tegn` på `/host/new` (uden feltet, eller med `game=fof`, oprettes Fup og Fakta som før).
Oprettes med `game=tegn` på `/host/new` (se [Spillene og skift af spil](#spillene-og-skift-af-spil)).
Samme endpoints, samme `join`/`resume`/`ping`/`react`, og samme `joined`/`state`/`error`. Snapshot har `"game": "tegn"`.
3-10 spillere; dem der joiner efter start, bliver publikum (de kan give hjerter).