Source code for pyscoundrel.game.actions
"""Player actions in PyScoundrel."""
from dataclasses import dataclass
from enum import Enum
from typing import Optional
[docs]
class ActionType(Enum):
"""Types of actions a player can take."""
AVOID_ROOM = "avoid_room"
FACE_CARD = "face_card"
FIGHT_BAREHANDED = "fight_barehanded"
FIGHT_WITH_WEAPON = "fight_with_weapon"
EQUIP_WEAPON = "equip_weapon"
USE_POTION = "use_potion"
START_TURN = "start_turn"
END_TURN = "end_turn"
[docs]
@dataclass
class Action:
"""
Represents a player action.
Args:
action_type: The type of action
card_index: Optional index of card in room (for face_card actions)
metadata: Optional additional data about the action
"""
action_type: ActionType
card_index: Optional[int] = None
metadata: Optional[dict] = None
def __str__(self) -> str:
if self.card_index is not None:
return f"{self.action_type.value}(card={self.card_index})"
return self.action_type.value
def __repr__(self) -> str:
return f"Action({self.action_type.value}, card_index={self.card_index})"
[docs]
@dataclass
class ActionResult:
"""
Result of executing an action.
Args:
success: Whether the action succeeded
message: Description of what happened
damage_taken: Damage taken by the player (if any)
health_gained: Health gained by the player (if any)
metadata: Additional result data
"""
success: bool
message: str
damage_taken: int = 0
health_gained: int = 0
metadata: Optional[dict] = None
@property
def is_fatal(self) -> bool:
"""Check if this action resulted in player death."""
return self.metadata and self.metadata.get("player_died", False)
def __str__(self) -> str:
parts = [self.message]
if self.damage_taken > 0:
parts.append(f"(-{self.damage_taken} HP)")
if self.health_gained > 0:
parts.append(f"(+{self.health_gained} HP)")
return " ".join(parts)