Source code for pyscoundrel.models.player
"""Player model for PyScoundrel."""
from dataclasses import dataclass
from typing import Optional
from .weapon import Weapon
[docs]
@dataclass
class Player:
"""
Player state in Scoundrel.
Tracks health and equipped weapon.
"""
health: int = 20
max_health: int = 20
equipped_weapon: Optional[Weapon] = None
potions_used_this_turn: int = 0
[docs]
def take_damage(self, damage: int) -> None:
"""
Take damage, reducing health.
Args:
damage: Amount of damage to take
"""
self.health = max(0, self.health - damage)
[docs]
def heal(self, amount: int) -> int:
"""
Heal the player.
Args:
amount: Amount to heal
Returns:
Actual amount healed (capped at max_health)
"""
old_health = self.health
self.health = min(self.max_health, self.health + amount)
return self.health - old_health
[docs]
def equip_weapon(self, weapon: Weapon) -> Optional[Weapon]:
"""
Equip a new weapon, replacing the current one.
Args:
weapon: The weapon to equip
Returns:
The previously equipped weapon, or None
"""
old_weapon = self.equipped_weapon
self.equipped_weapon = weapon
return old_weapon
[docs]
def reset_turn_state(self) -> None:
"""Reset per-turn state (e.g., potion usage counter)."""
self.potions_used_this_turn = 0
@property
def is_alive(self) -> bool:
"""Check if the player is still alive."""
return self.health > 0
@property
def is_dead(self) -> bool:
"""Check if the player is dead."""
return self.health <= 0
@property
def has_weapon(self) -> bool:
"""Check if the player has a weapon equipped."""
return self.equipped_weapon is not None
def __str__(self) -> str:
weapon_str = str(self.equipped_weapon) if self.has_weapon else "None"
return f"HP: {self.health}/{self.max_health} | Weapon: {weapon_str}"
def __repr__(self) -> str:
return f"Player(health={self.health}, weapon={self.equipped_weapon!r})"