1 """ World and player state. """
3 from .scenes.base import WorldEvent
7 """ World and player state. """
10 self._state = self._build_initial_state()
14 return self._state["level"]
18 return self._state["roaches"]
20 def _build_initial_state(self):
23 self._build_roach("roachel", smart=True),
24 self._build_roach("roeginald", strong=True),
25 self._build_roach("roichard", fast=True),
26 self._build_roach("roupert"),
29 "smart", "strong", "fast",
35 "roachel", None, "roeginald",
39 "robot": {"seating": []},
40 "roomba": {"seating": []},
41 "quadcopter": {"seating": []},
48 def _build_roach(self, name, health=5, **kw):
56 def _apply_set(self, updates):
57 for name, value in updates.items():
58 parts = name.split(".")
61 if isinstance(obj, dict):
63 elif isinstance(obj, list):
66 raise KeyError("%r not found in world" % (name,))
67 obj[parts[-1]] = value
70 return WorldDictProxy(self._state)
72 def apply_event(self, action, *args, **kw):
74 return self._apply_set(*args, **kw)
75 raise ValueError("Unknown world event action: %r" % (action,))
78 def _maybe_subproxy(proxy, name, value):
79 """ Return a sub world proxy if appropriate. """
80 if isinstance(value, dict):
81 prefix = "%s%s." % (proxy._prefix, name)
82 return WorldDictProxy(value, _prefix=prefix, _top=proxy._top)
83 elif isinstance(value, list):
84 prefix = "%s%s." % (proxy._prefix, name)
85 return WorldListProxy(value, _prefix=prefix, _top=proxy._top)
90 """ Base for world proxies. """
92 def __init__(self, state, _prefix='', _top=None):
98 self.__dict__.update({
105 def _record_change(self, fullname, value):
106 self._events.append(WorldEvent("set", {
110 def pop_events(self):
111 events, self._events = self._events, []
115 class WorldDictProxy(WorldBaseProxy):
116 """ World dictionary proxy that records changes and produces events. """
120 (k, _maybe_subproxy(self, k, v)) for k, v in self._state.items())
122 def __setattr__(self, name, value):
123 self._top._record_change("%s%s" % (self._prefix, name), value)
125 def __getattr__(self, name):
126 # return None for attributes that don't exist
127 value = self._state.get(name)
128 return _maybe_subproxy(self, name, value)
130 def __setitem__(self, name, value):
131 return self.__setattr__(name, value)
133 def __getitem__(self, name):
134 return self.__getattr__(name)
137 class WorldListProxy(WorldBaseProxy):
138 """ World list proxy that records changes and produces events. """
140 def __setitem__(self, index, value):
141 self._top._record_change("%s%s" % (self._prefix, index), value)
143 def __getitem__(self, index):
144 return _maybe_subproxy(self, index, self._state[index])
147 return len(self._state)
150 return bool(self._state)