!% !============================================================================= Include "CyrDef"; Constant Story "Робото"; Constant Headline "^Текстовая игра за один день. Вжж!^yandexx, (С) 2010.^"; !Constant TASKS_PROVIDED; !Constant NUMBER_TASKS = 5; !Constant MAX_SCORE = 1; !Constant DEBUG 1; Attribute smeared; Include "Parser"; Object LibraryMessages with before [; Jump: "Тебе сложно подпрыгивать, так что ты остаёшься стоять."; Smell: "Твои рецепторы не улавливают никаких особенных запахов."; ]; Include "VerbLib"; !============================================================================ ! Entry point routines [ Initialise; location = storage; lookmode = 2; player.description = PlayerDesc; print "...^^ *beep* *beep*^^ @<<19:00. Состояние гибернации окончено@>>.^^ Что? Кто здесь?^^ @<<Дроид номер 13, приступайте к выполнению задания@>>, -- говорит синтезированный женский голос.^^ Ах, да. Как обычно. Но почему-то тебе никак не привыкнуть.^^"; ]; [ PlayerDesc; print "Всё вроде бы на месте, всё как всегда."; if (mirror has general) { " (И крышка, к счастью, закрыта!)"; } else { ""; } ]; [ emphstring str; style underline; print (string) str; style roman; ]; [ SmearSub; if (second == nothing) { if (vaseline notin player) { "Смазать, но чем?"; } !if (noun == vaseline) { ! "На что ты хочешь намазать вазелин?"; !} second = noun; noun = vaseline; } if (noun == player) { "Не надо себя ни на что намазывать."; } if (noun ~= vaseline) { "Это нельзя ни на что намазать."; } if (second == vaseline) { "Тебе и так сложно её держать своими конечностями, а если помазать баночку, то это будет просто нереально."; } if (second == player) { "Ты надеешься, что ", (emphstring) "тебе", " вазелин не понадобится."; } if (vaseline hasnt open) { "Баночка вазелина закрыта."; } if (second has smeared) { print_ret (CCNom) second, " уже помазан", (SAEnd) second, " вазелином, так что наверное больше не нужно."; } give vaseline general; give second smeared; "Ты берёшь немножко вазелина из баночки и намазываешь его на ", (cAcc) second, "."; ]; [ XyzzySub; print_ret (emphstring) "О май гад, в мою игру играют знающие игроки!"; ]; [ HelpSub; "Эта игра была написана за один день, специально для конкурса Вжж.^^ Спасибо Евгу за организацию конкурса и Серому Волку за отважное бета-тестирование.^^ Также выражаю респекты Грэму Нельсону и Денису Гаеву за лучшую в мире IF-платформу.^^ И дополнительно посылаю ментальные факинги всем упёртым менюшникам!"; ]; !============================================================================ ! Описание игровых объектов Object storage "Кладовка" with description "Твоё обычное место обитания, можно сказать -- дом. Довольно тёмное место, что, впрочем, не мешает тебе здесь свободно ориентироваться -- всё знакомо, и ничего не меняется.^^ В углу находится место, где ты обычно спишь (гибернируешь), рядом в коробке лежат головоломки и механизмы. Однако здесь также появился новый объект, вчера его не было -- высокое прямоугольное зеркало на металлической подставке. Должно быть, кто-то поставил его сюда, пока ты спал (гибернировал).^^ Единственный выход ведёт на юг в лабораторию.", s_to [; if (mirror hasnt general) { "Перед тем как начать работу в комплексе, тебе бы хотелось узнать, что же это за зеркало."; } return lab; ], cant_go "Единственный выход ведёт на юг в лабораторию.", has light; Object -> mirror "высок/ое зеркал/о" with name "высок" "зеркал" "подставк" "надпис", description [; print "Прямоугольное высокое зеркало в гладкой металлической оправе, которое установлено на крепкой подставке. В нижнем левом углу поверхности чёрным маркером написано @<<Лаб 38-K@>>."; if (self hasnt general) { " Интересно, как хорошо оно отражает?"; } else { ""; } ], before [; Attack: if (self has general) { "Ты бы с удовольствием разбил это зеркало, чтобы больше его никогда не видеть, но ничего хорошего из этого не выйдет."; } else { "Пожалуй, не стоит -- ничего хорошего из этого не выйдет."; } Search: if (self has general) { "Второй раз тебе в него смотреть не хочется."; } else { give self general; "Ты подбираешься ближе к зеркалу, чтобы посмотреть в отражение, и с ужасом видишь, что ты совсем не такой, каким себя представлял. Ты -- робот. Настоящий такой, низкий, цилиндрической формы робот. Неудивительно, что кто-то из лаборантов в шутку называл тебя @<<Эр два дэ два@>>... Правда, у тебя довольно функциональные @<<руки@>>, и это уже хорошо.^^ Что ещё хуже -- ты голый! Ну, настолько, насколько робот может быть голым. Ты закрываешь переднюю крышку, чтобы никто ненароком не увидел твои нежные электронные внутренности."; } Take, Pull, Push: "Оно слишком тяжёлое, да и указаний куда-то его тащить не было"; ], has scenery neuter; ! general -- посмотрелся ли в зеркало Object -> box "коробк/а" with name "коробк", description "Обычная картонная коробка. Правда, из качественного картона. Внутри лежат разнообразные головоломки и механизмы.", before [; Take, Push, Pull: "Пусть лучше лежит здесь."; ], has scenery female; Object -> puzzles "головоломк/и" with name "головоломк" "паззл" "механизм" "кубик" "рубик", description "Здесь лежит набор разных головоломок и механизмов, с которыми ты любишь играть, когда находится свободное время. Правда они уже порядком тебе поднаскучили -- например, кубик Рубика 5x5x5 ты можешь собрать за минуту.", before [; Take: "Сейчас у тебя есть дело по-важнее."; ], has scenery pluralname; Object lab "Лаборатория" with description [; "Здесь ", (emphstring) "они" , " обычно проводят всякие эксперименты. В центре комнаты на столе стоят разнообразные сложные агрегаты, а вдоль южной стены тянется прилавок, на котором валяется всякий околонаучный хлам. Окон совсем нет.^^ Отсюда можно пойти на восток на кухню или вернуться в кладовку на север."; ], initial [; if (self hasnt visited) { "Настало время поработать. Нужно убрать за всеми мусор."; } ], n_to storage, e_to kitchen, cant_go "Отсюда можно пойти на восток на кухню или вернуться в кладовку на север.", has light; Object -> table "стол/" with name "стол", !describe ["";], description "Стол из тёмного металла, который поддерживает разнообразные устройства.", before [; Take, Pull, Push: "Стол намертво вделан в пол лаборатории."; Search:; ], has scenery male supporter; Object -> -> devices "агрегат/ы" with name "устройств" "агрегат" "перегонщик" "мочи" "штуковин" "магнит" "систем" "блок" "рычаг" "шестерн" "шестеренк" "девайс", description [ ix; ix = random(3); print "На столе установлено множество различных непонятных устройств, агрегатов и аппаратусов. Например, здесь есть "; switch (ix) { 1: "что-то похожее на перегонщик мочи в воду."; 2: "круглая штуковина с кучей магнитов."; 3: "очень хитрая система из блоков, рычагов и шестерёнок."; } ], before [; Take, Pull, Push: "Лучше их не трогать, а то ещё сломаешь."; ], has pluralname scenery; Object -> counter "прилав/о/к/" with name "прилавок" "прилавк" "хлам", casegen [ beg end csID; return ICVowel (csID, beg, end, 'о', 0); ], description [; print "На прилавке, который идёт вдоль южной стены, в основном лежат стопки бумаг со всякими надписями и чертежами."; if (vaseline in self) { " Среди всего этого хлама также лежит баночка вазелина. Интересно, кто её тут оставил."; } ""; ], has supporter scenery male; Object -> -> papers "бумаг/и" with name "бумаг" "бумажк" "чертеж", description "Разные бумажки с диаграммами, чертежами, схемами.", before [; Examine:; default: "Пусть лучше лежат."; ], has pluralname scenery; Object -> -> vaseline "баночк/а вазелина" with name "вазелин" "баночк" "банк" "крышк" "крышечк", description [; print "На плоской баночке с откручивающейся крышечкой написано ~Vaseline~. Сейчас баночка "; if (self has open) { print "открыта"; } else { print "закрыта"; } if (self has general) { print ". К тому же, она уже была использована"; } "."; ], before [; Smell: if (self has open) { "Твои рецепторы улавливают... видимо, запах вазелина."; } else { "Баночка закрыта, и наверное поэтому твои рецепторы не улавливают никаких запахов."; } Eat: "Пусть это вроде бы и пищевая добавка, но роботам всё равно не нужно есть, в отличие от ", (emphstring) "них", "."; Drop, PutOn, Insert: "Нет, лучше оставить вазелин с собой, мало ли он ещё пригодится."; ], after [; Open: "Ты откручиваешь крышку с баночки вазелина."; Close: "Ты закручиваешь крышку обратно на баночку."; Take: give self ~concealed; ], has female openable ~open concealed; Object -> windows "окн/а" with name "окн", before [; "Это не шутка, здесь их правда нет."; ], has pluralname scenery; Object kitchen "Кухня" with description [; print "Официально это место называется @<<комната для приёма пищи@>>. Посередине стоит низкий обеденный стол с парой стульев возле него, а в восточной стене находится небольшой кухонный гарнитур и окно с видом наружу.^^ В северной части восточной стены также есть окно. На улице ярко светит солнце,"; if (window hasnt general) { print " а с той стороны за окном есть что-то, что привлекает твоё внимание."; } else { print " и в его лучах снаружи пасётся лошадка."; } "Главный выход ведёт на север, а лаборатория находится на западе."; ], before [; Smell: "Здесь пахнет человеческой едой."; ], w_to lab, n_to TheEnd, cant_go "Главный выход ведёт на север, а лаборатория находится на западе.", has light; Object -> table2 "стол/" with name "стол", description [; print "Посередине стоит прозрачный низкий стол с современным дизайном. Наверняка, он был сделан в Швеции."; if (table_trash in self) { " На столе лежит недоеденный кем-то зефир."; } ""; ], has male scenery supporter; Object -> -> table_trash "недоеденн/ый зефир/" with name "надкусанн" "зефир" "зефиринк" "зефирк", description "Это половинка одной зефиринки в шоколаде, с отчётливо видным отпечатком зубов.", before [; Eat: "Ты не питаешься так, как это делают ", (emphstring) "они", "."; ], after [; Take: give self ~concealed; ], has male concealed; Object -> chairs "стуль/я" with name "стул" "стулья", description "Около стола стоят два простых деревянных стула со спинками.", has pluralname scenery; Object -> garnitour "кухонн/ый гарнитур/" with name "кухонн" "гарнитур", description "Он очень простой: раковина, плита, отделение внизу с дверцей и полочки наверху.", has male scenery; Object -> section "отделени/е с дверцей" with name "отделени" "двер" "дверц" "металлическ", description [; print "Отделение с металлической дверцей, в котором находится мусорное ведро. Сейчас дверца"; if (self hasnt open) { print " закрыта"; } else { print " открыта"; } "."; ], before [; Open: if (petlya hasnt smeared) { if (self hasnt general) { give self general; "Ты пытаешься открыть металлическую дверцу, но её почему-то заело."; } "Ты вновь пытаешься открыть дверцу, за которой должно быть мусорное ведро, но у тебя не получается. Наверное, что-то с петлями."; } else { give self open; "Ты с лёгкостью открываешь смазанную дверцу, и твоему взгляду предстаёт мусорное ведро."; } ], has neuter container openable ~open scenery; ! general -- первая попытка открыть сделана Object -> -> urn "мусорн/ое ведр/о" with name "мусорн" "ведр" "урн", description "В это мусорное ведро положено складывать весь мусор.", before [; Search: "Нечего копаться в никому не нужном мусоре."; ], after [; Receive: remove noun; give self general; ], has neuter scenery container open; ! general -- было использовано по назначению Object -> petlya "петл/и" with name "петл", description [; print "Дверные петли, похоже, немного поржавели."; if (self has smeared) { " Но зато теперь они смазаны вазелином."; } "."; ], before [; Attack: "Это может всё только усугубить, и ты никогда больше не откроешь эту дверцу."; ], has pluralname scenery; Object -> sink "раковин/а" with name "раковин", description "Обычная металлическая раковина незамысловатого дизайна.", has female scenery; Object -> oven "плит/а" with name "плит", description "Обычная плита. Иногда в ней что-нибудь готовят. К счастью, тебе не приходится этим заниматься.", before [; Smell: "Пахнет курицей."; Open: "Сейчас не обеденное время."; ], has female scenery; Object -> shelves "полочк/и" with name "полочк" "полк", before [; "На полочках совсем ничего нет."; ], has pluralname scenery; Object -> window "окн/о" with name "окн" "что-то", description "Оказывается, за окном пасётся очень милая лошадка. Само окно обычное. Хотя возможно, оно пуленепробиваемое.", before [; Examine: give self general; Search: <>; ], has neuter scenery; ! general -- посмотрел на окно Object -> horse_window "лошад/ь" with name "лошад" "лошадк", description "Милейшее создание. Ты бы с удовольствием сел на неё верхом и умчался бы далеко-далеко.", before [; Examine:; default: "Она стоит с той стороны, за окном."; ], has female scenery; Object -> sun "солнц/е" with name "солнц", description "Солнце освещает всё вокруг яркими лучами.", before [; Examine:; default: "Солнце слишком далеко (примерно в 150 миллионах километров от тебя)."; ], has neuter scenery; [ TheEnd; if (urn hasnt general) { "Ты ещё не убрал мусор, который ", (emphstring) "они"," оставили."; } deadflag = 2; print "Ты выходишь на улицу. Здесь так светло и хорошо, и тебе совсем не хочется возвращаться назад. А неподалёку стоит лошадка, запряжённая в небольшую тележку, и жуёт травку. Ты заезжаешь в тележку (ах как было бы хорошо поехать на лошади верхом, но увы), и вы вдвоём уезжаете далеко-далеко.^^ И ты надеешься, что вазелин тебе больше никогда не понадобится."; ]; !============================================================================ ! Stanard and extended grammar Include "RussiaG"; !============================================================================ Verb 'маз' ! (на)мазать * cAcc_noun -> Smear * cIns_noun cAcc_noun -> Smear ! вазелином что-то * cAcc_noun cIns_noun -> Smear reverse ! что-то вазелином * cAcc_noun 'на' cAcc_noun -> Smear ! вазелин на что-то * cAcc_noun 'по' cDat_noun -> Smear; ! вазелин по чему-то Object "намазать" VerbDepot with name 'маз'; Verb meta 'справка' 'хелп' 'помощь' 'help' 'info' * -> Help; Verb meta 'xyzzy' * -> Xyzzy; Object "справка" VerbDepot with name 'справка' 'хелп' 'помощь' 'help' 'info';