changeset 759:386475464202 pyntnclick

Inspect game state for Thing.set_interact() instead of setting it manually everywhere.
author Jeremy Thurgood <firxen@gmail.com>
date Sat, 26 Jan 2013 13:00:31 +0200
parents f4853f817a7a
children f288e5ec0a75
files gamelib/scenes/bridge.py gamelib/scenes/crew_quarters.py gamelib/scenes/cryo.py gamelib/scenes/engine.py gamelib/scenes/game_widgets.py gamelib/scenes/machine.py gamelib/scenes/manual.py gamelib/scenes/mess.py pyntnclick/state.py pyntnclick/tests/mad_clicker.py
diffstat 10 files changed, 110 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/scenes/bridge.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/bridge.py	Sat Jan 26 13:00:31 2013 +0200
@@ -329,6 +329,10 @@
         if self.scene.get_data('ai panel') == 'closed':
             return "The sign reads 'Warning: Authorized Techinicians Only'."
 
+    def select_interact(self):
+        status = self.get_data('ai panel')
+        return status or self.INITIAL
+
     def interact_without(self):
         ai_status = self.state.get_jim_state()
         if ai_status == 'online':
@@ -339,7 +343,7 @@
         elif self.scene.get_data('ai panel') == 'open':
             self.scene.set_data('ai panel', 'broken')
             self.state.break_ai()
-            self.set_interact('broken')
+            self.set_interact()
             return Result("You unplug various important-looking wires.")
 
     def interact_with_machete(self, item):
@@ -348,12 +352,12 @@
             return self.interact_default(item)
         elif self.scene.get_data('ai panel') == 'closed':
             self.scene.set_data('ai panel', 'open')
-            self.set_interact('open')
+            self.set_interact()
             return Result("Using the machete, you lever the panel off.")
         elif self.scene.get_data('ai panel') == 'open':
             self.scene.set_data('ai panel', 'broken')
             self.state.break_ai()
-            self.set_interact('broken')
+            self.set_interact()
             return Result("You smash various delicate components with"
                           " the machete.")
 
@@ -451,11 +455,12 @@
         # set debugging higlight color for when DEBUG is on.
         self._interact_hilight_color = Color(THECOLORS.keys()[number])
         r = Rect(rect)
+        # We dynamically generate the interact rect here.
         self.interacts = {}
         self.interacts['line'] = InteractNoImage(r.x, r.y, r.w, r.h)
         # Whether JIM blocks this
         self.ai_blocked = ai_blocked
-        self.set_interact('line')
+        self.set_interact()
 
     def is_interactive(self, tool=None):
         return self.game.detail_views[self.COMPUTER].get_data('tab') == 'nav'
--- a/gamelib/scenes/crew_quarters.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/crew_quarters.py	Sat Jan 26 13:00:31 2013 +0200
@@ -62,12 +62,19 @@
         'has_tape': True,
         }
 
+    def select_interact(self):
+        if self.get_data('is_cracked'):
+            if self.get_data('has_tape'):
+                return 'full_safe'
+            return 'empty_safe'
+        return self.INITIAL
+
     def interact_without(self):
         if self.get_data('is_cracked'):
             if self.get_data('has_tape'):
                 self.set_data('has_tape', False)
                 self.game.add_inventory_item('duct_tape')
