Перевод модулей для Neverwinter Nights 2
Если проводить аналогии между процессом локализации компьютерных игр и видами спорта, то получится очень интересная картина. Перевод Warcraft 3 (мы писали об этом в «Игромании» №6’2008) — это чистейшей воды шахматы: все здесь предельно логично, заранее известно, в каких утилитах какие ресурсы обрабатывать, но, как и в шахматах, партия может длиться очень долго. Большая часть работы — чистой воды рутина: открыл файл, вырезал скрипты, перевел текст, скорректировал код, окружил переведенный текст специальными операндами, запаковал обратно в игру… И так несколько тысяч раз.
Перевод Half-Life 2 («Игромания» №8’2008) больше напоминает мототриал. Каждый мод абсолютно уникален, и, чтобы локализация прошла успешно, нужно постоянно быть в напряжении — следить, какие файлы обновил Steam , какие вообще были удалены, отмечать все отсылки в скриптах, которые сделал разработчик мода, обходить систему защиты.
Локализация TES 4: Oblivion («Игромания» №9’2008) — это уже натуральный теннис. Здесь все довольно однообразно, почти как в Warcraft 3, но есть возможность для маневра. Например, никто не мешает выполнить крученую подачу и автоматизировать перевод в специально созданной для этого программе, а падежи некоторых слов проставлять не вручную, а при помощи конвертера.
А вот на что похож перевод Neverwinter Nights 2 , совершенно непонятно. Здесь вроде бы очень много рутины, но при этом четко прослеживается логика построения файлов, хотя работает она почему-то далеко не в каждом дополнении. А уж на какие ухищрения приходится идти при переводе кампаний (это несколько модулей, слитых вместе)… Так что если и тут проводить спортивные аналогии, то NWN 2 похожа на скоростной спуск с горы на велосипеде с одновременным жонглированием 10 мячиками и попыткой сыграть в преферанс с таким же летящим по круче напарником. Впрочем, и к такому монстру можно найти свой подход и даже приручить его.
Шаг 1: разбираем мод на составляющие
Все файлы, составляющие любой мод для NWN 2, рассортированы по директориям следующим образом:
1. \Campaigns\ <Название кампании> — если мод представляет собой обычную карту, то эта папка остается пустой. Если же мы имеем дело с кампанией, сюда записываются несколько файлов-меток;
2. \Modules\*.mod — игровые модули (MOD-файлы) дополнения — ERF-архивы, содержащие в себе все скрипты, диалоги и карты (ну или одну карту);
3. \Hak и \Override — дополнительные файлы кампании: новые модели, текстуры, прототипы объектов (blueprints), звуки и тому подобные элементы;
4. \Music\*.bmu — музыкальные файлы;
5. \Tlk\*.tlk — таблицы текстовых ресурсов.
Кампании запускаются через игровое меню Новая игра/Новая кампания. Но все же моддеры чаще создают обычные моды, которые для запуска достаточно просто скопировать в папку Modules , а затем активировать через меню Новая игра/Новый модуль.
Модуль — сердце любого дополнения для NWN 2, а все элементы, загружаемые из папок Hak , Override и Music , — своего рода бижутерия: если постараться, то любой мод можно загрузить и без них.
Шаг 2: изучаем анатомию
Прежде чем приступить к локализации, нам нужно понять, как устроен любой модуль NWN 2, и в этом нам поможет штатный игровой редактор NWN 2 Toolset , про который мы уже не раз писали на страницах «Игромании». Для начала давайте разберемся, какие ресурсы входят в состав любого дополнения и какие из них придется переводить:
1. Журнал квестов ( View/Journal/Module ) — это список всех квестов (и их стадий) дополнения. Нас в первую очередь интересуют поля, содержащие англоязычный текст, — это сообщения, появляющиеся в журнале квестов по мере того, как персонаж продвигается по сюжету. Здесь придется переводить абсолютно все и внимательно следить, чтобы не закралась ошибка, иначе игрок может вообще не понять, что делать дальше.
2. Диалоги героев (вкладка Conversations ) — все диалоги имеют древовидную структуру, каждый элемент описывает ровно одно высказывание персонажа. Задания и диалоги вместе составляют порядка 80-90% локализуемого контента, и именно на их перевод уходит больше всего времени. Но остаются еще 10-20%, разбросанные по всему моду, на их перевод также придется потратить несколько часов.
3. Прототипы объектов (они же blueprints, или «проекты») — шаблоны, на базе которых создаются объекты в игре. Рассмотрим простейший пример: у нас есть шаблон гоблина по имени Кобби, к нему прилагается описание «Низкорослый зеленый гоблин без плаща». На базе этого прототипа мы делаем гоблина по имени Богги, но уже с плащом зеленого цвета. От Кобби его отличают всего три свойства: имя, описание и наличие накидки. Аналогичным образом из исходного шаблона несложно сделать какого-нибудь гоблина Рогги, у которого нет плаща, зато есть кастрюля на голове и капкан на носу. По этой схеме на основе единственного прототипа можно создавать десятки или даже сотни различных персонажей.
Шаг 3: переводим тексты
Чтобы перевести названия и описания объектов, сделанных на основе прототипа, выбираем в меню Plugins пункт Универсальный редактор проектов. Редактор состоит из двух частей: справа — прототипы, слева — их свойства. Посмотрите на схему, она наглядно демонстрирует, как перевести описание любого прототипа и всех созданных на его основе персонажей. В данном случае мы перевели лишь описание (поле Localized Description ) прототипа героя Max (этапы 1 и 2). О том, что текст был изменен, легко узнать из строки Изменения под свойствами персонажа (этап 3).
Чтобы аналогичным образом изменить всех персонажей (или все предметы), которые сделаны на основе данного прототипа, первым делом нужно их всех найти. Если мы имеем дело с кампанией, модов может быть несколько, так что в следующем окне ( Модули ) надо отметить мышкой все MOD-файлы дополнения. В нашем случае файл всего один (этап 4). Затем (этап 5) на вкладке Экземпляры для изменения мы указываем метод поиска (опция Найти выбранный проект ) и кликаем по пункту Найти экземпляры для изменения , в результате получаем список объектов-клонов. Теперь, если нажать кнопку Применить изменения , все дочерние объекты будут изменены так же, как их прародитель.
Указанный метод дает отличные результаты, когда в модификации десятки или даже сотни объектов с одинаковыми свойствами, например монстры или оружие. Чтобы не возиться с каждым объектом по отдельности, можно буквально за пару минут изменить прототип и сэкономить тем самым уйму времени. Но что делать, если объекты различаются? В этом случае придется вручную перебирать все элементы модуля. Загружаем любую карту (вкладка Areas слева) и смотрим в нижний левый угол экрана, где расположено окошко Area Contents (содержимое карты). Кнопки в верхней части (Items, Creatures, Doors, Stores и пр.) отвечают за отображение различных типов объектов в списке внизу.
Чтобы просмотреть, например, список всех живых существ, кликаем по Creatures. В списке появятся все персонажи, в том числе и Max, чей прототип мы с вами недавно редактировали. Выбираем его — в окне свойств объектов справа появляется список характеристик, в том числе имя героя и его описание в свитке Basics. Все эти параметры можно спокойно заменить, а тексты перевести на русский язык. Аналогично переводятся названия и описания всех остальных объектов игры, главное — помните, что помимо объектов игрового мира нужно локализовать еще и текст у зон перехода между локациями, а то начинающие мододелы постоянно про них забывают.
Кликнув по карте в списке Areas , можно перевести на русский язык название уровня (свойство Display Name ). Когда работа с картой завершена, закрываем ее, сохраняя изменения, и загружаем следующую.
Шаг 4: работаем со скриптами
К сожалению, в отличие от перевода диалогов и брифингов, четкого алгоритма обработки скриптов (вкладка Scripts ) не существует. Но встроенный язык NWN 2 похож на С++, поэтому разобраться, как и что там устроено, довольно просто. Для вывода текстовых сообщений существует несколько стандартных функций, вызовы которых можно отследить при анализе кода. Рассмотрим простейший пример:
…
if (oPC == oRHH)
{
AssignCommand(oRHH, ActionSpeakString(«Oh no — Grandmother!»));
DestroyObject(OBJECT_SELF);
}
…
Что делает скрипт, нам в данном случае совершенно неважно. Самое главное — текстовая строка « Oh no — Grandmother! », она выводится на экран функцией ActionSpeakString. Помимо этой операнды существуют и другие, которые тоже отображают текстовые данные. Чаще всего используются FloatingTextStringOnCreature (всплывающее сообщение над героем), SendMessageToPC (информационное сообщение игроку) и SpeakString (реплика героя). Список более редких функций вы можете посмотреть на нашем DVD в разделе «Игрострой».
Любой английский текст в скриптах можно спокойно менять на русский, игра его прекрасно поймет. Только не используйте букву «ё», иначе вместо русских букв на экране появится абракадабра, а некоторые скрипты вообще перестанут работать. В нашем случае достаточно заменить всего одну строку кода:
AssignCommand(oRHH, ActionSpeakString(«О нет — бабушка!»));
Теперь, нажав кнопку Save & Compile, выясняем, все ли правильно мы отредактировали. Если в окошке статуса внизу появится сообщение Compilation Successful , значит, никаких проблем нет; в противном случае нужно еще раз внимательно проверить код.
Шаг 5: локализуем сложные моды
Все основные этапы локализации небольших модов с небольшим количеством текста (не более 100 тыс. знаков) мы разобрали. Но что делать, если модуль огромный, на 300-400 тыс. или даже 1 млн знаков? Вручную править сотни объектов, листать тысячи строк скриптового кода в поисках искомых команд никакого времени не хватит.
C этой проблемой мы столкнулись, еще когда только начинали переводить дополнения для TES 4. Штатный редактор просто не предназначен для обработки огромных массивов текстовой информации, поэтому нам пришлось искать альтернативные пути. Удобнее всего экспортировать все тексты большого мода и переводить их в специально предназначенных для этого утилитах.
«Вывести» текст из игры можно при помощи TLK-файлов. Суть их предельно проста: все текстовые ресурсы мода заменяются номерами строк в TLK-таблице. Например, официальная кампания игры изначально была создана с учетом многоязычности, а потому все ее тексты лежат в отдельном файле dialog.tlk. Для замены любой строки в окне редактирования текста необходимо нажать Edit String Ref и в открывшемся диалоге в поле String Ref напечатать < номер строки во внешнем файле> + 16777216. Смещение номера указывает движку на то, что строка располагается не в ресурсах самой игры, а в TLK-файле. Вроде бы все логично, но непонятно, как быть со скриптами. Оказывается, разработчики позаботились и об этом. В движок зашита функция GetStringByStrRef , извлекающая текст из TLK-файла. Выглядеть это может, например, вот так:
AssignCommand(oRHH, ActionSpeakString(GetStringByStrRef(16879361)));
Создать TLK-файл без сторонних программ нельзя, придется использовать утилиту NWN2TLKEdit , с ее помощью можно не только создавать и редактировать уже существующие таблицы, но даже превращать в TLK-файлы обычные текстовые документы. Главное, чтобы они были отформатированы следующим образом:
< № строки> <пробел> := <пробел> <Строка сообщения>
Непечатный знак **< CRLF>**эквивалентен паре \r\n в программировании и означает одновременный возврат каретки и переход на новую строку ( Caret Return и Line Feed ). Это стандартный знак перевода указателя по нажатию клавиши Enter в большинстве программ вроде «Блокнота». Некоторые редакторы (типа UltraEdit ) позволяют писать только < LF>, который указывает на перенос текста в игре на новую строку. Просматривать спецсимволы, создавать и править заготовки TLK-файлов можно в Notepad++.
После экспорта всех текстов в отдельный документ запускаем NWN2TLKEdit командой File/Initialize New TLK , создаем пустой файл, затем импортируем в него документ командой Tool/Import Batch Text (с опцией All Items ). Теперь остается лишь сохранить TLK-файл в игровую подпапку \tlk и подключить его к модулю. В игровом редакторе NWN 2 командой View/Module Properties находим свойство модуля Custom TLK File , прописываем туда путь \tlk\ <имя нашего файла>.tlkи жмем Enter. На всякий случай нужно сделать проверку: открываем любую строку мода в штатном редакторе и в окне правки видим не только основной текст, но и дополнительное поле String Ref. Это значит, что во время игры ресурсы будут подгружаться не из самого модуля, а из TLK-файла.
Использование «внешних» текстов позволяет решить и еще одну извечную проблему модостроителей — вывод на экран разных текстов в зависимости от пола персонажа. Достаточно просто сделать вспомогательный файл \tlk\ <имя нашего файла>F.tlk с переделанными репликами. Напомним, что изначально игра считает, что вы играете персонажем мужского пола.
TLK-файлы — вещь необычайно удобная, но есть одна неприятность: извлекать все тексты из мода вручную очень долго. Чтобы ускорить процесс, мы создали набор утилит, автоматизирующих эту работу. Как и в случае с Half-Life 2, взаимодействие с программой NWN2_MOD_LOC осуществляется посредством перетаскивания на ее главный файл папки с дополнением (главное, чтобы структура каталогов была верной). В зависимости от размера мода время обработки может занять 5-30 минут, по истечении которых в папке дополнения будет лежать файл CUSTOM_TLK.txt , содержащий в себе заготовку англоязычного TLK-файла. Помимо выигрыша во времени, такой метод позволяет избежать повторяющихся строчек (например, у нескольких монстров одинаковое название).
Кстати, мы все сделали таким образом, чтобы в TLK-файле, помимо собственно текста, содержалась еще и информация, откуда какие предложения были взяты. Это позволяет в дальнейшем избежать ошибок с переводом (например, не спутать реплики из разных диалогов). Локализовывать полученный текст удобнее всего в Excel , куда английские тексты легко подгружаются программой TXT2XLS.
Когда перевод будет закончен, XLS2TXT сгенерирует пару русскоязычных TLK-файлов (для персонажей разных полов). Остается только запустить NWN2TLKEdit и поочередно импортировать сначала английский вариант текста (к примеру, служебные комментарии в скриптах), потом тексты для мужского пола — результат сохраняем как \tlk\ <имя нашего файла>.tlk. Теперь сюда же добавляем строки из ресурсов для персонажей женского пола и сохраняем файл как \tlk\ <имя нашего файла>F.tlk. Подключаем полученные файлы к модулю, перекомпилируем все скрипты (команда File/Compile/All Scripts in Module ) — все, можно тестировать перевод в игре.