mud/src/mudlib/commands/play.py

59 lines
1.6 KiB
Python

"""Play interactive fiction games."""
import pathlib
from mudlib.commands import CommandDefinition, register
from mudlib.if_session import IFSession
from mudlib.player import Player
# Story files directory
_stories_dir = pathlib.Path(__file__).resolve().parents[3] / "content" / "stories"
# Map of game name -> file extension for lookup
_STORY_EXTENSIONS = (".z3", ".z5", ".z8", ".zblorb")
def _find_story(name: str) -> pathlib.Path | None:
"""Find a story file by name in content/stories/."""
for ext in _STORY_EXTENSIONS:
path = _stories_dir / f"{name}{ext}"
if path.exists():
return path
return None
async def cmd_play(player: Player, args: str) -> None:
"""Start playing an interactive fiction game."""
game_name = args.strip().lower()
if not game_name:
await player.send("play what? (try: play zork1)\r\n")
return
story_path = _find_story(game_name)
if not story_path:
await player.send(f"no story found for '{game_name}'.\r\n")
return
# Create and start IF session
session = IFSession(player, str(story_path), game_name)
try:
intro = await session.start()
except FileNotFoundError:
await player.send("error: dfrotz not found. cannot play IF games.\r\n")
return
except OSError as e:
await player.send(f"error starting game: {e}\r\n")
return
player.if_session = session
player.mode_stack.append("if")
if intro:
await player.send(intro + "\r\n")
register(
CommandDefinition(
"play", cmd_play, mode="normal", help="play an interactive fiction game"
)
)