Ticket #73: save_load.patch

File save_load.patch, 11.0 KB (added by kaydeth_parpg, 10 years ago)

current state of work. Just posting it here so I can transfer it home.

  • scripts/objects/actors.py

     
    6767        self.idle_counter = 1 
    6868        self.speed = float(TDS.readSetting("PCSpeed")) # TODO: rework/improve 
    6969        self.nextAction = None 
     70        self.agent = None 
    7071         
    7172    def onInstanceActionFinished(self, instance, action): 
    7273        """@type instance: ??? 
     
    8990    def onNewMap(self, layer): 
    9091        """Sets the agent onto the new layer. 
    9192        """ 
    92         self.agent.removeActionListener(self) 
     93        if self.agent is not None: 
     94            self.agent.removeActionListener(self) 
     95             
    9396        self.agent = layer.getInstance(self.parent.ID) 
    9497        self.agent.addActionListener(self) 
    9598        self.state = _AGENT_STATE_NONE 
  • scripts/map.py

     
    7676           @type filename: String 
    7777           @param filename: Name of map to load 
    7878           @return: None""" 
     79        print "LSDEBUG: entering Map.load()" 
    7980        self.reset() 
    8081        self.map = loadMapFile(filename, self.engine, self.data) 
    8182        self.agent_layer = self.map.getLayer('ObjectLayer') 
    82  
    83         # if this is not the very first map load in the game carry over the PC instance 
    84         if self.data.target_position: 
     83         
     84        #find out if a PC instance was created when the map was loaded 
     85        found = False 
     86        for inst in self.agent_layer.getInstances(): 
     87            if inst.getId() == "PC": 
     88                found = True 
     89                break 
     90                 
     91        #If there is not a PC instance created yet than we construct the PC 
     92        #instance from what we have saved in the PC Game Object 
     93        if not found: 
    8594            x = float(self.data.target_position[0]) 
    8695            y = float(self.data.target_position[1]) 
    8796            z = 0 
     
    8998            inst = self.agent_layer.createInstance(pc_obj,\ 
    9099                                            fife.ExactModelCoordinate(x,y,z),\ 
    91100                                            "PC") 
    92             inst.setRotation(self.data.game_state.PC.behaviour.agent.getRotation()) 
     101            #inst.setRotation(self.data.game_state.PC.behaviour.agent.getRotation()) 
    93102            fife.InstanceVisual.create(inst) 
    94  
     103        elif self.data.target_position is not None: 
     104            pos = self.data.target_position 
     105            coord = fife.DoublePoint3D(float(pos[0]), float(pos[1]), 0) 
     106            location = fife.Location(self.agent_layer) 
     107            location.setMapCoordinates(coord) 
     108            inst.setLocation(location) 
     109        #else we are loading the first map and the PC position were set by 
     110        #the coordinates in the Map file 
     111             
    95112        # it's possible there's no transition layer 
    96113        size = len('TransitionLayer') 
    97114        for layer in self.map.getLayers(): 
     
    119136                                   str(TDS.readSetting("FontGlyphs", \ 
    120137                                                       strip=False))) 
    121138        rend.changeDefaultFont(text) 
    122  
     139         
    123140        # Make World aware that this is now the active map. 
    124141        self.data.view.active_map = self 
    125142                 
  • scripts/gamestate.py

     
    2525        self.objects = {} 
    2626        self.current_map_file = None 
    2727        self.current_map_name = None 
     28        #these coordinates are only used for saving and loading the game. 
     29        #They do not represent the pc's active location 
     30        self.saved_pc_coodinates = (0,0) 
    2831         
    2932    def getObjectsFromMap(self, map_id): 
    3033        """Gets all objects that are currently on the given map. 
     
    4447            self.objects[map_id] = {} 
    4548        if obj_id in self.objects[map_id]: 
    4649            return self.objects[map_id][obj_id] 
    47  
     50         
     51 No newline at end of file 
  • scripts/filebrowser.py

     
    112112        """ File selection callback. """ 
    113113        self._widget.hide() 
    114114        selection = self._widget.collectData('fileList') 
    115         data = self._widget.collectData('saveField') 
    116115 
    117116        if self.save_file: 
     117            data = self._widget.collectData('saveField') 
    118118            if data: 
    119119                if (data.split('.')[1] == 'dat'): 
    120120                    self.file_selected(self.path, \ 
  • scripts/engine.py

     
    5353           @return: None""" 
    5454        fname = '/'.join([path, filename]) 
    5555        try: 
    56             f = open(fname, 'w') 
     56            f = open(fname, 'wb') 
    5757        except(IOError): 
    5858            sys.stderr.write("Error: Can't find save game: " + fname + "\n") 
    5959            return 
    6060         
     61        # save the PC coordinates before we destroy the behaviour 
     62        coords = self.game_state.PC.behaviour.agent.getLocation().\ 
     63                    getMapCoordinates() 
     64        self.game_state.saved_pc_coodinates = (coords.x, coords.y) 
     65        print self.game_state.saved_pc_coodinates 
     66         
    6167        # can't pickle SwigPyObjects 
    6268        behaviours = {} 
    6369        behaviour_player = self.game_state.PC.behaviour 
     
    8389                 
    8490        self.game_state.PC.behaviour = behaviour_player 
    8591 
    86     def load(self, filename): 
     92    def load(self, path, filename): 
    8793        """Loads a saver from a file. 
    8894           @type filename: string 
    8995           @param filename: the name of the file (including path) to load from 
    9096           @return: None""" 
    91          
    92         # TODO 
    93         # Remove what we are currently working with  
    94         print "TODO: load" 
    95         self.view.active_map.view.clearCameras() 
    96         self.view.active_map.model.deleteMaps() 
    97          
     97             
     98        fname = '/'.join([path, filename]) 
     99 
     100        print fname 
    98101        try: 
    99             f = open(filename, 'r') 
     102            f = open(fname, 'rb') 
    100103        except(IOError): 
    101104            sys.stderr.write("Error: Can't find save game file\n") 
    102105            return 
     106         
     107        #Remove all currently loaded maps so we can start fresh 
     108        self.view.deleteMaps(); 
     109         
    103110        self.game_state = pickle.load(f) 
    104111        f.close() 
    105112         
     113        # If the map has been loaded, we might need to add some 
     114        # agents to the PC and NPS 
     115        for map_id in self.game_state.objects: 
     116            for (object_id, npc) in self.game_state.objects[map_id].items(): 
     117                if npc.trueAttr("NPC") and npc.behaviour == None: 
     118                    npc.createBehaviour(self.view.active_map.agent_layer) 
     119 
     120        # Fix the player behaviour 
     121        if self.game_state.PC.behaviour == None: 
     122            self.game_state.PC.createBehaviour(self.view.active_map.agent_layer) 
     123         
     124        #In most maps we'll create the PC Instance internally. In these 
     125        #cases we need a target position 
     126        self.target_position = self.game_state.saved_pc_coodinates 
     127         
    106128        # Make sure we're on the right map 
    107129        if self.game_state.current_map_file: 
    108130            self.loadMap(self.game_state.current_map_name, \ 
    109131                         self.game_state.current_map_file)  
    110  
     132             
    111133    def createObject (self, layer, attributes, instance): 
    112134        """Create an object and add it to the current map. 
    113135           @type layer: fife.Layer 
     
    257279        self.game_state.current_map_name = map_name 
    258280        self.view.loadMap(map_name, str(map_file)) 
    259281 
    260         # If the map has been loaded, we might need to add some 
    261         # agents to the PC and NPS 
    262         for map_id in self.game_state.objects: 
    263             for (object_id, npc) in self.game_state.objects[map_id].items(): 
    264                 if npc.trueAttr("NPC") and npc.behaviour == None: 
    265                     npc.createBehaviour(self.view.active_map.agent_layer) 
    266  
    267         # Fix the player behaviour 
    268         if self.game_state.PC.behaviour == None: 
    269             self.game_state.PC.createBehaviour(self.view.active_map.agent_layer) 
    270  
    271282        # create the PC agent 
    272283        self.view.active_map.addPC() 
    273284        self.game_state.PC.start() 
  • scripts/world.py

     
    104104           @param filename: File which contains the map to be loaded 
    105105           @return: None""" 
    106106        if not map_name in self.maps: 
     107            print "LSDEBUG: actually loading map" 
    107108            map = Map(self.engine, self.data) 
    108109            self.maps[map_name] = map         
    109110            map.load(filename) 
    110111        else: 
     112            print "LSDEBUG: just setting active map" 
    111113            self.setActiveMap(map_name) 
    112114     
    113115    def setActiveMap(self, map_name): 
     
    247249                    # check if the object is on the foreground  
    248250                    obj_map_coords = \ 
    249251                                      obj.getLocation().getMapCoordinates() 
    250                     obj_screen_coords = self.active_map.cameras["main"]\ 
     252                    obj_screen_coords = self.active_map.cameras[self.active_map.my_cam_id]\ 
    251253                                    .toScreenCoordinates(obj_map_coords) 
    252254                     
    253255                    if obj_screen_coords.y > front_y: 
     
    278280        location = fife.Location(self.active_map.agent_layer) 
    279281        location.setMapCoordinates(coord) 
    280282        return location 
     283     
     284    def deleteMaps(self): 
     285        """Clear all currently loaded maps from FIFE as well as clear our 
     286            local map cache 
     287            @return: nothing""" 
     288        self.engine.getView().clearCameras() 
     289        self.engine.getModel().deleteMaps() 
     290        self.engine.getModel().deleteObjects() 
     291 
     292        self.maps = {} 
    281293 
    282294    def pump(self): 
    283295        """Routine called during each frame. Our main loop is in ./run.py 
  • maps/map.xml

     
    18671867                        <i o="block" r="0" x="0.0" y="-2.0" z="0.0" /> 
    18681868                        <i o="block" r="0" x="0.0" y="-3.0" z="0.0" /> 
    18691869                        <i o="block" r="0" x="-1.0" y="-3.0" z="0.0" /> 
    1870                         <i o="container_house" r="0" x="0.0" y="0.0" z="0.0" /> 
     1870                        <i gfx="container_house" id="shanty-door01" is_open="False" name="Shanty Door" o="container_house" object_type="ShantyDoor" r="0" target_map="maps/map2.xml" target_map_name="map2" target_x="10.0" target_y="10.0" text="Looks like the entrance to the building." x="-2.0" xpos="-2.0" y="6.0" ypos="6.0" z="0.0" /> 
     1871                         
    18711872                        </instances> 
    18721873        </layer> 
    18731874