bzr branch
http://9ix.org/bzr/spacey
1
by Josh C
zoetrope 1.4 |
1 |
-- Class: Storage |
2 |
-- Allows your app to save data between sessions -- high scores or game |
|
3 |
-- progress, for example. A single storage instance corresponds to a |
|
4 |
-- file on disk. If you'd like to maintain individual files (e.g. so |
|
5 |
-- a user can email a save game to a friend), you'll need to create a |
|
6 |
-- separate storage instance for each one. |
|
7 |
-- |
|
8 |
-- Your data is saved on disk in Lua format. This means that if someone |
|
9 |
-- figures out where your data files are saved, it is very trivial for them |
|
10 |
-- to change the data. If saving or loading fails, then this class still |
|
11 |
-- retains your data across a single app session. If you want to be notified |
|
12 |
-- when errors occur, check the <save()> and <load()> methods' arguments. |
|
13 |
-- |
|
14 |
-- Make sure to set your app's identity in conf.lua, so that your |
|
15 |
-- files don't clobber some other app's. See https://love2d.org/wiki/Config_Files |
|
16 |
-- for details. |
|
17 |
-- |
|
18 |
-- |
|
19 |
-- Extends: |
|
20 |
-- <Class> |
|
21 |
||
22 |
Storage = Class:extend{ |
|
23 |
-- Property: data |
|
24 |
-- Use this property to store whatever data you like. You can |
|
25 |
-- nest tables inside this. |
|
26 |
data = {}, |
|
27 |
||
28 |
-- Property: filename |
|
29 |
-- What filename to store the data on disk under. See |
|
30 |
-- https://love2d.org/wiki/love.filesystem for where exactly this |
|
31 |
-- will be saved. Make sure to set this if your app is using |
|
32 |
-- multiple storage objects -- otherwise they will overwrite |
|
33 |
-- each other. |
|
34 |
||
35 |
filename = 'storage.dat', |
|
36 |
||
37 |
new = function (self, obj) |
|
38 |
obj = obj or {} |
|
39 |
self:extend(obj) |
|
40 |
||
41 |
if obj.filename then obj:load() end |
|
42 |
||
43 |
if obj.onNew then obj:onNew() end |
|
44 |
return obj |
|
45 |
end, |
|
46 |
||
47 |
-- Method: save |
|
48 |
-- Saves data to disk. |
|
49 |
-- |
|
50 |
-- Arguments: |
|
51 |
-- none |
|
52 |
-- |
|
53 |
-- Returns: |
|
54 |
-- nothing |
|
55 |
||
56 |
save = function (self, ignoreError) |
|
57 |
if ignoreError ~= false then ignoreError = true end |
|
58 |
||
59 |
local ok, message = pcall(love.filesystem.write, self.filename, dump(self.data)) |
|
60 |
||
61 |
if not ok and not ignoreError then |
|
62 |
error("could not save storage from disk: " .. message) |
|
63 |
end |
|
64 |
end, |
|
65 |
||
66 |
-- Method: load |
|
67 |
-- Loads data from disk. |
|
68 |
-- |
|
69 |
-- Arguments: |
|
70 |
-- ignoreError - silently ignore any errors loading, default to true |
|
71 |
-- |
|
72 |
-- Returns: |
|
73 |
-- whether loading actually worked, boolean |
|
74 |
||
75 |
load = function (self, ignoreError) |
|
76 |
if ignoreError ~= false then ignoreError = true end |
|
77 |
||
78 |
local ok, data = pcall(love.filesystem.read, self.filename) |
|
79 |
||
80 |
if ok then |
|
81 |
ok, self.data = pcall(loadstring('return ' .. data)) |
|
82 |
||
83 |
if not ok then |
|
84 |
if ignoreError then |
|
85 |
self.data = {} |
|
86 |
else |
|
87 |
error("could not deserialize storage data: " .. self.data) |
|
88 |
end |
|
89 |
end |
|
90 |
else |
|
91 |
if not ignoreError then |
|
92 |
error("could not load storage from disk: " .. data) |
|
93 |
end |
|
94 |
end |
|
95 |
||
96 |
return ok |
|
97 |
end |
|
98 |
} |