FAQ

В чём разница между Z-machine и Glulx?

Это два формата файлов, в которые можно компилировать игры на Информе. Более старая, классическая Z-machine поддерживает размер файла игры до 256 Кб (формат .z5) или 512 Кб (формат .z8) и 16 цветов. Glulx — более современная 32-битная система, поддерживающая файлы размером до 4 Гб и расширенные мультимедийные возможности. Компилятор inform умеет компилировать игры в любом из форматов.

В английской версии Информа библиотека единая, но в русской версии пришлось разнести её на два отдельных проекта.

На данный момент Glulx находится в стадии беты и рекомендуется для авторов, уже имевших опыт с Информом.

Glulx имеет следующие фичи:

  • мультимедиа-фичи: картинки, звук, ссылки.
  • расширенные возможности типографики.
  • возможность разделять окно на произвольные области.
  • полная поддержка UTF-8 как в исходниках, так и в готовых играх.
  • файлы игр до 4 гигабайт.

Известное ограничение: в онлайн-версии Glulx (Quixe) нельзя в коде игры задавать цвета или размер шрифтов, кроме глобальных настроек через .css.

Какие плееры открывают игры на Информе?

Как опубликовать игру онлайн?

Чтобы запустить произвольную игру в Parchment, нужно указать параметром для сайта iplayif.com путь к файлу игры, уже залитому на какой-нибудь сервер. Например: https://iplayif.com/?story=https://rinform.org/games/photopia/PhotopiaR.z8

Очень просто и разместить игру на своём собственном сайте, даже статическом, т.к. Parchment работает полностью на клиентском JavaScript. Достаточно скачать и разместить у себя на сервере файлы:

  • index.html,
  • lib/parchment.min.js,
  • lib/parchment.min.css,
  • lib/jquery.min.js
  • lib/zvm.min.js

и отредактировать index.html. В .css файле можно поменять шрифты, цвета и прочее, на что хватит вашей фантазии. Несколько примеров: Винтер, Delightful Wallpaper, Dreamhold.

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

Для компиляции в Z-машину исходные файлы игры должны быть в кодировке Windows 1251. Пример командной строки для компиляции игры, где указаны все обязательные параметры:

inform.exe +library +charset_map=library\cyrwin.cm +language_name=Russian -v5 game.inf game.z5

Для компиляции в Glulx исходники должны быть в UTF-8. Пример командной строки для компиляции игры:

inform.exe +library +language_name=Russian -G -Cu $DICT_CHAR_SIZE=4 game.inf game.ulx

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

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

  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 'вяз' 'вяж';