Обратная разработка и перевод старых игр

Что такое реверс-инжиниринг и как ему научиться, занимаясь локализацией забытых игровых шедевров.
7 минут16830

Скриншот игры BloodNet в локализации «Бюро переводов Old-Games.Ru», рабочая версия

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

Игрострой конца XX века дарил нам яркие сюжеты и идеи, которым может позавидовать современная индустрия с ее канонами и ограничениями. Старые хиты были эталонами: формировали представление об игровой механике и том, какими должны быть шутеры, стратегии, RPG. Ценители расскажут вам о «теплой ламповой атмосфере» — особенно те, для кого продукция 90-х — это привет из детства.

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

Такие проекты невозможны без технических специалистов, которые берут под контроль ресурсы игры: надписи, изображения, звук. Для разработчика это практика и интеллектуальное приключение.

Интервью с программистом-локализатором

Иван — профессиональный программист с 20-летним опытом. В свободное время он помогает «Бюро переводов Old-Games.Ru» русифицировать хитовые игры 80-х и 90-х годов. Если коротко, «Бюро» — энтузиасты, которые бесплатно делятся переведенными играми с человечеством.


Скриншот игры Veil of Darkness — рабочая версия перевода от «Бюро»

— Как давно вы занимаетесь локализацией старых игр? С чего это началось для вас?

— Примерно в 2008 году я обнаружил исходники игры Beneath a Steel Sky и задумал перевести ее на русский язык. Я понял, что с технической стороной справлюсь сам, но для перевода текста и отрисовки шрифтов нужны помощники. В интернете нашел команду PRCA (Project of Russification of Classic Adventures) и предложил им поработать вместе. Они согласились, и я занялся извлечением текста, шрифтов, изображений. Когда уже перешел к вставке текста и шрифтов обратно в игру, у меня навернулся винт — все потерялось. Я обиделся и «забил».

Но в 2010 году вернулся к этой теме и начал работу заново. Написал инструмент для экспорта/импорта игровых ресурсов и снова обратился в PRCA, где мне рассказали о «Бюро переводов Old-Games.Ru».

— В каких еще проектах «Бюро» вы участвовали или сейчас задействованы?

— После локализации Beneath a Steel Sky я помогал с проектами:

Может, еще что-то забыл. Сейчас исследую шрифт известного нуар-квеста Black Dahlia (1998).


Скриншот из игры Black Dahlia

— Чему учит программиста работа над локализацией старых игр?

— Очень быстро прокачивает скилл реверса: учит проектировать обратные алгоритмы, правильно дебажить, читать ассемблерные листинги. Об этом еще поговорим.

Другой неплохой навык, который можно развить — оптимизация кода. Это особенно актуально для пишущих под мобильные платформы. Старые игры были оптимизированы, так как компы были слабые, а носители — маленькие. Поэтому в коде DOS-игр часто встречаешь хитрые оптимизации по размеру и производительности. Да и просто бывает любопытно, какими алгоритмами пользовались программеры тех времен. Можно что-то почерпнуть для себя.

—  Из каких этапов строится работа над переводом?

— Обычный порядок действий:

  1. Ищем, нет ли готовых инструментов для работы с ресурсами игры. И не вытаскивал ли их кто-то раньше.
  2. Реверсим игру — «разрабатываем обратно», чтобы определить форматы хранения и сжатия шрифтов и текста.
  3. Пишем инструменты для экспорта ресурсов.
  4. Затем — для их сжатия и импорта.
  5. Отлаживаем и поддерживаем свои инструменты.

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

— Вы сказали о готовых утилитах для редактирования ресурсов. Если они есть, зачем писать свои?

— Я ищу готовые тулзы. Если нахожу — кидаю их переводчикам, нет — создаю сам.

— Давайте о самом вкусном — о реверсе. Что это? Как это происходит?

— Реверс-инжиниринг — восстановление алгоритма работы программы. Это процесс противоположный разработке. Мы не пишем программу, которая реализует конкретный алгоритм, а восстанавливаем алгоритм по готовой программе. Для этого нужно сначала проанализировать дизассемблированный/декомпилированный или открытый исходный код. Подробнее об этом можно почитать в Википедии.

— Умение восстанавливать алгоритмы наверняка полезно и специалистам по информационной безопасности. Можно анализировать ПО и выявлять вредоносный код. А как это помогает в работе над играми?

— Чтобы извлечь ресурсы из игры, надо знать, где и в каком формате они лежат, каким образом сжаты. Лучший способ это понять — посмотреть, как сама игра достает их, отрисовывает графику и текст. Потом по восстановленному алгоритму можно писать утилиту для экспорта/импорта. Ради экономии места в DOS-играх все ресурсы обычно сжимали. Делали это разными самописными упаковщиками.

— Расскажите на примерах, как вы восстанавливали алгоритм BaSS (Beneath a Steel Sky) и других игр.

— В работе c BaSS почти все было просто. У меня был исходный код движка игры на С++ (в составе ScummVM). Я нашел в коде место, где из файлов читались шрифты, картинки и текст. Потом проанализировал, как это работает, и написал свою тулзу, которая делала то же самое.

Из сложностей там было только написание компрессора по декомпрессору. Такая задача встречается в работе практически над каждой игрой. Мы знаем алгоритм распаковки данных. Чтобы скормить игре уже отредактированные ресурсы, надо сжать их так, чтобы декомпрессор их принял «как родных» и не заметил подвоха. То есть по алгоритму распаковки нам надо спроектировать упаковку.

