annotate gamelib/savegame.py @ 499:c2a4e3a24e9a

Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
author Simon Cross <hodgestar@gmail.com>
date Thu, 26 Nov 2009 00:06:59 +0000
parents bf90a2948e34
children 77a3f7f1c856
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """Utilities and widgets for saving and restoring games."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 import xmlrpclib
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4 import os
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
5 import StringIO
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
6 import base64
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
7 import zlib
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
9 from pgu import gui
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
10 import pygame
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
11
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
12 import config
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
13 import version
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
14
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
15 def read_savegame(fullpath):
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
16 """Open a save game file."""
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
17 try:
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
18 xml = zlib.decompress(open(fullpath, "rb").read())
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
19 params, methodname = xmlrpclib.loads(xml)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
20 if methodname != "foxassault":
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
21 raise SaveGameError("File does not appear to be a "
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
22 "Fox Assault save game.")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
23 save_version = params[0]
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
24 if save_version != version.SAVE_GAME_VERSION:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
25 raise SaveGameError("Incompatible save game version.")
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
26
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
27 data = params[1]
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
28
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
29 try:
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
30 snapshot = decode_snapshot(params[2])
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
31 except Exception, e:
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
32 snapshot = None
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
33
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
34 except Exception, e:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
35 raise SaveGameError("Failed to load game: %s" % (e,))
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
36
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
37 return data, snapshot
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
38
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
39 def write_savegame(fullpath, data, snapshot):
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
40 """Write a save game file."""
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
41 try:
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
42 snapshot_data = encode_snapshot(snapshot)
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
43 params = (version.SAVE_GAME_VERSION, data, snapshot_data)
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
44 xml = xmlrpclib.dumps(params, "foxassault")
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
45 open(fullpath, "wb").write(zlib.compress(xml))
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
46 except Exception, e:
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
47 raise SaveGameError("Failed to save game: %s" % (e,))
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
48
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
49 def encode_snapshot(snapshot):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
50 """Encode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
51 snapshot_file = StringIO.StringIO()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
52 pygame.image.save(snapshot, snapshot_file)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
53 data = snapshot_file.getvalue()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
54 data = base64.standard_b64encode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
55 return data
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
56
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
57 def decode_snapshot(data):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
58 """Decode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
59 data = base64.standard_b64decode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
60 snapshot_file = StringIO.StringIO(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
61 snapshot = pygame.image.load(snapshot_file, "snapshot.tga")
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
62 return snapshot
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
63
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
64
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
65 class SaveGameError(Exception):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
66 pass
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
67
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
68
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
69 class BaseSaveRestoreDialog(gui.Dialog):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
70 """Save game dialog."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
71
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
72 def __init__(self, title_txt, button_txt, allow_new, cls="dialog"):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
73 self.value = None
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
74 self.save_folder = config.config.save_folder
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
75
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
76 self.save_games = {}
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
77 self._populate_save_games()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
78
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
79 if allow_new:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
80 self.name_input = gui.Input()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
81 else:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
82 self.name_input = None
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
83
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
84 td_style = {
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
85 'padding_left': 4,
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
86 'padding_right': 4,
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
87 'padding_top': 2,
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
88 'padding_bottom': 2,
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
89 }
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
90
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91 self.save_list = gui.List(width=350, height=250)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
92 games = self.save_games.keys()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
93 games.sort()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
94 for name in games:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
95 self.save_list.add(name, value=name)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
96 self.save_list.set_vertical_scroll(0)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
97 self.save_list.connect(gui.CHANGE, self._save_list_change)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
98
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
99 self.image_container = gui.Container()
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
100
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
101 button_ok = gui.Button(button_txt)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
102 button_ok.connect(gui.CLICK, self._click_ok)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
103
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
104 button_cancel = gui.Button("Cancel")
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
105 button_cancel.connect(gui.CLICK, self._click_cancel)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
106
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
107 body = gui.Table()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
108 body.tr()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
109 body.td(self.save_list, style=td_style, colspan=2)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
110 body.td(self.image_container, style=td_style, colspan=2)
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
111 body.tr()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
112 if self.name_input:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
113 body.td(gui.Label("Save as:"), style=td_style, align=1)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
114 body.td(self.name_input, style=td_style)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
115 else:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
116 body.td(gui.Spacer(0, 0), style=td_style, colspan=2)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
117 body.td(button_ok, style=td_style, align=1)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
118 body.td(button_cancel, style=td_style, align=1)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
119
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
120 title = gui.Label(title_txt, cls=cls + ".title.label")
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
121 gui.Dialog.__init__(self, title, body)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
122
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
123 def get_fullpath(self):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
124 """Return the fullpath of the select save game file or None."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
125 if self.value is None:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
126 return None
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
127 return os.path.join(self.save_folder, self.value + ".xml")
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
128
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
129 def _populate_save_games(self):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
130 """Read list of save games."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
131 for filename in os.listdir(self.save_folder):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
132 fullpath = os.path.join(self.save_folder, filename)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
133 root, ext = os.path.splitext(filename)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
134 if not os.path.isfile(fullpath):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
135 continue
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
136 if ext != ".xml":
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
137 continue
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
138 self.save_games[root] = self._create_image_widget(fullpath)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
139
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
140 def _create_image_widget(self, fullpath):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
141 """Create an image showing the contents of a save game file."""
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
142 try:
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
143 data, screenshot = read_savegame(fullpath)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
144 except SaveGameError:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
145 return gui.Label("Bad Save Game")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
146
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
147 if screenshot is None:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
148 return gui.Label("No screenshot")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
149
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
150 return gui.Image(screenshot)
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
151
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
152 def _save_list_change(self):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
153 if self.name_input:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
154 self.name_input.value = self.save_list.value
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
155
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
156 for w in self.image_container.widgets:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
157 self.image_container.remove(w)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
158
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
159 image_widget = self.save_games[self.save_list.value]
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
160 self.image_container.add(image_widget, 0, 0)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
161
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
162 def _click_ok(self):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
163 if self.name_input:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
164 self.value = self.name_input.value
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
165 else:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
166 self.value = self.save_list.value
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
167 if self.value:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
168 self.send(gui.CHANGE)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
169 self.close()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
170
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
171 def _click_cancel(self):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
172 self.value = None
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
173 self.send(gui.CHANGE)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
174 self.close()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
175
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
176
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
177 class SaveDialog(BaseSaveRestoreDialog):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
178 """Save game dialog."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
179
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
180 def __init__(self, gameboard):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
181 BaseSaveRestoreDialog.__init__(self, "Save Game ...", "Save", allow_new=True)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
182 self.connect(gui.CHANGE, self._save, gameboard)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
183
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
184 def _save(self, gameboard):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
185 filename = self.get_fullpath()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
186 if filename is None:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
187 return
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
188
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
189 data = gameboard.save_game()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
190 snapshot = gameboard.snapshot()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
191
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
192 try:
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
193 write_savegame(filename, data, snapshot)
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
194 except Exception, e:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
195 print "Failed to save game: %s" % (e,)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
196
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
197
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
198 class RestoreDialog(BaseSaveRestoreDialog):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
199 """Restore game dialog."""
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
200
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
201 def __init__(self, gameboard):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
202 BaseSaveRestoreDialog.__init__(self, "Load Game ...", "Load", allow_new=False)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
203 self.connect(gui.CHANGE, self._restore, gameboard)
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
204
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
205 def _restore(self, gameboard):
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
206 filename = self.get_fullpath()
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
207 if filename is None:
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
208 return
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
209
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
210 try:
499
c2a4e3a24e9a Factor out write_savegame method. Zlib compress save games to reduce space from ~600k to ~15k.
Simon Cross <hodgestar@gmail.com>
parents: 496
diff changeset
211 data, screenshot = read_savegame(filename)
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
212 except Exception, e:
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
213 print "Failed to load game: %s" % (e,)
486
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
214 return
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
215
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
216 gameboard.restore_game(data)