This repository has been archived on 2019-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
adventin/stead/object.lua

276 lines
5.8 KiB
Lua
Raw Normal View History

2010-09-16 12:09:02 +03:00
function player_action(self, what, ...)
local v,r,obj
obj = _G[what];
if not isXaction(obj) then
2011-07-27 16:11:29 +03:00
obj = stead.ref(self.where):srch(what);
2010-09-16 12:09:02 +03:00
end
if not obj then
2011-07-27 13:21:20 +03:00
return stead.call(game, 'action', what, ...); --player_do(self, what, ...);
2010-09-16 12:09:02 +03:00
end
2011-02-23 12:11:27 +02:00
v, r = player_take(self, what, ...);
2010-09-16 12:09:02 +03:00
if not v then
2011-07-27 13:21:20 +03:00
v, r = stead.call(obj, 'act', ...);
2010-09-16 12:09:02 +03:00
if not v and r ~= true then
2011-07-27 13:21:20 +03:00
v, r = stead.call(game, 'act', obj, ...);
2010-09-16 12:09:02 +03:00
end
end
return v, r;
end
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
2011-07-27 16:11:29 +03:00
obj = stead.ref(self.where):srch(what); -- in scene?
2010-06-25 12:31:54 +03:00
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
2011-02-23 12:11:27 +02:00
return self:action(what, ...); -- call act
2010-06-25 12:31:54 +03:00
else
2011-07-27 16:11:29 +03:00
v, r = stead.call(stead.ref(obj),'inv', ...); -- call inv
2010-06-25 12:31:54 +03:00
end
if not v and r ~= true then
2011-07-27 13:21:20 +03:00
v, r = stead.call(game, 'inv', obj, ...);
2010-06-25 12:31:54 +03:00
end
return v, r;
2010-06-20 18:47:49 +03:00
end
2011-07-27 16:11:29 +03:00
obj2 = stead.ref(self.where):srch(onwhat); -- in scene?
2010-06-25 12:31:54 +03:00
if not obj2 then
obj2 = self:srch(onwhat); -- in inv?
2010-06-20 18:47:49 +03:00
end
2010-07-15 13:20:29 +03:00
if not obj2 then
2010-06-25 12:31:54 +03:00
return game.err, false;
2010-06-20 18:47:49 +03:00
end
2010-06-25 12:31:54 +03:00
2011-07-27 16:11:29 +03:00
obj = stead.ref(obj)
obj2 = stead.ref(obj2)
2010-06-25 12:31:54 +03:00
if not scene_use_mode or isSceneUse(obj) then
2011-07-27 13:21:20 +03:00
v, r = stead.call(obj, 'use', obj2, ...);
2010-06-25 12:31:54 +03:00
if r ~= false then
2011-07-27 13:21:20 +03:00
vv = stead.call(obj2, 'used', obj, ...);
2010-06-25 12:31:54 +03:00
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
2011-07-27 13:21:20 +03:00
v, r = stead.call(game, 'use', obj, obj2, ...);
2010-06-20 18:47:49 +03:00
end
2011-05-12 22:55:13 +03:00
if not v and not vv then
2011-05-12 19:51:54 +03:00
return
end
v = stead.par(' ', v, vv);
if v == nil and stead.api_version >= "1.3.5" then
return true
end
return v
2010-06-25 12:31:54 +03:00
end
function vobj_save(self, name, h, need)
2011-07-27 16:11:29 +03:00
local w = stead.deref(self.where)
2010-06-30 07:46:24 +03:00
local dsc = self.dsc
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)));
end
stead.savemembers(h, self, name, false);
end
function vobj_act(self, ...)
local o, r = here():srch(self); -- self.nam
2011-07-27 16:11:29 +03:00
if stead.ref(o) and stead.ref(o).where then
return goto(stead.ref(o).where);
end
2011-07-27 16:11:29 +03:00
return stead.call(stead.ref(r),'act', self.nam, ...);
end
function vobj_used(self, ...)
local o, r = here():srch(self.nam);
2011-07-27 16:11:29 +03:00
return stead.call(stead.ref(r),'used', self.nam, ...);
end
2010-06-23 09:05:25 +03:00
function vobj_use(self, ...)
local o, r = here():srch(self.nam);
2011-07-27 16:11:29 +03:00
return stead.call(stead.ref(r),'use', self.nam, ...);
2010-06-23 09:05:25 +03:00
end
function vobj(name, dsc, w)
return obj{ nam = tostring(name),
2010-06-23 09:05:25 +03:00
vobject_type = true,
dsc = dsc,
2011-07-27 16:11:29 +03:00
where = stead.deref(w),
act = vobj_act,
used = vobj_used,
2010-06-23 09:05:25 +03:00
use = vobj_use,
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,
dsc = dsc,
act = vobj_act,
2011-07-27 16:11:29 +03:00
where = stead.deref(w),
2010-06-23 09:05:25 +03:00
used = vobj_used,
use = vobj_use,
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
2011-07-27 16:11:29 +03:00
local o = stead.ref(v);
2010-07-14 16:23:24 +03:00
if not isObject(o) then
2011-07-28 17:51:43 +03:00
error ("No object: "..name.."["..tostring(ii).."]".." ("..tostring(type(v))..")")
2010-06-30 10:27:36 +03:00
return false
end
2011-07-27 16:11:29 +03:00
if (v.auto_allocated and not stead.ref(v.key_name)) -- renew
or (isObject(stead.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);
2010-07-19 22:41:40 +03:00
v = allocator:new(n, n);
2010-06-30 10:27:36 +03:00
self[ii] = v;
2010-07-13 09:42:08 +03:00
v.auto_allocated = true;
2011-07-28 20:03:37 +03:00
for_each(v, n, stead.check_list, isList, stead.deref(v));
2010-06-30 10:27:36 +03:00
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
2011-07-27 16:11:29 +03:00
nam = stead.ref(name);
2010-07-15 09:59:57 +03:00
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;
2011-07-27 16:11:29 +03:00
if isObject(stead.deref(nam)) then
2010-07-14 20:59:49 +03:00
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
2011-07-27 16:11:29 +03:00
nam = stead.ref(name);
2010-07-15 09:59:57 +03:00
end
if not nam then
error ("Set wrong object in list: "..tostring(name), 2);
end
2011-07-27 16:11:29 +03:00
if isObject(stead.deref(nam)) then
2010-07-14 20:59:49 +03:00
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
2011-07-27 16:11:29 +03:00
o = stead.ref(o);
2010-06-30 10:27:36 +03:00
if pos == nil then
self:add(o);
else
self:add(o, pos);
pos = pos + 1;
end
end
end
2010-09-16 19:27:21 +03:00
stead.delim = '|'
2010-07-25 19:06:50 +03:00
2010-07-12 10:28:09 +03:00
function list_str(self)
local i, v, vv, o;
for i,o in opairs(self) do
2011-07-27 16:11:29 +03:00
o = stead.ref(o);
2010-07-12 10:28:09 +03:00
if isObject(o) and not isDisabled(o) then
vv = nil
if game.gui then
2011-07-27 13:21:20 +03:00
vv = stead.call(o, 'disp');
end
2010-07-12 10:28:09 +03:00
if type(vv) ~= 'string' then
2011-07-27 13:21:20 +03:00
vv = stead.call(o, 'nam');
2010-07-12 10:28:09 +03:00
end
2011-07-29 13:08:26 +03:00
vv = stead.xref(vv, o);
2010-07-26 09:55:56 +03:00
v = stead.par(stead.delim, v, vv);
2010-07-12 10:28:09 +03:00
end
end
return v;
end
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
2011-07-27 16:11:29 +03:00
o = stead.ref(o);
2010-07-12 10:28:09 +03:00
if isObject(o) and not isDisabled(o) then
vv = nil
if game.gui then
2011-07-27 13:21:20 +03:00
vv = stead.call(o, 'disp');
end
2010-07-12 10:28:09 +03:00
if type(vv) ~= 'string' then
2011-07-27 13:21:20 +03:00
vv = stead.call(o, 'nam');
2010-07-12 10:28:09 +03:00
end
2011-07-29 13:08:26 +03:00
vv = stead.xref(vv, o);
2010-07-26 09:55:56 +03:00
v = stead.par(stead.delim, v, vv, obj_str(o));
2010-07-12 10:28:09 +03:00
end
end
return v;
end
function path(w, wh) -- search in way, disabled too
2010-07-01 19:42:27 +03:00
if not wh then
wh = here();
else
2011-07-27 16:11:29 +03:00
wh = stead.ref(wh);
2010-07-01 19:42:27 +03:00
end
local o = ways(wh):srch(w, true);
2011-07-27 16:11:29 +03:00
o = stead.ref(o);
2010-07-01 19:42:27 +03:00
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