Ticket #200: SaveLoad.patch

File SaveLoad.patch, 6.9 KB (added by beliar, 9 years ago)
  • scripts/engine.py

     
    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 
     61        # save the PC coordinates 
    6262        coords = self.game_state.PC.behaviour.agent.getLocation().\ 
    6363                    getMapCoordinates() 
    6464        self.game_state.saved_pc_coordinates = (coords.x, coords.y) 
    6565         
    66         # can't pickle SwigPyObjects 
    67         behaviours = {} 
    68         behaviour_player = self.game_state.PC.behaviour 
    69         self.game_state.PC.behaviour = None 
    70          
    71         # Backup the behaviours  
    72         for map_id in self.game_state.objects: 
    73             behaviours[map_id] = {} 
    74             for (object_id, npc) in self.game_state.objects[map_id].items(): 
    75                 if npc.trueAttr("NPC"): 
    76                     behaviours[map_id][object_id] = npc.behaviour 
    77                     npc.behaviour = None 
    78          
    7966        # Pickle it  
    8067        pickle.dump(self.game_state, f) 
    81         f.close() 
    82          
    83         # Restore behaviours 
    84         for map_id in behaviours: 
    85             for (object_id, behaviour) in behaviours[map_id].items(): 
    86                 self.game_state.objects[map_id][object_id].behaviour = \ 
    87                     behaviours[map_id][object_id] 
    88                  
    89         self.game_state.PC.behaviour = behaviour_player 
     68        f.close()        
    9069 
    9170    def load(self, path, filename): 
    9271        """Loads a saver from a file. 
     
    11190        # Recreate all the behaviours. These can't be saved because FIFE 
    11291        # objects cannot be pickled 
    11392        for map_id in self.game_state.objects: 
    114             for (object_id, npc) in self.game_state.objects[map_id].items(): 
    115                 if npc.trueAttr("NPC"): 
    116                     npc.createBehaviour(self.view.active_map.agent_layer) 
     93            for (object_id, obj) in self.game_state.objects[map_id].items(): 
     94                if obj.trueAttr("NPC") or obj.trueAttr("AnimatedContainer"): 
     95                    obj.createBehaviour(self.view.active_map.agent_layer) 
    11796 
    11897        # Fix the player behaviour 
    11998        self.game_state.PC.createBehaviour(self.view.active_map.agent_layer) 
     
    193172            obj.setup() 
    194173            # create the PC agent 
    195174            obj.start() 
     175        if obj.trueAttr("AnimatedContainer"): 
     176            # create the agent 
     177            obj.setup() 
    196178 
    197179    def objectActive(self, ident): 
    198180        """Given the objects ID, pass back the object if it is active, 
  • scripts/objects/actors.py

     
    126126        self.layer_id = agent_layer.getId() 
    127127        self.createBehaviour(agent_layer) 
    128128     
     129    def __getstate__(self): 
     130        odict = self.__dict__.copy() 
     131        del odict["behaviour"] 
     132        return odict; 
     133     
     134    def __setstate__(self, state): 
     135        self.__dict__.update(state) 
     136     
    129137    def meet(self, npc): 
    130138        """Record that the PC has met a certain NPC 
    131139           @type npc: str 
     
    280288        self.createBehaviour(agent_layer)         
    281289        self.dialogue = kwargs.get('dialogue') 
    282290 
     291    def __getstate__(self): 
     292        odict = self.__dict__.copy() 
     293        del odict["behaviour"] 
     294        return odict; 
     295     
     296    def __setstate__(self, state): 
     297        self.__dict__.update(state)         
     298 
    283299    def createBehaviour(self, layer): 
    284300        """Creates the behaviour for this actor. 
    285301           @return None """ 
  • scripts/objects/containers.py

     
    3434                text = text, **kwargs) 
    3535        self.placeItem(CarryableItem(ID=987,name="Dagger456")) 
    3636         
    37 class Footlocker(ImmovableContainer, fife.InstanceActionListener): 
    38     def __init__ (self, ID, agent_layer=None, name = 'Footlocker', 
    39                   text = 'A Footlocker', gfx = 'lock_box_metal01', **kwargs): 
    40         ImmovableContainer.__init__(self, ID = ID, name = name, gfx = gfx, 
    41                                     text = text, **kwargs) 
    42         self.placeItem(CarryableItem(ID=987,name="Dagger456")) 
    43  
     37class ContainerBehaviour(fife.InstanceActionListener): 
     38    def __init__(self, parent = None, agent_layer = None): 
    4439        fife.InstanceActionListener.__init__(self) 
     40        self.parent = parent 
    4541        self.layer = agent_layer 
    46         self.agent = self.layer.getInstance(self.ID) 
     42        self.state = _AGENT_STATE_CLOSED 
     43        self.agent = None 
     44 
     45    def attachToLayer(self, agent_ID): 
     46        """ Attaches to a certain layer 
     47            @type agent_ID: String 
     48            @param agent_ID: ID of the layer to attach to. 
     49            @return: None 
     50        """ 
     51        self.agent = self.layer.getInstance(agent_ID) 
    4752        self.agent.addActionListener(self) 
    4853        self.state = _AGENT_STATE_CLOSED 
    4954        self.agent.act('closed', self.agent.getLocation()) 
     
    6570            self.state = _AGENT_STATE_CLOSED 
    6671         
    6772    def open (self): 
    68         super (Footlocker,self).open() 
    6973        if self.state != _AGENT_STATE_OPENED and self.state != _AGENT_STATE_OPENING: 
    7074            self.agent.act('open', self.agent.getLocation()) 
    7175            self.state = _AGENT_STATE_OPENING 
    7276 
    7377    def close(self): 
    74         super (Footlocker,self).close() 
    7578        if self.state != _AGENT_STATE_CLOSED and self.state != _AGENT_STATE_CLOSING: 
    7679            self.agent.act('close', self.agent.getLocation()) 
    77             self.state = _AGENT_STATE_CLOSING 
     80            self.state = _AGENT_STATE_CLOSING   
     81     
     82class Footlocker(ImmovableContainer): 
     83    def __init__ (self, ID, agent_layer=None, name = 'Footlocker', 
     84                  text = 'A Footlocker', gfx = 'lock_box_metal01', **kwargs): 
     85        ImmovableContainer.__init__(self, ID = ID, name = name, gfx = gfx, 
     86                                    text = text, **kwargs) 
     87        self.placeItem(CarryableItem(ID=987,name="Dagger456")) 
     88 
     89        self.is_AnimatedContainer = True 
     90        self.createBehaviour(agent_layer)         
     91         
     92    def __getstate__(self): 
     93        odict = self.__dict__.copy() 
     94        del odict["behaviour"] 
     95        return odict; 
     96     
     97    def __setstate__(self, state): 
     98        self.__dict__.update(state) 
     99     
     100    def createBehaviour(self, layer): 
     101        self.behaviour = ContainerBehaviour(self, layer) 
     102 
     103    def setup(self): 
     104        """@return: None""" 
     105        self.behaviour.attachToLayer(self.ID) 
     106 
     107    def open (self): 
     108        super (Footlocker,self).open() 
     109        self.behaviour.open() 
     110 
     111    def close(self): 
     112        super (Footlocker,self).close() 
     113        self.behaviour.close()