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:
@@ -1,6 +1,6 @@
|
||||
# Weirsøe Party Protocol
|
||||
|
||||
Dansk party-spil i stil med Jackbox. Spillet vises på en storskærm, og spillerne er med fra deres telefoner. Første spil er **Fup og Fakta**: alle finder på en troværdig løgn til et kuriøst faktum, og så skal man finde sandheden blandt løgnene. I **Tegn og Gæt** går kæder af ord, tegninger og gæt bordet rundt, og til sidst ser alle, hvad der blev af det første ord. Værten vælger spil, når det oprettes.
|
||||
Dansk party-spil i stil med Jackbox. Spillet vises på en storskærm, og spillerne er med fra deres telefoner. Første spil er **Fup og Fakta**: alle finder på en troværdig løgn til et kuriøst faktum, og så skal man finde sandheden blandt løgnene. I **Tegn og Gæt** går kæder af ord, tegninger og gæt bordet rundt, og til sidst ser alle, hvad der blev af det første ord. Værten vælger spil i menuen på storskærmen (piletaster/fjernbetjening, Enter og mus) og kan skifte til et andet spil i samme rum efter podiet, uden at telefonerne skal joine igen.
|
||||
|
||||
- Spillere: `https://party.weircon.dk` og indtast koden fra skærmen (eller scan QR-koden).
|
||||
- Vært: `https://party.weircon.dk/host/` (Authentik, grupperne Familie og authentik Admins).
|
||||
@@ -14,7 +14,7 @@ Serveren er autoritativ. Hver skærm har én WebSocket, sender handlinger og få
|
||||
| --- | --- |
|
||||
| `fupogfakta/` | Spilmotor, modeller for kategorier og spørgsmål, spørgsmålsbank i `data/*.json` |
|
||||
| `tegnoggaet/` | Spilmotor for Tegn og Gæt, temaer i `data/themes.json`, speakerens replikker |
|
||||
| `party/` | Rum, WebSocket-consumers, sider, Authentik-header-login, templates og JS/CSS |
|
||||
| `party/` | Rum, WebSocket-consumers, sider, Authentik-header-login, templates og JS/CSS; spilregistret i `games.py` |
|
||||
| `partyhub/` | Django-projekt (settings, ASGI) |
|
||||
| `deploy/` | systemd-unit, miljøfil-skabelon og `deploy.sh` |
|
||||
|
||||
@@ -34,7 +34,9 @@ export DJANGO_DEBUG=true DEV_HOST_USER=dev
|
||||
|
||||
Én uvicorn-proces (`--workers 1`) bag en reverse proxy med TLS. Proxyen beskytter `/host/`, `/ws/host/` og `/admin/` med Authentik forward-auth og sender `X-authentik-username` og `X-authentik-groups` videre; på alle andre stier skal den blanke de headere. Appen stoler kun på dem fra adresserne i `TRUSTED_PROXIES`, så appens port bør kun kunne nås fra proxyen. Se `deploy/wpp.env.example` for miljøvariabler.
|
||||
|
||||
`deploy/bots.py` spiller et helt spil mod en kørende server (`--game tegn` for Tegn og Gæt) og kan også fylde et spil op med bots (`--code`). Alle skærme kan ses uden server i `party/static/party/dev.html` (`?game=tegn&phase=draw` for Tegn og Gæt).
|
||||
`deploy/bots.py` spiller et helt spil mod en kørende server (`--game tegn` for Tegn og Gæt) og kan også fylde et spil op med bots (`--code`). Alle skærme kan ses uden server i `party/static/party/dev.html` (`?game=tegn&phase=draw` for Tegn og Gæt, `?game=menu` for menuen og introerne).
|
||||
|
||||
Et nyt spil registreres i `party/games.py` (navn, tagline, trin, ikon, indstillinger, rum og JS); menuen, `/host/new`, storskærmen og telefonen finder det dér. Kør `WPP_WRITE_FIXTURE=1 DJANGO_DEBUG=true .venv/bin/python manage.py test party.tests.test_games` bagefter, så `dev.html` får det med.
|
||||
|
||||
## Spørgsmål
|
||||
|
||||
|
||||
+25
-3
@@ -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).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user