diff --git a/src/mudlib/commands/prompt.py b/src/mudlib/commands/prompt.py index 4dd3f42..d5e224b 100644 --- a/src/mudlib/commands/prompt.py +++ b/src/mudlib/commands/prompt.py @@ -32,6 +32,9 @@ async def cmd_prompt(player: Player, args: str) -> None: msg += " opponent - combat opponent name\r\n" msg += " move - current attack/defense move\r\n" msg += " combat_state - combat state (idle/fighting)\r\n" + msg += " terrain - terrain name at your position\r\n" + msg += " paint_brush - current paint brush character\r\n" + msg += " paint_state - painting state (PAINTING/SURVEYING)\r\n" msg += "\r\n" msg += "Examples:\r\n" msg += " prompt {stamina_gauge} {pl} > (simple, default)\r\n" diff --git a/src/mudlib/prompt.py b/src/mudlib/prompt.py index b271d6d..76b5060 100644 --- a/src/mudlib/prompt.py +++ b/src/mudlib/prompt.py @@ -5,18 +5,31 @@ from __future__ import annotations from typing import TYPE_CHECKING from mudlib.render.colors import colorize +from mudlib.world.terrain import World if TYPE_CHECKING: from mudlib.player import Player +# Reverse lookup: char → name +_CHAR_TO_TERRAIN = {v: k for k, v in World.TERRAIN_CHARS.items()} + # Default prompt templates by mode DEFAULT_TEMPLATES: dict[str, str] = { "normal": "{stamina_gauge} <{pl}/{max_pl}> ", "combat": "{stamina_gauge} <{pl}/{max_pl}> vs {opponent} > ", + "paint": ( + "{stamina_gauge} <{pl}/{max_pl}>" + " ({x},{y}) [brush: {paint_brush}] {paint_state} " + ), "editor": "editor> ", "if": "> ", } +ADMIN_TEMPLATES: dict[str, str] = { + "normal": "{stamina_gauge} <{pl}/{max_pl}> ({x},{y}) {terrain} ", + "combat": "{stamina_gauge} <{pl}/{max_pl}> vs {opponent} > ({x},{y}) ", +} + def render_prompt(player: Player) -> str: """Render the prompt string based on player state and mode. @@ -28,9 +41,16 @@ def render_prompt(player: Player) -> str: Formatted prompt string with ANSI codes based on player color support """ # Get template from player override or mode default - template = player.prompt_template or DEFAULT_TEMPLATES.get( - player.mode, "{stamina_gauge} {pl} > " - ) + if player.prompt_template: + template = player.prompt_template + elif player.paint_mode: + template = DEFAULT_TEMPLATES["paint"] + elif player.is_admin: + template = ADMIN_TEMPLATES.get( + player.mode, DEFAULT_TEMPLATES.get(player.mode, "{stamina_gauge} {pl} > ") + ) + else: + template = DEFAULT_TEMPLATES.get(player.mode, "{stamina_gauge} {pl} > ") # Build variable dictionary stamina_pct = ( @@ -61,6 +81,9 @@ def render_prompt(player: Player) -> str: "x": str(player.x), "y": str(player.y), "combat_state": _get_combat_state(player), + "terrain": _get_terrain_name(player), + "paint_brush": player.paint_brush, + "paint_state": "PAINTING" if player.painting else "SURVEYING", } # Substitute variables in template @@ -132,3 +155,14 @@ def _get_combat_state(player: Player) -> str: return "idle" return encounter.state.value + + +def _get_terrain_name(player: Player) -> str: + """Get human-readable terrain name for player's current tile.""" + from mudlib.zone import Zone + + if not isinstance(player.location, Zone): + return "unknown" + + tile = player.location.get_tile(player.x, player.y) + return _CHAR_TO_TERRAIN.get(tile, tile)