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)