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 += " 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"

View file

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