Wire combat move and state into prompt variables

This commit is contained in:
Jared Miller 2026-02-13 23:21:53 -05:00
parent 47534b1514
commit afe99ceff5
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
2 changed files with 117 additions and 1 deletions

View file

@ -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.

View file

@ -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] > "