Всем привет! Меня зовут Сергей, мне 29 лет и я реверсер со стажем Такое уж у меня хобби - ковырять игровые форматы. И Казаки 3 не стали исключением. Если кому интересно - я веду топик в англоязычной ветке (http://www.cossacks3.com/forum/index.php?threads/cossacks-3-modding-tools.17542/) Сегодня я бы хотел поделиться с вами некоторыми результатами моих исследований В первую очередь мне стали интересны форматы 3D моделей. Начнем, пожалуй, со статики - OSM. Если мы откроем любой их этих файлов в HEX-редакторе, то увидим приблизительно вот такое в начале файла: Spoiler: Скриншот Видите те 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.osm. ******************************************************************************** Ну продолжим. Теперь возьмемся за OSS. Все начинается не так радужно - file magic в начале нет, значит формат, скорее всего, уже свой (оказалось что нет ) Не буду тут расписывать как я разбирал этот файл, в этом деле у меня богатый опыт, кому интересно как это происходит - можете почитать у меня здесь (http://3d-orange.com.ua/reversing-game-resources-in-you-are-empty/) Вобщем заголовок выглядит так: Spoiler: Код Code: 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\ вы найдете утилиту от разработчиков для работы с локализационными файлами. Но если открыть украинский файл локализации - увидим "кракозяблы" Spoiler: Screenshot Хехе, вот так да - официальная туловина не умеет работать с игровой кодировкой (которая, кстати Windows-1251 - привет из 90-х!) Видать UTF-8 разрабы "ниасилили". Формат файлов LNG прост до неприличия: В начале - int32 - количество записей. Дальше массив записей. Каждая запись начинается с int32 - длина записи. Дальше сама строка указанной длины (нулевого терминатора в конце строки нет, это же Pascal). После строки идет однобайтовый маркер который равен 0x03. Как я уже писал выше - записи хранятся в кодировке Windows-1251, и выглядят так: text.id=some_text_value. Все что до = это идентификатор записи, все что после него - сам текст записи. Дальше я за 20 минут набросал утилиту которая позволяет загружать/редактиро/сохранять эти файлы, и, при этом, правильно работает с кодировками Spoiler ************************************************************************************** Казалось бы - ну и чего ты докалупался до разрабов? Ну заюзали старючий MD2, ну взяли код из старой статьи студента. Главное же что работает? Нет! Проблема этих форматов в том, что они дико не оптимальны! Разбиение текстурных координат и позиций вершин и их индексов не позволяет эффективно их отрисовывать, что выливается в то, что модели рисуются через glBegin/glEnd (sic!) повершинно! Да, оно лежит в display lists, но это слабо спасает ситуацию. Формат для анимаций вообще слабо пригоден для более-менее серьезного геймдева и несет кучу неудобств. Какой вывод? Лично мой - разработчики этого движка (и не факт что это GSC, ибо этот движок замечен мной еще аж в игре XIII век. Слава или смерть которая вышла 10 лет назад) - халтурщики. А GSC - халтурщики вдвойне - запилить игру на таком старючем движке без малейших модификация и/или оптимизаций да еще и с вагоном багов - это сильный просчет менеджерской команды. В конце хочу отметить что серию Казаки я очень люблю и Казаки 3 купил в первые же минуты релиза в Steam, и играю с удовольствием. Все вышеописанное - просто мои, как профессионального разработчика, претензии к исполнению Всем хороших игр!
Притензии на формат, ещё и разработанный знатоком, точней даже "отцом"-3D-оптимизаций, ещё со времён Wolf 3D не тормозившем, напомню тогда ещё - при программной отрисовке в отличие от кучи совремнных его форков - даже на 386 20 Mhz ПК с аж 2MB..., почему и ставшей супер-популярным в то время, Кармаком... - вероятно всё же не совсем обоснованны... А, то что формат морально устарел - не спорю, но хватает же игре и это главное. И как я понял выше - тот даже оптимизировали в сторону filemap прямого доступа без конверсии, как раз некоторая потенциальная оптимизация скорости доступа.