Я, как человек, который разрабатывает собственную игру, черпаю идеи из разных игр. Одна из таких игр — 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-индустрии: когда почти все было "на виду", и разработчики таким образом бессловесно поощряли всех желающих модифицировать игры под себя. Можно ли представить, чтобы в сегодняшнюю эпоху какой-то популярный разработчик выпустил игру с отладочной информацией? - вопрос риторический. Вся эта эпоха гиковости и незрелости бизнес-процессов ныне известных игровых компаний породила множество игр, которые могут быть модифицированы множеством разных способов.

Комментарии (2)


  1. AgentFire
    08.10.2023 19:20
    +1

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


  1. StalkerSun
    08.10.2023 19:20

    Конечно статья, мало чего даёт. Хотелось бы увидеть некоторые реализации. Например, перемещение группы юнитов. Или перемещение камеры. Обожаю эту игру за её проработку к мелочам. Кстати там есть баги с камерой. Я пытался самостоятельно на Unity сделать подобную игру и пытался скопировать камеру с general и находил парочку. У меня получилось скопировать, но сегодня это выглядит не очень. Пришлось дорабатывать, некоторые тонкости. И всё забросил. Потому что одному это делать очень скучно и не реально. Но идея живёт во мне очень много лет уже с самого детства.