diff --git a/src/mudlib/prompt.py b/src/mudlib/prompt.py index 21f9bbe..47b87cd 100644 --- a/src/mudlib/prompt.py +++ b/src/mudlib/prompt.py @@ -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. diff --git a/tests/test_prompt.py b/tests/test_prompt.py index 4ef4efe..d7c6404 100644 --- a/tests/test_prompt.py +++ b/tests/test_prompt.py @@ -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] > "