LovecaSim / engine /tests /reproduce_ai_freeze.py
trioskosmos's picture
Upload folder using huggingface_hub
bb3fbf9 verified
import os
import sys
# Ensure we can import engine
sys.path.append(os.getcwd())
import engine_rust
def setup_game():
db_path = "engine/data/cards_compiled.json"
with open(db_path, "r", encoding="utf-8") as f:
cards_data_raw = f.read()
db = engine_rust.PyCardDatabase(cards_data_raw)
state = engine_rust.PyGameState(db)
return state, db
def test_ai_freeze_fix():
state, db = setup_game()
# Init game with a card that has an OnLiveStart choice
KOTORI_ID = 249
members = [KOTORI_ID] * 48
lives = [10001] * 12
energy = [20001] * 12
state.initialize_game(members, members, energy, energy, lives, lives)
# Setup state to trigger OnLiveStart
state.set_stage_card(0, 0, KOTORI_ID)
state.set_live_card(0, 0, 10001, True) # Revealed
state.current_player = 0
state.phase = 6 # PERFORMANCE_P1
print(f"Initial Phase: {state.phase}")
# Step to trigger OnLiveStart and enter Response phase
state.step(0)
print(f"Phase after step(0): {state.phase}")
if state.phase != 10: # Phase::Response
print("FAILED to reach Response phase. Checking logs...")
for line in state.rule_log:
print(line)
return
print(f"Pending Card ID: {state.pending_card_id}")
# Get legal actions
legal_actions = state.get_legal_action_ids()
print(f"Legal Action IDs: {legal_actions}")
# Test 1: Verify integrated_step works and doesn't freeze
# We'll use action 0 for integrated_step (MCTS mode)
print("\nAttempting integrated_step (MCTS Mode)...")
# This calls step_opponent_mcts if it's player 1's turn or interactive.
# Wait, current_player is 0. integrated_step(0, ...) should call step(db, 0).
# But Phase 10 is interactive.
# Let's switch player to 1 to simulate AI turn.
# state.current_player = 1 # Not writable? Let's check.
# Actually, integrated_step simulates until PLAYER 0's turn.
# If it's already player 0's turn, it just calls step(action) once.
# Let's try to pass a choice via step
if 560 in legal_actions:
print("Selecting Pink color (Action 560)...")
state.step(560)
print(f"Phase after step(560): {state.phase}")
if state.phase == 10:
print("Selecting first mode (Action 560)...")
state.step(560)
print(f"Phase after second step: {state.phase}")
print("\nVERIFICATION SUCCESSFUL")
if __name__ == "__main__":
try:
test_ai_freeze_fix()
except Exception as e:
print(f"\nVERIFICATION FAILED: {e}")
import traceback
traceback.print_exc()
sys.exit(1)