insteadose-3/brokencycle.lua

559 lines
18 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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