Files
ages/agame/room.py
Alek Ratzloff 2f86df2930 Add room entry auto-triggers, player input, and more
* When you teleport to a room, the teleport auto-triggers fire.
* Rooms have auto-triggers. None by default. They are run every time you
  teleport to a room, and when the game starts. Gate behavior behind a
  variable.
* PlayerInputAction waits for player input (and potentially write it
  into a variable)

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
2021-11-18 20:32:02 -08:00

54 lines
1.6 KiB
Python

import dataclasses
from typing import MutableMapping, Optional, Sequence, Union, TYPE_CHECKING
from agame.item import ItemInst
from agame.util import search_item_name
if TYPE_CHECKING:
from agame.action import Action
__all__ = ("Room",)
@dataclasses.dataclass
class Room:
id: str
name: str
desc: Union[str, Sequence[str]]
items: MutableMapping[str, ItemInst]
# Actions that are executed upon teleport or entrance to this room.
teleport_actions: Sequence["Action"]
def __init__(
self,
id: str,
name: str,
desc: Union[str, Sequence[str]],
items: Union[Sequence[ItemInst], MutableMapping[str, ItemInst]],
teleport_actions: Sequence["Action"] = [],
):
self.id = id
self.name = name
self.desc = desc
if isinstance(items, MutableMapping):
self.items = items
else:
self.items = {item.id: item for item in items}
self.teleport_actions = teleport_actions
def search_item_name(self, item_name: str) -> Optional[ItemInst]:
"""
Searches all item instances in the room for the given item name, also
checking synonyms. Returns the first item instance found, or none if no
synonyms or names were found to match.
"""
return search_item_name(self.items.values(), item_name)
def remove(self, item_id: str) -> Optional[ItemInst]:
"""
Removes an item with the given ID from the room, returning it.
If it's not present in the room, `None` is returned.
"""
return self.items.pop(item_id, None)