insteadose-3/watch.lua

258 lines
11 KiB
Lua
Raw Permalink Normal View History

2018-08-09 12:26:42 +03:00
-- $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")()]]) }
}