insteadose-3/brokencycle.lua

559 lines
18 KiB
Lua
Raw Normal View History

2018-08-09 12:26:42 +03:00
--$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("^{".._('Продолжение').."...}")) }
}