-                self.set_interact('empty_safe')
+                self.set_interact()
                 return Result("Duct tape. It'll stick to everything except "
                               "ducts, apparently.")
             return Result("The perfectly balanced door swings frictionlessly "
@@ -81,7 +88,7 @@
         # TODO: Add years to the sentence for safecracking.
         # TODO: Wax lyrical some more about safecracking.
         self.set_data('is_cracked', True)
-        self.set_interact('full_safe')
+        self.set_interact()
         return (Result("Even after centuries of neglect, the tumblers slide"
                       " almost silently into place. Turns out the combination"
                       " was '1 2 3 4 5'. An idiot must keep his luggage in"
@@ -113,12 +120,17 @@
         'has_bowl': True,
         }
 
+    def select_interact(self):
+        if not self.get_data('has_bowl'):
+            return 'fish_no_bowl'
+        return self.INITIAL
+
     def interact_without(self):
         if not self.get_data('has_bowl'):
             return Result("What's the point of lugging around a very dead"
                     " fish and a kilogram or so of sand?")
-        self.set_interact('fish_no_bowl')
         self.set_data('has_bowl', False)
+        self.set_interact()
         self.game.add_inventory_item('fishbowl')
         return Result("The fishbowl is useful, but its contents aren't.")
 
--- a/gamelib/scenes/cryo.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/cryo.py	Sat Jan 26 13:00:31 2013 +0200
@@ -155,13 +155,18 @@
         'fixed': True,
     }
 
+    def select_interact(self):
+        if not self.get_data('fixed'):
+            return 'chopped'
+        return self.INITIAL
+
     def interact_with_machete(self, item):
         if self.get_data('fixed'):
             self.set_data('fixed', False)
             pipe = TubeFragment('tube_fragment')
             self.game.add_item(pipe)
             self.game.add_inventory_item(pipe.name)
-            self.set_interact("chopped")
+            self.set_interact()
             responses = [Result("It takes more effort than one would expect,"
                 " but eventually the pipe is separated from the wall.",
                 soundfile="chop-chop.ogg")]
@@ -367,13 +372,16 @@
     def interact_default(self, item):
         return self.interact_without()
 
+    def select_interact(self):
+        return self.get_data('door') or self.INITIAL
+
     def half_open_door(self):
         self.set_data('door', "ajar")
-        self.set_interact("ajar")
+        self.set_interact()
 
     def open_door(self):
         self.set_data('door', "open")
-        self.set_interact("open")
+        self.set_interact()
 
     def get_description(self):
         if self.get_data('door') == "open":
--- a/gamelib/scenes/engine.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/engine.py	Sat Jan 26 13:00:31 2013 +0200
@@ -207,6 +207,13 @@
         else:
             return "A working superconductor."
 
+    def select_interact(self):
+        if not self.get_data('present'):
+            return 'removed'
+        if self.get_data('working'):
+            return 'fixed'
+        return self.INITIAL
+
     def interact_without(self):
         if self.get_data('present') and not self.get_data('working'):
             return Result("It's wedged in there pretty firmly, it won't"
@@ -217,8 +224,8 @@
 
     def interact_with_machete(self, item):
         if self.get_data('present') and not self.get_data('working'):
-            self.set_interact('removed')
             self.set_data('present', False)
+            self.set_interact()
             return Result("With leverage, the burned-out superconductor"
                           " snaps out. You discard it.")
 
@@ -234,9 +241,9 @@
 
     def interact_with_taped_superconductor(self, item):
         if not self.get_data('present'):
-            self.set_interact('fixed')
             self.set_data('present', True)
             self.set_data('working', True)
+            self.set_interact()
             self.game.remove_inventory_item(item.name)
             results = [Result("The chair's superconductor looks over-specced "
                               "for this job, but it should work.")]
@@ -261,6 +268,11 @@
         'filled': False,
     }
 
+    def select_interact(self):
+        if self.get_data('filled'):
+            return 'full'
+        return self.INITIAL
+
     def get_description(self):
         if not self.get_data('filled'):
             return "Those are coolant reservoirs. They look empty."
@@ -296,7 +308,7 @@
                     " container connected to a cracked pipe would be a waste.")
         self.game.remove_inventory_item(item.name)
         self.scene.things['engine.cryo_containers'].set_data('filled', True)
-        self.scene.things['engine.cryo_containers'].set_interact('full')
+        self.scene.things['engine.cryo_containers'].set_interact()
         results = [Result("You fill the reservoirs. "
                           "The detergent bottle was just big enough, which "
                           "is handy, because it's sprung a leak.")]
@@ -489,13 +501,18 @@
             return "The pipe looks cracked and won't hold" \
                    " fluid until it's fixed."
 
+    def select_interact(self):
+        if self.get_data('fixed'):
+            return 'taped'
+        return self.INITIAL
+
     def interact_with_duct_tape(self, item):
         if self.get_data('fixed'):
             return Result("The duct tape already there appears to be "
                           "sufficient.")
         else:
             self.set_data('fixed', True)
-            self.set_interact('taped')
+            self.set_interact()
             return Result("You apply your trusty duct tape to the "
                           "creak, sealing it.")
 
