mastertranslate

mastertranslate 

Перевожу игры на русский, прогер.

2 434subscribers

126posts

Showcase

37
goals12
131 of 1 000 paid subscribers
С таким количеством подписчиков мы сможем работать над переводами нон-стоп с общим доступом.
$196.75 of $241 raised
На разработку софта для игры Rhapsody: A Musical Adventure. 10,000 случайно оплатили не туда. Почему цена увеличился, но остаётся такой же.
$14.56 of $14.6 raised
На перевод Windblown
$92.48 of $93 raised
На перевод игры ASTLIBRA. Перевод вышел. Конечная сумма будет уменьшаться по мере покупок подписок или постов.
$153.65 of $134 raised
Сбор на перевод игры Metroid Prime Remastered
$291.28 of $292 raised
На перевод игры Hyrule Warriors: Age of Calamity. Как обычно цена установлена условно.
$7.28 of $7.3 raised
За помощь.
$127.78 of $73 raised
На перевод Chronicles of the Wolf
$251.96 of $252 raised
На разработку софта и перевода игры Dynasty Warrior Origin
$145.64 of $146 raised
На помощь
$7.28 of $7.3 raised
на доширак
$145.64 of $146 raised
Написание софта srwy

Как перевести Chronicles of the Wolf, не вскрывая архивы?

(пост без картинок, но видео игрового процесса внизу)
Иногда желание поиграть в игру на родном языке разбивается о суровую реальность: разработчики упаковали текст в архивы, зашифровали их алгоритмами, от которых плачут даже криптографы, и намертво вшили в движок.
Распаковать такое это адский труд. А запаковать обратно так, чтобы игра не вылетела - занятие для людей со стальными нервами.
Но что, если скажем вам, что игру вообще не нужно распаковывать? Что если можно написать «шпиона», который будет сидеть в оперативной памяти, ловить тексты за миллисекунду до его появления на экране и незаметно подсовывать вместо него русский?
Именно такой путь мы прошел недавно. Делимся историей о том, как пара строк на ассемблере, борьба с «призраками» в памяти и магия C++ превратились в полноценный мод-перевод.

Шаг 1. Детективная работа (Ищем, где прячется текст)

Любая игра, какой бы сложной она ни была, перед отрисовкой текста должна положить его в оперативную память. Вооружившись отладчиком, начал искать.
Но проблема в том, что тут текст не лежит в памяти статично. Движок игры постоянно выделяет под него новые, случайные кусочки памяти. Но удалось поймать момент, когда текст только-только формируется. Все дороги вели к одной функции в машинном коде:
``


push ebx
push esi
push edi
mov edi, edx ; <--- Вот тут в EDX наш текст!
mov ebx, ecx
``
План был надежен, как швейцарские часы:
  1. Поставить игру на паузу (брейкпоинт) в этом месте.
  2. Прочитать текст.
  3. Записать его.
  4. Отпустить игру дальше.
НО реальность ударила по тормозам. В прямом смысле. Игра вызывает эту функцию сотни раз в секунду. Использование классических остановок заставляло игру зависать намертво. Нужен был способ ловить текст на лету, не останавливая игру.

Шаг 2. Ловушка для текста (и откусанные слова)

Был написал Lua-скрипт прямо внутри Cheat Engine. Он внедрял крошечный кусочек кода прямо в игру. Теперь игра сама, без пауз, складывала копии текстов в выделенный мной "безопасный буфер", а скрипт раз в 100 миллисекунд неторопливо записывал их в файл game_texts_dump.txt
.
Запустил игру, побегал по меню и открыл свой файл. Но вместо красивых предложений увидел это:


In case of resizing In WINDOWED mode, to restore the original size, press: SHIFT.
ing In WINDOWED mode, to restore the original size, press: SHIFT.
WED mode, to restore the original size, press: SHIFT.
l size, press: SHIFT.


