Spaces:
Running
Running
File size: 3,747 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 109 110 111 |
import numpy as np
import pytest
from engine.game.enums import Phase
from engine.game.game_state import GameState
from engine.models.ability import TriggerType
from engine.models.card import LiveCard
@pytest.fixture
def game():
# Setup a game with some live cards
gs = GameState()
# Mock some live cards
l1 = LiveCard(card_id=1001, name="Live 1", score=1, required_hearts=np.zeros(7, dtype=np.int32), card_no="L1")
l2 = LiveCard(card_id=1002, name="Live 2", score=2, required_hearts=np.zeros(7, dtype=np.int32), card_no="L2")
GameState.initialize_class_db({}, {1001: l1, 1002: l2})
# Setup players with live cards in passed_lives (as if performance phase finished)
gs.phase = Phase.LIVE_RESULT
return gs
def test_tie_one_card_each(game):
"""Rule 8.4.6.2: Both win. Rule 8.4.7.2: Each moves 1 card."""
game.players[0].passed_lives = [1001]
game.players[1].passed_lives = [1001]
# Run judgment
game._do_live_result()
assert game.players[0].score == 1
assert game.players[1].score == 1
assert len(game.players[0].success_lives) == 1
assert len(game.players[1].success_lives) == 1
def test_tie_two_vs_one_penalty(game):
"""Rule 8.4.7.1: P0 has 2 cards and ties, so moves 0 cards. P1 has 1 card and moves it."""
game.players[0].passed_lives = [1001, 1001] # Total score 2
game.players[1].passed_lives = [1002] # Total score 2
game._do_live_result()
# P0 tied with 2 cards -> 0 points (Rule 8.4.7.1)
assert game.players[0].score == 0
# P1 tied with 1 card -> 1 point (Rule 8.4.7.2)
assert game.players[1].score == 1
# P0's cards should be discarded
assert len(game.players[0].passed_lives) == 0
assert 1001 in game.players[0].discard
def test_win_with_multiple_cards(game):
"""Rule 8.4.7.3: Winning with multiple cards requires selection, yields 1 point."""
game.players[0].passed_lives = [1001, 1001] # Total score 2
game.players[1].passed_lives = [1001] # Total score 1
game._do_live_result()
# Should have a pending choice to select which card moves to success_lives
assert len(game.pending_choices) == 1
# Advance choice
# _handle_choice will pop from game.pending_choices
print(f"DEBUG: Calling _handle_choice(600) with choices: {game.pending_choices}")
game._handle_choice(600)
# Choices are handled during _do_live_result.
# If a choice was pending, it returned early.
# In a real game, _handle_choice would trigger the next step.
# Since we are testing _do_live_result logic specifically:
game._finish_live_result()
assert game.players[0].score == 1
assert game.players[1].score == 0
def test_on_live_success_trigger_only_for_winners(game):
"""Rule 8.4.6: Triggers only for winners."""
from engine.models.ability import Ability
# Mock member with ON_LIVE_SUCCESS
abi = Ability(raw_text="Test Success", trigger=TriggerType.ON_LIVE_SUCCESS, effects=[])
from engine.models.card import MemberCard
m1 = MemberCard(
card_id=1,
card_no="M1",
name="M1",
cost=1,
hearts=np.zeros(7),
blade_hearts=np.zeros(7),
blades=1,
abilities=[abi],
)
GameState.initialize_class_db({1: m1}, GameState.live_db)
game.players[0].stage[0] = 1
game.players[1].stage[0] = 1
# P0 wins
game.players[0].passed_lives = [1002]
game.players[1].passed_lives = [1001]
game._do_live_result()
# Only P0's trigger should be queued
assert len(game.triggered_abilities) == 1
assert game.triggered_abilities[0][0] == 0 # Player 0
|