annotate gamelib/savegame.py @ 536:1a224ba50edf

Correctly set the position of newly hatched chickens in buildings
author Neil Muller <drnlmuller@gmail.com>
date Fri, 27 Nov 2009 23:29:32 +0000
parents b112bcf4d435
children 882b582da618
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
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
8 import datetime
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
9
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
10 from pgu import gui
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
11 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
12
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 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
14 import version
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
15 import gameboard
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
16 import serializer
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
17
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
18 TIMESTAMP_FORMAT = "%Y-%m-%dT%H:%M:%S"
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
19
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
20 def read_savegame(fullpath):
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
21 """Open a save game file."""
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
22 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
23 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
24 params, methodname = xmlrpclib.loads(xml)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
25 if methodname != "foxassault":
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
26 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
27 "Fox Assault save game.")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
28 save_version = params[0]
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
29 if save_version != version.SAVE_GAME_VERSION:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
30 raise SaveGameError("Incompatible save game version.")
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
31
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
32 data = params[1]
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
33
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
34 try:
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
35 snapshot = decode_snapshot(params[2])
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
36 except Exception, e:
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
37 snapshot = None
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
38
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
39 try:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
40 level_name = params[3]
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
41 except Exception, e:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
42 level_name = None
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
43
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
44 try:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
45 timestamp = datetime.datetime.strptime(params[4], TIMESTAMP_FORMAT)
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
46 except Exception, e:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
47 timestamp = None
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
48
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
49 except Exception, e:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
50 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
51
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
52 return data, snapshot, level_name, timestamp
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
53
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
54 def write_savegame(fullpath, data, snapshot, level_name, timestamp):
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
55 """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
56 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
57 snapshot_data = encode_snapshot(snapshot)
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
58 timestamp_str = timestamp.strftime(TIMESTAMP_FORMAT)
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
59 params = (version.SAVE_GAME_VERSION, data, snapshot_data, level_name, timestamp_str)
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
60 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
61 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
62 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
63 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
64
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
65 def encode_snapshot(snapshot):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
66 """Encode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
67 snapshot_file = StringIO.StringIO()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
68 pygame.image.save(snapshot, snapshot_file)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
69 data = snapshot_file.getvalue()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
70 data = base64.standard_b64encode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
71 return data
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
72
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
73 def decode_snapshot(data):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
74 """Decode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
75 data = base64.standard_b64decode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
76 snapshot_file = StringIO.StringIO(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
77 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
78 return snapshot
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
79
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
80
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
81 class SaveGameError(Exception):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
82 pass
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
83
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
84
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 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
86 """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
87
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
88 TIMESTAMP_DISPLAY = "%H:%M, %d %b %Y"
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
89
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
90 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
91 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
92 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
93
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 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
95 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
96
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 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
98 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
99 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
100 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
101
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 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
103 '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
104 '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
105 '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
106 '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
107 }
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
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 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
110 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
111 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
112 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
113 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
114 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
115 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
116
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
117 self.image_container = gui.Container()
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
118
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
119 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
120 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
121
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 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
123 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
124
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 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
126 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
127 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
128 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
129 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
130 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
131 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
132 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
133 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
134 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
135 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
136 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
137
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
138 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
139 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
140
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
141 if games:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
142 self.save_list.group.value = games[0]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
143
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
144 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
145 """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
146 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
147 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
148 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
149
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
150 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
151 """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
152 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
153 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
154 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
155 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
156 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
157 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
158 continue
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
159 self.save_games[root] = (fullpath, None)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
160
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
161 def _create_image_widget(self, fullpath):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
162 """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
163 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
164 data, screenshot, level_name, timestamp = read_savegame(fullpath)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
165 except SaveGameError:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
166 return gui.Label("Bad Save Game")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
167
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
168 tbl = gui.Table()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
169
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
170 tbl.tr()
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
171 if screenshot is None:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
172 tbl.td(gui.Label("No screenshot"))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
173 else:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
174 tbl.td(gui.Image(screenshot))
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
175
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
176 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
177 if level_name is None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
178 tbl.td(gui.Label("Level: ???"))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
179 else:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
180 tbl.td(gui.Label("Level: %s" % (level_name,)))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
181
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
182 if timestamp is not None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
183 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
184 tbl.td(gui.Label(timestamp.strftime(self.TIMESTAMP_DISPLAY)))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
185
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
186 return tbl
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
187
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
188 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
189 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
190 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
191
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
192 for w in self.image_container.widgets:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
193 self.image_container.remove(w)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
194
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
195 name = self.save_list.value
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
196 fullpath, widget = self.save_games[name]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
197 if widget is None:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
198 widget = self._create_image_widget(fullpath)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
199 self.save_games[name] = (fullpath, widget)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
200
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
201 self.image_container.add(widget, 0, 0)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
202
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
203 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
204 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
205 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
206 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
207 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
208 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
209 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
210 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
211
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 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
213 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
214 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
215 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
216
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
217
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
218 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
219 """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
220
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
221 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
222 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
223 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
224
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
225 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
226 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
227 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
228 return
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
229
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
230 data = gameboard.save_game()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
231 snapshot = gameboard.snapshot()
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
232 level_name = gameboard.level.level_name
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
233 timestamp = datetime.datetime.now()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
234
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
235 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
236 write_savegame(filename, data, snapshot, level_name, timestamp)
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
237 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
238 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
239
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
240
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
241 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
242 """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
243
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
244 def __init__(self, restore_func):
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
245 BaseSaveRestoreDialog.__init__(self, "Load Game ...", "Load", allow_new=False)
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
246 self.connect(gui.CHANGE, self._restore, restore_func)
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
247
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
248 def _restore(self, restore_func):
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
249 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
250 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
251 return
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
252
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
253 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
254 data, screenshot, level_name, timestamp = 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
255 except Exception, e:
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
256 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
257 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
258
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
259 if 'refid' not in data or 'class' not in data or data['class'] != gameboard.GameBoard.__name__:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
260 print "Failed to load game: Invalid game data."
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
261 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
262
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
263 try:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
264 new_gameboard = serializer.unsimplify(data)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
265 except Exception, e:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
266 print "Failed to load game: %s" % (e,)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
267 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
268
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
269 restore_func(new_gameboard)