File size: 3,388 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
import numpy as np
import pytest

from engine.game.enums import Phase
from engine.game.game_state import initialize_game


class TestVerificationBatch11:
    @pytest.fixture
    def game_state(self):
        gs = initialize_game(use_real_data=True)
        if not gs.member_db:
            pytest.skip("Card data not loaded")
        gs.active_player.tapped_energy = np.zeros(20, dtype=bool)
        return gs

    def get_card_id(self, gs, card_no):
        for cid, card in gs.member_db.items():
            if card.card_no == card_no:
                return cid
        for cid, card in gs.live_db.items():
            if card.card_no == card_no:
                return cid
        pytest.fail(f"Card {card_no} not found")

    def _test_live_retrieve(self, game_state, card_no):
        """

        Generic test for "Retire self -> Retrieve Live from Discard"

        Text: 自分の控え室からライブカードを1枚手札に加える (Add 1 Live from WR to Hand)

        Cost: Type 5 (Sacrifice Self)

        """
        gs = game_state
        card_id = self.get_card_id(gs, card_no)
        p1 = gs.players[0]

        p1.stage[0] = card_id

        # Setup discard with a valid Live card
        live_id = 999
        if live_id not in gs.live_db:
            from engine.models.card import LiveCard

            gs.live_db[live_id] = LiveCard(live_id, "D", "Dummy", 0, np.zeros(7, dtype=np.int32))

        p1.discard = [live_id]

        gs.current_player = 0
        gs.phase = Phase.MAIN

        # Activate (Action 200 for slot 0)
        gs._execute_action(200)

        # Cost: Retire
        assert p1.stage[0] == -1, f"Card {card_no} should be retired (Cost)"

        # Effect: Select Live from Discard
        assert gs.pending_choices, "Should have pending choice"
        choice_type, params = gs.pending_choices[0]
        assert choice_type == "SELECT_FROM_DISCARD"
        assert live_id in params["cards"]

        gs._handle_choice(660)  # Select index 0

        assert live_id in p1.hand, "Live card should be in hand"

    def test_pl_bp4_003_p_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!-bp4-003-P")

    def test_pl_bp4_003_r_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!-bp4-003-R")

    def test_pl_pb1_024_n_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!-pb1-024-N")

    def test_plhs_bp2_004_p_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!HS-bp2-004-P")

    def test_plhs_bp2_004_r_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!HS-bp2-004-R")

    def test_pln_pr_009_pr_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!N-PR-009-PR")

    def test_pln_pr_012_pr_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!N-PR-012-PR")

    def test_pln_pr_014_pr_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!N-PR-014-PR")

    def test_pln_sd1_011_sd_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!N-sd1-011-SD")

    def test_pls_pr_026_pr_live_retrieve(self, game_state):
        self._test_live_retrieve(game_state, "PL!S-PR-026-PR")