--$Name: Разорванный цикл$ --$Version: 1.0$ --$Author: Андрей Лобанов instead_version "1.9.1" require "lib" require "para" require "dash" require "quotes" require "timer" require "xact" game.use=_('Не получается.') main=room{ nam='...', enter = music_("spell",0), title = _("РАЗОРВАННЫЙ ЦИКЛ"), num = 6, dsc=_('Сознание вернулось. А в месте с ним вернулись мрак и холод.'), act=code 'walk(capsule)', obj={vobj('', '{'.._('Открыть глаза')..'}')}, } capsule=room{ nam=_('Капсула'), dsc=_('Я нахожусь в капсуле криосна.'), obj={'capsule_cap'}, } capsule_cap=obj{ _seen=false, nam=_('Крышка'), dsc=_('Я вижу {крышку} капсулы.'), act=function(s) if not s._seen then s._seen=true put(button) return _('Рядом с крышкой я заметил кнопку аварийного открытия капсулы.') else return _('Не получается открыть её изнутри.') end end, } button=obj{ nam=_('Кнопка'), dsc=_('Рядом находится {кнопка}.'), act=function() if not path(k007) then ways():add(k007) return _('Я нажал на кнопку и крышка плавно отъехала в сторону.') else return _('Крышка уже открыта.') end end, } k007=room{ nam=_('K007'), dsc=_('Тёмный отсек.'), pxa = { { "door4", 10 }, { "panel", 220 }, { "crio", 300 } }; obj={'mcapsule','capsules','cabinets','cabinet'}, exit=function(s,w) if w==crioblock and not have(cloth) then p(_('Мне холодно. Да и разгуливать по кораблю в одних трусах нет никакого желания.')) return false end end, way={'capsule','crioblock'}, } mcapsule=obj{ nam=_('Капсула'), dsc=_('Крышка моей {капсулы} открыта.'), act=_('Ничего примечательного.'), obj={'display'}, } display=obj{ nam=_('Экран'), dsc=_('Рядом с открытой крышкой находится {блок} управления криосном.'), act=_('На экран выведено сообщение о поломке капсулы. Странно, что вахтенный робот не предпринял никаких действий.'), } capsules=obj{ nam=_('Капсулы'), dsc=_('Вокруг меня пять других {капсул} криосна.'), act=_('В каждой капсуле находится человек. Интересно почему я вышел из криосна.') } cabinets=obj{ nam=_('Шкафы'), dsc=_('Напротив капсул находятся {шкафы} с вещами членов экипажа.'), act=function() if not have(cloth) then take(cloth) return _('Я открыл свой шкаф и взял свою одежду.') else return _('Шкаф пуст.') end end, } cloth=obj{ nam=_('Одежда'), inv=_('Стандартная форма члена экипажа.'), use=function(s,w) if w==sparecabinet then inv():del(s) return _('Я сложил одежду в шкаф.') end end, } cabinet=obj{ nam=_('Шкаф'), dsc=_('{Один} из шкафов сильно повреждён.'), act=_('Такое впечатление, что его били чем-то увесистым.'), } crioblock=room{ nam=_('Криоблок'), _grate=0, pxa = { { "box3", 20 }, { if_("exist(grenade)","extin"), 90 }, { "window", 170 }, { function(s) if s._grate == 1 then return "shaft"; elseif s._grate == 2 then return "shaft_open"; end end, 440}, { "door2", 300 } }, dsc=_('Коридор едва освещён.'), obj={'grenade','lift'}, way={'k007'}, } grenade=obj { nam=_('Огнетушитель'), dsc=function() if here()==crioblock then return _('Рядом с пожарным шкафчиком лежит {огнетушитель}.') else return _('На полу лежит {огнетушитель}.') end end, tak=_('Я поднял огнетушитель.'), inv=_('Похоже, им кто-то уже воспользовался.'), use=function(s,w) if w==grate then if here()==crioblock then crioblock._grate=2; objs(lift):del(w) ways():add(shaft) else here()._grate=true; objs():del(w) ways():add(techblock) end objs():del(grate) return _('Я выломал решётку огнетушителем.') elseif w==button2 and not sparehand._not then cell21._opened=true cell20._opened=nil, objs(cell20):del(robot) objs(cell20):del(button2) objs(cell21):add(robot) drop(s) return _('Я швырнул огнетушитель в кнопку, он нажал её и выкатился обратно в технический блок прежде чем дверь закрылась.') else return _('Не нужно крушить всё подряд.') end end, } lift=obj{ nam=_('Лифт'), dsc=_('Двери {лифта} закрыты.'), act=function(s) v=_('Я нажал на кнопку вызова, но лифт не приехал.') if not s._seen then s._seen=0 elseif s._seen==0 then s._seen=1 elseif s._seen==1 then s._seen=2 crioblock._grate=1; put(grate,s) v=v..' '.._('Рядом с лифтом я заметил вентиляционное отверстие.') end return v end, } grate=obj{ nam=_('Решётка'), dsc=function() if here()==crioblock then return _('Рядом с лифтом находится {решётка} вентиляционной шахты.') else return _('Здесь есть {решётка}.') end end, act=_('Металлическая решётка.'), } shaft=room{ nam=_('Шахта'),_grate=false, pxa = { { if_("shaft._grate", "shaft_open", "shaft"), 217 } }, dsc=_('Я нахожусь на дне вентиляционной шахты.'), enter=function(s) if not s._seen then s._seen=true return _('Я залез в шахту и попытался удержаться, упёршись руками и коленями в стенки, но после криосна силы ещё не полностью вернулись ко мне и я упал вниз.') end end, obj={'grate'}, } techblock=room{ nam=_('Технический блок'), dsc=_('Технический блок №10.'), pxa = { { if_("not _endgame", "robot_nohand"), 47 }, { if_("cell20._opened","door2_open","door4"), 10 }, { if_("have(hand)", "robot_nohand", "robot"), 177 }, { if_("cell21._opened","door2_open","door4"), 140 }, { "toolbox", 300 }, { if_("door._opened","door1_open","door1"), 370 } }, exit=function() if not sparehand._not then if have(hand) then p(_('Нужно прикрутить руку обратно.')) return false elseif have(wrench) then p(_('Незачем таскать с собой гаечный ключ.')) return false end end end, obj={'cell20','cell21','box','door'}, way={'shaft'}, } cell21=obj{ nam=_('Отсек №21'), dsc=function(s) local v v=_('{Дверь} отсека №21')..' ' if s._opened then v=v.._('открыта.') else v=v.._('закрыта.') end return v end, act=function(s) if not s._opened then return _('Мне не открыть эту дверь руками.') else return _('Дверь открыта.') end end, } cell20=obj{ _opened=true, nam=_('Отсек №20'), dsc=function(s) local v v=_('{Дверь} отсека №20')..' ' if s._opened then v=v.._('открыта.') else v=v.._('закрыта.') end return v end, act=_('Стандартный отсек, в котором робот пребывает во время гибернации.'), obj={'robot','button2'}, } button2=obj{ nam=_('Кнопка'), dsc=_('В отсеке №20 на стене находится большая круглая {кнопка}.'), act=_('Если я её нажму, то просто останусь в отсеке с роботом на ближайшие 99 лет.'), } robot=obj{ nam=_('Робот'), dsc=_('В отсеке находится вахтенный {робот}.'), act=function(s) if exist(s,cell20) then return _('У робота отсутствует правая рука.') else return _('Стандартный вахтенный робот.') end end, } hand=obj{ nam=_('Рука робота'), inv=_('Стандартная правая рука вахтенного робота. На ней есть универсальный ключ.'), use=function(s,w) if w==door and not w._opened then door._opened=true ways():add(deck) return _('Я использовал ключ на руке робота чтобы открыть дверь на главную палубу.') elseif w==robot then if have(wrench) then inv():del(hand) return _('Я прикрутил руку на место.') else return _('Мне нечем прикрутить руку.') end end end, } box=obj{ nam=_('Ящик'), dsc=_('На полу лежит {ящик} с инструментами.'), act=function(s) if not have(wrench) then take(wrench) return _('Я взял гаечный ключ.') else return _('В ящике больше нет ничего полезного.') end end, } wrench=obj{ nam=_('Гаечный ключ'), inv=_('Обычный разводной ключ.'), use=function(s,w) if w==robot and exist(robot,cell21) and not have(hand) and not path(deck) then take(hand) return _('Я открутил правую руку у робота WR021.') elseif w == box then drop(s,box) return _('Я положил ключ обратно в ящик.') elseif w==sparehand and sparehand._not then walk(hend) end end, } door=obj{ nam=_('Дверь'), dsc=_('Большая {дверь}, ведущая на главную палубу, находится напротив отсеков с роботами.'), act=function(s) if not s._opened then return _('Для открытия двери нужен ключ, который находится на правой руке роботов.') else return _('Дверь открыта.') end end, } deck=room{ nam=_('Главная палуба'), pxa = { { "door2", 189 }, { "window", 125 }, { "window", 351 } }, dsc=_('Я нахожусь на главной палубе.'), obj={'mainlift'}, way={'techblock'}, } mainlift=obj{ nam=_('Лифт'), dsc=_('Здесь находятся двери главного {лифта} корабля.'), act=function() if not path(liftinside) then ways():add(liftinside) return _('Я вызвал лифт.') else return _('Лифт уже здесь.') end end, } liftinside=room{ nam=_('Главный лифт'), pxa = { { "door2", 189 } }, dsc=_('Я нахожусь внутри главного лифта.'), obj={'liftbuttons'}, way={'deck'}, } liftbuttons=obj{ nam=_('Кнопки'), dsc=_('На стене лифта находятся {кнопки}.'), act=function() if not exist(sparehand, cell20) then if path(deck) then ways():del(deck) ways():add(warehouse) return _('Я нажал кнопку с подписью "Склад".') else ways():del(warehouse) ways():add(deck) return _('Я нажал кнопку с надписью "Главная палуба".') end else if path(deck) then ways():del(deck) ways():add(sparecrioblock) return _('Я нажал кнопку с надписью "Резервный криоблок".') else ways():del(sparecrioblock) ways():add(deck) return _('Я нажал кнопку с надписью "Главная палуба".') end end end, } warehouse=room{ nam=_('Склад'), pxa = { { "box", 10 }, { "box", 100 }, { "door2", 250 }, { "shelf", 415 } }, dsc=_('Я нахожусь в гигантском помещении склада.'), obj={'boxes'}, way={'liftinside'}, } boxes=obj{ _look=0, nam=_('Ящики'), dsc=_('На складе стоит множество стеллажей, заставленных {ящиками}.'), act=function(s) if s._look==0 then s._look=1 return _('Где-то среди них должны быть ящики с запасными частями для вахтенных роботов.') elseif s._look==1 then s._look=2 return _('Я нашёл стеллажи, на которых хранятся запасные части для вахтенных роботов.') elseif s._look==2 then s._look=3 return _('Я нашёл ящики с запасными руками для роботов. Правда только левыми.') elseif s._look==3 then s._look=4 take(sparehand) return _('Наконец, я нашёл ящики с правыми руками роботов.') else return _('Я уже нашёл то что мне было нужно.') end end, } sparehand=obj{ nam=_('Запасная рука'), dsc=_('Рядом с дверью отсека №20 лежит запасная правая {рука} робота.'), tak=_('Я взял руку.'), inv=function(s) if not s._not then return _('Правая рука робота. Я нашёл её на складе.') else return _('Правая рука.') end end, use=function(s,w) if w==cell20 and not s._not then drop(s,cell20) return _('Я положил запасную руку рядом с дверью отсека №20. Теперь можно отправляться в резервный криоблок.') end end, } sparecrioblock=room{ nam=_('Резервный криоблок'), pxa = { { "door4", 10 }, { "panel", 220 }, { "crio", 300 } }, dsc=_('Я нахожусь в резервном криоблоке.'), obj={'sparecapsule','sparecabinet'}, way={'liftinside'}, } sparecapsule=obj{ nam=_('Капсулы'), dsc=_('Здесь находятся резервные {капсулы} для криосна.'), act=function() if have(cloth) then return _('Прежде чем погружаться в криосон необходимо раздеться. Складки одежды могут навредить моему телу.') else walk(last) end end, } sparecabinet=obj{ nam=_('Шкаф'), dsc=_('Напротив капсул стоят {шкафы}.'), act=_('Обычные металлические шкафы для личных вещей.'), } last=room{ nam=_('Резервный криоблок'), dsc=_('Напоследок, оглядев криоблок, я закрыл капсулу и погрузился в долгий сон, наполненный виртуальной жизнью...'), act=function() walk(epilogue) end, obj={vobj('next','{'.._('Далее')..'}')}, } epilogue=room{ nam=_("Отсек №21"), dsc=_('Я -- вахтенный робот WR020. Раз в сто лет я выхожу из режима гибернации и несу на корабле вахту на протяжении года, а потом снова отключаюсь. Куда корабль летит я не знаю -- этого нет в моих банках памяти. Но я знаю, что весь экипаж в глубокой криозаморозке.^^И вот вновь настала моя очередь дежурить. Я включаюсь...'), enter=function() sparehand._not=true inv():del(wrench) inv():disable_all() objs(cell21):del(robot) cell20._opened=true cell21._opened=nil end, act=function() walk(wakeup) end, 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(); put(vobj('next','{'.._('Продолжить')..'}')) else s._dsc=s._dsc.." ".._("нормально"); s._f=0; s._s=s._s+1; end end walk(wakeup); end, act=function() walk(e_cell21) end, diags={_("Банки памяти"),_("Центральный процессор"),_("Зрительные окуляры"),_("Моторика")}, obj ={xact("diag",code[[timer:set(500)]])} } _endgame=false; e_cell21=room{ nam=_('Отсек №21'), enter=function() _endgame=true; end, pxa = { { "door1", 189 } }, dsc=_('Я нахожусь в отсеке №21.'), way={'techblock'}, } hend=room{ nam=_('Конец'), dsc=_('Я прикрутил руку и спокойно начал нести свою вахту.'), enter=function() mute_()(); complete_("brokencycle")(); inv():disable_all() end, act = gamefile_("meteor.lua"), obj = { vobj("next", txtc("^{".._('Продолжение').."...}")) } }