-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGameSaver Documentation.rtf
201 lines (182 loc) · 24.6 KB
/
GameSaver Documentation.rtf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
{\rtf1\ansi\deff3\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq2\fcharset0 Arial;}{\f5\froman\fprq2\fcharset0 Times New Roman;}{\f6\fnil\fprq0\fcharset0 DejaVu Sans Mono;}{\f7\fnil\fprq2\fcharset0 Times New Roman;}{\f8\fnil\fprq2\fcharset0 Lohit Hindi;}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green0\blue178;}
{\stylesheet{\s0\snext0\ql\nowidctlpar\ltrpar\hyphpar0\cf1\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\alang1081\loch\f5\fs24\lang7177 Normal;}
{\s15\sbasedon0\snext16\ql\nowidctlpar\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\loch\f4\fs28\lang7177 Heading;}
{\s16\sbasedon0\snext16\ql\nowidctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\loch\f5\fs24\lang7177 Text Body;}
{\s17\sbasedon16\snext17\ql\nowidctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\loch\f5\fs24\lang7177 List;}
{\s18\sbasedon0\snext18\ql\nowidctlpar\sb120\sa120\ltrpar\cf1\i\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\loch\f5\fs24\lang7177 Caption;}
{\s19\sbasedon0\snext19\ql\nowidctlpar\ltrpar\cf1\kerning1\dbch\af8\langfe7177\dbch\af7\afs24\loch\f5\fs24\lang7177 Index;}
{\s20\sbasedon0\snext20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177 Preformatted Text;}
}{\*\generator LibreOffice/6.0.7.3$Linux_X86_64 LibreOffice_project/00m0$Build-3}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\author Thaumaturge }{\revtim\yr2020\mo10\dy8\hr16\min50}{\printim\yr0\mo0\dy0\hr0\min0}}{\*\userprops}\deftab709
\viewscale120
{\*\pgdsctbl
{\pgdsc0\pgdscuse451\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\pgdscnxt0 Default Style;}}
\formshade{\*\pgdscno0}\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
{\*\ftnsep\chftnsep}\pgndec\pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
GameSaver -- A module for loading and saving games}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
v1.0-1.}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
5}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
by Ian Eborn (Thaumaturge)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{{\*\bkmkstart __DdeLink__192_514842926}{\*\bkmkend __DdeLink__192_514842926}\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
This module and related files are offered as-is, without any warranty, with any and all defects or errors.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
Classes:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
- }{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
GameSaver}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
-- The core class. GameSaver is intended to be used via its static methods, and not instantiated.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
- }{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
GameSaveEntry}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
-- A class that encapsulates the data to be saved or that has been loaded. GameSaveEntries may be nested within each other.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
- }{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
SaveableObject}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
-- Most classes with non-trivial data to be saved are intended to inherit from this class.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
- }{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
SpecialTypeEntry}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
-- An internal class that holds function callbacks for the reconstitution and representation of simple classes that are not basic types (that is to say, none of int, float, str, etc.).}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
General use:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab Start by informing GameSaver of any special types that you might have (Panda's vector classes might be treated so, for example). Next, pass to it a method that allows it to check the inheritance of classes that it might not have imported (custom game classes, for example). A simple such }{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
approach}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
might look something like this:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\rtlch \ltrch\loch
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\cf1\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
masterClassDict = \{x[0] : x[1] for x in inspect.getmembers(sys.modules[__name__], inspect.isclass)\}}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab @staticmethod}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
def isSubclass(name, classToCheck):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
if name == "NoneType" or name == "function" or name == "method":}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
return False}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
if not name in masterClassDict:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
return False}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\li1418\ri0\lin1418\rin0\fi0{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\fs20\lang7177
}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
return issubclass(masterClassDict[name], classToCheck)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab Any objects that descend from SaveableObject should specify any data that should be saved from them by overriding "getSaveData"; this new implementation should generally first call the version of "getSaveData" from is parent class (or whichever class above it is the closest to implement "getSaveData"), and add any new data to the object returned. Data should be added by calling "addItem" on this object (which should be an instance of GameSaveEntry). Note that the first parameter to "addItem", an instruction to GameSaver regarding how to restore the data, should not include the usual reference to the calling object (that is to say, it should not start with "self."). The result should then be returned. For example, in an object that inherits directly from SaveableObject:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab def getSaveData(self, forLevelSave):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab result = SaveableObject.getSaveData(self, forLevelSave)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab # Instructs GameSaver to call "myMethod" in order to restore this data}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab result.addItem("myMethod", self.datum1)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab # Instructs GameSaver to simply assign this data when restored.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab result.addItem("myDatum2 =", self.myDatum2)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab return result}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab Note that you may create additional GameSaveEntries and nest them within the GameSaveEntry returned by an implementation of "getSaveData" -- indeed, this is one way of dealing with objects that themselves contain other objects that inherit from SaveableObject (such as a saveable enemy class that contains a saveable weapon class).}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab If the class should do more than simply have its data assigned or methods called when restoring data (such as calling some initialisation method after all restoration is completed, or cleaning up before it), the class may override "loadFromSaveData". In this case, similarly to the above, the method (or a method called by it) should presumably at some point call SaveableObject's implementation of "loadFromSaveData".}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab When the user requests that the game be saved, call GameSaver.saveGame, passing to it the base object to be saved, the name of the file to save to, and indicate whether we are saving a level (as one might in an editor) or an active game ("True" indicates that we are saving a level). This "base" object is simply an object that defines an implementation of "getSaveData" that brings together all data that should be saved to that file. It should be perfectly valid to save out different pieces of data to several files -- just keep track of them!}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab When the user requests that a game be loaded, call GameSaver.loadGame, passing to it the name of the file to be loaded. Presuming a successful load, the "loadGame" should return a GameSaveEntry that contains the data described in the file; a simple loading of this data might be to call an appropriate class's "loadFromSaveData" method, passing the GameSaveEntry (and any reference object) to it.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
Known Issues (as of v1.}{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
5}{\b\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs24\lang7177
):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab The first parameter of "addItem" is a little awkward; in particular, the use of a string for the first parameter seems a little fragile to me, as does the differentiation between data to be assigned and data to be restored via method callback.}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab GameSaver }{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
raises an exception}{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
when asked to automatically restore classes that it doesn't recognise (such as custom game classes); one way to get around this is, in the relevant implementation of "getSaveData", to wrap their data (such as acquired by a call to the object's "getSaveData") in another GameSaveEntry, and then add this object to the GameSaveEntry to be returned. For example:}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab class A(SaveableObject):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab def __init__(self):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab self.a = 1}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab class B(SaveableObject):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab def __init__(self):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab self.b = 2}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab self.a = A()}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab def getSaveData(self, forLevelSave):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab result SaveableObject.getSaveData(self, forLevelSave)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab result.addItem("b =", self.b)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab newEntry = GameSaveEntry()}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab # Note the empty string for the first parameter}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab newEntry.addItem("", self.a.getSaveData(forLevelSave))}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\kerning1\dbch\af7\langfe7177\rtlch \ltrch\loch\fs20\lang7177
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab result.addItem("restoreA", newEntry)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab return result}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab }
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab def restoreA(self, data, refObj):}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab # Since it was nested within a GameSaveEntry, our data}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab # should be the first item in this GameSaveEntry's dataList}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab self.a = A()}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177{\kerning1\dbch\af7\langfe1025\rtlch \ltrch\loch\fs20\lang7177
\tab \tab \tab \tab self.a.loadFromSaveData(data.dataList[0], refObj)}
\par \pard\plain \s20\ql\nowidctlpar\sb0\sa0\ltrpar\cf1\kerning1\dbch\af7\langfe7177\dbch\af7\afs24\loch\f5\fs20\lang7177\rtlch \ltrch\loch
\par }