Wire combat move and state into prompt variables
This commit is contained in:
parent
47534b1514
commit
afe99ceff5
2 changed files with 117 additions and 1 deletions
|
|
@ -55,7 +55,7 @@ def render_prompt(player: Player) -> str:
|
|||
"pl": str(round(player.pl)),
|
||||
"max_pl": str(round(player.max_pl)),
|
||||
"opponent": _get_opponent_name(player),
|
||||
"move": "", # TODO: current attack/defense move name
|
||||
"move": _get_current_move(player),
|
||||
"name": player.name,
|
||||
"mode": player.mode,
|
||||
"x": str(player.x),
|
||||
|
|
@ -95,6 +95,27 @@ def _get_opponent_name(player: Player) -> str:
|
|||
return encounter.attacker.name
|
||||
|
||||
|
||||
def _get_current_move(player: Player) -> str:
|
||||
"""Get the name of the player's current combat move if any.
|
||||
|
||||
Args:
|
||||
player: The player to check
|
||||
|
||||
Returns:
|
||||
Move name if in combat with active move, empty string otherwise
|
||||
"""
|
||||
from mudlib.combat.engine import get_encounter
|
||||
|
||||
encounter = get_encounter(player)
|
||||
if encounter is None:
|
||||
return ""
|
||||
|
||||
if encounter.current_move is None:
|
||||
return ""
|
||||
|
||||
return encounter.current_move.name
|
||||
|
||||
|
||||
def _get_combat_state(player: Player) -> str:
|
||||
"""Get the current combat state for the player.
|
||||
|
||||
|
|
|
|||
|
|
@ -379,3 +379,98 @@ def test_combat_state_idle():
|
|||
)
|
||||
result = render_prompt(player)
|
||||
assert result == "[idle] > "
|
||||
|
||||
|
||||
def test_move_shows_name_when_in_combat_with_active_move():
|
||||
"""Move variable shows attack name when in combat with current_move."""
|
||||
from mudlib.combat.moves import CombatMove
|
||||
|
||||
player = Player(
|
||||
name="Goku",
|
||||
stamina=50.0,
|
||||
max_stamina=100.0,
|
||||
pl=200.0,
|
||||
mode_stack=["normal", "combat"],
|
||||
prompt_template="{move} > ",
|
||||
)
|
||||
opponent = Entity(name="Vegeta", pl=150.0)
|
||||
|
||||
punch = CombatMove(
|
||||
name="punch right",
|
||||
move_type="attack",
|
||||
stamina_cost=5.0,
|
||||
timing_window_ms=800,
|
||||
damage_pct=0.15,
|
||||
countered_by=["dodge left"],
|
||||
)
|
||||
|
||||
encounter = CombatEncounter(attacker=player, defender=opponent)
|
||||
encounter.attack(punch)
|
||||
active_encounters.append(encounter)
|
||||
|
||||
result = render_prompt(player)
|
||||
assert result == "punch right > "
|
||||
|
||||
|
||||
def test_move_empty_when_not_in_combat():
|
||||
"""Move variable is empty string when not in combat."""
|
||||
player = Player(
|
||||
name="Test",
|
||||
stamina=50.0,
|
||||
max_stamina=100.0,
|
||||
pl=200.0,
|
||||
mode_stack=["normal"],
|
||||
prompt_template="{move} > ",
|
||||
)
|
||||
result = render_prompt(player)
|
||||
assert result == " > "
|
||||
|
||||
|
||||
def test_move_empty_when_in_combat_but_no_current_move():
|
||||
"""Move variable is empty when in combat but IDLE state (no current_move)."""
|
||||
player = Player(
|
||||
name="Goku",
|
||||
stamina=50.0,
|
||||
max_stamina=100.0,
|
||||
pl=200.0,
|
||||
mode_stack=["normal", "combat"],
|
||||
prompt_template="{move} > ",
|
||||
)
|
||||
opponent = Entity(name="Vegeta", pl=150.0)
|
||||
|
||||
encounter = CombatEncounter(attacker=player, defender=opponent)
|
||||
active_encounters.append(encounter)
|
||||
|
||||
result = render_prompt(player)
|
||||
assert result == " > "
|
||||
|
||||
|
||||
def test_combat_state_shows_state_when_in_combat():
|
||||
"""Combat state variable shows encounter state value."""
|
||||
from mudlib.combat.moves import CombatMove
|
||||
|
||||
player = Player(
|
||||
name="Goku",
|
||||
stamina=50.0,
|
||||
max_stamina=100.0,
|
||||
pl=200.0,
|
||||
mode_stack=["normal", "combat"],
|
||||
prompt_template="[{combat_state}] > ",
|
||||
)
|
||||
opponent = Entity(name="Vegeta", pl=150.0)
|
||||
|
||||
punch = CombatMove(
|
||||
name="punch right",
|
||||
move_type="attack",
|
||||
stamina_cost=5.0,
|
||||
timing_window_ms=800,
|
||||
damage_pct=0.15,
|
||||
countered_by=["dodge left"],
|
||||
)
|
||||
|
||||
encounter = CombatEncounter(attacker=player, defender=opponent)
|
||||
encounter.attack(punch)
|
||||
active_encounters.append(encounter)
|
||||
|
||||
result = render_prompt(player)
|
||||
assert result == "[telegraph] > "
|
||||
|
|
|
|||
Loading…
Reference in a new issue