insteadose-3/engineer.lua

413 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: 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("^{КОНЕЦ?}")) }
};