Refactor cat.
[koperkapel.git] / koperkapel / world.py
index 7115194c87e57d6cc299eda89850714172615126..5a22b04fdbefd21de586e0f8e8fc03cbd01091ef 100644 (file)
@@ -1,33 +1,7 @@
 """ World and player state. """
 
 from .scenes.base import WorldEvent
-
-
-NAMES =[
-        "roupert",
-        "roachel",
-        "roeginald",
-        "roichard",
-        "rory",
-        "roalph",
-        "roabia",
-        "roafi",
-        "roaman",
-        "roemus",
-        "roadley",
-        "roanaell",
-        "roashwan",
-        "roashid",
-        "roaphael",
-        "roenfield",
-        "roani",
-        "roaya",
-        "roaza",
-        "robekka",
-        "rogan",
-        "roiana",
-        "roberta",
-       ]
+from .roaches import build_roach
 
 
 class World:
@@ -47,10 +21,7 @@ class World:
     def _build_initial_state(self):
         state = {}
         state["roaches"] = [
-            #self._build_roach("roachel", smart=True),
-            #self._build_roach("roeginald", strong=True),
-            #self._build_roach("roichard", fast=True),
-            self._build_roach("roupert"),
+            build_roach(self, "roupert"),
         ]
         state["serums"] = [
             "smart", "strong", "fast",
@@ -72,26 +43,27 @@ class World:
         }
         return state
 
-    def _build_roach(self, name, health=5, **kw):
-        roach = {
-            "name": name,
-            "health": health,
-        }
-        roach.update(kw)
-        return roach
+    def _get_obj(self, name):
+        parts = name.split(".")
+        obj = self._state
+        for p in parts[:-1]:
+            if isinstance(obj, dict):
+                obj = obj[p]
+            elif isinstance(obj, list):
+                obj = obj[int(p)]
+            else:
+                raise KeyError("%r not found in world" % (name,))
+        return obj, parts[-1]
 
     def _apply_set(self, action, updates):
         for name, value in updates.items():
-            parts = name.split(".")
-            obj = self._state
-            for p in parts[:-1]:
-                if isinstance(obj, dict):
-                    obj = obj[p]
-                elif isinstance(obj, list):
-                    obj = obj[int(p)]
-                else:
-                    raise KeyError("%r not found in world" % (name,))
-            obj[parts[-1]] = value
+            obj, key = self._get_obj(name)
+            obj[key] = value
+
+    def _apply_append(self, action, updates):
+        for name, value in updates.items():
+            obj, key = self._get_obj(name)
+            obj.append(value)
 
     def _apply_reset(self, action):
         self._state = self._build_initial_state()
@@ -102,14 +74,6 @@ class World:
     def proxy(self):
         return WorldDictProxy(self._state)
 
-    def add_new_roach(self):
-        roach_names = [x['name'] for x in self.roaches]
-        for cand in NAMES:
-            if cand not in roach_names:
-                roach = self._build_roach(cand)
-                self._state['roaches'].append(roach)
-                break
-
     def apply_event(self, action, *args, **kw):
         handler = getattr(self, "_apply_%s" % (action,))
         return handler(action, *args, **kw)
@@ -142,8 +106,8 @@ class WorldBaseProxy:
             "_events": _events,
         })
 
-    def _record_change(self, fullname, value):
-        self._events.append(WorldEvent("set", {
+    def _record_change(self, fullname, value, action="set"):
+        self._events.append(WorldEvent(action, {
             fullname: value
         }))
 
@@ -155,10 +119,6 @@ class WorldBaseProxy:
 class WorldDictProxy(WorldBaseProxy):
     """ World dictionary proxy that records changes and produces events. """
 
-    def items(self):
-        return (
-            (k, _maybe_subproxy(self, k, v)) for k, v in self._state.items())
-
     def __setattr__(self, name, value):
         self._top._record_change("%s%s" % (self._prefix, name), value)
 
@@ -173,6 +133,10 @@ class WorldDictProxy(WorldBaseProxy):
     def __getitem__(self, name):
         return self.__getattr__(name)
 
+    def items(self):
+        return (
+            (k, _maybe_subproxy(self, k, v)) for k, v in self._state.items())
+
 
 class WorldListProxy(WorldBaseProxy):
     """ World list proxy that records changes and produces events. """
@@ -188,3 +152,6 @@ class WorldListProxy(WorldBaseProxy):
 
     def __bool__(self):
         return bool(self._state)
+
+    def append(self, value):
+        self._top._record_change(self._prefix, value, action="append")