From b83a464e24d6abaa879fb368493f22524df8ebe1 Mon Sep 17 00:00:00 2001 From: Asger Geel Weirsoee Date: Tue, 20 Oct 2026 21:59:58 +0200 Subject: [PATCH] =?UTF-8?q?Spionen:=20to=20spioner=20i=20flertal,=20ogs?= =?UTF-8?q?=C3=A5=20n=C3=A5r=20de=20slipper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- party/spion.py | 9 ++++----- party/tests/test_spion.py | 21 +++++++++++++++++++-- spionen/narrator/generic.json | 7 +++++++ spionen/narrator/lines.json | 11 +++++++++++ 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/party/spion.py b/party/spion.py index d7b63ea..28120e4 100644 --- a/party/spion.py +++ b/party/spion.py @@ -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": diff --git a/party/tests/test_spion.py b/party/tests/test_spion.py index 728af62..04734c4 100644 --- a/party/tests/test_spion.py +++ b/party/tests/test_spion.py @@ -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"))) diff --git a/spionen/narrator/generic.json b/spionen/narrator/generic.json index e61ceb5..bf7047a 100644 --- a/spionen/narrator/generic.json +++ b/spionen/narrator/generic.json @@ -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.", diff --git a/spionen/narrator/lines.json b/spionen/narrator/lines.json index 204efba..2bedfab 100644 --- a/spionen/narrator/lines.json +++ b/spionen/narrator/lines.json @@ -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.",