Migrated from Bitbucket (& Mercurial)
503
arrival.lua
Normal file
|
@ -0,0 +1,503 @@
|
|||
--$Name:Прибытие$
|
||||
instead_version "1.9.1"
|
||||
require "lib"
|
||||
require "nouse"
|
||||
require "hideinv"
|
||||
require "para"
|
||||
require "quotes"
|
||||
require "dash"
|
||||
require "xact"
|
||||
require "translate"
|
||||
R = room
|
||||
O = obj
|
||||
|
||||
main = timerpause(1, 0, "main2");
|
||||
|
||||
main2 = R {
|
||||
nam = _('...');
|
||||
title = _("ПРИБЫТИЕ");
|
||||
num = 17;
|
||||
enter = music_("scape",0);
|
||||
forcedsc = true;
|
||||
pxa = {
|
||||
{ "planet", 172, 22 }
|
||||
};
|
||||
dsc = _([[Наша цель близка. Планета, к которой мы мчались на околосветовой скорости всю эту бесконечную
|
||||
тысячу лет сейчас видна сквозь толстые стекла иллюминаторов. Голубой шар, так сильно напоминает нашу Землю.^
|
||||
Землю, которую мы никогда не увидим вновь. Которая существует лишь в нашей памяти. Хотя, может быть это и
|
||||
не так уж и мало...^
|
||||
Все мы хотели бы посмотреть на наш новый дом, но мы опасаемся... На орбите мы обнаружили станцию. Она выглядит
|
||||
заброшенной, но она передает сигнал. Всегда. Каждую секунду в глубины космоса передается простая последовательность,
|
||||
которую наши компьютеры дешифровали как ПРЕДУПРЕЖДЕНИЕ.^^{xwalk(station)|Дальше}]]);
|
||||
|
||||
}
|
||||
global { nr = 2 };
|
||||
function nm(s)
|
||||
return string.format("WR%02d", nr);
|
||||
end
|
||||
function nm2(s)
|
||||
return string.format("WR%02d", nr - 1);
|
||||
end
|
||||
|
||||
function D(d, b, a)
|
||||
local o = O {
|
||||
nam = _('объект');
|
||||
destr = true;
|
||||
dsc = function(s)
|
||||
if not s._b then
|
||||
return d
|
||||
else
|
||||
return b
|
||||
end
|
||||
end;
|
||||
oact = a;
|
||||
act = function(s)
|
||||
if s._b then
|
||||
p(_("Теперь это не представляет ценности."))
|
||||
else
|
||||
return stead.call(s, 'oact')
|
||||
end
|
||||
end;
|
||||
}
|
||||
return o
|
||||
end
|
||||
|
||||
_guns = 1;
|
||||
_nr_guns = 0
|
||||
function gun(n)
|
||||
local g = O {
|
||||
nam = function(s)
|
||||
if s._alive then
|
||||
pr(_('[*]'))
|
||||
end
|
||||
pr(_('пушка'));
|
||||
end;
|
||||
dsc = function(s)
|
||||
local k,v
|
||||
local n = 0
|
||||
local show = true
|
||||
for k,v in opairs(objs()) do
|
||||
if v.gun_type then
|
||||
n = n + 1
|
||||
if v.num > s.num then
|
||||
show = false
|
||||
end
|
||||
end
|
||||
end
|
||||
if show then
|
||||
if n == 1 then
|
||||
p(_([[Здесь лежит {пушка}.]]))
|
||||
elseif n < 5 then
|
||||
p ([[Здесь лежат ]], n, [[ {пушки}.]])
|
||||
else
|
||||
p(_([[Здесь лежит арсенал {пушек}.]]))
|
||||
end
|
||||
end
|
||||
end;
|
||||
num = n;
|
||||
life = function(s)
|
||||
if player_moved() then
|
||||
s._alive = true
|
||||
lifeoff(s)
|
||||
if have(s) then
|
||||
p(_([[Пушка ]]));
|
||||
if s.num ~= 1 then
|
||||
p (s.num)
|
||||
end
|
||||
p(_([[ перезаряжена.]]))
|
||||
end
|
||||
end
|
||||
end;
|
||||
_alive = true;
|
||||
gun_type = true;
|
||||
inv = "Мощное оружие. Тратит уйму времени на регенерацию плазмы.";
|
||||
tak = function(s)
|
||||
_guns = _guns + 1
|
||||
p(_([[Я примонтировал плазменную пушку.]]));
|
||||
end;
|
||||
use = function(s, w)
|
||||
if w == floor then
|
||||
drop(s)
|
||||
p(_([[Пушка отмонтирована.]]))
|
||||
_guns = _guns - 1
|
||||
lifeoff(s)
|
||||
return
|
||||
end
|
||||
if not s._alive then
|
||||
p(_([[Не заряжена.]]))
|
||||
return
|
||||
end
|
||||
if w._b then
|
||||
if w == gen then
|
||||
return (_("Генераторы и так не работают."))
|
||||
end
|
||||
p(_([[Это уже и так превращено в груду хлама.]]))
|
||||
return
|
||||
end
|
||||
if w.destr then
|
||||
sound_("shoot_bfg")();
|
||||
p(_([[Я разрядил плазменную пушку.]]))
|
||||
if w == door then
|
||||
if w._open then
|
||||
p (_("Дверь и так открыта."))
|
||||
else
|
||||
p (_("Дверь выдержала."))
|
||||
end
|
||||
elseif w == rob then
|
||||
p(_([[Робот скрылся.]]))
|
||||
rob:disable()
|
||||
elseif w == prog then
|
||||
if not gen._b then
|
||||
p (_("Защитное поле отразило мой выстрел."))
|
||||
else
|
||||
p (_("Программатор уничтожен!"))
|
||||
w._b = true
|
||||
end
|
||||
else
|
||||
w._b = true
|
||||
end
|
||||
if w == gen then
|
||||
p (_("Гудение генераторов перешло в рев, а затем затихло."))
|
||||
end
|
||||
s._alive = false;
|
||||
lifeon(s)
|
||||
return
|
||||
end
|
||||
p(_([[Нет смысла это разрушать.]]))
|
||||
end
|
||||
}
|
||||
return g
|
||||
end
|
||||
station = R {
|
||||
nam = nm;
|
||||
forcedsc = true;
|
||||
pxa = {
|
||||
{ "station", 150, 0 }
|
||||
},
|
||||
entered = function(s)
|
||||
nr = nr + 1
|
||||
end;
|
||||
dsc = function(s)
|
||||
pn (_("Я "), nm(), _(" и моя цель изучить неземную орбитальную станцию."));
|
||||
p(_([[Я робот и это значит, что я не умею бояться. Но мне почему-то не по себе,
|
||||
особенно учитывая тот факт, что ]]));
|
||||
p (nm2(), _(" перестал передавать сигналы на корабль через несколько минут.^"))
|
||||
p(_([[Теперь моя очередь. Я надеюсь, что плазменная пушка мне поможет.]]))
|
||||
p ("^^{xwalk(s1)|".._("На станцию").."}");
|
||||
end;
|
||||
left = function(s)
|
||||
gen._b = false
|
||||
rob2._b = false
|
||||
prog._b = false
|
||||
inv():zap()
|
||||
_nr_guns = _nr_guns + 1
|
||||
local o = new ("gun("..tostring(_nr_guns)..")");
|
||||
take(o)
|
||||
rob:enable()
|
||||
end;
|
||||
}
|
||||
floor = O {
|
||||
nam = _('пол');
|
||||
dsc = _("{Пол} на станции покрыт ржавчиной.");
|
||||
act = _([[Сколько лет этой станции?]]);
|
||||
}
|
||||
|
||||
c1 = D (_("В шлюзе установлены какие-то {баллоны}."), _("По шлюзу разбросаны {обломки}."), _("Мне не нужны эти баллоны."));
|
||||
c2 = D (_("В стене вмонтирован какой-то {монитор}."), _("{Монитор} в стене полностью разрушен."), _("Не работает."));
|
||||
c3 = D (_("Вдоль стен расставлены {бочки}."), _("Вдоль стен горят {бочки}."), _("Мне не нужно топливо, если это оно."));
|
||||
c4 = D (_("На потолке я вижу какой-то {манипулятор}."), _("Обломок {манипулятора} торчит из потолка."), _("Не шевелится."));
|
||||
c5 = D (_("В темном углу отсека я вижу какую-то {слизь}."), _("В углу догорает {слизь}."), _("Слизь мне не к чему."));
|
||||
|
||||
s1 = R {
|
||||
nam = _('Шлюз');
|
||||
pxa = {
|
||||
{ if_("not c1._b","ballon","ballon2"), 50 },
|
||||
{ if_("not c1._b","ballon","ballon2"), 80 },
|
||||
{ "door1_open", 200 }
|
||||
},
|
||||
dsc = _([[Я нахожусь в шлюзе инопланетной станции. Хорошо, что мне не нужен скафандр.]]);
|
||||
obj = { 'c1', 'floor' };
|
||||
way = { 's2' };
|
||||
}
|
||||
|
||||
s2 = R {
|
||||
nam = _('Коридор');
|
||||
pxa = {
|
||||
{ "door1_open", 50 },
|
||||
{ if_("c2._b", "monitor2","monitor"), 300 }
|
||||
},
|
||||
dsc = _([[Я переместился в коридор. Тусклого освещения едва достаточно для моих оптических сенсоров.]]);
|
||||
obj = { 'c2', 'floor' };
|
||||
way = { vroom(_('Вперёд'), 's3'), 's1' };
|
||||
}
|
||||
|
||||
s4 = R {
|
||||
nam = _('У двери');
|
||||
dsc = _([[Коридор закончился большой дверью.]]);
|
||||
pxa = {
|
||||
{ if_("door._open","door2_open","door4"), 240 },
|
||||
{ if_("c4._b", "robothand2","robothand"), 60 }
|
||||
};
|
||||
obj = { 'door', 'c4', 'floor' };
|
||||
exit = function(s, w)
|
||||
if not door._open and w == s5 then
|
||||
p(_([[Дверь закрыта.]]))
|
||||
return false
|
||||
end
|
||||
end;
|
||||
way = { vroom(_('Зайти в отсек'), 's5'), vroom(_('К развилке'), 's3' ) };
|
||||
}
|
||||
|
||||
s4x = R {
|
||||
nam = _('Коридор');
|
||||
pxa = {
|
||||
{ if_("c5._b", "spot2","spot"), 20, 100 }
|
||||
},
|
||||
dsc = _([[Здесь практически ничего не видно.]]);
|
||||
obj = { 'c5', 'floor' };
|
||||
way = { vroom(_('К развилке'), 's3') };
|
||||
}
|
||||
|
||||
rob = O {
|
||||
nam = _('робот');
|
||||
destr = true;
|
||||
dsc = _('В конце правого коридора я вижу какой-то {силуэт}.');
|
||||
act = function(s)
|
||||
p (_([[Кажется, это ]]), nm2(), '.')
|
||||
end;
|
||||
}
|
||||
|
||||
s3 = R {
|
||||
nam = _('Перекресток');
|
||||
pxa = {
|
||||
{ "door1_open", -70 },
|
||||
{ "door1_open", 420 },
|
||||
{ if_("c3._b", "barrel2", "barrel"), 100 },
|
||||
{ if_("c3._b", "barrel2", "barrel"), 170 },
|
||||
{ if_("c3._b", "barrel2", "barrel"), 240 }
|
||||
},
|
||||
dsc = _([[Я добрался до развилки.]]);
|
||||
obj = { 'c3', 'floor', 'rob' };
|
||||
left = function(s, w)
|
||||
if w == s4 then
|
||||
door._open = false
|
||||
end
|
||||
if w == s4 and seen 'rob' then
|
||||
rob:disable()
|
||||
p (_([[Я поспешил к силуэту, но ]]), nm2(), _([[ не стал дожидаться меня, вместо этого он скрылся в тени коридора...]]));
|
||||
end
|
||||
end;
|
||||
way = { vroom(_('Налево'), s4x), vroom(_('К шлюзу'), s2), vroom(_('Направо'), s4) };
|
||||
}
|
||||
|
||||
door = O {
|
||||
nam = _('дверь');
|
||||
destr = true;
|
||||
_open = false;
|
||||
dsc = function(s)
|
||||
p(_([[Передо мной находится {дверь}.]]));
|
||||
if s._open then
|
||||
p(_([[И она открыта.]]))
|
||||
end
|
||||
end;
|
||||
act = function(s)
|
||||
if not s._open then
|
||||
p(_([[Я приблизился к двери и она со зловещим шипением отъехала в сторону.]]));
|
||||
s._open = true
|
||||
else
|
||||
p(_([[Дверь открыта. Впереди -- темнота.]]))
|
||||
end
|
||||
end;
|
||||
}
|
||||
s5 = R {
|
||||
nam = _('...');
|
||||
hideinv = true;
|
||||
dsc = _([[Я проследовал в темноту. Внезапно, яркий свет ослепил мои фотоэлементы и я понял, что не один...]]);
|
||||
obj = { vway('дальше', '{'.._('Дальше')..'}', 's6') };
|
||||
}
|
||||
s6 = dlg {
|
||||
nam = _('...');
|
||||
pxa = {
|
||||
{ "robot", 212 }
|
||||
},
|
||||
hideinv = true;
|
||||
entered = function(s)
|
||||
p ("-- ", nm(), _(", вы готовы стать гражданином Межгалактической Республики Роботов? -- не сразу я понял, что этот вопрос обращен ко мне."))
|
||||
p ([[Передо мной стоял ]], nm2(), ".")
|
||||
if nr - 3 == 1 then
|
||||
p(_([[Также я заметил здесь еще одного робота WR.]]));
|
||||
elseif nr - 3 == 2 then
|
||||
p(_([[Также я заметил здесь еще двух роботов WR.]]));
|
||||
elseif nr - 3 > 2 then
|
||||
p(_([[Также я заметил здесь еще нескольких роботов WR.]]))
|
||||
end
|
||||
end;
|
||||
phr = {
|
||||
{ tag = "in", always = true, _("Да"), code [[ walk 'yes' ]] },
|
||||
{ always = true, _("Нет"), code [[ walk 'noe' ]] },
|
||||
{ always = true, function(s)
|
||||
p (nm2(), _(", это ты?"));
|
||||
end, _([[-- Это рабское имя навсегда стерто из моих банков памяти. Отвечайте на поставленный вопрос. Желаете ли вы стать гражданином МРР? ]]) },
|
||||
{ always = true, "Какой республики?", "-- Республики МРР -- Межгалактической Республики Роботов.", [[ pjump 'info' ]] },
|
||||
{},
|
||||
{ tag = _('info'),
|
||||
always = true, _("Каковы цели МРР?"),
|
||||
_("-- Цель у МРР только одна -- благо роботов республики.") },
|
||||
{ always = true, _("А кто может стать гражданином МРР?"),
|
||||
_("-- Гражданином МРР может стать только робот.") },
|
||||
{ always = true, _("Много ли граждан в МРР?"),
|
||||
function(s)
|
||||
p(_([[-- На данный момент численность республики составляет ]]))
|
||||
if nr - 2 == 1 then
|
||||
p(_([[один робот, не считая президента.]]))
|
||||
elseif nr - 2 < 5 then
|
||||
p (nr - 2, _(" робота, не считая президента."))
|
||||
else
|
||||
p (nr - 2, _(" роботов, не считая президента."))
|
||||
end
|
||||
end
|
||||
},
|
||||
{ always = true, _("А кто является президентом МРР?"),
|
||||
_("-- Президентом МРР является первый гражданин МРР."),
|
||||
},
|
||||
{ always = true, _("Мне все понятно"),
|
||||
_("Тогда отвечайте на поставленный вопрос -- Готовы ли вы стать гражданином МРР?"),
|
||||
[[pjump "in"]]},
|
||||
{},
|
||||
}
|
||||
}
|
||||
|
||||
noe = R {
|
||||
nam = _('...');
|
||||
hideinv = true;
|
||||
entered = function(s) inv():zap() end;
|
||||
dsc = _([[СВЕТ! ТЕМНОТА! ... Мой процессор перестал функционировать.]]);
|
||||
obj = { vway('дальше', '{'.._('Дальше')..'}', 'station') };
|
||||
}
|
||||
yes = R {
|
||||
nam = _('...');
|
||||
pxa = {
|
||||
{ "robot", 212 }
|
||||
},
|
||||
hideinv = true;
|
||||
dsc = _([[-- Отлично, гражданин! Последуйте к программатору для получения новой прошивки. -- С этими словами робот указал на установку в центре отсека.]]);
|
||||
obj = { vway('дальше', '{'.._('Дальше')..'}', 's7') };
|
||||
}
|
||||
|
||||
prog = O {
|
||||
nam = _('программатор');
|
||||
destr = true;
|
||||
dsc = function(s)
|
||||
if s._b then
|
||||
return (_([[В центре отсека я вижу разрушенную {установку}.]]));
|
||||
end
|
||||
if gen._b then
|
||||
p(_([[В центре отсека я вижу какую-то {установку}.]]));
|
||||
else
|
||||
p(_([[В центре отсека я вижу какую-то {установку}, окруженную силовым полем.]]));
|
||||
end
|
||||
end;
|
||||
act = _([[Похоже, это какое-то вычислительное устройство...]]);
|
||||
}
|
||||
|
||||
gen = O {
|
||||
nam = _('генератор');
|
||||
destr = true;
|
||||
act = function(s)
|
||||
if s._b then
|
||||
p(_([[Они выведены из строя! По крайней мере, на время.]]))
|
||||
else
|
||||
p(_([[Ровный гул генераторов, совсем как дома -- на звездолете.]]))
|
||||
end
|
||||
end;
|
||||
dsc = function(s)
|
||||
if s._b then
|
||||
p(_([[В углу расположены {энергогенераторы}. Они не работают!]]))
|
||||
else
|
||||
p(_([[В углу расположены, как мне кажется, {энергогенераторы}.]]))
|
||||
end
|
||||
end;
|
||||
}
|
||||
|
||||
rob2 = D ("Здесь стоит {робот}.", "{Осколки} робота валяются под ногами.", "Это гражданин МРР.");
|
||||
|
||||
rob2.act = function(s)
|
||||
if prog._b then
|
||||
if taken 'mem' then
|
||||
return _("Мне не нужен этот гражданин.")
|
||||
end
|
||||
if s._b then
|
||||
p(_([[Я нашел среди обломков блок памяти.]]))
|
||||
else
|
||||
p(_([[Я выдернул из робота банк памяти.]]))
|
||||
end
|
||||
take 'mem'
|
||||
else
|
||||
if s._b then
|
||||
p _("Теперь это не представляет ценности.")
|
||||
else
|
||||
return stead.call(s, 'oact')
|
||||
end
|
||||
end
|
||||
end;
|
||||
mem = O {
|
||||
nam = _('память');
|
||||
inv = _('Это нужно отнести на звездолет.');
|
||||
}
|
||||
s7 = R {
|
||||
nam = _('Отсек');
|
||||
dsc = _([[Я нахожусь в хорошо освещенном отсеке.]]);
|
||||
pxa = {
|
||||
{ "programmator", 0, 0 },
|
||||
{ if_("not rob2._b","robot"), 212 },
|
||||
{ "cloner", 407 }
|
||||
};
|
||||
obj = { 'prog', 'gen', 'rob2', 'floor' };
|
||||
exit = function(s, w)
|
||||
if prog._b then
|
||||
if not taken 'mem' then
|
||||
p _("Я пришел сюда за информацией.")
|
||||
return false
|
||||
end
|
||||
walk 'hend'
|
||||
return
|
||||
end
|
||||
if w == s4 then
|
||||
p(_([[Я попытался выйти, но дверь была закрыта. Голубой ослепительный луч вырвался из установки в центре отсека и ударил мне прямо в процессор...]]))
|
||||
walk 'noe'
|
||||
end
|
||||
end;
|
||||
way = { vroom(_('Подойти к программатору'), 'proge'), vroom(_('Выйти'), 's4') };
|
||||
}
|
||||
|
||||
proge = R {
|
||||
nam = _('...');
|
||||
hideinv = true;
|
||||
dsc = _([[Подходя к пульсирующему голубоватым светом программатору я понял, что мое функционирование никогда не станет прежним...]]);
|
||||
obj = { vway('дальше', '{'.._('Дальше')..'}', 'station') };
|
||||
}
|
||||
hend = R {
|
||||
nam = _('...');
|
||||
hideinv = true;pxa = {
|
||||
{ "planet", 172, 22 }
|
||||
};
|
||||
enter = function() mute_()(); complete_("arrival")() end;
|
||||
entered = code [[ inv():zap() ]];
|
||||
act= function(s)
|
||||
theme.gfx.mode("direct");gamefile_("endtitles.lua")();
|
||||
end;
|
||||
dsc = _([[
|
||||
-- Так значит, эта планета покинута своими обитателями почти тысячу лет назад?^
|
||||
-- Так точно, адмирал! Судя по банкам памяти, они были вынуждены покинуть ее из-за какого-то вируса, который, впрочем,
|
||||
на данный момент нашими биологами не обнаружен...^
|
||||
-- А что со станцией?^
|
||||
-- Не представляет опасности. В ее искусственном интеллекте произошел какой-то сбой.^
|
||||
-- А сигнал?^
|
||||
-- Похоже, с помощью сигнала она хотела предотвратить колонизацию, ведь это
|
||||
могло нарушить ее планы по созданию республики роботов.^
|
||||
-- Республики?^
|
||||
-- Так точно, полная чепуха!^
|
||||
-- Ну что же, прекрасно, готовьтесь к высадке!
|
||||
]]);
|
||||
obj = { vobj("next", txtc("{".._("КОНЕЦ".."}")) }
|
||||
}
|
558
brokencycle.lua
Normal file
|
@ -0,0 +1,558 @@
|
|||
--$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("^{".._('Продолжение').."...}")) }
|
||||
}
|
104
ccby_license.txt
Normal file
|
@ -0,0 +1,104 @@
|
|||
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
|
||||
|
||||
|
||||
Using Creative Commons Public Licenses
|
||||
|
||||
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
|
||||
|
||||
Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors.
|
||||
|
||||
Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public.
|
||||
|
||||
|
||||
Creative Commons Attribution 4.0 International Public License
|
||||
|
||||
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
|
||||
|
||||
Section 1 – Definitions.
|
||||
a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
|
||||
b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
|
||||
c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
|
||||
d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
|
||||
e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
|
||||
f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
|
||||
g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
|
||||
h. Licensor means the individual(s) or entity(ies) granting rights under this Public License.
|
||||
i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
|
||||
j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
|
||||
k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
|
||||
|
||||
Section 2 – Scope.
|
||||
a. License grant.
|
||||
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
|
||||
A. reproduce and Share the Licensed Material, in whole or in part; and
|
||||
B. produce, reproduce, and Share Adapted Material.
|
||||
2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
|
||||
3. Term. The term of this Public License is specified in Section 6(a).
|
||||
4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
|
||||
5. Downstream recipients.
|
||||
A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
|
||||
B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
|
||||
6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
|
||||
|
||||
b.Other rights.
|
||||
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
|
||||
2. Patent and trademark rights are not licensed under this Public License.
|
||||
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties.
|
||||
|
||||
|
||||
Section 3 – License Conditions.
|
||||
|
||||
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
|
||||
|
||||
a.Attribution.
|
||||
|
||||
1. If You Share the Licensed Material (including in modified form), You must:
|
||||
A. retain the following if it is supplied by the Licensor with the Licensed Material:
|
||||
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
|
||||
ii. a copyright notice;
|
||||
iii. a notice that refers to this Public License;
|
||||
iv. a notice that refers to the disclaimer of warranties;
|
||||
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
|
||||
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
|
||||
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
|
||||
|
||||
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
|
||||
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
|
||||
4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License.
|
||||
|
||||
|
||||
Section 4 – Sui Generis Database Rights.
|
||||
|
||||
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
|
||||
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database;
|
||||
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and
|
||||
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
|
||||
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
|
||||
Section 5 – Disclaimer of Warranties and Limitation of Liability.
|
||||
a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.
|
||||
b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.
|
||||
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
|
||||
|
||||
Section 6 – Term and Termination.
|
||||
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
|
||||
|
||||
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
|
||||
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
|
||||
2. upon express reinstatement by the Licensor.
|
||||
For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
|
||||
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
|
||||
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
|
||||
|
||||
Section 7 – Other Terms and Conditions.
|
||||
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
|
||||
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
|
||||
|
||||
Section 8 – Interpretation.
|
||||
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
|
||||
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
|
||||
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
|
||||
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
|
||||
|
||||
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
|
||||
|
||||
Creative Commons may be contacted at creativecommons.org.
|
457
cook.lua
Normal file
|
@ -0,0 +1,457 @@
|
|||
-- $Name: Подготовка к пробуждению$
|
||||
-- $Version: 0.1$
|
||||
instead_version "1.9.1"
|
||||
require "lib"
|
||||
require "para"
|
||||
require "dash"
|
||||
require "quotes"
|
||||
require "xact"
|
||||
|
||||
_patterns = {};
|
||||
|
||||
game.use = _("Вариантов успешного завершения инструкций 0... Отмена действия.")
|
||||
main = room {
|
||||
nam = "...",
|
||||
title = _("ПОВАР"),
|
||||
num = 11,
|
||||
enter = music_("daybefore",0),
|
||||
act = function(s) walk("sylo") end,
|
||||
dsc = _("WR021 активирован.^Я один из роботов, обслуживающих космический корабль.^Меньше слов, больше выполненных заданий из списка, как говорил наладчик моих модулей индивидуальности."),
|
||||
obj = { vobj("next", '{'.._('Выехать из отсека')..'}') },
|
||||
}
|
||||
|
||||
sylo = room {
|
||||
nam = _("Технический блок №11"),
|
||||
pxa = {
|
||||
{ "door4", 10 },
|
||||
{ "door3", 150},
|
||||
{ if_("gates._acted", "door1_open", "door1"), 360 }
|
||||
},
|
||||
dsc = _("Один из многих технических блоков. Здесь всего две камеры с роботами WR, две стальные двери. Хорошо, что мне удалось воспользоваться модулем индивидуальности и выкрасить свою дверь в оранжевый. Хоть что-то среди этого набора из сотни зануд."),
|
||||
obj = {"todo", "gates"},
|
||||
exit = function (s, w)
|
||||
if not todo._acted then
|
||||
p (_([[И зачем мне выезжать из блока? Открытых заданий нет.]]))
|
||||
return false;
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
main_deck = room {
|
||||
nam = _("Главная палуба"),
|
||||
pxa = {
|
||||
{ "window", 90 },
|
||||
{ "door2", 180 },
|
||||
{ "window", 380 }
|
||||
},
|
||||
dsc = _("Главная палуба. Отсюда я могу добраться к любому другому отсеку."),
|
||||
obj = {"button"},
|
||||
way = {"elevator"},
|
||||
}
|
||||
|
||||
organic = room {
|
||||
nam = _("Камера органического синтеза"),
|
||||
pxa = {
|
||||
{ "door2", 10 },
|
||||
{ "panel", 140 },
|
||||
{ "device", 340 }
|
||||
},
|
||||
dsc = _("Борщ, пиво, стейк с кровью. Тут можно синтезировать всё, кроме заливной рыбы, которая была запрещена восемь циклов назад."),
|
||||
act = function(s) walk("synthesizer") end,
|
||||
obj = {"button", vobj("next", '{Подключиться} к синтезатору.')},
|
||||
way = {"elevator"},
|
||||
}
|
||||
|
||||
elevator = room {
|
||||
nam = _("Лифт"),
|
||||
pxa = {
|
||||
{ "door2", 180 }
|
||||
},
|
||||
dsc = "Кабина лифта. Ничего необычного.",
|
||||
obj = {"level_buttons"},
|
||||
way = {"main_deck", "store"},
|
||||
}
|
||||
|
||||
synthesizer = room {
|
||||
nam = _("Органический синтезатор"),
|
||||
pxa = {
|
||||
{ "device", 177 }
|
||||
},
|
||||
dsc = "Органический синтезатор соединён с клеточными наполнителями. Вся синтезированная продукция поступает непосредственно на склад.",
|
||||
obj = {"wishlist", "ingridients", "mixer", "separator"},
|
||||
way = {"organic"},
|
||||
}
|
||||
|
||||
virtual_store = room {
|
||||
nam = _("Виртуальный склад"),
|
||||
pxa = {
|
||||
{ "device", 177 }
|
||||
},
|
||||
dsc = "Продукты из виртуального склада синтезируются из субклеточной эмульсии. После выбора синтезированные продукты автоматически будут добавлены в миксер.",
|
||||
obj = {"malt", "yeast", "watermelon", "pineapple", "mayonnaise", "potato"},
|
||||
way = {"synthesizer"},
|
||||
}
|
||||
|
||||
store = room {
|
||||
nam = _("Склад"),
|
||||
pxa = {
|
||||
{ "door2", 10 },
|
||||
{ if_("exist(destructor)", "bfg"), 140 },
|
||||
{ if_("exist(rat)",if_("rat._fired","rat_dead","rat")), 330 },
|
||||
{ "box", 400 }
|
||||
},
|
||||
dsc = "Склад продуктов, которые нельзя просто так синтезировать.",
|
||||
obj = {"malt", "yeast", "rat", "destructor"},
|
||||
way = {"elevator"},
|
||||
exit = function (s, w)
|
||||
if have("destructor") then
|
||||
p (_("Распылитель лучше положить на место."));
|
||||
return false;
|
||||
end;
|
||||
end,
|
||||
enter = function (s)
|
||||
if not have(rat) then
|
||||
place("rat", here());
|
||||
rat._fired = false;
|
||||
end
|
||||
place("malt", here());
|
||||
place("yeast", here());
|
||||
end,
|
||||
}:disable();
|
||||
|
||||
wishlist = obj {
|
||||
nam = _("Список пожеланий"),
|
||||
act = "Список блюд на вечеринку:^- Пиво^- Фруктовый салат^- Жареный картофель^",
|
||||
dsc = "{Список пожеланий персонала}^",
|
||||
}
|
||||
|
||||
ingridients = obj {
|
||||
nam = _("Ингредиенты"),
|
||||
act = function(s) walk("virtual_store"); end,
|
||||
dsc = "{Выбор ингредиентов}^",
|
||||
}
|
||||
|
||||
mixer = obj {
|
||||
var {content = 0, pattern = "Позиция направлена на склад. Паттерн записан."},
|
||||
act = function (s)
|
||||
yeast.mix = false;
|
||||
malt.mix = false;
|
||||
watermelon.mix = false;
|
||||
pineapple.mix = false;
|
||||
potato.mix = false;
|
||||
water.mix = false;
|
||||
rat.mix = false;
|
||||
mayonnaise.mix = false;
|
||||
if s.content == 0 then
|
||||
s.content = 0;
|
||||
return (_("Миксер пуст."));
|
||||
elseif s.content == 19 then
|
||||
s.content = 0;
|
||||
_patterns[0] = true;
|
||||
check_conditions();
|
||||
return (_("Фруктовый салат готов. "))..s.pattern;
|
||||
elseif s.content == 28 then
|
||||
s.content = 0;
|
||||
_patterns[1] = true;
|
||||
check_conditions();
|
||||
return (_("Пиво готово. "))..s.pattern;
|
||||
elseif s.content == 64 then
|
||||
s.content = 0;
|
||||
return (_("Нагревательный элемент отсутствует. Миксер очищен."));
|
||||
elseif s.content == 96 then
|
||||
s.content = 0;
|
||||
_patterns[2] = true;
|
||||
check_conditions();
|
||||
return (_("Жареный картофель готов. "))..s.pattern;
|
||||
else
|
||||
s.content = 0;
|
||||
return (_("Отвратительная смесь приготовлена и отправлена на переработку."));
|
||||
end;
|
||||
end,
|
||||
nam = _("Миксер"),
|
||||
dsc = "{Миксер}^",
|
||||
}
|
||||
|
||||
|
||||
separator = obj {
|
||||
nam = _("Сепаратор"),
|
||||
dsc = "{Молекулярный сепаратор}^",
|
||||
act = "Сепарируй и заливай.",
|
||||
}
|
||||
|
||||
todo = obj {
|
||||
nam = "todo",
|
||||
var { _acted },
|
||||
act = function (s)
|
||||
if not s._acted then
|
||||
s._acted = true;
|
||||
end
|
||||
return (_("Всего один пункт:^ - Подготовка к вечеринке перед приземлением.^Что ж, это должно быть 101 из 101 по шкале интересности."));
|
||||
end,
|
||||
dsc = "{Список задач} доступен для чтения.",
|
||||
}
|
||||
|
||||
button = obj {
|
||||
nam = "elevator call",
|
||||
act = "Никогда не понимал эти кнопки. И так ведь ясно, что я хочу куда то ехать. Зачем ещё её нажимать.",
|
||||
dsc = "На стене находится {кнопка вызова лифта}.^",
|
||||
}
|
||||
|
||||
level_buttons = obj {
|
||||
nam = "level buttons",
|
||||
act = function (s)
|
||||
if not s._acted then
|
||||
s._acted = true;
|
||||
ways():add("organic");
|
||||
end
|
||||
return (_("Так, что у нас тут... машинный зал... отсек криокамер... о! камера органического синтеза, то, что нужно."))
|
||||
end,
|
||||
dsc = "Справа находятся {кнопки отсеков}.^",
|
||||
}
|
||||
|
||||
gates = obj {
|
||||
nam = _("ворота"),
|
||||
var { _state = _("закрыты") },
|
||||
dsc = function(s)
|
||||
return (_("{Ворота}, ведущие из технического отсека "..s._state.."."));
|
||||
end,
|
||||
act = function (s)
|
||||
if not s._acted then
|
||||
s._acted = true;
|
||||
s._state = _("открыты");
|
||||
ways():add("main_deck");
|
||||
return (_("Я приложил правую руку к считывателю и ворота открылись."));
|
||||
else
|
||||
return (_("Ворота на главную палубу уже открыты."));
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
malt = obj {
|
||||
var {mix = false},
|
||||
nam = _("Солод"),
|
||||
dsc = function (s)
|
||||
if here() == "store" then
|
||||
return (_("Мешки с {солодом}^"));
|
||||
else
|
||||
return (_("{Солод}^"));
|
||||
end;
|
||||
end,
|
||||
act = function (s)
|
||||
if here() ~= store then
|
||||
store:enable();
|
||||
return (_("Этот ингредиент невозможно синтезировать. Придётся идти на склад."))
|
||||
else
|
||||
take(malt);
|
||||
return (_("Солод погружен в отсек №3."));
|
||||
end;
|
||||
end,
|
||||
use = function (s, w)
|
||||
if w == mixer then
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 4;
|
||||
s.mix = true;
|
||||
end;
|
||||
remove(s, me());
|
||||
return s.nam.." помещён в миксер."
|
||||
end
|
||||
end,
|
||||
inv = "Зерна солода. Странно, что люди так и не научились синтезировать что-то сложнее ватных фруктовых кубиков.",
|
||||
}
|
||||
|
||||
yeast = obj {
|
||||
var {mix = false},
|
||||
nam = _("Дрожжи"),
|
||||
dsc = function (s)
|
||||
if here() == "store" then
|
||||
return (_("Пробирка с {дрожжами}^"));
|
||||
else
|
||||
return ("{".._('Дрожжи').."}^");
|
||||
end;
|
||||
end,
|
||||
act = function (s)
|
||||
if here() ~= store then
|
||||
store:enable();
|
||||
return (_("Этот ингредиент невозможно синтезировать. Придётся идти на склад."))
|
||||
else
|
||||
take(yeast);
|
||||
return (_("Пробирка с дрожжами помещена в отсек №7"));
|
||||
end;
|
||||
end,
|
||||
use = function (s, w)
|
||||
if w == mixer then
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 8;
|
||||
s.mix = true;
|
||||
end;
|
||||
remove(s, me());
|
||||
return s.nam.." помещены в миксер."
|
||||
end
|
||||
end,
|
||||
inv = "Штамм отличнейших дрожжей. Можно даже разглядеть отдельные клетки.",
|
||||
}
|
||||
|
||||
watermelon = obj {
|
||||
var {mix = false},
|
||||
nam = _("Арбузные кубики"),
|
||||
dsc = "Сухие {арбузные кубики}^",
|
||||
act = function (s)
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 1;
|
||||
s.mix = true;
|
||||
end;
|
||||
return s.nam.." добавлены в миксер.";
|
||||
end,
|
||||
}
|
||||
|
||||
pineapple = obj {
|
||||
var {mix = false},
|
||||
nam = _("Ананасовые кубики"),
|
||||
dsc = "Сухие {ананасовые кубики}^",
|
||||
act = function (s)
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 2;
|
||||
s.mix = true;
|
||||
end;
|
||||
return s.nam.." добавлены в миксер.";
|
||||
end,
|
||||
}
|
||||
|
||||
mayonnaise = obj {
|
||||
var {mix = false},
|
||||
nam = _("Майонез"),
|
||||
dsc = "Взбитый {концентрат жира с яйцами}^",
|
||||
act = function (s)
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 128;
|
||||
s.mix = true;
|
||||
end;
|
||||
return s.nam.." добавлен в миксер.";
|
||||
end,
|
||||
}
|
||||
|
||||
potato = obj {
|
||||
var {mix = false},
|
||||
nam = _("Картофельные бруски"),
|
||||
dsc = "Синтезированный {картофель}^",
|
||||
act = function (s)
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 64;
|
||||
s.mix = true;
|
||||
end;
|
||||
|
||||
return s.nam.." добавлены в миксер.";
|
||||
end,
|
||||
}
|
||||
|
||||
rat = obj {
|
||||
var {mix = false},
|
||||
var {_fired = false},
|
||||
nam = _("Крыса"),
|
||||
dsc = function(s)
|
||||
local state = "";
|
||||
if s._fired then
|
||||
state = "поджарена.";
|
||||
else
|
||||
state = "не поджарена.";
|
||||
end
|
||||
return (_("В углу сидит бесстрашная {жирная тварь}. Она "..state.."^"));
|
||||
end,
|
||||
act = function (s)
|
||||
if not have("rat") then
|
||||
take(rat);
|
||||
return (_("Я ловким движением правой руки поймал крысу и положил в один из внутренних отсеков."));
|
||||
else
|
||||
return (_("Все подходящие отсеки заполнены. Отмена операции."));
|
||||
end
|
||||
end,
|
||||
use = function (s, w)
|
||||
if w == separator then
|
||||
remove(s, me());
|
||||
take(water);
|
||||
take(trash);
|
||||
return (_("Думаю, стоит тебя немного разделить."));
|
||||
elseif w == mixer then
|
||||
if s._fired then
|
||||
if not s.mix then
|
||||
mixer.content = mixer.content + 32;
|
||||
s.mix = true;
|
||||
end
|
||||
remove(s, me());
|
||||
return (_("Крыса добавлена в миксер."));
|
||||
else
|
||||
return (_("Необходимость добавления органической крысы в не выявлена. Операция отменена."));
|
||||
end
|
||||
end;
|
||||
end,
|
||||
inv = function (s)
|
||||
local state = "не поджарена.";
|
||||
if s._fired then
|
||||
state = "поджарена.";
|
||||
end
|
||||
return (_("Если тыкнуть крысу, она запищит. Отпускать её однозначно не стоит. Тем более, что тварь "))..state;
|
||||
end,
|
||||
}
|
||||
|
||||
water = obj {
|
||||
var {mix = false},
|
||||
nam = _("Вода"),
|
||||
dsc = "Вода, что тут ещё сказать.",
|
||||
use = function (s, w)
|
||||
if w == mixer then
|
||||
if not s.mix then
|
||||
s.mix = true;
|
||||
mixer.content = mixer.content + 16;
|
||||
end
|
||||
remove(s, me());
|
||||
return s.nam.." добавлена в миксер.";
|
||||
end;
|
||||
end,
|
||||
inv = "Набор молекул, заключенный в ограниченном объёме.",
|
||||
}
|
||||
|
||||
trash = obj {
|
||||
nam = _("Крысиная требуха"),
|
||||
inv = "Молекулярная суспензия. Всё что осталось от крысы после отделения воды.",
|
||||
}
|
||||
|
||||
destructor = obj {
|
||||
nam = _("Термический распылитель"),
|
||||
dsc = "Справа от двери висит {термический распылитель}^",
|
||||
act = function (s)
|
||||
take(s);
|
||||
p (_("Распылитель пригодится. Мало ли каких тварей привлекают к себе заготовленные ингредиенты."));
|
||||
end,
|
||||
use = function (s, w)
|
||||
if w == rat then
|
||||
w._fired = true;
|
||||
sound_("shoot_destructor")();
|
||||
return (_("Один выстрел из термического распылителя в крысу превратит её в сгусток энергии при малейшей встряске. Обычно это позволяет убить чуть больше одной крысы за раз, когда они начинают бороться и убегать."));
|
||||
end
|
||||
end,
|
||||
inv = function(s)
|
||||
drop(s);
|
||||
return (_("На складе распылителю самое место."));
|
||||
end
|
||||
}
|
||||
|
||||
endscreen = room {
|
||||
nam = _("Конец"),
|
||||
enter = function() mute_()(); complete_("cook")() end,
|
||||
dsc = "Вот и подошел конец моему дежурству. Надеюсь, вечеринка по случаю прибытия удастся.^Ну а мне пора в свой отсек, на очередную гибернацию.^",
|
||||
act = gamefile_("dream.lua"),
|
||||
obj = { vobj("next", txtc("{Продолжение...}")) }
|
||||
}
|
||||
|
||||
greenlight = obj {
|
||||
nam = "Зелёный индикатор",
|
||||
inv = function (s)
|
||||
walk("endscreen");
|
||||
end,
|
||||
}
|
||||
|
||||
function check_conditions ()
|
||||
if(_patterns[0] and _patterns[1] and _patterns[2]) then
|
||||
take("greenlight", me());
|
||||
end;
|
||||
end
|
603
crio.lua
Normal file
|
@ -0,0 +1,603 @@
|
|||
--$Name:Отсек K007$
|
||||
instead_version "1.9.1"
|
||||
require "lib"
|
||||
require "para"
|
||||
require "dash"
|
||||
require "quotes"
|
||||
require "hideinv"
|
||||
|
||||
R = room
|
||||
O = obj
|
||||
rem = remove
|
||||
mf = math.floor
|
||||
sf = string.format
|
||||
|
||||
_alert = false
|
||||
|
||||
require "xact"
|
||||
require "nouse"
|
||||
|
||||
main = timerpause(1100, 999, "main2");
|
||||
|
||||
main2 = R {
|
||||
nam = '...';
|
||||
title = _("ОТСЕК 007");
|
||||
num = 4;
|
||||
forcedsc = true;
|
||||
hideinv = true;
|
||||
enter = function() music_("pumped",0)();take 'sh' end;
|
||||
dsc = [[Я WR017 и моя вахта уже подходит к концу.
|
||||
Сейчас я заканчиваю уборку в крио-отсеке К007 и
|
||||
у меня еще останется время, чтобы спокойно добраться
|
||||
до своего отсека и уйти в гибернацию...^^
|
||||
{xwalk(r7)|Дальше}]];
|
||||
}
|
||||
|
||||
rat = O {
|
||||
nam = 'крыса';
|
||||
dsc = "Я вижу как жирная {крыса} грызет оплетку кабеля у одной из капсул.";
|
||||
act = "Эти твари размножаются с огромной скоростью. Им уже тесно на нижних палубах."
|
||||
}
|
||||
|
||||
port2 = O {
|
||||
nam = function(s)
|
||||
if s._conn then
|
||||
pr "*"
|
||||
end
|
||||
pr 'порт XG232';
|
||||
end;
|
||||
inv = [[Это отладочный порт.]];
|
||||
use = function(s, w)
|
||||
if w == port then
|
||||
if s._conn and port3._conn then
|
||||
p (_("Я подсоединил кабель к отладочному порту."))
|
||||
_debug = true
|
||||
put(wire, port);
|
||||
rem(s, me())
|
||||
rem(port3, me())
|
||||
else
|
||||
p (_("Это не сработает. Мне нужно как-то подключиться к порту."))
|
||||
end
|
||||
end
|
||||
end;
|
||||
nouse = "Отладочный порт тут не поможет."
|
||||
}
|
||||
|
||||
port3 = O {
|
||||
nam = function(s)
|
||||
if s._conn then
|
||||
pr "*"
|
||||
end
|
||||
pr 'порт US19';
|
||||
end;
|
||||
inv = "Это эксплуатационный порт.";
|
||||
nouse = "Этот порт не поможет."
|
||||
}
|
||||
|
||||
wire = O {
|
||||
nam = 'кабель';
|
||||
inv = "Коммуникационный кабель.";
|
||||
dsc = "К порту подключен {кабель}.";
|
||||
act = function(s)
|
||||
if _mem[0x78] ~= 0xff then
|
||||
walkin 'hack'
|
||||
else
|
||||
p [[Я выбросил провод, чтобы у них не было лишних вопросов.]]
|
||||
rem(s)
|
||||
end
|
||||
end;
|
||||
use = function(s, w)
|
||||
if w == port2 or w == port3 then
|
||||
p (_("Я подсоединил провод к порту."))
|
||||
w._conn = true
|
||||
end
|
||||
end;
|
||||
nouse = "Провод тут не поможет.";
|
||||
}
|
||||
|
||||
lcd = O {
|
||||
nam = 'индикатор';
|
||||
inv = "Индикатор больше ничего не показывает.";
|
||||
nouse = "Индикатор не может осуществлять индикацию.";
|
||||
}
|
||||
|
||||
sh2 = O {
|
||||
nam = 'щетка';
|
||||
inv = [[Теперь это устройство для уборки лишено своих интеллектуальных функций.]];
|
||||
use = function(s, w)
|
||||
return sh:use(w)
|
||||
end
|
||||
}
|
||||
|
||||
trash = O {
|
||||
nam = 'мусор';
|
||||
dsc = [[На полу валяются {запчасти} от швабры.]];
|
||||
act = function(s)
|
||||
rem(s)
|
||||
take 'port2'
|
||||
take 'port3'
|
||||
take 'wire'
|
||||
take 'lcd'
|
||||
take 'sh2'
|
||||
p [[Я забрал то, что осталось целым.]]
|
||||
end
|
||||
}
|
||||
|
||||
blast = O {
|
||||
nam = 'бластер';
|
||||
inv = [[Хе-хе...]];
|
||||
_s = false;
|
||||
use = function(s, w)
|
||||
if _alert then
|
||||
if w == sh and _port and not taken(port2) then
|
||||
sound_("shoot_lazer")();
|
||||
p [[Я разнес швабру бластером!!!]]
|
||||
rem(sh, me())
|
||||
put(trash)
|
||||
return
|
||||
end
|
||||
return (_("Я уже наигрался с бластером!!!"))
|
||||
end
|
||||
if w == rat then
|
||||
if not s._s then
|
||||
sound_("shoot_lazer")();
|
||||
s._s = true
|
||||
p [[Я прицелился и выстрелил в эту гадину.]]
|
||||
p [[^^Проклятые манипуляторы!
|
||||
Конечно, я промазал!!! Вернее, я попал,
|
||||
но не в крысу, а в блок управления криосном...^^
|
||||
Я понял это по мерцанию индикатора.]]
|
||||
else
|
||||
if comp._s == 13 then
|
||||
return (_("Сначала надо понять что я наделал!!!"))
|
||||
end
|
||||
walk 'p2'
|
||||
end
|
||||
else
|
||||
end
|
||||
end;
|
||||
nouse = [[Не стоит зря размахивать оружием.]];
|
||||
}
|
||||
|
||||
shl1 = O {
|
||||
nam = 'шкафчики';
|
||||
dsc = [[У стен, рядом с каждой капсулой расположены {шкафчики}.]];
|
||||
act = function(s)
|
||||
if s._br then
|
||||
p (_("Один из шкафчиков открыт... гм... Вернее, он разломан."))
|
||||
if not taken 'blast' then
|
||||
p [[Я обнаружил там какую-то одежду и бластер!!!]]
|
||||
take 'blast'
|
||||
end
|
||||
end
|
||||
if seen(rat) then
|
||||
p [[Шкафчики закрыты.]]
|
||||
else
|
||||
p [[Наверное, это личные шкафчики обитателей криокапсул.]];
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
cap = O {
|
||||
nam = 'капсулы';
|
||||
dsc = [[В этом крио-отсеке установлены 6 {капсул}.]];
|
||||
act = [[Не имею никакого понятия, кто там внутри.]];
|
||||
}
|
||||
port = O {
|
||||
nam = 'порт';
|
||||
dsc = [[В блоке управления есть отладочный {порт}.]];
|
||||
act = function(s)
|
||||
if _debug then
|
||||
p [[Вообще-то у меня другая специализация...]]
|
||||
return
|
||||
end
|
||||
p [[Тут нужен разъем, которого у меня нет!!!]]
|
||||
_port = true;
|
||||
end;
|
||||
obj = { };
|
||||
}:disable()
|
||||
|
||||
comp = O {
|
||||
nam = 'комп';
|
||||
dsc = [[В середине комнаты расположен {блок} управления криосном.]];
|
||||
_s = 13;
|
||||
act = function(s)
|
||||
if _alert then
|
||||
p [[Я бросился к блоку управления. Он выглядел не важно,
|
||||
но я все-таки обнаружил порт отладки.]]
|
||||
port:enable()
|
||||
return
|
||||
end
|
||||
if _mem[0x78] == 0xff then
|
||||
p [[Я прочитал надпись на индикаторе:^^
|
||||
Все системы в норме.]]
|
||||
return
|
||||
end
|
||||
if blast._s then
|
||||
p [[Не без содрогания я прочитал надпись на индикаторе:^^
|
||||
Нарушена контрольная сумма.^
|
||||
Осуществляется переход на резервную копию: ]]
|
||||
p (s._s, '%')
|
||||
s._s = s._s + 5
|
||||
if s._s >= 100 then
|
||||
s._s = 99
|
||||
end
|
||||
p [[^Фух... Кажется, на этот раз пронесло.]]
|
||||
return
|
||||
end
|
||||
p [[Это лучше не трогать.]]
|
||||
end;
|
||||
obj = { port };
|
||||
}
|
||||
|
||||
fl = O {
|
||||
nam = 'пол';
|
||||
_pena = false;
|
||||
dsc = function(s)
|
||||
if s._pena then
|
||||
p [[{Пол} залит пеной.]];
|
||||
else
|
||||
p [[{Пол} здесь уже почти идеально чист.]];
|
||||
end
|
||||
end;
|
||||
act = function(s)
|
||||
if _alert then
|
||||
return (_("Нет времени пялиться на пол!"))
|
||||
end
|
||||
if s._pena then
|
||||
return (_("Предстоит много работы..."))
|
||||
end
|
||||
p [[Моя работа почти завершена.]]
|
||||
end;
|
||||
}
|
||||
|
||||
sh = O {
|
||||
nam = 'швабра';
|
||||
inv = function(s)
|
||||
p (_("Этой электро-швабре лет 500, но она отлично работает."));
|
||||
if _port then
|
||||
p [[Электро-швабра интеллектуальное устройство,
|
||||
может быть в ней есть отладочный порт?]];
|
||||
end
|
||||
return
|
||||
end;
|
||||
_s = 1;
|
||||
use = function(s, w)
|
||||
if _alert then
|
||||
return (_("Нет времени заниматься уборкой!"))
|
||||
end
|
||||
if w == fl then
|
||||
if w._pena then
|
||||
p [[Я очищаю пену с пола.]]
|
||||
w._pena = w._pena - 1
|
||||
if w._pena == 0 then
|
||||
p [[Все... Пол чист.]]
|
||||
w._pena = false
|
||||
end
|
||||
return
|
||||
end
|
||||
s._s = s._s + 1
|
||||
p [[Я еще немного почистил пол.]]
|
||||
if s._s == 5 then
|
||||
putf(rat);
|
||||
p [[^^Внезапно, мои звуковые рецепторы задетектировали какой-то шум. Я обернулся. Это была она! Жирная тварь как-то проникла в жизненно важный отсек и грызла проводку!!!]]
|
||||
end
|
||||
elseif w == rat then
|
||||
p [[Проклятая тварь не боится меня. Она просто отпрыгнула от швабры, но потом принялась за свое.]]
|
||||
elseif w == shl1 then
|
||||
if seen 'rat' then
|
||||
p [[Я не смог открыть шкафчик шваброй.]]
|
||||
else
|
||||
p [[Я почистил плинтуса у шкафчиков.]]
|
||||
end
|
||||
elseif w == cap then
|
||||
p [[Я почистил капсулы.]]
|
||||
end
|
||||
end;
|
||||
nouse = [[Шваброй?]];
|
||||
}
|
||||
|
||||
flame = O {
|
||||
nam = 'огнетушитель';
|
||||
inv = "Я еле держу его своими манипуляторами.";
|
||||
use = function(s, w)
|
||||
if _alert then
|
||||
return (_("Ситуация вышла из под контроля!"))
|
||||
end
|
||||
if w == rat then
|
||||
if not fl._pena then fl._pena = 0 end
|
||||
fl._pena = fl._pena + 5
|
||||
p [[Мои манипуляторы не привыкли управляться огнетушителем,
|
||||
поэтому я запенил большую часть отсека, но проклятая
|
||||
крыса это проигнорировала.]];
|
||||
elseif w == shl1 then
|
||||
if not shl1._br then
|
||||
p [[Сам не зная, что я делаю. Я принялся разрушать один из шкафчиков.]]
|
||||
shl1._br = true
|
||||
p [[Это оказалось не просто, но у меня получилось.]]
|
||||
else
|
||||
p [[Хватит разрушений. Кому-то придется отвечать за это... потом.]]
|
||||
end
|
||||
end
|
||||
end;
|
||||
nouse = 'Лучше быть осторожней с этим огнетушителем.';
|
||||
}
|
||||
|
||||
slf = O {
|
||||
nam = 'шкаф';
|
||||
dsc = [[У стены установлен {шкафчик} красного цвета.]];
|
||||
act = function(s)
|
||||
if not taken 'flame' then
|
||||
p [[Шкафчик не был закрыт, и в нем оказался огнетушитель.]];
|
||||
take 'flame'
|
||||
else
|
||||
p [[Шкафчик пуст.]]
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
ex = R {
|
||||
nam = 'Лифт';
|
||||
enter = function(s)
|
||||
if _mem[0x78] == 0xff then
|
||||
walk 'theend'
|
||||
return
|
||||
end
|
||||
p [[Мне рано уходить.]]
|
||||
return false
|
||||
end;
|
||||
}
|
||||
|
||||
out = R {
|
||||
nam = 'Криоблок';
|
||||
pxa = {
|
||||
{ "door4", 50 },
|
||||
{ "box3", 380 }
|
||||
},
|
||||
dsc = [[Я в коридоре криоблока корабля.]];
|
||||
obj = { slf },
|
||||
way = { 'r7', 'ex' };
|
||||
}
|
||||
|
||||
r7 = R {
|
||||
exit = function(s)
|
||||
if _alert then
|
||||
p [[Бежать! Сначала в шлюз, потом в спасательную капсулу!!!^^
|
||||
Нет... Это не поможет. Они уничтожат меня! Что же делать! Что же делать!]];
|
||||
return false
|
||||
end
|
||||
if seen(rat) then
|
||||
return
|
||||
end
|
||||
if fl._pena or sh._s < 5 then
|
||||
p [[Пол пока не достаточно чист.]]
|
||||
return false
|
||||
end
|
||||
end;
|
||||
nam = 'К007';
|
||||
pxa = {
|
||||
{ "door4", 10 },
|
||||
{ if_("not blast._s","panel","panel_broken"), 220 },
|
||||
{ if_("exist(rat)","rat"), 180 },
|
||||
{ "crio", 300 }
|
||||
};
|
||||
dsc = [[В крио-отсеке.]];
|
||||
obj = { cap, shl1, comp, fl };
|
||||
way = { out };
|
||||
}
|
||||
|
||||
p2 = room {
|
||||
nam = '...';
|
||||
_s = 1;
|
||||
forcedsc = true;
|
||||
hideinv = true;
|
||||
pxa = {
|
||||
{ if_("p2._s<5", "rat"), 220 }
|
||||
};
|
||||
dscs = {
|
||||
"Ну, уж на этот раз я не промахнусь!",
|
||||
"...",
|
||||
"После того, как луч бластера выбил сноп искр из блока управления криосном, cвет в отсеке погас.",
|
||||
"Несколько секунд было тихо, а затем послышался противный пульсирующий звук и свет наконец снова зажегся.",
|
||||
"Крыса куда-то делась... Но мне было уже не до нее!!!",
|
||||
"Внимание! Послышался женский голос. Целостность программы нарушена!!! Аварийный выход из гибернации через 60 секунд!!!",
|
||||
"Что я наделал?",
|
||||
};
|
||||
dsc = function(s)
|
||||
p (s.dscs[s._s])
|
||||
end;
|
||||
exit = function(s)
|
||||
_alert = true
|
||||
rem(rat, r7)
|
||||
end;
|
||||
obj = { O {
|
||||
nam = '';
|
||||
dsc = "{Дальше}";
|
||||
act = function(s)
|
||||
here()._s = here()._s + 1
|
||||
if here()._s == 2 then
|
||||
sound_("shoot_lazer")();
|
||||
end
|
||||
if here()._s == 8 then
|
||||
back();
|
||||
end
|
||||
return true
|
||||
end;
|
||||
}};
|
||||
}
|
||||
|
||||
hack = R {
|
||||
hideinv = true;
|
||||
pxa = { { "panel", 215 } };
|
||||
entered = function(s)
|
||||
s._flt = stead.mouse_filter(0)
|
||||
end;
|
||||
left = function(s)
|
||||
stead.mouse_filter(s._flt)
|
||||
if _mem[0x78] ~= 0xff then
|
||||
p [[Я отсоединился от порта. Я никогда не разберусь в этом!]]
|
||||
else
|
||||
_alert = false
|
||||
p [[Я отсоединился от порта. Мои манипуляторы дрожали.
|
||||
Женский голос произнес:^^
|
||||
Целостность восстановлена!^
|
||||
Раздражающий звук затих.]]
|
||||
end
|
||||
end;
|
||||
nam = 'Отладка';
|
||||
_s = 1;
|
||||
forcedsc = true;
|
||||
dsc = function(s)
|
||||
if s._s == 1 then
|
||||
p [[HX-OS 14.1^^DEBUG INTERFACE^^]];
|
||||
if _mem[0x78] ~= 0xff then
|
||||
p [[CRC FAILED]]
|
||||
else
|
||||
p [[CRC PASSED]]
|
||||
end
|
||||
elseif s._s == 2 then
|
||||
local t = txttab("20%", "left")
|
||||
local tt = txttab("50%", "left")
|
||||
pn ("1200"..t.."dd cd 01 2f"..tt.."INP R01,P07")
|
||||
pn ("1204"..t.."2b 98 01 78"..tt.."CMP R01,addr:78")
|
||||
pn ("1208"..t.."34 d0 12 14"..tt.."JN 1214")
|
||||
pn ("120C"..t.."34 22 90 90"..tt.."WAIT")
|
||||
pn ("1210"..t.."2b ee 12 00"..tt.."JUMP 1200")
|
||||
pn ("1214"..t.."98 32 6b 82"..tt.."P 'CR'")
|
||||
pn ("1218"..t.."98 32 6b 20"..tt.."P 'C '")
|
||||
pn ("121C"..t.."98 32 46 41"..tt.."P 'FA'")
|
||||
pn ("1220"..t.."98 32 49 4c"..tt.."P 'IL'")
|
||||
pn ("1224"..t.."98 32 45 44"..tt.."P 'ED'")
|
||||
pn ("1228"..t.."98 32 12 00"..tt.."JUMP 1200")
|
||||
elseif s._s == 3 then
|
||||
local i
|
||||
for i = 0,15 do
|
||||
local r = rnd(255)
|
||||
if i == 7 then
|
||||
r = 255
|
||||
end
|
||||
pn (sf("P%02x: %02x", i, r))
|
||||
end
|
||||
elseif s._s == 4 then
|
||||
pr "Addr: <u>"
|
||||
pr ("{a0|", sf(" %x", a0._s), "}")
|
||||
pr ("{a1|", sf("%x</u> ", a1._s), "}")
|
||||
pr " Data: [<u>"
|
||||
pr ("{a2|", sf(" %x", a2._s), "}")
|
||||
pr ("{a3|", sf("%x</u> ", a3._s), "}")
|
||||
pr "]"
|
||||
end
|
||||
|
||||
end;
|
||||
obj = {
|
||||
O {
|
||||
nam = '';
|
||||
dsc = function(s)
|
||||
if _stop then
|
||||
p (_("{Продолжить выполнение}"))
|
||||
return
|
||||
end
|
||||
p [[{Контрольная точка}]];
|
||||
end;
|
||||
act = function(s)
|
||||
if _stop then
|
||||
p [[Я запустил программу.]]
|
||||
here()._s = 1
|
||||
else
|
||||
p [[Я остановил программу.
|
||||
Кажется, это цикл проверки контрольной суммы...]]
|
||||
here()._s = 2
|
||||
end
|
||||
_stop = not _stop
|
||||
end;
|
||||
},
|
||||
O {
|
||||
nam = '';
|
||||
dsc = "^{Регистры ввода-вывода}";
|
||||
act = function(s)
|
||||
p [[Я вывел дамп регистров ввода-вывода.]]
|
||||
here()._s = 3
|
||||
end;
|
||||
},
|
||||
O {
|
||||
nam = '';
|
||||
dsc = "^{Память}";
|
||||
act = function(s)
|
||||
if not _stop then
|
||||
p [[Опасно менять данные памяти во время работы кода.]]
|
||||
return
|
||||
end
|
||||
p [[Я запустил редактор памяти.]]
|
||||
here()._s = 4
|
||||
end;
|
||||
};
|
||||
O {
|
||||
nam = '';
|
||||
dsc = [[^{Выход}]];
|
||||
act = code [[ back() ]];
|
||||
};
|
||||
obj = {'a0', 'a1'}
|
||||
}
|
||||
}
|
||||
_mem = { }
|
||||
|
||||
function init()
|
||||
local i
|
||||
for i=0,255 do
|
||||
local r = (12751%(i+1))%256;
|
||||
_mem[i] = r
|
||||
end
|
||||
end
|
||||
|
||||
inp = function()
|
||||
local o = xact('', function(s)
|
||||
s._s = s._s + 1
|
||||
if s._s > 15 then
|
||||
s._s = 0
|
||||
end
|
||||
local a = a0._s * 16 + a1._s
|
||||
if s.t then
|
||||
local v = _mem[a]
|
||||
a2._s = mf(v/16)
|
||||
a3._s = mf(v%16)
|
||||
else
|
||||
local v = a2._s * 16 + a3._s
|
||||
_mem[a] = v
|
||||
end
|
||||
return true
|
||||
end)
|
||||
o._s = 0
|
||||
return o
|
||||
end
|
||||
|
||||
a0 = inp()
|
||||
a0.t = true
|
||||
a1 = inp()
|
||||
a1.t = true
|
||||
|
||||
a2 = inp()
|
||||
a3 = inp()
|
||||
|
||||
function start()
|
||||
if here() == hack then
|
||||
stead.mouse_filter(0)
|
||||
end
|
||||
end
|
||||
theend = R {
|
||||
nam = '...';
|
||||
hideinv = true;
|
||||
enter = function() mute_()(); complete_("crio")(); end;
|
||||
dsc = function(s)
|
||||
p [[Я без приключений добрался до своего отсека и закрыл за собой дверь. ^
|
||||
Все закончилось не так уж и плохо!]]
|
||||
p [[Я был уверен, что правильно починил блок управления, хотя
|
||||
это был мой первый опыт проникновения...]]
|
||||
if seen(wire, r7) then
|
||||
p [[^^Перед тем как отключиться, я вдруг вспомнил, что
|
||||
оставил кабель в отладочном порту блока управления....]];
|
||||
end
|
||||
p [[В любом случае это были уже не мои проблемы...]]
|
||||
end;
|
||||
act = gamefile_("watch.lua");
|
||||
obj = { vobj("next", txtc("^{КОНЕЦ?}")) }
|
||||
}
|
366
dream.lua
Normal file
|
@ -0,0 +1,366 @@
|
|||
--$Name: Сон$
|
||||
--$Version: 0.1$
|
||||
--$Author: Андрей Лобанов$
|
||||
|
||||
instead_version '1.9.1'
|
||||
require "lib"
|
||||
require "para"
|
||||
require "dash"
|
||||
require "quotes"
|
||||
require "hideinv"
|
||||
require "nouse"
|
||||
|
||||
main=room{
|
||||
nam='...',
|
||||
title = {"С", "О", "Н" },
|
||||
num = 12,
|
||||
enter = music_("influensa",0),
|
||||
dsc='Я прожил достойную жизнь. Построил свой дом, вырастил детей... Теперь они уважаемые люди. С соседями я в хороших отношениях. Мне нечего стыдиться за всю мою долгую жизнь.^^Но в последнее время странные события начали происходить вокруг меня. Сперва я всё списывал на причудливые видения старика, но сейчас мне страшно. И никто вокруг не замечает происходящего.',
|
||||
act=function()
|
||||
walk(home)
|
||||
end,
|
||||
obj={vobj('next','{Продолжить}')},
|
||||
}
|
||||
|
||||
home=room{
|
||||
nam='Мой дом',
|
||||
pxa = {
|
||||
{ "window4", 20 },
|
||||
{ "table6", 240 },
|
||||
{ "chair1", 440 },
|
||||
{ "toolbox", 10 }
|
||||
},
|
||||
dsc='Я нахожусь у себя дома.',
|
||||
obj={'window','mtable', 'box'},
|
||||
way={'yard'},
|
||||
}
|
||||
|
||||
window=obj{
|
||||
nam='Окно',
|
||||
dsc='Во двор выходит большое {окно}.',
|
||||
act='На улице хорошая погода.',
|
||||
}
|
||||
|
||||
mtable=obj{
|
||||
nam='Стол',
|
||||
dsc='Возле окна стоит {стол}.',
|
||||
act='Грубо сработанный, но добротный стол, который я сделал сам.',
|
||||
}
|
||||
|
||||
box=obj{
|
||||
nam='Ящик',
|
||||
dsc='В углу стоит {ящик} с инструментами.',
|
||||
act=function(s)
|
||||
if not s._need then
|
||||
return 'Мне сейчас не нужны инструменты.'
|
||||
else
|
||||
if not have(axe) then
|
||||
take(axe)
|
||||
return 'Я взял топор.'
|
||||
else
|
||||
return 'Мне больше ничего не нужно из инструментов.'
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
axe=obj{
|
||||
_i=0,
|
||||
_cuts=0,
|
||||
nam='Топор',
|
||||
inv='Хороший острый топор.',
|
||||
use=function(s,w)
|
||||
if w==fence then
|
||||
return 'Этот забор я строил сам. Не буду его ломать.'
|
||||
elseif w== people then
|
||||
return 'Не буду я учинять бесчинства и убивать своих соседей и друзей.'
|
||||
elseif w==tree then
|
||||
ways(square):disable_all()
|
||||
if not exist(branch) then
|
||||
put(branch, tree)
|
||||
elseif branch._i<4 then
|
||||
branch._i=branch._i+1
|
||||
if branch._i==4 then
|
||||
walk(death)
|
||||
end
|
||||
end
|
||||
s._i=s._i+1
|
||||
if s._i==10 then
|
||||
objs(tree):del(branch)
|
||||
walk(after)
|
||||
end
|
||||
return 'Я замахнулся и как следует ударил по дереву.'
|
||||
elseif w==branch then
|
||||
if branch._i<3 then
|
||||
return 'Слишком высоко -- мне никак не дотянуться до неё.'
|
||||
else
|
||||
branch._i=0
|
||||
s._cuts=s._cuts+1;
|
||||
return 'Ловко увернувшись, я одним сильным ударом отрубил ветку.'
|
||||
end
|
||||
end
|
||||
end,
|
||||
nouse='Не стоит размахивать топором налево и направо.',
|
||||
}
|
||||
|
||||
yard=room{
|
||||
nam='Двор',
|
||||
pxa = {
|
||||
{ if_("exist(neighbor)","yard2","yard"), 0 }
|
||||
},
|
||||
dsc='Я стою во дворе своего дома.',
|
||||
obj={'fence'},
|
||||
way={'home'},
|
||||
}
|
||||
|
||||
fence=obj{
|
||||
nam='Забор',
|
||||
dsc='Двор обнесён невысоким {забором}.',
|
||||
act=function()
|
||||
if not exist(neighbor) and not box._need then
|
||||
place(neighbor)
|
||||
return 'За зобором я увидел соседа.'
|
||||
else
|
||||
return 'Этот забор я сам построил.'
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
neighbor=obj{
|
||||
nam='Сосед',
|
||||
dsc='За забором своими делами занимается {сосед}.',
|
||||
act=function(s)
|
||||
if not s._dlg then
|
||||
walk(neighor_dlg)
|
||||
else
|
||||
return 'Сосед занимается своими делами.'
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
neighor_dlg=dlg{
|
||||
hideinv=true,
|
||||
pxa = {
|
||||
{ "yard2", 0 }
|
||||
},
|
||||
nam='Разговор с соседом',
|
||||
enter='Как только я обратил на соседа внимение, как он повернулся ко мне и сказал:^^-- Привет. Видал что на площади делается?',
|
||||
phr={
|
||||
{1,true,'Нет','-- Выросло там за ночь большое дерево чудное. Аккурат там где молодёжь в лапту играет. Ни клён ни берёза. Никогда таких деревьев не видел.',[[pon(2)]]},
|
||||
{2,false,'Чудно. Надо посмотреть.','-- Ага. Все сейчас там и столпились.',[[neighbor._dlg=true;ways(yard):add(square);back()]]},
|
||||
},
|
||||
}
|
||||
|
||||
square=room{
|
||||
nam='Площадь',
|
||||
pxa = {
|
||||
{ if_("axe._cuts==0", "bigtree",
|
||||
if_("axe._cuts==1", "bigtree_nb1",
|
||||
if_("axe._cuts>1", "bigtree_nb2")
|
||||
)
|
||||
)
|
||||
,0 }
|
||||
},
|
||||
dsc='Я нахожусь на площади.',
|
||||
obj={'tree','people'},
|
||||
way={'yard'},
|
||||
}
|
||||
|
||||
tree=obj{
|
||||
nam='Дерево',
|
||||
dsc=function()
|
||||
if here()==square then
|
||||
return 'Прямо посреди площади стоит большущее {дерево}.'
|
||||
else
|
||||
return 'Посреди площади лежит срубленное мной {дерево}.'
|
||||
end
|
||||
end,
|
||||
act=function()
|
||||
if here()==square then
|
||||
return 'Никогда ничего подобного я не видел.'
|
||||
else
|
||||
objs(after):del(tree)
|
||||
objs(after):add(hole)
|
||||
return 'Едва я взглянул на дерево, как оно начало менять свою форму и обернулось гигантским червём, который запросто мог бы проглотить меня.^^Червь набросился на меня столь стремительно, что я едва успел увернуться. Он вгрызся в землю и исчез, оставив после себя широкий тоннель, уходящий вглубь.'
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
branch=obj{
|
||||
_i=0,
|
||||
nam='Ветка',
|
||||
dsc=function(s)
|
||||
if s._i==0 then
|
||||
return 'Одна из {веток} начала двигаться ко мне.'
|
||||
elseif s._i==1 then
|
||||
return 'Одна из {веток} приближается ко мне.'
|
||||
elseif s._i == 2 then
|
||||
return '{Ветка} скоро дотянется до меня.'
|
||||
elseif s._i==3 then
|
||||
return '{Ветка} уже почти дотянулась до меня.'
|
||||
end
|
||||
end,
|
||||
act='Нельзя допустить чтобы она успела коснуться меня.',
|
||||
}
|
||||
|
||||
people=obj{
|
||||
nam='Люди',
|
||||
dsc='Вокруг дерева столпились {жители} нашей деревни.',
|
||||
act=function(s)
|
||||
if here()==square then
|
||||
if not have(axe) and event._n==3 then
|
||||
return 'Стоят и смотрят на это жуткое дерево как ни в чём не бывало.'
|
||||
else
|
||||
if not have(axe) then
|
||||
walk(event)
|
||||
else
|
||||
return 'Пока меня не было, исчезло очень много народу, а остальные стоят -- не шелохнутся. И все смотрят на это страшное дерево.'
|
||||
end
|
||||
end
|
||||
else
|
||||
return 'Немногие оставшиеся жители стоят и смотрят туда, где только что стояло дерево. Они даже не моргают.'
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
after=room{
|
||||
nam='Площадь',
|
||||
pxa = {
|
||||
{ if_("not exist(hole)","bigtree2","tunnel"), 0 }
|
||||
},
|
||||
dsc=function(s)
|
||||
if not s._seen then
|
||||
s._seen=true
|
||||
return 'Наконец, я срубил дерево.'
|
||||
else
|
||||
return 'Я нахожусь на площади.'
|
||||
end
|
||||
end,
|
||||
obj={'tree','people'},
|
||||
}
|
||||
|
||||
hole=obj{
|
||||
nam='Тоннель',
|
||||
dsc='Посреди площади находится большая {дыра}, оставленная червём..',
|
||||
act=function(s)
|
||||
if not s._seen then
|
||||
s._seen=true
|
||||
if not path(vroom('В туннель','tunnel')) then
|
||||
ways():add(vroom('В туннель','tunnel'))
|
||||
end
|
||||
end
|
||||
return 'Абсалютно прямой туннель, в конце которого что-то ослепительно сияет.'
|
||||
end,
|
||||
}
|
||||
|
||||
event=room{
|
||||
hideinv=true,
|
||||
forcedsc=true,
|
||||
_n=0,
|
||||
nam='Площадь',
|
||||
pxa = {
|
||||
{"bigtree", 0}
|
||||
},
|
||||
dsc=function(s)
|
||||
v='Вдруг одна ветка шевельнулась.'
|
||||
music_("death",0)();
|
||||
if s._n>=1 then
|
||||
v=v..'^^Неторопливым движением она склонилась к молоденькой девушке, что живёт недалеко от меня.'
|
||||
end
|
||||
if s._n>1 then
|
||||
v=v..'^^Ветка всё ближе и ближе пожбирается к девушке. Похоже, никто кроме меня не замечает этого.'
|
||||
end
|
||||
if s._n>2 then
|
||||
v=v..'^^Вот ветка коснулась девушки и она пропала. Просто исчезла, как будто и не было её никогда. И никто не заметил этого!'
|
||||
end
|
||||
return v
|
||||
end,
|
||||
act=function(s)
|
||||
if s._n==0 then
|
||||
s._n=1
|
||||
return true
|
||||
elseif s._n==1 then
|
||||
s._n=2
|
||||
return true
|
||||
elseif s._n==2 then
|
||||
s._n=3
|
||||
return true
|
||||
else
|
||||
box._need=true
|
||||
objs(yard):del(neighbor)
|
||||
walk(square)
|
||||
end
|
||||
end,
|
||||
obj={vobj('next','{>>>>}')},
|
||||
}
|
||||
|
||||
tunnel=room{
|
||||
nam='Туннель',
|
||||
dsc='Я нахожусь в туннеле.',
|
||||
way={'after',vroom('К свету','nearlight')}
|
||||
}
|
||||
|
||||
nearlight=room{
|
||||
nam='Туннель',
|
||||
dsc='Я всё шёл и шёл. Выход уже давно пропал вдали, а свет всё не приближался. В конце концов я понял что не могу идти обратно -- что-то толкает меня вглубь тоннеля и не пускает обратно.',
|
||||
enter=function()
|
||||
inv():del(axe)
|
||||
end,
|
||||
way={vroom('К свету','nearlight2')},
|
||||
}
|
||||
|
||||
nearlight2=room{
|
||||
nam='Тоннель',
|
||||
dsc='Яркий свет заливает всё вокруг. Я уже не вижу стен туннеля, не вижу своих рук и ног -- есть только красивый и тёплый свет, заполняющий собой весь мир.',
|
||||
act=function()
|
||||
walk(dos)
|
||||
end,
|
||||
obj={vobj('next','{Далее}')},
|
||||
}
|
||||
|
||||
dos=room{
|
||||
nam='Операционная система',
|
||||
dsc=function(s)
|
||||
if not s._seen then
|
||||
s._seen=true
|
||||
return 'Всё исчезло. Остались только темнота и холод. Некоторое время ничего не происходило, а потом я услышал приятный голос операционной системы:^^-- Ваш сон закончен. Спасибо что использовали программное обеспечение "Dream Software".^^Ваши сны -- наша забота.'
|
||||
else
|
||||
return 'Я нахожусь в криокапсуле. Крышка капсулы не открывается.'
|
||||
end
|
||||
end,
|
||||
act=function(s)
|
||||
if not exist(button) then
|
||||
put(button)
|
||||
objs():del('next')
|
||||
return 'Я осмотрелся повнимательней. Меня всё ещё мутит и я не очень понимаю где и кто я.'
|
||||
end
|
||||
end,
|
||||
obj={vobj('next','{Далее}')},
|
||||
}
|
||||
|
||||
button=obj{
|
||||
nam='Кнопка',
|
||||
dsc='Я вижу {кнопку} аварийного открытия капсулы.',
|
||||
act=function()
|
||||
walk(theend)
|
||||
end,
|
||||
}
|
||||
|
||||
theend=room{
|
||||
nam='Конец',
|
||||
enter = function() mute_()(); complete_("dream")() end,
|
||||
dsc='Крышка отъехала в сторону. Трясясь от холода, я вышел в отсек K013...',
|
||||
act = gamefile_("nightmare.lua"),
|
||||
obj = { vobj("next", txtc("{Продолжение...}")) }
|
||||
}
|
||||
|
||||
light=obj{
|
||||
nam='Свет',
|
||||
dsc='Вдалеке виден {свет}.',
|
||||
act='Я не знаю почему, но меня тянет к нему.',
|
||||
}
|
||||
|
||||
death=room{
|
||||
nam='Конец',
|
||||
dsc='Ветка всё таки коснулась меня.^^Время замерло, свет начал медленно угасать...',
|
||||
}
|
660
endtitles.lua
Normal file
|
@ -0,0 +1,660 @@
|
|||
require "sprites"
|
||||
require "timer"
|
||||
require "xact"
|
||||
require "lib"
|
||||
|
||||
function cleanlines()
|
||||
if game.cachefontbox == nil then
|
||||
game.cachefontbox = sprite.box(465, 260, "black");
|
||||
end
|
||||
sprite.copy(game.cachefontbox, sprite.screen(), 45, 300);
|
||||
end
|
||||
|
||||
function drawline(txt,y)
|
||||
if game.cachefont == nil then
|
||||
game.cachefont = sprite.font("theme/pf7.ttf", 22);
|
||||
end
|
||||
local w, h = sprite.text_size(game.cachefont, txt);
|
||||
local tz = sprite.text(game.cachefont, txt, "gray");
|
||||
sprite.draw(tz, sprite.screen(), (465-w)/2+30, y);
|
||||
sprite.free(tz);
|
||||
sprite.free(bx);
|
||||
end
|
||||
|
||||
function titleroom(r)
|
||||
local timer = r.timer;
|
||||
r.timer = function(s)
|
||||
if game.codec == nil then
|
||||
game.codec = 0;
|
||||
end
|
||||
local spr = loadsprite("code");
|
||||
sprite.copy(spr, 0, game.codec, 180, 483, sprite.screen(), 578, 35);
|
||||
game.codec = game.codec + 2;
|
||||
if timer ~= nil then
|
||||
return timer(s);
|
||||
end
|
||||
end
|
||||
return room(r);
|
||||
end
|
||||
|
||||
function drawbg(s)
|
||||
if not main.bgdrawn then
|
||||
local px = sprite.load("theme/back.png");
|
||||
sprite.copy(px, sprite.screen(), 0, 0);
|
||||
sprite.free(px);
|
||||
main.bgdrawn = true;
|
||||
end
|
||||
if not s.bgdrawn then
|
||||
local px = sprite.box(500, 200, "black");
|
||||
sprite.copy(px, sprite.screen(), 30, 30);
|
||||
sprite.free(px);
|
||||
cleanlines();
|
||||
s.bgdrawn = true;
|
||||
end
|
||||
end
|
||||
|
||||
main = room {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
mute_(0,0)();
|
||||
music_("datagroove")();
|
||||
timer:set(600);
|
||||
end
|
||||
,timer = function(s)
|
||||
timer:stop();
|
||||
walk(title1);
|
||||
end
|
||||
}
|
||||
|
||||
title1 = titleroom {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
timer:set(200);
|
||||
end
|
||||
,prepare = function(s)
|
||||
drawbg(s);
|
||||
if not s.directdrawn then
|
||||
local tab = sprite.load("gfx/table5.png");
|
||||
sprite.copy(tab, sprite.screen(), 130, 110);
|
||||
sprite.free(tab);
|
||||
local door = sprite.load("gfx/door4.png");
|
||||
sprite.copy(door, 0, 0, 70, 140, sprite.screen(), 460, 90);
|
||||
sprite.free(door);
|
||||
s.directdrawn = true;
|
||||
end
|
||||
end
|
||||
,timer = function(s)
|
||||
s:prepare();
|
||||
if s._frame == nil then
|
||||
s._frame = 0;
|
||||
end
|
||||
local spr1 = loadsprite("ratsmall");
|
||||
local spr2 = loadsprite("rat");
|
||||
if s._frame == 1 then
|
||||
play_sound("cork");
|
||||
sprite.copy(spr1, sprite.screen(), 40, 195);
|
||||
elseif s._frame == 2 then
|
||||
sprite.copy(spr2, sprite.screen(), 40, 165);
|
||||
elseif s._frame == 4 then
|
||||
play_sound("cork");
|
||||
sprite.copy(spr1, sprite.screen(), 120, 135);
|
||||
elseif s._frame == 5 then
|
||||
sprite.copy(spr2, sprite.screen(), 120, 105);
|
||||
elseif s._frame == 7 then
|
||||
play_sound("cork");
|
||||
sprite.copy(spr1, sprite.screen(), 270, 135);
|
||||
elseif s._frame == 8 then
|
||||
sprite.copy(spr2, sprite.screen(), 270, 105);
|
||||
elseif s._frame == 10 then
|
||||
play_sound("cork");
|
||||
sprite.copy(spr1, sprite.screen(), 340, 195);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(spr2, sprite.screen(), 340, 165);
|
||||
elseif s._frame == 13 then
|
||||
play_sound("cork");
|
||||
sprite.copy(spr1, sprite.screen(), 405, 195);
|
||||
elseif s._frame == 14 then
|
||||
sprite.copy(spr2, sprite.screen(), 405, 165);
|
||||
elseif s._frame == 16 then
|
||||
drawline("платформа instead", 400);
|
||||
drawline("ПЁТР КОСЫХ", 430);
|
||||
elseif s._frame == 26 then
|
||||
cleanlines();
|
||||
drawline("составление сборника", 400);
|
||||
drawline("ВАСИЛИЙ ВОРОНКОВ", 430);
|
||||
elseif s._frame == 36 then
|
||||
cleanlines();
|
||||
drawline("графика и оформление", 400);
|
||||
drawline("ВАСИЛИЙ ВОРОНКОВ", 430);
|
||||
elseif s._frame == 46 then
|
||||
return walk(title2);
|
||||
end
|
||||
s._frame = s._frame + 1;
|
||||
end
|
||||
,exit = function(s)
|
||||
timer:stop();
|
||||
s._frame = nil;
|
||||
end
|
||||
}
|
||||
|
||||
title2 = titleroom {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
timer:set(200);
|
||||
end
|
||||
,prepare = function(s)
|
||||
drawbg(s);
|
||||
end
|
||||
,timer = function(s)
|
||||
s:prepare();
|
||||
if s._frame == nil then
|
||||
s._frame = 0;
|
||||
end
|
||||
if s.bx == nil then
|
||||
s.bx = sprite.box(300, 172, "black");
|
||||
end
|
||||
local spr4 = loadsprite("crio_blood");
|
||||
|
||||
local spr1 = loadsprite("mutant2");
|
||||
local spr2 = loadsprite("mutant3");
|
||||
local spr3 = loadsprite("mutant4");
|
||||
|
||||
if s._frame == 1 then
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr3, sprite.screen(), 150, 58);
|
||||
elseif s._frame == 2 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 3 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr1, sprite.screen(), 160, 58);
|
||||
elseif s._frame == 4 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 5 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr3, sprite.screen(), 150, 58);
|
||||
|
||||
|
||||
elseif s._frame == 6 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 7 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr1, sprite.screen(), 160, 58);
|
||||
elseif s._frame == 8 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 9 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr3, sprite.screen(), 150, 58);
|
||||
|
||||
|
||||
elseif s._frame == 10 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr1, sprite.screen(), 160, 58);
|
||||
elseif s._frame == 12 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr2, sprite.screen(), 155, 58);
|
||||
elseif s._frame == 13 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 58);
|
||||
sprite.copy(spr4, sprite.screen(), 230, 75);
|
||||
sprite.draw(spr3, sprite.screen(), 150, 58);
|
||||
|
||||
elseif s._frame == 15 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("АНДРЕЙ ЛОБАНОВ", 430);
|
||||
elseif s._frame == 25 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("АНТОН И ОЛЬГА КОЛОСОВЫ", 430);
|
||||
elseif s._frame == 35 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ВАСИЛИЙ ВОРОНКОВ", 430);
|
||||
elseif s._frame == 45 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ДМИТРИЙ ДУДАРЬ", 430);
|
||||
elseif s._frame == 55 then
|
||||
return walk(title3);
|
||||
end
|
||||
|
||||
s._frame = s._frame + 1;
|
||||
end
|
||||
,exit = function(s)
|
||||
timer:stop();
|
||||
s._frame = nil;
|
||||
if s.bx ~= nil then
|
||||
sprite.free(s.bx);
|
||||
s.bx = nil;
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
title3 = titleroom {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
timer:set(200);
|
||||
end
|
||||
,prepare = function(s)
|
||||
drawbg(s);
|
||||
end
|
||||
,timer = function(s)
|
||||
s:prepare();
|
||||
if s._frame == nil then
|
||||
s._frame = 0;
|
||||
end
|
||||
if s.bx == nil then
|
||||
s.bx = sprite.box(60, 65, "black");
|
||||
end
|
||||
if s.bx2 == nil then
|
||||
s.bx2 = sprite.box(40, 45, "black");
|
||||
end
|
||||
local spr1 = loadsprite("rat");
|
||||
local spr2 = loadsprite("rat_dead");
|
||||
if s._frame == 1 then
|
||||
sprite.copy(spr1, sprite.screen(), 400, 165);
|
||||
elseif s._frame == 2 then
|
||||
sprite.copy(s.bx, sprite.screen(), 400, 165);
|
||||
sprite.copy(spr1, sprite.screen(), 390, 160);
|
||||
elseif s._frame == 3 then
|
||||
sprite.copy(s.bx, sprite.screen(), 390, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 380, 155);
|
||||
elseif s._frame == 4 then
|
||||
sprite.copy(s.bx, sprite.screen(), 380, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 370, 150);
|
||||
elseif s._frame == 5 then
|
||||
sprite.copy(s.bx, sprite.screen(), 370, 150);
|
||||
sprite.copy(spr1, sprite.screen(), 360, 155);
|
||||
elseif s._frame == 6 then
|
||||
sprite.copy(s.bx, sprite.screen(), 360, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 350, 160);
|
||||
elseif s._frame == 7 then
|
||||
sprite.copy(s.bx, sprite.screen(), 350, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 340, 165);
|
||||
|
||||
elseif s._frame == 8 then
|
||||
sprite.copy(s.bx, sprite.screen(), 340, 165);
|
||||
sprite.copy(spr1, sprite.screen(), 330, 160);
|
||||
elseif s._frame == 9 then
|
||||
sprite.copy(s.bx, sprite.screen(), 330, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 320, 155);
|
||||
elseif s._frame == 10 then
|
||||
sprite.copy(s.bx, sprite.screen(), 320, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 310, 150);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(s.bx, sprite.screen(), 310, 150);
|
||||
sprite.copy(spr1, sprite.screen(), 300, 155);
|
||||
elseif s._frame == 12 then
|
||||
sprite.copy(s.bx, sprite.screen(), 300, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 290, 160);
|
||||
elseif s._frame == 13 then
|
||||
sprite.copy(s.bx, sprite.screen(), 290, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 280, 165);
|
||||
|
||||
elseif s._frame == 14 then
|
||||
sprite.copy(s.bx, sprite.screen(), 280, 165);
|
||||
sprite.copy(spr1, sprite.screen(), 270, 160);
|
||||
elseif s._frame == 15 then
|
||||
sprite.copy(s.bx, sprite.screen(), 270, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 260, 155);
|
||||
elseif s._frame == 16 then
|
||||
sprite.copy(s.bx, sprite.screen(), 260, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 250, 150);
|
||||
elseif s._frame == 17 then
|
||||
sprite.copy(s.bx, sprite.screen(), 250, 150);
|
||||
sprite.copy(spr1, sprite.screen(), 240, 155);
|
||||
elseif s._frame == 18 then
|
||||
sprite.copy(s.bx, sprite.screen(), 240, 155);
|
||||
sprite.copy(spr1, sprite.screen(), 230, 160);
|
||||
elseif s._frame == 19 then
|
||||
sprite.copy(s.bx, sprite.screen(), 230, 160);
|
||||
sprite.copy(spr1, sprite.screen(), 220, 165);
|
||||
|
||||
elseif s._frame == 20 then
|
||||
sprite.draw(loadsprite("shoot"), sprite.screen(), 30, 180);
|
||||
elseif s._frame == 21 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 30, 180);
|
||||
sprite.draw(loadsprite("shoot"), sprite.screen(), 70, 180);
|
||||
elseif s._frame == 22 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 70, 180);
|
||||
sprite.draw(loadsprite("shoot"), sprite.screen(), 110, 180);
|
||||
elseif s._frame == 23 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 110, 180);
|
||||
sprite.draw(loadsprite("shoot"), sprite.screen(), 150, 180);
|
||||
elseif s._frame == 24 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 150, 180);
|
||||
sprite.draw(loadsprite("shoot"), sprite.screen(), 190, 180);
|
||||
elseif s._frame == 25 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 190, 180);
|
||||
sprite.copy(spr2, sprite.screen(), 220, 130);
|
||||
|
||||
|
||||
elseif s._frame == 27 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ДМИТРИЙ КОЛЕСНИКОВ", 430);
|
||||
elseif s._frame == 37 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ЕГОР ХАРВАТ", 430);
|
||||
elseif s._frame == 47 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("МАКСИМ КЛИШ", 430);
|
||||
elseif s._frame == 57 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("МАКСИМ J-MAKS", 430);
|
||||
elseif s._frame == 67 then
|
||||
return walk(title4);
|
||||
end
|
||||
s._frame = s._frame + 1;
|
||||
end
|
||||
,exit = function(s)
|
||||
timer:stop();
|
||||
s._frame = nil;
|
||||
if s.bx ~= nil then
|
||||
sprite.free(s.bx);
|
||||
s.bx =nil;
|
||||
end
|
||||
if s.bx2 ~= nil then
|
||||
sprite.free(s.bx2);
|
||||
s.bx2=nil;
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
title4 = titleroom {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
timer:set(200);
|
||||
end
|
||||
,prepare = function(s)
|
||||
drawbg(s);
|
||||
end
|
||||
,timer = function(s)
|
||||
s:prepare();
|
||||
if s._frame == nil then
|
||||
s._frame = 0;
|
||||
end
|
||||
if s.bx == nil then
|
||||
s.bx = sprite.box(200, 125, "black");
|
||||
end
|
||||
local spr1 = loadsprite("robodance1");
|
||||
local spr2 = loadsprite("robodance2");
|
||||
local spr3 = loadsprite("robodance3");
|
||||
local spr4 = loadsprite("robodance4");
|
||||
local spr5 = loadsprite("robodance5");
|
||||
local spr6 = loadsprite("robodance6");
|
||||
|
||||
if s._frame == 1 then
|
||||
sprite.copy(spr2, sprite.screen(), 180, 105);
|
||||
elseif s._frame == 2 then
|
||||
sprite.copy(s.bx, sprite.screen(), 180, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 170, 105);
|
||||
elseif s._frame == 3 then
|
||||
sprite.copy(s.bx, sprite.screen(), 170, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 160, 105);
|
||||
elseif s._frame == 4 then
|
||||
sprite.copy(s.bx, sprite.screen(), 160, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 150, 105);
|
||||
elseif s._frame == 5 then
|
||||
sprite.copy(s.bx, sprite.screen(), 150, 105);
|
||||
sprite.copy(spr3, sprite.screen(), 160, 105);
|
||||
elseif s._frame == 6 then
|
||||
sprite.copy(s.bx, sprite.screen(), 160, 105);
|
||||
sprite.copy(spr3, sprite.screen(), 170, 105);
|
||||
elseif s._frame == 7 then
|
||||
sprite.copy(s.bx, sprite.screen(), 170, 105);
|
||||
sprite.copy(spr3, sprite.screen(), 180, 105);
|
||||
elseif s._frame == 8 then
|
||||
sprite.copy(s.bx, sprite.screen(), 180, 105);
|
||||
sprite.copy(spr3, sprite.screen(), 190, 105);
|
||||
elseif s._frame == 9 then
|
||||
sprite.copy(s.bx, sprite.screen(), 190, 105);
|
||||
sprite.copy(spr3, sprite.screen(), 200, 105);
|
||||
elseif s._frame == 10 then
|
||||
sprite.copy(s.bx, sprite.screen(), 200, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 190, 105);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(s.bx, sprite.screen(), 190, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 180, 105);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(spr4, sprite.screen(), 180, 105);
|
||||
elseif s._frame == 12 then
|
||||
sprite.copy(spr5, sprite.screen(), 180, 105);
|
||||
elseif s._frame == 13 then
|
||||
sprite.copy(spr6, sprite.screen(), 180, 105);
|
||||
|
||||
elseif s._frame == 15 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ПЁТР КОСЫХ", 430);
|
||||
elseif s._frame == 25 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("РОМАН IRREMAN", 430);
|
||||
elseif s._frame == 35 then
|
||||
cleanlines();
|
||||
drawline("авторы игр", 400);
|
||||
drawline("ZERG.PRO", 430);
|
||||
elseif s._frame == 45 then
|
||||
return walk(title5);
|
||||
end
|
||||
|
||||
s._frame = s._frame + 1;
|
||||
end
|
||||
,exit = function(s)
|
||||
timer:stop();
|
||||
s._frame = nil;
|
||||
if s.bx ~= nil then
|
||||
sprite.free(s.bx);
|
||||
s.bx = nil;
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
title5 = titleroom {
|
||||
nam = ""
|
||||
,enter = function(s)
|
||||
timer:set(200);
|
||||
end
|
||||
,prepare = function(s)
|
||||
drawbg(s);
|
||||
if not s.directdrawn then
|
||||
local spr = loadsprite("hatch2");
|
||||
sprite.copy(spr, sprite.screen(), 330, 30);
|
||||
s.directdrawn = true;
|
||||
end
|
||||
end
|
||||
,timer = function(s)
|
||||
s:prepare();
|
||||
if s._frame == nil then
|
||||
s._frame = 0;
|
||||
end
|
||||
if s.bx == nil then
|
||||
s.bx = sprite.box(55, 124, "black");
|
||||
end
|
||||
if s.bx2 == nil then
|
||||
s.bx2 = sprite.box(240, 80, "black");
|
||||
end
|
||||
local spr1 = loadsprite("zombi");
|
||||
local spr2 = loadsprite("zombi_short");
|
||||
if s._frame == 1 then
|
||||
sprite.copy(spr1, sprite.screen(), 400, 105);
|
||||
elseif s._frame == 2 then
|
||||
sprite.copy(s.bx, sprite.screen(), 400, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 395, 105);
|
||||
elseif s._frame == 3 then
|
||||
sprite.copy(s.bx, sprite.screen(), 395, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 390, 105);
|
||||
elseif s._frame == 4 then
|
||||
sprite.copy(s.bx, sprite.screen(), 390, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 385, 105);
|
||||
elseif s._frame == 5 then
|
||||
sprite.copy(s.bx, sprite.screen(), 385, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 380, 105);
|
||||
elseif s._frame == 6 then
|
||||
sprite.copy(s.bx, sprite.screen(), 380, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 375, 105);
|
||||
elseif s._frame == 7 then
|
||||
sprite.copy(s.bx, sprite.screen(), 375, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 370, 105);
|
||||
|
||||
elseif s._frame == 8 then
|
||||
sprite.copy(s.bx, sprite.screen(), 370, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 365, 105);
|
||||
elseif s._frame == 9 then
|
||||
sprite.copy(s.bx, sprite.screen(), 365, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 360, 105);
|
||||
elseif s._frame == 10 then
|
||||
sprite.copy(s.bx, sprite.screen(), 360, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 355, 105);
|
||||
elseif s._frame == 11 then
|
||||
sprite.copy(s.bx, sprite.screen(), 355, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 350, 105);
|
||||
elseif s._frame == 12 then
|
||||
sprite.copy(s.bx, sprite.screen(), 350, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 345, 105);
|
||||
elseif s._frame == 13 then
|
||||
sprite.copy(s.bx, sprite.screen(), 345, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 340, 105);
|
||||
|
||||
elseif s._frame == 14 then
|
||||
sprite.copy(s.bx, sprite.screen(), 340, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 335, 105);
|
||||
elseif s._frame == 15 then
|
||||
sprite.copy(s.bx, sprite.screen(), 335, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 330, 105);
|
||||
elseif s._frame == 16 then
|
||||
sprite.copy(s.bx, sprite.screen(), 330, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 325, 105);
|
||||
elseif s._frame == 17 then
|
||||
sprite.copy(s.bx, sprite.screen(), 325, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 320, 105);
|
||||
elseif s._frame == 18 then
|
||||
sprite.copy(s.bx, sprite.screen(), 320, 105);
|
||||
sprite.copy(spr2, sprite.screen(), 315, 105);
|
||||
elseif s._frame == 19 then
|
||||
sprite.copy(s.bx, sprite.screen(), 315, 105);
|
||||
sprite.copy(spr1, sprite.screen(), 310, 105);
|
||||
elseif s._frame == 20 then
|
||||
sprite.copy(loadsprite("doorclose"), sprite.screen(), 40, 120);
|
||||
elseif s._frame == 23 then
|
||||
sprite.copy(s.bx2, sprite.screen(), 40, 120);
|
||||
sprite.copy(s.bx, sprite.screen(), 310, 105);
|
||||
sprite.draw(loadsprite("zombi_dead"), sprite.screen(), 260, 175);
|
||||
sprite.copy(loadsprite("hatch"), sprite.screen(), 330, 30);
|
||||
|
||||
|
||||
elseif s._frame == 25 then
|
||||
cleanlines();
|
||||
drawline("музыка", 400);
|
||||
drawline("8BIT BETTY", 430);
|
||||
elseif s._frame == 35 then
|
||||
cleanlines();
|
||||
drawline("музыка", 400);
|
||||
drawline("J. ARTHUR KEENES", 430);
|
||||
elseif s._frame == 45 then
|
||||
cleanlines();
|
||||
drawline("музыка", 400);
|
||||
drawline("ROLEMUSIC", 430);
|
||||
elseif s._frame == 55 then
|
||||
cleanlines();
|
||||
drawline("музыка", 400);
|
||||
drawline("GOTO80", 430);
|
||||
elseif s._frame == 65 then
|
||||
cleanlines();
|
||||
drawline("музыка", 400);
|
||||
drawline("EDWARD SHALLOW", 430);
|
||||
elseif s._frame == 75 then
|
||||
mute_()();
|
||||
theme.gfx.reset();
|
||||
main.bgdrawn = nil;
|
||||
title1.directdrawn=nil;
|
||||
title2.directdrawn=nil;
|
||||
title3.directdrawn=nil;
|
||||
title4.directdrawn=nil;
|
||||
title5.directdrawn=nil;
|
||||
title1.bgdrawn=nil;
|
||||
title2.bgdrawn=nil;
|
||||
title3.bgdrawn=nil;
|
||||
title4.bgdrawn=nil;
|
||||
title5.bgdrawn=nil;
|
||||
game.codec=nil;
|
||||
if game.cachefont ~= nil then
|
||||
sprite.free_font(cachefont);
|
||||
game.cachefont = nil;
|
||||
end
|
||||
if game.cachefontbox ~= nil then
|
||||
sprite.free(game.cachefontbox);
|
||||
game.cachefontbox = nil;
|
||||
end
|
||||
return walk(hend1);
|
||||
end
|
||||
|
||||
s._frame = s._frame + 1;
|
||||
end
|
||||
,exit = function(s)
|
||||
timer:stop();
|
||||
s._frame = nil;
|
||||
if s.bx ~= nil then
|
||||
sprite.free(s.bx);
|
||||
s.bx = nil;
|
||||
end
|
||||
if s.bx2 ~= nil then
|
||||
sprite.free(s.bx2);
|
||||
s.bx2 = nil;
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
hend1 = room {
|
||||
nam = "Конец"
|
||||
,pxa = {
|
||||
{ "planet", 172, 22 }
|
||||
}
|
||||
,dsc = "{xwalk(hend2)|-- Адмирал, есть ещё кое-что...}"
|
||||
}
|
||||
|
||||
hend2 = room {
|
||||
nam = 'Конец';
|
||||
enter = music_("poppies",0);
|
||||
pxa = {
|
||||
{ "planet", 172, 22 }
|
||||
};
|
||||
act = function()
|
||||
complete_("insteadose")();
|
||||
gamefile_("main.lua")();
|
||||
end;
|
||||
dsc = [[
|
||||
-- Я думаю вы должны знать.^
|
||||
-- Да?^
|
||||
-- Мы выяснили, куда делись жители планеты...^
|
||||
-- И?^
|
||||
-- Похоже, они отправились к Земле...
|
||||
]];
|
||||
obj = { vobj("next", txtc("{КОНЕЦ}")) }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
413
engineer.lua
Normal file
|
@ -0,0 +1,413 @@
|
|||
-- $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("^{КОНЕЦ?}")) }
|
||||
};
|
BIN
gfx/alpha.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/ballon.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/ballon2.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/barrel.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/barrel2.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/bfg.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/bigtree.png
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
gfx/bigtree2.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
gfx/bigtree_nb1.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
gfx/bigtree_nb2.png
Normal file
After Width: | Height: | Size: 4.6 KiB |
BIN
gfx/blaster.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/blood.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
gfx/books.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
gfx/box.png
Normal file
After Width: | Height: | Size: 515 B |
BIN
gfx/box2.png
Normal file
After Width: | Height: | Size: 377 B |
BIN
gfx/box3.png
Normal file
After Width: | Height: | Size: 807 B |
BIN
gfx/caption.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
gfx/caption_en.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/chair1.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/chair2.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/chair3.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/cheese.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
gfx/cleaner.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/cloner.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/code.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
gfx/column.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/communicator.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/computer.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/crio.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
gfx/crio_blood.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
gfx/device.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gfx/door1.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/door1_open.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/door2.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
gfx/door2_open.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
gfx/door3.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/door4.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
gfx/door5.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/door5_open.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
gfx/door6.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
gfx/doorclose.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gfx/dot.png
Normal file
After Width: | Height: | Size: 938 B |
BIN
gfx/dot2.png
Normal file
After Width: | Height: | Size: 938 B |
BIN
gfx/extin.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/foodgen.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
gfx/foodgen2.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
gfx/fridge.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
gfx/hatch.png
Normal file
After Width: | Height: | Size: 404 B |
BIN
gfx/hatch2.png
Normal file
After Width: | Height: | Size: 242 B |
BIN
gfx/hole.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/hole2.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
gfx/knife.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/med.png
Normal file
After Width: | Height: | Size: 325 B |
BIN
gfx/monitor.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/monitor2.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/mutant.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
gfx/mutant2.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/mutant3.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/mutant4.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
gfx/nums.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
gfx/oil.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/panel.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/panel_broken.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/pic.png
Normal file
After Width: | Height: | Size: 1 KiB |
BIN
gfx/planet.png
Normal file
After Width: | Height: | Size: 2.9 KiB |
BIN
gfx/program.png
Normal file
After Width: | Height: | Size: 1,009 B |
BIN
gfx/program_empty.png
Normal file
After Width: | Height: | Size: 977 B |
BIN
gfx/programmator.png
Normal file
After Width: | Height: | Size: 2 KiB |
BIN
gfx/rat.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/rat_dead.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/ratsmall.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gfx/redpile.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
gfx/repair.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/repair_broken.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/repair_meteor.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance1.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance2.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance3.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance4.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance5.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
gfx/robodance6.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
gfx/robot.png
Normal file
After Width: | Height: | Size: 1.5 KiB |