Move variables and triggers to be defined in the database
* Variables are now defined in the database, rather than the game itself. * Triggers are now defined in the database, rather than hidden away in a method in the game. Custom triggers can now be added as well, in case a game needs more complex behavior that isn't necessarily available in the base library. Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import dataclasses
|
import dataclasses
|
||||||
import textwrap
|
import textwrap
|
||||||
from typing import Any, MutableMapping, Match, Optional, Sequence
|
from typing import Any, MutableMapping, List, Match, Optional, Sequence
|
||||||
from agame.action import Action
|
from agame.action import Action
|
||||||
from agame.color import colorize
|
from agame.color import colorize
|
||||||
from agame.item import Item, ItemInst
|
from agame.item import Item, ItemInst
|
||||||
@@ -20,6 +20,21 @@ class Database:
|
|||||||
items: MutableMapping[str, Item] = dataclasses.field(default_factory=dict)
|
items: MutableMapping[str, Item] = dataclasses.field(default_factory=dict)
|
||||||
# All rooms available to the game.
|
# All rooms available to the game.
|
||||||
rooms: MutableMapping[str, Room] = dataclasses.field(default_factory=dict)
|
rooms: MutableMapping[str, Room] = dataclasses.field(default_factory=dict)
|
||||||
|
# All variables available to the game.
|
||||||
|
vars: MutableMapping[str, Any] = dataclasses.field(default_factory=dict)
|
||||||
|
# All triggers available to the game.
|
||||||
|
triggers: List[Trigger] = dataclasses.field(
|
||||||
|
default_factory=lambda: [
|
||||||
|
GetTrigger(),
|
||||||
|
UseTrigger(),
|
||||||
|
PutTrigger(),
|
||||||
|
LookTrigger(),
|
||||||
|
ReadTrigger(),
|
||||||
|
OpenTrigger(),
|
||||||
|
CloseTrigger(),
|
||||||
|
GoTrigger(),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def add_item(self, item: Item):
|
def add_item(self, item: Item):
|
||||||
self.items[item.id] = item
|
self.items[item.id] = item
|
||||||
@@ -35,6 +50,12 @@ class Database:
|
|||||||
for room in rooms:
|
for room in rooms:
|
||||||
self.add_room(room)
|
self.add_room(room)
|
||||||
|
|
||||||
|
def add_var(self, var: str, value: Any):
|
||||||
|
self.vars[var] = value
|
||||||
|
|
||||||
|
def add_trigger(self, trigger: Trigger):
|
||||||
|
self.triggers += [trigger]
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
class Game:
|
class Game:
|
||||||
@@ -44,28 +65,15 @@ class Game:
|
|||||||
room: Room
|
room: Room
|
||||||
# Player inventory.
|
# Player inventory.
|
||||||
inventory: MutableMapping[str, ItemInst] = dataclasses.field(default_factory=dict)
|
inventory: MutableMapping[str, ItemInst] = dataclasses.field(default_factory=dict)
|
||||||
# Variables.
|
|
||||||
vars: MutableMapping[str, Any] = dataclasses.field(default_factory=dict)
|
|
||||||
|
|
||||||
def run_command(self, line: str):
|
def run_command(self, line: str):
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if not line:
|
if not line:
|
||||||
return
|
return
|
||||||
|
|
||||||
triggers: Sequence[Trigger] = [
|
|
||||||
GetTrigger(),
|
|
||||||
UseTrigger(),
|
|
||||||
PutTrigger(),
|
|
||||||
LookTrigger(),
|
|
||||||
ReadTrigger(),
|
|
||||||
OpenTrigger(),
|
|
||||||
CloseTrigger(),
|
|
||||||
GoTrigger(),
|
|
||||||
]
|
|
||||||
|
|
||||||
trigger = None
|
trigger = None
|
||||||
match: Optional[Match] = None
|
match: Optional[Match] = None
|
||||||
for t in triggers:
|
for t in self.database.triggers:
|
||||||
match = t.pattern().fullmatch(line)
|
match = t.pattern().fullmatch(line)
|
||||||
if match:
|
if match:
|
||||||
trigger = t
|
trigger = t
|
||||||
@@ -128,3 +136,8 @@ class Game:
|
|||||||
def items(self):
|
def items(self):
|
||||||
"Shortcut property for `game.database.items`."
|
"Shortcut property for `game.database.items`."
|
||||||
return self.database.items
|
return self.database.items
|
||||||
|
|
||||||
|
@property
|
||||||
|
def vars(self):
|
||||||
|
"Shortcut property for `game.database.vars`."
|
||||||
|
return self.database.vars
|
||||||
|
|||||||
@@ -14,5 +14,4 @@ from . import vars
|
|||||||
game = Game(
|
game = Game(
|
||||||
database=database,
|
database=database,
|
||||||
room=database.rooms["cabin_inside"],
|
room=database.rooms["cabin_inside"],
|
||||||
vars=vars.vars,
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
Define all game variables here.
|
Define all game variables here.
|
||||||
"""
|
"""
|
||||||
|
from . import database
|
||||||
|
|
||||||
vars = {
|
database.add_var("cabin_door_open", False)
|
||||||
"cabin_door_open": False,
|
database.add_var("mailbox_open", False)
|
||||||
"mailbox_open": False,
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user