Changeset 187


Ignore:
Timestamp:
07/08/09 00:46:25 (10 years ago)
Author:
tZee_parpg
Message:

Moved code to the new object classes and the new objectLoader.py.
(N)PC and (N)PCBehaviour coupling is still a bit clumsy: Too many dereferences between those two. Needs to be improved.
Doors are missing for now and need to be added. Except that all functionality should have been preserved.

Location:
trunk/PARPG
Files:
2 deleted
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/PARPG/maps/map_objects.xml

    r179 r187  
    55<objects format="1.0"> 
    66    <!-- There must be one and one only PC character --> 
    7     <PC xpos="0.0" ypos="0.0"></PC> 
     7    <object id="PC" gfx="PC" type="PlayerCharacter" xpos="0.0" ypos="0.0"></object> 
    88 
    99    <!-- There can be any number of NPC characters --> 
    10     <NPC gfx="npc-woman" xpos="-4.0" ypos="-7.0" id="women01" 
    11          text="A friendly woman"></NPC> 
     10    <object type="NonPlayerCharacter" gfx="npc-woman" xpos="-4.0" ypos="-7.0" id="woman01" 
     11         text="A friendly woman"></object> 
    1212 
    1313    <!-- There can be any number of objects --> 
    1414    <!-- Object blocking is set in the objects own xml file --> 
    15     <object display="True" gfx="crate" xpos="-4.0" ypos="-6.0" id="crate02" 
    16             carry="0" contain="1" text="A dirty old crate"></object> 
    17  
    18     <!-- These next things are inside other objects --> 
    19     <object display="False" gfx="NONE" owner="crate02" id="letter" 
    20             carry="1" contain="0" text="A newly thrown-away letter"></object> 
    21     <object display="False" gfx="NONE" owner="crate02" id="battery" 
    22             carry="1" contain="0" text="An old battery"></object> 
     15    <object type="WoodenCrate" xpos="-4.0" ypos="-6.0" id="crate02" 
     16            is_open="False" locked="False" text="A dirty old crate"></object> 
     17                         
     18        <object type="WoodenCrate" id="crate01" xpos="-3.0" ypos="-4.0"  
     19                is_open="False" locked="False" text="asdf"></object> 
    2320 
    2421    <!-- There can be a number of doors, which serve as transition triggers --> 
    25     <door display="True" gfx="shanty-door" xpos="-2.0" ypos="6.0" 
     22    <!--door display="True" gfx="shanty-door" xpos="-2.0" ypos="6.0" 
    2623        id="sh-door" text="Enter building" map="maps/shanty.xml" 
    2724        txpos="-1" typos="1"></door> 
    2825    <door display="True" gfx="snow02" xpos="-14" ypos="10" 
    2926        id="tt01" text="New Map" map="maps/map2.xml" 
    30                 txpos="-14" typos="-16"></door> 
    31  
    32         <!-- New way of making objects --> 
    33         <game_obj type="WoodenCrate" ID="crate01" xpos="-3.0" ypos="-4.0"  
    34                 is_open="False" locked="False"></game_obj> 
     27                txpos="-14" typos="-16"></door--> 
    3528</objects> 
    3629 
  • trunk/PARPG/scripts/engine.py

    r186 r187  
    2323from saver import Saver 
    2424from gamestate import GameState 
    25 from gamedata import * 
     25from objects import * 
    2626from objectLoader import ObjectXMLParser 
    2727 
     
    120120            return False 
    121121        # now open and read the XML file 
    122         cur_handler = LocalXMLParser() 
    123122        other_handler = ObjectXMLParser() 
    124         parser = cur_handler.getParser() 
    125         parser.setContentHandler(cur_handler) 
    126         parser.parse(objects_file) 
    127         objects_file.seek(0) 
    128123        other_handler.getObjects(objects_file, self.view.agent_layer) 
    129124        objects_file.close() 
    130         # must have at least 1 PC 
    131         if(cur_handler.pc == None): 
    132             sys.stderr.write("Error: No PC defined\n") 
    133             sys.exit(False) 
     125             
    134126        # now add to the map and the engine 
    135         self.addPC(cur_handler.pc) 
    136         self.addNPCs(cur_handler.npcs) 
    137         self.addObjects(cur_handler.objects) 
    138         self.addDoors(cur_handler.doors) 
    139127        self.addGameObjs(other_handler.local_info) 
    140128        return True 
     
    145133           @param objList: a list of the objects found in the xml file 
    146134           @return: None""" 
    147         for obj in objList: 
    148             self.view.addObject(obj.X, obj.Y, obj.gfx['map'], obj.ID) 
     135 
     136        self.addPC(*[obj for obj in objList if obj.trueAttr("PC")]) 
     137        self.addNPCs([obj for obj in objList if obj.trueAttr("NPC")]) 
     138        self.addObjects([obj for obj in objList if (not obj.trueAttr("PC") and not obj.trueAttr("NPC"))]) 
    149139 
    150140    def addPC(self,pc): 
     
    153143           @param pc: List of data for PC attributes 
    154144           @return: None""" 
     145        # add to view data     
     146        self.view.addObject(pc.X, pc.X, pc.gfx, pc.ID) 
     147         
    155148        # sync with game data 
    156         if self.gameState.PC: 
    157             # use existing position 
    158             posx = self.gameState.PC.posx 
    159             posy = self.gameState.PC.posy 
    160         else: 
    161             posx = pc[0] 
    162             posy = pc[1] 
    163             # save the new PC to the game data 
    164             self.gameState.PC = HeroData("PC", posx, posy, "PC", self.gameState.currentMap) 
    165         # add to game data     
    166         self.view.addObject(float(posx), float(posy),"PC","PC") 
    167          # create the PC agent 
    168         self.PC = Hero("PC", self.view.agent_layer, self) 
    169         self.PC.start() 
    170         self.view.addPC(self.PC.agent) 
     149        if not self.gameState.PC: 
     150            self.gameState.PC = pc 
     151             
     152        self.gameState.PC.setup() 
     153        self.view.addPC(self.gameState.PC.behaviour.agent) 
     154             
     155        # create the PC agent 
     156        self.gameState.PC.start() 
    171157 
    172158    def addObjects(self,objects): 
     
    178164        for i in objects: 
    179165            # already in game data? 
    180             ref = self.gameState.getObjectById(i.id) 
     166            ref = self.gameState.getObjectById(i.ID) 
    181167            if ref is None: 
    182168                # no, add it to the game state 
    183169                i.map_id = self.gameState.currentMap 
    184                 self.gameState.objects[i.id] = i 
     170                self.gameState.objects[i.ID] = i 
    185171            else: 
    186172                # yes, use the current game state data 
    187                 i.posx = ref.posx 
    188                 i.posy = ref.posy 
     173                i.X = ref.X 
     174                i.Y = ref.Y 
    189175                i.gfx = ref.gfx         
    190             # is it visible? 
    191             if i.display: 
    192                 self.view.addObject(i.posx, i.posy, i.gfx, i.id) 
     176             
     177            self.view.addObject(i.X, i.Y, i.gfx, i.ID) 
    193178 
    194179    def addNPCs(self,npcs): 
     
    199184        for i in npcs: 
    200185            # already in the game data? 
    201             ref = self.gameState.getObjectById(i.id)  
     186            ref = self.gameState.getObjectById(i.ID)  
    202187            if ref is None: 
    203188                # no, add it to the game state 
    204189                i.map_id = self.gameState.currentMap 
    205                 self.gameState.objects[i.id] = i 
     190                self.gameState.objects[i.ID] = i 
    206191            else: 
    207192                # yes, use the current game state data 
    208                 i.posx = ref.posx 
    209                 i.posy = ref.posy 
    210                 i.gfx = ref.gfx               
     193                i.X = ref.X 
     194                i.Y = ref.Y 
     195                i.gfx = ref.gfx   
     196                 
    211197            # add it to the view 
    212             self.view.addObject(i.posx, i.posy, i.gfx, i.id)           
     198            self.view.addObject(i.X, i.Y, i.gfx, i.ID)           
     199             
    213200            # create the agent 
    214             self.npcs.append(NPC(i.text, str(i.id), self.view.agent_layer)) 
    215             self.npcs[-1].start() 
     201            i.setup() 
     202             
     203            # create the PC agent 
     204            i.start() 
    216205 
    217206    def addDoors(self, doors): 
     
    232221           @return: Status of result (True/False)""" 
    233222        for i in self.gameState.getObjectsFromMap(self.gameState.currentMap): 
    234             if i.display and (i.id == ident): 
     223            if (i.ID == ident): 
    235224                # we found a match 
    236225                return i          
     
    246235        actions=[] 
    247236        # note: ALWAYS check NPC's first! 
    248         for i in self.gameState.getObjectsFromMap(self.gameState.currentMap): 
    249             if(obj_id == i.id): 
    250                 if isinstance(i, NpcData): 
    251                     # keep it simple for now, None to be replaced by callbacks 
    252                     actions.append(["Talk", "Talk", self.initTalk, i]) 
    253                     actions.append(["Attack", "Attack", self.nullFunc, i])  
    254                 elif isinstance(i, DoorData): 
    255                     actions.append(["Change Map", "Change Map", \ 
    256                             self.PC.approachDoor, [i.posx, i.posy], \ 
    257                             self.doors[str(i.id)].map, [i.destx, i.desty]]) 
    258                 elif isinstance(i, NonLivingObjectData): 
    259                     actions.append(["Examine", "Examine", self.nullFunc, i]) 
    260                     # is it a container? 
    261                     if(i.container == True): 
    262                         actions.append(["Open", "Open", self.PC.approachBox, [i.posx, i.posy]]) 
    263                     # can you pick it up? 
    264                     if(i.carryable == True): 
    265                         actions.append(["Pick Up", "Pick Up", self.nullFunc, i])        
     237        obj = self.gameState.getObjectById(obj_id) 
     238         
     239        if obj: 
     240            if obj.trueAttr("NPC"): 
     241                # keep it simple for now, None to be replaced by callbacks 
     242                actions.append(["Talk", "Talk", self.initTalk, obj]) 
     243                actions.append(["Attack", "Attack", self.nullFunc, obj])  
     244            elif obj.trueAttr("Door"): 
     245                #actions.append(["Change Map", "Change Map", \ 
     246                #       self.gameState.PC.approachDoor, [obj.X, obj.Y], \ 
     247                #        self.doors[str(i.ID)].map, [i.destx, i.desty]]) 
     248                pass 
     249            else: 
     250                actions.append(["Examine", "Examine", self.nullFunc, obj]) 
     251                # is it a container? 
     252                if obj.trueAttr("container"): 
     253                    actions.append(["Open", "Open", self.gameState.PC.approachBox, [obj.X, obj.Y]]) 
     254                # can you pick it up? 
     255                if obj.trueAttr("carryable"): 
     256                    actions.append(["Pick Up", "Pick Up", self.nullFunc, obj])        
     257                     
    266258        return actions 
    267259     
     
    274266        # TODO: work more on this when we get NPCData and HeroData straightened 
    275267        # out 
    276         for npc in self.gameState.npcs: 
    277             if str(npcInfo.id) == npc.id: 
    278                 npc.talk() 
    279                 break 
    280         self.PC.approachNPC(npc.getLocation()) 
     268        npc = self.gameState.getObjectById(npcInfo.ID) 
     269        if npc: 
     270            npc.talk() 
     271        self.gameState.PC.approachNPC(npc.getLocation()) 
    281272 
    282273    def loadMap(self, map_file): 
     
    297288           @param position: Screen position of click 
    298289           @return: None""" 
    299         self.PC.run(position) 
     290        self.gameState.PC.run(position) 
    300291         
    301292    def changeMap(self, map, targetPosition): 
  • trunk/PARPG/scripts/objectLoader.py

    r186 r187  
    5959           @return: None""" 
    6060        # For now, only looking for game_obj things 
    61         if name == "game_obj": 
     61        if str(name) == "object": 
    6262            obj_info = dict(attrs.items()) 
    6363            # we need to convert all the unicode strings to ascii strings 
     
    7575        try: 
    7676            obj_type = info.pop('type') 
    77             ID = info.pop('ID') 
     77            ID = info.pop('id') 
    7878        except KeyError: 
    7979            sys.stderr.write("Error: Game object missing type or id.") 
     
    8383        # the object we are constructing. If it is not needed, it will be  
    8484        # ignored 
    85         info['agent_layer'] = str(self.agent_layer) 
     85        info['agent_layer'] = self.agent_layer 
    8686 
    8787        all_types = getAllObjects() 
  • trunk/PARPG/scripts/objects/__init__.py

    r176 r187  
    1616#   along with PARPG.  If not, see <http://www.gnu.org/licenses/>. 
    1717import containers 
     18import actors 
    1819 
    19 object_modules = [containers,] 
     20object_modules = [containers, actors,] 
    2021 
    2122def getAllObjects (): 
  • trunk/PARPG/scripts/objects/base.py

    r180 r187  
    5151           super(TinCan,self).__init__ (*args, **kwargs) 
    5252           self.name = 'Tin Can'""" 
     53import fife 
     54from settings import Setting 
     55from random import randrange 
    5356 
    5457class GameObject (object): 
  • trunk/PARPG/scripts/objects/composed.py

    r180 r187  
    2626        super(ImmovableContainer,self).__init__ (*args, **kwargs) 
    2727        self.blocking = True 
    28  
  • trunk/PARPG/scripts/objects/containers.py

    r180 r187  
    2525class WoodenCrate (composed.ImmovableContainer): 
    2626    def __init__ (self, ID, name = 'Wooden Crate', \ 
    27             text = 'A battered crate', gfx = {'map': 'crate'}, **kwargs): 
     27            text = 'A battered crate', gfx = 'crate', **kwargs): 
    2828        super(WoodenCrate,self).__init__ (ID, name = name, gfx = gfx, \ 
    2929                text = text, **kwargs) 
  • trunk/PARPG/scripts/world.py

    r185 r187  
    3030from scripts.context_menu import ContextMenu 
    3131from pychan.tools import callbackWithArguments as cbwa 
    32 from engine import MapDoor 
     32from gamedata import MapDoor 
    3333 
    3434TDS = Setting() 
     
    316316        """ 
    317317        self.context_menu.hide() 
    318         self.data.PC.run(click) 
     318        self.data.gameState.PC.run(click) 
    319319 
    320320    def mouseMoved(self, evt): 
Note: See TracChangeset for help on using the changeset viewer.