Wiki

Clone wiki

instead-modules / Использование

[Russian guide] Использование

Модуль emphasis

Модуль позволяет отказаться от функций txtb и txtem в основном коде игры. Вместо них используется простой синтаксис выделения текста, скопированный из Markdown. Вместо сложного pn "Привет"..txtem("Игрок") вы можете написать просто pn "Привет *Игрок*".

Использование:

**полужирный** или __полужирный__
*курсив*
_подчёркивание_
 -зачёркивание-

Просто подключите require "emphasis" и пользуйтесь этими короткими сокращениями. Модуль подключает модуль format.

ВНИМАНИЕ! Сокращения не будут работать в инвентаре.

Модуль choice

Наглядное использование этого модуля показано в игре "Шестой город". Он позволяет показывать фразы в диалогах на основе определённых критериев, которые различаются для каждой фразы. В результате получается сложный геймплей CYOA, основанный на множественных проверках условий.

Для начала покажу обычный диалог. Он ничем не отличается от стандартных диалогов INSTEAD, его можно сделать средствами обычного массива phr:

choose = choice {
  nam = __('Столовая'),
  dsc = __([[Передо мной стоит поднос с едой.]]),
  obj = {
    option(nil,'Съесть яблоко', nil, 'pl._ate = "apple"' ),
    option(nil,'Съесть перец'), nil, 'pl._ate = "pepper"' ),
    option(nil,'Запить водой'), nil, 'pl._drank = "water"' ),
  }
}

Чем отличается этот диалог? Во-первых, он описан как объект типа choice. Во-вторых, его фразы находятся в массиве obj и описаны функциями option. Синтаксис функции option соответствует функции phr, только добавляется новый параметр: условие, при котором появляется фраза. Если это условие пусто (что на языке Lua описывается словом nil), то фраза показывается всегда. Давайте посмотрим, что можно сделать при помощи условий:

choose = choice {
  nam = __('Столовая'),
  dsc = __([[Передо мной стоит поднос с едой.]]),
  obj = {
    option(nil,'Съесть яблоко', nil, 'pl._ate = "apple"' ),
    option("pl._ate ~= 'pepper'",'Съесть перец'), nil, 'pl._ate = "pepper"' ),
    option("pl._ate == 'pepper'",'Запить водой'), nil, 'pl._drank = "water"' ),
  }
}

Теперь третья фраза изначально не видна. Если игрок выберет вторую, то вторая тут же скроется, и появится третья. Условия могут быть также функциями, которые возвращают булево значение (true или false). Условия могут быть сколь угодно сложными, они могут проверять всё состояние игры.

Здесь также важно то, что условия проверяются при каждой отрисовке комнаты: игрок может активировать предмет в инвентаре, и у него тут же поменяется набор вариантов. Объект choice может реагировать даже на изменение настроек самого INSTEAD — всё, что придёт вам в голову. Это часто удобнее, чем выставлять показ/скрытие каждой фразы явным образом.

Модуль rndstr

Очень короткий модуль, добавляет функцию рандомизации строк. Пример использования:

rndstr({
  'Ой!',
  'Ай!',
  'Едришкина качель!'
});

В результате выполнения функции вы получаете случайную строку из массива.

Модуль translate

Традиционный подход к переводу игр на INSTEAD - это делать новую игру и потом, возможно, упаковывать её рядом с оригиналом. Некоторые авторы даже делают красивые меню для выбора языка. Это связано с тем, что при переводе на японский когда-то понадобилось полностью переписывать всю игру, вместе с частью логики.

Я считаю этот подход в корне неправильным, потому что он очень труден даже для игр среднего размера. После релиза 1.0 строки в игре по определению не должны радикально меняться, поэтому игры стоит переводить точно так же, как и остальные программы: при помощи gettext. Это тот способ, который не решает все проблемы перевода (для некоторых языков всё ещё придётся переписывать игру полностью), но облегчает переход между некоторыми языковыми парами. Кроме того, игроку не придётся второй раз выбирать язык игры, потому что он уже выбрал язык в настройках INSTEAD.

Закончив это отступление, я хочу представить модуль для перевода игр при помощи gettext. Чтобы его использовать, достаточно подключить модуль translate в вашу игру. У него всего одна настройка:

translate.source = 'ru';

Настройка translate.source указывает исходный язык строк. Модуль объявляет функцию __(), которая и будет переводить строки. Если язык в настройках INSTEAD соответствует исходному, то строки не меняются. Значение translate.source должно соответствовать переменной LANG движка, это - двухбуквенный код языка.

Это всё. Вы подключаете модуль, оборачиваете все строки в игре вот таким образом: __([[текст]]) и натравляете gettext на исходный код. Помощь по использованию gettext можно легко найти в сети Интернет.

Хорошим жестом будет подготовить все строки в игре к переводу даже если лично вы не собираетесь им заниматься – на случай, если это захочется сделать кому-то другому. К тому же, сразу привыкнуть писать через особую функцию проще, чем проставлять обёртки после начального релиза.

Updated