Changeset 153


Ignore:
Timestamp:
06/19/09 19:56:32 (10 years ago)
Author:
meggie_parpg
Message:

Added beginnings of talking functionality to the npc and hero classes. Made doors act the same way that other objects act (when it comes to item actions). Most of the door stuff will probably have to be changed when gameData/gameState stuff gets straightened out. Also, the context menu should probably close when an action is selected, but that seems to by a nasty pychan thing.

Location:
trunk/PARPG/scripts
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/PARPG/scripts/agents/hero.py

    r150 r153  
    1818 
    1919TDS = Setting() 
    20 _STATE_NONE, _STATE_IDLE, _STATE_RUN = xrange(3) 
     20_STATE_NONE, _STATE_IDLE, _STATE_RUN, _STATE_TALK = xrange(4) 
    2121 
    2222class Hero(fife.InstanceActionListener): 
     
    6969            # issue map change 
    7070            self.engine.changeMap(self.targetMap, self.targetLocation) 
    71          
     71        if self.state == _STATE_TALK: 
     72            # TODO: do something 
     73            pass 
    7274        self.idle() 
    7375        if(action.getId() != 'stand'): 
     
    9294        self.agent.move('run', location, self.speed) 
    9395 
     96    def approachNPC(self, npcLoc): 
     97        """Approaches an npc and then ???. 
     98           @type npcLoc: fife.Location 
     99           @param npcLoc: the location of the NPC to approach 
     100           @return: None""" 
     101        self.state = _STATE_TALK 
     102        self.agent.move('run', npcLoc, self.speed) 
     103 
    94104    def approachDoor(self, doorLocation, map, targetLocation): 
    95105        """Approach a door and then teleport to the new map. 
    96            @type doorLocation: fife.ScreenPoint 
    97            @param doorLocation: ??? 
     106           @type doorLocation: list 
     107           @param doorLocation: list that is converted to a fife.Location 
     108            that tells the PC where the door is 
    98109           @type map: ??? 
    99110           @param map: ??? 
    100            @type targetLocation: ??? 
    101            @param targetLocation: ??? 
     111           @type targetLocation: list 
     112           @param targetLocation: list that is converted to a tuple 
     113            that tels the PC where it should appear on the target map 
    102114           @return: None""" 
     115        # The casting here is HORRIBLE, but I think it is preferable to having 
     116        # doors behave differently than other objects, hence the change. 
    103117        self.state = _STATE_RUN 
     118        targetLocation = tuple([int(float(i)) for i in targetLocation]) 
     119        doorLocation = tuple([int(float(i)) for i in doorLocation]) 
    104120        self.targetMap = map 
    105121        self.targetLocation = targetLocation 
    106         self.agent.move('approachDoor', doorLocation, self.speed) 
     122        l = fife.Location(self.agent.getLocation()) 
     123        l.setLayerCoordinates(fife.ModelCoordinate(*doorLocation)) 
     124        self.agent.move('approachDoor', l, self.speed) 
  • trunk/PARPG/scripts/agents/npc.py

    r148 r153  
    6060           @return: the y coordinate of the NPC's location""" 
    6161        return self.agent.getLocation().getLayerCoordinates().y 
     62 
     63    def getLocation(self): 
     64        """ Get the NPC's position as a fife.Location object. Basically a 
     65            wrapper. 
     66            @rtype: fife.Location 
     67            @return: the location of the NPC""" 
     68        return self.agent.getLocation() 
    6269 
    6370    def getTargetLocation(self): 
     
    130137        self.agent.move('run', location, self.speed+1) 
    131138 
     139    def talk(self): 
     140        """ Makes the NPC ready to talk to the PC 
     141            @return: None""" 
     142        self.state = _STATE_TALK 
     143        self.idle() 
  • trunk/PARPG/scripts/engine.py

    r151 r153  
    238238        actions=[] 
    239239        # note: ALWAYS check NPC's first! 
    240         # is it an NPC? 
    241240        for i in self.getObjectsFromMap(self.currentMap): 
    242241            if(obj_id == i.id): 
     
    246245                    actions.append(["Attack", "Attack", self.nullFunc, i])  
    247246                elif isinstance(i, DoorData): 
    248                     return self.doors[str(i.id)] 
     247                    actions.append(["Change Map", "Change Map", \ 
     248                            self.PC.approachDoor, [i.posx, i.posy], \ 
     249                            self.doors[str(i.id)].map, [i.destx, i.desty]]) 
    249250                elif isinstance(i, NonLivingObjectData): 
    250251                    actions.append(["Examine", "Examine", self.nullFunc, i]) 
     
    260261        """Sample callback for the context menus.""" 
    261262        print userdata 
     263     
     264    def initTalk(self, npc): 
     265        """ Starts the PC talking to an NPC. """ 
     266        # TODO: work more on this when we get NPCData and HeroData straightened 
     267        # out 
     268        npc.talk() 
     269        self.PC.approachNPC(npc.getLocation()) 
    262270 
    263271    def loadMap(self, map_file): 
     
    266274           @param map_file: Name of map file to load 
    267275           @return: None""" 
     276        # try to clear the menu 
     277        self.view.clearMenu() 
    268278        # then we let FIFE load the rest of the map 
    269279        self.view.load(str(map_file)) 
  • trunk/PARPG/scripts/world.py

    r150 r153  
    281281        if(evt.getButton() == fife.MouseEvent.LEFT): 
    282282            self.data.handleMouseClick(self.getCoords(click)) 
    283             if(hasattr(self, "context_menu")): 
    284                 self.context_menu.vbox.hide() 
    285                 delattr(self, "context_menu") 
    286                  
     283            self.clearMenu()  
    287284        elif(evt.getButton() == fife.MouseEvent.RIGHT): 
    288285            # is there an object here? 
     
    295292                        # yes, get the data 
    296293                        info = self.data.getItemActions(obj.getId()) 
    297                         if(isinstance(info, MapDoor)): 
    298                             # approach the door 
    299                             self.data.PC.approachDoor(self.getCoords(click), 
    300                                                       info.map, 
    301                                                       info.targ_coords) 
    302                             return 
    303                         else: 
    304                             # show the context menu 
    305                             break 
    306                          
     294                        break 
    307295            # delete the old context menu 
    308             if(hasattr(self, "context_menu")): 
    309                 self.context_menu.vbox.hide() 
    310                 delattr(self, "context_menu")        
     296            self.clearMenu() 
    311297            if info: 
    312298                # take the menu items returned by the engine 
     
    322308        """ 
    323309        self.data.PC.run(click) 
    324         self.context_menu.vbox.hide() 
    325         delattr(self, "context_menu") 
     310        self.clearMenu() 
    326311 
    327312    def mouseMoved(self, evt): 
     
    365350        renderer.setEnabled(not renderer.isEnabled()) 
    366351 
     352    def clearMenu(self): 
     353        """ Hides the context menu. Just nice to have it as a function. 
     354            @return: None""" 
     355        if hasattr(self, "context_menu"): 
     356            self.context_menu.vbox.hide() 
     357            delattr(self, "context_menu") 
     358 
    367359    def quitGame(self): 
    368360        """Called when user requests to quit game. 
Note: See TracChangeset for help on using the changeset viewer.