Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Классика моддинга консольных игр: перевёл меню — игра перестала пускать в бой. Вроде бы просто добавил переведённых строк и пересобрал базы данных, а эмулятор намертво виснет при первой же драке.

Пока вожусь с переводом «Якудза: Мертвецы» (Yakuza: Dead Souls) на PS3, накопилась пачка реальных грабель и неочевидных технических проблем, о которых полезно рассказать — хотя бы чтобы самому не забыть, на чём споткнулся.

ПЛЮСЫ (ЧТО ПОЛУЧИЛОСЬ ПОЧИНИТЬ И ДОБИТЬ):

Обуздал движок баз данных (RGG DB, сигнатура 20070319).

С ним была главная головная боль: обычная замена строк на месте (In-Place) отпадала из-за длины русских фраз (банальный «Aim» в «Прицел» в старый слот физически не засунуть), а стандартные попытки расширить файл ломали структуру. Я переписал логику сборщика на честный Rebuild: пулы строк теперь пересобираются с нуля с пересчётом внутренних оффсетов и строгим 16-байтным выравниванием. В итоге 22 базы собрались без единой ошибки, а файлы суммарно даже сжались на 62 КБ за счёт зачистки пустот. Меню, навыки, инвентарь и параметры оружия больше никуда не съезжают.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Боевой интерфейс и обучение ожили на русском.

Подсказки на экране стрельбы и драки в первой главе встали на место: счётчики оставшихся зомби («10 ОСТАЛОСЬ», «1 ОСТАЛОСЬ»), таймер («3 ДО КОНЦА»), подсказки по кнопкам геймпада (стрейф на L1, выстрел на R1, уворот и подбор оружия). Текст встал ровно, кнопки подтягиваются графикой, боевой режим перестал падать намертво.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Характеристики оружия и прокачка.

Вся ветка «Гангстерского пистолета», характеристики урона, обоймы и брони (каноничные для этой игры параметры «ЗАЩ / ОГОНЬ / ВЗРЫВ») отображаются стабильно и без наползаний.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Каллиграфия глав и трудности перевода.

Тестер нарисовал текстуры заставок в стиле японской туши. Причём он переводил надписи напрямую с японского, игнорируя английскую адаптацию. Оказалось, что английское Homecoming — это вообще-то дословное «В Камурочо» (神室町へ). Пришлось и мне сразу менять свои текстовые переводы в меню персонажа и субтитрах: так «Возвращение» стало «В Камурочо», «Гибель» превратилась в «Крах», а «Загадка» — в «Тайну». Теперь текст и картинка на экране совпадают идеально.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Раскопал пачку скрытых файлов.

Нашёл и разобрал целый пласт бинарников, которые раньше не попадались на глаза: caption.bin (титры задач и глав), mail.bin (вся мобильная почта Акиямы), string.bin (выкрики в погонях), параметры клуба кабаре common_param.bin, покер computer_.bin, баккару, NPC лагеря Гэри bootcamp_npc.bin и файлы лабиринта underground_.bin.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

ГРАБЛИ И МИНУСЫ (ГДЕ ПОТРАЧЕНЫ ЧАСЫ ВПУСТУЮ):

«1P» — это не первый игрок, это краш всей игры.

Главный детектив недели. Игра наглухо вылетала с ошибкой памяти при попытке войти в первый обучающий бой: VM: Access violation writing location 0x100000f (read-only memory) at 0x002e8634. Я долго искал причину в туториале, пока побайтовое сравнение чистого и пропатченного ELF-файла не вскрыло дичь: сканер строк полез искать текст в секцию исполняемого кода процессора (.text). Ассемблерная инструкция процессора PowerPC на адресе 0x002E84F8 чисто случайно состояла из байтов 31 50 00 (что в ASCII читается как "1P"). Софт решил, что это надпись «Игрок 1» из меню, а сборщик применил перевод "1P" ➔ "1И" и тупо вписал русскую букву «И» прямо внутрь машинной команды процессора! Процессор доходил до боя, пытался выполнить букву «И» как ассемблерный опкод, сходил с ума и падал. Урок: никогда не сканировать строки в исполняемом коде.

Параноидальный фильтр в собственном софте.

Мой же плагин в попытках отсечь бинарный мусор намертво вырезал из поиска строки, содержащие амперсанд & и проценты %. Из-за этого из базы наглухо пропадали вполне легитимные фразы вроде «Majima & Kiryu» или перки с процентами. Переписал фильтрацию, чтобы подозрительные строки падали в низкий приоритет, а не стирались на входе.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Сохранения и катакана (ラムワ).

  • Окно сейвов PS3 читает заголовок файла в японской кодировке Shift-JIS. Мой однобайтовый русский текст консоль считывает по японской таблице: слово «ЧАСТЬ» превращается в «Ра-Му-Ва» (ラムワ). Я решил провести эксперимент и откатил переводы названий глав в системном EBOOT обратно на английский. Итог? На чёрных экранах загрузки вернулся английский, а в сейвах — как были иероглифы, так и остались! Значит, игра тянет эти данные не из EBOOT, а из какого-то другого кэша или файла, который я уже перевёл. Пока вернул английский, чтобы понаблюдать, но с этой загадкой ещё предстоит разобраться.
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

SaveState в RPCS3 — штука ненадёжная.

Попробовал использовать быстрые снимки памяти эмулятора, чтобы сохраняться на лету, а не ждать системного предложения в начале новой главы (до классических телефонных будок по сюжету я ещё даже не дошёл). Первый раз снимок делался вечность, а при повторном сохранении игра просто рухнула с ошибкой виртуальной памяти: _page_unmap(): Memory inconsistency found!. Фича полезная, но в таких тяжёлых играх с кастомным менеджером памяти очень сырая. Придётся по старинке использовать только штатные внутриигровые сохранения.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Упрямый уличный текст.

Несколько фраз зевак у полицейской машины в прологе упорно лезут на английском (There's a cop car, Something up?), хотя в базе они переведены — видимо, цепляются дубликаты из других мест, которые скрыла фильтрация.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Невидимые улицы, экраны установки и потерянный текст.

Самое весёлое: я раскопал кучу бинарников, но в них нет названий улиц и локаций. На миникарте по-прежнему висит Taihei Blvd, магазины вроде Matsuya и Love in Heart не переведены, названия подбираемых на земле предметов тоже где-то прячутся. Туда же идут экраны установки (биографии Акиямы и остальных персонажей с полоской «INSTALL 15%») — они намертво висят на английском, и где этот текст зашит, пока тайна. Открытого текста в распакованных файлах больше нет, значит, в игре есть ещё целый пласт закрытых контейнеров карты и системных архивов, которые предстоит вылавливать.

Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга
Как одна русская буква уронила процессор PS3: хроники зомби-моддинга

Костяк первой главы работает, логика боя восстановлена. Впереди охота за потерянными файлами локаций и полировка диалогов.

6633
33
33
11
11