Что за чертовщина?
Оказалось, игровой движок парень экономный. Когда он высчитывает, как перенести длинный текст на новую строку, он не копирует его заново. Он просто сдвигает указатель вперед и снова вызывает функцию копирования. В итоге ловился не только целые предложения, но и их «хвосты».
Пришлось научить скрипт уму-разуму: прежде чем сохранить фразу, он проверял, не является ли она обрубком уже известного предложения.
И вот, у нас на руках оказался чистый дамп всего текста игры!

Шаг 3. Битва Хешей и Невидимые Призраки

Текст собран, переведен тестово в соседнем окошке. Теперь главное это подмена.
Сравнивать длинные строки (например, "Нажмите кнопку Start") посимвольно в момент отрисовки кадра это значит убить производительность игры. Поэтому программисты используют хеширование — превращают любое слово в уникальное число-отпечаток.
Например, слово START получает код 0E0C2133.
Идея проста: игра вычисляет хеш -> находит его в словаре -> заменяет оригинальный текст на русский.
Написан скрипт, загрузился перевод, запустил... И ничего не произошло. Текст остался оригинальным.  
Пришлось устроить проверку: вывели в консоль хеши, которые считал словарь, и хеши, которые видела игра в тот же самый момент:
  • [СЛОВАРЬ] Хеш: 0E0C2133 | Текст: 'START'
  • [ИГРА] Хеш: CF22CD2F | Текст: 'START'
Хеши не совпадали! Но почему? Слово-то одно и то же!
Заглянув в сырые байты памяти, мы раскрыли преступление. Игровой движок подсовывал процессору не просто слово START. К нему могли быть прилеплены невидимые байты форматирования (теги цвета, маркеры переноса) или банальные пробелы на конце.
Кроме того, алгоритм, который использовался изначально, ломался на границах 32-битных чисел. 
Переписав код на пуленепробиваемый промышленный алгоритм FNV-1a, который использует только математическое умножение и операцию XOR.
Бинго! Хеши совпали. Текст в игре стал русским.

Шаг 4. Взросление: от скрипта к настоящему моду (DLL)

Делать перевод, для запуска которого людям нужно качать отладчик, вставлять скрипты и жать кнопки это моветон. Мод должен работать по принципу «кинул в папку с игрой и забыл».
Пришло время перенести всё на C++ в Visual Studio и создать DLL-библиотеку.
Код написан был несложный, повторяющий тоже самое что и наш ранний скрипт.
Теперь, когда игра запускается, наша DLL за долю секунды сканирует всю оперативную память, находит куда ставить ловушку.

Финальные штрихи

Чтобы мод стал хорошим, добавили еще пару вещей:
  1. Подмена шрифта: Зачастую в играх нет поддержки кириллицы. Поставили еще один хук (перехват) на системную функцию Windows CreateFontIndirectW, заставив игру всегда использовать шрифт, в котором есть русские буквы(благо у игры был такой шрифт).
  2. Горячие клавиши: Нажатием F5 переводчики могут перезагрузить текстовый файл прямо во время игры и сразу увидеть изменения на экране, а по F6 включается режим выгрузки новых, еще не переведенных текстов в дамп-файл.

Итог

То, что начиналось как попытка возиться со сложными архивами игры, превратилось в изящный C++ плагин. Он не трогает оригинальные файлы игры, работает молниеносно, обходит защиты и вставляет текст прямо в воздухе, между недрами игрового движка и вашим монитором.
Реверс-инжиниринг игр это не всегда про читы и бессмертие. Иногда это просто желание заставить игру заговорить на твоем родном языке, и путь к этой цели похож на решение потрясающей технической головоломки.
P.S.: на словах кажется что делов на пару часов или день, на деле же недели работы и изучение кода игры.
Спасибо, нравятся такие бэкстэйджи они же "за кадром".
Subscription levels3

Дон

$1.59 per month
Дон - получает доступ к некоторым играм и моим переводам.

Игрок

$3.1 per month
С уровнем доступа 100% вы получите доступ ко всем играм и всем новым переводам, которые я выполняю.

Супер поддержка

$7.3 per month
Супер поддержка 500%
Go up