Add mode-aware default prompts with terrain, paint, and admin support
This commit is contained in:
parent
f45d391e3c
commit
115675c02e
2 changed files with 40 additions and 3 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue