Как модифицируют старые игры на примере 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-файла
Кроме INI-файлов больше ничего интересного нет. Покопавшись еще на форумах выясняется, что INI-файлы представляют из себя конфигурацию для движка SAGE и моддеры используют именно этот тип файлов для кастомизации игровой логики. С помощью INI-файлов можно добавлять в игру новые объекты, указывать их игровые модели и задавать всевозможное поведение, начиная от типа движения и заканчивая способом взаимодействия объектов между собой (движок SAGE подтянет конфигурацию и все преобразует в игровую логику). С помощью утилиты diff можно сравнить файлы мода и оригинальные файлы игры и узнать, например, каким образом конфигурируется логика движения (Locomotor) для нового игрового объекта ScudLauncher из Crazy Mod:
INI-конфигурация нового игрового элемента
Или как кастомизируется INI-файл с игровым AI путем изменения параметров SkillSet:
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-индустрии: когда почти все было «на виду», и разработчики таким образом бессловесно поощряли всех желающих модифицировать игры под себя. Можно ли представить, чтобы в сегодняшнюю эпоху какой-то популярный разработчик выпустил игру с отладочной информацией? — вопрос риторический. Вся эта эпоха гиковости и незрелости бизнес-процессов ныне известных игровых компаний породила множество игр, которые могут быть модифицированы множеством разных способов.