# Особенности русской версии

Для компиляции в 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

## Как описывать объекты

Нижеперечисленное относится только к объектам. На комнаты (локации) эти правила не распространяются.

1. В имени объекта нужно отделить окончание (или окончания) прямым слешем (/), а точнее — те буквы, которые должны будут изменяться при склонении. Например: латунн/ая ламп/а, надпис/ь на стене, бел/ый туман/. Имя используется при выводе объектов во всевозможных ситуациях, в разных падежах.

2. В свойстве `name` указываются слова, по которым парсер находит объекты. В русской версии нужно перечислять такие слова без окончаний. Здесь нужно не забыть указать и синонимы, по которым объект тоже должен находиться парсером.

3. Каждому объекту (кроме комнат) обязательно нужно выдать один из атрибутов, соответствующий роду или числу объекта. Один из четырёх: male — мужской род, female — женский род, neuter — средний род, pluralname — множественное число.

   Примеры:

       Object -> "друг/ой склон/ холма"
         with name 'склон' 'сторон' 'холм',
         description "Кто мешает изучить его самому?",
         has  scenery male;

       Object -> "груб/ые каменн/ые ступен/и"
         with name 'груб' 'каменн' 'ступен',
         description "Грубые каменные ступени ведут по куполу вверх.",
         has  scenery pluralname;

4. Особый случай — это существительные с беглыми гласными: ковёр (ковром), перекрёсток (перекрёстком) и так далее. Их нужно окружить двумя слешами, а к объекту добавить свойство `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;

5. Есть случаи, когда нужно, чтобы у мужского объекта была женская логика для склонения имени. Например, мужское имя «Слава». В таком случае необходимо дополнительно выдать объекту атрибут fem_grammar.

6. Если возникает случай, где парсер не в состоянии самостоятельно просклонять имя объекта (на вывод), необходимо указать свойство-функцию `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;

7. Если парсер не распознаёт объект автоматически (на ввод), то следует пользоваться свойством-функцией `parse_name`. Подробное описание находится в DM4 (pdf) на странице 209. В простом примере ниже имя персонажа «Моро» не склоняется.

       parse_name [n;
           while (NextWord() == 'моро') n++;
           return n;
       ],

## Как проверить, что объект верно склоняется по падежам?

Для этого есть удобная команда мета! форм. Чтобы она работала, убедитесь, что игра скомпилирована в режиме Debug (-D).

    >мета! форм самородок
    Объект «огромн/ый золот/ой самород/о/к/» (Ед.ч./М.р.):

    И.п.: Огромный золотой самородок
    Р.п.: Огромного золотого самородка
    Д.п.: Огромному золотому самородку
    В.п.: Огромный золотой самородок
    Т.п.: Огромным золотым самородком
    П.п.: Огромном золотом самородке

    >

## Как вывести объект в каком-либо падеже

Для этого есть следующие функции. Вторая функция нужна для вывода с большой буквы (обычно, в начале предложений).

- `cNom` и `ССNom` — именительный (Nominative).
- `cAcc` и `ССAcc` — винительный (Accusative).
- `cGen` и `ССGen` — родительный (Genitive).
- `cDat` и `ССDat` — дательный (Dative).
- `cIns` и `ССIns` — творительный (Instrumental).
- `cPre` и `ССPre` — предложный (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`: ним, ней, ними.

## Как описывать русские глаголы

1. Глаголы нужно перечислять по корневой части. Парсер распознает приставки («по», «за» и т.д.) и суффиксы-окончания («ся», «ять», «ать» и т.д.) автоматически.

2. Нужно учесть и то, что глаголы могут вводиться и в повелительном наклонении: например, не только «взять» (вз), но и «возьми» (возьм). Это необходимо для приказов, которые игрок может отдавать NPC: «гоблин, отдай мне ключ».

3. Для существительных, с которыми оперирует глагол, нужно указывать токены. Какой токен использовать, определяет падеж существительного в данном контексте. Например, «взять ключ» — винительный падеж (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`.

4. Также, не обязательно, но рекомендуется добавить объект с этими корневыми частями в 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 'вяз' 'вяж';