367 lines
16 KiB
Lua
367 lines
16 KiB
Lua
-- $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 = "Пип-Пип! Запрошенная операция невыполнима! Принудительная перезагрузка системы... Ну, вот! Пип!"
|
||
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 = room {
|
||
nam = "..."
|
||
,title = {"Б", "А", "Н", "К", "Е", "Т" }
|
||
,num = 13
|
||
,enter = music_("square",0)
|
||
,act = function() walk(hall) end
|
||
,dsc = "Я -- WR001. Мы с роботами провели жеребьёвку, и мне выпала почётная обязанность -- накрыть стол для праздничного обеда. Ведь сегодня -- особенный день! Люди выходят из своих капсул, а всего через год мы прибываем на место. Со времени нашего отлёта с Земли прошло уже больше тысячи лет. Даже удивительно, что я продержался всё это время..."
|
||
,obj = { vobj("next", '{Пип-пип!}') }
|
||
}
|
||
|
||
hall = room {
|
||
done = function() return takeflower._take==0 and vase._water and flower._cut end
|
||
,_call = false
|
||
,pxa = {
|
||
{ "window2", 10 }
|
||
,{ "table", 110 }
|
||
,{ if_("takeflower._take<2", if_("takeflower._take==0","vase_flower","vase")), 220 }
|
||
,{ "communicator", 420 }
|
||
}
|
||
,nam = "Банкетный зал"
|
||
,dsc = "Я в банкетном зале. Здесь будет проводиться праздничный обед."
|
||
,obj = { "communicator", "desk", "takeflower", "takeknife", "takefork", "toiletdoor" }
|
||
,way = { "coridor", "toilet" }
|
||
}
|
||
|
||
toiletdoor = obj {
|
||
_open = false
|
||
,dsc = "^В конце зала есть {дверь} в туалет."
|
||
,act = function(s)
|
||
if s._open then
|
||
return (_("Из интерфейсного разъёма двери торчит вилка. Пип-пип!"));
|
||
else
|
||
return (_([[Дверь закрыта, а на небольшом табло светится надпись: "Санузел №233 переведён в режим блокировки. Открытие только через порт неотложного доступа."^Порт неотложного доступа находится рядом с дверью -- у него два отверстия, прямо как у моего манипулятора.^Я вставляю в отверстие манипулятор, и дверь открывается. Убираю манипулятор, и дверь закрывается. Пип!]]));
|
||
end
|
||
end
|
||
}
|
||
|
||
communicator = obj {
|
||
dsc = "На стене висит {коммуникатор}."
|
||
,act = function()
|
||
if not hall:done() then
|
||
return (_("Нет, нужно сначала закончить с сервировкой, а потом приглашать людей. Пип."));
|
||
elseif hall._call then
|
||
return (_("Я уже позвонил по коммуникатору. Пип."));
|
||
else
|
||
return walk(communicator_dlg);
|
||
end
|
||
end
|
||
}
|
||
|
||
communicator_dlg = dlg {
|
||
nam = "Коммуникатор"
|
||
,pxa = {
|
||
{ "communicator", 220 }
|
||
}
|
||
,hideinv = true
|
||
,dsc = "Стандартный коммуникатор."
|
||
,obj = {
|
||
[1]=phr{ "Пип!", "Пип!", code[[walk(communicator_dlg2)]]}
|
||
,[2]=phr{ "Пап!", "Пап!", code[[walk(communicator_dlg2)]]}
|
||
}
|
||
,way = { "hall" }
|
||
}
|
||
|
||
communicator_dlg2 = room {
|
||
nam = "Коммуникатор"
|
||
,pxa = {
|
||
{ "communicator", 220 }
|
||
}
|
||
,act = function()
|
||
hall._call = true;
|
||
p (_("Скоро люди появятся. Я мог бы подождать их в коридоре. Пип."));
|
||
walk(hall);
|
||
end
|
||
,dsc = [[Нет, что это я? Это же не дверь! Пип!^^Внимание! Внимание! Пип! -- говорю я, используя свой стандартный голос №23 -- человеческой особи женского пола двадцати трёх лет. -- Стол готов! Добро пожаловать на праздничный обед! Пип-пип!^^И почему я после каждой фразы вставляю "пип", пип? Что-то не так с моей прошивкой!]]
|
||
,obj = { vobj("next", '{Пип-пип!}') }
|
||
}
|
||
|
||
desk = obj {
|
||
dsc = function()
|
||
local str = "Посреди зала стоит широкий {обеденный стол}.";
|
||
if not hall:done() then
|
||
str = str.." Стол почти сервирован. Но чего-то всё-таки не хватает."
|
||
else
|
||
str = str.." Стол полностью сервирован."
|
||
end
|
||
return str;
|
||
end,
|
||
act = "Стол заполнен яствами, которые приготовлены, как мне сообщили, из свежайших продуктов. Непонятно правда, откуда здесь взяли свежие продукты? Пип-пип."
|
||
}
|
||
|
||
takeflower = obj {
|
||
_take = 0
|
||
,nam = "Ваза с цветами"
|
||
,dsc = function(s)
|
||
if s._take == 2 then
|
||
return;
|
||
end
|
||
local str = "На столе стоит ";
|
||
if s._take == 0 then
|
||
str = str.."{ваза с цветами}.";
|
||
elseif s._take == 1 then
|
||
str = str.."{ваза}.";
|
||
end
|
||
if s._take == 0 then
|
||
if vase._water and not flower._cut then
|
||
str = str.." Как я и предполагал, вода ничуть не помогла. Цветы выглядят всё так же. Может, нужно просто обновить версию их прошивки? Пип-пип."
|
||
elseif vase._water and flower._cut then
|
||
str = str.." Цветы кажутся заметно похорошевшими. Удивительно! Может быть, и мне поможет такая процедура? Пип-пип.";
|
||
else
|
||
str = str.." Цветы почти завяли. Пип.";
|
||
end
|
||
end
|
||
return str;
|
||
end
|
||
,act = function(s)
|
||
if vase._water and flower._cut then
|
||
return (_("Цветы выглядят отлично. Больше ничего делать не нужно. Пип."));
|
||
end
|
||
if s._take == 0 then
|
||
s._take = 1;
|
||
take(flower);
|
||
return (_("Я достаю из вазы цветы. Цветы совсем недавно были сорваны в гидропонике, однако выглядят довольно квело. Пип-пип... Видимо, я о чём-то забыл. Пип."));
|
||
elseif s._take == 1 then
|
||
take(vase);
|
||
s._take = 2;
|
||
return (_("Я беру со стола вазу. Пип-пип."));
|
||
end
|
||
end
|
||
}
|
||
|
||
vase = obj {
|
||
_water = false
|
||
,nam = function(s)
|
||
if s._water then return (_("Ваза с водой" else return (_("Ваза")))) end
|
||
end
|
||
,inv = function(s)
|
||
local str = "Пустая ваза.";
|
||
if s._water then
|
||
str = "Ваза с водой.";
|
||
end
|
||
return str..[[ Интерфейс данной вазы совместим с объектом "цветы". Пип-пип!]];
|
||
end
|
||
,use = function(s,v)
|
||
if v == washer and not s._water then
|
||
s._water = true;
|
||
return (_("Вообще я всегда был уверен, что наливать воду в интерфейсные порты -- это плохая идея. Впрочем, люди такие странные. Я немного подумал и заполнил вазу водой. Пип."));
|
||
elseif v == washer and s._water then
|
||
return (_("Здесь и так полно воды! Пип!"));
|
||
elseif v == desk then
|
||
takeflower._take = 1;
|
||
drop(vase, me());
|
||
return (_("Я ставлю вазу на стол. Пип-пип."));
|
||
end
|
||
end
|
||
}
|
||
|
||
flower = obj {
|
||
_cut = false
|
||
,nam = function(s)
|
||
if s._cut then return (_("Цветы с зачищенными контактами" else return (_("Цветы")))) end
|
||
end
|
||
,inv = "Цветы почти завяли, ещё немного -- и их придётся выбросить. Пип."
|
||
,use = function(s,v)
|
||
if v == vase then
|
||
return (_("Установка цветов в вазу -- крайне сложная и кропотливая задача. Лучше сначала поставить вазу на стол. Пип."));
|
||
elseif v == desk then
|
||
return (_("Цветы нужно устанавливать в вазу. Пип-пип!"));
|
||
elseif v == takeflower and takeflower._take == 1 then
|
||
takeflower._take = 0;
|
||
drop(flower, me());
|
||
local str = "Это было тяжело, но я справился. Цветы благополучно установлены в вазу, ни один лепесток не пострадал. Пип-пип!";
|
||
if s._cut and vase._water then
|
||
str = str.."^Кажется, цветам это пошло на пользу. Вот что значит зачистить контакты! Пип-пип! Что ж, я всё сделал. Теперь нужно пригласить людей по коммуникатору. Пип-пип!";
|
||
end
|
||
return str;
|
||
end
|
||
end
|
||
}
|
||
|
||
takeknife = obj {
|
||
dsc = "Рядом с блюдами лежат {ножи}"
|
||
,act = function()
|
||
if have(knife) then
|
||
return (_("Я уже взял нож, одного мне достаточно. Пип-пип!"));
|
||
else
|
||
take(knife);
|
||
return (_("Я беру со стола нож. Пип."));
|
||
end
|
||
end
|
||
}
|
||
|
||
takefork = obj {
|
||
dsc = "и {вилки}."
|
||
,act = function()
|
||
if have(fork) then
|
||
return (_("У меня уже есть вилка. Пип-пип!"));
|
||
else
|
||
take(fork);
|
||
return (_("Я беру со стола вилку. Пип."));
|
||
end
|
||
end
|
||
}
|
||
|
||
knife = obj {
|
||
nam = "Столовый нож"
|
||
,inv = "Обычный столовый нож, вполне сгодится для того, чтобы что-нибудь отрезать. Пип-пип!"
|
||
,use = function(s,v)
|
||
if v == flower and not flower._cut then
|
||
flower._cut = true;
|
||
remove(s,me());
|
||
return (_("Точно! Нужно просто зачистить контакты! И как я не догадался? Пип-пип!^Я срезаю ножом кончики стебельков. Всё готово. Пип."));
|
||
elseif v == flower and flower._cut then
|
||
return (_("Как я понимаю, люди цветы не едят. Не стоит делать из них салат. Пип-пип!"));
|
||
end
|
||
end
|
||
}
|
||
|
||
fork = obj {
|
||
nam = "Вилка"
|
||
,inv = "Вилка с двумя зубцами, чем-то похожа на мой манипулятор. Пип!"
|
||
,use = function(s,v)
|
||
if v == toiletdoor and toiletdoor._open then
|
||
return (_("Из интерфейсного разъёма двери уже торчит вилка. Пип-пип!"));
|
||
elseif v == toiletdoor then
|
||
toiletdoor._open = true;
|
||
remove(s,me());
|
||
return (_("Я вставляю вилку в интерфейсный разъём, и дверь открывается. Пип!"));
|
||
end
|
||
end
|
||
}
|
||
|
||
toilet = room {
|
||
nam = "Туалет"
|
||
,enter = function()
|
||
if not toiletdoor._open then
|
||
p (_("Дверь в туалет закрыта. Пип-пип!"));
|
||
return false;
|
||
end
|
||
end
|
||
,pxa = {
|
||
{ "toilet", 170 }
|
||
,{ "washer", 260 }
|
||
}
|
||
,dsc = "Туалет. Роботы не пользуются туалетом. Пип!"
|
||
,obj = { "washer", "devices" }
|
||
,way = { "hall" }
|
||
}
|
||
|
||
washer = obj {
|
||
dsc = "У стены стоит раковина с {краном}."
|
||
,act = "Вода есть. Как хорошо, когда всё работает! Пип-пип!"
|
||
}
|
||
|
||
devices = obj {
|
||
dsc = "Здесь есть также остальные {устройства}, которыми не пользуются роботы."
|
||
,act = "С помощью этих устройств люди, видимо, сливают своё использованное масло. Или что там у них... Пип!"
|
||
}
|
||
|
||
coridor = room {
|
||
_wait = 0
|
||
,nam = "Коридор"
|
||
,enter = function(s)
|
||
if not hall:done() then
|
||
p (_("Нет, пока я ещё не всё закончил. Пип-пип!"));
|
||
return false;
|
||
elseif hall:done() and not hall._call then
|
||
p (_("Надо сначала пригласить в банкетный зал людей. Пип-пип!"));
|
||
return false;
|
||
end
|
||
end
|
||
,pxa = {
|
||
{ "robot", 10 }
|
||
,{ "hatch2", 100 }
|
||
,{ if_("coridor._wait>0","rat"), 395 }
|
||
,{ if_("coridor._wait>1","rat"), 185 }
|
||
,{ if_("coridor._wait>2","rat"), 460 }
|
||
,{ if_("coridor._wait>2","rat"), 240 }
|
||
,{ if_("coridor._wait>3","rat"), 120 }
|
||
--,{ if_("coridor._wait>3","rat"), 270 }
|
||
,{ if_("coridor._wait>3","rat"), 320 }
|
||
}
|
||
,dsc = "Передо мной длинный пустой коридор. Пип-пип."
|
||
,obj = { "coridorstat" }
|
||
}
|
||
|
||
coridorstat = obj {
|
||
dsc = function()
|
||
if coridor._wait == 0 then
|
||
return (_("Пока ещё никого нет. Надо немного {подождать}. Пип..."));
|
||
elseif coridor._wait == 1 then
|
||
music_("spookyloop",0)();
|
||
return (_("В коридоре появилась жирная крыса. Крыса смотрит на меня недобрым взглядом. {Пип-пип}!"));
|
||
elseif coridor._wait == 2 then
|
||
return (_("Теперь передо мной две крысы. Что они здесь делают? Надеюсь, люди {скоро появятся}. Меня пугают эти злобные твари! Пип-пип!"));
|
||
elseif coridor._wait == 3 then
|
||
return (_("Передо мной собралась целая стая жирных крыс. Они сидят и просверивают меня своими злобными красными глазищами. {Где же люди}? Пип!"));
|
||
elseif coridor._wait == 4 then
|
||
return (_("Нет, не может быть! Весь коридор заполнен крысами! Пип! Пип-пип! Пип! Это какой-то кошмар! Такого не может быть! {Пип-пип}!"));
|
||
end
|
||
end
|
||
,act = function()
|
||
coridor._wait = coridor._wait + 1;
|
||
if coridor._wait == 5 then
|
||
return walk(endgame1);
|
||
else
|
||
return walk(coridor);
|
||
end
|
||
end
|
||
}
|
||
|
||
endgame1 = room {
|
||
nam = "..."
|
||
,enter = function()
|
||
mute_()();
|
||
complete_("nightmare")();
|
||
remove(fork,me());
|
||
remove(knife,me());
|
||
end
|
||
,act = function() walk(endgame2) end
|
||
,pxa = {
|
||
{ "robot_nohand", 212 }
|
||
}
|
||
,dsc = "Пип! Это был всего лишь сон. Ну и намудрили с этой последней прошивкой -- теперь мне даже сны стали сниться. Ещё немного -- и я начну пользоваться человеческим туалетом для слива отработанного масла. Пип-пип!^Однако мне сегодня и правда нужно сервировать стол. Надо бы поторопиться."
|
||
,obj = { vobj("next", '{Пип-пип!}') }
|
||
}
|
||
|
||
endgame2 = room {
|
||
nam = "Конец"
|
||
,pxa = {
|
||
{ "robot_nohand", 212 }
|
||
}
|
||
,dsc = "Кстати, а где моя правая рука?"
|
||
,act = gamefile_("persona.lua")
|
||
,obj = { vobj("next", txtc("{Пип?}")) }
|
||
} |