Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Русификатор 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% для стабильности и перезаписывает значения в блоке метаданных. Результат вы видите на скриншотах: длинные, человеческие фразы наконец-то отображаются целиком, не боясь никаких лимитов. Обрезка текста официально побеждена(почти).

Обновило длину.
Обновило длину.
Сделано! 
Сделано! 
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Глава 27: Гибридный парсер: Больше никакого слепого поиска

Победить лимиты длины — это была только половина дела. Чтобы Редактор Дракона стал по-настоящему надежным, мне пришлось полностью пересмотреть саму концепцию поиска текста.

Раньше программа работала методом «слепого сканирования»: она просто бежала по байтам файла и хватала всё, что находилось между нулевыми байтами (\x00). Это работало, но «грязно». В список строк попадал системный мусор, куски путей к файлам и, что самое неприятное — «обрубки» строк. Например, если в файле было слово Continue, старый сканер мог найти его целиком, а через пару байтов — его же кусок ntinue, решив, что это новая строка. При сборке это превращалось в кашу из указателей, и игра закономерно вылетала.

Новая версия Редактора Дракона (V84.0) перешла на гибридную архитектуру. Теперь я использую метод «Указатель — прежде всего»:

  1. Точное чтение: Сначала программа идет в заголовок .msg файла (адрес 0x2C) и читает официальную таблицу, которую оставили разработчики из SEGA. Там четко прописано: «Текст №1 лежит здесь, а его настройки — тут».
  2. Глобальный скан с защитой (Anti-False Pointer): Чтобы не пропустить имена персонажей (вроде Kiryu или Daigo) и элементы интерфейса, которые часто разбросаны вне главной таблицы, я добавил сканирование всего файла с шагом в 2 байта.
  3. Интеллектуальный фильтр: Теперь в коде работает жесткая проверка — если найденный адрес указывает внутрь уже обнаруженной строки, он игнорируется. Это убило проблему «обрубков» на корню.

Такой подход позволил очистить список строк от 90% мусора. Теперь я вижу только реальный текст, который нужно переводить. Это не только упростило мне жизнь, но и сделало сборку файла на 100% безопасной.

Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Сайт, кстати, ,рабочий https://www.fukuya.com/.
Сайт, кстати, ,рабочий https://www.fukuya.com/.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Кстати, для тех, кто хочет разобраться во всех этих методах «хирургического» вмешательства в код игры подробнее, я подготовил полноценную техническую энциклопедию (Yakuza5_Translation_Technical_Reference). Я собрал там описания всех методов обхода лимитов, структуру метаданных и принципы работы моих плагинов. Делал в первую очередь для себя (чтобы не забыть логику через год), но решил выложить в открытый доступ — файл уже можно найти в моем Telegram-канале.

Глава 28: «Сдаюс!» — когда реверс-инжиниринг бьет под дых

В прошлой главе я рассказывал про «Святой Грааль» байтов длины. Казалось бы, секрет раскрыт, код написан, жми кнопку и радуйся. Но движок Yakuza 5 решил устроить мне проверку на прочность. В реверс-инжиниринге есть правило: если тебе кажется, что решение заняло 5 минут — значит, ты чего-то не заметил.

Моей главной «мозолью» стал мягкий знак в слове «Сдаюс».

Я потратил полдня, перебирая десятки вариантов кода. Мой редактор бодро рапортовал: «Обновлено 51 975 значений длины!». Я пробовал принудительно увеличивать лимиты, пересчитывать паузы, даже пошел на отчаянный шаг — попытался «ковровым методом» изменить все подозрительные байты в структуре. В итоге я чуть не сломал файл окончательно, создав циклическую ошибку в указателях, но игра продолжала стоять на своем: «Сдаюс», и всё тут.

Это был момент полнейшего выгорания. Когда ты сидишь 6 часов над одной буквой, а результат нулевой — хочется просто удалить проект.

Что это значит технически?

Судя по всему, движок RGG Engine хитрее, чем кажется. Даже если мы обновляем print_len и total_len в метаданных диалога, игра может брать ограничение из третьего места — например, из логического скрипта или жесткого лимита конкретного графического окна.

Какой план сейчас?

Я решил остановиться, пока не превратил рабочие файлы в кашу. На данный момент у меня есть два пути:

  1. Хирургическое сокращение: Там, где байты длины не поддаются «лечению», я буду просто подбирать максимально лаконичный перевод.
  2. Дальнейший поиск: Я не бросаю эту проблему, но откладываю её до свежей головы.

Этот «Сдаюс» стал для меня уроком смирения. Иногда игра побеждает, и нужно уметь отступить, чтобы не сломать всё остальное. Но интерфейс уже «поумнел», и это главное. А с мягкими знаками разберемся позже.

Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Глава 29: Навигатор Сузуки и системные бинарники

