insteadose-3/engineer.lua

413 lines
18 KiB
Lua
Raw Normal View History

2018-08-09 12:26:42 +03:00
-- $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("^{КОНЕЦ?}")) }
};