258 lines
11 KiB
Lua
258 lines
11 KiB
Lua
-- $Name: Вахта$
|
||
-- $Version: 0.2$
|
||
instead_version "1.9.1"
|
||
require "lib"
|
||
require "para"
|
||
require "dash"
|
||
require "quotes"
|
||
require "timer"
|
||
require "xact"
|
||
|
||
game.use = "Ошибка программы! Ээээ... т.е. нет, так лучше не делать."
|
||
local oob = obj;
|
||
function tc(f,s)
|
||
if type(f) == "function" then return tc(f(s),s) else return f end
|
||
end
|
||
function obj(t)
|
||
local d = t.dsc;
|
||
t.dsc = function(s) if s.cnd == nil or s:cnd() then return tc(d,s) end end
|
||
return oob(t);
|
||
end
|
||
|
||
main = timerpause(999, 700, "main2");
|
||
|
||
main2 = room {
|
||
_hand=false,
|
||
nam = "...",
|
||
enter = music_("square",0),
|
||
title = { "В", "А", "Х", "Т", "А" },
|
||
num =5,
|
||
act = function(s) walk(wakeup)end,
|
||
dsc="Я -- вахтенный робот WR005. Раз в сто лет я выхожу из режима гибернации и несу на корабле вахту на протяжении года, а потом снова отключаюсь. Куда корабль летит я не знаю -- этого нет в моих банках памяти. Но я знаю, что весь экипаж в глубокой криозаморозке.^^И вот вновь настала моя очередь дежурить. Я включаюсь...",
|
||
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();
|
||
s._do=true;
|
||
else
|
||
s._dsc=s._dsc.." нормально";
|
||
s._f=0;
|
||
s._s=s._s+1;
|
||
end
|
||
end
|
||
walk(wakeup);
|
||
end,
|
||
diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"},
|
||
obj = { xact("diag", code[[timer:set(500)]]), "wakeup_next" }
|
||
}
|
||
|
||
wakeup_next = obj {
|
||
nam="wakeup_next",
|
||
cnd=function()return wakeup._do end,
|
||
dsc="{Продолжить}",
|
||
act=function()walk(cabin1)end
|
||
}
|
||
|
||
cabin1 = room {
|
||
nam = "Отсек WR005",_closed=false,
|
||
pxa = {
|
||
{ if_("exist(oil)","oil"), 80, 100 },
|
||
{ if_("cabin1._closed", "door4", "door2_open"), 190 }
|
||
},
|
||
enter=function(s)
|
||
if s._closed thenp (_("Дверь в мой отсек закрыта. Надо будет потом придумать, как её снова открыть. Но на этом у меня есть целый год."));
|
||
return false;
|
||
end
|
||
end,
|
||
exit=function(s)if s._closed thenp (_("Сначала нужно открыть дверь."));return false; end end,
|
||
dsc = "Я нахожусь в своем отсеке. Здесь я провел сто лет в режиме гибернации.",
|
||
obj={"cabin1_walls","oil","button","cabin1_door"},
|
||
way = {"block"}
|
||
}
|
||
|
||
cabin1_walls=obj {
|
||
nam="",dsc="Здесь почти ничего нет -- голые металлические стены. В свою прошлую вахту я так и не успел тут всё как следует обставить. Может, в этот раз найдётся время."
|
||
}
|
||
|
||
oil=obj {
|
||
nam="Маслёнка",dsc="На узенькой полке на стене справа лежит {маслёнка}.",
|
||
tak="Я беру маслёнку. Масло всегда пригодится.",
|
||
inv="Маслёнка. Почти полная.",
|
||
use=function(s,v)
|
||
if v==hand then
|
||
hand._oil=true;
|
||
remove(oil,me());
|
||
return (_("Я смазываю маслом все гайки на правой руке моего коллеги. Теперь я должен без проблем её открутить."));
|
||
end
|
||
end
|
||
}
|
||
|
||
button=obj {
|
||
nam="",dsc="У двери красуется огромная {красная кнопка}.",
|
||
act=function()
|
||
local t="Я нажимаю на кнопку, и дверь ";
|
||
if cabin1._closed then t=t.."открывается." else t=t.."закрывается." end
|
||
cabin1._closed=not cabin1._closed;return t;
|
||
end
|
||
}
|
||
cabin1_door=obj {
|
||
nam="",dsc=function()if cabin1._closed then return (_("Сейчас дверь закрыта." else return (_("Сейчас дверь открыта.")))) end end
|
||
}
|
||
|
||
block = room {
|
||
nam = "Технический блок",
|
||
pxa = {
|
||
{ "toolbox", 440},
|
||
{ if_("cabin1._closed", "door4", "door2_open"), 10 },
|
||
{ if_("main2._hand", "robot_nohand", "robot"), 187 },
|
||
{ if_("cabin1._closed", "door2_open", "door4"), 150 },
|
||
{ "door1", 300 },
|
||
},
|
||
dsc = "Технический блок №2. Здесь есть два отсека для вахтенных роботов и большая толстая дверь в коридор, который ведёт на главную палубу.",
|
||
obj = {"blockbutton","toolbox","key","tube"},
|
||
way = {"cabin1","cabin2",vroom("Коридор","endgame1")}
|
||
}
|
||
|
||
blockbutton=obj {
|
||
nam="",
|
||
dsc="Отсюда я вижу проход в мой отсек. Если встать под углом сорок пять градусов, то можно даже заметить большу {круглую кнопку}, которая закрывает дверь отсека.",
|
||
act="Я, конечно, могу дотянуться до кнопки, но тогда дверь опустится и отрубит мою единственную руку.",
|
||
cnd=function(s)return not cabin1._closed end
|
||
}
|
||
|
||
toolbox=obj {
|
||
nam="",
|
||
dsc = "В углу лежит {ящик с инструментами}.",
|
||
act=function(s)
|
||
if key._taken then
|
||
return (_("В ящике больше нет ничего полезного."));
|
||
else
|
||
s._exam=true;
|
||
return (_("Я ящике лежит большой гаечный ключ."));
|
||
end
|
||
end
|
||
}
|
||
|
||
key=obj {
|
||
nam="Гаечный ключ",
|
||
dsc="В ящике -- {гаечный ключ}.",
|
||
inv="Гаечный ключ -- старомодно, но удобно. Хорошо подходит для того, чтобы откручивать руки.",
|
||
tak=function(s) s._taken=true;return (_("Я взял гаечный ключ.")) end,
|
||
use=function(s,v)
|
||
if v==tube and not tube._done then
|
||
tube._done=true;
|
||
take(tube);
|
||
return (_("Всё-таки гаечный ключ -- полезная штука! Раз-раз, и негодная труба выломана из стены. Теперь всё выглядит идеально."));
|
||
elseif v==hand and not hand._oil then
|
||
return (_("Я пытаюсь открутить руку ключом, но ничего не выходит. Ни одна из гаек не желает поворачиваться."));
|
||
elseif v==hand and hand._oil and not main2._hand then
|
||
main2._hand=true;
|
||
remove(key,me());
|
||
return (_("Пара капель масла и... всё как по маслу! Я без проблем откручиваю у своего коллеги руку и приделываю эту руку себе. Ну, наконец-то! У меня снова две руки!"));
|
||
end
|
||
end,
|
||
cnd=function()return toolbox._exam end
|
||
}
|
||
|
||
tube=obj {
|
||
nam="Обломок трубы",dsc="Из стены рядом с дверью в коридор торчит какая-то мятая {труба}. Труба еле держится.",
|
||
act="Без понятия, что это такое. Этого нет в моих банках памяти. Раз нет в банках памяти -- значит я за это не отвечаю. Да и вообще мятая труба как-то портит вид. Я пытаюсь выломать трубу из стены, но у меня ничего не получается.",
|
||
inv="Мятый обломок трубы. Выглядит отвратительно.",
|
||
use=function(s,v)
|
||
if v==blockbutton and have(oil) then
|
||
cabin1._closed=true;
|
||
remove(tube,me());
|
||
return (_("Да, отличная идея! Я встаю под углом в 45 градусом, просовываю в дверной проём трубу и касаюсь круглой кнопки. Дверь тут же опускается и поднимает под себя трубу. Так ей и надо, этой трубе. К тому же теперь мой отсек закрыт... Правда, мне потом потребуется ещё одна труба, чтобы попасть обратно."));
|
||
elseif v==blockbutton then
|
||
return (_("Ошибка! Тупиковая ситуация! Эээ... нет, мне кажется я что-то ещё не сделал."));
|
||
end
|
||
end
|
||
}
|
||
|
||
cabin2=room {
|
||
nam = "Отсек WR006",
|
||
pxa = {
|
||
{ "door1_open", 80 },
|
||
{ if_("main2._hand", "robot_nohand", "robot"), 220 }
|
||
},
|
||
enter = function(s)
|
||
if not cabin1._closed thenp (_("Дверь в отсек WR006 закрыта. Она откроется только, когда будет закрыта дверь в мой отсек. Вот так здесь всё устроено."));return false;
|
||
end
|
||
end,
|
||
dsc = "Это отсек другого вахтенного робота -- он старше меня ровно на единицу.",
|
||
obj = {"robot","hand"},
|
||
way = {"block"}
|
||
}
|
||
|
||
robot=obj {
|
||
nam="",dsc="{Мой коллега} сейчас отключён и стоит неподвижно, как колонны, подпирающие потолок в коридоре.",
|
||
act=function() if main2._hand then return (_("Надеюсь, он не сильно расстроится, когда увидит, что у него нет правой руки." else return (_("Спать ему ещё целую сотню лет.")))) end end
|
||
}
|
||
|
||
hand=obj {
|
||
nam="",dsc="Его {правая рука} на месте.",
|
||
act="Кстати, я не говорил, что мы полностью совместимы? Да, это наводит на мысли... Правда, тут нужны инструменты.",
|
||
cnd=function() return not main2._hand end
|
||
}
|
||
|
||
endgame1=room{
|
||
nam="",enter=function(s)
|
||
if not main2._hand then
|
||
p "Я не могу открыть дверь в коридор без моей правой руки. В неё встроен чип-ключ. Да и вообще без руки я не смогу нести вахту.";
|
||
return false;
|
||
else
|
||
timer:set(4000)
|
||
end
|
||
end,
|
||
dsc=txtc("Прошло сто лет..."),
|
||
timer=function()timer:stop();walk(endgame2)end
|
||
}
|
||
|
||
endgame2=room {
|
||
nam = "Пробуждение",_s=1,_f=0,
|
||
dsc = function(s) return s._dsc end,
|
||
_dsc = [[Я робот WR006. Я только что вышел из режима гибернации. Необходимо запустить {diag|программу диагностики}.^]],
|
||
timer = function(s)
|
||
s._f=s._f+1;
|
||
if s._s==5 then
|
||
mute_()();
|
||
complete_("watch")();
|
||
s._s=6;
|
||
s._dsc=s._dsc.."^^"..txtc("{next|КОНЕЦ?}");
|
||
timer:stop();
|
||
walk(endgame2);
|
||
return;
|
||
end
|
||
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.." ошибка! отсутствует правая рука!";
|
||
s._s=5;
|
||
else
|
||
s._dsc=s._dsc.." нормально";
|
||
s._f=0;
|
||
s._s=s._s+1;
|
||
end
|
||
end
|
||
walk(endgame2);
|
||
end,
|
||
diags= {"Банки памяти","Центральный процессор","Зрительные окуляры","Моторика"},
|
||
obj = { xact("diag", code[[timer:set(500)]]), xact("next", code[[gamefile_("brokencycle.lua")()]]) }
|
||
}
|