diff pyntnclick/state.py @ 592:4e9178215e75 pyntnclick

Introduce .setup() for GameDeveloperGizmos.
author Simon Cross <hodgestar+bzr@gmail.com>
date Sat, 11 Feb 2012 17:38:57 +0200
parents 0571deb177e9
children 59f1ee3f5632
line wrap: on
line diff
--- a/pyntnclick/state.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/pyntnclick/state.py	Sat Feb 11 17:38:57 2012 +0200
@@ -92,14 +92,16 @@
         self.debug_rects = value
 
     def add_scene(self, scene):
+        scene.set_state(self)
         self.scenes[scene.name] = scene
 
     def add_detail_view(self, detail_view):
+        detail_view.set_state(self)
         self.detail_views[detail_view.name] = detail_view
 
     def add_item(self, item):
+        item.set_state(self)
         self.items[item.name] = item
-        item.set_state(self)
 
     def load_scenes(self, modname):
         mod = __import__("gamelib.scenes.%s" % (modname,), fromlist=[modname])
@@ -198,12 +200,39 @@
         self.do_check = self.gd.constants.leave
 
 
-class StatefulGizmo(object):
+class GameDeveloperGizmo(object):
+    """Base class for objects game developers see."""
+
+    def __init__(self):
+        """Set """
+        self.state = None
+        self.gd = None
+        self.resource = None
+        self.sound = None
+
+    def set_state(self, state):
+        self.state = state
+        self.gd = state.gd
+        self.resource = self.gd.resource
+        self.sound = self.gd.sound
+        self.setup()
+
+    def setup(self):
+        """Game developers should override this to do their setup.
+
+        It will be called after all the useful state functions have been
+        set.
+        """
+        pass
+
+
+class StatefulGizmo(GameDeveloperGizmo):
 
     # initial data (optional, defaults to none)
     INITIAL_DATA = None
 
     def __init__(self):
+        GameDeveloperGizmo.__init__(self)
         self.data = {}
         if self.INITIAL_DATA:
             # deep copy of INITIAL_DATA allows lists, sets and
@@ -236,10 +265,6 @@
         StatefulGizmo.__init__(self)
         # scene name
         self.name = self.NAME if self.NAME is not None else self.FOLDER
-        # link back to state object
-        self.state = state
-        self.sound = state.gd.sound
-        self.resource = state.gd.resource
         # map of thing names -> Thing objects
         self.things = {}
         self._background = None
@@ -249,6 +274,7 @@
 
     def add_thing(self, thing):
         self.things[thing.name] = thing
+        thing.set_state(self.state)
         thing.set_scene(self)
 
     def remove_thing(self, thing):
@@ -280,7 +306,7 @@
 
     def _cache_background(self):
         if self.BACKGROUND and not self._background:
-            self._background = self.state.gd.resource.get_image(
+            self._background = self.resource.get_image(
                     (self.FOLDER, self.BACKGROUND))
 
     def draw_background(self, surface):
@@ -405,7 +431,6 @@
         self.interacts = self.INTERACTS
         # these are set by set_scene
         self.scene = None
-        self.state = None
         self.current_interact = None
         self.rect = None
         self.orig_rect = None
@@ -477,7 +502,7 @@
                             rect.inflate(1, 1), 1)
 
 
-class Item(InteractiveMixin):
+class Item(GameDeveloperGizmo, InteractiveMixin):
     """Base class for inventory items."""
 
     # image for inventory
@@ -493,7 +518,7 @@
     CURSOR = None
 
     def __init__(self, name=None):
-        self.state = None
+        GameDeveloperGizmo.__init__(self)
         self.name = self.NAME
         if name is not None:
             self.name = name
@@ -504,13 +529,9 @@
 
     def _cache_inventory_image(self):
         if not self.inventory_image:
-            self.inventory_image = self.state.gd.resource.get_image(
+            self.inventory_image = self.resource.get_image(
                     ('items', self.INVENTORY_IMAGE))
 
-    def set_state(self, state):
-        assert self.state is None
-        self.state = state
-
     def get_inventory_image(self):
         self._cache_inventory_image()
         return self.inventory_image