--- a/gamelib/scenes/game_widgets.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/game_widgets.py	Sat Jan 26 13:00:31 2013 +0200
@@ -68,9 +68,15 @@
             self.game.data.loop_ai()
             return ai_response
 
+    def select_interact(self):
+        if 'bridge' not in self.state:
+            # We aren't completely set up yet
+            return self.INITIAL
+        return self.state.get_jim_state()
+
     def animate(self):
         ai_status = self.state.get_jim_state()
         if ai_status != self.get_data('status'):
             self.set_data('status', ai_status)
-            self.set_interact(ai_status)
+            self.set_interact()
         super(BaseCamera, self).animate()
--- a/gamelib/scenes/machine.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/machine.py	Sat Jan 26 13:00:31 2013 +0200
@@ -100,18 +100,17 @@
         'contents': set(),
     }
 
-    def update_contents(self):
-        """Update the interact after a contents change."""
+    def select_interact(self):
         contents = self.get_data('contents')
         if not contents:
-            self.set_interact("empty")
+            return "empty"
         elif len(contents) == 1:
             if "can" in contents:
-                self.set_interact("can")
+                return "can"
             elif "tube" in contents:
-                self.set_interact("tube")
+                return "tube"
         else:
-            self.set_interact("can_and_tube")
+            return "can_and_tube"
 
     def interact_without(self):
         return Result("You really don't want to put your hand in there.")
@@ -122,7 +121,7 @@
             return Result("There is already a can in the welder.")
         self.game.remove_inventory_item(item.name)
         contents.add("can")
-        self.update_contents()
+        self.set_interact()
         return Result("You carefully place the can in the laser welder.")
 
     def interact_with_tube_fragment(self, item):
@@ -131,7 +130,7 @@
             return Result("There is already a tube fragment in the welder.")
         self.game.remove_inventory_item(item.name)
         contents.add("tube")
-        self.update_contents()
+        self.set_interact()
         return Result("You carefully place the tube fragments in the"
                       " laser welder.")
 
@@ -179,7 +178,7 @@
                               " tube fragments to.")
         else:
             welder_slot.set_data("contents", set())
-            welder_slot.update_contents()
+            welder_slot.set_interact()
             if self.game.is_in_inventory("cryo_pipes_one"):
                 self.game.replace_inventory_item("cryo_pipes_one",
                                                   "cryo_pipes_two")
--- a/gamelib/scenes/manual.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/manual.py	Sat Jan 26 13:00:31 2013 +0200
@@ -20,9 +20,12 @@
     def set_page(self, page):
         self.get_page_thing().set_page(page)
 
+    def select_interact(self):
+        return self.get_data('display')
+
     def set_display(self, display):
         self.set_data('display', display)
-        self.set_interact(display)
+        self.set_interact()
 
     def is_interactive(self, tool=None):
         return self.get_data('display') == 'on'
@@ -86,9 +89,12 @@
     def is_interactive(self, tool=None):
         return False
 
+    def select_interact(self):
+        return self.get_data('page')
+
     def set_page(self, page):
         self.set_data('page', page)
-        self.set_interact(page)
+        self.set_interact()
         self.scene.things['manual.page_prior'].set_display('on')
         self.scene.things['manual.page_next'].set_display('on')
         if page == 0:
--- a/gamelib/scenes/mess.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/gamelib/scenes/mess.py	Sat Jan 26 13:00:31 2013 +0200
@@ -126,6 +126,9 @@
         'cans_available': 3,
     }
 
+    def select_interact(self):
+        return '%icans' % (self.get_data('cans_available'),)
+
     def interact_without(self):
         starting_cans = self.get_data('cans_available')
         if starting_cans > 0:
@@ -133,7 +136,7 @@
             self.game.add_item(can)
             self.game.add_inventory_item(can.name)
             self.set_data('cans_available', starting_cans - 1)
