Defer challenge redraws until resolution and limit card plays

This commit is contained in:
2026-09-04 19:28:20 -07:00
parent cf63ffed47
commit 8b67d78f25
6 changed files with 74 additions and 26 deletions
+42 -11
View File
@@ -216,21 +216,14 @@ def test_scene_start_and_challenges(session):
# Obstacle current value should update to 10
assert obs.current_value == 10
# Check if hand size matches card draw rule
# 10D was played (-1 card). If colors matched, drew 1 back (+1 card).
hand = crud.get_player_hand(p2)
if orig_is_red:
assert len(hand) == 4
assert res["drew_card"] is not None
else:
assert len(hand) == 3
assert res["drew_card"] is None
# The Deep resolves the challenge: at least one success -> succeeded
# Replacements wait until the Deep resolves the Challenge.
assert len(crud.get_player_hand(p2)) == 3
assert res["drew_card"] is None
ok, msg = crud.resolve_challenge(session, challenge.id, deep.id)
assert ok
session.refresh(challenge)
assert challenge.status == "succeeded"
assert len(crud.get_player_hand(p2)) == (4 if orig_is_red else 3)
def test_assistant_does_not_draw(session):
game, deep, (p2, p3) = make_scene_game(session, num_pirats=2)
@@ -2855,3 +2848,41 @@ def test_pvp_redraw_depends_on_color_not_success(session, defense, success, redr
assert crud.get_player_hand(attacker) == []
assert crud.get_player_hand(defender) == (['AD'] if redraw else [])
assert not crud.play_pvp_defense(session, duel.id, defender.id, 'AD')[0]
def test_challenge_draw_waits_for_resolution_and_cannot_repeat(session):
game, deep, (rat, helper) = make_scene_game(session, num_pirats=2)
obs = game.obstacles[0]
obs.original_card, obs.suit, obs.current_value = '7C', 'C', 7
rat.hand_cards = '["2S", "9S"]'
game.deck_cards = '["AD"]'
session.commit()
assert crud.create_challenge(session, game.id, deep.id, rat.id, [obs.id])[0]
challenge = game.challenges[0]
assert crud.play_challenge_card(session, rat.id, obs.id, '2S')[0]
assert crud.get_player_hand(rat) == ['9S']
assert not crud.play_challenge_card(session, rat.id, obs.id, '9S')[0]
assert not crud.request_tax(session, challenge.id, rat.id, helper.id)[0]
assert crud.resolve_challenge(session, challenge.id, deep.id)[0]
assert challenge.status == 'failed'
assert crud.get_player_hand(rat) == ['9S', 'AD']
assert not crud.resolve_challenge(session, challenge.id, deep.id)[0]
assert crud.get_player_hand(rat) == ['9S', 'AD']
def test_completed_obstacle_still_awards_deferred_draw(session):
game, deep, (rat,) = make_scene_game(session)
obs = game.obstacles[0]
obs.original_card = '7C'
obs.played_cards = '[{"card":"JC", "success":true}]'
rat.hand_cards = '["QS"]'
game.deck_cards = '["AD"]'
session.commit()
assert crud.create_challenge(session, game.id, deep.id, rat.id, [obs.id])[0]
challenge = game.challenges[0]
oid = obs.id
assert crud.play_challenge_card(session, rat.id, oid, 'QS')[0]
assert session.get(Obstacle, oid) is None
assert crud.get_player_hand(rat) == []
assert crud.resolve_challenge(session, challenge.id, deep.id)[0]
assert crud.get_player_hand(rat) == ['AD']