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'