Align crew hand sizes and card refresh with the rules

This commit is contained in:
2026-09-04 19:22:52 -07:00
parent 749bef6ff1
commit 673a26f271
5 changed files with 53 additions and 29 deletions
+41 -7
View File
@@ -512,6 +512,7 @@ def test_transition_to_deep_upkeep(session):
def test_confirm_deep_refresh(session):
game = crud.create_game(session)
p1 = crud.add_player(session, game.id, "P1")
game.phase = "deep_upkeep"
p1.previous_role = "deep"
p1.role = "deep"
p1.rank = 2
@@ -548,11 +549,11 @@ def test_confirm_deep_refresh(session):
assert "7H" in hand
assert len(hand) == 4
# Discarded cards should be at the end of the deck
# Discarded cards stay out until scene setup
deck = json.loads(game.deck_cards)
assert "2C" in deck
assert "3C" in deck
assert deck == ["8H", "2C", "3C"]
assert "2C" not in deck
assert "3C" not in deck
assert deck == ["8H"]
# Since P1 was the only resting deep player and is now ready, phase should have advanced to scene_setup!
assert game.phase == "scene_setup"
@@ -1184,11 +1185,11 @@ def test_vote_skips_when_only_dead_options(session):
def test_rank_up_draws_immediately(session):
game, deep, (p2, p3) = make_scene_game(session, num_pirats=2)
# p2 is rank 1 (lowest -> max 2), p3 is rank 2 (highest -> max 4)
# p2 starts lowest. Reaching rank 3 ties the Deep for highest.
hand_before = len(crud.get_player_hand(p2))
crud.toggle_objective(session, game.id, p2.id, "personal_1", True)
crud.change_player_rank(session, game, p2, 2)
session.refresh(p2)
assert p2.rank == 2
assert p2.rank == 3
# p2 jumped from lowest (2 cards) to highest-tied (4 cards): draws 2 immediately
assert len(crud.get_player_hand(p2)) == hand_before + 2
@@ -2692,3 +2693,36 @@ def test_setup_joker_only_increases_following_scene(session, monkeypatch):
assert len(game.obstacles) == 2
assert game.extra_obstacles == 1
assert crud.get_game_deck(game) == ["4H"]
def test_hand_sizes_use_crew_ranks_and_ignore_role_changes(session):
game, deep, (low, middle) = make_scene_game(session, num_pirats=2)
assert [crud.calculate_max_hand_size(p, game.players) for p in (low, middle, deep)] == [2, 3, 4]
low.role, deep.role = "deep", "pirat"
assert [crud.calculate_max_hand_size(p, game.players) for p in (low, middle, deep)] == [2, 3, 4]
def test_draw_stops_at_empty_deck_without_recycling(session):
game, deep, (rat,) = make_scene_game(session)
rat.hand_cards = '[]'
game.deck_cards = '["AH"]'
session.commit()
assert crud.draw_cards_for_player(session, game, rat, 3) == ["AH"]
assert crud.get_player_hand(rat) == ["AH"]
assert crud.get_game_deck(game) == []
def test_deep_refresh_does_not_recycle_discards_or_allow_pirats(session):
game, deep, (rat,) = make_scene_game(session)
game.phase = "deep_upkeep"
deep.hand_cards = '["KC"]'
rat.hand_cards = '["QC"]'
game.deck_cards = '["AH", "2H", "3H", "4H"]'
session.commit()
crud.confirm_deep_refresh(session, rat.id, ["QC"])
assert crud.get_player_hand(rat) == ["QC"]
crud.confirm_deep_refresh(session, deep.id, ["KC"])
assert crud.get_player_hand(deep) == ["AH", "2H", "3H", "4H"]
assert "KC" not in crud.get_game_deck(game)
crud.confirm_deep_refresh(session, deep.id, ["AH"])
assert "AH" in crud.get_player_hand(deep)