Align crew hand sizes and card refresh with the rules
This commit is contained in:
+41
-7
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user