05 января 2009
Обновлено 17.05.2023

5 шагов к локализации. Русификация модов для Crysis

5 шагов к локализации. Русификация модов для Crysis - изображение обложка

В предыдущих статьях цикла мы досконально изучили процесс перевода модов для Warcraft 3 , Half-Life 2 , TES 4: Oblivion и Neverwinter Nights 2. Теперь настало время разобраться с локализацией Crysis. Основная проблема состоит в том, что игра нашинкована большим количеством звуковых файлов, которые простыми средствами перевести очень сложно, зато можно пустить внахлест субтитры. Но и с ними придется повозиться — изначально даже локализованная версия Crysis не поддерживает кириллицу в модах, придется искать обходные пути и придумывать необычные способы локализации.

Шаг 1: изучаем структуру файлов

Сразу обратим ваше внимание на очень важный факт. Для перевода нам вообще не понадобится игровой редактор — всю локализацию мы будем проводить в текстовом редакторе Notepad++ , помимо него нам еще понадобятся Excel и любой ZIP-архиватор.

Большинство дополнений для Crysis, даже если они называются кампаниями, по сути представляют из себя отдельные игровые карты, иногда несколько карт объединены общим сюжетом, и совсем уж редко попадаются моды, которые изменяют игровую физику. Но в любом случае основной единицей любого дополнения остается именно карта, в ее анатомии нам в первую очередь и нужно разобраться. Все уровни располагаются в отдельных подпапках вида < корневая директория Crysis>\Game\Levels<название карты>, и они содержат:

1. Текстовый файл < название карты>.xml является «визитной карточкой» карты.

< MetaData>

< HeaderText text=«Название карты на загрузочном экране»/>

< DescriptionText text=«Описание карты на загрузочном экране»/>

< /MetaData>

Поля HeaderText и DescriptionText содержат текст, отображаемый на загрузочном экране, переводить их строго обязательно. Но напрямую вписать текст не выйдет, поскольку игра не понимает кириллицу. О том, как заменить текст русскоязычным переводом, мы поговорим чуть позже.

2. Текстовый файл Objectives.xml содержит названия, описания и маркеры на карте для игровых заданий, которые отображаются в соответствующем меню игры. Структура выглядит следующим образом:

< Root>

< LostIslandII>

< Objective_01 Name=«Название задания 1»

Description=«Описание задания 1»

MapLabel=«Маркер задания 1 на карте»/ >

< /LostIslandII>

< /Root>

3. Игровой ZIP-архив level.pak содержит всю «активную начинку» карты. Распаковываем его в любую папку, где в числе прочих ресурсов обнаружится файл mission_mission0.xml , который представляет собой своеобразный чертеж карты, на нем указано, какие объекты располагаются на карте, каковы их свойства и как эти объекты взаимодействуют между собой. Под объектами здесь понимается все, начиная от оружия и персонажей и заканчивая заскриптованными зонами. В общем, любое изменение в mission_mission0.xml незамедлительно отражается в игре. Здесь нам придется переводить текстовые сообщения, которые появляются во время игры.

Работать с mission_mission0.xml удобнее в редакторе Notepad++, поскольку он поддерживает отображение древовидных XML-структур и быстро работает с очень большими файлами. Загружаем mission_mission0.xml и в ветке < Mission>/ видим список объектов (object — видимые объекты) и так называемых сущностей (entity — элементы триггерной логики игры). При этом некоторые сущности могут иметь подблок FlowGraph , описывающий связи между функциональными «кирпичиками» скриптовой последовательности. Например, воспроизвести анимационную сцену, затем музыкальную композицию, потом вывести игроку сообщение и, наконец, отдать управление другому блоку.

Для задания подобной последовательности в блоке FlowGraph имеются два списка: Nodes (узлы) и Edges (связи). В первом описываются совершаемые действия, во втором — их очередность. За вывод сообщений в игре ответственны два класса узлов: HUD:OverlayMsg и HUD:DisplayTimedDebugMessage. На практике они используются следующим образом:

