Часть 1. Немного слов
Абсолютно все тексты, используемые игрой хранятся в языковом файле, начиная с окна запуска игры, заканчивая различными названиями кораблей, станций и т.п. Сделано это для удобства локализации - можно перевести игру на любой язык самому, а можно подредактировать уже существующий перевод. Впрочем, обо всем попорядку.
Что же представляет из себя языковой файл? Это обычный файл формата XML, который можно создать и/или редактировать блокнотом (рекомендуется все же для удобства использовать специальные программы, наподобие XML Notepad или Microsoft Visual Studio).
Часть 2. Структура языкового файла
Вот как выглядит "скелет" языкового файла:
- <?xml version="1.0" encoding="UTF-8" ?>
- <language id="7">
- <page id="число-номер_страницы" title="название_страницы(необязательно)" descr="описание_страницы(необязательно)">
- <t id="число-номер_текста">Текст</t>
- </page>
- </language>
<?xml version="1.0" encoding="UTF-8" ?> - сообщает о версии XML и кодировки текста. Это не надо трогать. Вообще.
<language id="7"/> - говорит нам о том, к какому языку идут заключенные в этот тег страницы. В зависимости от языка вместо
7 может идти номер региона (44 - английский, 33 - французский, 49 - немецкий, 48 - польский, 39 - итальянский).
<page id="число-номер_страницы"/> - говорит нам о том, на какой странице находятся заключенные в тег тексты.
<t id="число-номер_текста">Текст</t> - содержит номер текста на странице, и, собственно, сам текст.
На любой странице может быть сколько угодно текстов. Главное - уникальный номер текста, причем уникальность номера текста важна только лишь в пределах одной страницы.
Есть еще такая замечательная вещь, как
ссылка на другой текст. Ссылка имеет вид
{XX,YY}, где XX - номер страницы, а YY - номер текста.
- <page id="9001">
- <t id="1901">Подвержен атаке</t>
- <t id="1902">Корабль</t>
- <t id="1324">Ваш {9001,1902} был {9001,1901}.</t>
- </page>
При попытке вывести текст, содержащийся на странице 9001 с номером 1324, мы получим строку вида
Ваш Корабль был Подвержен атаке.
Часть 3. Имя языкового файла
Все языковые файлы имеют имя формата
L0XX-YYYY.xml, где XX - номер региона (см. выше), а YYYY - номер текстового файла.
Изначально игра подгружает в игру только файл с номером 0001. Остальные файлы могут быть подгружены скриптами, для этого служит команда
load text: id=XXXX. Стоит отметить, что сам по себе
языковой файл никак не связан с собственным содержанием. То есть у нас есть "база" (id 0001) - основные тексты игры, подгружаемые автоматически, и некоторые "кусочки" (все остальные id), которые можно добавить в эту базу командой load text.
Что это значит? Пусть у нас есть 3 пронумерованных стакана (id 1001, 1052, 1395), в каждом из которых налита вода, и большая бездонная миска, в которой уже имеется некоторое кол-во воды (id 0001). Нам сказали вылить 1 (id 1001) и 2 (id 1052) стаканы в эту миску. Эта миска "пополнилась" на содержимое этих двух стаканов, а вода в третьем (id 1395) стакане, возможно, будет вылита позже. В качестве воды в данном случае выступает совокупность страниц и текстовых строк.
Хочется заметить, что содержимое страниц с одинаковыми номерами объединяется, и, если будут конфликты в номерах текстов, то текст останется тот, который подгрузится позже.
Часть 5. Форматирование текста внутри языкового файла
Как Вы уже могли заметить, не весь текст в игре представлен в белом цвете. В некоторых местах текст центрирован, в некоторых прижат к правому краю. За все операции с текстом отвечают
форматирующие спецсимволы и
теги. Что же они из себя представляют?
Форматирующие цвет спецсимволы представлены в виде
\033<буква, обозначающая цвет> и могут быть использованы в любом месте текста. Цвет текста, находящегося справа от такого спецсимвола, будет изменен соответствующим образом до следующего подобного спецсимвола или перевода строки.
Спецсимвол, форматирующий не цвет текста только один -
\n. Он служит для перевода строки.
Небольшая памятка:
Спецсимвол | Цвет |
\033B | Синий |
\033C | Голубой |
\033G | Зеленый |
\033M | Малиновый |
\033R | Красный |
\033W | Белый |
\033X | Ярко-белый (стандарт для меню) |
\033Y | Желтый |
\033Z | Серый |
\n | Перевод строки (форматирующий, не для цвета!) |
Помимо спецсимволов для изменения цвета текста (и не только) можно использовать
теги.
Тег должен открываться и закрываться. Например, [b]<= открытие тега | А еще текст внутри данного тега должен быть желтым | закрытие тега =>[/b]. Помимо изменения цвета, как я уже говорил, теги могут менять его расположение, а также выполнять роль неких функций.
Также небольшая памятка:
Тег | Описание |
[b][/b] | Текст отражается ярко-желтым цветом |
[blue][/blue] | То же голубым цветом |
[red][/red] | То же красным цветом |
[green][/green] | То же зеленым цветом |
[justify][/justify] | Текст выравнивается по краям |
[center][/center] | Текст центрируется |
[left][/left] | Текст выравнивается по левому краю |
[right][/right] | Текст выравнивается по правому краю |
[title][/title] | Текст отражается в виде заголовка по центру, подчеркнутый, весь остальной текст будет иметь отступ от него одну пустую стоку. |
Теперь о тегах, выполняющих роль "неких функций".
Тег | Описание |
[author][/author] | Текст, заключенный внутри, будет высвечен в графе "От кого" во входящем сообщении. Если этот тег присутствует, то он должен идти в самом начале сообщения. |
[text cols='число колонок' colwidth='ширина колонки' colspacing='расстояние между колонками']текст[/text] | Тег использовался ранее, когда были доски объявлений. Ныне не актуален, впрочем... Если этот тэг присутствует, он должен идти сразу за тэгом [author] (если тэг [author] также присутствует) или в самом начале тела сообщения. Закрывающий тэг [/text] безусловно обрывает текст сообщения. Параметры cols, colwidth и colspacing могут присутствовать или отсутствовать независимо друг от друга. В чем задается ширина колонки и расстояние между колонками - неясно. В режиме экрана 640x480 эти числа, похоже, совпадают с пикселями экрана. Для других режимов пропорции нужно высчитывать.
|
[select value='smt'][/select] | Используется в команде send incoming question. |
Иногда возникает потребность использовать непостоянные значения внутри текста. Нам на помощь приходит символ
%s, а также такие команды, как:
1. <RetVar> = sprintf: fmt=<Var/String>, <Value>, <Value>, <Value>, <Value>, <Value> - форматирует строку <Var/String>
2. <RetVar> = sprintf: pageid=<Var/Number1> textid=<Var/Number2>, <Value>, <Value>, <Value>, <Value>, <Value> - форматирует текст с номером <Var/Number2> на странице <Var/Number1>.
3. write to player logbook: printf: fmt=<Var/String>, <Value>, <Value>, <Value>, <Value>, <Value> - аналог 1, только результат сразу записывает в бортовой журнал.
4. write to player logbook: printf: pageid=<Var/Number> textid=<Var/Number>, <Value>, <Value>, <Value>, <Value>, <Value> - аналог 2, только результат сразу записывает в бортовой журнал.
5. write to log file <Var/Number> append=<Var/Number> printf: fmt=<Var/String>, <Value>, <Value>, <Value>, <Value>, <Value> - аналог 1, только результат сразу записывает в лог-файл.
6. write to log file <Var/Number> append=<Var/Number> printf: pageid=<Var/Number> textid=<Var/Number>, <Value>, <Value>, <Value>, <Value>, <Value> - аналог 2, только результат сразу записывает в лог-файл.
Пригодится нам все это, например, в брифинге миссий... хотя нет, это уже MD. Пусть это будет сообщение бортового компьютера об установке того или иного оружия.
<t id="1000">%s установлено.</t>
Допустим, мы установили Импульсную пушку
- $item = Импульсная пушка
- $text = sprintf: pageid=13 textid=1000, $item, null, null, null, null
Результатом станет содержание в переменной $text строки "Импульсная пушка установлено".
То есть вся суть работы в том, что вместо %s подставляются значения <Value>. Каждый %s соответствует своему <Value> (первый %s первому <Value> и так далее).
Встречаются различные вариации %s (таблица-копипаст):
Спецсимвол | Описание |
%d | (Decimal) вставить десятичное значение, в отличии от %s строкового. То есть при попытке напечатать 0 - получается "пусто" или "null". |
%!<n>s | Вставить значение не в общем порядке, а указанное в <n>. Например: Если в n указано 3, то будет вставлено значение Value3. |
%<n>s | В этом месте строка раздвигается на количество символов указанное в <n>, на освободившиеся место записывается столько символов параметра, сколько поместится. Если параметр короче чем строка формируемая параметром, то выравнивание будет производится по правому краю отведенного места. |
% - <n>s | Действует также, как и спецсимвол %<n>s, с тем отличием, что выравнивание будет производится по левому краю отведенного места. |
В качестве примера использования текстовых файлов, пожалуйста, ознакомьтесь с данным постом.