Казаки 3 - технические подробности

 

Всем привет!

Меня зовут Сергей, мне 29 лет и я реверсер со стажем ;)
Такое уж у меня хобби - ковырять игровые форматы. И Казаки 3 не стали исключением.
Если кому интересно - я веду топик в англоязычной ветке (http://www.cossacks3.com/forum/index.php?threads/cossacks-3-modding-tools.17542/)

Сегодня я бы хотел поделиться с вами некоторыми результатами моих исследований ;)

В первую очередь мне стали интересны форматы 3D моделей.

Начнем, пожалуй, со статики - OSM.
Если мы откроем любой их этих файлов в HEX-редакторе, то увидим приблизительно вот такое в начале файла:


Видите те 4 байта в начале - IDP2 ? Это называется file magic - идентификатор файла.
Бородатые старички наверное уже вздрогнули увидев знакомые буквы, ну а для тех кто помоложе - идем в гугл и спрашиваем "IDP2 3D model format".
Первой же ссылкой будет статья на википедии - https://en.wikipedia.org/wiki/MD2_(file_format)

Да, дорогие мои, да! Это старый-добрый MD2 - формат моделей Quake 2.
Смотрим на описание формата на вики и сверяем с тем что у нас - совпадение 100%.
Нет, конечно, формат разработчики немного осовременили - в наше время нет смысла хранить текстурные координаты в short а координаты в char. Теперь там float. Так же из заголовка кадра убрали скейл и смещение, оставив, однако, имя кадра, которое у всех кадров одинаковое - "FRAME 000....".
Да! В этом формате может содержаться анимация. Анимация покадровая (morph animation). Мною замечена, например, в <steam_folder>\Cossacks 3\data\actors\misc\balloon.actor.

********************************************************************************

Ну продолжим. Теперь возьмемся за OSS.
Все начинается не так радужно - file magic в начале нет, значит формат, скорее всего, уже свой (оказалось что нет :D)
Не буду тут расписывать как я разбирал этот файл, в этом деле у меня богатый опыт, кому интересно как это происходит - можете почитать у меня здесь (http://3d-orange.com.ua/reversing-game-resources-in-you-are-empty/)

Вобщем заголовок выглядит так:

1
2
3
4
5
6
7
8
struct OSSHeader {
    u32 numFrames;
    u32 fps;
    u32 numBones;
    u32 numVertices;
    u32 numTriangles;
    u32 numTexcoords;
};

Формат - отвратителен. Он неоптимален до ужаса, нет иерархии костей, все трансформации костей абсолютны. В общем - тихий ужас.
Но! Что-то во мне чесалось и шептало - чувак! где-то ты уже это видел!.
И тут память выдала - да это же пример из старючей статьи XProger'а об анимациях!
Йо-мое! Да этой же статье лет 10 как минимум! Хехе, ну вот так - разрабы взяли пример из той статьи , и без малейшего изменения кода вставили в движок.

Но нет худа без добра - скрипт для экспорда моделей в этот формат из 3DS Max'a полностью подходит для создания моделей для игры Cossacks 3 ;)

********************************************************************************

Ну и на последок - файлы локализации.
Чаще всего такие файлы меня мало интересуют, но т.к. украинская локализация в игре не то что хромает, а ползает в конвульсиях - я решил немного подправить попавшиеся мне на глаза косяки.
В папке <steam_folder>\Cossacks 3\tools\locale\ вы найдете утилиту от разработчиков для работы с локализационными файлами.
Но если открыть украинский файл локализации - увидим "кракозяблы" ;)


Хехе, вот так да - официальная туловина не умеет работать с игровой кодировкой (которая, кстати Windows-1251 - привет из 90-х!) Видать UTF-8 разрабы "ниасилили".

Формат файлов LNG прост до неприличия:
В начале - int32 - количество записей.
Дальше массив записей. Каждая запись начинается с int32 - длина записи.
Дальше сама строка указанной длины (нулевого терминатора в конце строки нет, это же Pascal).
После строки идет однобайтовый маркер который равен 0x03.
Как я уже писал выше - записи хранятся в кодировке Windows-1251, и выглядят так:
text.id=some_text_value.
Все что до = это идентификатор записи, все что после него - сам текст записи.

Дальше я за 20 минут набросал утилиту которая позволяет загружать/редактиро/сохранять эти файлы, и, при этом, правильно работает с кодировками ;)

**************************************************************************************

Казалось бы - ну и чего ты докалупался до разрабов? Ну заюзали старючий MD2, ну взяли код из старой статьи студента. Главное же что работает?
Нет!
Проблема этих форматов в том, что они дико не оптимальны! Разбиение текстурных координат и позиций вершин и их индексов не позволяет эффективно их отрисовывать, что выливается в то, что модели рисуются через glBegin/glEnd(sic!) повершинно! Да, оно лежит в display lists, но это слабо спасает ситуацию.
Формат для анимаций вообще слабо пригоден для более-менее серьезного геймдева и несет кучу неудобств.

Какой вывод? Лично мой - разработчики этого движка (и не факт что это GSC, ибо этот движок замечен мной еще аж в игре XIII век. Слава или смерть которая вышла 10 лет назад) - халтурщики.
А GSC - халтурщики вдвойне - запилить игру на таком старючем движке без малейших модификация и/или оптимизаций да еще и с вагоном багов - это сильный просчет менеджерской команды.

В конце хочу отметить что серию Казаки я очень люблю и Казаки 3 купил в первые же минуты релиза в Steam, и играю с удовольствием. Все вышеописанное - просто мои, как профессионального разработчика, претензии к исполнению :D

Всем хороших игр!

 Оставить комментарий

(required)

(required)

Вы можете использовать HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 3D-Orange.com.ua
e-mail me

3D-Orange.com.ua is proudly powered by WordPress.
Suffusion theme by Sayontan Sinha