changeset 592:4e9178215e75 pyntnclick

Introduce .setup() for GameDeveloperGizmos.
author Simon Cross <hodgestar+bzr@gmail.com>
date Sat, 11 Feb 2012 17:38:57 +0200
parents 4117d7b201a4
children 1eb1537173ef
files gamelib/scenes/bridge.py gamelib/scenes/crew_quarters.py gamelib/scenes/cryo.py gamelib/scenes/engine.py gamelib/scenes/machine.py gamelib/scenes/manual.py gamelib/scenes/map.py gamelib/scenes/mess.py pyntnclick/state.py
diffstat 9 files changed, 49 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/scenes/bridge.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/bridge.py	Sat Feb 11 17:38:57 2012 +0200
@@ -40,8 +40,7 @@
         'ai panel': 'closed',  # closed, open, broken
         }
 
-    def __init__(self, state):
-        super(Bridge, self).__init__(state)
+    def setup(self):
         self.background_playlist = None
         self.add_item(Superconductor('superconductor'))
         self.add_item(Stethoscope('stethoscope'))
@@ -265,8 +264,7 @@
 
 class BlinkingLights(Thing):
 
-    def __init__(self):
-        super(BlinkingLights, self).__init__()
+    def setup(self):
         self.description = None
 
     def is_interactive(self, tool=None):
@@ -372,8 +370,7 @@
     BACKGROUND = 'chair_detail.png'
     NAME = 'chair_detail'
 
-    def __init__(self, state):
-        super(ChairDetail, self).__init__(state)
+    def setup(self):
         self.add_thing(SuperconductorThing())
 
 
@@ -573,9 +570,7 @@
             'max page': len(LOGS),
     }
 
-    def __init__(self, state):
-        super(BridgeCompDetail, self).__init__(state)
-
+    def setup(self):
         self.add_thing(LogTab())
         self.add_thing(AlertTab())
         self.add_thing(NavTab())
--- a/gamelib/scenes/crew_quarters.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/crew_quarters.py	Sat Feb 11 17:38:57 2012 +0200
@@ -16,8 +16,7 @@
 
     OFFSET = (0, -50)
 
-    def __init__(self, state):
-        super(CrewQuarters, self).__init__(state)
+    def setup(self):
         self.add_thing(ToMap())
         self.add_thing(Safe())
         self.add_thing(FishbowlThing())
--- a/gamelib/scenes/cryo.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/cryo.py	Sat Feb 11 17:38:57 2012 +0200
@@ -34,8 +34,7 @@
             'silent.ogg',
             ]
 
-    def __init__(self, state):
-        super(Cryo, self).__init__(state)
+    def setup(self):
         self.add_item(TitaniumLeg("titanium_leg"))
         self.add_thing(CryoUnitAlpha())
         self.add_thing(CryoRoomDoor())
@@ -509,8 +508,7 @@
     BACKGROUND = "cryo_unit_detail.png"
     NAME = "cryo_detail"
 
-    def __init__(self, state):
-        super(CryoUnitWithCorpse, self).__init__(state)
+    def setup(self):
         self.add_thing(TitaniumLegThing())
         self.add_thing(PlaqueThing())
 
--- a/gamelib/scenes/engine.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/engine.py	Sat Feb 11 17:38:57 2012 +0200
@@ -21,8 +21,7 @@
         'greet': True,
         }
 
-    def __init__(self, state):
-        super(Engine, self).__init__(state)
+    def setup(self):
         self.add_item(CanOpener('canopener'))
         self.add_thing(CanOpenerThing())
         self.add_thing(SuperconductorSocket())
@@ -537,9 +536,7 @@
     ALERT_OFFSET = (16, 100)
     ALERT_SPACING = 4
 
-    def __init__(self, state):
-        super(EngineCompDetail, self).__init__(state)
-
+    def setup(self):
         self._alert_messages = {}
         for key, name in self.ALERTS.iteritems():
             self._alert_messages[key] = get_image(self.FOLDER, name)
--- a/gamelib/scenes/machine.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/machine.py	Sat Feb 11 17:38:57 2012 +0200
@@ -13,8 +13,7 @@
     FOLDER = "machine"
     BACKGROUND = "machine_room.png"
 
-    def __init__(self, state):
-        super(Machine, self).__init__(state)
+    def setup(self):
         self.add_thing(ToMap())
         self.add_thing(LaserWelderSlot())
         self.add_thing(LaserWelderButton())
--- a/gamelib/scenes/manual.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/manual.py	Sat Feb 11 17:38:57 2012 +0200
@@ -105,9 +105,7 @@
 
     BACKGROUND = 'manual_detail.png'
 
-    def __init__(self, state):
-        super(ManualDetail, self).__init__(state)
-
+    def setup(self):
         self.add_thing(ManualPage())
         self.add_thing(PagePrior())
         self.add_thing(PageNext())
--- a/gamelib/scenes/map.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/map.py	Sat Feb 11 17:38:57 2012 +0200
@@ -23,8 +23,7 @@
         'implant': True,
     }
 
-    def __init__(self, state):
-        super(Map, self).__init__(state)
+    def setup(self):
         self.add_thing(ToCryo())
         self.add_thing(ToBridge())
         self.add_thing(ToMess())
--- a/gamelib/scenes/mess.py	Sat Feb 11 17:34:23 2012 +0200
+++ b/gamelib/scenes/mess.py	Sat Feb 11 17:38:57 2012 +0200
@@ -21,8 +21,7 @@
         'life support status': 'broken',  # broken, replaced, fixed
         }
 
-    def __init__(self, state):
-        super(Mess, self).__init__(state)
+    def setup(self):
         self.add_thing(CansOnShelf())
         self.add_thing(Tubes())
         self.add_thing(ToMap())
--- 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