488 lines
20 KiB
Lua
488 lines
20 KiB
Lua
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'
|