-            self.set_interact('%icans' % (starting_cans - 1))
+            self.set_interact()
             if starting_cans == 1:
                 self.scene.remove_thing(self)
             return Result({
@@ -178,10 +181,13 @@
         else:
             return "Your fix looks like it's holding up well."
 
+    def select_interact(self):
+        return self.get_data('status')
+
     def interact_with_machete(self, item):
         if self.get_data("status") == "blocked":
             self.set_data("status", "broken")
-            self.set_interact("broken")
+            self.set_interact()
             return Result("With a flurry of disgusting mutant vegetable "
                           "chunks, you clear the overgrown broccoli away from "
                           "the access panel and reveal some broken tubes. "
@@ -201,7 +207,7 @@
         else:
             self.game.remove_inventory_item(item.name)
             self.set_data('status', 'replaced')
-            self.set_interact("replaced")
+            self.set_interact()
             self.scene.set_data('life support status', 'replaced')
             return Result("The pipes slot neatly into place, but don't make"
                           " an airtight seal. One of the pipes has cracked"
@@ -215,7 +221,7 @@
         else:
             self.set_data("fixed", True)
             self.set_data("status", "fixed")
-            self.set_interact("fixed")
+            self.set_interact()
             self.scene.set_data('life support status', 'fixed')
             return Result("It takes quite a lot of tape, but eventually"
                           "everything is airtight and ready to hold pressure."
@@ -263,13 +269,13 @@
         if self.get_data('anim_pos') > -1:
             self.current_interact.animate()
             if self.get_data('anim_pos') > self.current_interact._anim_pos:
-                self.set_interact('no_snake')
+                self._set_interact('no_snake')
                 self.set_data('anim_pos', -1)
             else:
                 self.set_data('anim_pos', self.current_interact._anim_pos)
             return True
         if randint(0, 30 * self.game.gd.constants.frame_rate) == 0:
-            self.set_interact('snake')
+            self._set_interact('snake')
             self.set_data('anim_pos', 0)
             hiss.play()
         return False
@@ -291,11 +297,16 @@
         'taken': False,
     }
 
+    def select_interact(self):
+        if self.get_data('taken'):
+            return 'taken'
+        return self.INITIAL
+
     def interact_without(self):
         if self.get_data('taken'):
             return Result("The remaining bottles leak.")
         self.set_data('taken', True)
-        self.set_interact('taken')
+        self.set_interact()
         self.game.add_inventory_item('detergent_bottle')
         return Result("You pick up an empty dishwashing liquid bottle. You"
                       " can't find any sponges.")
--- a/pyntnclick/state.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/pyntnclick/state.py	Sat Jan 26 13:00:31 2013 +0200
@@ -51,6 +51,9 @@
     def __getitem__(self, key):
         return self._game_state[key]
 
+    def __contains__(self, key):
+        return key in self._game_state
+
     def get_all_gizmo_data(self, state_key):
         """Get all state for a gizmo - returns a dict"""
         return self[state_key]
@@ -443,15 +446,21 @@
         self.set_state(self.game.data)
         for interact in self.interacts.itervalues():
             interact.set_thing(self)
-        self.set_interact(self.INITIAL)
+        self.set_interact()
 
-    def set_interact(self, name):
+    def set_interact(self):
+        return self._set_interact(self.select_interact())
+
+    def _set_interact(self, name):
         self.current_interact = self.interacts[name]
         self.rect = self.current_interact.interact_rect
         if self.scene:
             self._fix_rect()
         assert self.rect is not None, name
 
+    def select_interact(self):
+        return self.INITIAL
+
     def contains(self, pos):
         if hasattr(self.rect, 'collidepoint'):
             return self.rect.collidepoint(pos)
--- a/pyntnclick/tests/mad_clicker.py	Sat Jan 26 12:56:21 2013 +0200
+++ b/pyntnclick/tests/mad_clicker.py	Sat Jan 26 13:00:31 2013 +0200
@@ -89,14 +89,14 @@
             self.state.current_scene = scene
             for thing in scene.things.values():
                 for interact_name in thing.interacts:
-                    thing.set_interact(interact_name)
+                    thing._set_interact(interact_name)
                     self.do_thing(thing, None)
                     for item in self.state.items.values():
                         self.do_thing(thing, item)
         for detail in self.state.detail_views.values():
             for thing in detail.things.values():
                 for interact_name in thing.interacts:
-                    thing.set_interact(interact_name)
+                    thing._set_interact(interact_name)
                     self.do_thing(thing, None)
                     for item in self.state.items.values():
                         self.do_thing(thing, item)