-
Notifications
You must be signed in to change notification settings - Fork 43
/
FlxSave.java
216 lines (198 loc) · 5.9 KB
/
FlxSave.java
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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
package org.flixel;
import org.flixel.event.IFlxSave;
import org.flixel.system.FlxSaveData;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Preferences;
/**
* A class to help automate and simplify save game functionality.
* Basically a wrapper for the Flash SharedObject thing, but
* handles some annoying storage request stuff too.
*
* @author Thomas Weston
*/
public class FlxSave
{
static protected final int SUCCESS = 0;
static protected final int PENDING = 1;
static protected final int ERROR = 2;
/**
* Allows you to directly access the data container in the local shared object.
* @default null
*/
public FlxSaveData data;
/**
* The name of the local shared object.
* @default null
*/
public String name;
/**
* The local shared object itself.
* @default null
*/
protected Preferences _sharedObject;
/**
* Internal tracker for callback function in case save takes too long.
*/
protected IFlxSave _onComplete;
/**
* Internal tracker for save object close request.
*/
protected boolean _closeRequested;
/**
* Blanks out the containers.
*/
public FlxSave()
{
destroy();
}
/**
* Clean up memory.
*/
public void destroy()
{
_sharedObject = null;
name = null;
data = null;
_onComplete = null;
_closeRequested = false;
}
/**
* Automatically creates or reconnects to locally saved data.
*
* @param Name The name of the object (should be the same each time to access old data).
*
* @return Whether or not you successfully connected to the save data.
*/
public boolean bind(String Name)
{
destroy();
name = Name;
_sharedObject = Gdx.app.getPreferences(name);
if(_sharedObject == null)
{
FlxG.log("ERROR: There was a problem binding to\nthe shared object data from FlxSave.");
destroy();
return false;
}
data = new FlxSaveData(_sharedObject);
return true;
}
/**
* A way to safely call <code>flush()</code> and <code>destroy()</code> on your save file.
* Will correctly handle storage size popups and all that good stuff.
* If you don't want to save your changes first, just call <code>destroy()</code> instead.
*
* @param MinFileSize If you need X amount of space for your save, specify it here.
* @param OnComplete This callback will be triggered when the data is written successfully.
*
* @return The result of result of the <code>flush()</code> call (see below for more details).
*/
public boolean close(int MinFileSize,IFlxSave OnComplete)
{
_closeRequested = true;
return flush(MinFileSize,OnComplete);
}
/**
* A way to safely call <code>flush()</code> and <code>destroy()</code> on your save file.
* Will correctly handle storage size popups and all that good stuff.
* If you don't want to save your changes first, just call <code>destroy()</code> instead.
*
* @param MinFileSize If you need X amount of space for your save, specify it here.
*
* @return The result of result of the <code>flush()</code> call (see below for more details).
*/
public boolean close(int MinFileSize)
{
return close(MinFileSize,null);
}
/**
* A way to safely call <code>flush()</code> and <code>destroy()</code> on your save file.
* Will correctly handle storage size popups and all that good stuff.
* If you don't want to save your changes first, just call <code>destroy()</code> instead.
*
* @return The result of result of the <code>flush()</code> call (see below for more details).
*/
public boolean close()
{
return close(0,null);
}
/**
* Writes the local shared object to disk immediately. Leaves the object open in memory.
*
* @param MinFileSize If you need X amount of space for your save, specify it here.
* @param OnComplete This callback will be triggered when the data is written successfully.
*
* @return Whether or not the data was written immediately. False could be an error OR a storage request popup.
*/
public boolean flush(int MinFileSize,IFlxSave OnComplete)
{
if(!checkBinding())
return false;
_onComplete = OnComplete;
_sharedObject.flush();
return onDone();
}
/**
* Writes the local shared object to disk immediately. Leaves the object open in memory.
*
* @param MinFileSize If you need X amount of space for your save, specify it here.
*
* @return Whether or not the data was written immediately. False could be an error OR a storage request popup.
*/
public boolean flush(int MinFileSize)
{
return flush(MinFileSize,null);
}
/**
* Writes the local shared object to disk immediately. Leaves the object open in memory.
*
* @return Whether or not the data was written immediately. False could be an error OR a storage request popup.
*/
public boolean flush()
{
return flush(0,null);
}
/**
* Erases everything stored in the local shared object.
* Data is immediately erased and the object is saved that way,
* so use with caution!
*
* @return Returns false if the save object is not bound yet.
*/
public boolean erase()
{
if(!checkBinding())
return false;
_sharedObject.clear();
_sharedObject.flush();
return true;
}
/**
* Event handler for special case storage requests.
* Handles logging of errors and calling of callback.
*
* @return Whether the operation was a success or not.
*/
protected boolean onDone()
{
if(_onComplete != null)
_onComplete.callback(true);
if(_closeRequested)
destroy();
return true;
}
/**
* Handy utility function for checking and warning if the shared object is bound yet or not.
*
* @return Whether the shared object was bound yet.
*/
protected boolean checkBinding()
{
if(_sharedObject == null)
{
FlxG.log("FLIXEL: You must call FlxSave.bind()\nbefore you can read or write data.");
return false;
}
return true;
}
}