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 += " 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"
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue