Add mode-aware default prompts with terrain, paint, and admin support

This commit is contained in:
Jared Miller 2026-02-14 21:10:37 -05:00
parent f45d391e3c
commit 115675c02e
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
2 changed files with 40 additions and 3 deletions

View file

@ -32,6 +32,9 @@ async def cmd_prompt(player: Player, args: str) -> None:
msg += " opponent - combat opponent name\r\n" msg += " opponent - combat opponent name\r\n"
msg += " move - current attack/defense move\r\n" msg += " move - current attack/defense move\r\n"
msg += " combat_state - combat state (idle/fighting)\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 += "\r\n"
msg += "Examples:\r\n" msg += "Examples:\r\n"
msg += " prompt {stamina_gauge} {pl} > (simple, default)\r\n" msg += " prompt {stamina_gauge} {pl} > (simple, default)\r\n"

View file

@ -5,18 +5,31 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from mudlib.render.colors import colorize from mudlib.render.colors import colorize
from mudlib.world.terrain import World
if TYPE_CHECKING: if TYPE_CHECKING:
from mudlib.player import Player 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 prompt templates by mode
DEFAULT_TEMPLATES: dict[str, str] = { DEFAULT_TEMPLATES: dict[str, str] = {
"normal": "{stamina_gauge} <{pl}/{max_pl}> ", "normal": "{stamina_gauge} <{pl}/{max_pl}> ",
"combat": "{stamina_gauge} <{pl}/{max_pl}> vs {opponent} > ", "combat": "{stamina_gauge} <{pl}/{max_pl}> vs {opponent} > ",
"paint": (
"{stamina_gauge} <{pl}/{max_pl}>"
" ({x},{y}) [brush: {paint_brush}] {paint_state} "
),
"editor": "editor> ", "editor": "editor> ",
"if": "> ", "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: def render_prompt(player: Player) -> str:
"""Render the prompt string based on player state and mode. """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 Formatted prompt string with ANSI codes based on player color support
""" """
# Get template from player override or mode default # Get template from player override or mode default
template = player.prompt_template or DEFAULT_TEMPLATES.get( if player.prompt_template:
player.mode, "{stamina_gauge} {pl} > " 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 # Build variable dictionary
stamina_pct = ( stamina_pct = (
@ -61,6 +81,9 @@ def render_prompt(player: Player) -> str:
"x": str(player.x), "x": str(player.x),
"y": str(player.y), "y": str(player.y),
"combat_state": _get_combat_state(player), "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 # Substitute variables in template
@ -132,3 +155,14 @@ def _get_combat_state(player: Player) -> str:
return "idle" return "idle"
return encounter.state.value 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)