Mercurial > rinkhals
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 |
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) |