Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Всем привет! В прошлой, восьмой части я рассказывал, как старый движок Yakuza 5 безжалостно режет русские фразы, заставляя меня ужимать диалоги до размеров короткого английского оригинала. Казалось, что с этим придется просто смириться, но на этой неделе случился настоящий прорыв. Я наконец-то нашел способ заставить игру читать длинный текст!
А еще небольшое техническое объявление: спасибо всем, кто перешел в мой Telegram-канал! Я только недавно понял, что забыл привязать к нему группу для обсуждений, поэтому вы физически не могли оставлять комментарии. Теперь всё настроено, чат открыт, залетайте! Ну а теперь перейдем к тому, как я вскрыл диалоговую систему игры.
Глава 26: Проклятие обрезанных строк и «Святой Грааль» BMB-файлов
В прошлой части я жаловался на «бетонную стену» движка RGG Engine: игра упорно отрезала хвосты длинных русских фраз. Я думал, что это жесткий лимит буфера памяти, который невозможно обойти без переписывания исполняемого файла игры. Но я ошибался.
Тщательное ковыряние в структуре диалоговых файлов (формат BMB — Binary Message Block) принесло свои плоды. Оказалось, что в Yakuza 5 каждый текстовый блок — это не просто строка, а связка из текста и отдельного блока метаданных. Пока я просто обновлял указатели на новый адрес текста, игра продолжала смотреть в старые метаданные, где была прописана длина оригинальной английской строки.
Я нашел эти «магические» байты. Внутри каждого .msg файла зашиты команды:
- 02 00 00 14 — отвечает за длину печати (сколько символов вывести на экран).
- 01 01 00 00 — общая длина блока.
- 02 00 00 0A — параметры пауз в диалогах.
Если английская фраза «Welcome» имела длину 7 символов, то игра считывала ровно 7 байт. Мой перевод «Добро пожаловать» (15 символов) просто не имел шансов — игра откусывала лишнее, оставляя невнятное «Добро п».
Теперь этот «Святой Грааль» найден. Я научил свой Редактор Дракона не только переносить текст, но и на лету пересчитывать эти байты. Программа берет длину моего перевода, добавляет небольшой запас в 10% для стабильности и перезаписывает значения в блоке метаданных. Результат вы видите на скриншотах: длинные, человеческие фразы наконец-то отображаются целиком, не боясь никаких лимитов. Обрезка текста официально побеждена(почти).
Глава 27: Гибридный парсер: Больше никакого слепого поиска
Победить лимиты длины — это была только половина дела. Чтобы Редактор Дракона стал по-настоящему надежным, мне пришлось полностью пересмотреть саму концепцию поиска текста.
Раньше программа работала методом «слепого сканирования»: она просто бежала по байтам файла и хватала всё, что находилось между нулевыми байтами (\x00). Это работало, но «грязно». В список строк попадал системный мусор, куски путей к файлам и, что самое неприятное — «обрубки» строк. Например, если в файле было слово Continue, старый сканер мог найти его целиком, а через пару байтов — его же кусок ntinue, решив, что это новая строка. При сборке это превращалось в кашу из указателей, и игра закономерно вылетала.
Новая версия Редактора Дракона (V84.0) перешла на гибридную архитектуру. Теперь я использую метод «Указатель — прежде всего»:
- Точное чтение: Сначала программа идет в заголовок .msg файла (адрес 0x2C) и читает официальную таблицу, которую оставили разработчики из SEGA. Там четко прописано: «Текст №1 лежит здесь, а его настройки — тут».
- Глобальный скан с защитой (Anti-False Pointer): Чтобы не пропустить имена персонажей (вроде Kiryu или Daigo) и элементы интерфейса, которые часто разбросаны вне главной таблицы, я добавил сканирование всего файла с шагом в 2 байта.
- Интеллектуальный фильтр: Теперь в коде работает жесткая проверка — если найденный адрес указывает внутрь уже обнаруженной строки, он игнорируется. Это убило проблему «обрубков» на корню.
Такой подход позволил очистить список строк от 90% мусора. Теперь я вижу только реальный текст, который нужно переводить. Это не только упростило мне жизнь, но и сделало сборку файла на 100% безопасной.
Кстати, для тех, кто хочет разобраться во всех этих методах «хирургического» вмешательства в код игры подробнее, я подготовил полноценную техническую энциклопедию (Yakuza5_Translation_Technical_Reference). Я собрал там описания всех методов обхода лимитов, структуру метаданных и принципы работы моих плагинов. Делал в первую очередь для себя (чтобы не забыть логику через год), но решил выложить в открытый доступ — файл уже можно найти в моем Telegram-канале.
Глава 28: «Сдаюс!» — когда реверс-инжиниринг бьет под дых
В прошлой главе я рассказывал про «Святой Грааль» байтов длины. Казалось бы, секрет раскрыт, код написан, жми кнопку и радуйся. Но движок Yakuza 5 решил устроить мне проверку на прочность. В реверс-инжиниринге есть правило: если тебе кажется, что решение заняло 5 минут — значит, ты чего-то не заметил.
Моей главной «мозолью» стал мягкий знак в слове «Сдаюс».
Я потратил полдня, перебирая десятки вариантов кода. Мой редактор бодро рапортовал: «Обновлено 51 975 значений длины!». Я пробовал принудительно увеличивать лимиты, пересчитывать паузы, даже пошел на отчаянный шаг — попытался «ковровым методом» изменить все подозрительные байты в структуре. В итоге я чуть не сломал файл окончательно, создав циклическую ошибку в указателях, но игра продолжала стоять на своем: «Сдаюс», и всё тут.
Это был момент полнейшего выгорания. Когда ты сидишь 6 часов над одной буквой, а результат нулевой — хочется просто удалить проект.
Что это значит технически?
Судя по всему, движок RGG Engine хитрее, чем кажется. Даже если мы обновляем print_len и total_len в метаданных диалога, игра может брать ограничение из третьего места — например, из логического скрипта или жесткого лимита конкретного графического окна.
Какой план сейчас?
Я решил остановиться, пока не превратил рабочие файлы в кашу. На данный момент у меня есть два пути:
- Хирургическое сокращение: Там, где байты длины не поддаются «лечению», я буду просто подбирать максимально лаконичный перевод.
- Дальнейший поиск: Я не бросаю эту проблему, но откладываю её до свежей головы.
Этот «Сдаюс» стал для меня уроком смирения. Иногда игра побеждает, и нужно уметь отступить, чтобы не сломать всё остальное. Но интерфейс уже «поумнел», и это главное. А с мягкими знаками разберемся позже.
Глава 29: Навигатор Сузуки и системные бинарники
Разделив инструментарий, я выделил для «Навигатора Сузуки» особую роль — это «снайпер» для работы со сложными системными бинарными файлами. Если Редактор Дракона теперь специализируется на диалогах с их сложными метаданными о длине и паузах, то Сузуки берет на себя файлы, где миром правят только чистые указатели.
Главным успехом этой недели стала полная пересборка файла msg.bin (из папки db.devil/en). Важно не путать его с обычными .msg файлами диалогов — это совершенно другой формат, системная база данных.
Итоги сборки в консоли выглядели как чистая победа:
484 перевода -> 490 обновленных указателей.
Почему указателей больше, чем самих строк? В реверс-инжиниринге это признак «здорового» файла. Движок RGG очень экономен: если одно и то же слово (например, «Save» или «Cancel») встречается в десяти разных меню, разработчики не пишут его десять раз. Они записывают его один раз, а десять разных указателей ссылаются на этот единственный адрес. Мой Навигатор теперь видит эти связи: он находит все упоминания строки в заголовке, переносит текст в новое место и аккуратно «подтягивает» за ним каждый официальный указатель.
Главное отличие Сузуки от Дракона в том, что в таких бинарниках обычно нет метаданных о длине символов. Здесь игра просто читает данные «от адреса до нулевого байта». Поэтому здесь не нужно воевать за каждый символ — можно писать развернутые и красивые переводы.
Такое разделение труда между «Драконом» (для сюжета) и «Сузуки» (для системных данных) сделало весь процесс локализации невероятно стабильным. Я больше не боюсь, что обновление одной строки случайно «сломает» соседнюю, потому что каждый инструмент теперь бьет точно в цель.
Глава 30: Живой язык Камурочо и «подгоны» от президента
Завершая технический отчет, хочу немного поговорить о самом тексте. Когда инструментарий работает стабильно, наконец-то появляется время на «шлифовку» стиля. Я изначально ставил перед собой задачу сделать перевод живым. Yakuza 5 — это игра про суровых мужчин, криминальные интриги и улицы, поэтому «стерильный» литературный язык здесь часто выглядит чужеродно.
Я стараюсь подбирать выражения, которые соответствуют характеру персонажей. Например, вместо классического «Группа мужчин» в боевых столкновениях теперь красуется лаконичное и точное «Шпана». А когда сомнительный президент таксопарка радуется подарку от Кирю, он не просто говорит «Спасибо за презент», а выдает: «Ого! Вот это подгон». Это именно тот неформальный, уличный тон, который задает правильную атмосферу японской криминальной драмы.
Чтобы такой стиль не превратился в хаос, я серьезно доработал модуль Dict Fixer (Корректор словарей). Теперь в Хабе работают глобальные правила автоматической правки:
- Авто-кавычки: Если в переводе встречается название приюта Кирю — Асагао, программа автоматически берет его в кавычки («Асагао»). Мне больше не нужно следить за этим вручную в каждой из тысяч строк.
- Стандартизация имен: Все имена персонажей и названия локаций теперь жестко проходят через фильтр Хепберна. Больше никаких разночтений — если в одной главе он «Маджима», то и во всех остальных он останется «Маджимой», а не «Мадзимой».
На этом девятая часть девлога подходит к концу. Впереди еще много работы над графическими пресетами и рефакторингом «Студии Сайджо», но фундамент уже залит намертво.
📈 Статус проекта и «Список завершения»
Работа идет полным ходом, и вот как сейчас выглядит прогресс по основным направлениям:
- ✅ Текстовый движок (.msg / .bin): Глобальный рефакторинг завершен. Найдены байты длины, внедрен гибридный парсер по указателям.
- 🔄 Студия Сайджо (Графика): Начат масштабный перенос на новые рельсы. Я уже приступил к переделке системы пресетов, чтобы разделить их по папкам и добавить поиск. Теперь работа с текстурами станет такой же системной, как и с текстом.
- ✅ Словари: Глобальная чистка и стандартизация по Хепберну. Внедрена автоматизация кавычек и спецсимволов.
- 🔄 Перевод: Углубляюсь в сюжетные диалоги первой части. Благодаря новому парсеру скорость и качество работы заметно выросли.
🗨 Заходите в гости!
Как я и обещал, теперь в моем Telegram-канале можно не только смотреть картинки, но и полноценно общаться. Я привязал чат обсуждений, так что залетайте делиться мнением, задавать вопросы или просто поболтать о серии.
🔗 Мой канал и 💬 Чат для обсуждений:
Впереди много интересного, оставайтесь на связи! 🐉🏮