--[[ Общие утилиты для игр на Instead. Скорее всего будут повторно использоваться в следующих играх, если таковые будут. ]] --[[ ]] ArrayUtils = { indexOf = function(array, item) for i = 1, #array do if (array[i] == item) then return i; end; end; return 0; end; }; --[[ ]] PartyUtils = { addToParty = function(object) if (object.home) then if (ArrayUtils.indexOf(pl.party, object.nam) == 0) then move(object, object.home); table.insert(pl.party, object.nam); end; end; end; }; --[[ functions, design to simplify some typical actions while developing Instead game ]] EngineUtils = { getValue = function(source, param) local value = ""; if (type(source) == "function") then value = source(param); else value = source; end; return value; end; }; --[[ internal space ]] _kh = { vroom_enter = function(s) walk(EngineUtils.getValue(s.where)); end; vroom_save = function(s) if need then local t = stead.string.format("%s = kh_vroom(%s, %q, %s);\n", name, stead.tostring(self.disp), stead.deref(self.where), stead.deref(self.nam)); h:write(t); end stead.savemembers(h, self, name,false); end; }; function kh_vway(disp, dsc, target, seen_level) local temp = vway(disp, dsc, target); temp.seen_level = seen_level; return temp; end; --[[ vroom with additional functionality ]] function kh_vroom(disp, target, seen_level) return room { nam = disp; disp = disp; where = target; enter = _kh.vroom_enter; seen_level = seen_level; --enter = _kh.vroom_enter; --save = _kh.vroom_save; }; end; obj = inherit(obj, function(v) v.disable_implicit = hook(v.disable, function(f, s, ...) s._disabled_implicit = true; return f(s, unpack(arg)); end); v.disable = hook(v.disable, function(f, s, ...) s._disabled_explicit = true; return f(s, unpack(arg)); end); v.enable_implicit = hook(v.enable, function(f, s, ...) s._disabled_implicit = false; if (s._disabled_explicit) then return s; --mimic original enable() behavior else return f(s, unpack(arg)); end; end); v.enable = hook(v.enable, function(f, s, ...) s._disabled_explicit = false; if (s._disabled_implicit) then return s; --mimic original enable() behavior else return f(s, unpack(arg)); end; end); return v; end); --[[ character object represents character, with whom you can interact ]] function character(tab) if (not tab.act) then tab.act = function(s) if (s.dlg) then walkin(s.dlg); else return s.phrases[rnd(#s.phrases)]; end; end; end; return obj(tab); end; function darkroom(tab) local life; local entered; local left; if (not tab.has_light) then tab.has_light = false; end; if (tab.life) then life = tab.life; end; if (tab.entered) then entered = tab.entered; end; if (tab.left) then left = tab.left; end; tab.entered = function(s) lifeon(s); if (entered) then entered(s); end; end; tab.left = function(s) lifeoff(s); if (left) then left(s); end; end; tab.life = function(s) if (s.has_light) then -- show all objects that were not explicitly disabled(any seen_level) for i = 1, #objs(s) do objs(s)[i]:enable_implicit(); end; for i = 1, #ways(s) do ways(s)[i]:enable_implicit(); end; elseif (pl.has_light) then -- show all objects that were not explicitly disabled and marked as seen in halflight (seen_level = 1 or higher) for i = 1, #objs(s) do if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 1) then objs(s)[i]:enable_implicit(); else objs(s)[i]:disable_implicit(); end; end; for i = 1, #ways(s) do if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 1) then ways(s)[i]:enable_implicit(); else ways(s)[i]:disable_implicit(); end; end; else -- show all objects that were not explicitly disabled and marked as seen in darkness (seen_level = 2 or higher) for i = 1, #objs(s) do if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 2) then objs(s)[i]:enable_implicit(); else objs(s)[i]:disable_implicit(); end; end; for i = 1, #ways(s) do if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 2) then ways(s)[i]:enable_implicit(); else ways(s)[i]:disable_implicit(); end; end; end; if (life) then life(s); end; end; if (not tab.dsc) then tab.dsc = function(s) if (s.has_light) then return s.dsc_lit; elseif (pl.has_light) then return s.dsc_halflit; else return s.dsc_dark; end; end; end; return room(tab); end;