Changeset 18


Ignore:
Timestamp:
03/08/09 13:45:20 (10 years ago)
Author:
icelus_parpg
Message:

Applied patch from tie:

  • avoid reparsing instancemenu each time mouse is clicked.
  • normalise names of event handlers
  • avoid hardcoding available actions in instance menu
Location:
trunk/game/scripts
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/game/scripts/agents/agent.py

    r9 r18  
    1717        def start(self): 
    1818                raise ProgrammingError('No start defined for Agent') 
    19  
     19         
     20        def kickButtonHandler (self): 
     21                """Placeholder function to enable kick menu display for all children""" 
     22                pass 
     23        def talkButtonHandler (self): 
     24                """Placeholder function to enable talk menu display for all children""" 
     25                pass 
    2026 
    2127def create_anonymous_agents(model, objectName, layer, agentClass): 
  • trunk/game/scripts/agents/girl.py

    r17 r18  
    4747                self.agent.move('run', location, GIRL_SPEED) 
    4848         
    49         def kissButton_handler(self, myself, kisser): 
     49        def kissButtonHandler(self, myself, kisser): 
    5050                myself.say('Hands off, punk!',1000) 
  • trunk/game/scripts/world.py

    r17 r18  
    4444                self.pump_ctr = 0 # for testing purposis 
    4545                self.ctrldown = False 
    46                 self.instancemenu = None 
     46                self.instancemenu = pychan.loadXML('gui/instancemenu.xml') 
     47                # we keep a copy of all possible buttons to avoid reloading of XML 
     48                self.all_btns = [btn for btn in self.instancemenu.children] 
    4749                self.instance_to_agent = {} 
    48                 self.dynamic_widgets = {} 
    49  
     50                # dynamic_widgets should no longer be necessary; commenting them out to be safe 
     51                #self.dynamic_widgets = {}    
     52                 
    5053        def show_instancemenu(self, clickpoint, instance): 
     54                """Handles the display of the right-click context menu.""" 
     55                # IMPORTANT: We assume that the ALWAYS_PRESENT_BUTTONS are _NEVER_ removed from the instancemenu 
     56                # IMPORTANT: World and Agent functions that handle different actions  
     57                # must be named "buttonNameHandler", e.g. "talkButtonHandler" 
     58                # TODO: Add a range check; if we are out of range we should queue (get_in_range, perform_action) 
     59                 
     60                # no right-click menu for clicking on Hero 
    5161                if instance.getFifeId() == self.hero.agent.getFifeId(): 
    5262                        return 
    53  
    54                 dynamicbuttons = ('moveButton', 'talkButton', 'kickButton', 'inspectButton', 'kissButton') 
    55                 if not self.instancemenu: 
    56                         self.instancemenu = pychan.loadXML('gui/instancemenu.xml') 
    57                         self.instancemenu.mapEvents({ 
    58                                 'moveButton' : self.onMoveButtonPress, 
    59                                 'talkButton' : self.onTalkButtonPress, 
    60                                 'kickButton' : self.onKickButtonPress, 
    61                                 'inspectButton' : self.onInspectButtonPress, 
    62                                 'kissButton': self.onKissButtonPress, 
    63                         }) 
    64                         for btn in dynamicbuttons: 
    65                                 self.dynamic_widgets[btn] = self.instancemenu.findChild(name=btn) 
    66                 for btn in dynamicbuttons: 
    67                         try: 
    68                                 self.instancemenu.removeChild(self.dynamic_widgets[btn]) 
    69                         except pychan.exceptions.RuntimeError: 
    70                                 pass 
    71  
     63                # buttons that will always be available, regardless of the instance type 
     64                ALWAYS_PRESENT_BTNS = ('moveButton', 'inspectButton') 
     65                NAME_PATTERN = "%sHandler" 
     66                 
     67                if self.instance_to_agent.has_key(instance.getFifeId()): 
     68                        # we got an agent here; remove any actions that the agent cannot handle 
     69                        for btn in self.all_btns: 
     70                                #do we have this button in the current menu? 
     71                                btn_present = bool(self.instancemenu.findChild(name=btn.name)) 
     72                                # do we need this button in the current menu? 
     73                                btn_needed = hasattr(self.instance_to_agent[instance.getFifeId()],NAME_PATTERN % btn.name) \ 
     74                                           or btn.name in ALWAYS_PRESENT_BTNS 
     75                                if btn_needed and not btn_present: 
     76                                        self.instancemenu.addChild(btn) 
     77                                if not btn_needed and btn_present: 
     78                                        self.instancemenu.removeChild(btn) 
     79                else: 
     80                        # we got some other kind of object, so only leave always_present actions 
     81                        for btn in self.instancemenu.children[:]: 
     82                                if not btn.name in ALWAYS_PRESENT_BTNS: 
     83                                        self.instancemenu.removeChild(btn) 
     84 
     85                # map a dictionary of button names to their corresponding World fuctions 
     86                mapdict = dict([ (btn.name,getattr (self, NAME_PATTERN % btn.name)) for btn in self.instancemenu.children]) 
     87                self.instancemenu.mapEvents (mapdict) 
     88                 
     89                # add some global data 
    7290                self.instancemenu.clickpoint = clickpoint 
    73                 self.instancemenu.instance = instance 
    74  
    75                 self.instancemenu.addChild(self.dynamic_widgets['inspectButton']) 
    76                 target_distance = self.hero.agent.getLocationRef().getLayerDistanceTo(instance.getLocationRef()) 
    77                 if target_distance > 3.0: 
    78                         self.instancemenu.addChild(self.dynamic_widgets['moveButton']) 
    79                 else: 
    80                         if self.instance_to_agent.has_key(instance.getFifeId()): 
    81                                 self.instancemenu.addChild(self.dynamic_widgets['talkButton']) 
    82                                 self.instancemenu.addChild(self.dynamic_widgets['kickButton']) 
    83                                 for btn in dynamicbuttons: 
    84                                         if hasattr (self.instance_to_agent[instance.getFifeId()],btn +"_handler"): 
    85                                                 self.instancemenu.addChild(self.dynamic_widgets[btn]) 
     91                self.instancemenu.instance = instance            
    8692                self.instancemenu.position = (clickpoint.x, clickpoint.y) 
     93                # show the menu 
    8794                self.instancemenu.show() 
     95                return  
    8896 
    8997        def hide_instancemenu(self): 
     
    212220 
    213221                if (evt.getButton() == fife.MouseEvent.RIGHT): 
     222                        self.hide_instancemenu() 
    214223                        instances = self.cameras['main'].getMatchingInstances(clickpoint, self.agentlayer) 
    215224                        print "selected instances on agent layer: ", [i.getObject().getId() for i in instances] 
     
    235244                return result 
    236245 
    237         def onMoveButtonPress(self): 
     246        def moveButtonHandler(self): 
    238247                self.hide_instancemenu() 
    239248                self.hero.run(self.instancemenu.instance.getLocationRef()) 
    240249 
    241         def onTalkButtonPress(self): 
     250        def talkButtonHandler(self): 
    242251                self.hide_instancemenu() 
    243252                instance = self.instancemenu.instance 
     
    252261                        instance.say(girlTexts[txtindex], 5000) 
    253262 
    254         def onKickButtonPress(self): 
     263        def kickButtonHandler(self): 
    255264                self.hide_instancemenu() 
    256265                self.hero.kick(self.instancemenu.instance.getLocationRef()) 
    257266                self.instancemenu.instance.say('Hey!', 1000) 
    258267                 
    259         def onKissButtonPress (self): 
    260                 self.hide_instancemenu() 
    261                 self.instance_to_agent[self.instancemenu.instance.getFifeId()].kissButton_handler (self.instancemenu.instance,self.hero) 
    262  
    263         def onInspectButtonPress(self): 
     268        def kissButtonHandler(self): 
     269                self.hide_instancemenu() 
     270                self.instance_to_agent[self.instancemenu.instance.getFifeId()].kissButtonHandler (self.instancemenu.instance,self.hero) 
     271 
     272        def inspectButtonHandler(self): 
    264273                self.hide_instancemenu() 
    265274                inst = self.instancemenu.instance 
Note: See TracChangeset for help on using the changeset viewer.