Source code for pyscoundrel.logging.state_serializer

"""Serialize game state for logging."""

from typing import TYPE_CHECKING, Any, Dict, Optional

if TYPE_CHECKING:
    from ..game.state import GameState
    from ..models import Card


[docs] def serialize_card(card: "Card") -> str: """Serialize a card to string.""" return card.name
[docs] def serialize_state(state: "GameState") -> Dict[str, Any]: """Serialize game state to dictionary.""" player = state.player # Player state player_data: Dict[str, Any] = {"health": player.health, "max_health": 20} if player.has_weapon: weapon = player.equipped_weapon player_data["weapon"] = { "card": serialize_card(weapon.card), "value": weapon.card.value, "kills": [m.value for m in weapon.slain_monsters], "last_kill": weapon.last_kill_value, } else: player_data["weapon"] = None # Dungeon (deck) state dungeon_data = { "count": len(state.deck._cards), "cards": [serialize_card(c) for c in state.deck._cards], } # Discard pile state discard_data = { "count": len(state.discard_pile), "cards": [serialize_card(c) for c in state.discard_pile], } # Room state room_data: Optional[Dict[str, Any]] = None if state.current_room: room = state.current_room room_data = { "cards": [serialize_card(c) for c in room.cards], "faced": [serialize_card(c) for c in room.cards_faced], "remaining": [serialize_card(c) for c in room.cards if c not in room.cards_faced], } return { "player": player_data, "dungeon": dungeon_data, "discard": discard_data, "room": room_data, }