insteadose-3/longwork.lua

359 lines
16 KiB
Lua
Raw Permalink Normal View History

2018-08-09 12:26:42 +03:00
-- $Name: Долгая служба$
-- $Version: 0.1$
instead_version "1.9.1"
require "lib"
require "para"
require "dash"
require "quotes"
require "xact"
game.use = "Бип-бип! Невозможно выполнить запрошенное действие... Эх, надо было всё-таки обновить прошивку, когда мне говорили."
local old = obj;
function tcall(f,s)
if type(f) == "function" then
return tcall(f(s),s);
else
return f;
end
end
function obj(tab)
if tab.nam == nil then tab.nam = "" end
local dsc = tab.dsc;
tab.dsc = function(s)
if s.cnd == nil or s:cnd() then
return tcall(dsc,s);
end
end
return old(tab);
end
main = timerpause(1100, 1100, "main2");
main2 = room {
nam = "..."
,enter = music_("square",0)
,title = { "Д", "О", "Л", "Г", "А", "Я", " ", "С", "Л", "У", "Ж", "Б", "А" }
,num = 2
,act = function(s) walk("sylo") end
,dsc = "Прошло несколько дней с тех пор, как корабль вылетел с Земли. Скоро весь экипаж отправится по своим криокапсулам, а мне предстоит нести самую первую годовую вахту.^Я робот WR001. По документам -- новая модель, недавно вышедшая с конвейера. Однако на самом деле это не совсем так. Где-то там наверху что-то перепутали и вместо того, чтобы отправить меня на пенсию, приписали к этому кораблю под видом новой модели. Мне предстоит десять вахт и путь длиной в тысячу лет.^Надеюсь, у меня ничего не отвалится за это время."
,obj = { vobj("next", '{Начать игру}') }
}
sylo = room {
nam = "Хранилище"
,pxa = {
{ "door4", 150 },
{ if_("not have(box1) and not box1._done", "box"), 40 },
{ "box2", 320 },
{ "shelf", 415 }
}
,exit= function(s)
if not box1._done then
p (_("Надо сначала составить все эти ящики."));
return false;
elseif box1._done and not communice._done then
p (_("Лучше сначала ответить на вызов."));
return false;
end
end
,dsc = "Я нахожусь в хранилище. Здесь, на ровных полках, лежат разнообразные детали в металлических коробках. Моя задача -- отсортировать коробки в соответствии с номерками на них. Работа почти выполнена."
,obj = { "silence", "communice", "boxes", "shelf", "box1", "box2", "emptybox" }
,way = { "coridor" }
}
communice = obj {
_done= false
,dsc = "{Передатчик} у меня на груди мигает. Меня кто-то вызывает.^"
,act = function(s,v)
communice._done = true;
return (_("Это главный инженер. Он хочет видеть меня в крио-блоке. Что ж, мне надо поторопиться."));
end
,cnd = function(s) return box1._done and not s._done end
}
shelf = obj {
dsc = function(s)
if box1._done then
return (_("Все коробки стоят на полках. Моя работа здесь закончена."));
else
return (_("На {полке} осталось место для последней коробки."));
end
end
,act = "Сюда нужно поставить последнюю коробку. Это сложно, но я справлюсь."
}
box1 = obj {
_done= false
,nam = "Коробка 19"
,dsc = function(s)
if not s._done then return (_("На полу лежит {коробка} под номером 19.")) end
end
,tak = function(s)
if not s._done then return (_("Я поднимаю с пола коробку.")) end
end
,use = function(s,v)
if v == shelf then
s._done = true;
drop(s);
return (_("Я ставлю последнюю коробку на полку. Что ж, моя работа здесь закончена. Вдруг раздаётся протяжный гудок, и передатчик у меня на груди начинает мигать."));
end
end
,act = "Просто пустой ящик."
,inv = "Просто пустой ящик."
}
emptybox = obj {
act=function()
return ({"Коробка пуста.","Странно, но тут ничего нет.","Абсолютно пустая коробка.","Видимо, сюда забыли что-то положить.","Пусто!"})[rnd(5)];
end
}
boxes = obj {
dsc = function(s)
local str = "Вся эта комната заставлена металлическими коробками. Коробок очень много, а именно:";
local i = 0;
local last = 18;
if box1._done then
last = 19;
end
while i < last do
i = i + 1;
if i == last then
str = str.." и";
end
if i == 12 then
str = str.." {box2|коробка "..tostring(i).."}";
elseif i == 19 then
str = str.." {box1|коробка "..tostring(i).."}";
else
str = str.." {emptybox|коробка "..tostring(i).."}";
end
if i < last - 1 then
str = str..",";
elseif i == last then
str = str..".";
end
end
return str;
end
}
box2 = obj {
_done= false
,nam = "Коробка 12"
,act = function(s)
if not s._done then
s._done = true;
take(key);
return (_("В коробке оказался гаечный ключ. Недолго думая, я забрал его себе. Надеюсь, его никто не хватится."));
else
return (_("В коробке больше ничего нет."));
end
end
}
key = obj {
nam = "Гаечный ключ"
,inv = "Складной гаечный ключ -- удобно и практично."
,use = function(s,v)
if v == hand then
return (_("Нет, ничего не получается. Рука испорчена!"));
elseif v == robothand then
robothand._done = true;
return (_("Раз-два -- и готово! Обычный обмен деталями, всё нормально. Мы же роботы в конце концов! Так что теперь у меня блестящая новенькая рука."));
elseif v == ear then
ear._fix = true;
remove(ear,me());
return (_("Я прикручиваю отвалившийся модуль обратно в то место, откуда он упал. Что ж, теперь я почти как новый. Почти, да."));
end
end
}
coridor = room {
nam = "Коридор"
,pxa = {
{ "door4", 30 },
{ if_("not robot._done", "robot_cargo"), 240 },
{ if_("not sylo2._open", "door1", "door1_open"), 370 },
}
,enter= function(s)
if not ear._done then
ear._done = true;
p (_("Я выхожу в коридор, как вдруг из моей спины выпадает какой-то модуль."));
end
end
,dsc = "Я в коридоре, соединяющем отсеки."
,obj = { "silence", "hand", "ear", "robot" }
,way = { "sylo", "elevator", "sylo2" }
}
silence = obj {
dsc = "Здесь на удивление {тихо}."
,act = "Я вообще ничего не слышу. Ни малейшего шороха."
,cnd = function() return ear._done and not ear._fix end
}
ear = obj {
_done= false
,_fix = false
,nam = "Модуль XR304558"
,dsc = "На полу валяется {модуль} размером с кирпич. Неужели это выпало из меня?"
,inv = "Непонятно, что это за штука. В моих банках памяти ничего нет. Правда, надо сказать, я последнее время о многом стал забывать. В любом случае мне и без этого модуля хорошо."
,tak = "Я поднимаю с пола модуль. На нем длинный и непонятный регистрационный номер."
}
robot = obj {
_done= false
,dsc = "По коридору идёт {робот}, мой коллега. Робот несёт в руках огромный металлический контейнер."
,act = function(s)
local str = "Думаю, он идёт в продовольственный отсек. Интересно, как он собирается открыть дверь, когда у него обе руки заняты? Наверное, ему придётся сначала поставить контейнер на пол. Я начинаю следить за роботом из чистого любопытства. Он подходит к двери в продовольственный отсек и..."
if not ear._fix then
return str.." дверь сама открывается! Удивительно. Все двери здесь должны быть на магнитном замке.^Робот быстро возвращается из отсека без контейнера, а через несколько минут появляется снова -- с ещё одним огромным ящиком в руках. Что ж, у некоторых работа ещё тяжелее, чем у меня.";
else
s._done = true
return str.." начинает издавать смешные звуки -- пип, пап, пип, пип, пап. На секунду я думаю, что мой коллега сошёл с ума, однако дверь в продовольственный отсек открывается. Удивительно! И почему мне никто не сказал, что так можно."
end
end
,cnd = function(s) return not s._done end
}
hand = obj {
_done= false
,_fix = false
,nam = "Сломанная рука"
,dsc = "На полу валяется моя отломавшаяся {правая рука}."
,tak = "Я поднимаю свою отвалившуюся руку."
,inv = "Она испорчена, совершенно испорчена! От неё теперь никакого прока!"
,use = function(s,v)
if v == robot2 then
s._fix = true;
remove(s,me());
return (_("Я аккуратненько прикручиваю сломанную руку к своему коллеге. Держится хорошо, да. Работать, конечно, не будет, но это уже детали."));
end
end
,cnd = function(s) return s._done end
}
elevator = room {
nam = "Лифт"
,pxa = { { "door2", 190 } }
,enter= function(s)
if not hand._done then
hand._done = true;
p (_("Я подхожу к лифту, нажимаю на кнопку вызова и... моя правая рука со встроенным чип-ключом отваливается и падает на пол. Караул! Кошмар! Я начинаю в панике метаться по коридору. Что делать? Как быть? Меня отправят под пресс!"));
return false;
elseif hand._done and not robothand._done then
p (_("Нет! Я не могу являться к начальству в таком виде! Меня тут же отправят в утиль!"));
return false;
elseif robothand._done and not hand._fix then
p (_("Как-то мне неудобно оставлять своего коллегу без руки. К тому же будет понятно, что рука исчезла... благодаря чьим-то стараниям."));
return false;
else
p (_("Довольный собой, я вызываю лифт, жду несколько минут, напевая недавно выученную мелодию -- пип, пап, пип, пип, пап, -- потом захожу в лифт и... У меня отваливается правая нога! Я с грохотом падаю на пол.^Нет! Не может быть! Мне нельзя появляться перед инженером без ноги!"));
end
end
,dsc = "Я с трудом поднялся и подпрыгиваю на одной ноге."
,obj = { "leg" }
}
leg = obj {
dsc = "Моя отвалившаяся {нога} валяется на полу."
,tak = function()
remove(s,me());
remove(key,me());
walk(endgame)
end
}
sylo2 = room {
_open= false
,nam = "Продовольственный отсек"
,pxa = {
{ if_("robothand._done and not hand._fix", "robot_nohand", "robot"), 40 },
{ "panel", 180 },
{ "box", 170 },
{ "box", 250 },
{ "shelf", 415 }
}
,enter= function(s)
if not hand._done then
p (_("Нет, мне надо идти к главному инженеру."))
return false
elseif hand._done and not robot._done then
p (_("Дверь в продовольственный отсек закрыта. Я не смогу открыть её без руки."));
return false;
elseif not sylo2._open then
return walk(sylocode);
end
end
,dsc = "Я в продовольственном отсеке. Здесь всё заставлено здоровыми контейнерами. Как же много собираются есть эти люди после пробуждения!"
,obj = { "robot2", "robothand" }
,way = { "coridor" }
}
robot2 = obj {
dsc = "Мой {коллега} стоит у стены и не двигается. Длинный и толстый кабель тянется из его зада к стене."
,act = function()
if robothand._done and not hand._fix then
return (_("Мне так стыдно... Я не могу оставить его в таком виде. Всё же коллега..."));
elseif robothand._done and hand._fix then
return (_("Можно сказать, так и было. Уверен, он даже не заметит и решит, что его рука просто сломалась."));
else
return (_("Утомился бедняга! И немудрено -- я бы давно рассыпался, если бы таскал такие контейнеры."))
end
end
}
robothand = obj {
_done= false
,dsc = "Кстати, у него отличная {правая рука}..."
,act = "Нет, тут нужны инструменты."
,cnd = function(s) return not s._done end
}
function tonecode_(n)
return function()
local c = sylocode;
c._code = c._code..n;
if string.len(c._code)>=5 then
if c._code == "01001" then
sylo2._open = true;
p (_("Едва я закончил пищать, как дверь в продовольственный отсек открылась. Эх, до чего же дошла современная техника!"));
walk(coridor);
else
c._code = "";
return (_("Нет, было как-то не так. Я где-то ошибся."));
end
else
return string.gsub(string.gsub(c._code, "0", "Пип! "), "1", "Пап! ")
end
end
end
sylocode = room {
_code = ""
,pxa = { { if_("not sylo2._open", "door1", "door1_open"), 190 } }
,nam = "У двери"
,dsc = "Я стою у двери в продовольственный отсек. Какие там звуки издавал тот робот? Пип, пап, пап... Нет, как-то не так. Он издавал..."
,obj = { "pip", "pap" }
,way = { "coridor" }
}
pip = obj {
dsc = "{Пип!}^"
,act = tonecode_(0)
}
pap = obj {
dsc = "{Пап!}"
,act = tonecode_(1)
}
endgame = room {
nam = "Конец"
,enter = function() mute_()(); complete_("longwork")() end
,dsc = "Интересно, где бы мне взять исправную ногу?^^"
,act = gamefile_("repair.lua")
,obj = { vobj("next", txtc("{Продолжение...}")) }
}