From d22f1d5e2e42fcb9cba9999758ab12ecadfae828 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Tue, 20 Oct 2026 21:59:59 +0200 Subject: [PATCH] =?UTF-8?q?Tegn=20og=20G=C3=A6t:=20tegn=20dit=20eget=20ord?= =?UTF-8?q?=20p=C3=A5=20telefon,=20storsk=C3=A6rm=20og=20speaker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Telefonen og storskærmen siger "Tegn dit eget ord" i trin 1 ved et lige antal spillere, og speakeren har fem faste replikker til det (forvarmes med de andre faste). dev.html?game=tegn har fasen draw-own. Co-Authored-By: Claude Opus 5.5 --- party/static/party/tegn-fixtures.js | 11 +++++++++-- party/static/party/tegn.js | 7 ++++--- party/tegn.py | 4 ++-- party/tests/test_tegn.py | 4 ++++ tegnoggaet/narrator/lines.json | 7 +++++++ tegnoggaet/tests/test_lines.py | 2 +- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/party/static/party/tegn-fixtures.js b/party/static/party/tegn-fixtures.js index ab4a484..b2a2de7 100644 --- a/party/static/party/tegn-fixtures.js +++ b/party/static/party/tegn-fixtures.js @@ -3,8 +3,8 @@ 'use strict'; var COLORS = ['#ff4d6d', '#4cc9f0', '#ffd166', '#06d6a0', '#b388ff']; var NAMES = ['Asger', 'Sus', 'Bo', 'Mette', 'Kasper']; - var PHASES = ['lobby', 'rules', 'theme', 'word', 'draw', 'guess', 'reveal-wait', 'reveal', 'reveal-guess', 'reveal-end', 'final']; - var REAL = { 'reveal-wait': 'reveal', 'reveal-guess': 'reveal', 'reveal-end': 'reveal' }; + var PHASES = ['lobby', 'rules', 'theme', 'word', 'draw', 'draw-own', 'guess', 'reveal-wait', 'reveal', 'reveal-guess', 'reveal-end', 'final']; + var REAL = { 'draw-own': 'draw', 'reveal-wait': 'reveal', 'reveal-guess': 'reveal', 'reveal-end': 'reveal' }; var INK = ['#1d1b2e', '#e63946', '#2a7de1', '#2bb673']; function circle(cx, cy, r, n) { @@ -119,6 +119,13 @@ mes[1].task = { kind: 'draw', done: true, from: 'p1', text: 'kat', drawing: null, mine: null, draft: null }; mes[2].task = { kind: 'draw', done: false, from: 'p2', text: 'pizza', drawing: null, mine: null, draft: CAT.slice(0, 4) }; break; + case 'draw-own': /* lige antal spillere: trin 1 tegner ejeren sit eget ord */ + host.theme = theme; host.step = { index: 1, number: 2, of: 5, kind: 'draw', own: true }; host.deadline = now + 61000; + host.players = players(4, [{}, { done: true }]); + mes[0].task = { kind: 'draw', done: false, from: 'p1', text: 'kat', drawing: null, mine: null, draft: null }; + mes[1].task = { kind: 'draw', done: true, from: 'p2', text: 'pizza', drawing: null, mine: null, draft: null }; + mes[2].task = { kind: 'draw', done: false, from: 'p3', text: 'giraf', drawing: null, mine: null, draft: CAT.slice(0, 4) }; + break; case 'guess': host.theme = theme; host.step = { index: 2, number: 3, of: 5, kind: 'guess' }; host.deadline = now + 18000; mes[0].task = { kind: 'guess', done: false, from: 'p4', text: null, drawing: DOG, mine: null, draft: null }; diff --git a/party/static/party/tegn.js b/party/static/party/tegn.js index 06b4d56..b0a71b0 100644 --- a/party/static/party/tegn.js +++ b/party/static/party/tegn.js @@ -163,7 +163,7 @@ var out = '

' + stepLabel(state) + '

'; if (!t) return out + big('Spillerne tegner…', 'Kig med på storskærmen bagefter.', 'aud', 'pulse'); if (t.done) return out + big('Flot tegnet!', 'Venter på de andre…', 'done', 'pop') + doneCount(state); - var s = tg(u), full = s.full; + var s = tg(u), full = s.full, own = !!(state.step && state.step.own); var tools = PALETTE.map(function (c) { return ''; }).join('') + WIDTHS.map(function (w, i) { @@ -171,7 +171,7 @@ }).join('') + '' + ''; - return out + '
Tegn' + esc(t.text || '') + '
' + + return out + '
' + (own ? 'Tegn dit eget ord' : 'Tegn') + '' + esc(t.text || '') + '
' + '
' + '
' + tools + '
' + (full ? '

Tegningen er fuld. Send den, eller fortryd lidt.

' : '') + @@ -356,6 +356,7 @@ var KIND_TEXT = { word: 'Skriv et ord om temaet på din telefon!', draw: 'Tegn det ord, du har fået!', + own: 'Tegn dit eget ord!', guess: 'Hvad forestiller tegningen? Skriv dit gæt!' }; var host = {}; @@ -377,7 +378,7 @@ '
' + esc(stepLabel(state)) + ' · ' + esc((t.icon ? t.icon + ' ' : '') + (t.name || '')) + '
' + '
' + KIND_ICON[kind] + '
' + '

' + ({ word: 'Skriv et ord', draw: 'Tegn!', guess: 'Gæt tegningen' })[kind] + '

' + - '

' + KIND_TEXT[kind] + '

' + + '

' + KIND_TEXT[state.step && state.step.own ? 'own' : kind] + '

' + '
' + WPP.timerHtml(state, 'ring') + '
'; } host.word = host.draw = host.guess = stepScreen; diff --git a/party/tegn.py b/party/tegn.py index 82b3fe0..4565692 100644 --- a/party/tegn.py +++ b/party/tegn.py @@ -30,7 +30,7 @@ BEAT_PAD_MS = 700 # luft efter speakerens replik i et trin af afsløringe HURRY_BEFORE = 10 # "ti sekunder tilbage" # Replikker uden navne eller spillertekst, som rummet siger alene: dem kan tts_warm lave på forhånd. # reveal_intro er udeladt med vilje: den siges kun sammen med første kædes intro, som har et navn. -FIXED_LINES = ("lobby_welcome", "draw_start", "guess_start", "step_hurry", "step_all_done", "play_again") +FIXED_LINES = ("lobby_welcome", "draw_start", "draw_own_start", "guess_start", "step_hurry", "step_all_done", "play_again") THEME_LINES = ("theme_chosen", "theme_timeout", "word_start") # {tema}: ét sæt pr. tema COUNT_LINES = ("game_start",) # {antal_spillere}: ét sæt pr. antal spillere AWARD_LINES = {"drawing": "award_best_drawing", "guess": "award_best_guess", "survived": "award_survived", @@ -161,7 +161,7 @@ class TegnRoom(rooms.BaseRoom): if t == "step": if ev["step"] == "word": return [line("word_start", tema=ev["theme"])] - return [line(f"{ev['step']}_start")] + return [line("draw_own_start" if ev.get("own") else f"{ev['step']}_start")] if t in ("step_all_done", "play_again"): return [line(t)] if t == "final": diff --git a/party/tests/test_tegn.py b/party/tests/test_tegn.py index 973ee5b..ca37b53 100644 --- a/party/tests/test_tegn.py +++ b/party/tests/test_tegn.py @@ -187,6 +187,10 @@ class TegnSpeakerTests(SimpleTestCase): room = TegnRoom("TEST", g, "agw") self.assertIn("Dyr", room.lines_for({"type": "theme_chosen", "theme": "Dyr", "timeout": False})[0]) self.assertIn("Dyr", room.lines_for({"type": "step", "step": "word", "theme": "Dyr"})[0]) + own = room.lines_for({"type": "step", "step": "draw", "theme": "Dyr", "own": True})[0] + self.assertIn(own, room.narrator.variants("draw_own_start")) # lige antal: ejeren tegner sit eget ord + self.assertIn(room.lines_for({"type": "step", "step": "draw", "theme": "Dyr", "own": False})[0], + room.narrator.variants("draw_start")) lines = room.lines_for({"type": "final", "winner": "Bo", "points": 600, "awards": [{"kind": "drawing", "name": "Sus"}]}) self.assertIn("seks hundrede", lines[0]) diff --git a/tegnoggaet/narrator/lines.json b/tegnoggaet/narrator/lines.json index 5872cb8..39f6c4b 100644 --- a/tegnoggaet/narrator/lines.json +++ b/tegnoggaet/narrator/lines.json @@ -64,6 +64,13 @@ "Tegn løs. Det behøver ikke være kønt, bare genkendeligt.", "Fingrene frem. Tegn det, du ser på skærmen." ], + "draw_own_start": [ + "Tegn dit eget ord. Ingen bogstaver!", + "[excited] Først tegner I jeres eget ord. Kun streger.", + "Nu skal I tegne det ord, I selv skrev. Gør det tydeligt.", + "Jeres eget ord først. Tegn det, så de andre kan gætte det.", + "Tegn det ord, du selv fandt på. Bare streger, ingen bogstaver." + ], "guess_start": [ "Hvad forestiller tegningen? Skriv dit gæt.", "Kig godt på tegningen. Hvad er det?", diff --git a/tegnoggaet/tests/test_lines.py b/tegnoggaet/tests/test_lines.py index 0fa8d98..56129b6 100644 --- a/tegnoggaet/tests/test_lines.py +++ b/tegnoggaet/tests/test_lines.py @@ -14,7 +14,7 @@ LINES = Path(__file__).resolve().parents[1] / "narrator" / "lines.json" EVENTS = { "lobby_welcome": set(), "lobby_join": {"navn"}, "lobby_waiting": {"vip"}, "game_start": {"antal_spillere"}, "theme_choose": {"vip"}, "theme_chosen": {"tema"}, "theme_timeout": {"tema"}, "word_start": {"tema"}, - "draw_start": set(), "guess_start": set(), "step_hurry": set(), "step_all_done": set(), + "draw_start": set(), "draw_own_start": set(), "guess_start": set(), "step_hurry": set(), "step_all_done": set(), "reveal_intro": set(), "chain_intro": {"navn"}, "chain_survived": {"ord"}, "chain_changed": {"ord", "gaet"}, "award_best_drawing": {"navn"}, "award_best_guess": {"navn"}, "award_survived": {"navn"}, "award_transformed": {"navn"}, "winner": {"vinder", "point"}, "play_again": set(),