Труднее с играми, для которых не удается найти исходники. Приходится дизассемблировать .exe-файл и в ассемблерном листинге искать функции, отвечающие за чтение ресурсов.

Если сходу не удается найти их, программу можно отладить дебаггером. Например, поставить точку останова на открытие и чтение файла. Затем дождаться, пока откроется интересующий нас файл и проследить, куда отправляются прочитанные из него данные. Когда функции обработки ресурсов найдены, я анализирую их ассемблерный код, чтобы составить алгоритм их работы.

— Важно ли знать, на каком языке была написана игра? И как это определить?

— Не важно. При реверсе в основном приходится иметь дело с дизассемблированным кодом. Но исходный язык определить можно — по сигнатурам компиляторов, соглашениям о вызовах или прологам функций.

Veil of Darkness
Русский ввод текста в игре Veil of Darkness (перевод «Бюро», рабочая версия)

— Вот вы узнали форматы сжатия и хранения. Сколько времени займет создание инструментов для экспорта/импорта?

— Написать экспорт по готовому алгоритму — задача несложная. Труднее восстановить сам алгоритм. Я обычно пишу экспорт по мере того, как исследую формат данных. С импортом сложнее, особенно если надо реализовывать сжатие. В целом, написание таких инструментов занимает дни.

— На каких языках вы пишете свои утилиты?

— Зависит от того, что установлено у переводчика, который будет моими инструментами пользоваться. В разное время я писал для «Бюро» на C#, C++, Java, ассемблере. Наши переводчики пользуются разными ОС, поэтому в последнее время больше пишу на кроссплатформенных интерпретируемых языках: Python, Ruby.

— Какие алгоритмы важно знать для написания инструментов? Используете ли вы какие-то библиотеки и фреймворки?

— Все программирование здесь сводится к работе с потоками байтов. А это можно делать на любом ЯП без сторонних библиотек. Ничего особенного для написания своих инструментов знать не требуется.

Чаще всего в DOS-играх использовали алгоритмы сжатия RLE и Хаффмана. Но встречаются и совсем уникальные. Здесь не так важно знать алгоритмы сжатия, как иметь навыки реверса.

Иногда сторонние библиотеки могут пригодиться для работы с графическими файлами, но в большинстве случаев можно обойтись штатными средствами языка. Для стандартизации инструментов у меня есть самописный фреймворк на Ruby — использую его во всех последних проектах.

— Какой софт помогает исследовать и отлаживать игру?

— Можно использовать дизассемблеры: IDA, Hopper Disassembler, Radare и другие. Для отладки подойдет DOSBox debugger. Можно еще поставить виртуальную машину QEMU с FreeDOS на ней и использовать встроенный дебаггер.

Также обратите внимание на программу ScummVM. Она включает переписанные движки старых DOS-квестов и позволяет запускать их на современных платформах, включая Linux и Mac. Добавляете игры (паки ресурсов) и можно играть. Отлаживать ScummVM не помогает, зато позволяет смотреть открытые исходники движков.


ScummVM с запущенной Beneath a Steel Sky в переводе «Бюро»

— Вернемся к вашему текущему проекту Black Dahlia. Вы исследуете  шрифт. Что надо знать, чтобы пристроить в игру кириллицу?

— Нужно разобраться с форматом текста в игре. Я уже выяснил, как программа читает файл шрифта. Увидел, что там лежит сжатая картинка и таблица с координатами символов. Разобрал алгоритм сжатия. Дальше я напишу тулзу, которая извлечет картинку и преобразует в редактируемый PNG. Художники перерисуют шрифт, а мне останется конвертировать изображение обратно в формат игры, сжать и записать в оригинальный файл.

— С чего начать тем, у кого есть интерес и мотивация перевести игру, но нет пока опыта и знаний? На какие темы обратить внимание?

— Почитайте статьи по отладке и реверсу. Поищите исходники старых DOS-игр: посмотрите на форматы шрифтов, изображений и на то, как упакован текст. Почитайте форумы, посвященные открытым движкам и переводам старых игр. Познакомьтесь с движками, входящими в состав той же ScummVM. Загляните в git-репозиторий нашего проекта, где мы храним утилиты для разбора ресурсов старых игр.

Любой проект начинается с гугления. Соберите максимум информации по игре. Может, исходники, движок или ресурсы уже есть в открытом доступе. Или кто-то выложил готовые инструменты для экспорта/импорта. Все это сильно упростит и ускорит вашу работу. Если есть мотивация, надо действовать. Не зацикливайтесь на теории — знания и навыки придут с практикой. Ориентируйтесь не на технологии, а прежде всего на игру, которую хотите перевести.

—  Спасибо! Успеха Вам с Black Dahlia и другими переводами. А я еще добавлю для наших читателей несколько ссылок на статьи с описанием интересных реверс-проектов по играм.

Что почитать о реверс-инжиниринге игр

Цикл статей «Реверсим “Нейроманта”».

Devilution: проект по реверс-инжинирингу Diablo.

Извлекаем уровни из Super Mario Bros с помощью Python.

Реверс-инжиниринг визуальных новелл.

реверс-инжинирингразработка игрgame development
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!