from pygame import Surface
import pygame.locals as pgl
from ..loaders.levelloader import levels
-from .base import Scene, ChangeSceneEvent, MoveViewportEvent, AddRoachEvent, defer_to_update
+from .base import Scene, ChangeSceneEvent, MoveViewportEvent, defer_to_update
from ..constants import TILE_SIZE, WIDTH, HEIGHT
+from ..roaches import build_roach
from ..vehicles.base import Vehicle
-from ..roaches import RoachFactory, WorldRoach
class BaseLevelScene(Scene):
def _set_pos(self, x, y):
self._player_pos = (x, y)
- #print('At ', (x, y))
+ # print('At ', (x, y))
def _can_move(self, x, y):
if self._mode == 'walk':
self._roaches.add(self._avatar)
self._set_angle(self._angle)
+ @defer_to_update
+ def _add_roach(self, world):
+ world.roaches.append(build_roach(world))
+ self._vehicle_changed()
+
@defer_to_update
def _change_vehicle(self, world):
vehicle = Vehicle.random()
elif self._level.is_on_friend(x, y):
friend = self._level.remove_friend(x, y)
self._friends.remove(friend)
- self._vehicle_changed()
- return [AddRoachEvent()]
+ self._add_roach()
return
elif key == keys.X:
# Fire
""" 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:
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",
}
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()
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)
"_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
}))
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)
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. """
def __bool__(self):
return bool(self._state)
+
+ def append(self, value):
+ self._top._record_change(self._prefix, value, action="append")