gamefile hack

This commit is contained in:
p.kosyh 2010-07-14 08:31:44 +00:00
parent 6a91f15706
commit 422b5da0be
2 changed files with 29 additions and 26 deletions

View file

@ -3,14 +3,6 @@ game._snapshots = {}
function make_snapshot(nr)
if not tonumber(nr) then nr = 0 end
local h = { };
local function save_object(key, value, h)
savevar(h, value, key, false);
return true;
end
local function save_var(key, value, h)
savevar(h, value, key, isForSave(key, value, _G))
end
h.txt = ''
h.write = function(s, ...)
local i
@ -19,10 +11,7 @@ function make_snapshot(nr)
end
end
local old = game._snapshots; game._snapshots = nil
for_each_object(save_object, h);
save_object('game', game, h);
for_everything(save_var, h);
clearvar(_G);
do_savegame(game, h);
game._snapshots = old
game._snapshots[nr] = h.txt;
end
@ -36,10 +25,7 @@ function restore_snapshot(nr)
if not tonumber(nr) then nr = 0 end
local ss = game._snapshots
if not ss[nr] then return nil, true end -- nothing todo
stead:init();
game.lifes:zap();
dofile('main.lua');
game:ini()
gamefile("main.lua"); stead.pclr();
-- if type(init) == 'function' then -- no hooks here!!!
-- init();
-- end

View file

@ -1634,18 +1634,40 @@ function savevar (h, v, n, need)
h:write("\n")
end
function gamefile(file)
stead:init();
game.lifes:zap();
dofile(file);
game:ini();
if file == 'main.lua' then -- legacy???
file = nil
end
game._script = file;
return goto(here())
end
function game_save(self, name, file)
local h;
function do_savegame(s, h)
local function save_object(key, value, h)
savevar(h, value, key, false);
return true;
end
local function save_var(key, value, h)
savevar(h, value, key, isForSave(key, value, _G))
end
if s._script then
h:write(stead.string.format("gamefile(%q)\n",
s._script))
end
save_object('allocator', allocator, h); -- always first!
for_each_object(save_object, h);
save_object('game', self, h);
for_everything(save_var, h);
-- save_object('_G', _G, h);
clearvar(_G);
end
function game_save(self, name, file)
local h;
if file ~= nil then
file:write(name..".pl = '"..deref(self.pl).."'\n");
@ -1668,12 +1690,7 @@ function game_save(self, name, file)
if type(n) == 'string' and n ~= "" then
h:write("-- $Name: "..n:gsub("\n","\\n").."$\n");
end
save_object('allocator', allocator, h); -- always first!
for_each_object(save_object, h);
save_object('game', self, h);
for_everything(save_var, h);
-- save_object('_G', _G, h);
clearvar(_G);
do_savegame(self, h);
h:flush();
h:close();
game.autosave = false; -- we have only one try for autosave