288 lines
12 KiB
Lua
288 lines
12 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 "{#Me} {#g/летишь,летите} из Йоханнесбурга (Земля) в Петербург (планета Проксима Центавра b). Всего четыре часа полёта в эконом-классе. Как раз, чтобы дочитать увлекательную книгу о приключениях капитана Киркунова.^";
|
||
p "Но, не {#g/успела,успел,успело,успели} {#me} закончить и первой главы, как откуда-то спереди донёсся душераздирающий крик. {#Me} {#g/увидела,увидел,увидело,увидели}, как впереди по проходу медленно шагает на чёрных щупальцах какая-то иссине-чёрная ";
|
||
p(fmt.b("инопланетная"));
|
||
p "клякса.";
|
||
pn "{#Me} {#g/бросилась,бросился,бросилось,бросились} бежать к корме судна и {#word/нырнула,нырнул,нырнуло,нырнули} в первую же комнату, чтобы найти хотя бы кого-то из экипажа.^";
|
||
p "Вдруг дверь за {#you/твор} закрылась и выставила защитные щиты.";
|
||
pn "{#Me} {#g/заперта,заперт,заперто,заперты}.^";
|
||
pn(fmt.b('Клозет уборщика^'));
|
||
s.seen = true;
|
||
end
|
||
p 'Это маленькая комнатка, мягко подсвеченная светильниками внутри стен. В углу стоит робот-уборщик. Единственная дверь на юге закрыта ярким голубым щитом.';
|
||
end;
|
||
s_to = function()
|
||
if here():has('shield') then
|
||
return 'Дверь закрыта и заблокирована прочным щитом.';
|
||
end
|
||
walk('end');
|
||
end;
|
||
obj = {
|
||
'shield',
|
||
'door',
|
||
'robot',
|
||
'safe'
|
||
};
|
||
}
|
||
|
||
obj {
|
||
-"щит/мр";
|
||
nam = 'shield';
|
||
canonical = 'щит';
|
||
description = 'Переливчатый полупрозрачный щит из неизвестного {#you/дт} материала. Его нельзя сломать и он не пропускает звук.';
|
||
before_Open = 'На щите нет дверной ручки.';
|
||
before_Listen = 'Не пропускает. Звук.';
|
||
before_Attack = 'Не пробивается.';
|
||
}: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_Shoot = 'Не {#plural/размахивай,размахивайте} этой штукой! Надо стрелять во что-то определённое.';
|
||
}: dict {
|
||
['вырезатель/рд'] = 'вырезателя';
|
||
['вырезатель/дт'] = 'вырезателю';
|
||
['вырезатель/вн'] = 'вырезатель';
|
||
['вырезатель/тв'] = 'вырезателем';
|
||
['вырезатель/пр'] = 'вырезателе';
|
||
}: attr 'essential'
|
||
|
||
obj {
|
||
-"робот,уборщик/мр,ед";
|
||
nam = 'robot';
|
||
description = 'У стенки стоит выключенный робот-уборщик. У него два длинных манипулятора-руки и широкие стальные гусеницы.';
|
||
before_SwitchOn = function(s)
|
||
if not (s:srch('battery')) then
|
||
p "Над кнопкой включения загорается сообщение: нет батареи.";
|
||
return true;
|
||
end
|
||
if not (s:srch('hand')) then
|
||
p "Робот оживляется, но тут же потухает. Новое сообщение: неисправность руки.";
|
||
return true;
|
||
end
|
||
lifeon('robot');
|
||
return "Робот включается и начинает тихо бурчать. Наверное, оценивает чистоту чулана.";
|
||
end;
|
||
life = function()
|
||
if here().dirty then
|
||
pn '«ВНИМАНИЕ. ОБНАРУЖЕНА ГРЯЗЬ. НЕОБХОДИМА ИНСПЕКЦИЯ.»';
|
||
p 'Робот срывается с места и начинает генеральную уборку.';
|
||
if here():srch('patina') then
|
||
pn 'Он протирает всё вокруг, тщательно счищая слой патины.'
|
||
if not _'patina'.scored then
|
||
_'patina'.scored = true
|
||
givepoint();
|
||
end
|
||
end
|
||
here().dirty = false;
|
||
end
|
||
end;
|
||
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';
|
||
dsc = 'Возле робота лежит маленькая коробка.';
|
||
description = function(s)
|
||
p 'Картонная коробка с надписью "ХРУПК-".';
|
||
return false;
|
||
end;
|
||
obj = {
|
||
'battery'
|
||
}
|
||
}: dict {
|
||
['коробка/рд'] = 'коробки';
|
||
['коробка/дт'] = 'коробке';
|
||
['коробка/вн'] = 'коробку';
|
||
['коробка/тв'] = 'коробкой';
|
||
['коробка/пр'] = 'коробке';
|
||
}: attr 'container,female,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';
|
||
dsc = 'На полке лежит пластинка.';
|
||
canonical = 'пластинка';
|
||
found_in = 'pantry';
|
||
description = 'Старая прозрачная пластинка. Народные финские песни в жанре хеви-метал. Она бесполезна без проигрывателя.';
|
||
}: dict {
|
||
['пластинка/рд'] = 'пластинки';
|
||
['пластинка/дт'] = 'пластинке';
|
||
['пластинка/вн'] = 'пластинку';
|
||
['пластинка/тв'] = 'пластинкой';
|
||
['пластинка/пр'] = 'пластинке';
|
||
}
|
||
|
||
obj {
|
||
-"стенд/мр";
|
||
nam = 'stand';
|
||
dsc = 'На стене покосился пожарный стенд.';
|
||
canonical = 'стенд';
|
||
found_in = 'pantry';
|
||
description = function(s)
|
||
p 'Красный пожарный стенд с крупной надписью уверенными жёлтыми буквами: «НЕ ГОРИТЕ».';
|
||
if s:srch('rukav') then
|
||
pn 'Стенд почти пуст, на нём висит только кусок пожарного рукава.';
|
||
else
|
||
pn '{#Me} {#g/сняла,снял,сняло,сняли} со стенда всё, что там висело.';
|
||
end
|
||
end;
|
||
obj = {
|
||
'rukav'
|
||
};
|
||
}: dict {
|
||
['стенд/рд'] = 'стенда';
|
||
['стенд/дт'] = 'стенду';
|
||
['стенд/вн'] = 'стенд';
|
||
['стенд/тв'] = 'стендом';
|
||
['стенд/пр'] = 'стенде';
|
||
}: attr 'static'
|
||
-- важно: стенд это не контейнер, на него нельзя повесить что угодно, только снять
|
||
|
||
obj {
|
||
-"рукав/мр";
|
||
nam = 'rukav';
|
||
canonical = 'рукав';
|
||
description = 'Несколько метров серого пожарного рукава. Кто-то прорезал в нём дырки в форме звёздочек. При пожаре он не поможет, но хотя бы выглядит красиво.';
|
||
}
|
||
|
||
obj {
|
||
-"булавка/жр";
|
||
nam = 'bulavka';
|
||
canonical = 'булавка';
|
||
found_in = 'pantry';
|
||
dsc = 'На полу лежит булавка.';
|
||
description = 'Швейная безопасная булавка. Ничего примечательного.';
|
||
}: dict {
|
||
['булавка/рд'] = 'булавки';
|
||
['булавка/дт'] = 'булавке';
|
||
['булавка/вн'] = 'булавку';
|
||
['булавка/тв'] = 'булавкой';
|
||
['булавка/пр'] = 'булавке';
|
||
}
|