annotate gamelib/savegame.py @ 602:1b77bcbfb9e3 default tip

update tags
author convert-repo
date Thu, 19 May 2011 15:58:03 +0000
parents 95c71a13468c
children
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
547
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
12 from pygame.locals import KEYDOWN, K_ESCAPE
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
13
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 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
15 import version
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
16 import gameboard
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
17 import serializer
575
95c71a13468c Convert failed save/restore print messages to warning dialogs.
Simon Cross <hodgestar@gmail.com>
parents: 571
diff changeset
18 import misc
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
19
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
20 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
21
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
22 def read_savegame(fullpath):
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
23 """Open a save game file."""
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
24 xml = zlib.decompress(open(fullpath, "rb").read())
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
25 params, methodname = xmlrpclib.loads(xml)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
26 if methodname != "foxassault":
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
27 raise SaveGameError("File does not appear to be a "
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
28 "Fox Assault save game.")
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
29 save_version = params[0]
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
30 if save_version != version.SAVE_GAME_VERSION:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
31 raise SaveGameError("Incompatible save game version.")
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
32
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
33 data = params[1]
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
34
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
35 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
36 snapshot = decode_snapshot(params[2])
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
37 except Exception, e:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
38 snapshot = None
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
39
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
40 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
41 level_name = params[3]
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
42 except Exception, e:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
43 level_name = None
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
44
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
45 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
46 timestamp = datetime.datetime.strptime(params[4], TIMESTAMP_FORMAT)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
47 except Exception, e:
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
48 timestamp = None
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
49
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
50 return data, snapshot, level_name, timestamp
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
51
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
52 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
53 """Write a save game file."""
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
54 snapshot_data = encode_snapshot(snapshot)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
55 timestamp_str = timestamp.strftime(TIMESTAMP_FORMAT)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
56 params = (version.SAVE_GAME_VERSION, data, snapshot_data, level_name, timestamp_str)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
57 xml = xmlrpclib.dumps(params, "foxassault")
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
58 open(fullpath, "wb").write(zlib.compress(xml))
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
59
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
60 def encode_snapshot(snapshot):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
61 """Encode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
62 snapshot_file = StringIO.StringIO()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
63 pygame.image.save(snapshot, snapshot_file)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
64 data = snapshot_file.getvalue()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
65 data = base64.standard_b64encode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
66 return data
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
67
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
68 def decode_snapshot(data):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
69 """Decode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
70 data = base64.standard_b64decode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
71 snapshot_file = StringIO.StringIO(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
72 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
73 return snapshot
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
74
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
75
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
76 class SaveGameError(Exception):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
77 pass
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
78
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
79
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 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
81 """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
82
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
83 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
84
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
85 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
86 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
87 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
88
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 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
90 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
91
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 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
93 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
94 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
95 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
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 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
98 '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
99 '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
100 '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
101 '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
102 }
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 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
105 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
106 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
107 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
108 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
109 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
110 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
111
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
112 self.image_container = gui.Container()
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
113
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
114 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
115 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
116
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 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
118 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
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 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
121 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
122 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
123 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
124 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
125 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
126 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
127 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
128 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
129 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
130 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
131 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
132
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 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
134 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
135
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
136 if games:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
137 self.save_list.group.value = games[0]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
138
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
139 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
140 """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
141 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
142 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
143 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
144
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 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
146 """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
147 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
148 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
149 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
150 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
151 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
152 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
153 continue
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
154 self.save_games[root] = (fullpath, None)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
155
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
156 def _create_image_widget(self, fullpath):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
157 """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
158 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
159 data, screenshot, level_name, timestamp = read_savegame(fullpath)
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
160 except Exception:
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
161 return gui.Label("Bad Save Game")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
162
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
163 tbl = gui.Table()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
164
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
165 tbl.tr()
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
166 if screenshot is None:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
167 tbl.td(gui.Label("No screenshot"))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
168 else:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
169 tbl.td(gui.Image(screenshot))
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
170
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
171 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
172 if level_name is None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
173 tbl.td(gui.Label("Level: ???"))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
174 else:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
175 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
176
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
177 if timestamp is not None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
178 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
179 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
180
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
181 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
182
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 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
184 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
185 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
186
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
187 for w in self.image_container.widgets:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
188 self.image_container.remove(w)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
189
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
190 name = self.save_list.value
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
191 fullpath, widget = self.save_games[name]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
192 if widget is None:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
193 widget = self._create_image_widget(fullpath)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
194 self.save_games[name] = (fullpath, widget)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
195
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
196 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
197
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
198 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
199 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
200 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
201 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
202 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
203 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
204 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
205 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
206
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 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
208 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
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
547
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
212 def event(self, e):
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
213 if e.type == KEYDOWN and e.key == K_ESCAPE:
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
214 self._click_cancel()
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
215 return True
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
216 return gui.Dialog.event(self, 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
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
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
221 def __init__(self, gameboard, saved_func=None):
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
222 BaseSaveRestoreDialog.__init__(self, "Save Game ...", "Save", allow_new=True)
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
223 if saved_func is None:
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
224 self._saved_func = lambda _val: None
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
225 else:
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
226 self._saved_func = saved_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
227 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
228
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
229 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
230 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
231 if filename is None:
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
232 self._saved_func(False)
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
233 return
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 data = gameboard.save_game()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
236 snapshot = gameboard.snapshot()
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
237 level_name = gameboard.level.level_name
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
238 timestamp = datetime.datetime.now()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
239
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
240 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
241 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
242 except Exception, e:
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
243 self._saved_func(False)
575
95c71a13468c Convert failed save/restore print messages to warning dialogs.
Simon Cross <hodgestar@gmail.com>
parents: 571
diff changeset
244 misc.WarnDialog("Save Failed", str(e)).open()
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
245 return
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
246
571
2921169e545b Don't rely on connect listener call order (PGU stores listeners in a dict).
Simon Cross <hodgestar@gmail.com>
parents: 566
diff changeset
247 self._saved_func(True)
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
248
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 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
250 """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
251
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
252 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
253 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
254 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
255
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
256 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
257 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
258 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
259 return
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
260
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
261 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
262 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
263 except Exception, e:
575
95c71a13468c Convert failed save/restore print messages to warning dialogs.
Simon Cross <hodgestar@gmail.com>
parents: 571
diff changeset
264 misc.WarnDialog("Restore Failed", str(e)).open()
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
265 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
266
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
267 if 'refid' not in data or 'class' not in data or data['class'] != gameboard.GameBoard.__name__:
575
95c71a13468c Convert failed save/restore print messages to warning dialogs.
Simon Cross <hodgestar@gmail.com>
parents: 571
diff changeset
268 misc.WarnDialog("Restore Failed", "Saved game board state invalid.").open()
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
269 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
270
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
271 try:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
272 new_gameboard = serializer.unsimplify(data)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
273 except Exception, e:
575
95c71a13468c Convert failed save/restore print messages to warning dialogs.
Simon Cross <hodgestar@gmail.com>
parents: 571
diff changeset
274 misc.WarnDialog("Restore Failed", str(e)).open()
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
275 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
276
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
277 restore_func(new_gameboard)