О переводах и технических трудностях - выпуск 11-1

О переводах и технических трудностях - выпуск 11-1

1. О самой игре.

2. Об идее для перевода.

3. Техническая и художественная часть.

3.1. Первые версии: PC и Dreamcast.

3.2.1 Идея о переводе-моде.

3.2.2. Различные проблемы с модом и их гениальные решения (текстуры, Dreamcast Conversion).

3.2.3. О том, почему не все текстуры HD-формата.

Итак, дорогие читатели, пришло время рассказать вам о небольшом, но масштабном проекте по переводу первой части Sonic Adventure. В этот раз у нас была не одна, не две, а целых пять платформ. Пять версий, и все такие разные... В этот раз я разбил повествование на несколько частей и главы/подглавы внутри них. Если интересует какой-то конкретный раздел – смотрите по содержанию и CTRL+F вам в помощь. Поехали!

1. О самой игре.

Как ни странно, Sonic Adventure до сих пор почитается как фанатами серии, так и фанатами приставки Dreamcast. Шесть персонажей, интересные уровни, крутая музыка... И всё это отлично оптимизировано под Dreamcast. Сама же игра разрабатывалась ещё для SEGA Saturn (как и пара других проектов): взять хотя бы полёты на Торнадо, где используются оригинальные модели с Saturn (да и геймплей тут очень сильно напоминает Panzer Dragoon, ремейк которого недавно вышел в том числе на ПК). Но консоль загнулась достаточно быстро из-за "гениальных решений", и разработку перенесли на Dreamcast, подарив миру первую 3D-игру в серии Sonic The Hedgehog, которая по максимуму использовала свои возможности, а также приобщила к фандому ежа много новых почитателей. Игру, конечно, можно покритиковать за открытые локации, местами недоработанный и нелогичный сценарий, просто упоротую английскую локализацию, но всё это перекрывается её плюсами. Игра получила сиквел, где отказались от открытых локаций, сконцентрировавшись на линейных уровнях и сюжете, но игроки и по сей день любят именно первую часть.

Sonic Adventure была портирована на различные платформы. На PC аж два раза, что ставит её в ряд с такими играми как "Resident Evil 4", "Devil May Cry 3", "Ace Attorney Trilogy". Другой вопрос, что НИ ОДИН из портов не превосходил оригинальную Dreamcast-версию. Разработчики признавались, что "Sonic Adventure DX (именно эта версия гуляет по всем остальным платформам) – именно та игра, которую они и хотели видеть". Если это правда, то, похоже, они жаждали искалечить её по полной программе, но обо всех этих проблемах мы поговорим в дальнейшем, а максимально детальный обзор всех косяков Deluxe-версии можно прочесть в этом блоге.

И там такого полно...
И там такого полно...

2. Об идее для перевода.

Для начала отмечу, что у игры было несколько пиратских переводов для Dreamcast и PC, а также одна средней руки озвучка от фанатов. Если начистоту, то переводы и вовсе из разряда "хуже некуда": в версии для Dreamcast – перевод текстур и озвучки, в PC – весь текст укладывался в размер оригинальных строчек (и то не везде) и вымораживал откровенным ПРОМТ-ом. Не говоря уже об убитых шрифтах.

Наша команда планировала этот перевод ещё с релиза "Sonic The Hedgehog 2006", однако ре-релиз перевода STH 2006 и активная работа над "Fire Emblem Echoes" приостановила данный процесс. Ко всему прочему, половина программ для редактирования текста SADX просто не подходила или не работала. Нам был необходим хакер. И он в итоге нашёлся. За нескромную сумму согласился расковырять не только версию для PC, но и консольные релизы. По итогу, собранных на взлом денег хватило, чтобы версии PC 2004-го, Dreamcast, Gamecube, Xbox 360 и PS3 вышли в свет. Почему именно вариант 2004-го? Потому что для него существует удобный Mod Manager (загрузчик модификаций и исправлений) и прочие улучшения.

Автор Mod Manager многое сделал для SA/SA2...
Автор Mod Manager многое сделал для SA/SA2...

Хочется сказать большое спасибо следующим людям, которые помогли с нашим проектом, а также делают всё, чтобы PC-версия SADX была самой лучшей и аутентичной с Dreamcast:

  • Windii, которая перевела сюжетную часть игры заново с японского;
  • PkR, создателя модификаций HD GUI и Dreamcast Conversion;
  • Sonikko, помощницу в создании текстур для HD GUI;
  • А также Kell, MainMemory, Dark Sonic, SPEEPSHighway.

Настало время для самого весёлого, верно?

3. Техническая и художественная части.

Поскольку между версиями для PC и Dreamcast оказалось не так много различий по части текстур и текста, я решил объединить их в один раздел. А вот PS3 и Xbox 360 уже стоит рассмотреть отдельно, поскольку они, несмотря на общую базу, умудряются различаться в мелочах. Не только между собой, но и в сравнении с бета-версией для Xbox 360 за январь 2010.

3.1. Первые версии: PC и Dreamcast.

Само собой, за переводы для данных платформ мы взялись в первую очередь. На PC впервые продемонстрировали прогресс, а Dreamcast-версия послужила хорошей демонстрацией сверки текста сада Чао с его японской вариацией.

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

Поэтому мы не без интереса смотрели в сторону возможности подключить перевод как мод в версии для PC...

3.2.1 Идея о переводе-моде.

Итак, следующие два вопроса поясню я, главный редактор сего проекта Артём TimTH, так как идея подобной реализации перевода, а также решение появившихся в процессе технических проблем, возложены на мои плечи.

Окей, прежде всего стоит начать с того, что я в принципе достаточно активно следил за развитием сообщества моддеров "Sonic Adventure". Не скажу, что застал его зарождение, но бесспорно – период Ренессанса, который был ознаменован появлением фанатского API (программная прослойка, отвечающая за обработку сторонних вызовов и работу с основным приложением) для работы с модами. MainMemory, один из ведущих разработчиков этого API, также создал удобную платформу для подключения модификаций посредством графического интерфейса – SADX Mod Manager:

О переводах и технических трудностях - выпуск 11-1

Когда мы заговорили о переводе, идея использовать этот инструментарий в качестве основы для PC-релиза сразу пришла мне в голову. Впрочем, Максим вдохновился не сразу. Честно говоря, я даже не припоминаю причины его первоначального непринятия этой идеи, однако, если мне не изменяет память, он загорелся возможностью встраивания текстур большего разрешения без необходимости возиться с оригинальными форматами хранения данных.

Игровые тексты в большинстве своём "зашиты" внутри исполняемого файла игры (sonic.exe). Упомянутые выше API, однако, позволяют вынести его во внешние txt-файлы. К сожалению, на момент написания материала мы ещё не смогли внести внутренний текст (хранящийся в .exe) внутрь непосредственно мода, так как для нас был создан изменённый файл с разметкой для букв. В нашем случае кириллицу заменяли неиспользуемые игрой японские иероглифы. Поскольку API использует оригинальный файл разметки, то при попытке завести текст через него (а не напрямую в exe-файл), возникают кракозябры:

О переводах и технических трудностях - выпуск 11-1

Ой, не тот скриншот…

О переводах и технических трудностях - выпуск 11-1

Да что же это такое! Ещё секундочку.

О переводах и технических трудностях - выпуск 11-1

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

3.2.2. Различные проблемы с модом и их гениальные решения (текстуры, Dreamcast Conversion).

Итак, решено, что для PC-версии будет реализован мод. Однако сразу же возникла проблема: я не знал, как его вообще реализовать. Но тут помогли мои «связи»: к тому моменту я уже некоторое время общался с французским моддером для SADX Kell’ом, и он согласился помочь с базой. То бишь dll-файлом (англ. Dynamic Link Library — «библиотека динамической компоновки», «динамически подключаемая библиотека») – основой нашего мода, с помощью которого и происходит подключение кастомных текстурпаков игры, представленных файлами с расширением .PVMX (улучшенный формат архива, изначально созданного SEGA) или папками. Поговорим о них.

PVMX-пакеты и папки с PNG-текстурами
PVMX-пакеты и папки с PNG-текстурами

Текстурпаки по сути являются простыми архивами с PNG-текстурами соответствующих PVM-архивов (формат архивного хранения текстур, созданный для Dreamcast, позже использовался и на других платформах) со вшитым файлом-указателем.

<p>Index-файл, тот самый указатель</p>

Index-файл, тот самый указатель

Папки также содержат в себе PNG-текстуры и index-файл. Отличие лишь в том, что они хранят те текстуры, которые хранились в PVR-файлах, одиночных текстурах (которые также хранятся в PVM).

<p>Папка с PNG-текстурами и шарами</p>

Папка с PNG-текстурами и шарами

Вернёмся к dll-файлу. Как было сказано выше, библиотека является основой нашего мода. Именно она работает с API и подменяет подобный кастомный контент. Необходимо указать, что сама dll’ка не является обязательной для работы модов, так как можно вносить изменения только в оригинальные файлы (текстовые .bin, музыка). В нашем случае она была необходима по одной простой причине – игра не знает, что такое эти наши PVMX. Соответственно, ей нужно разжевать. Для дальнейших объяснений приведу несколько фрагментов кода.

<p>Проект в Visual Studio 2019</p>

Проект в Visual Studio 2019

Перед вами рабочая область IDE (среда разработки), в которой открыт сам проект с расписанными задачами и функциями dll’ки. Справа находится отображение файловой структуры с отображением всех файлов, в том числе подключаемых к основному с помощью ключевого слова include (первые 6 строчек). Далее разберём каждую конкретную структуру кода.

  • Funcs – функции, напрямую обращающиеся к API модлоадера и позволяющие проворачивать необходимую подмену файлов. Сама по себе конструкция функций достаточно нагромождённая, потому для удобства они были описаны в качестве методов, которым для работы нужно будет только подставить имя необходимого файла с паком.
О переводах и технических трудностях - выпуск 11-1

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

  • В теле инициализатора библиотеки мода мы описываем подмену уже конкретных файлов. Но изначально обеспечим совместимость нашего мода с другими, обозначив объекты GoalRing и DConv.
О переводах и технических трудностях - выпуск 11-1

Тут в скобках необходимо внутри кавычек указать имя библиотеки другого мода. Далее мы будем обрабатывать это через конструкции if..(then)..else. Объекты содержат значение, указывающее, подключена ли данная библиотека к загрузчику модов или нет. По-простому – включен ли мод, содержащий указанный dll-файл. Пример проверки объекта указан в отрывке ниже.

О переводах и технических трудностях - выпуск 11-1

Говоря о совместимости мода, нельзя не сказать о том, что люди есть разные, и они не только играют с разными модами, но ещё и с разных устройств (клавиатура/геймпад) с элементами брендирования. Для того, чтобы охватить как можно больше вещей разом, мне в голову пришла идея реализации настройки мода. Благо, ModManager поддерживает подобный функционал.

О переводах и технических трудностях - выпуск 11-1

Для реализации были вписаны необходимые строчки в код dll’ки:

Работа объекта HMODULE. Если в нём содержится пустое значение, то мы загружаем один набор текстур, иначе – второй
Работа объекта HMODULE. Если в нём содержится пустое значение, то мы загружаем один набор текстур, иначе – второй

Сначала указываем сам файл, хранящий значения для пунктов настроек. В зависимости от указанных в ini-файле значений (true или false), будут подставляться необходимые текстуры. В приведённом фрагменте снова можно видеть использование объекта HModule.

  • Отдельного внимания заслуживает нетекстурная часть библиотеки, которая обрабатывает текст из Dreamcast-версии сада Чао, содержащегося в exe-файле игры. Дело в том, что PkR, автор Dreamcast Conversion, внёс этот текст внутрь своей dll, из-за чего тот текст, вшитый в готовый exe-шник, попросту не выводился. API же берёт изменения структур памяти именно из dll. Поэтому нам было необходимо связаться с ним, чтобы тот внёс небольшие изменения в код, по итогу которого не подгружался бы его текст из сада Чао при обнаружении нашего мода (как это делается, я уже описал выше). Казалось бы, теперь можно спокойно вносить текст в exe, но… Тут я решил сделать ход конём, который Максим ещё долго не признавал. Ещё осенью 2019 (а именно тогда проходила возня с Чао) я начал предпринимать первые шаги по уводу внесения изменений в exe и переносу текста в dll. Для этого мной был взят оригинальный код функции для вставки необходимого текста прямиком из исходников PkR с внесением необходимых изменений:
О переводах и технических трудностях - выпуск 11-1

Этот кусок прописывается в основной файл и указывает, в какие области памяти нужно записать новый текст. Далее происходит вызов функции в коде, который обрабатывает текст из отдельного файла.

О переводах и технических трудностях - выпуск 11-1

Структура достаточно проста. В объектах *_Control[] указываются настройки отображения текста, который произносится Тикал (красный шарик с подсказками). Для мониторов такого раздела уже нет. В объектах *_Text[] содержится уже сам текст.

  • Подобным образом подгружается текст для титров. Я не стал бы заморачиваться на этот счёт, если бы не хотел перенести часть титров с указанием нашей команды в самый верх. Внести подобные изменения напрямую в exe проблематично из-за того, что извлечённому тексту нельзя задавать определённые стили (заголовки первого и второго порядка). Вновь обратившись к исходникам PkR, были внесены необходимые изменения.
О переводах и технических трудностях - выпуск 11-1
  • Ну и самое главное – подгрузка необходимых текстур. Тут уж всё совсем просто. Необходимо лишь вызвать метод и указать имя требуемого пака.

(Примечание: текст, указанный после «//» никак ни на что не влияет, это просто комментарий, поясняющий код)

О переводах и технических трудностях - выпуск 11-1

***

В целом, я рассказал обо всём важном, касающегося работы нашего мода, но есть ещё один пункт, сильно поломавший наши головы зимой 2020. Имя ему – рекапы. Это текст из цикла «В предыдущих сериях...», который отображается, если вернуться к прохождению ранее оставленной сюжетной кампании любого из персонажей. Чтобы понять суть проблемы, просто приложу скриншот того, КАК оно отображалось изначально:

<p>Тексту плохо, он уплыл</p>

Тексту плохо, он уплыл

Тут и ежу понятно, что текст отображается некорректно. В оригинале он центрируется, у нас же он уплыл. Причём, проблема существовала только в случае, если включён мод HD GUI 2 от знакомого уже нам PkR. Соответственно, мы обратились с вопросами к нему.

Перед этим наш хакер изучил исходники мода и пришёл к выводу, что мод PkR неправильно подсчитывает длину строки. Грубо говоря, он воспринимал кастомную букву с отрицательным значением (не 000000DF, а FFFFFFDF), из-за чего игра и считывала неправильную ширину. PkR отметил, что только ЯПОНСКАЯ кодировка использует отрицательные значения букв. В итоге, для исправления отображения текста в рекапах, PkR внёс изменения в свой код, что также позволит в будущем схожим проектам локализовать игру на свои языки, пропуская те проблемы, с которыми столкнулись мы. Вот так переводчики могут помогать моддерскому сообществу =)

О переводах и технических трудностях - выпуск 11-1
О переводах и технических трудностях - выпуск 11-1

3.2.3. Почему не все текстуры HD-формата.

Как ни странно, причина проста – разработчики HD GUI озаботились только необходимыми для меню и шрифтов компонентами. Таким образом, за бортом остался сад Чао (буквально все текстуры), "Ежиный молот" и меню "Коллекция мини-игр". Эти текстуры как были в своих оригинальных форматах, так и остались, отчего приходилось изъёживаться в паре мест, склеивать текстуры, переводить их, расклеивать обратно и так далее. Повезло лишь в том, что на консолях эти же текстуры имеют идентичное с PC разрешение, поэтому их перенос не занял так много времени. Впрочем, я опять слукавил – в некоторых местах разработчики всё же улучшили разрешение текстур, и это вылилось в забавный момент при тестировании.

Плохо видно, но суть в том, что кнопки съехали в верхний левый угол
Плохо видно, но суть в том, что кнопки съехали в верхний левый угол

И на этой ноте заканчивается первая часть статьи. В последующих вас ждут весёлые (и не очень) факты о переводе самого текста, а также про баги, которые нам пришлось решать в консольных версиях. До встречи в следующем выпуске!

1212
1 комментарий

Ну же, народ, больше активности! =)

Ответить