< FlowGraph …>

< Nodes>

< Node Id=«111» Class=«HUD:OverlayMsg» pos=«100,100,100» flags=«0»>

< Inputs Message=«Отображаемое сообщение 1» PosX=«150» PosY=«150» Color=«1,1,1» Timeout=«5»/>

< /Node>

< Node Id=«222» Class=«HUD:DisplayTimedDebugMessage» pos=«200,200,200» flags=«0»>

< Inputs Message=«Отображаемое сообщение 2» PosX=«250» PosY=«250» FontSize=«1» DisplayTime=«1»/>

< /Node>

< /Nodes>

< Edges>

< Edge nodeIn=«111» nodeOut=«…» portIn=«Show» portOut=«…» enabled=«1»/>

< Edge nodeIn=«222» nodeOut=«…» portIn=«Trigger» portOut=«…» enabled=«1»/>

< /Edges >

< /FlowGraph>

Применение у этих узлов схожее, но главное их отличие в том, что только OverlayMsg можно приспособить для отображения русскоязычных сообщений. Так что все вызовы DisplayTimedDebugMessage следует заменить на OverlayMsg. Чтобы это сделать, давайте посмотрим, как они устроены. У обоих имеется идентификатор узла ( Id ), название класса ( Class ), положение на карте ( pos ), флаги ( flags ), текст сообщения ( Message ), координаты на экране ( PosX , PosY ). Если у OverlayMsg можно задать цвет текста ( Color ), то у DisplayTimedDebugMessage — лишь размер букв ( FontSize ). Кроме того, у одного время отображения на экране задается атрибутом Timeout , а у другого — DisplayTime.

Но узлы отличаются не только этим. В списке связей ( Edges ) указано, какой узел ( nodeOut , portOut ) какому ( nodeIn , portIn ) передает управление в скрипте. И если узел класса OverlayMsg получает управление через порт Show , то DisplayTimedDebugMessage — через Trigger. Меняя у второго класса entity название, задержку — с DisplayTime на Timeout , входной порт — с Trigger на Show , убирая FontSize и добавляя Color , мы сможем отображать на экране русскоязычное сообщение.

Шаг 2: адаптируем текст

В Crysis изначально (то есть безо всяких лок-китов) заложена возможность переводить текст на другие языки. Все русскоязычные ресурсы (в официальной версии от « Софт Клаба ») лежат в архиве < корневая директория Crysis >\Game\Localized\russian.pak. Распаковываем его и в подпапке Languages находим файл game_text_messages.xml — это XML-таблица. Открыв ее, мы для себя отмечаем три ключевых столбца: второй — строковый идентификатор сообщения, четвертый — сообщение на английском (для локализации необязательно), восемнадцатый — переведенное сообщение на русском.

Теперь, если в mission_mission0.xml вместо Text=«Some message» написать Text=«@text_id» , а в game_text_messages.xml дописать строку (по столбцам) @text_id/Some message/Некоторое сообщение и сохранить это изменение в файлах game_text_messages.xml и russian.pak , то текст будет корректно отображаться. Аналогично поступаем со всеми строками, требующими перевода.

Шаг 3: готовим субтитры

Наравне с файлом mission_mission0.xml важную роль в процессе локализации играет moviedata.xml , в котором собраны данные об анимационных роликах. В этих двух файлах присутствуют скриптовые команды для воспроизведения звуковых файлов диалогов. Обычно авторы англоязычных модов не забивают себе голову такими «мелочами», как многоязычность, а потому поддержку субтитров внедрять в игру придется собственноручно. Начнем с файла moviedata.xml — нас в нем интересуют строки вида:

< Key filename=«levels/<название карты>/…/<имя звукового файла>.(mp2|wav) «Voice=»0»… />

Именно в них происходит обращение к звуковым файлам, нам нужно сделать так, чтобы при этом на экране отображались субтитры. Как и в случае с сообщениями, для этой задачи уже предусмотрено вполне конкретное решение. Помимо game_text_messages.xml , в russian.pak/Languages присутствует еще один Excel-файл dialog_recording_list.xml , в столбцах (как и выше — 2, 4, 18) которого располагаются идентификатор звукового файла, субтитры на английском (можно не переводить) и субтитры на русском.

