From 95b192d51e6f62898ba83179f7a5abf8707cb6d7 Mon Sep 17 00:00:00 2001 From: "p.kosyh" Date: Sun, 20 Jun 2010 09:19:33 +0000 Subject: [PATCH] save logic changed, MAY BE BROKEN. fixups --- stead/stead.lua | 102 ++++++++++++++++++++++++++++++++---------------- stead/vars.lua | 6 +-- 2 files changed, 72 insertions(+), 36 deletions(-) diff --git a/stead/stead.lua b/stead/stead.lua index a4e2245..fccffaf 100644 --- a/stead/stead.lua +++ b/stead/stead.lua @@ -72,7 +72,7 @@ function callpop() stead.cctx[stead.call_top] = nil; stead.call_top = stead.call_top - 1; if stead.call_top < 0 then - error "callpush/callpop mismatch" + error ("callpush/callpop mismatch") end end @@ -363,7 +363,8 @@ end function obj_save(self, name, h, need) local dsc; if need then - h:write(name.." = obj {nam = '"..tostring(self.nam).."'}\n"); + error ("Object "..name.." can not be saved!"); + return end savemembers(h, self, name, need); end @@ -389,7 +390,7 @@ end function obj(v) if v.nam == nil then - error ("No object name in constructor."); + error ("No object name in constructor.", 2); end v.object_type = true; @@ -465,6 +466,7 @@ function list_check(self) for i,v,ii in opairs(self) do local o = ref(v); if not o then -- isObject(o) then -- compat + error ("No object: "..tostring(v)) return false end if deref(v) then @@ -494,7 +496,7 @@ function list_add(self, name, pos) if self:look(nam) then return nil end - self.__modifyed__ = true; + self.__modified__ = true; if tonumber(pos) then stead.table.insert(self, tonumber(pos), nam); self[tonumber(pos)] = nam; -- for spare lists @@ -511,7 +513,7 @@ function list_set(self, name, pos) return nil end nam = deref(name); - self.__modifyed__ = true; + self.__modified__ = true; self[i] = nam; -- for spare lists return true end @@ -527,7 +529,7 @@ function list_find(self, name) end function list_save(self, name, h, need) - if self.__modifyed__ then + if self.__modifyed__ or self.__modified__ then -- compat h:write(name.." = list({});\n"); need = true; end @@ -582,7 +584,7 @@ function list_zap(self) for n,o,ii in opairs(self) do self[ii] = nil; end - self.__modifyed__ = true + self.__modified__ = true return self end @@ -605,7 +607,7 @@ function list_del(self, name) if n == nil then return nil; end - self.__modifyed__ = true + self.__modified__ = true v = stead.table.remove(self, n); if not v then v = self[n]; @@ -637,7 +639,7 @@ end function call(v, n, ...) if type(v) ~= 'table' then - error ("Call on non table object:"..n); + error ("Call on non table object:"..n, 2); end if v[n] == nil then return nil,nil; @@ -658,12 +660,12 @@ function call(v, n, ...) if type(v[n]) == 'boolean' then return v[n] end - error ("Method not string nor function:"..tostring(n)); + error ("Method not string nor function:"..tostring(n), 2); end function call_bool(v, n, ...) if type(v) ~= 'table' then - error ("Call bool on non table object:"..n); + error ("Call bool on non table object:"..n, 2); end if v[n] == nil then @@ -726,14 +728,15 @@ end function room_save(self, name, h, need) local dsc; if need then - h:write(name.." = room {nam = '"..tostring(self.nam).."'}\n"); + error ("Room "..name.." can not be saved!"); + return end savemembers(h, self, name, need); end function room(v) --constructor if v.nam == nil then - error "No room name in constructor."; + error ("No room name in constructor.", 2); end if v.scene == nil then v.scene = room_scene; @@ -1101,14 +1104,14 @@ function go(self, where, back) return nil,ret(false) end if not isRoom(ref(where)) then - error ("Trying to go nowhere: "..where); + error ("Trying to go nowhere: "..where, 2); end if not isRoom(ref(self.where)) then - error ("Trying to go from nowhere: "..self.where); + error ("Trying to go from nowhere: "..self.where, 2); end if stead.in_entered_call or stead.in_onexit_call then - error ("Do not use goto from onexit/entered action! Use exit/enter action instead:" .. self.where); + error ("Do not use goto from onexit/entered action! Use exit/enter action instead:" .. self.where, 2); end local v, r; @@ -1188,7 +1191,7 @@ end function player(v) if v.nam == nil then - error "No player name in constructor."; + error ("No player name in constructor.", 2); end if v.where == nil then v.where = 'main'; @@ -1316,7 +1319,8 @@ function do_ini(self) game.where = deref(game.where); for_each(game, "game", check_list, isList) - + + stead.fixups:apply(); for_each_object(call_ini); me():tag(); @@ -1342,7 +1346,7 @@ end function game(v) if v.nam == nil then - error "No game name in constructor."; + error ("No game name in constructor.", 2); end if v.pl == nil then v.pl = 'player'; @@ -1450,9 +1454,11 @@ end function savevar (h, v, n, need) local r,f - if v == nil or type(v)=="userdata" or - type(v)=="function" then + type(v)=="function" then +-- if need then +-- error ("Variable "..n.." can not be saved!"); +-- end return end @@ -1469,6 +1475,14 @@ function savevar (h, v, n, need) end if type(v) == "table" then + if type(v.key_name) == 'string' and v.key_name ~= n and + '_G["'..v.key_name..'"]' ~= n then -- just xref + if need then + local w = stead.string.format("%s = ref(%q)", n, v.key_name); + h:write(stead.string.format("%s = stead.fixups:add(%q)\n", n, w)); + end + return + end if v.__visited__ ~= nil then return end @@ -1479,7 +1493,7 @@ function savevar (h, v, n, need) v:save(n, h, need); return; end - + if need then h:write(n.." = {};\n"); end @@ -1880,24 +1894,24 @@ allocator = obj { new = function(s, n) local v = ref(n); if type(v) ~= 'table' or type(n) ~= 'string' then - error "Error in new."; + error ("Error in new.", 2); end v.save = allocator_save; v.constructor = n; stead.table.insert(s.objects, v); - v.key_name = 'allocator.objects['..stead.table.maxn(s.objects)..']'; + v.key_name = 'allocator["objects"]['..stead.table.maxn(s.objects)..']'; return v end, objects = { save = function(self, name, h, need) savemembers(h, self, name, true); - end + end, }, }; function new(str) if type(str) ~= 'string' then - error("Non string constructor in new."); + error("Non string constructor in new.", 2); end return allocator:new(str); end @@ -1906,6 +1920,25 @@ function delete(v) allocator:delete(v); end +stead.fixups = { + fix = {}, + apply = function(s) + local i,v + for i,v in ipairs(s.fix) do + local f = loadstring(v); + if type(f) ~= 'function' then + error ("Error while fixup:" .. tostring(v)) + end + f(); + end + s.fix = {} + end, + add = function(s, str) + stead.table.insert(s.fix, str) + return nil + end +} + timer = obj { -- timer calls stead.timer callback nam = 'timer', ini = function(s) @@ -1983,7 +2016,7 @@ end function vobj(key, name, dsc, w) if not tonumber(key) then - error ("vobj key must be number!"); + error ("vobj key must be number!", 2); end return obj{ key = key, nam = name, dsc = dsc, where = deref(w), act = vobj_act, used = vobj_used, save = vobj_save, obj = list({}) }; end @@ -2051,7 +2084,7 @@ end function taketo(obj, wh, pos) local o = remove(obj, wh); if not isObject(o) then - error "Trying to take wrong object."; + error ("Trying to take wrong object.", 2); end inv():add(obj, pos); o._taken = true @@ -2070,7 +2103,7 @@ function putto(obj, w, pos) local wh local o = ref(obj); if not isObject(o) then - error "Trying to put wrong object."; + error ("Trying to put wrong object.", 2); end if not w then wh = deref(here()); @@ -2098,7 +2131,7 @@ end function drop(obj, w) local o = put(obj, w); if not isObject(o) then - error "Trying to drop wrong object:"; + error ("Trying to drop wrong object.", 2); end inv():del(obj); o._taken = false @@ -2108,7 +2141,7 @@ end function dropf(obj) local o = putf(obj); if not isObject(o) then - error "Trying to dropf wrong object:"; + error ("Trying to dropf wrong object.", 2); end inv():del(obj); o._taken = false @@ -2276,7 +2309,7 @@ end function change_pl(p) local o = ref(p); if type(deref(p)) ~= 'string' or not o then - error "Wrong player name in change_pl..."; + error ("Wrong player name in change_pl...", 2); end game.pl = deref(p); return goto(o.where); @@ -2319,6 +2352,9 @@ function enable_all(o) end function isForSave(k, v, s) -- k - key, v - value, s -- parent table + if type(v) == 'function' or type(v) == 'userdata' then + return false + end return stead.string.find(k, '_') == 1 or stead.string.match(k,'^%u') end @@ -2347,7 +2383,7 @@ function check_version(v) return end if stead.version < v then - error ([[The game requires instead engine of version ]] ..v.. [[ or higher. http://instead.googlecode.com]]) + error ([[The game requires instead engine of version ]] ..v.. [[ or higher. http://instead.googlecode.com]], 2) end game.version = v if v >= "1.2.0" then diff --git a/stead/vars.lua b/stead/vars.lua index a336180..d333eb3 100644 --- a/stead/vars.lua +++ b/stead/vars.lua @@ -1,9 +1,9 @@ isForSave = hook(isForSave, function (f, k, v, s, ...) -- k - key, v - value, s -- parent table - local i,v + local i,o if type(s.var) == 'table' then - for i,v in ipairs(s.var) do - if v == k then + for i,o in ipairs(s.var) do + if o == k then return true end end