fix(gameplay): scope next-round selection to target round
This commit is contained in:
@@ -51,9 +51,9 @@ class ScoreboardTransitionResult:
|
|||||||
phase_event_payload: dict[str, Any] | None = None
|
phase_event_payload: dict[str, Any] | None = None
|
||||||
|
|
||||||
|
|
||||||
def get_current_round_question(session: GameSession) -> RoundQuestion | None:
|
def get_round_question(session: GameSession, round_number: int) -> RoundQuestion | None:
|
||||||
return (
|
return (
|
||||||
RoundQuestion.objects.filter(session=session, round_number=session.current_round)
|
RoundQuestion.objects.filter(session=session, round_number=round_number)
|
||||||
.select_related("question")
|
.select_related("question")
|
||||||
.order_by("-id")
|
.order_by("-id")
|
||||||
.first()
|
.first()
|
||||||
@@ -61,6 +61,11 @@ def get_current_round_question(session: GameSession) -> RoundQuestion | None:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_round_question(session: GameSession) -> RoundQuestion | None:
|
||||||
|
return get_round_question(session, session.current_round)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> RoundQuestion:
|
def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> RoundQuestion:
|
||||||
Guess.objects.filter(round_question=round_question).delete()
|
Guess.objects.filter(round_question=round_question).delete()
|
||||||
LieAnswer.objects.filter(round_question=round_question).delete()
|
LieAnswer.objects.filter(round_question=round_question).delete()
|
||||||
@@ -78,8 +83,14 @@ def reset_round_question_bootstrap_state(round_question: RoundQuestion) -> Round
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def select_round_question(session: GameSession, round_config: RoundConfig) -> RoundQuestion:
|
def select_round_question(
|
||||||
existing_round_question = get_current_round_question(session)
|
session: GameSession,
|
||||||
|
round_config: RoundConfig,
|
||||||
|
*,
|
||||||
|
round_number: int | None = None,
|
||||||
|
) -> RoundQuestion:
|
||||||
|
target_round_number = session.current_round if round_number is None else round_number
|
||||||
|
existing_round_question = get_round_question(session, target_round_number)
|
||||||
if existing_round_question is not None and existing_round_question.question.category_id == round_config.category_id:
|
if existing_round_question is not None and existing_round_question.question.category_id == round_config.category_id:
|
||||||
return existing_round_question
|
return existing_round_question
|
||||||
|
|
||||||
@@ -101,7 +112,7 @@ def select_round_question(session: GameSession, round_config: RoundConfig) -> Ro
|
|||||||
|
|
||||||
return RoundQuestion.objects.create(
|
return RoundQuestion.objects.create(
|
||||||
session=session,
|
session=session,
|
||||||
round_number=session.current_round,
|
round_number=target_round_number,
|
||||||
question=question,
|
question=question,
|
||||||
correct_answer=question.correct_answer,
|
correct_answer=question.correct_answer,
|
||||||
)
|
)
|
||||||
@@ -262,7 +273,9 @@ def start_next_round(session: GameSession) -> RoundTransitionResult:
|
|||||||
|
|
||||||
locked_session.current_round = next_round_number
|
locked_session.current_round = next_round_number
|
||||||
|
|
||||||
round_question = reset_round_question_bootstrap_state(select_round_question(locked_session, next_round_config))
|
round_question = reset_round_question_bootstrap_state(
|
||||||
|
select_round_question(locked_session, next_round_config, round_number=next_round_number)
|
||||||
|
)
|
||||||
|
|
||||||
locked_session.status = GameSession.Status.LIE
|
locked_session.status = GameSession.Status.LIE
|
||||||
locked_session.save(update_fields=["current_round", "status"])
|
locked_session.save(update_fields=["current_round", "status"])
|
||||||
|
|||||||
@@ -226,6 +226,39 @@ class FupOgFaktaExtractionSliceTests(TestCase):
|
|||||||
self.assertEqual(stale_round_question.lies.count(), 0)
|
self.assertEqual(stale_round_question.lies.count(), 0)
|
||||||
self.assertEqual(stale_round_question.guesses.count(), 0)
|
self.assertEqual(stale_round_question.guesses.count(), 0)
|
||||||
|
|
||||||
|
def test_start_next_round_does_not_reuse_previous_round_question_when_category_matches(self):
|
||||||
|
self.session.status = GameSession.Status.SCOREBOARD
|
||||||
|
self.session.save(update_fields=["status"])
|
||||||
|
previous_round_question = RoundQuestion.objects.create(
|
||||||
|
session=self.session,
|
||||||
|
round_number=1,
|
||||||
|
question=self.question_one,
|
||||||
|
correct_answer=self.question_one.correct_answer,
|
||||||
|
mixed_answers=["1989", "1991"],
|
||||||
|
)
|
||||||
|
LieAnswer.objects.create(round_question=previous_round_question, player=self.alice, text="1991")
|
||||||
|
Guess.objects.create(
|
||||||
|
round_question=previous_round_question,
|
||||||
|
player=self.bob,
|
||||||
|
selected_text="1991",
|
||||||
|
is_correct=False,
|
||||||
|
fooled_player=self.alice,
|
||||||
|
)
|
||||||
|
|
||||||
|
result = start_next_round(self.session)
|
||||||
|
|
||||||
|
previous_round_question.refresh_from_db()
|
||||||
|
self.session.refresh_from_db()
|
||||||
|
self.assertEqual(self.session.current_round, 2)
|
||||||
|
self.assertEqual(result.round_question.round_number, 2)
|
||||||
|
self.assertNotEqual(result.round_question.id, previous_round_question.id)
|
||||||
|
self.assertEqual(result.round_question.question_id, self.question_two.id)
|
||||||
|
self.assertEqual(previous_round_question.round_number, 1)
|
||||||
|
self.assertEqual(previous_round_question.question_id, self.question_one.id)
|
||||||
|
self.assertEqual(previous_round_question.mixed_answers, ["1989", "1991"])
|
||||||
|
self.assertEqual(previous_round_question.lies.count(), 1)
|
||||||
|
self.assertEqual(previous_round_question.guesses.count(), 1)
|
||||||
|
|
||||||
def test_finish_game_moves_scoreboard_transition_into_service(self):
|
def test_finish_game_moves_scoreboard_transition_into_service(self):
|
||||||
self.session.status = GameSession.Status.SCOREBOARD
|
self.session.status = GameSession.Status.SCOREBOARD
|
||||||
self.session.save(update_fields=["status"])
|
self.session.save(update_fields=["status"])
|
||||||
|
|||||||
Reference in New Issue
Block a user