diff --git a/party/static/party/dev-fixtures.js b/party/static/party/dev-fixtures.js
index 366853c..8b9a434 100644
--- a/party/static/party/dev-fixtures.js
+++ b/party/static/party/dev-fixtures.js
@@ -88,7 +88,7 @@
opts = opts || {};
var now = Date.now();
var base = {
- code: 'KLMT', phase: REAL[phase] || phase, server_time: now, deadline: null, phase_key: '0.1.' + (REAL[phase] || phase), narration: [],
+ game: 'fof', code: 'KLMT', phase: REAL[phase] || phase, server_time: now, deadline: null, phase_key: '0.1.' + (REAL[phase] || phase), narration: [],
join_url: 'https://party.weircon.dk/?code=KLMT', min_players: 2, max_players: 8,
round: { number: 1, name: 'Runde 1', multiplier: 1, question_number: 2, questions_in_round: 3 },
players: players(6), audience_count: 3
diff --git a/party/static/party/dev.html b/party/static/party/dev.html
index 15336b2..47c8366 100644
--- a/party/static/party/dev.html
+++ b/party/static/party/dev.html
@@ -3,7 +3,7 @@
- Fup og Fakta – dev-harness
+ Weirsøe Party Protocol: dev-harness
@@ -34,8 +36,10 @@
+
+
@@ -46,8 +50,17 @@
var phase = qs.get('phase') || 'lobby';
var t = qs.get('t');
var only = qs.get('only');
- /* ?game=tegn: Tegn og Gæts skærme (samme storskærm/telefon-kode, egne fixtures) */
- var FX = qs.get('game') === 'tegn' ? WPPTegnFixtures : WPPFixtures;
+ /* ?game=tegn: Tegn og Gæts skærme (samme storskærm/telefon-kode, egne fixtures); ?game=menu: spilmenuen */
+ var MENU = {
+ phases: ['menu', 'intro-fof', 'intro-tegn', 'skift-menu', 'skift-intro'],
+ build: function (p) {
+ var sw = p.indexOf('skift') === 0 ? { code: 'KLMT', players: 11 } : null;
+ var key = p === 'intro-fof' ? 'fof' : p === 'menu' || p === 'skift-menu' ? null : 'tegn';
+ return { menu: key ? { screen: 'intro', key: key, values: {}, sw: sw } : { screen: 'menu', sw: sw }, phones: [] };
+ }
+ };
+ var FX = { tegn: WPPTegnFixtures, menu: MENU }[qs.get('game')] || WPPFixtures;
+ if (FX === MENU) { phase = MENU.phases.indexOf(phase) >= 0 ? phase : 'menu'; document.body.classList.add('only-host-panel'); }
if (only) document.body.classList.add('only-' + only);
if (qs.get('pw')) Array.prototype.forEach.call(document.querySelectorAll('.phonebox'), function (e) { e.style.width = qs.get('pw') + 'px'; });
var bar = document.getElementById('bar');
@@ -58,6 +71,7 @@
function draw() {
var fx = cur = FX.build(phase, { t: t, fest: qs.get("fest") === "1" });
var hostRoot = document.getElementById('hostroot');
+ if (fx.menu) { WPPMenu.render(hostRoot, fx.menu); return; }
hostCtx = { harness: true, sound: qs.get('sound') === '1', send: log, qrSrc: WPPFixtures.qr };
if (fx.drawings) WPPTegn.setDrawings(hostRoot, fx.drawings);
WPPHost.renderHost(hostRoot, fx.host, hostCtx);
@@ -76,6 +90,11 @@
});
}
+ ['fof', 'tegn', 'menu'].forEach(function (g) {
+ var a = document.createElement('a');
+ a.href = '?game=' + g; a.textContent = { fof: 'Fup og Fakta', tegn: 'Tegn og Gæt', menu: 'Menu' }[g];
+ bar.appendChild(a);
+ });
FX.phases.forEach(function (p) {
var b = document.createElement('button');
b.textContent = p; if (p === phase) b.className = 'on';
diff --git a/party/static/party/games-fixture.js b/party/static/party/games-fixture.js
new file mode 100644
index 0000000..5a1524a
--- /dev/null
+++ b/party/static/party/games-fixture.js
@@ -0,0 +1,82 @@
+/* Spilregistret (party/games.py) til dev.html, som ikke har en server. test_games tjekker, at det passer; skriv det
+ igen med: WPP_WRITE_FIXTURE=1 DJANGO_DEBUG=true .venv/bin/python manage.py test party.tests.test_games */
+window.WPP_GAMES = [
+ {
+ "key": "fof",
+ "name": "Fup og Fakta",
+ "tagline": "Find på løgne, der lyder sande, og find sandheden blandt dem.",
+ "min_players": 2,
+ "max_players": 8,
+ "minutes": "20-30",
+ "steps": [
+ "Et spørgsmål med et hul står på skærmen.",
+ "Alle skriver en løgn, der lyder som det rigtige svar.",
+ "Find sandheden blandt løgnene på din telefon.",
+ "Point for at finde sandheden og for hver, der hopper på din løgn."
+ ],
+ "icon": "games/fof.svg",
+ "settings": [
+ {
+ "name": "pack",
+ "label": "Spørgsmål",
+ "default": "alle",
+ "options": [
+ {
+ "value": "alle",
+ "label": "Alle"
+ },
+ {
+ "value": "familie",
+ "label": "Familie"
+ },
+ {
+ "value": "nørd",
+ "label": "Nørd"
+ },
+ {
+ "value": "arbejde",
+ "label": "Arbejde",
+ "hint": "Arbejdsspørgsmål: e-faktura, IT-sikkerhed og kategorier med pakken \"arbejde\"."
+ },
+ {
+ "value": "fest",
+ "label": "Fest-Z 🥃 18+",
+ "hint": "Slang, memes og dansk pop med zoomer-speaker. Narret = tag en tår, finalen er en shot."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "key": "tegn",
+ "name": "Tegn og Gæt",
+ "tagline": "Tegn, gæt og se ordene forvandle sig hele vejen rundt.",
+ "min_players": 3,
+ "max_players": 10,
+ "minutes": "10-20",
+ "steps": [
+ "Alle skriver et ord inden for temaet.",
+ "Telefonen sender ordet videre, og den næste tegner det.",
+ "Den næste ser kun tegningen og gætter, hvad den forestiller.",
+ "Til sidst ser vi, hvad ordene blev til. Giv hjerter til de bedste."
+ ],
+ "icon": "games/tegn.svg",
+ "settings": [
+ {
+ "name": "rules",
+ "label": "Reglerne",
+ "default": "1",
+ "options": [
+ {
+ "value": "1",
+ "label": "Vis reglerne først"
+ },
+ {
+ "value": "0",
+ "label": "Spring dem over"
+ }
+ ]
+ }
+ ]
+ }
+];
diff --git a/party/tests/test_games.py b/party/tests/test_games.py
index d20e1af..580156d 100644
--- a/party/tests/test_games.py
+++ b/party/tests/test_games.py
@@ -1,5 +1,7 @@
"""Registret over spil (party/games.py) og det, der læser fra det."""
+import json
+import os
import re
from pathlib import Path
from unittest import mock
@@ -54,6 +56,21 @@ class RegisterTests(TestCase):
self.assertNotRegex(f.read_text(encoding="utf-8"), r"""['"](tegn|fof)['"]|WPPTegn""")
+class HarnessFixtureTests(TestCase):
+ @override_settings(WORK_PACK_LABEL="Arbejde")
+ def test_dev_html_has_the_register(self):
+ path = STATIC / "games-fixture.js"
+ want = [dict(g, icon=g["icon"].split("/static/party/", 1)[-1]) for g in games.menu_data()]
+ text = path.read_text(encoding="utf-8")
+ head, _, body = text.partition("window.WPP_GAMES = ")
+ if os.environ.get("WPP_WRITE_FIXTURE"):
+ path.write_text(head + "window.WPP_GAMES = " + json.dumps(want, ensure_ascii=False, indent=2) + ";\n",
+ encoding="utf-8")
+ return
+ self.assertEqual(json.loads(body.rstrip().rstrip(";")), want,
+ "games-fixture.js passer ikke med registret; se filens første linjer")
+
+
@override_settings(TRUSTED_PROXIES=["127.0.0.1"], DEV_HOST_USER=None)
class RegisterViewTests(TestCase):
def setUp(self):