Mercurial > rinkhals
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,) |