65 lines
1.2 KiB
Lua
65 lines
1.2 KiB
Lua
function xobj(v) -- object without name and dsc, but with xact attribute
|
|
if v.nam == nil then
|
|
v.nam = ''
|
|
end
|
|
if v.dsc == nil then
|
|
v.dsc = ''
|
|
end
|
|
v.xact = v.act
|
|
v.act = function(s)
|
|
local r,v = call(s, 'xact');
|
|
if type(r) == 'string' then r = do_xact(r) end
|
|
return r,v
|
|
end
|
|
return obj(v)
|
|
end
|
|
|
|
xact = function(f) -- just simple action!
|
|
local v = {};
|
|
v = xobj(v);
|
|
v.xact = f;
|
|
return v
|
|
end
|
|
|
|
do_xact = function(str)
|
|
local xrefrep = function(str)
|
|
local s = stead.string.gsub(str,'[{}]','');
|
|
local o = stead.string.gsub(s,'^(.*):.*$','%1');
|
|
local d = stead.string.gsub(s,'^.*:(.*)$','%1');
|
|
return xref(d, ref(o));
|
|
end
|
|
if type(str) ~= 'string' then return end
|
|
local s = stead.string.gsub(str,'{[^}]+}', xrefrep);
|
|
return s;
|
|
end
|
|
|
|
xdsc = function(v)
|
|
v.nam = ''
|
|
v.xdsc = v.dsc
|
|
v.dsc = function(s)
|
|
local str = call(s, 'xdsc');
|
|
if type(str) == 'string' then
|
|
return do_xact(str);
|
|
end
|
|
return str
|
|
end
|
|
return obj(v)
|
|
end
|
|
|
|
xdsc_obj = obj {
|
|
nam = '',
|
|
dsc = function(s)
|
|
local str = call(here(), 'xdsc');
|
|
if type(str) == 'string' then
|
|
return do_xact(str);
|
|
end
|
|
return str
|
|
end,
|
|
}
|
|
|
|
function xroom(v)
|
|
v = room(v)
|
|
v.obj:add('xdsc_obj', 1); -- first object is always meta-descriptor
|
|
return v;
|
|
end
|