steed/stead/object.lua
2010-07-06 10:15:27 +00:00

194 lines
3.9 KiB
Lua

function player_use(self, what, onwhat, ...)
local obj, obj2, v, vv, r;
local scene_use_mode = false
obj = self:srch(what); -- in inv?
if not obj then -- no
obj = ref(self.where):srch(what); -- in scene?
if not obj then -- no!
return game.err, false;
end
scene_use_mode = true -- scene_use_mode!
end
if onwhat == nil then -- only one?
if scene_use_mode then
return self:action(what, unpack(arg)); -- call act
else
v, r = call(ref(obj),'inv', unpack(arg)); -- call inv
end
if not v and r ~= true then
v, r = call(game, 'inv', obj, unpack(arg));
end
return v, r;
end
obj2 = ref(self.where):srch(onwhat); -- in scene?
if not obj2 then
obj2 = self:srch(onwhat); -- in inv?
end
if not obj2 or obj2 == obj then
return game.err, false;
end
obj = ref(obj)
obj2 = ref(obj2)
if not scene_use_mode or isSceneUse(obj) then
v, r = call(obj, 'use', obj2, unpack(arg));
if r ~= false then
vv = call(obj2, 'used', obj, unpack(arg));
end
end
if not v and not vv then
v, r = call(game, 'use', obj, obj2, unpack(arg));
end
return stead.par(' ', v, vv);
end
function vobj_save(self, name, h, need)
local w = deref(self.where)
local dsc = self.dsc
if dsc == nil then
dsc = 'nil';
else
dsc = stead.string.format("%q", tostring(dsc))
end
if w == nil then
w = "nil"
else
w = stead.string.format("%q", w)
end
if need then
h:write(stead.string.format("%s = vobj(%q,%s,%s);\n",
name, tostring(self.nam), dsc, w));
end
savemembers(h, self, name, false);
end
function vobj_act(self, ...)
local o, r = here():srch(self); -- self.nam
if ref(o) and ref(o).where then
return goto(ref(o).where);
end
return call(ref(r),'act', self.nam, unpack(arg));
end
function vobj_used(self, ...)
local o, r = here():srch(self.nam);
return call(ref(r),'used', self.nam, unpack(arg));
end
function vobj_use(self, ...)
local o, r = here():srch(self.nam);
return call(ref(r),'use', self.nam, unpack(arg));
end
function vobj(name, dsc, w)
return obj{ nam = tostring(name),
vobject_type = true,
dsc = dsc,
where = deref(w),
act = vobj_act,
used = vobj_used,
use = vobj_use,
save = vobj_save };
end
function vway(name, dsc, w)
-- o.object_type = true;
return obj{ nam = tostring(name),
vobject_type = true,
dsc = dsc,
act = vobj_act,
where = deref(w),
used = vobj_used,
use = vobj_use,
save = vobj_save };
end
function isVobject(v)
return (type(v) == 'table') and (v.vobject_type)
end
function list_check(self, name) -- force using of objects, instead refs
local i, v, ii;
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 isObject(deref(v)) then-- no named object!
local n = stead.string.format("%s[%d]", name, ii);
v = allocator:new(n);
self[ii] = v;
for_each(v, n, check_list, isList, deref(v));
else
self[ii] = o;
end
end
return true;
end
function list_add(self, name, pos)
local nam
nam = ref(name);
if self:look(nam) then
return nil
end
self.__modified__ = true;
if tonumber(pos) then
stead.table.insert(self, tonumber(pos), nam);
self[tonumber(pos)] = nam; -- for spare lists
else
stead.table.insert(self, nam);
end
return true
end
function list_set(self, name, pos)
local nam
local i = tonumber(pos);
if not i then
return nil
end
nam = ref(name);
self.__modified__ = true;
self[i] = nam; -- for spare lists
return true
end
function list_concat(self, other, pos)
local n,o,ii
for n,o,ii in opairs(other) do
o = ref(o);
if pos == nil then
self:add(o);
else
self:add(o, pos);
pos = pos + 1;
end
end
end
function path(w, wh) -- search in way, disabled too
if not wh then
wh = here();
else
wh = ref(wh);
end
local o = ways(wh):srch(w, true);
o = ref(o);
if isRoom(o) then
return o
end
return nil
end
game.lifes = list(game.lifes)
stead:init(); -- reinit ob
-- vim:ts=4