ПрограммированиеСтатьиИгровая логика и ИИ

Reverse-инжиниринг игры Caesar III

Внимание! Этот документ ещё не опубликован.

Автор:

Это моя статья (http://habrahabr.ru/post/221913/), опубликованная на хабре.
Описание игры на геймдеве тут(http://www.gamedev.ru/projects/forum/?id=177998)

Мне нравится играть в игры, особенно в экономические стратегии, хочу рассказать про градостроительный симулятор из детства — Caesar III, как принято говорить, тёплый и ламповый. Игра была выпущена в 1998 году, знатоками своего дела, Impressions Games(r). Это экономический симулятор управления древнеримским городом в реальном времени. Через много  лет я решил вновь пройти её, а затем постараться продлить удовольствие от игры, посмотреть ресурсы и вникнуть в игровую логику с точки зрения программиста.

Дальше я опишу процесс извлечения текстур, поиск игровых алгоритмов и расскажу как хобби превратилось в самостоятельный проект. А еще будет палитра RGB555, IDA, HexRays и немного кода.

Музыка
Про музыку я ничего писать не буду, ибо лежит она никем неупакованная на диске с игрой в формате .wav.

Графика

С графикой(текстурами) все намного сложнее, текстуры разбиты на несколько псевдоархивов с расширением .sg2 и .555.

Файл с расширением .sg2, назовем его “оглавлением“ , содержит параметры текстур: размеры, смещение в атласе, имя и номер, идентификатор, различные флаги.

Файл с расширением .555, назовем его “атласом”, содержит сами изображения, в собственном формате описания, которые делятся на три типа:
- простые (bmp)
- изометрические
- с альфа-каналом
Для каждого типа текстур используется свой формат “сжатия”. “Оглавление” может ссылаться на несколько атласов,  при этом имя “атласа”, должно соответствовать названию группы текстур, которые в нем содержатся. Простые текстуры читаются как массив цветов и их можно  практически без обработки рисовать на экране, “обработка” состоит в преобразовании BGR555 цвета с глубиной 5 бит на канал, в более удобный для работы АRGB32. В игре Сaesar III текстуры с прозрачностью не используются, они будут задействованы позже в этой серии игр (Pharaoh, Cleopatra и др)

В файле С3.SG2 содержатся описания групп изображений.
Если открыть этот файл в hex-редакторе, то можно увидеть следующий блок данных,

который описывает группу из 44 (n_images : 0x0000002C) изображения с именем plateau, информация о которых начинается с индекса 201 (start_index : 0x000000C9). Всего в "оглавлении" есть место для 100 таких групп. После описания групп, идут описания конкретных изображений, перебирая которые можно восстановить сами картинки. Дело осталось за малым, прочитать оглавление, распаковать пожатые текстуры и собрать их в полноценные изображения. Вот что получилось при распаковке группы plateau

Вот еще несколько восстановленных текстур, в нативном формате, насколько это получилось, без фильтров.
   

А здесь обработанные текстуры с альфаканалом.

Если с атласом текстур и используемых в нем структурах данных еще можно разобраться, полагаясь на сообразительность, hex-редактор и долю везения, то с алгоритмами восстановления текстур такое не пройдет. И тут на помощь приходит Ильфак с незаменимым отладчиком IDA, и не менее полезным декомпилятором Hex-Rays. Открываем с3.exe в отладчике, видим картину отнюдь не радужную, я большую часть времени программирую на яве(java) или плюсах(c++) и для меня это, не то чтобы темный лес, но густой кустарник точно.
 

Тут нам поможет способность IDA восстанавливать asm в псевдокод plain-С. Нажимаем F5 и перед нами человеко-читабельный код, с которым уже можно работать.
.

С функциями и переменными, и оформленной структурой, и наверняка проницательный читатель заметил некоторую закономерность в приведенном выше коде, так что давайте сделаем его более читабельным. Нажимаем кнопку N, вводим нормальное имя для функции, и код выглядит намного проще.

А спустя некоторое время ( день, неделю, месяц и тд) он станет вот таким. Согласитесь, теперь намного удобнее искать алгоритмы
.

Исполняемый файл игры Caesar III (c) был собран с отладочной информацией компилятором  Visual C++ 5.0, что также позволяет восстанавливать логику приложения более продуктивно. Используя отладчик, декомпилятор и собственные серые клетки можно добраться до функции чтения изображений из архива

+ Показать

На основе это кода можно будет построить приложение, которое сможет отображать текстуры используемые в игре.

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

Каковы цели у ремейка
+ Дать возможность другим людям поиграть в забытую игру и не только под Windows.
+ Играть в Caesar III без эмуляторов, танцев с бубном, возни с запуском игры под Wine, дикого на текущий момент разрешения 800х600.
+ Повысить качество текстур, шрифтов и скорости игры.
+ Получить удовольствие от разработки - я люблю играть в игры, особенно экономические, и мне очень не нравится когда игра глючит, вылетает или работает неправильно. Мне проще сделать ремейк, чем писать свою игру, ведь к свои программам я отношусь очень критично, стараясь убрать глюки и по максимуму настроить баланс. Но результат всегда чуть хуже, чем ожидаешь, наверное поэтому на создание своего проекта уходит времени в разы больше.
+ Добавить наконец сетевую игру, которой мне так не хватало в детстве.
+ В век  побить варваров, стоя в пробке — согласитесь намного интереснее, чем донатить в ферму.
+ Сделать хороший перевод, не только для русскоговорящих, а например для французов, до них игра дошла на английском.

Что делать с авторскими правами
Вариантов немного:
1. Забить и делать то, что хочешь - не наш путь, мы ведь цивилизованные люди, не хочется тратить громадное количество времени на ремейк, чтобы авторы оригинала запретили его на финише.
2. Писать на почту правообладателем и просить разрешения (устное, разрешение на использование ресурсов или бренда, "на бумаге" и пр.). Тут еще хуже, цивилизованные авторы, или держатели прав( на данный момент это Activision), как правило держатся за них до последнего, даже если игра не приносит прибыли. Права есть - значит ремейка не будет. Точка.
3. Позиционировать игру как мод, которому для работы нужна оригинальная игра, скачанная с торрента честно купленна

#caesar III, #game development, #good old games, #open source

9 июля 2014 (Обновление: 10 ноя 2014)