Особенности русской версии
Для компиляции в Glulx исходники должны быть в UTF-8. Пример командной строки для компиляции игры:
inform.exe +library +language_name=Russian -G -Cu $DICT_CHAR_SIZE=4 game.inf game.ulx
Для компиляции в Z-машину исходные файлы игры должны быть в кодировке Windows 1251. Пример командной строки для компиляции игры, где указаны все обязательные параметры:
inform.exe +library +charset_map=library\cyrwin.cm +language_name=Russian -v5 game.inf game.z5
Как описывать объекты
Нижеперечисленное относится только к объектам. На комнаты (локации) эти правила не распространяются.
-
В имени объекта нужно отделить окончание (или окончания) прямым слешем (/), а точнее — те буквы, которые должны будут изменяться при склонении. Например: латунн/ая ламп/а, надпис/ь на стене, бел/ый туман/. Имя используется при выводе объектов во всевозможных ситуациях, в разных падежах.
-
В свойстве
name
указываются слова, по которым парсер находит объекты. В русской версии нужно перечислять такие слова без окончаний. Здесь нужно не забыть указать и синонимы, по которым объект тоже должен находиться парсером. -
Каждому объекту (кроме комнат) обязательно нужно выдать один из атрибутов, соответствующий роду или числу объекта. Один из четырёх: male — мужской род, female — женский род, neuter — средний род, pluralname — множественное число.
Примеры:
Object -> "друг/ой склон/ холма" with name 'склон' 'сторон' 'холм', description "Кто мешает изучить его самому?", has scenery male;
Object -> "груб/ые каменн/ые ступен/и" with name 'груб' 'каменн' 'ступен', description "Грубые каменные ступени ведут по куполу вверх.", has scenery pluralname;
-
Особый случай — это существительные с беглыми гласными: ковёр (ковром), перекрёсток (перекрёстком) и так далее. Их нужно окружить двумя слешами, а к объекту добавить свойство
casegen
, по примеру ниже. Четвёртым параметром в функции ICVowel должна идти беглая гласная. Есть более сложные случаи, где новые буквы появляются (пятый параметр), см. пример ниже про «ручей».Object -> "туманн/ый колод/е/ц/" with name 'колодец' 'колодц', casegen [ beg end csID; return ICVowel (csID, beg, end, 'е', 0); ], description "Из колодца поднимаются бесформенные клубы белого тумана.", has scenery male;
Treasure -> large_gold_nugget "огромн/ый золот/ой самород/о/к/" with name 'золот' 'огромн' 'слиток' 'слитк' 'самородок' 'самородк' 'кусок' 'куск', description "Массивный кусок самородного золота!", casegen [ beg end csID; return ICVowel (csID, beg, end, 'о', 0); ], initial "На полу поблескивает большой золотой самородок!", has male;
Object Stream "бурн/ый руч/е//й" with name 'руче' 'ручь' 'речк' 'поток' 'вод', description "Холодный бурный ручей струится вниз по каменистому руслу.", casegen [ beg end csID; return ICVowel (csID, beg, end, 'е', 'ь'); ], has scenery male;
-
Есть случаи, когда нужно, чтобы у мужского объекта была женская логика для склонения имени. Например, мужское имя «Слава». В таком случае необходимо дополнительно выдать объекту атрибут fem_grammar.
-
Если возникает случай, где парсер не в состоянии самостоятельно просклонять имя объекта (на вывод), необходимо указать свойство-функцию
casegen
и через неё явно указать все нужные склонения. Кроме того, необходимо изменить имя объекта. Например:Object Key "/неважно_что_здесь_будет_написано_главное_без_пробелов" with name 'ключ', description "Твой любимый ключ на тридцать два.", casegen [ beg end csID; switch (csID) { csNom: print "ключ"; rtrue; csGen: print "ключа"; rtrue; csDat: print "ключу"; rtrue; csAcc: print "ключ"; rtrue; csIns: print "ключом"; rtrue; csPre: print "ключе"; rtrue; } ], has male;
-
Если парсер не распознаёт объект автоматически (на ввод), то следует пользоваться свойством-функцией
parse_name
. Подробное описание находится в DM4 (pdf) на странице 209. В простом примере ниже имя персонажа «Моро» не склоняется.parse_name [n; while (NextWord() == 'моро') n++; return n; ],
Как проверить, что объект верно склоняется по падежам?
Для этого есть удобная команда мета! форм. Чтобы она работала, убедитесь, что игра скомпилирована в режиме Debug (-D).
>мета! форм самородок
Объект «огромн/ый золот/ой самород/о/к/» (Ед.ч./М.р.):
И.п.: Огромный золотой самородок
Р.п.: Огромного золотого самородка
Д.п.: Огромному золотому самородку
В.п.: Огромный золотой самородок
Т.п.: Огромным золотым самородком
П.п.: Огромном золотом самородке
>
Как вывести объект в каком-либо падеже
Для этого есть следующие функции. Вторая функция нужна для вывода с большой буквы (обычно, в начале предложений).
cNom
иCCNom
— именительный (Nominative).cAcc
иCCAcc
— винительный (Accusative).cGen
иCCGen
— родительный (Genitive).cDat
иCCDat
— дательный (Dative).cIns
иCCIns
— творительный (Instrumental).cPre
иCCPre
— предложный (Prepositive).
"Вы тщательно установили неуклюжую монстроподобную фотокамеру,
направили свет лампы на цель и терпеливо дождались,
пока экспонирование ", (cGen) noun, " не завершится.";
print_ret "Вам нет нужды беспокоиться о ", (cPre) self, ".";
[ SaluteSub;
if (noun has animate)
print_ret (CCNom) noun, " приветствует тебя.";
print_ret (CCNom) noun, " не замечает этого.";
];
Вспомогательные функции
Все эти функции принимают объект, и вызывать их в коде нужно как (function) noun
.
PronounS
выводит местоимение, подходящее объекту («ты», «он», «она», «оно», «они»).Pronoun
работает какPronounS
, но выводит с заглавной буквы.SAEnd
выводит окончание краткой формы прилагательных или причастий («открыта», «открыто», «открыты»).V1aEnd
выводит окончания глаголов -ет или -ут.V1bEnd
выводит окончания глаголов -ет или -ют.V2aEnd
выводит окончания глаголов -ит или -ат.V2bEnd
выводит окончания глаголов -ит или -ят.VPEnd
выводит окончание для глаголов в прошедшем времени («пропал», «пропала», «пропало», «пропали»).AEnd
: окончания прилагательных -ый, -ая, -ое, -ые.AEnd2
: окончания прилагательных -ий, -ая, -ое, -ие.AEnd3
: окончания прилагательных -ой, -ая, -ое, -ые.PEnding1
: -им, -ой, -ими.PEnding2
: -ым, -ой, -ыми.GenIt
: его, её, их.GenIt2
: него, неё, них.DatIt
: ему, ей, им.DatIt2
: нему, ней, ним.InsIt
: им, ей, имиInsIt2
: ним, ней, ними.
Как описывать русские глаголы
-
Глаголы нужно перечислять по корневой части. Парсер распознает приставки («по», «за» и т.д.) и суффиксы-окончания («ся», «ять», «ать» и т.д.) автоматически.
-
Нужно учесть и то, что глаголы могут вводиться и в повелительном наклонении: например, не только «взять» (вз), но и «возьми» (возьм). Это необходимо для приказов, которые игрок может отдавать NPC: «гоблин, отдай мне ключ».
-
Для существительных, с которыми оперирует глагол, нужно указывать токены. Какой токен использовать, определяет падеж существительного в данном контексте. Например, «взять ключ» — винительный падеж (Accusative), «дотронуться до двери» — дверь в родительном падеже (Genitive).
Есть следующие токены:
cNom_noun
— именительный (Nominative).cAcc_noun
— винительный (Accusative).cGen_noun
— родительный (Genitive).cDat_noun
— дательный (Dative).cIns_noun
— творительный (Instrumental).cPre_noun
— предложный (Prepositive).
Кроме этого, можно использовать более строгие токены, соответствующие категориям объектов:
cIns_held
,cAcc_held
,cGen_held
— для объектов, которые есть в инвентаре игрока (у которых есть атрибут held).cAcc_creat
,cGen_creat
,cDat_creat
— для живых объектов (NPC с атрибутом animate).cAcc_multi
— для группы объектов (например, команда «взять» позволяет брать более одного объекта).cAcc_multiheld
,cAcc_multiexcept
,cAcc_multiinside
.
-
Также, не обязательно, но рекомендуется добавить объект с этими корневыми частями в VerbDepot, как указано в примере ниже. В нём нужно указать полную форму глагола, которая иногда выводится в игре.
! "вязать" Verb 'вяз' 'вяж' * cAcc_noun -> Tie * cAcc_noun 'к' cDat_noun -> Tie ! "привязать" * 'к' cDat_noun cAcc_noun -> Tie reverse * cAcc_noun 'с'/'со' cIns_noun -> Tie ! "связать" * 'с'/'со' cIns_noun cAcc_noun -> Tie reverse; Object "вязать" VerbDepot with name 'вяз' 'вяж';