[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Implementing save feature



Hi Tommy,

here is how I did it. (I'm making an point-and-click-adventure myself with py-thon & -game, too.)

In my game there are just scenes and actors. Allmost all of the data is in the actors, even the cutscenes. So I (more or less) only save the actors with PICKLE.

I'd like to rewrite it someday and try YAML, because a human readable savegame is much help during development.

**Olaf

from inventory import inventory
import pickle
 
class Game:
   
    def __init__(self):
        self.actors = {}
        self.scene_transition = False
        self.hidden_inventory = False
   
    def setup(self, stage, cast):
        self.inventory = inventory
        self.stage = stage
        self.cast = cast
        self.player = self.cast[Player_ID]
        self.load_dialogs(Language_ID)
        set_scene(Start_Scene_ID)
 
   
    def save(self):
        filter = [
            '_Sprite__g',
            'rect',
            'act_pos',
            'behaviors',
            'image',
            'image_path',
            'images',
            'path',
            'sequences',
            'animation',
            'uid']
        savedata = {}
        savedata['current_scene'] = self.scene.uid
        savedata['hidden_inventory'] = self.hidden_inventory
        savedata['inventory'] = []
        for item in self.inventory.items:
            savedata['inventory'].append(item.uid)
        savedata['actors'] = {}
        for actor in (self.actors.values()):
            savedata['actors'][actor.uid] = {}
            for var in vars(actor):
                if not var in filter:
                    savedata['actors'][actor.uid][var] = actor.__dict__[var]
        savedata['scene_walkmaps'] = {}
        for scene in self.stage.values():
            savedata['scene_walkmaps'][scene.uid] = scene.walkmap.name
        savegame = open('savegame.txt', 'w')
        translator = pickle.Pickler(savegame)
        translator.dump(savedata)
        savegame.close()
   
    def load(self):
        savegame = open('savegame.txt', 'r')
        translator = pickle.Unpickler(savegame)
        savedata = translator.load()
        savegame.close()
        for actor in savedata['actors']:
            if actor in self.actors:
                for var in savedata['actors'][actor]:
                    if not var in filter:
                        self.actors[actor].__dict__[var] = savedata['actors'][actor][var]
                self.actors[actor].set_image(savedata['actors'][actor]['image_id'])
        self.inventory.clear()
        for item in savedata['inventory']:
            self.inventory.add(get_actor(item))
        for scene_id in savedata['scene_walkmaps']:
            set_walkmap(scene_id, savedata['scene_walkmaps'][scene_id])
        self.hidden_inventory = savedata['hidden_inventory']
        set_scene(savedata['current_scene'])


On Fri, May 22, 2009 at 11:23 PM, Nevon <mgodnevon@xxxxxxxxx> wrote:
I'm currently part of a group developing a FOSS point-and-click
adventure game using Python and Pygame. The game engine is actually a
fork of the engine used in the game Colonel Wiljafjord and the
Tarbukas Tyranny, and entry in Pyweek #3. Right now we're working on
improving the engine in whatever way we can. If you're interested, the
source is available here: http://github.com/kallepersson/subterranean/tree/master.

So now I'd like to implement a save/load feature, but I don't really
know where to start. I have no idea how game save systems are usually
constructed, so I'm kind of lost. If anyone has any ideas, links to
resources, or pointers on how to best do this, please share.

Thank you!

Tommy Brunn
http://www.blastfromthepast.se/blabbermouth