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

 

Источник

Generals, Hour, Primera, игр, качестве, преобразование, старых

Читайте также