Как модифицируют старые игры на примере Generals — Zero Hour

Я, как человек, который разрабатывает собственную игру, черпаю идеи из разных игр. Одна из таких игр — Generals: Zero Hour. Мне нравятся некоторые механики данной игры и мне хотелось узнать, как технически они реализованы.

Generals: Zero Hour — это игра моего детства. Несмотря на то, что игра вышла в 2003 году, она все равно пользуется некоторой популярностью в 2023 году. Разработчики до сих пор создают моды для данной игры.

Как же разработчики делают моды для такой старой игры? Неужели у них есть исходный код? А если есть исходный код, может быть, я смогу в образовательных целях разузнать как реализована та или иная механика в игре?

Я дал поручение одному из моих сотрудников исследовать этот вопрос и представить результаты в форме статьи. Эта и ему подобные исследования сначала публикуются на моем сайте bekhan.org. Узнать первыми о публикациях можно в моем телеграм-канале.

Теперь передаю слово своему сотруднику.

Порой, просматривая моды к старым играм диву даешься — создатели модов умудряются совершенно бессовестно «вертеть» игровой логикой, как им вздумается. А инженерный ум все никак не может понять: как же моддерам такое удается без наличия исходников игр и их движков в публичном доступе?

Чем более старая игра, тем более «бессовестные» моды на нее можно найти в Интернете. Только взгляните на эту кастомную логику из мода Crazy Mod для легендарной игры Command & Conquer: Generals — Zero Hour:

Автор этого мода умудрился не только добавить в игру новые игровые объекты, но и «повесить» на них совершенно не предусмотренную на первый взгляд игрой логику вроде посадки юнита на ракету или «швыряния» автомобилей по базам противника.

Что внутри у мода?

Если заглянуть внутрь этого мода (который распространяется в виде ZIP-архива), то можно будет там обнаружить всего 2 файла: один с необычным расширением .BIG, и еще один — ReadMe.txt с инструкцией по установке. Нас, очевидно, интересует содержимое первого файла. Покопавшись на форумах моддеров быстро узнаем много интересного о формате BIG. В частности — это формат упаковки ресурсов для игрового движка SAGE (на котором написана игра) от компании Electronic Arts (которой написана игра), и его можно достаточно просто декомпилировать.

После декомпиляции BIG-файла можно увидеть содержимое мода, которое преимущественно состоит из новых текстур, игровых моделей, аудиофайлов и…INI-файлов — единственного типа файлов, который содержит какой-то скрипто-подобный текст:

Содержимое BIG-файла

Содержимое BIG-файла

Кроме INI-файлов больше ничего интересного нет. Покопавшись еще на форумах выясняется, что INI-файлы представляют из себя конфигурацию для движка SAGE и моддеры используют именно этот тип файлов для кастомизации игровой логики. С помощью INI-файлов можно добавлять в игру новые объекты, указывать их игровые модели и задавать всевозможное поведение, начиная от типа движения и заканчивая способом взаимодействия объектов между собой (движок SAGE подтянет конфигурацию и все преобразует в игровую логику). С помощью утилиты diff можно сравнить файлы мода и оригинальные файлы игры и узнать, например, каким образом конфигурируется логика движения (Locomotor) для нового игрового объекта ScudLauncher из Crazy Mod:

INI-конфигурация нового игрового элемента

INI-конфигурация нового игрового элемента

Или как кастомизируется INI-файл с игровым AI путем изменения параметров SkillSet:

Diff оригинального файла и файла мода

Diff оригинального файла и файла мода

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

Восстановление исходного кода

Зная название игрового движка (SAGE), можно попытаться отыскать в Интернете официально опубликованный исходный код или его утечку. Для этого движка ни то, ни другое, к сожалению, на текущий момент недоступно. Лучшее, что можно сходу найти — проект OpenSage, представляющий из себя попытку реализовать с нуля движок Sage на C#. Проект довольно сырой, однако парсинг всевозможных параметров из INI-файлов реализован почти в полной мере — это можно понять, поискав по проекту любые параметры из INI-файлов, которые идут в составе оригинальной игры. Сам проект базируется на более низкоуровневом проекте — Thyme — целью которого является восстановление всего кода игры на C++ с помощью реверс-инжиниринга и хукинга оригинальных функций игры для их замены на собственные реализации.

Проект Thyme существует уже более 5 лет, и за это время участниками проекта было распознано и восстановлено несколько тысяч оригинальных функций — setuphooks_zh.cpp. Проанализированное адресное пространство исполняемого файла игры позволило участникам проекта не только восстановить назначения функций, но и целых cpp-файлов с классами движка SAGE — так как игра была скомпилирована компилятором Microsoft Visual C++, то исходники методов игры из одного класса лежат в небольших диапазонах памяти. Вот пример подмены функций по адресам упомянутого выше Locomotor:

Методы одного класса друг за другом в памяти

Методы одного класса друг за другом в памяти

Забавно то, что в те недалекие времена (начало 2000) разработчики игр совсем не заботились о защите. Разработчики Generals оставили в файле игры кучу отладочной информации (!), способствующей исследованию кода. Например, имена файлов, в которых хранились исходники на C++:

Строки внутри файла игры

Строки внутри файла игры

Проект Thyme дает существенный буст при исследовании исполняемого файла «Command & Conquer: Generals — Zero Hour» — по уже распознанным классам, функциям и методам с читабельными названиями можно будет отыскать нужную логику игры в ассемблере при должной усидчивости, воспроизвести необходимые участки логики на C++ и инжектнуть в оригинальную игру.

Не генералами едиными

Поразительно, но есть целое «течение» по восстановлению кода игр энтузиастами. Так, помимо «Command & Conquer: Generals — Zero Hour» прямо сейчас восстанавливаются игры:

И много других, разбросанных по просторам GitHub. А некоторые старые игры были восстановлены полностью, вроде GTA 3.

К сожалению, судьба у таких проектов обычно только одна из двух возможных: либо на проект подает в суд компания-разработчик (как это и случилось с полностью восстановленной GTA 3), либо проект забрасывают в связи с тем, что работы там больше, чем готовых контрибьютить участников. Забрасывают также и из-за страха оказаться следующим проектом, попавшим под горячую руку правообладателя — так это случилось с OpenMC2 — автор проекта прямо написал:  This Project is Now Abandoned.

Итоги

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

© Habrahabr.ru