File size: 3,944 Bytes
bb3fbf9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from engine.game.enums import Phase
from engine.game.game_state import GameState
from engine.models.card import LiveCard, MemberCard


def test_play_member_to_live_zone():
    """Test playing a Member card to Live Zone (Rule 8.2.2)"""
    # Initialize DB to avoid empty DB issues
    from engine.models.card import MemberCard

    GameState.member_db[1] = MemberCard(
        card_id=1, card_no="M1", name="Test", cost=1, blades=1, hearts=[1] * 7, blade_hearts=[0] * 7
    )

    game = GameState()

    # Setup: Phase to LIVE_SET
    game.phase = Phase.LIVE_SET
    p = game.players[game.current_player]

    # Ensure hand has a Member card
    if not p.hand:
        p.hand.append(1)  # Add dummy card

    # Ensure deck has cards for drawing
    p.main_deck = [200, 201]

    initial_hand_size = len(p.hand)
    initial_deck_size = len(p.main_deck)
    card_to_play = p.hand[0]

    # Debug legality
    legal_mask = game.get_legal_actions()
    print(f"Action 400 Legal: {legal_mask[400]}")
    if not legal_mask[400]:
        print("Legal actions indices:", [i for i, v in enumerate(legal_mask) if v])

    # Action: Play first card (Action 400)
    # Action 400 corresponds to index 0 of hand
    game = game.step(400)
    p = game.players[game.current_player]

    # Assertions
    # 1. Card should be in Live Zone
    assert card_to_play in p.live_zone, f"Card {card_to_play} not in live zone {p.live_zone}"
    assert len(p.live_zone) == 1

    # 2. Hand size should DECREASE by 1 (Play 1, Draw deferred)
    # The draw happens at END of LIVE_SET (Action 0)
    assert len(p.hand) == initial_hand_size - 1, f"Hand size {len(p.hand)} != {initial_hand_size - 1}"

    # Deck should be same until draw
    assert len(p.main_deck) == initial_deck_size


def test_live_zone_cleanup():
    """Test cleanup of non-Live cards at start of Performance (Rule 8.3.4)"""
    game = GameState()
    p = game.active_player

    # Setup: Inject 1 Member (ID < 100) and 1 Live (ID > 100)
    member_id = 99
    live_id = 101

    # Mock DB presence
    # Add required fields for MemberCard
    GameState.member_db[member_id] = MemberCard(
        card_id=member_id,
        card_no="M1",
        name="M",
        cost=1,
        blades=1,
        hearts=[1, 0, 0, 0, 0, 0, 0],
        blade_hearts=[1, 0, 0, 0, 0, 0, 0],
    )
    # Ensure live_id is in live_db so it isn't cleaned up
    GameState.live_db[live_id] = LiveCard(card_id=live_id, card_no="L1", name="L", score=1, required_hearts=[0] * 7)

    p.live_zone = [member_id, live_id]
    p.live_zone_revealed = [False, False]
    p.main_deck = [200]

    # Force Phase to PERFORMANCE_P1 (or whichever matches active player)
    # PhaseMixin._do_performance checks current player
    game.phase = Phase.PERFORMANCE_P1 if game.current_player == 0 else Phase.PERFORMANCE_P2

    # We need to trigger the performance start logic.
    # calling step(0) (Pass) generally triggers processing if we are in that phase
    p_idx = game.active_player.player_id
    game = game.step(0)
    p = game.players[p_idx]  # Keep checking the same player

    # Check Cleanup
    # Member ID should be gone (moved to discard)
    # Live ID should remain (or be processed/failed, but initially it stays for check)

    # Note: _do_performance might discard Live card if logic runs and fails immediately
    # But specifically, the member card is discarded due to "Not being a Live Card"
    # whereas the Live card is discarded due to "Failure" later.
    # To differentiate, we can check logs or step through.
    # But result-wise: Member card MUST be in discard.

    assert member_id not in p.live_zone
    assert member_id in p.discard

    # If requirements fail (which they will with 0 hearts on stage), live_id also goes to discard
    # But let's verification focus on the Member ID being handled.