413 lines
18 KiB
Lua
413 lines
18 KiB
Lua
-- $Name: Инженер$
|
||
-- $Version: 0.1$
|
||
instead_version "1.9.1"
|
||
require "lib"
|
||
require "para";
|
||
require "dash";
|
||
require "quotes";
|
||
require "timer";
|
||
require "xact";
|
||
require "hideinv";
|
||
|
||
game.use = 'Что-то не то.';
|
||
forcedsc = true;
|
||
|
||
global {
|
||
sc = 0;
|
||
Oxigen = 12;
|
||
vc = 0;
|
||
bolt = 11;
|
||
q = 0;
|
||
};
|
||
|
||
main = timerpause(315, 105, "main2");
|
||
|
||
main2 = room {
|
||
nam = '...';
|
||
title = { "И", "Н", "Ж", "Е", "Н", "Е", "Р" };
|
||
num = 9;
|
||
enter = music_("spookyloop",0);
|
||
dsc = 'Сознание толчками выплывало откуда-то из молочно-белого океана. Зрение с трудом сфокусировалось, что-то ярко-красное мигает прямо перед глазами. Это текст, сияющая надпись. Он все-таки смог распознать буквы.^^"Внимание. Аварийное пробуждение."^^Но смысл их ускользал обратно в белый океан спящего сознания. Впрочем вдолбленный в космошколе рефлекс сработал как нужно. Правая рука конвульсивно дернула рычаг, на котором и лежала все это время и запотевшая крышка с грохотом отвалилась. Он выпал из капсулы на пол.';
|
||
act = function() walk(cabin) end;
|
||
obj = { vobj("next", "{Далее}") }
|
||
};
|
||
|
||
cabin = room {
|
||
nam = 'Криокамерный отсек';
|
||
pxa = {
|
||
{ "crio", 300 }
|
||
};
|
||
dsc = 'Через некоторое время он смог подняться с пола, хватаясь за стенку непослушными руками. Что-то в подсознании не дало ему просто лежать дальше. Упершись лбом в стенку он решил немного отдышаться. В полированной металлической стенке отражался слегка небритый худощавый субъект в спецовке. На кармане желтела {xwalk(stripe)|какая-то нашивка}.';
|
||
};
|
||
|
||
stripe = room {
|
||
nam = 'Криокамерный отсек';
|
||
pxa = {
|
||
{ if_("vc==1","door2_open","door4"), 10 },
|
||
{ "panel", 150 },
|
||
{ "crio", 300 }
|
||
};
|
||
enter = function()
|
||
if visits() == 0 then p '"Вереск" -- было написано на нашивке. На этот раз чтение уже не стало проблемой как раньше.^-- Это нормально после криосна. -- откуда-то пришла мысль. Остальная память пока не отвечала, но возвращение своего имени уже приободрило его. Он оглянулся.';
|
||
end;
|
||
Ox();
|
||
end;
|
||
dsc = 'Вереск находился в покрытом пылью отсеке.';
|
||
obj = {'criocabin', 'case', 'hatch'};
|
||
};
|
||
|
||
criocabin = obj {
|
||
nam = 'Криокамера';
|
||
dsc = 'У стены установлена {криокамера}, в которой он и находился ранее в анабиозе.';
|
||
act = function()
|
||
if vc == 0 and q == 2 then p 'Вереск снял скафандр, положил в шкафчик гиперключ и залез обратно в криокамеру. Кажется наконец все закончилось.';
|
||
walk(happyend);
|
||
elseif q == 2 then p 'Камера готова к использованию, только вот в скафандре туда не залезешь, а снять его в вакууме тоже не получится.';
|
||
else p 'Краткий осмотр показал, что потекло соединение одного из шлангов с баллоном криожидкости. Видимо когда давление упало ниже критического уровня криокамера инициировала экстренное пробуждение. Индикатор на баллоне показывает, что криожидкости почти не осталось.';
|
||
end;
|
||
end;
|
||
};
|
||
|
||
case = obj {
|
||
nam = 'Шкафчик';
|
||
dsc = 'На стене закреплен {небольшой шкафчик}.';
|
||
act = function()
|
||
if have 'hyperkey' then
|
||
p 'Больше ничего интересного тут нет.';
|
||
else
|
||
p 'В шкафчике оказался простой гиперключ и сложенный мягкий скафандр.';
|
||
take 'hyperkey';
|
||
take 'vsuit';
|
||
end;
|
||
end;
|
||
};
|
||
|
||
hatch = obj {
|
||
nam = 'Люк';
|
||
dsc = function()
|
||
if seen('deck', ways(here())) then p 'За {открытой гермодверью} виден тускло овещенный коридор.';
|
||
else p 'На {панели у выходного люка} мигает огонек.'; end;
|
||
end;
|
||
act = function()
|
||
walk(crio_dlg);
|
||
end;
|
||
};
|
||
|
||
hyperkey = obj {
|
||
nam = 'Гиперключ';
|
||
inv = 'Это простой гиперключ, применяемый для ремонтных работ. Открутить, закрутить. При этом достаточно увесистый и может применяться и в других целях. Верный спутник технаря. Индикатор мигает зеленым, заряда еще достаточно.';
|
||
use = function(s,w)
|
||
if w == door then
|
||
bolt = bolt - 1;
|
||
p('Вереск захватил гиперключом одну из крупных болтовых шляпок на двери. Минута работы и болт упал на пол. Осталось '..bolt..'.');
|
||
Oxigen = Oxigen - 1;
|
||
elseif w == window then p 'Вереск с размаху ударил по стеклу иллюминатора. Но результат оказался скромным. Только небольшая царапина.';
|
||
Oxigen = Oxigen - 1;
|
||
elseif w == criocabin2 then p 'Немного повозившись при помощи гиперключа Вереск скрутил баллон.';
|
||
Oxigen = Oxigen - 1;
|
||
take 'ballon';
|
||
elseif w == case2 then p 'Хороший удар гиперключом и шкафчик не особо и пострадал. Нужно что-то потяжелее.';
|
||
else p 'Гиперключ тут не поможет.';
|
||
end;
|
||
if Oxigen == 0 then
|
||
p 'Запас кислорода подошел к концу, темные пятна заплясали в глазах. Вереск споткнулся и упал на пол.';
|
||
walk(badend);
|
||
end;
|
||
end;
|
||
};
|
||
|
||
key = obj {
|
||
nam = 'Магнитный ключ';
|
||
inv = 'Ключ открывает некоторые двери соответственно уровню доступа.';
|
||
use = function(s,w)
|
||
if w == gate then
|
||
gate._open = true;
|
||
p 'Вереск вставил карту в слот и переборка начала медленно подниматься. За переборкой оказался знакомый участок коридора.';
|
||
ways():add('right');
|
||
elseif w == door then p 'Ключ подошел. Дверь открылась. Вереск сразу схватил один из баллонов с кислородом и подключил его к скафандру. Больше ничего интересного тут нет.';
|
||
Oxigen = 10;
|
||
objs():del('door');
|
||
objs():del('window');
|
||
else p 'Ключ еще пригодится.';
|
||
end;
|
||
end;
|
||
|
||
};
|
||
|
||
ballon = obj {
|
||
nam = 'Баллон криожидкости';
|
||
inv = 'Баллон с криожидкостью, необходимой для анабиоза.';
|
||
use = function(s,w)
|
||
if w == case2 then p 'Хороший удар баллоном и шкафчик распахнулся. Кроме такого же скафандра, как надетый на Вереске, из шкафчика выпала магнитная карта-ключ.';
|
||
take 'key';
|
||
elseif w == criocabin then
|
||
p 'Вереск приделал свежий баллон к криокамере. Теперь еще на 500 лет хватит.';
|
||
inv():del('ballon');
|
||
q = 2;
|
||
else p 'Баллон криожидкости еще пригодится.';
|
||
end;
|
||
end;
|
||
|
||
};
|
||
|
||
vsuit = obj {
|
||
nam = function()
|
||
if sc == 0 then p 'Скафандр';
|
||
else p 'Скафандр (надет)';
|
||
end;
|
||
end;
|
||
inv = function()
|
||
if sc == 0 then p 'Это обычный корабельный скафандр типа "снегирь". Подумав, Вереск натянул его на себя. Кажется скоро он пригодится.';
|
||
sc = 1;
|
||
elseif vc == 1 then p 'Снимать скафандр в вакууме явно не лучшая идея.';
|
||
else
|
||
p 'Это обычный корабельный скафандр типа "снегирь". Подумав, Вереск снял скафандр. Кажется пока он не нужен.';
|
||
sc = 0;
|
||
end;
|
||
end;
|
||
};
|
||
|
||
crio_dlg = dlg {
|
||
nam = 'Гермодверь';
|
||
pxa = {
|
||
{ "panel", 217 }
|
||
};
|
||
enter = function()
|
||
p 'Мигающий красный индикатор предупреждает об отсутствии атмосферы за дверью.';
|
||
if vc == 0 then pon 'open';
|
||
elseif vc == 1 then pon 'close';
|
||
end;
|
||
end;
|
||
phr = {
|
||
{tag = 'open', false, 'Открыть гермодверь.', code[[if sc == 0 then
|
||
p 'Индикатор не врал, за дверью оказался вакуум. Теперь неплохо сохранившееся тело Вереска найдут только через пару сотен лет.';
|
||
walk 'badend';
|
||
else p 'Скафандр оказался весьма кстати. Воздух из отсека с криокамерой со свистом рванулся в вакуум. Вереск посмотрел на индикатор кислорода. Это может стать проблемой, если не начать действовать.';
|
||
inv():add('status', 1);
|
||
ways(from()):add('deck');
|
||
vc = 1;
|
||
back();
|
||
end;]]};
|
||
{tag = 'close', false, 'Закрыть гермодверь.', code[[
|
||
p 'Гермодверь закрылась и автоматически воздух с шипением стал заполнять помещение. Теперь можно снять скафандр.';
|
||
inv():del('status');
|
||
ways(from()):del('deck');
|
||
vc = 0;
|
||
back();]]};
|
||
{always = true, 'Отойти.', nil, [[back();]]};
|
||
};
|
||
};
|
||
|
||
badend = room {
|
||
nam = 'Конец';
|
||
hideinv = true;
|
||
dsc = 'Это конец.';
|
||
act = gamefile_("engineer.lua");
|
||
obj = { vobj("next", '{Начать с начала?}') }
|
||
};
|
||
|
||
status = stat {
|
||
nam = function()
|
||
local i;
|
||
for i = 1, Oxigen do
|
||
p (img 'box:4x6,cyan,128');
|
||
end;
|
||
p '^';
|
||
end;
|
||
};
|
||
|
||
deck = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ "window", 100 },
|
||
{ "door1_open", 190 },
|
||
{ "window", 380 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Покрытые каким-то налетом стенные световые панели едва светили. Направо или налево?';
|
||
way = {vroom('Налево', 'left'), 'stripe', vroom('Направо', 'right')};
|
||
};
|
||
|
||
left = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ "hatch", 20 },
|
||
{ "hole", 60 },
|
||
{ "window", 400 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации. А в стене коридора нашел и причину.';
|
||
way = {vroom('К криоотсеку', 'deck')};
|
||
obj = {'hole', xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')};
|
||
};
|
||
|
||
right = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ if_("exist(door)","door1","door1_open"), 10 },
|
||
{ "window", 140 },
|
||
{ "hatch", 400 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации.';
|
||
way = {vroom('К криоотсеку', 'deck')};
|
||
obj = {'door', 'window', xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')};
|
||
};
|
||
|
||
door = obj {
|
||
nam = 'Дверь';
|
||
act = function()
|
||
p 'Замок двери активируется или голосовой командой, или магнитным ключом. Вариант с голосом в вакууме не пройдет. А ключа у Вереска нет. Может все-таки поискать выход в другой стороне?';
|
||
q = 1;
|
||
end;
|
||
dsc = 'Зато в стене коридора обнаружилась {дверь}';
|
||
};
|
||
|
||
window = obj {
|
||
nam = 'Иллюминатор';
|
||
act = 'Сквозь мутное стекло видны баллоны с кислородом и какие-то ящики. Кажется это одна из аварийных кладовых.';
|
||
dsc = 'с {иллюминатором}.';
|
||
};
|
||
|
||
hole = obj {
|
||
nam = 'Дыра';
|
||
act = function()
|
||
p 'Вереск выглянул наружу и повертев головой обнаружил на обшивке корабля скобы для ремонтников.';
|
||
ways():add('cover');
|
||
end;
|
||
dsc = function()
|
||
if q == 0 then p 'Сквозь огромную дыру с рваными краями мрачно светили звезды.';
|
||
else p 'Сквозь {огромную дыру с рваными краями} мрачно светили звезды.';
|
||
end;
|
||
end;
|
||
};
|
||
|
||
cover = room {
|
||
nam = 'Обшивка';
|
||
pxa = {
|
||
{ "hole2", 50 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
if have 'ballon' then Oxigen = Oxigen - 2;
|
||
p 'Баллон все время мешался и Вереск истратил много времени и ругательств на дорогу.';
|
||
end;
|
||
end;
|
||
dsc = 'Вереск выбрался наружу и цепляясь за скобы осторожно стал перемещаться по корпусу корабля. Вскоре он наткнулся на еще одну дыру в корпусе. Кажется корабль попал в серьезную переделку.';
|
||
way = {vroom('Вернуться', 'left'), vroom('Влезть в дыру', 'cabin2')};
|
||
};
|
||
|
||
cover2 = room {
|
||
nam = 'Обшивка';
|
||
pxa = {
|
||
{ "hole2", 300 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
if have 'ballon' then Oxigen = Oxigen - 1;
|
||
p 'Баллон все время мешался и Вереск истратил много времени и ругательств на дорогу.';
|
||
end;
|
||
end;
|
||
dsc = 'Наконец Вереск добрался до первой дыры.';
|
||
way = {vroom('Вернуться', 'cabin2'), vroom('Влезть в дыру', 'left')};
|
||
};
|
||
|
||
Ox = function()
|
||
if vc == 1 then Oxigen = Oxigen - 1; end;
|
||
if Oxigen == 0 then
|
||
p 'Запас кислорода подошел к концу, темные пятна заплясали в глазах. Вереск споткнулся и упал на пол.';
|
||
walk(badend);
|
||
end;
|
||
end;
|
||
|
||
cabin2 = room {
|
||
nam = 'Отсек';
|
||
pxa = {
|
||
{ "door2_open", 10 },
|
||
{ "panel", 150 },
|
||
{ "crio", 300 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Вереск попал в такой же отсек, как и его собственный.';
|
||
obj = {'criocabin2', 'case2'};
|
||
way = {vroom('Вылезти в дыру', 'cover2'), vroom('Выйти через дверь', 'deck2')};
|
||
};
|
||
|
||
criocabin2 = obj {
|
||
nam = 'Криокамера';
|
||
dsc = 'У стены установлена {криокамера} с разбитой крышкой. Но тела внутри почему-то не оказалось.';
|
||
act = function()
|
||
p 'Баллон с криожидкостью цел. Это хорошая новость.';
|
||
end;
|
||
};
|
||
|
||
case2 = obj {
|
||
nam = 'Шкафчик';
|
||
dsc = 'На стене закреплен {небольшой шкафчик}.';
|
||
act = 'Шкафчик заперт.';
|
||
};
|
||
|
||
deck2 = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ "window", 100 },
|
||
{ "door1_open", 190 },
|
||
{ "window", 380 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Покрытые каким-то налетом стенные световые панели едва светили. Направо или налево?';
|
||
way = {vroom('Налево', 'left2'), 'cabin2', vroom('Направо', 'right2')};
|
||
};
|
||
|
||
left2 = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ if_("gate._open", "hatch2", "hatch"), 50 },
|
||
{ "window", 120 },
|
||
{ "window", 420 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
way = {vroom('Назад', 'deck2')};
|
||
obj = {'gate'};
|
||
};
|
||
|
||
right2 = room {
|
||
nam = 'Палуба';
|
||
pxa = {
|
||
{ "hatch", 50 },
|
||
{ "window", 120 },
|
||
{ "window", 420 }
|
||
};
|
||
enter = function()
|
||
Ox();
|
||
end;
|
||
dsc = 'Вскоре Вереск уперся в одну из {pere|автоматических переборок}, опускающихся при разгерметизации.';
|
||
way = {vroom('Назад', 'deck2')};
|
||
obj = {xact('pere', 'Эта переборка поднимется только если Вереск восстановит давление в коридоре.')};
|
||
};
|
||
|
||
gate = obj {
|
||
nam = 'Переборка';
|
||
act = 'Впрочем на этой переборке имеется панель управления со слотом под магнитную карту.';
|
||
dsc = 'Вскоре Вереск уперся в одну из {автоматических переборок}, опускающихся при разгерметизации.';
|
||
};
|
||
|
||
happyend = room {
|
||
nam = 'Конец';
|
||
enter = function() mute_()(); complete_("engineer")() end;
|
||
dsc = 'Это и правда конец, полет продолжается, экипаж спит.';
|
||
hideinv = true; act = gamefile_("oldfriend.lua")
|
||
,obj = { vobj("next", txtc("^{КОНЕЦ?}")) }
|
||
}; |