|
Как я вернул русскую озвучку в Stubbs the Zombie: Rebel Without a Pulse
Для начала обещанная инструкция
1) Скачиваете архив
2) Распаковываете архив в любое удобное место и запускаете rusifier.exe, указываете путь к игре, где лежит StubbsTheZombie.exe и папка maps64;
3) Запускаете и наслаждаетесь любимой озвучкой из детства)
С чего всё началось
Я просто хотел пройти переиздание 2021 года с той самой озвучкой, с которой играл в детстве — версия от Буки 2005 года. Полез искать готовый русификатор и удивился: спустя столько лет его так никто и не сделал. Озвучка физически лежит на диске у каждого, кто ставил старую версию, — просто её никто не вытащил и не встроил в новую сборку.
Тут и загорелось: раз до меня это не сделали, значит, сделаю я. Плюс, чего скрывать, было приятно добавить свою фамилию в список тех, кто делает патчи и русификаторы для игр просто потому, что может.
Почему это вообще было сложно
Обе версии игры — 2005 и 2021 годов — держат звук в одних и тех же файлах карт (.map), но это не аудиофайлы в привычном виде, а внутренний формат движка: у каждой реплики персонажа есть жёстко заданное место в файле и своя длина. Русская версия 2005 года и английская версия 2021 года — это разные сборки: тексты те же, но сжаты и нарезаны по-разному, и русская реплика почти никогда не совпадает по размеру с английской, которую она должна заменить.
То есть просто «скопировать звук поверх» не получалось: русская реплика либо не помещалась на место английской, либо релиз 2021 года вообще был собран иначе внутри, и старые смещения не работали.
Первые попытки и первые вылеты
Начал с очевидного: если своё место не подходит — искать среди уже освободившихся английских слотов в той же карте (реплика ведь всё равно заменяется, значит её старое место свободно), а то, что совсем никуда не лезет, — дописывать в конец файла.
Звучит просто, но игра начала вылетать. Причём не сразу и не везде — где-то всё было гладко, а конкретная карта («Полицейский участок») крашилась стабильно на одной и той же катсцене, и с ней пришлось повозиться дольше всего.
Баг, из-за которого портился чужой звук
Разобрались до конца методом исключения: если реплика А отдавала своё старое место в общий пул на переиспользование, а сама реплика Б потом занимала это место — но реплика А, как выяснилось чуть позже при расчёте, физически не помещалась никуда и должна была остаться на английском, — её английский звук к этому моменту оказывался уже испорчен чужими данными. То есть баг не в том, что не хватало места, а в порядке, в котором это место раздавалось.
Починили: теперь сначала полностью считается весь план по карте, и место любой реплики, которая точно останется на английском, бронируется заранее и никому больше не отдаётся.
Стена в 23 мегабайта
После этого фикса именно тот же самый вылет в «Полицейском участке» никуда не делся. Это оказалось вообще не связано с испорченными данными — уткнулись в самый настоящий потолок игры: движок при загрузке карты выделяет под её данные буфер строго фиксированного размера, 23 мегабайта, и он одинаковый что для маленьких, что для больших уровней. Как только патченая карта перерастала эти 23 мегабайта — переполнение памяти и вылет прямо при загрузке уровня.
Дальше пришлось руками покопаться в самом exe игры: найти в машинном коде место, где выделяется этот буфер, и поднять число с 23 до 32 мегабайт. Правка — буквально 12 байт в файле, размер программы не меняется. Работает, потому что и лаунчер, и сама игра — без какой-либо защиты от изменений (не Denuvo, не Steam DRM), так что при переустановке или проверке файлов через Steam всё просто возвращается к оригиналу, и патч можно накатить заново без следов.
С этим потолком, кстати, было забавно: подбирать точную границу «сколько ещё можно дописать в файл, чтобы не вылетело» пришлось буквально вручную — я запускал игру, доходил до нужной катсцены, говорил «вылетело» или «работает», и по этим ответам шаг за шагом сужали диапазон. По сути, самая нудная и самая важная часть всей работы — раз двадцать подряд.
Мелочь, которую чуть не пропустили
Уже когда всё вроде бы заработало без единого вылета, я по пути через несколько глав заметил английскую речь по громкоговорителю — у кинотеатра в торговом центре и внутри самого центра. Оказалось, что объявления по громкой связи в игре считаются не «репликой персонажа», а фоновым звуком, и при первом заходе их просто не искали в нужном месте. Проверил в старой версии — да, они там озвучены отдельно, нашли и добавили.
Что в итоге
Озвучены все реплики до единой, во всех двенадцати картах игры — ни одной оставшейся на английском, никаких вылетов, никаких реплик невпопад. Проверено полным прохождением от начала до конца.
Про инструмент
Скажу честно: значительная часть технической рутины — реверс-инжиниринг формата файлов, разбор машинного кода exe, написание самой программы-патчера — сделана с помощью ИИ (Claude). Я не претендую на то, что сам с нуля расковырял бинарник или написал патчер построчно.
Но вся русская озвучка — это не моя работа, а оригинальная локализация Буки 2005 года, просто перенесённая в новую сборку. А вот весь путь к рабочему результату — тестирование каждой правки прямо в игре, ловля вылетов по конкретным катсценам, десятки прогонов, решение не останавливаться на «почти готово» и докопаться до истинной причины — это то, что физически мог сделать только человек, который реально играет и проверяет. Собственно, эта часть и заняла почти всё время.
|