-- $Name: Вахта$ -- $Version: 0.2$ instead_version "1.9.1" require "lib" require "para" require "dash" require "quotes" require "timer" require "xact" game.use = "Ошибка программы! Ээээ... т.е. нет, так лучше не делать." local oob = obj; function tc(f,s) if type(f) == "function" then return tc(f(s),s) else return f end end function obj(t) local d = t.dsc; t.dsc = function(s) if s.cnd == nil or s:cnd() then return tc(d,s) end end return oob(t); end main = timerpause(999, 700, "main2"); main2 = room { _hand=false, nam = "...", enter = music_("square",0), title = { "В", "А", "Х", "Т", "А" }, num =5, act = function(s) walk(wakeup)end, dsc="Я -- вахтенный робот WR005. Раз в сто лет я выхожу из режима гибернации и несу на корабле вахту на протяжении года, а потом снова отключаюсь. Куда корабль летит я не знаю -- этого нет в моих банках памяти. Но я знаю, что весь экипаж в глубокой криозаморозке.^^И вот вновь настала моя очередь дежурить. Я включаюсь...", obj = { vobj("next", '{Начать игру}') } } wakeup = room { nam = "Пробуждение",_s=1,_f=0, dsc = function(s) return s._dsc end, _dsc = [[Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]], timer = function(s) s._f=s._f+1; if s._f==1 then s._dsc=s._dsc.."^"..s.diags[s._s]; elseif s._f>1 and s._f<5 then s._dsc=s._dsc.."."; elseif s._f==5 then if s._s==4 then s._dsc=s._dsc.." ошибка! отсутствует правая рука!"; timer:stop(); s._do=true; else s._dsc=s._dsc.." нормально"; s._f=0; s._s=s._s+1; end end walk(wakeup); end, diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"}, obj = { xact("diag", code[[timer:set(500)]]), "wakeup_next" } } wakeup_next = obj { nam="wakeup_next", cnd=function()return wakeup._do end, dsc="{Продолжить}", act=function()walk(cabin1)end } cabin1 = room { nam = "Отсек WR005",_closed=false, pxa = { { if_("exist(oil)","oil"), 80, 100 }, { if_("cabin1._closed", "door4", "door2_open"), 190 } }, enter=function(s) if s._closed thenp (_("Дверь в мой отсек закрыта. Надо будет потом придумать, как её снова открыть. Но на этом у меня есть целый год.")); return false; end end, exit=function(s)if s._closed thenp (_("Сначала нужно открыть дверь."));return false; end end, dsc = "Я нахожусь в своем отсеке. Здесь я провел сто лет в режиме гибернации.", obj={"cabin1_walls","oil","button","cabin1_door"}, way = {"block"} } cabin1_walls=obj { nam="",dsc="Здесь почти ничего нет -- голые металлические стены. В свою прошлую вахту я так и не успел тут всё как следует обставить. Может, в этот раз найдётся время." } oil=obj { nam="Маслёнка",dsc="На узенькой полке на стене справа лежит {маслёнка}.", tak="Я беру маслёнку. Масло всегда пригодится.", inv="Маслёнка. Почти полная.", use=function(s,v) if v==hand then hand._oil=true; remove(oil,me()); return (_("Я смазываю маслом все гайки на правой руке моего коллеги. Теперь я должен без проблем её открутить.")); end end } button=obj { nam="",dsc="У двери красуется огромная {красная кнопка}.", act=function() local t="Я нажимаю на кнопку, и дверь "; if cabin1._closed then t=t.."открывается." else t=t.."закрывается." end cabin1._closed=not cabin1._closed;return t; end } cabin1_door=obj { nam="",dsc=function()if cabin1._closed then return (_("Сейчас дверь закрыта." else return (_("Сейчас дверь открыта.")))) end end } block = room { nam = "Технический блок", pxa = { { "toolbox", 440}, { if_("cabin1._closed", "door4", "door2_open"), 10 }, { if_("main2._hand", "robot_nohand", "robot"), 187 }, { if_("cabin1._closed", "door2_open", "door4"), 150 }, { "door1", 300 }, }, dsc = "Технический блок №2. Здесь есть два отсека для вахтенных роботов и большая толстая дверь в коридор, который ведёт на главную палубу.", obj = {"blockbutton","toolbox","key","tube"}, way = {"cabin1","cabin2",vroom("Коридор","endgame1")} } blockbutton=obj { nam="", dsc="Отсюда я вижу проход в мой отсек. Если встать под углом сорок пять градусов, то можно даже заметить большу {круглую кнопку}, которая закрывает дверь отсека.", act="Я, конечно, могу дотянуться до кнопки, но тогда дверь опустится и отрубит мою единственную руку.", cnd=function(s)return not cabin1._closed end } toolbox=obj { nam="", dsc = "В углу лежит {ящик с инструментами}.", act=function(s) if key._taken then return (_("В ящике больше нет ничего полезного.")); else s._exam=true; return (_("Я ящике лежит большой гаечный ключ.")); end end } key=obj { nam="Гаечный ключ", dsc="В ящике -- {гаечный ключ}.", inv="Гаечный ключ -- старомодно, но удобно. Хорошо подходит для того, чтобы откручивать руки.", tak=function(s) s._taken=true;return (_("Я взял гаечный ключ.")) end, use=function(s,v) if v==tube and not tube._done then tube._done=true; take(tube); return (_("Всё-таки гаечный ключ -- полезная штука! Раз-раз, и негодная труба выломана из стены. Теперь всё выглядит идеально.")); elseif v==hand and not hand._oil then return (_("Я пытаюсь открутить руку ключом, но ничего не выходит. Ни одна из гаек не желает поворачиваться.")); elseif v==hand and hand._oil and not main2._hand then main2._hand=true; remove(key,me()); return (_("Пара капель масла и... всё как по маслу! Я без проблем откручиваю у своего коллеги руку и приделываю эту руку себе. Ну, наконец-то! У меня снова две руки!")); end end, cnd=function()return toolbox._exam end } tube=obj { nam="Обломок трубы",dsc="Из стены рядом с дверью в коридор торчит какая-то мятая {труба}. Труба еле держится.", act="Без понятия, что это такое. Этого нет в моих банках памяти. Раз нет в банках памяти -- значит я за это не отвечаю. Да и вообще мятая труба как-то портит вид. Я пытаюсь выломать трубу из стены, но у меня ничего не получается.", inv="Мятый обломок трубы. Выглядит отвратительно.", use=function(s,v) if v==blockbutton and have(oil) then cabin1._closed=true; remove(tube,me()); return (_("Да, отличная идея! Я встаю под углом в 45 градусом, просовываю в дверной проём трубу и касаюсь круглой кнопки. Дверь тут же опускается и поднимает под себя трубу. Так ей и надо, этой трубе. К тому же теперь мой отсек закрыт... Правда, мне потом потребуется ещё одна труба, чтобы попасть обратно.")); elseif v==blockbutton then return (_("Ошибка! Тупиковая ситуация! Эээ... нет, мне кажется я что-то ещё не сделал.")); end end } cabin2=room { nam = "Отсек WR006", pxa = { { "door1_open", 80 }, { if_("main2._hand", "robot_nohand", "robot"), 220 } }, enter = function(s) if not cabin1._closed thenp (_("Дверь в отсек WR006 закрыта. Она откроется только, когда будет закрыта дверь в мой отсек. Вот так здесь всё устроено."));return false; end end, dsc = "Это отсек другого вахтенного робота -- он старше меня ровно на единицу.", obj = {"robot","hand"}, way = {"block"} } robot=obj { nam="",dsc="{Мой коллега} сейчас отключён и стоит неподвижно, как колонны, подпирающие потолок в коридоре.", act=function() if main2._hand then return (_("Надеюсь, он не сильно расстроится, когда увидит, что у него нет правой руки." else return (_("Спать ему ещё целую сотню лет.")))) end end } hand=obj { nam="",dsc="Его {правая рука} на месте.", act="Кстати, я не говорил, что мы полностью совместимы? Да, это наводит на мысли... Правда, тут нужны инструменты.", cnd=function() return not main2._hand end } endgame1=room{ nam="",enter=function(s) if not main2._hand then p "Я не могу открыть дверь в коридор без моей правой руки. В неё встроен чип-ключ. Да и вообще без руки я не смогу нести вахту."; return false; else timer:set(4000) end end, dsc=txtc("Прошло сто лет..."), timer=function()timer:stop();walk(endgame2)end } endgame2=room { nam = "Пробуждение",_s=1,_f=0, dsc = function(s) return s._dsc end, _dsc = [[Я робот WR006. Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]], timer = function(s) s._f=s._f+1; if s._s==5 then mute_()(); complete_("watch")(); s._s=6; s._dsc=s._dsc.."^^"..txtc("{next|КОНЕЦ?}"); timer:stop(); walk(endgame2); return; end if s._f==1 then s._dsc=s._dsc.."^"..s.diags[s._s]; elseif s._f>1 and s._f<5 then s._dsc=s._dsc.."."; elseif s._f==5 then if s._s==4 then s._dsc=s._dsc.." ошибка! отсутствует правая рука!"; s._s=5; else s._dsc=s._dsc.." нормально"; s._f=0; s._s=s._s+1; end end walk(endgame2); end, diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"}, obj = { xact("diag", code[[timer:set(500)]]), xact("next", code[[gamefile_("brokencycle.lua")()]]) } }