-- $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("{Пип?}")) } }