Шаг 4: идентификаторы

Что такое субтитры, и так понятно — это тексты реплик, произносимых героем в данный момент. С идентификаторами же стоит разобраться отдельно. Чтобы субтитры сообщения отображались корректно, сам звуковой файл сообщения должен быть помещен в папку russian.pak/Languages/dialog/ <название карты>, и тогда в роли идентификатора выступает < название карты>/<имя файла без расширения>. Остается лишь заменить путь для обращения к звуковому файлу и включить опцию Voice в moviedata.xml :

< Key filename=«Languages/dialog/<название карты>/<имя звукового файла>.(mp2|wav)«Voice=»1»… />

Этой нехитрой заменой мы внедрили субтитры в скриптовые ролики игры. Но непродолжительный забег по уровню вскоре даст понять, что работа на этом у нас еще не окончена: оказывается, мы не учли массу внутриигровых диалогов (например, переговоры по рации), которые также требуют субтитров. Их вызов инициируется в разделах FlowGraph файла game_text_messages.xml :

< FlowGraph…>

< Nodes>

< Node Id=«333» Class=«Sound:PlaySoundEvent»…>

< Inputs sound_SoundEvent=«<звуковой файл 1>« Voice=«1»…/>

< /Node>

< Node Id=”444» Class=«Sound:Dialog»…>

< Inputs sound_SoundName=«<звуковой файл 2>« Voice=«1»…/>

< /Node>

< /Nodes>

< Edges>

< Edge nodeIn=«333» nodeOut=«…» portIn=«PlayTrigger» portOut=«…» enabled=«1»/>

< Edge nodeIn=«444» nodeOut=«…» portIn=«PlayTrigger» portOut=«…» enabled=«1»/>

< /Edges >

< /FlowGraph>

Два типа узлов отвечают за проигрывание звуковых файлов, но для воспроизведения диалогов и субтитров предназначен только Sound:Dialog. Sound:PlaySoundEvent нужен для проигрывания звуков скриптов, всевозможных стуков и музыкальных вставок, но картостроители сплошь и рядом используют его не по назначению. Поскольку эти узлы отличаются, в сущности, только названиями (остальные поля либо совпадают, либо для них используются значения по умолчанию), то элементарной заменой классов мы получаем возможность подключать субтитры. Указание нового пути к звуковому файлу и значения Voice=«1» производится так же, как и в moviedata.xml. Остается внести новые субтитры в dialog_recording_list.xml и наслаждаться полностью локализованной модификацией.

Шаг 4: полная автоматизация

А теперь давайте разберемся, как сделать все описанное выше всего за пару кликов. Для автоматизации процесса мы создали собственный набор утилит. Программа CRY_MAP_LOC работает по принципу drag ‘n’ drop, то есть путем перетаскивания на ее исполняемый файл директории файла с картой. Через считанные секунды в папке появится несколько новых файлов: программы install.exe , uninstall.exe , а также Excel-файлы messages.xml и dialog.xml. Звуковые файлы будут перемещены в подпапку Languages\dialog\ <название мода>.

Открываем messages.xml в Excel и уже привычным способом переводим фразы. Чтобы написать перевод в dialog.xml , следует прослушать соответствующие идентификаторам перемещенные звуковые файлы. Когда все это будет сделано, запускаем файл install.exe , он интегрирует подпапку Languages и XML-файлы в игровой архив Russian.pak. Теперь игра без проблем отображает все нужные сообщения и субтитры. Когда карта больше не нужна, запускаем программу uninstall.exe — она вернет Russian.pak к первозданному виду. После этого можно просто удалить папку с модом. Если вам нужно перевести не карту, а целый мод, то в этом случае пригодится утилита CRY_MOD_LOC.

Комментарии
Чтобы оставить комментарий, Войдите или Зарегистрируйтесь