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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Я, как человек, который разрабатывает собственную игру, черпаю идеи из разных игр. Одна из таких игр — 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" прямо сейчас восстанавливаются игры:

  • Alive - Abe's Exodus

  • dethrace - Carmageddon

  • Devilution - Diablo

  • OpenDUNE - Dune 2

  • OpenFodder - Cannon Fodder

  • OpenLoco - Locomotion

  • OpenMC2 - Midnight Club 2

  • OpenRCT2 - RollerCoaster Tycoon 2

  • OpenTTD - Transport Tycoon Deluxe

  • Vanilla Conquer - Tiberian Dawn & Red Alert

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

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

Итоги

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

Источник: https://habr.com/ru/articles/765718/


Интересные статьи

Интересные статьи

В ближайшем будущем загрузочные диски и флешки с Windows могут перестать работать. Виной тому — патчи Microsoft для уязвимости, позволяющей обходить систему защиты Secure Boot. Проблему, обнаруженную ...
Возможно, вы, как программист, когда-то интересовались пошаговыми стратегиями. В этой статье я решил рассказать о собственном взгляде на эту тему, используя JavaScriptКто заинтересован - добро пожалов...
Всем привет. Друзья. Прошло не так много времени, когда мы вспоминали про игру dungeion keeper, где мы были злом во плоти. Сегодня же мы вспомним про величайшего героя, ...
Поговорим о том, как менялась культура музыкального потребления и какие технологические новшества этому поспособствовали. Свой рассказ (из нескольких частей) мы начнем с XVII века — т...
Flipper Zero — проект карманного мультитула для хакеров в формфакторе тамагочи, который я разрабатываю с друзьями. Предыдущий пост [1]. Много всего произошло с момента первого поста про фл...