Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
492 lines (435 sloc) 25.1 KB
!% -SD
!============================================================================
!Include "CyrDef";
Constant Story "Вильгельм Телль";
Constant Headline
"^Пример простой игры на Inform
^Авторы: Роджер Фирт (Roger Firth) и Соня Кессерих (Sonja Kesserich).
^Перевод Александра Мосьпана a.k.a. Ugo^";
Release 4; Serial "171220"; ! для публичных релизов
Constant MAX_SCORE = 3;
Include "Parser";
Include "VerbLib";
!============================================================================
! Классы объектов
Class Room
has light;
Class Prop
with before [;
Examine:
return false;
default:
print_ret "Вам нет нужды беспокоиться о ", (cPre) self, ".";
],
has scenery;
Class Furniture
with before [;
Take, Pull, Push, PushDir:
print_ret "Слишком тяжело.";
],
has static supporter;
Class Arrow
with name 'стрел',
description "Все твои стрелы верны и остры.",
before [;
Drop, Give, ThrowAt:
print_ret "Ты не хочешь расставаться со своими острыми стрелами.";
]
has female;
Class NPC
with life [;
Answer, Ask, Order, Tell:
print_ret "Введите просто @<<говорить с ", (cIns) self, "@>>.";
],
has animate;
!============================================================================
! Игровые объекты
Room street "Улица Альтдорфа"
with description [;
print "Узкая улочка тянется на север, к городской площади. Местные жители стекаются в город через ворота на юге.
Они выкрикивают приветствия, предлагают товары, обмениваются новостями, с наигранным недоверием торгуются с
лавочниками, чьи прилавки сильно затрудняют движение.^";
if (self hasnt visited)
print "^@<<Держись поближе ко мне, сынок, -- говоришь ты. -- Иначе потеряешься в этой толпе@>>.^";
],
n_to below_square,
s_to "Поток народа, движущийся на север, к площади, не даёт тебе пройти.";
Prop "южн/ые ворот/а" street
with name 'южн' 'деревянн' 'ворот',
description "Огромные деревянные ворота в городской стене. Они широко распахнуты.",
has pluralname;
Prop "прилавк/и"
with name 'прилавк' 'ларьк' 'ларёк' 'ряд',
description "Еда, инструменты, одежда -- обычное барахло.",
found_in street below_square,
has pluralname;
Prop "товар/"
with name 'товар' 'ед' 'одежд' 'инструмент' 'барахл',
description "Ничто не приковывает твой взгляд.",
found_in street below_square,
has male;
Prop "торговц/ы"
with name 'торговц' 'торговец' 'купц' 'купец' 'продавц' 'продавец' 'лавочник',
description "Несколько жуликоватых, но довольно прилично выглядящих торговцев, откровенно преувеличивая,
расхваливают свой товар.",
found_in street below_square,
has animate pluralname;
Prop "местн/ые жител/и"
with name 'люд' 'народ' 'местн' 'толп' 'жител',
description "Горный народ, такой же, как и ты.",
found_in [; return true; ],
has animate pluralname;
!----------------------------------------------------------------------------
Room below_square "Улица"
with description
"Народ проталкивается от южных ворот к городской площади, располагающейся немного севернее.
Ты узнаёшь торговку за прилавком фруктово-овощной лавки.",
n_to south_square,
s_to street;
Furniture stall "фруктово-овощн/ая лавк/а" below_square
with name 'прилавок' 'прилавк' 'стол' 'лавк' 'фрукт',
description "Это всего лишь маленький стол с большой кучей картошки, кучкой морковки и репы, и парой яблок.",
before [;
Search:
<<Examine self>>;
],
has scenery female;
Prop "картошк/а" below_square
with name 'картошк' 'картофел',
description "Должно быть, какой-то особенно ранний сорт... лет так на триста!",
has female;
Prop "фрукт/ы и овощ/и" below_square
with name 'морков' 'морковк' 'реп' 'репк' 'овощ',
description "Отличные местные овощи.",
has pluralname;
NPC stallholder "Хельг/а" below_square
with name 'хельг' 'торговк' 'продавщиц' 'плать' 'шарф' 'женщин',
description "Хельга -- полноватая жизнерадостная женщина, одетая в бесформенное платье и пёстрый платок.",
initial [;
print "Хельга отвлекается от сортировки картошки, чтобы уделить тебе внимание.^";
if (location hasnt visited) {
move apple to player;
print "^@<<Привет, Вильгельм! Отличный денёк для торговли! Это твой Уолтер? О, как он вырос! Держи яблоко для него --
тут один край немного подгнил, но всё остальное хорошее. Как там фрау Телль? Передавай ей привет@>>.^";
}
],
times_spoken_to 0, ! для подсчёта разговоров
life [;
Kiss:
print_ret "@<<Ох, а ты дерзкий тип!@>>";
Talk:
self.times_spoken_to = self.times_spoken_to + 1;
switch (self.times_spoken_to) {
1: score = score + 1;
print_ret "Ты тепло благодаришь Хельгу за яблоко.";
2: print_ret "@<<Ещё увидимся!@>>";
default: return false;
}
],
has female;
!----------------------------------------------------------------------------
Room south_square "Южный край площади"
with description
"Узкая улица выходит на южный край городской площади, продолжаясь на дальней её стороне.
Чтобы продолжить путь к месту назначения -- сыромятне Йохансона -- ты должен пройти на север, через площадь,
в центре которой ты видишь отвратительный столб со шляпой Гесслера на верхушке. Если ты пойдёшь прямо,
придётся пройти мимо него. Солдаты императора грубо толкаются среди толпы, раздавая тумаки и громко ругаясь.",
n_to mid_square,
s_to below_square;
Prop "шляп/а на столбе"
with name 'шапк' 'шляп' 'шест' 'столб',
before [;
default:
print_ret "Издали плохо видно.";
],
found_in south_square north_square,
has female;
Prop "Солдат/ы Гесслера"
with name 'солдат' 'страж' 'стражник',
description "Неотёсанные, жестокие люди не из этих мест.",
before [;
FireAt:
print_ret "Их намного больше.";
Talk:
print_ret "Разговаривать с этими мерзавцами -- ниже твоего достоинства.";
],
found_in south_square mid_square north_square marketplace,
has animate pluralname;
!----------------------------------------------------------------------------
Room mid_square "Центр площади"
with description
"В центре площади давка совсем не такая сильная. Большинство людей предпочитают держаться подальше от столба,
на который нахлобучена эта нелепая церемониальная шапка. Группа солдат стоит неподалёку, осматривая всех, кто проходит.",
n_to north_square,
s_to south_square,
warnings_count 0, ! количество предупреждений солдата
before [;
Go:
if (noun == s_obj) {
self.warnings_count = 0;
pole.has_been_saluted = false;
}
if (noun == n_obj) {
if (pole.has_been_saluted == true) {
print "^@<<Хорошего дня@>>.^";
return false;
} ! закрытие (pole has_been_saluted)
else {
self.warnings_count = self.warnings_count + 1;
switch (self.warnings_count) {
1: print_ret "Солдат преграждает тебе дорогу.^^
@<<Эй ты, сноб, забыл хорошие манеры? Как насчёт того, чтобы поклониться шляпе фогта?@>>";
2: print_ret "^@<<Я тебя знаю, ты Телль, мятежник, не правда ли?
Ладно, мы не хотим начинать тут драку, так что будь хорошим мальчиком,
отдай честь этой чёртовой шляпе, в третий раз я просить не буду@>>.";
default:
print "^@<<Ладно, ";
style underline; print "господин"; style roman;
print " Телль, у вас серьёзные неприятности. Я вежливо попросил, но вы оказались слишком гордым
и слишком глупым. Думаю, фогт захочет с вами немного побеседовать@>>.^^
С этими словами солдаты хватают тебя и Уолтера, и пока сержант бежит докладывать Гесслеру,
они грубо тащат вас к старому липовому дереву, растущему на рыночной площади.^";
move apple to son;
PlayerTo(marketplace);
return true;
} ! закрытие switch
} ! закрытие (pole has_NOT_been_saluted)
} ! закрытие (noun == n_obj)
];
Furniture pole "шляп/а на шесте" mid_square
with name 'шляп' 'шест' 'шапк' 'столб' 'перь' 'перо' 'кож',
description
"Столб из соснового ствола диаметром в несколько дюймов и высотой в девять или десять футов.
На самой верхушке надёжно закреплена нелепая шляпа Гесслера из черной и красной кожи, с широкими
изогнутыми полями и пучком перьев из мёртвого гуся.",
has_been_saluted false,
before [;
FireAt:
print_ret "Заманчиво, но ты не хочешь неприятностей.";
Salute:
self.has_been_saluted = true;
print_ret "Ты отдаёшь честь шляпе на столбе.^^
@<<Благодарю вас, сэр@>>, -- ухмыляется солдат.";
],
has scenery female;
!----------------------------------------------------------------------------
Room north_square "Северный край площади"
with description
"Узкая улочка ведёт на север от мощёной площади, в центре которой едва виднеется столб и шапка.",
n_to [;
deadflag = 3;
print_ret "Вместе с Уолтером ты уходишь с площади, направляясь к сыромятне Йохансона.";
],
s_to "Ты не можешь себя заставить снова пройти через это.";
!----------------------------------------------------------------------------
Room marketplace "Рыночная площадь"
with description
"Рыночная площадь Альтдорфа примыкает к центральной площади. Она была поспешно очищена от прилавков.
Группа солдат расталкивает людей, чтобы очистить место перед липой, которая растет тут с незапамятных
времён. Обычно в её тени собираются старики, чтобы посплетничать, поглазеть на девушек и поиграть в карты.
Но сегодня под ней никого нет, кроме Уолтера, которого привязали к стволу. Двое солдат удерживают тебя примерно
в сорока метрах от него.",
cant_go "Что? Оставить своего сына связанным здесь?";
Object tree "лип/а" marketplace
with name 'лип' 'дерев',
description "Обычное большое дерево.",
before [;
FireAt:
if (BowOrArrow(second) == true) {
deadflag = 3;
print_ret "Твоя рука слегка дрожит, и стрела входит в ствол на несколько дюймов выше головы Уолтера.";
}
return true;
],
has scenery female;
NPC governor "герцог/" marketplace
with name 'герцог' 'фогт' 'фохт' 'герман' 'гесслер' 'геслер',
description
"Невысокий, коренастый, с противным лицом, Гесслер наслаждается властью, которую он имеет над этим городком.",
initial [;
print "Гесслер с глумливым лицом наблюдает за происходящим с безопасного расстояния.^";
if (location hasnt visited)
print "^@<<Похоже, нужно преподать тебе урок, глупец. Никто не смеет проходить через площадь, не отдав дань
уважения Его Императорскому Высочеству Альберту. Никто, ты слышишь? Я мог бы лишить тебя головы за измену,
но проявлю снисхождение. Не жди моей милости, если снова проявишь подобную глупость, но в этот раз я отпущу
тебя... после того, как ты продемонстрируешь своё мастерство владения луком. Попади в это яблоко с того места,
где ты стоишь. Это не должно быть слишком сложным. Сержант, лови. Поставь его на голову этого мелкого ублюдка@>>^.";
],
life [;
Talk:
print_ret "Ты не можешь заставить себя заговорить с ним.";
],
before [;
FireAt:
if (BowOrArrow(second) == true) {
deadflag = 3;
print_ret "Прежде, чем солдаты успевают среагировать, ты разворачиваешься, и выпускаешь стрелу в Гесслера.
Она пронзает его сердце, и герцог оседает на землю. На мгновение толпа замирает в недоумении, но тут же
разражается криками ликования.";
}
return true;
],
has male;
!============================================================================
! Предметы в инвентаре
Object bow "лук/"
with name 'лук',
description "Твой верный лук из тиса, с натянутой льняной тетивой.",
before [;
Drop, Give, ThrowAt:
print_ret "Ты никогда не расстаёшься со своим верным луком.";
]
has clothing male;
Object quiver "колчан/"
with name 'колчан',
description
"Он сделан из козьей кожи и обычно висит за твоим левым плечом.",
before [;
Drop, Give, ThrowAt:
print_ret "Но это ведь подарок твоей жены Хедвиг.";
],
has container open clothing male;
Arrow "стрел/а" quiver;
Arrow "стрел/а" quiver;
Arrow "стрел/а" quiver;
NPC son "сын/"
with name 'сын' 'уолтер' 'мальчик' 'мальчишк' 'парен' 'парн',
description [;
if (location == marketplace)
print_ret "Он смотрит на тебя, пытаясь выглядеть спокойным и смелым. Его руки связаны за спиной.
Яблоко лежит в его светлых волосах.";
else
print_ret "Тихий светлый мальчик восьми лет, он быстро учится сельской работе.";
],
life [;
Give:
score = score + 1;
move noun to self;
print_ret "@<<Спасибо, пап@>>.";
Talk:
if (location == marketplace)
print_ret "@<<Стой спокойно, сынок, Господь нам поможет@>>.";
else
print_ret "Ты показываешь сыну несколько интересных мест в городе.";
],
before [;
Examine,Listen,Salute,Talk:
return false;
FireAt:
if (location == marketplace) {
if (BowOrArrow(second) == true) {
deadflag = 3;
print_ret "Упс! Наверняка вы имели в виду не это?";
}
return true;
}
else
return false;
default:
if (location == marketplace)
print_ret "Солдаты не позволят тебе этого.";
else
return false;
],
found_in [; return true; ],
has male scenery transparent;
Object apple "яблок/о"
with name 'яблок',
description [;
if (location == marketplace)
print_ret "Отсюда ты едва видишь его.";
else
print_ret "Яблоко зелёное, с коричневым пятном.";
],
before [;
Drop:
print_ret "Вполне съедобное яблоко, не стоит его выбрасывать.";
Eat:
print_ret "Хельга дала его для Уолтера...";
FireAt:
if (location == marketplace) {
if (BowOrArrow(second) == true) {
score = score + 1;
deadflag = 2;
print_ret "Мягко и спокойно ты кладёшь стрелу на тетиву, оттягивая её, и, предельно
сконцентрировавшись, берёшь прицел. Задержав дыхание, не мигая, ты в ужасе
отправляешь стрелу в цель. Она летит через площадь к твоему сыну, и, пронзая яблоко, впивается
в дерево. Толпа взрывается криками радости. Гесслер остаётся разочарованным.";
}
return true;
}
else
return false;
],
has neuter;
!============================================================================
! Инициализация
[ Initialise;
location = street;
lookmode = 2; ! like the VERBOSE command
move bow to player;
move quiver to player; give quiver worn;
player.description =
"Ты одет в традиционную одежду швейцарского горца.";
print_ret "^^
Место: Альтдорф, кантон Ури, Швейцария. Год 1307. Швейцария под командованием Императора Альбрехта Габсбурга.
Его наместник -- фогт -- жестокий Герман Гесслер, повесил свою шляпу на вершине столба, установленного посередине
городской площади. Каждый проходящий мимо должен был кланяться этому ненавистному символу Императорского могущества.
^^
Ты, вместе с сыном, спустился от своего домика, расположенного высоко в горах, чтобы купить провизии. Ты -- гордый и
независимый мужчина, охотник и проводник, известный мастерством владения луком, и неумением скрывать своё презрение
к фогту, что, конечно, неумно, учитывая, сколько вокруг его солдат.
^^
Сегодня базарный день -- город забит людьми с окрестных деревень и селений.^";
];
[ DeathMessage; print "Вы испортили любимую народную легенду"; ];
!============================================================================
! Стандартная и расширенная грамматика
Include "RussiaG";
!----------------------------------------------------------------------------
[ TalkSub;
if (noun == player) print_ret "Ты не слышишь ничего особенного.";
if (RunLife(noun,##Talk) ~= false) return; ! consult life[; Talk: ]
print_ret "Тебе не приходит в голову, что сказать.";
];
Verb 'говорить' 'болтать'
* 'с' creature -> Talk;
!----------------------------------------------------------------------------
[ BowOrArrow o;
if (o == bow or nothing || o ofclass Arrow) return true;
print "Это не похоже на оружие, не правда ли?^";
return false;
];
[ FireAtSub;
if (noun == nothing)
print_ret "Ты не хочешь просто стрелять куда зря.";
if (BowOrArrow(second) == true)
print_ret "Немыслимо!";
];
Verb 'стрел' 'целить'
* -> FireAt
* cAcc_noun -> FireAt ! застрелить
* 'в' cAcc_noun -> FireAt
* 'в' cAcc_noun 'из' cGen_noun -> FireAt
* cAcc_noun 'из' cGen_noun -> FireAt
* cIns_noun 'в' noun -> FireAt reverse
* 'из' cGen_noun 'в' cAcc_noun -> FireAt reverse;
!----------------------------------------------------------------------------
[ SaluteSub;
if (noun has animate)
print_ret (CCNom) noun, " приветствует тебя.";
print_ret (CCNom) noun, " не замечает этого.";
];
Verb 'поклонить'
* cDat_noun -> Salute;
Verb 'отдать'
* 'честь' cDat_noun -> Salute;
Extend 'мах'
* cDat_noun -> Salute;
Extend 'маш'
* cDat_noun -> Salute;
!----------------------------------------------------------------------------
[ UntieSub; print_ret "Ты не можешь развязать это."; ];
Verb 'развяз' 'отвяз' 'освобод'
* cAcc_noun -> Untie;
!============================================================================