comparison gamelib/savegame.py @ 496:bf90a2948e34

Basic snapshot support in save games added.
author Simon Cross <hodgestar@gmail.com>
date Wed, 25 Nov 2009 23:15:56 +0000
parents 75ef6ea3b7a6
children c2a4e3a24e9a
comparison
equal deleted inserted replaced
495:d2ca4af92c79 496:bf90a2948e34
1 """Utilities and widgets for saving and restoring games.""" 1 """Utilities and widgets for saving and restoring games."""
2 2
3 import xmlrpclib 3 import xmlrpclib
4 import os 4 import os
5 import StringIO
6 import base64
5 7
6 from pgu import gui 8 from pgu import gui
9 import pygame
7 10
8 import config 11 import config
9 import version 12 import version
10 13
11 def open_save_game(fullpath): 14 def open_save_game(fullpath):
17 raise SaveGameError("File does not appear to be a " 20 raise SaveGameError("File does not appear to be a "
18 "Fox Assault save game.") 21 "Fox Assault save game.")
19 save_version = params[0] 22 save_version = params[0]
20 if save_version != version.SAVE_GAME_VERSION: 23 if save_version != version.SAVE_GAME_VERSION:
21 raise SaveGameError("Incompatible save game version.") 24 raise SaveGameError("Incompatible save game version.")
25
22 data = params[1] 26 data = params[1]
27
28 try:
29 snapshot = decode_snapshot(params[2])
30 except Exception, e:
31 snapshot = None
32
23 except Exception, e: 33 except Exception, e:
24 raise SaveGameError("Failed to load game: %s" % (e,)) 34 raise SaveGameError("Failed to load game: %s" % (e,))
25 35
26 return data, None 36 return data, snapshot
37
38 def encode_snapshot(snapshot):
39 """Encode a snapshot."""
40 snapshot_file = StringIO.StringIO()
41 pygame.image.save(snapshot, snapshot_file)
42 data = snapshot_file.getvalue()
43 data = base64.standard_b64encode(data)
44 return data
45
46 def decode_snapshot(data):
47 """Decode a snapshot."""
48 data = base64.standard_b64decode(data)
49 snapshot_file = StringIO.StringIO(data)
50 snapshot = pygame.image.load(snapshot_file, "snapshot.tga")
51 return snapshot
27 52
28 53
29 class SaveGameError(Exception): 54 class SaveGameError(Exception):
30 pass 55 pass
31 56
147 172
148 def _save(self, gameboard): 173 def _save(self, gameboard):
149 filename = self.get_fullpath() 174 filename = self.get_fullpath()
150 if filename is None: 175 if filename is None:
151 return 176 return
177
152 data = gameboard.save_game() 178 data = gameboard.save_game()
153 params = (version.SAVE_GAME_VERSION, data) 179
180 snapshot = gameboard.snapshot()
181 snapshot_data = encode_snapshot(snapshot)
182
183 params = (version.SAVE_GAME_VERSION, data, snapshot_data)
154 xml = xmlrpclib.dumps(params, "foxassault") 184 xml = xmlrpclib.dumps(params, "foxassault")
155 try: 185 try:
156 open(filename, "wb").write(xml) 186 open(filename, "wb").write(xml)
157 except Exception, e: 187 except Exception, e:
158 print "Failed to save game: %s" % (e,) 188 print "Failed to save game: %s" % (e,)