559 lines
18 KiB
Lua
559 lines
18 KiB
Lua
--$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("^{".._('Продолжение').."...}")) }
|
||
}
|