Spionen: to spioner i flertal, også når de slipper

Fra QA: med to spioner åbnede resultatet stadig med en replik i ental, når
begge slap (lighed, ingen stemmer) eller den anklagede var uskyldig. Nu er
der result_free_two og result_innocent_two (den sidste også generisk).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
agw
2026-10-20 21:59:58 +02:00
co-authored by Claude Opus 5.5
parent 3ed6f252ec
commit b83a464e24
4 changed files with 41 additions and 7 deletions
+4 -5
View File
@@ -28,7 +28,7 @@ HURRY_BEFORE = 10
# Replikker uden navne og uden ordet: dem kan tts_warm lave på forhånd (resten har en generisk afløser).
FIXED_LINES = ("lobby_welcome", "round_first", "round_last", "clue_hurry", "clue_all_done", "clues_intro",
"clues_missing", "talk_start", "vote_start", "vote_all_done", "verdict_tie", "verdict_none",
"result_guessed", "result_missed", "result_timeout", "result_free", "result_left", "result_half", "play_again")
"result_guessed", "result_missed", "result_timeout", "result_free", "result_free_two", "result_left", "result_half", "play_again")
AWARD_LINES = {"liar": "award_liar", "sharp": "award_sharp", "suspected": "award_suspected"}
@@ -115,9 +115,9 @@ class SpionRoom(rooms.BaseRoom):
if t == "guess":
return [line("guess_start", navn=ev["name"])]
if t == "result":
out = []
out, two = [], len(ev["spies"]) > 1
if ev["accused_innocent"]:
out.append(line("result_innocent", navn=self._accused_name()))
out.append(line("result_innocent_two" if two else "result_innocent", navn=self._accused_name()))
elif ev["spies_left"]:
out.append(line("result_left"))
elif ev["caught"] and len(ev["spies"]) > 1 and not ev["guessed"]:
@@ -126,8 +126,7 @@ class SpionRoom(rooms.BaseRoom):
g = self.game
out.append(line("result_guessed" if ev["guessed"] else "result_missed" if g.guess else "result_timeout"))
else:
out.append(line("result_free"))
two = len(ev["spies"]) > 1
out.append(line("result_free_two" if two else "result_free"))
out.append(line("result_reveal_two" if two else "result_reveal", spioner=join_names(ev["spies"]), ord=ev["word"]))
return out
if t == "final":
+19 -2
View File
@@ -10,7 +10,7 @@ from channels.testing.websocket import WebsocketCommunicator
from django.test import SimpleTestCase, TransactionTestCase, override_settings
from party import rooms, tts
from party.spion import SpionRoom, create_spion_room, warm_generic, warm_texts
from party.spion import LINES as SPION_LINES, SpionRoom, create_spion_room, warm_generic, warm_texts
from party.tegn import create_tegn_room
from party.tests.test_switch import HOST, drain
from party.tests.test_ws import HOST_HEADERS, recv_until
@@ -237,6 +237,10 @@ class SpionSpeakerTests(SimpleTestCase):
self.assertEqual(sorted({t for t in plain if t not in warm}), [])
def spion_lines(key):
return SPION_LINES[key]
class SpionResultLineTests(SimpleTestCase):
def room(self, n):
g = Game("TEST", spy_themes(), rng=random.Random(5), rounds=3)
@@ -264,8 +268,9 @@ class SpionResultLineTests(SimpleTestCase):
def test_two_spies_in_plural(self):
room, g = self.room(8)
lines, ev = self.result_lines(room, g)
lines, ev = self.result_lines(room, g) # ingen stemmer: begge slap
self.assertEqual(len(ev["spies"]), 2)
self.assertIn(lines[0], room.narrator.variants("result_free_two"))
self.assertIn("spioner", lines[-1].lower())
self.assertTrue(all(n in lines[-1] for n in ev["spies"]))
@@ -280,3 +285,15 @@ class SpionResultLineTests(SimpleTestCase):
self.assertTrue(ev["caught"] and not ev["guessed"])
self.assertIn(lines[0], room.narrator.variants("result_half"))
self.assertIn("spioner", lines[-1].lower())
def test_innocent_accused_with_two_spies(self):
room, g = self.room(8)
while g.phase != "vote":
g.skip(10)
agent = next(p for p in g.order if p not in g.spies)
for pid in g.order:
g.vote(pid, agent if pid != agent else g.spies[0], 3)
lines, ev = self.result_lines(room, g)
self.assertIn("spion", lines[0].lower())
self.assertTrue(any(lines[0] == room.narrator.fill(v, {"navn": g.players[agent].name})
for v in spion_lines("result_innocent_two")))
+7
View File
@@ -27,6 +27,13 @@
"Uskyldig hele vejen. Spionen slap væk under jeres næse.",
"I tog fejl. Spionen er stadig blandt jer."
],
"result_innocent_two": [
"Forkert! Den anklagede var uskyldig, og begge spioner gik fri.",
"[laughs] Uskyldig! De to rigtige spioner smiler nu.",
"Det var ikke en spion. Undskyld og tak for indsatsen.",
"Uskyldig hele vejen. Spionerne slap væk under jeres næse.",
"I tog fejl. Spionerne er stadig blandt jer."
],
"result_reveal": [
"Spionen og ordet står nu på skærmen.",
"Her er sandheden. Kig på skærmen.",
+11
View File
@@ -120,6 +120,12 @@
"Det var ikke {navn}. Den rigtige spion smiler nu.",
"Uskyldig! Undskyld, {navn}."
],
"result_innocent_two": [
"{navn} var uskyldig! Begge spioner gik fri.",
"[laughs] Forkert! {navn} kendte ordet, og spionerne smiler.",
"Det var ikke {navn}. De to rigtige spioner slap væk.",
"Uskyldig! Undskyld, {navn}. Spionerne takker."
],
"result_guessed": [
"Spionen gættede ordet! Sikke en redning.",
"[impressed] Rigtigt gæt! Spionen vinder alligevel.",
@@ -141,6 +147,11 @@
"[mischievously] Spionen gik under radaren.",
"Spionen klarede den. Agenterne må tage sig sammen."
],
"result_free_two": [
"Begge spioner slap væk.",
"[mischievously] Spionerne gik under radaren.",
"Spionerne klarede den. Agenterne må tage sig sammen."
],
"result_left": [
"Spionen forlod missionen. Ingen point for det.",
"[sighs] Spionen er gået. Så må vi tage runden uden.",