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:
@@ -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
|
||||
|
||||
@@ -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]:
|
||||
|
||||
Reference in New Issue
Block a user