2010-06-25 12:31:54 +03:00
|
|
|
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!
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
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;
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
obj2 = ref(self.where):srch(onwhat); -- in scene?
|
|
|
|
if not obj2 then
|
|
|
|
obj2 = self:srch(onwhat); -- in inv?
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
if not obj2 or obj2 == obj then
|
|
|
|
return game.err, false;
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
|
|
|
|
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
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
if not v and not vv then
|
|
|
|
v, r = call(game, 'use', obj, obj2, unpack(arg));
|
2010-06-20 18:47:49 +03:00
|
|
|
end
|
2010-06-25 12:31:54 +03:00
|
|
|
return stead.par(' ', v, vv);
|
|
|
|
end
|
|
|
|
|
2010-06-22 16:03:40 +03:00
|
|
|
function vobj_save(self, name, h, need)
|
2010-06-30 07:46:24 +03:00
|
|
|
local w = deref(self.where)
|
|
|
|
local dsc = self.dsc
|
|
|
|
|
2010-06-22 16:03:40 +03:00
|
|
|
if need then
|
2010-07-11 17:26:13 +03:00
|
|
|
h:write(stead.string.format("%s = vobj(%s,%s,%s);\n",
|
|
|
|
name,
|
|
|
|
stead.tostring(self.nam),
|
|
|
|
stead.tostring(dsc),
|
|
|
|
stead.tostring(w)));
|
2010-06-22 16:03:40 +03:00
|
|
|
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
|
|
|
|
|
2010-06-23 09:05:25 +03:00
|
|
|
function vobj_use(self, ...)
|
|
|
|
local o, r = here():srch(self.nam);
|
|
|
|
return call(ref(r),'use', self.nam, unpack(arg));
|
|
|
|
end
|
|
|
|
|
2010-06-22 16:03:40 +03:00
|
|
|
function vobj(name, dsc, w)
|
|
|
|
return obj{ nam = tostring(name),
|
2010-06-23 09:05:25 +03:00
|
|
|
vobject_type = true,
|
2010-06-22 16:03:40 +03:00
|
|
|
dsc = dsc,
|
|
|
|
where = deref(w),
|
|
|
|
act = vobj_act,
|
|
|
|
used = vobj_used,
|
2010-06-23 09:05:25 +03:00
|
|
|
use = vobj_use,
|
2010-06-22 16:03:40 +03:00
|
|
|
save = vobj_save };
|
|
|
|
end
|
|
|
|
|
|
|
|
function vway(name, dsc, w)
|
|
|
|
-- o.object_type = true;
|
|
|
|
return obj{ nam = tostring(name),
|
2010-06-23 09:05:25 +03:00
|
|
|
vobject_type = true,
|
2010-06-22 16:03:40 +03:00
|
|
|
dsc = dsc,
|
|
|
|
act = vobj_act,
|
|
|
|
where = deref(w),
|
2010-06-23 09:05:25 +03:00
|
|
|
used = vobj_used,
|
|
|
|
use = vobj_use,
|
2010-06-22 16:03:40 +03:00
|
|
|
save = vobj_save };
|
|
|
|
end
|
2010-06-23 09:05:25 +03:00
|
|
|
|
|
|
|
function isVobject(v)
|
|
|
|
return (type(v) == 'table') and (v.vobject_type)
|
|
|
|
end
|
2010-06-30 10:27:36 +03:00
|
|
|
|
|
|
|
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);
|
2010-07-14 16:23:24 +03:00
|
|
|
if not isObject(o) then
|
2010-06-30 10:27:36 +03:00
|
|
|
error ("No object: "..tostring(v))
|
|
|
|
return false
|
|
|
|
end
|
2010-07-14 19:11:20 +03:00
|
|
|
if isObject(deref(v)) and not v._dynamic_type then -- no named object!
|
2010-06-30 10:27:36 +03:00
|
|
|
local n = stead.string.format("%s[%d]", name, ii);
|
|
|
|
v = allocator:new(n);
|
|
|
|
self[ii] = v;
|
2010-07-13 09:42:08 +03:00
|
|
|
v.auto_allocated = true;
|
2010-06-30 10:27:36 +03:00
|
|
|
for_each(v, n, check_list, isList, deref(v));
|
|
|
|
else
|
|
|
|
self[ii] = o;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return true;
|
|
|
|
end
|
|
|
|
|
|
|
|
function list_add(self, name, pos)
|
2010-07-15 09:59:57 +03:00
|
|
|
local nam = name
|
|
|
|
if stead.initialized then
|
|
|
|
nam = ref(name);
|
|
|
|
end
|
|
|
|
if not nam then
|
|
|
|
error ("Add wrong object to list: "..tostring(name), 2);
|
|
|
|
end
|
2010-06-30 10:27:36 +03:00
|
|
|
if self:look(nam) then
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
self.__modified__ = true;
|
2010-07-14 20:59:49 +03:00
|
|
|
if isObject(deref(nam)) then
|
|
|
|
nam._dynamic_type = true
|
|
|
|
end
|
2010-06-30 10:27:36 +03:00
|
|
|
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)
|
2010-07-15 09:59:57 +03:00
|
|
|
local nam = name
|
2010-06-30 10:27:36 +03:00
|
|
|
local i = tonumber(pos);
|
|
|
|
if not i then
|
|
|
|
return nil
|
|
|
|
end
|
2010-07-15 09:59:57 +03:00
|
|
|
if stead.initialized then
|
|
|
|
nam = ref(name);
|
|
|
|
end
|
|
|
|
if not nam then
|
|
|
|
error ("Set wrong object in list: "..tostring(name), 2);
|
|
|
|
end
|
2010-07-14 20:59:49 +03:00
|
|
|
if isObject(deref(nam)) then
|
|
|
|
nam._dynamic_type = true
|
|
|
|
end
|
2010-06-30 10:27:36 +03:00
|
|
|
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
|
|
|
|
|
2010-07-12 10:28:09 +03:00
|
|
|
function list_str(self)
|
|
|
|
local i, v, vv, o;
|
|
|
|
for i,o in opairs(self) do
|
|
|
|
o = ref(o);
|
|
|
|
if isObject(o) and not isDisabled(o) then
|
2010-07-12 11:20:41 +03:00
|
|
|
vv = nil
|
|
|
|
if game.gui then
|
|
|
|
vv = call(o, 'disp');
|
|
|
|
end
|
2010-07-12 10:28:09 +03:00
|
|
|
if type(vv) ~= 'string' then
|
|
|
|
vv = call(o, 'nam');
|
|
|
|
end
|
|
|
|
vv = xref(vv, o);
|
|
|
|
v = stead.par(',', v, vv);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return v;
|
|
|
|
end
|
|
|
|
|
2010-07-13 09:42:08 +03:00
|
|
|
function list_save(self, name, h, need)
|
|
|
|
if self.__modified__ then
|
|
|
|
local i,v
|
|
|
|
for i,v in ipairs(self) do -- dump auto objs
|
|
|
|
if isObject(v) and v.auto_allocated then
|
|
|
|
v:save(v.key_name, h, true, true);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
h:write(name.." = list({});\n");
|
|
|
|
need = true;
|
|
|
|
end
|
|
|
|
savemembers(h, self, name, need);
|
|
|
|
end
|
|
|
|
|
2010-07-12 10:28:09 +03:00
|
|
|
function obj_str(self)
|
|
|
|
local i, v, vv, o;
|
|
|
|
if not isObject(self) then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if isDisabled(self) then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
for i,o in opairs(self.obj) do
|
|
|
|
o = ref(o);
|
|
|
|
if isObject(o) and not isDisabled(o) then
|
2010-07-12 11:20:41 +03:00
|
|
|
vv = nil
|
|
|
|
if game.gui then
|
|
|
|
vv = call(o, 'disp');
|
|
|
|
end
|
2010-07-12 10:28:09 +03:00
|
|
|
if type(vv) ~= 'string' then
|
|
|
|
vv = call(o, 'nam');
|
|
|
|
end
|
|
|
|
vv = xref(vv, o);
|
|
|
|
v = stead.par(',', v, vv, obj_str(o));
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return v;
|
|
|
|
end
|
|
|
|
|
2010-07-02 09:40:21 +03:00
|
|
|
function path(w, wh) -- search in way, disabled too
|
2010-07-01 19:42:27 +03:00
|
|
|
if not wh then
|
|
|
|
wh = here();
|
|
|
|
else
|
|
|
|
wh = ref(wh);
|
|
|
|
end
|
2010-07-02 09:40:21 +03:00
|
|
|
local o = ways(wh):srch(w, true);
|
2010-07-01 19:42:27 +03:00
|
|
|
o = ref(o);
|
|
|
|
if isRoom(o) then
|
|
|
|
return o
|
|
|
|
end
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
2010-06-30 10:27:36 +03:00
|
|
|
game.lifes = list(game.lifes)
|
2010-07-06 11:14:42 +03:00
|
|
|
stead:init(); -- reinit ob
|
2010-07-06 13:15:27 +03:00
|
|
|
|
|
|
|
-- vim:ts=4
|