Mercurial > rinkhals
comparison gamelib/savegame.py @ 509:77a3f7f1c856
Add level name and timestamp to save games.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Thu, 26 Nov 2009 23:02:10 +0000 |
parents | c2a4e3a24e9a |
children | 3e4bb2c9556c |
comparison
equal
deleted
inserted
replaced
508:8fbff3505d1d | 509:77a3f7f1c856 |
---|---|
3 import xmlrpclib | 3 import xmlrpclib |
4 import os | 4 import os |
5 import StringIO | 5 import StringIO |
6 import base64 | 6 import base64 |
7 import zlib | 7 import zlib |
8 import datetime | |
8 | 9 |
9 from pgu import gui | 10 from pgu import gui |
10 import pygame | 11 import pygame |
11 | 12 |
12 import config | 13 import config |
13 import version | 14 import version |
15 | |
16 TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S" | |
14 | 17 |
15 def read_savegame(fullpath): | 18 def read_savegame(fullpath): |
16 """Open a save game file.""" | 19 """Open a save game file.""" |
17 try: | 20 try: |
18 xml = zlib.decompress(open(fullpath, "rb").read()) | 21 xml = zlib.decompress(open(fullpath, "rb").read()) |
29 try: | 32 try: |
30 snapshot = decode_snapshot(params[2]) | 33 snapshot = decode_snapshot(params[2]) |
31 except Exception, e: | 34 except Exception, e: |
32 snapshot = None | 35 snapshot = None |
33 | 36 |
37 try: | |
38 level_name = params[3] | |
39 except Exception, e: | |
40 level_name = None | |
41 | |
42 try: | |
43 timestamp = datetime.datetime.strptime(params[4], TIMESTAMP_FORMAT) | |
44 except Exception, e: | |
45 timestamp = None | |
46 | |
34 except Exception, e: | 47 except Exception, e: |
35 raise SaveGameError("Failed to load game: %s" % (e,)) | 48 raise SaveGameError("Failed to load game: %s" % (e,)) |
36 | 49 |
37 return data, snapshot | 50 return data, snapshot, level_name, timestamp |
38 | 51 |
39 def write_savegame(fullpath, data, snapshot): | 52 def write_savegame(fullpath, data, snapshot, level_name, timestamp): |
40 """Write a save game file.""" | 53 """Write a save game file.""" |
41 try: | 54 try: |
42 snapshot_data = encode_snapshot(snapshot) | 55 snapshot_data = encode_snapshot(snapshot) |
43 params = (version.SAVE_GAME_VERSION, data, snapshot_data) | 56 timestamp_str = timestamp.strftime(TIMESTAMP_FORMAT) |
57 params = (version.SAVE_GAME_VERSION, data, snapshot_data, level_name, timestamp_str) | |
44 xml = xmlrpclib.dumps(params, "foxassault") | 58 xml = xmlrpclib.dumps(params, "foxassault") |
45 open(fullpath, "wb").write(zlib.compress(xml)) | 59 open(fullpath, "wb").write(zlib.compress(xml)) |
46 except Exception, e: | 60 except Exception, e: |
47 raise SaveGameError("Failed to save game: %s" % (e,)) | 61 raise SaveGameError("Failed to save game: %s" % (e,)) |
48 | 62 |
66 pass | 80 pass |
67 | 81 |
68 | 82 |
69 class BaseSaveRestoreDialog(gui.Dialog): | 83 class BaseSaveRestoreDialog(gui.Dialog): |
70 """Save game dialog.""" | 84 """Save game dialog.""" |
85 | |
86 TIMESTAMP_DISPLAY = "%H:%M, %d %b %Y" | |
71 | 87 |
72 def __init__(self, title_txt, button_txt, allow_new, cls="dialog"): | 88 def __init__(self, title_txt, button_txt, allow_new, cls="dialog"): |
73 self.value = None | 89 self.value = None |
74 self.save_folder = config.config.save_folder | 90 self.save_folder = config.config.save_folder |
75 | 91 |
138 self.save_games[root] = self._create_image_widget(fullpath) | 154 self.save_games[root] = self._create_image_widget(fullpath) |
139 | 155 |
140 def _create_image_widget(self, fullpath): | 156 def _create_image_widget(self, fullpath): |
141 """Create an image showing the contents of a save game file.""" | 157 """Create an image showing the contents of a save game file.""" |
142 try: | 158 try: |
143 data, screenshot = read_savegame(fullpath) | 159 data, screenshot, level_name, timestamp = read_savegame(fullpath) |
144 except SaveGameError: | 160 except SaveGameError: |
145 return gui.Label("Bad Save Game") | 161 return gui.Label("Bad Save Game") |
146 | 162 |
163 tbl = gui.Table() | |
164 | |
165 tbl.tr() | |
147 if screenshot is None: | 166 if screenshot is None: |
148 return gui.Label("No screenshot") | 167 tbl.td(gui.Label("No screenshot")) |
149 | 168 else: |
150 return gui.Image(screenshot) | 169 tbl.td(gui.Image(screenshot)) |
170 | |
171 tbl.tr() | |
172 if level_name is None: | |
173 tbl.td(gui.Label("Level: ???")) | |
174 else: | |
175 tbl.td(gui.Label("Level: %s" % (level_name,))) | |
176 | |
177 if timestamp is not None: | |
178 tbl.tr() | |
179 tbl.td(gui.Label(timestamp.strftime(self.TIMESTAMP_DISPLAY))) | |
180 | |
181 return tbl | |
151 | 182 |
152 def _save_list_change(self): | 183 def _save_list_change(self): |
153 if self.name_input: | 184 if self.name_input: |
154 self.name_input.value = self.save_list.value | 185 self.name_input.value = self.save_list.value |
155 | 186 |
186 if filename is None: | 217 if filename is None: |
187 return | 218 return |
188 | 219 |
189 data = gameboard.save_game() | 220 data = gameboard.save_game() |
190 snapshot = gameboard.snapshot() | 221 snapshot = gameboard.snapshot() |
191 | 222 level_name = gameboard.level.level_name |
192 try: | 223 timestamp = datetime.datetime.now() |
193 write_savegame(filename, data, snapshot) | 224 |
225 try: | |
226 write_savegame(filename, data, snapshot, level_name, timestamp) | |
194 except Exception, e: | 227 except Exception, e: |
195 print "Failed to save game: %s" % (e,) | 228 print "Failed to save game: %s" % (e,) |
196 | 229 |
197 | 230 |
198 class RestoreDialog(BaseSaveRestoreDialog): | 231 class RestoreDialog(BaseSaveRestoreDialog): |
206 filename = self.get_fullpath() | 239 filename = self.get_fullpath() |
207 if filename is None: | 240 if filename is None: |
208 return | 241 return |
209 | 242 |
210 try: | 243 try: |
211 data, screenshot = read_savegame(filename) | 244 data, screenshot, level_name, timestamp = read_savegame(filename) |
212 except Exception, e: | 245 except Exception, e: |
213 print "Failed to load game: %s" % (e,) | 246 print "Failed to load game: %s" % (e,) |
214 return | 247 return |
215 | 248 |
216 gameboard.restore_game(data) | 249 gameboard.restore_game(data) |