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