peterburg/rooms/pantry.lua

488 lines
20 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

room {
nam = 'pantry';
title = function()
if here().seen then
return 'Клозет уборщика'
end
end;
seen = false;
dirty = false;
dsc = function(s)
mp.msg.Smell.SMELL = "Запах очень забытых вещей."
if not s.seen then
pn "{#You} {#g/летишь,летите} из Йоханнесбурга (Земля) в Петербург (планета Проксима Центавра b). Всего четыре часа полёта в эконом-классе. Как раз, чтобы дочитать увлекательную книгу о приключениях капитана Киркунова.^";
p "Но, не {#g/успела,успел,успело,успели} {#you} закончить и первой главы, как откуда-то спереди донёсся душераздирающий крик. {#You} {#g/увидела,увидел,увидело,увидели}, как впереди по проходу медленно шагает на чёрных щупальцах какая-то иссине-чёрная ";
p(fmt.b("инопланетная"));
p "клякса.";
pn "{#You} {#g/бросилась,бросился,бросилось,бросились} бежать к корме судна и {#g/нырнула,нырнул,нырнуло,нырнули} в первую же комнату, чтобы найти хотя бы кого-то из экипажа.^";
p "Вдруг дверь за {#you/твор} закрылась и выставила защитные щиты.";
pn "{#You} {#g/заперта,заперт,заперто,заперты}.^";
pn(fmt.b('Клозет уборщика^'));
s.seen = true;
end
p 'Это маленькая комнатка. В углу стоит робот-уборщик, возле которого лежит маленькая коробка.';
if here():srch('shield') then
p 'Единственная дверь на юге закрыта ярким голубым щитом.';
else
p 'Дверь на юге приоткрыта, оттуда доносятся голоса.';
end
p 'Над дверью горит лампа. На одной из верхних полок стоит бронзовая статуя';
if here():srch('plastinka') then
p ', а под ней на тонкой нитке висит пластинка.';
end
end;
cant_go = function(s, to)
if to == 's_to' then
if here():srch('shield') then
return 'Дверь закрыта и заблокирована прочным щитом.';
end
walk('end');
else
return [[Там нет ничего интересного.]]
end
end;
before_Exit = function()
if here():srch('shield') then
return 'Дверь закрыта и заблокирована прочным щитом.';
end
return walk('end');
end;
obj = {
'shield',
'door',
'robot',
'safe',
'polka',
'wall'
};
}:attr '~light'
obj {
-"щит/мр";
nam = 'shield';
canonical = 'щит';
description = 'Переливчатый полупрозрачный щит из неизвестного {#you/дт} материала. Его нельзя сломать и он не пропускает звук.';
before_Open = 'На щите нет дверной ручки.';
before_Listen = 'Не пропускает. Звук.';
before_Attack = 'Не пробивается.';
}: dict {
['щит/рд'] = 'щита';
['щит/дт'] = 'щиту';
['щит/вн'] = 'щит';
['щит/тв'] = 'щитом';
['щит/пр'] = 'щите';
}:attr 'scenery,static'
obj {
-"дверь/жр";
nam = 'door';
canonical = 'дверь';
description = function()
p 'Дверь наружу.'
if here():srch('shield') then
pn 'Закрыта за прозрачным щитом.';
end
end;
before_Open = function()
if here():srch('shield') then
return 'Дверь закрыта за прозрачным щитом.';
end
return walk('end');
end
}:attr 'scenery,static,essential'
obj {
-"вырезатель,убиратель,пистолет/мр,ед|оружие/ср,ед";
nam = 'letterremover';
letter = "Р";
dsc = function(s)
if s:inside('safe') then
return 'Внутри лежит причудливый пистолет.';
end
return 'На полу лежит вырезатель.';
end;
description = function(s)
return '«Вырезатель ЕДАКТО-12» выглядит как древний пистолет с маленьким дисплеем и кнопками. На дисплее горит буква «'..s.letter..'». Напишите ВЫРЕЗАТЬ Ш ИЗ чего-нибудь.';
end;
inv = function(s)
return s.letter..'-вырезатель'
end;
before_Take = function()
p '{#You} {#g/берёшь,берёте} пистолет.';
return false;
end;
before_Shoot = 'Не {#plural/размахивай,размахивайте} этой штукой! Её надо направить во что-то определённое.';
}: dict {
['вырезатель/рд'] = 'вырезателя';
['вырезатель/дт'] = 'вырезателю';
['вырезатель/вн'] = 'вырезатель';
['вырезатель/тв'] = 'вырезателем';
['вырезатель/пр'] = 'вырезателе';
}: attr 'essential'
obj {
-"робот,уборщик,робот-уборщик/мр,ед";
nam = 'robot';
description = function(s)
p 'У стенки стоит ';
if live(s) then
p 'включённый';
else
p 'выключенный';
end
p ' робот-уборщик. У него ';
if not (s:srch('hand')) then
p 'длинное щупальце как один из манипуляторов, пустое гнездо вместо второго '
else
p 'два длинных манипулятора типа «рука» и «щупальце» '
end
pn 'и широкие стальные гусеницы.';
end;
before_SwitchOn = function(s)
if live(s) then
return 'Робот уже включён.';
end
if not (s:srch('battery')) then
p "Над кнопкой включения загорается сообщение: нет батареи.";
return true;
end
if not (s:srch('hand')) then
p "Робот оживляется, но тут же потухает. Новое сообщение: неисправность манипулятора типа «рука».";
return true;
end
lifeon('robot');
givepoint();
pn "Робот включается и начинает тихо бурчать. Наверное, оценивает чистоту чулана.";
return false;
end;
before_SwitchOff = 'Пусть работает, хоть не так одиноко.';
life = function()
if here().dirty then
pn '«ВНИМАНИЕ. ОБНАРУЖЕНА ГРЯЗЬ. НЕОБХОДИМА ИНСПЕКЦИЯ.»';
p 'Робот срывается с места и начинает генеральную уборку.';
if here():srch('patina') then
pn 'Он тщательно протирает статую Котошелкопряда, счищая слой патины. Наверное, это просто суеверие, но {#you} {#g/чувствуешь,чувствуете} благословление удачи.'
if not _'patina'.scored then
_'patina'.scored = true
givepoint();
_('patina'):remove();
end
end
here().dirty = false;
end
end;
-- почему глаголы "целовать" и "обнимать" это синонимы?!
before_Kiss = '{#You} {#g/обнимаешь,обнимаете} всеми забытого робота. Робот не показывает этого, но внутри он рад.';
obj = {
'robot_hand',
'button'
}
}: dict {
['робот/рд'] = 'робота';
['робот/дт'] = 'роботу';
['робот/вн'] = 'робота';
['робот/тв'] = 'роботом';
['робот/пр'] = 'роботе';
}: attr 'essential,scenery,open,switchable,container'
obj {
-"сейф,маленький сейф/мр";
nam = 'safe';
dsc = 'Напротив двери стоит маленький сейф.';
before_Close = function(s)
if s:has 'open' then
return 'Он выглядит слишком сломанным. Если его закрыть, сейф уже не откроется.';
end
return 'Да он и так закрыт.';
end;
description = function()
p 'Маленький оружейный сейф с электронным замком. Кто-то выдернул из него провода и подвёл к пустой выемке. Наверное, ему не хватает питания.';
return false;
end;
obj = {
'letterremover',
}
}: dict {
['сейф/рд'] = 'сейфа';
['сейф/дт'] = 'сейфу';
['сейф/вн'] = 'сейф';
['сейф/тв'] = 'сейфом';
['сейф/пр'] = 'сейфе';
}: attr 'essential,static,container,openable,locked'
obj {
-"коробка,маленькая коробка,коробчонка,коробочка/жр|коробочек/мр";
nam = 'box';
found_in = 'pantry';
description = function(s)
p 'Картонная коробка с надписью "ХРУПК-".';
return false;
end;
obj = {
'battery'
}
}: dict {
['коробка/рд'] = 'коробки';
['коробка/дт'] = 'коробке';
['коробка/вн'] = 'коробку';
['коробка/тв'] = 'коробкой';
['коробка/пр'] = 'коробке';
}: attr 'container,female,scenery,openable';
obj {
-"батарея,маленькая батарея,батарейка/жр";
nam = 'battery';
dsc = function(s)
if s:inside('box') then
return 'Внутри лежит маленькая батарея.';
end
return 'На полу лежит маленькая батарея.';
end;
description = 'Сменная батарея для бытовой электроники типа «крона». Одному пылесосу её хватает на тридцать лет.';
before_Insert = function(self, what)
if what^'robot' then
pn "На панели робота зажигается огонёк. Можно попытаться его включить.";
return false;
end
if what^'safe' then
pn 'Дверца сейфа с щелчком открывается.';
_'safe':attr('open');
return false;
end
return "Это нельзя запитать от батареи.";
end;
}: dict {
['батарея/рд'] = 'батареи';
['батарея/дт'] = 'батарее';
['батарея/вн'] = 'батарею';
['батарея/тв'] = 'батареей';
['батарея/пр'] = 'батарее';
['батарейка/рд'] = 'батарейки';
['батарейка/дт'] = 'батарейке';
['батарейка/вн'] = 'батарейку';
['батарейка/тв'] = 'батарейкой';
['батарейка/пр'] = 'батарейке';
}: attr 'essential'
obj {
-"кнопка,кнопка включения/жр|выключатель/мр";
nam = 'button';
description = 'Кнопка включения робота. Ничего примечательного.';
}: attr 'essential,scenery,switchable'
obj {
-"манипулятор/мр";
nam = 'robot_hand';
description = 'Манипулятор робота типа «рука». Имеет пальцы. Может хватать. Может сгибаться. Много чего может.';
}: attr 'essential,scenery'
obj {
-"пластинка/жр";
nam = 'plastinka';
canonical = 'пластинка';
found_in = 'pantry';
description = 'Старая прозрачная пластинка. Народные финские песни в жанре хеви-метал. Она бесполезна без проигрывателя.';
}: dict {
['пластинка/рд'] = 'пластинки';
['пластинка/дт'] = 'пластинке';
['пластинка/вн'] = 'пластинку';
['пластинка/тв'] = 'пластинкой';
['пластинка/пр'] = 'пластинке';
}: attr 'scenery';
obj {
-"нитка/жр";
nam = 'thread';
canonical = 'нитка';
found_in = 'pantry';
description = 'Тонкая нитка, подвязанная к деревянной полке.';
}: dict {
['нитка/рд'] = 'нитки';
['нитка/дт'] = 'нитке';
['нитка/вн'] = 'нитку';
['нитка/тв'] = 'ниткой';
['нитка/пр'] = 'нитке';
}: attr 'scenery'
obj {
-"пожарный стенд,стенд/мр";
nam = 'stand';
dsc = 'На стене покосился пожарный стенд.';
canonical = 'стенд';
found_in = 'pantry';
description = function(s)
p 'Красный пожарный стенд с крупной надписью уверенными жёлтыми буквами: «НЕ ГОРИТЕ».';
if s:srch('rukav') then
pn 'Стенд почти пуст, на нём висит только кусок пожарного рукава.';
else
pn '{#You} {#g/сняла,снял,сняло,сняли} со стенда всё, что там висело.';
end
end;
obj = {
'rukav'
};
}: dict {
['стенд/рд'] = 'стенда';
['стенд/дт'] = 'стенду';
['стенд/вн'] = 'стенд';
['стенд/тв'] = 'стендом';
['стенд/пр'] = 'стенде';
}: attr 'static'
-- важно: стенд это не контейнер, на него нельзя повесить что угодно, только снять
obj {
-"рукав/мр";
nam = 'rukav';
canonical = 'рукав';
description = 'Несколько метров серого пожарного рукава. Кто-то прорезал в нём дырки в форме звёздочек. При пожаре он не поможет, но хотя бы выглядит красиво.';
}: dict {
['рукав/рд'] = 'рукава';
['рукав/дт'] = 'рукаву';
['рукав/вн'] = 'рукав';
['рукав/тв'] = 'рукавом';
['рукав/пр'] = 'рукаве';
}
obj {
-"булавка/жр";
nam = 'bulavka';
canonical = 'булавка';
found_in = 'pantry';
dsc = 'К стене приколота маленькая булавка.';
description = 'Швейная безопасная булавка. Ничего примечательного.';
}: dict {
['булавка/рд'] = 'булавки';
['булавка/дт'] = 'булавке';
['булавка/вн'] = 'булавку';
['булавка/тв'] = 'булавкой';
['булавка/пр'] = 'булавке';
}
obj {
-"полка/жр";
nam = 'polka';
canonical = 'полка';
found_in = 'pantry';
dsc = 'Короткая полка для вещей.';
description = 'Деревянная полка. Ничего примечательного.';
}: attr 'scenery';
obj {
-"стена/жр|стены/жр,мч|светильник/мр";
nam = 'wall';
canonical = 'стена';
found_in = 'pantry';
dsc = 'Стена комнаты.';
description = 'Стена комнаты. Ничего примечательного.';
}: attr 'scenery';
obj {
-"пол/мр";
nam = 'floor';
found_in = 'pantry';
canonical = 'пол';
description = 'Пол покрыт чем-то под ламинат, который покрашен под какое-то дерево. (Это точно не берёза.)';
}: dict {
['пол/рд'] = 'пола';
['пол/дт'] = 'полу';
['пол/вн'] = 'пол';
['пол/тв'] = 'полом';
['пол/пр'] = 'поле';
}:attr 'scenery,static'
obj {
-"потолок/мр";
nam = 'ceiling';
canonical = 'потолок';
found_in = 'pantry';
description = 'Дюралевый потолок блестит над {#you/тв}.';
}: dict {
['потолок/рд'] = 'потолка';
['потолок/дт'] = 'потолку';
['потолок/вн'] = 'потолок';
['потолок/тв'] = 'потолком';
['потолок/пр'] = 'потолке';
}:attr 'scenery,static'
obj {
-"щупальце/ср";
nam = 'oldhand';
canonical = 'щупальце';
found_in = 'pantry';
description = 'Длинный манипулятор типа «щупальце». Имеет присоски. Может хватать. Может сгибаться. Много чего может.';
}: dict {
['щупальце/рд'] = 'щупальца';
['щупальце/дт'] = 'щупальцу';
['щупальце/вн'] = 'щупальце';
['щупальце/тв'] = 'щупальцем';
['щупальце/пр'] = 'щупальце';
}:attr 'scenery,static'
obj {
-"гнездо/ср";
nam = 'handsocket';
canonical = 'гнездо';
found_in = 'pantry';
description = function()
p 'Гнездо для манипулятора.';
if not (here():srch('hand')) then
p 'Пока что пустое.'
else
p 'В нём надёжно стоит пластиковая рука.'
end
end;
}: dict {
['гнездо/рд'] = 'гнезда';
['гнездо/дт'] = 'гнезду';
['гнездо/вн'] = 'гнездо';
['гнездо/тв'] = 'гнездом';
['гнездо/пр'] = 'гнездо';
}:attr 'scenery,static'
obj {
-"статуя,бронзовая статуя/жр|котошелкопряд/мр";
nam = 'statue';
canonical = 'котошелкопряд';
found_in = 'pantry';
description = function()
p [[
Бронзовая статуя Котошелкопряда.
{#You} {#g/вспоминаешь,вспоминаете} примету, что если потереть его голову между кошачьими ушами,
он подарит большую удачу.
]];
if here():srch('patina') then
p 'Статуя покрыта зеленоватым слоем патины.';
end
end;
before_Rub = 'Слишком высоко. Не достать.';
before_Touch = 'Слишком высоко. Не достать.';
}: dict {
['статуя/рд'] = 'статуи';
['статуя/дт'] = 'статуе';
['статуя/вн'] = 'статую';
['статуя/тв'] = 'статуей';
['статуя/пр'] = 'статуе';
['котошелкопряд/рд'] = 'котошелкопряда';
['котошелкопряд/дт'] = 'котошелкопряду';
['котошелкопряд/вн'] = 'котошелкопряда';
['котошелкопряд/тв'] = 'котошелкопрядом';
['котошелкопряд/пр'] = 'котошелкопряде';
}:attr 'scenery,static'
obj {
-"лампа/жр";
nam = 'lamp';
canonical = 'лампа';
found_in = 'pantry';
description = 'Светодиодная лампочка над дверью.';
before_Touch = 'Слишком высоко. Не достать.';
before_Rub = 'Слишком высоко. Не достать.';
}: dict {
['лампа/рд'] = 'лампы';
['лампа/дт'] = 'лампе';
['лампа/вн'] = 'лампу';
['лампа/тв'] = 'лампой';
['лампа/пр'] = 'лампе';
}:attr 'scenery,static,light'