Rum: reglernes oplæsning ligger i BaseRoom

Tegn og Gæts _narrate_rules (et regelkort pr. replik, i replikkens længde)
flyttes uændret til BaseRoom, så Spionen kan bruge den samme. Fup og Fakta
har sin egen og er uberørt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
agw
2026-10-20 21:59:52 +02:00
co-authored by Claude Opus 5.5
parent d17493f76b
commit 2980a7d7b0
2 changed files with 21 additions and 19 deletions
+21
View File
@@ -49,6 +49,7 @@ PROGRESS_PER_QUESTION = 2
EXPLODE_EACH_MS = 250 # opsummeringen: tid pr. løgn, der eksploderer
COUNT_UP_MS = 2600 # opsummeringen: pointene tæller op
MIC_ACTIVE_FOR = 25 # mikrofonen regnes som tændt så længe efter sidste lydstump
RULES_STEP_MS = 5000 # et regelkort uden stemme
_rooms: dict[str, "BaseRoom"] = {}
@@ -210,6 +211,26 @@ class BaseRoom:
"""Telefonens handlinger ud over join og resume."""
await conn.send_error("bad_request", "Ukendt handling.")
async def _narrate_rules(self):
"""Reglerne: ét kort pr. replik, med replikkens længde (Tegn og Gæt og Spionen; Fup og Fakta har sin egen)."""
g = self.game
g.hold_rules(time.time(), max_wait=REVEAL_AUDIO_WAIT + 2 + max(0.0, self.speech_end - time.time()))
self.changed()
try:
results = await asyncio.wait_for(asyncio.gather(*[self._synth(r["say"]) for r in g.rules]),
timeout=REVEAL_AUDIO_WAIT)
except asyncio.TimeoutError:
results = [None] * len(g.rules)
wait = min(self.speech_end - time.time(), MAX_HOLD)
if wait > 0:
await asyncio.sleep(wait)
if g.phase != "rules" or g.rules_started_at is not None:
return
g.rules_audio = [{"url": a["url"], "ms": a["ms"], "text": r["say"]} if a else None
for a, r in zip(results, g.rules)]
g.start_rules_timeline(time.time(), [max(2500, a["ms"] + 600) if a else RULES_STEP_MS for a in results])
self.changed()
# ── speakerens kø ────────────────────────────────────────────────────────
async def _synth(self, text: str, voice: str | None = None) -> dict | None:
"""Lyden til en replik: fra cachen eller live (tts.synth). Kan den ikke laves, og kender replikken en
-19
View File
@@ -242,25 +242,6 @@ class TegnRoom(rooms.BaseRoom):
g.start_reveal_timeline(time.time(), steps_ms)
self.changed()
async def _narrate_rules(self):
"""Reglerne: ét kort pr. replik, som i Fup og Fakta."""
g = self.game
g.hold_rules(time.time(), max_wait=rooms.REVEAL_AUDIO_WAIT + 2 + max(0.0, self.speech_end - time.time()))
self.changed()
try:
results = await asyncio.wait_for(asyncio.gather(*[self._synth(r["say"]) for r in g.rules]),
timeout=rooms.REVEAL_AUDIO_WAIT)
except asyncio.TimeoutError:
results = [None] * len(g.rules)
wait = min(self.speech_end - time.time(), rooms.MAX_HOLD)
if wait > 0:
await asyncio.sleep(wait)
if g.phase != "rules" or g.rules_started_at is not None:
return
g.rules_audio = [{"url": a["url"], "ms": a["ms"], "text": r["say"]} if a else None
for a, r in zip(results, g.rules)]
g.start_rules_timeline(time.time(), [max(2500, a["ms"] + 600) if a else RULES_STEP_MS for a in results])
self.changed()
def warm_texts(themes: list[dict] | None = None) -> list[str]: