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 (загрузчик модификаций и исправлений) и прочие улучшения.
Хочется сказать большое спасибо следующим людям, которые помогли с нашим проектом, а также делают всё, чтобы 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:
Когда мы заговорили о переводе, идея использовать этот инструментарий в качестве основы для PC-релиза сразу пришла мне в голову. Впрочем, Максим вдохновился не сразу. Честно говоря, я даже не припоминаю причины его первоначального непринятия этой идеи, однако, если мне не изменяет память, он загорелся возможностью встраивания текстур большего разрешения без необходимости возиться с оригинальными форматами хранения данных.
Игровые тексты в большинстве своём «зашиты» внутри исполняемого файла игры (sonic.exe). Упомянутые выше API, однако, позволяют вынести его во внешние txt-файлы. К сожалению, на момент написания материала мы ещё не смогли внести внутренний текст (хранящийся в .exe) внутрь непосредственно мода, так как для нас был создан изменённый файл с разметкой для букв. В нашем случае кириллицу заменяли неиспользуемые игрой японские иероглифы. Поскольку API использует оригинальный файл разметки, то при попытке завести текст через него (а не напрямую в exe-файл), возникают кракозябры:
Ой, не тот скриншот…
Да что же это такое! Ещё секундочку.
Ага, вот. В общем, пока что основной игровой текст у нас хранится в модифицированном .exe. Для господина руководителя это не проблема, так как большинство переводов не запариваются с какими-то там модами и тупо заменяют собой оригинальный файл. Однако здесь важную роль играет другой фактор – совместимость с другими модами, о чём будет рассказано в следующем подпункте.
3.2.2. Различные проблемы с модом и их гениальные решения (текстуры, Dreamcast Conversion).
Итак, решено, что для PC-версии будет реализован мод. Однако сразу же возникла проблема: я не знал, как его вообще реализовать. Но тут помогли мои «связи»: к тому моменту я уже некоторое время общался с французским моддером для SADX Kell’ом, и он согласился помочь с базой. То бишь dll-файлом (англ. Dynamic Link Library — «библиотека динамической компоновки», «динамически подключаемая библиотека») – основой нашего мода, с помощью которого и происходит подключение кастомных текстурпаков игры, представленных файлами с расширением .PVMX (улучшенный формат архива, изначально созданного SEGA) или папками. Поговорим о них.
Текстурпаки по сути являются простыми архивами с PNG-текстурами соответствующих PVM-архивов (формат архивного хранения текстур, созданный для Dreamcast, позже использовался и на других платформах) со вшитым файлом-указателем.
Папки также содержат в себе PNG-текстуры и index-файл. Отличие лишь в том, что они хранят те текстуры, которые хранились в PVR-файлах, одиночных текстурах (которые также хранятся в PVM).
Вернёмся к dll-файлу. Как было сказано выше, библиотека является основой нашего мода. Именно она работает с API и подменяет подобный кастомный контент. Необходимо указать, что сама dll’ка не является обязательной для работы модов, так как можно вносить изменения только в оригинальные файлы (текстовые .bin, музыка). В нашем случае она была необходима по одной простой причине – игра не знает, что такое эти наши PVMX. Соответственно, ей нужно разжевать. Для дальнейших объяснений приведу несколько фрагментов кода.
Перед вами рабочая область IDE (среда разработки), в которой открыт сам проект с расписанными задачами и функциями dll’ки. Справа находится отображение файловой структуры с отображением всех файлов, в том числе подключаемых к основному с помощью ключевого слова include (первые 6 строчек). Далее разберём каждую конкретную структуру кода.
- Funcs – функции, напрямую обращающиеся к API модлоадера и позволяющие проворачивать необходимую подмену файлов. Сама по себе конструкция функций достаточно нагромождённая, потому для удобства они были описаны в качестве методов, которым для работы нужно будет только подставить имя необходимого файла с паком.
В подробности работы вдаваться не буду, укажу только, что суть заключается в подмене пути к необходимому файлу. Дальше API сделает всё дело за нас.
- В теле инициализатора библиотеки мода мы описываем подмену уже конкретных файлов. Но изначально обеспечим совместимость нашего мода с другими, обозначив объекты GoalRing и DConv.
Тут в скобках необходимо внутри кавычек указать имя библиотеки другого мода. Далее мы будем обрабатывать это через конструкции if..(then)..else. Объекты содержат значение, указывающее, подключена ли данная библиотека к загрузчику модов или нет. По-простому – включен ли мод, содержащий указанный dll-файл. Пример проверки объекта указан в отрывке ниже.
Говоря о совместимости мода, нельзя не сказать о том, что люди есть разные, и они не только играют с разными модами, но ещё и с разных устройств (клавиатура/геймпад) с элементами брендирования. Для того, чтобы охватить как можно больше вещей разом, мне в голову пришла идея реализации настройки мода. Благо, ModManager поддерживает подобный функционал.
Для реализации были вписаны необходимые строчки в код dll’ки:
Сначала указываем сам файл, хранящий значения для пунктов настроек. В зависимости от указанных в ini-файле значений (true или false), будут подставляться необходимые текстуры. В приведённом фрагменте снова можно видеть использование объекта HModule.
- Отдельного внимания заслуживает нетекстурная часть библиотеки, которая обрабатывает текст из Dreamcast-версии сада Чао, содержащегося в exe-файле игры. Дело в том, что PkR, автор Dreamcast Conversion, внёс этот текст внутрь своей dll, из-за чего тот текст, вшитый в готовый exe-шник, попросту не выводился. API же берёт изменения структур памяти именно из dll. Поэтому нам было необходимо связаться с ним, чтобы тот внёс небольшие изменения в код, по итогу которого не подгружался бы его текст из сада Чао при обнаружении нашего мода (как это делается, я уже описал выше). Казалось бы, теперь можно спокойно вносить текст в exe, но… Тут я решил сделать ход конём, который Максим ещё долго не признавал. Ещё осенью 2019 (а именно тогда проходила возня с Чао) я начал предпринимать первые шаги по уводу внесения изменений в exe и переносу текста в dll. Для этого мной был взят оригинальный код функции для вставки необходимого текста прямиком из исходников PkR с внесением необходимых изменений:
Этот кусок прописывается в основной файл и указывает, в какие области памяти нужно записать новый текст. Далее происходит вызов функции в коде, который обрабатывает текст из отдельного файла.
Структура достаточно проста. В объектах *_Control[] указываются настройки отображения текста, который произносится Тикал (красный шарик с подсказками). Для мониторов такого раздела уже нет. В объектах *_Text[] содержится уже сам текст.
- Подобным образом подгружается текст для титров. Я не стал бы заморачиваться на этот счёт, если бы не хотел перенести часть титров с указанием нашей команды в самый верх. Внести подобные изменения напрямую в exe проблематично из-за того, что извлечённому тексту нельзя задавать определённые стили (заголовки первого и второго порядка). Вновь обратившись к исходникам PkR, были внесены необходимые изменения.
- Ну и самое главное – подгрузка необходимых текстур. Тут уж всё совсем просто. Необходимо лишь вызвать метод и указать имя требуемого пака.
(Примечание: текст, указанный после «//» никак ни на что не влияет, это просто комментарий, поясняющий код)
***
В целом, я рассказал обо всём важном, касающегося работы нашего мода, но есть ещё один пункт, сильно поломавший наши головы зимой 2020. Имя ему – рекапы. Это текст из цикла «В предыдущих сериях…», который отображается, если вернуться к прохождению ранее оставленной сюжетной кампании любого из персонажей. Чтобы понять суть проблемы, просто приложу скриншот того, КАК оно отображалось изначально:
Тут и ежу понятно, что текст отображается некорректно. В оригинале он центрируется, у нас же он уплыл. Причём, проблема существовала только в случае, если включён мод HD GUI 2 от знакомого уже нам PkR. Соответственно, мы обратились с вопросами к нему.
Перед этим наш хакер изучил исходники мода и пришёл к выводу, что мод PkR неправильно подсчитывает длину строки. Грубо говоря, он воспринимал кастомную букву с отрицательным значением (не 000000DF, а FFFFFFDF), из-за чего игра и считывала неправильную ширину. PkR отметил, что только ЯПОНСКАЯ кодировка использует отрицательные значения букв. В итоге, для исправления отображения текста в рекапах, PkR внёс изменения в свой код, что также позволит в будущем схожим проектам локализовать игру на свои языки, пропуская те проблемы, с которыми столкнулись мы. Вот так переводчики могут помогать моддерскому сообществу =)
3.2.3. Почему не все текстуры HD-формата.
Как ни странно, причина проста – разработчики HD GUI озаботились только необходимыми для меню и шрифтов компонентами. Таким образом, за бортом остался сад Чао (буквально все текстуры), «Ежиный молот» и меню «Коллекция мини-игр«. Эти текстуры как были в своих оригинальных форматах, так и остались, отчего приходилось изъёживаться в паре мест, склеивать текстуры, переводить их, расклеивать обратно и так далее. Повезло лишь в том, что на консолях эти же текстуры имеют идентичное с PC разрешение, поэтому их перенос не занял так много времени. Впрочем, я опять слукавил – в некоторых местах разработчики всё же улучшили разрешение текстур, и это вылилось в забавный момент при тестировании.
И на этой ноте заканчивается первая часть статьи. В последующих вас ждут весёлые (и не очень) факты о переводе самого текста, а также про баги, которые нам пришлось решать в консольных версиях. До встречи в следующем выпуске!