Разделив инструментарий, я выделил для «Навигатора Сузуки» особую роль — это «снайпер» для работы со сложными системными бинарными файлами. Если Редактор Дракона теперь специализируется на диалогах с их сложными метаданными о длине и паузах, то Сузуки берет на себя файлы, где миром правят только чистые указатели.

Главным успехом этой недели стала полная пересборка файла msg.bin (из папки db.devil/en). Важно не путать его с обычными .msg файлами диалогов — это совершенно другой формат, системная база данных.

Итоги сборки в консоли выглядели как чистая победа:

484 перевода -> 490 обновленных указателей.

Почему указателей больше, чем самих строк? В реверс-инжиниринге это признак «здорового» файла. Движок RGG очень экономен: если одно и то же слово (например, «Save» или «Cancel») встречается в десяти разных меню, разработчики не пишут его десять раз. Они записывают его один раз, а десять разных указателей ссылаются на этот единственный адрес. Мой Навигатор теперь видит эти связи: он находит все упоминания строки в заголовке, переносит текст в новое место и аккуратно «подтягивает» за ним каждый официальный указатель.

Главное отличие Сузуки от Дракона в том, что в таких бинарниках обычно нет метаданных о длине символов. Здесь игра просто читает данные «от адреса до нулевого байта». Поэтому здесь не нужно воевать за каждый символ — можно писать развернутые и красивые переводы.

Такое разделение труда между «Драконом» (для сюжета) и «Сузуки» (для системных данных) сделало весь процесс локализации невероятно стабильным. Я больше не боюсь, что обновление одной строки случайно «сломает» соседнюю, потому что каждый инструмент теперь бьет точно в цель.

Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Глава 30: Живой язык Камурочо и «подгоны» от президента

Завершая технический отчет, хочу немного поговорить о самом тексте. Когда инструментарий работает стабильно, наконец-то появляется время на «шлифовку» стиля. Я изначально ставил перед собой задачу сделать перевод живым. Yakuza 5 — это игра про суровых мужчин, криминальные интриги и улицы, поэтому «стерильный» литературный язык здесь часто выглядит чужеродно.

Я стараюсь подбирать выражения, которые соответствуют характеру персонажей. Например, вместо классического «Группа мужчин» в боевых столкновениях теперь красуется лаконичное и точное «Шпана». А когда сомнительный президент таксопарка радуется подарку от Кирю, он не просто говорит «Спасибо за презент», а выдает: «Ого! Вот это подгон». Это именно тот неформальный, уличный тон, который задает правильную атмосферу японской криминальной драмы.

Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

Чтобы такой стиль не превратился в хаос, я серьезно доработал модуль Dict Fixer (Корректор словарей). Теперь в Хабе работают глобальные правила автоматической правки:

  • Авто-кавычки: Если в переводе встречается название приюта Кирю — Асагао, программа автоматически берет его в кавычки («Асагао»). Мне больше не нужно следить за этим вручную в каждой из тысяч строк.
  • Стандартизация имен: Все имена персонажей и названия локаций теперь жестко проходят через фильтр Хепберна. Больше никаких разночтений — если в одной главе он «Маджима», то и во всех остальных он останется «Маджимой», а не «Мадзимой».
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.
Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

На этом девятая часть девлога подходит к концу. Впереди еще много работы над графическими пресетами и рефакторингом «Студии Сайджо», но фундамент уже залит намертво.

📈 Статус проекта и «Список завершения»

Работа идет полным ходом, и вот как сейчас выглядит прогресс по основным направлениям:

  • ✅ Текстовый движок (.msg / .bin): Глобальный рефакторинг завершен. Найдены байты длины, внедрен гибридный парсер по указателям.
  • 🔄 Студия Сайджо (Графика): Начат масштабный перенос на новые рельсы. Я уже приступил к переделке системы пресетов, чтобы разделить их по папкам и добавить поиск. Теперь работа с текстурами станет такой же системной, как и с текстом.
  • ✅ Словари: Глобальная чистка и стандартизация по Хепберну. Внедрена автоматизация кавычек и спецсимволов.
  • 🔄 Перевод: Углубляюсь в сюжетные диалоги первой части. Благодаря новому парсеру скорость и качество работы заметно выросли.

🗨 Заходите в гости!

Как я и обещал, теперь в моем Telegram-канале можно не только смотреть картинки, но и полноценно общаться. Я привязал чат обсуждений, так что залетайте делиться мнением, задавать вопросы или просто поболтать о серии.

Русификатор Yakuza 5. Часть 9: Победа над обрезкой текста, умный парсер и «подгоны» от якудзы.

🔗 Мой канал и 💬 Чат для обсуждений:

Впереди много интересного, оставайтесь на связи! 🐉🏮

30
7
2
1
3 комментария