# HG changeset patch # User Jeremy Thurgood # Date 1359198031 -7200 # Node ID 386475464202ee6c14ae9ebd7c2f46eb26c1203e # Parent f4853f817a7a3d2958e37d569b4b19295d59cd89 Inspect game state for Thing.set_interact() instead of setting it manually everywhere. diff -r f4853f817a7a -r 386475464202 gamelib/scenes/bridge.py --- 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' diff -r f4853f817a7a -r 386475464202 gamelib/scenes/crew_quarters.py --- 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.") diff -r f4853f817a7a -r 386475464202 gamelib/scenes/cryo.py --- 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": diff -r f4853f817a7a -r 386475464202 gamelib/scenes/engine.py --- 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.") diff -r f4853f817a7a -r 386475464202 gamelib/scenes/game_widgets.py --- 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() diff -r f4853f817a7a -r 386475464202 gamelib/scenes/machine.py --- 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") diff -r f4853f817a7a -r 386475464202 gamelib/scenes/manual.py --- 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: diff -r f4853f817a7a -r 386475464202 gamelib/scenes/mess.py --- 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.") diff -r f4853f817a7a -r 386475464202 pyntnclick/state.py --- 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) diff -r f4853f817a7a -r 386475464202 pyntnclick/tests/mad_clicker.py --- 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)