56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""Read command for examining readable objects."""
|
|
|
|
from mudlib.commands import CommandDefinition, register
|
|
from mudlib.player import Player
|
|
from mudlib.thing import Thing
|
|
|
|
|
|
def _find_readable(player: Player, name: str) -> Thing | None:
|
|
"""Find a readable thing by name or alias in inventory or on ground."""
|
|
name_lower = name.lower()
|
|
|
|
# Check inventory first
|
|
for obj in player.contents:
|
|
if not isinstance(obj, Thing):
|
|
continue
|
|
if obj.name.lower() == name_lower:
|
|
return obj
|
|
if any(a.lower() == name_lower for a in obj.aliases):
|
|
return obj
|
|
|
|
# Check ground at player's position
|
|
if player.location is not None:
|
|
from mudlib.zone import Zone
|
|
|
|
if isinstance(player.location, Zone):
|
|
for obj in player.location.contents_at(player.x, player.y):
|
|
if not isinstance(obj, Thing):
|
|
continue
|
|
if obj.name.lower() == name_lower:
|
|
return obj
|
|
if any(a.lower() == name_lower for a in obj.aliases):
|
|
return obj
|
|
|
|
return None
|
|
|
|
|
|
async def cmd_read(player: Player, args: str) -> None:
|
|
"""Read a readable object."""
|
|
target_name = args.strip()
|
|
if not target_name:
|
|
await player.send("Read what?\r\n")
|
|
return
|
|
|
|
thing = _find_readable(player, target_name)
|
|
if thing is None:
|
|
await player.send("You don't see that here.\r\n")
|
|
return
|
|
|
|
if not thing.readable_text:
|
|
await player.send("There's nothing to read on that.\r\n")
|
|
return
|
|
|
|
await player.send(f"You read the {thing.name}:\r\n{thing.readable_text}\r\n")
|
|
|
|
|
|
register(CommandDefinition("read", cmd_read, help="Read a readable object"))
|