annotate gamelib/savegame.py @ 547:1456bf2ff02e

Allow cancelling of save game dialog with ESC.
author Simon Cross <hodgestar@gmail.com>
date Sat, 28 Nov 2009 11:12:45 +0000
parents 882b582da618
children a8dde729000a
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
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
18
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
19 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
20
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
21 def read_savegame(fullpath):
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
22 """Open a save game file."""
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
23 xml = zlib.decompress(open(fullpath, "rb").read())
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
24 params, methodname = xmlrpclib.loads(xml)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
25 if methodname != "foxassault":
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
26 raise SaveGameError("File does not appear to be a "
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
27 "Fox Assault save game.")
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
28 save_version = params[0]
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
29 if save_version != version.SAVE_GAME_VERSION:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
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
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
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
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
34 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
35 snapshot = decode_snapshot(params[2])
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
36 except Exception, e:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
37 snapshot = None
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
38
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
39 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
40 level_name = params[3]
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
41 except Exception, e:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
42 level_name = None
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
43
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
44 try:
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
45 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
46 except Exception, e:
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
47 timestamp = None
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
48
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
49 return data, snapshot, level_name, timestamp
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
50
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
51 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
52 """Write a save game file."""
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
53 snapshot_data = encode_snapshot(snapshot)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
54 timestamp_str = timestamp.strftime(TIMESTAMP_FORMAT)
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
55 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
56 xml = xmlrpclib.dumps(params, "foxassault")
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
57 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
58
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
59 def encode_snapshot(snapshot):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
60 """Encode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
61 snapshot_file = StringIO.StringIO()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
62 pygame.image.save(snapshot, snapshot_file)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
63 data = snapshot_file.getvalue()
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
64 data = base64.standard_b64encode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
65 return data
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
66
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
67 def decode_snapshot(data):
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
68 """Decode a snapshot."""
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
69 data = base64.standard_b64decode(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
70 snapshot_file = StringIO.StringIO(data)
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
71 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
72 return snapshot
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
73
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 class SaveGameError(Exception):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
76 pass
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
77
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
78
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
79 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
80 """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
81
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
82 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
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 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
85 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
86 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
87
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
89 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
90
8897a436a8cb Factor out save game logic and (new, simplified) dialogs into their own module. Add preferences folder to concept to config. Save games under preferences folder.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91 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
92 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
93 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
94 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
95
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
97 '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
98 '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
99 '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
100 '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
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
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
104 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
105 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
106 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
107 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
108 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
109 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
110
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
111 self.image_container = gui.Container()
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
112
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
113 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
114 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
115
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
117 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
118
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
120 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
121 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
122 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
123 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
124 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
125 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
126 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
127 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
128 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
129 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
130 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
131
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
133 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
134
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
135 if games:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
136 self.save_list.group.value = games[0]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
137
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
138 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
139 """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
140 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
141 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
142 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
143
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 _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
145 """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
146 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
147 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
148 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
149 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
150 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
151 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
152 continue
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
153 self.save_games[root] = (fullpath, None)
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
154
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
155 def _create_image_widget(self, fullpath):
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
156 """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
157 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
158 data, screenshot, level_name, timestamp = read_savegame(fullpath)
540
882b582da618 Remove down wrapping of exceptions.
Simon Cross <hodgestar@gmail.com>
parents: 512
diff changeset
159 except Exception:
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
160 return gui.Label("Bad Save Game")
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
161
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
162 tbl = gui.Table()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
163
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
164 tbl.tr()
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
165 if screenshot is None:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
166 tbl.td(gui.Label("No screenshot"))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
167 else:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
168 tbl.td(gui.Image(screenshot))
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
169
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
170 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
171 if level_name is None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
172 tbl.td(gui.Label("Level: ???"))
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.Label("Level: %s" % (level_name,)))
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
175
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
176 if timestamp is not None:
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
177 tbl.tr()
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
178 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
179
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
180 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
181
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
183 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
184 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
185
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
186 for w in self.image_container.widgets:
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
187 self.image_container.remove(w)
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
188
510
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
189 name = self.save_list.value
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
190 fullpath, widget = self.save_games[name]
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
191 if widget is None:
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
192 widget = self._create_image_widget(fullpath)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
193 self.save_games[name] = (fullpath, widget)
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
194
3e4bb2c9556c Lazy loading of save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 509
diff changeset
195 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
196
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
197 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
198 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
199 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
200 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
201 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
202 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
203 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
204 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
205
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
207 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
208 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
209 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
210
547
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
211 def event(self, e):
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
212 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
213 self._click_cancel()
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
214 return True
1456bf2ff02e Allow cancelling of save game dialog with ESC.
Simon Cross <hodgestar@gmail.com>
parents: 540
diff changeset
215 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
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 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
218 """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
219
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
221 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
222 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
223
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
225 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
226 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
227 return
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
228
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
229 data = gameboard.save_game()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
230 snapshot = gameboard.snapshot()
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
231 level_name = gameboard.level.level_name
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
232 timestamp = datetime.datetime.now()
496
bf90a2948e34 Basic snapshot support in save games added.
Simon Cross <hodgestar@gmail.com>
parents: 491
diff changeset
233
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
234 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
235 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
236 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
237 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
238
8897a436a8cb Factor out save game logic and (new, simplified) dialogs 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 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
241 """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
242
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
243 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
244 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
245 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
246
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
247 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
248 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
249 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
250 return
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
251
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
252 try:
509
77a3f7f1c856 Add level name and timestamp to save games.
Simon Cross <hodgestar@gmail.com>
parents: 499
diff changeset
253 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
254 except Exception, e:
491
75ef6ea3b7a6 Start of support for save game snapshots.
Simon Cross <hodgestar@gmail.com>
parents: 486
diff changeset
255 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
256 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
257
512
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
258 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
259 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
260 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
261
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
262 try:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
263 new_gameboard = serializer.unsimplify(data)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
264 except Exception, e:
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
265 print "Failed to load game: %s" % (e,)
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
266 return
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
267
b112bcf4d435 Add restore game button to main menu.
Simon Cross <hodgestar@gmail.com>
parents: 510
diff changeset
268 restore_func(new_gameboard)