Казаки 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 в начале нет, значит формат, скорее всего, уже свой (оказалось что нет )
Не буду тут расписывать как я разбирал этот файл, в этом деле у меня богатый опыт, кому интересно как это происходит - можете почитать у меня здесь (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, и играю с удовольствием. Все вышеописанное - просто мои, как профессионального разработчика, претензии к исполнению
Всем хороших игр!
[…] Читать далее » […]