Ignore:
Timestamp:
07/09/09 23:19:35 (10 years ago)
Author:
tZee_parpg
Message:
  • changed objectLoader to do only what it is supposed to do
  • thus the engine can now add FIFE related references in an intermediate step to the object creation
  • which happens in the factory method, which is now located in scripts/objects/init
  • disregard the save/load mess for now
  • deleted some obsolete stuff
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/PARPG/scripts/engine.py

    r189 r198  
    1818# there should be NO references to FIFE here! 
    1919import pickle, sys 
    20 from agents.hero import Hero 
    21 from agents.npc import NPC 
    22 from saver import Saver 
    2320from gamestate import GameState 
    2421from objects import * 
     
    5047        # a World object (the fife stuff, essentially) 
    5148        self.view = view 
    52         self.doors = {} 
    53         self.npcs = [] 
    54         self.PC = None 
    5549        self.mapchange = False 
    5650        self.gameState = GameState() 
     
    6054           other maps hanging around. 
    6155           @return: None""" 
    62         self.PC = None 
    63         self.npcs = [] 
    64         self.doors = {} 
    6556 
    6657    def save(self, path, filename): 
     
    6960           @param filename: the name of the file to write to 
    7061           @return: None""" 
    71         self.updateGameState() 
    7262        fname = '/'.join([path,filename]) 
    7363        try: 
     
    7666            sys.stderr.write("Error: Can't find save game: " + fname + "\n") 
    7767            return 
     68         
     69        # can't pickle SwigPyObjects 
     70        behaviours = {} 
     71        behaviours[self.gameState.PC.ID] = self.gameState.PC.behaviour; 
     72        self.gameState.PC.behaviour = None; 
     73         
     74        npcs = [npc for npc in self.gameState.objects.values() if npc.trueAttr("NPC")] 
     75        for npc in npcs: 
     76            behaviours[npc.ID] = npc.behaviour; 
     77            npc.behaviour = None; 
     78         
    7879        pickle.dump(self.gameState, f) 
    7980        f.close() 
     81         
     82        # restore behaviours 
     83        for npc in npcs: 
     84            npc.behaviour = behaviours[npc.ID]; 
     85        self.gameState.PC.behaviour = behaviours[self.gameState.PC.ID] 
    8086 
    8187    def load(self, path, filename): 
     
    94100        if self.gameState.currentMap: 
    95101            self.loadMap(self.gameState.currentMap) 
    96              
    97     def updateGameState(self): 
    98         """Stores the current pc and npcs positons in the game state.""" 
    99         # save the PC position 
    100         self.gameState.PC.posx = self.PC.getX() 
    101         self.gameState.PC.posy = self.PC.getY() 
    102         #save npc positions 
    103         for i in self.npcs: 
    104             if str(i.id) in self.gameState.objects: 
    105                 self.gameState.getObjectById(str(i.id)).posx = i.getX() 
    106                 self.gameState.getObjectById(str(i.id)).posy = i.getY() 
    107102 
    108103    def loadObjects(self, filename): 
     
    120115        # now open and read the XML file 
    121116        other_handler = ObjectXMLParser() 
    122         other_handler.getObjects(objects_file, self.view.agent_layer) 
     117        other_handler.getObjects(objects_file) 
    123118        objects_file.close() 
    124119             
    125120        # now add to the map and the engine 
    126         self.addGameObjs(other_handler.local_info) 
     121        self.createGameObjects(other_handler.local_info) 
    127122        return True 
    128123 
    129     def addGameObjs(self, objList): 
     124    def createGameObjects(self, objList): 
    130125        """Add all found game objects to the world 
    131126           @type objList: list 
    132127           @param objList: a list of the objects found in the xml file 
    133128           @return: None""" 
    134  
    135         self.addPC(*[obj for obj in objList if obj.trueAttr("PC")]) 
    136         self.addNPCs([obj for obj in objList if obj.trueAttr("NPC")]) 
    137         self.addObjects([obj for obj in objList if (not obj.trueAttr("PC") and not obj.trueAttr("NPC"))]) 
     129         
     130        # create the extra data 
     131        extra = {} 
     132        extra['agent_layer'] = self.view.agent_layer 
     133        extra['engine'] = self 
     134         
     135        # create the objects 
     136        for info in objList: 
     137            obj = createObject(info, extra) 
     138            if obj.trueAttr("PC"): 
     139                self.addPC(obj) 
     140            else: 
     141                self.addObject(obj) 
    138142 
    139143    def addPC(self,pc): 
     
    155159        self.gameState.PC.start() 
    156160 
    157     def addObjects(self,objects): 
    158         """Add all of the objects we found into the fife map 
    159            and into our class. An NPC is just an object to FIFE 
    160            @type objects: list 
    161            @param objects: List of objects to add 
    162            @return: None""" 
    163         for i in objects: 
    164             # already in game data? 
    165             ref = self.gameState.getObjectById(i.ID) 
    166             if ref is None: 
    167                 # no, add it to the game state 
    168                 i.map_id = self.gameState.currentMap 
    169                 self.gameState.objects[i.ID] = i 
    170             else: 
    171                 # yes, use the current game state data 
    172                 i.X = ref.X 
    173                 i.Y = ref.Y 
    174                 i.gfx = ref.gfx         
    175              
    176             self.view.addObject(i.X, i.Y, i.gfx, i.ID) 
    177  
    178     def addNPCs(self,npcs): 
    179         """Add all of the NPCs we found into the fife map to FIFE. 
     161    def addObject(self,obj): 
     162        """Adds an object to the game state. 
    180163           @type npcs: list 
    181164           @param npcs: List of NPC's to add 
    182165           @return: None""" 
    183         for i in npcs: 
    184             # already in the game data? 
    185             ref = self.gameState.getObjectById(i.ID)  
    186             if ref is None: 
    187                 # no, add it to the game state 
    188                 i.map_id = self.gameState.currentMap 
    189                 self.gameState.objects[i.ID] = i 
    190             else: 
    191                 # yes, use the current game state data 
    192                 i.X = ref.X 
    193                 i.Y = ref.Y 
    194                 i.gfx = ref.gfx   
    195                  
    196             # add it to the view 
    197             self.view.addObject(i.X, i.Y, i.gfx, i.ID)           
    198              
     166         
     167        ref = self.gameState.getObjectById(obj.ID)  
     168        if ref is None: 
     169            # no, add it to the game state 
     170            obj.map_id = self.gameState.currentMap 
     171            self.gameState.objects[obj.ID] = obj 
     172        else: 
     173            # yes, use the current game state data 
     174            obj.X = ref.X 
     175            obj.Y = ref.Y 
     176            obj.gfx = ref.gfx   
     177             
     178        # add it to the view 
     179        self.view.addObject(obj.X, obj.Y, obj.gfx, obj.ID)           
     180         
     181        if obj.trueAttr("NPC"): 
    199182            # create the agent 
    200             i.setup() 
     183            obj.setup() 
    201184             
    202185            # create the PC agent 
    203             i.start() 
     186            obj.start() 
    204187 
    205188    def addDoors(self, doors): 
Note: See TracChangeset for help on using the changeset viewer.