forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   OpenVice, или садо-мазо реверс-инженеринг (http://forum.boolean.name/showthread.php?t=19656)

Кирпи4 22.01.2015 17:11

OpenVice, или садо-мазо реверс-инженеринг
 

Доброго времени суток, господа булчане.
Одним январским вечером, захотелось мне чего-то нового, нового и неизведанного для моей программистской сущности. Рыская по нЁдрам своего жёсткого, набрёл на Vice City... Устраивайтесь поудобнее и слушайте сказ дяди Миши, как скрестить OpenTK, C# и файлы игры, стараясь при всём этом заставить полученный гибрид работать с должной скоростью.

Вооружившись OpenTK и своим ненаглядным SharpDevelop'ом, началась писанина GL-каркаса. GL я юзаю 2.4, с вершинными буфферами, но не использую VAO, потому как смысла в нём не вижу. Второй GL потому, что использую Immediate для рисования интерфейса.

Хотелось бы сразу откреститься, что я никак не связан с Rockstar Games, все зарегистрированные торговые марки принадлежат их владельцам. Реверс-инжиниринг проводится только для саморазвития и ни в коем случае не для продажи, и вообще, при первой опасности, я гражданин Кубы и на все вопросы следователей буду отвечать "Que?"

Кирпи4 22.01.2015 17:30

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
IMG Archive, или самая большая игровая свалка данных.

Первым делом, конечно же, становится разбор игровых архивов. Сам по себе вайсовский архив (а так же сан андреасовский, вайс сити сториевский, и далее по списку) - это два файла:
  1. DIR - Заголовочный файл
  2. IMG - Один толстый кирпич из данных
Оговорочка. В описании структур я буду использовать блицевские типы данных, потому как других нам тут и не надо.

DIR состоит из незамысловатой повторяющейся структуры:
Код:

int offset - позиция файла в IMG
int size - размер файла
chr[24] name - название файла

То бишь получается, чтобы узнать количество файлов в архиве, нужно разделить размер DIR-файла на 32.
Самое интересное в том, что оффсеты и размеры файлов нужно умножать на 2кб - размер сектора диска.

Вайс имеет при себе следующие IMG-ахивы:
  • models/gta3.img - все объекты игрового мира, а так же их текстуры (об их форматах чуть попозже).
  • anim/cuts.img - анимации роликов между миссиями. Сами персонажи, а так же декорации лежат в gta3.img, озвучка лежит отдельно в папке audio в формате mp3.

impersonalis 22.01.2015 18:30

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
А вот было бы интересно узнать: информация где-то почерпнута или получена аналитическим путём (в принципе, довольно-таки ожидаемый формат).
деление на 32 - круто. Округление размеров файлов - не очень круто, в общем случае получается не только не архив, но и наоборот.

Кирпи4 22.01.2015 18:44

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Texture Dictionary

Текстуры в вайсе упакованы в формате движка игры - RenderWare. Формат сам по себе чанковый, и на первый взгляд немного неудобный.

Базовая структура каждого чанка:
Код:

int section - тип чанка
int size - размер чанка, включая все дочерние
int version - версия RenderWare

Корневой чанк файла - 0x0016. Первым в нём идёт чанк содержит в себе следующие данные:
Код:

chunk struct - чанк, содержащий базовую информацию об архиве текстур.
chunk[texCount] textures - чанки каждой текстуры. Описаны ниже.
chunk extension - пустой чанк, можно смело обрывать чтение файла на предыдущем пункте.

Struct-чанк, описанный выше, имеет ID 0x0001, внутри два инта:
Код:

int texCount - количество текстур.
int device - колдунственное число, обозначает DX8 или DX9, зачем - загадка.

Подчанки текстур имею заголовок 0x0015, являются контейнером для одной текстуры.
Код:

chunk struct - собственно одна текстура. Имеет самую толстую спеку из всех чанков.
chunk extension - опять же пустой чанк. В PS2-версии формата содержит какие-то данные, но в PC остаётся пустым.

Текстурный struct-чанк, так же имеет ID 0x0001, держит в себе данные и параметры текстуры:
Код:

int platform - для вайса должно быть равно 8, иначе алярм.
int addressing - оче хитро сжатая информация об сглаживании и адресации текстур. Как разжать описано ниже.
chr[32] name - имя текстуры. Null-terminated, неиспользованные байты заполнены "\0".
chr[32] mask - название маски текстуры. Я не использую, назначение сомнительное. Хранится так же, как и имя.
int raster - формат растра. Список ниже.
int alpha - аж целый инт для простого флажка, есть ли альфа или нет...
short width - ширина.
short height - высота.
byte depth - глубина цвета в битах.
byte mipcount - количество mip-уровней текстуры.
byte type - всегда равно 4.
byte compression - какое сжатие текстур использовано. 0 - никакого, 1 - DXT1, 3 - DXT3.

Дальше, если raster содержит битовый флаг 0x2000, дальше следует палитра:
Код:

int[256] palette - цвета палитры для каждого индекса в формате RGBA.
Следом, для каждого из mip-уровней повторяется следующее:
Цитата:

int size - размер в байтах. В зависимости от формата и фазы луны, может равняться нулю. Это необходимо проверять и пересчитывать вручную размер.
byte[size] data - данные картинки.
Как раскодировать сглаживание и адресацию.
Хранится всё в одном инте, но используются по сути два первых байта. Первый байт - это режим фильтрации, список режимов прилагается. Следующий байт надо разбить на два блока по 4 бита, первый блок - адресация по U, второй - по V. Типы адресации тоже прилагаются.

Типы растра:
Код:

FORMAT_DEFAULT        0x0000
FORMAT_1555            0x0100 (однобитная альфа, RGB 5 бит на канал; этот же формат используется для DXT1 с альфой)
FORMAT_565            0x0200 (5 бит красного, 6 бит зелёного, 5 бит синего; используется DXT1 без альфы)
FORMAT_4444            0x0300 (RGBA 4 бита на канал; также используется для DXT3)
FORMAT_LUM8            0x0400 (gray scale)
FORMAT_8888            0x0500 (RGBA 8 бит на канал)
FORMAT_888            0x0600 (RGB 8 бит на канал без альфы)
FORMAT_555            0x0A00 (RGB 5 бит на канал - очень редкий формат)

FORMAT_EXT_AUTO_MIPMAP 0x1000 (движок должен сгенерировать мипмапы)
FORMAT_EXT_PAL8        0x2000 (2^8 = 256 цветов в палитре)
FORMAT_EXT_PAL4        0x4000 (2^4 = 16 цветов в палитре)
FORMAT_EXT_MIPMAP      0x8000 (мипмапы прилагаются)

Типы фильтрации:
Код:

FILTER_NONE                0x00
FILTER_NEAREST            0x01
FILTER_LINEAR              0x02
FILTER_MIP_NEAREST        0x03
FILTER_MIP_LINEAR          0x04
FILTER_LINEAR_MIP_NEAREST  0x05
FILTER_LINEAR_MIP_LINEAR  0x06

Типы адресации текстурных координат:
Код:

WRAP_NONE    0x00
WRAP_WRAP    0x01
WRAP_MIRROR  0x02
WRAP_CLAMP    0x03

Как говорится, первый блин комом, поэтому первые попытки прочитать текстуры были, мягко говоря, неудачными:

Однако, спустя некоторое время я понял, что неправильно читал размер для каждого мип-уровня. Вместо int я читал short, два байта терялись и ломали остальные данные. После поправки, всё встало на свои места:

Кирпи4 22.01.2015 18:46

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Цитата:

Сообщение от impersonalis (Сообщение 292203)
А вот было бы интересно узнать: информация где-то почерпнута или получена аналитическим путём (в принципе, довольно-таки ожидаемый формат).
деление на 32 - круто. Округление размеров файлов - не очень круто, в общем случае получается не только не архив, но и наоборот.

Информация получена из различных спецификаций, но частями - кусок оттуда, кусок оттуда... Спеки очень разнятся, приходится некоторые вещи подбирать на коленке.

Кирпи4 23.01.2015 09:02

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
gta_vc.dat - грузим наш город

По сути, корневой DAT-файл является простым текстовиком, который указывает игре, какие IDE и IPL подключать и где они находятся, а так же ссылается на Generic-текстуры, типа дорог или пальм.

Существенными для нас будут следующие команды:
  • IDE <имя файла> - указывает на дефенишн-файл.
  • IPL <имя файла> - указывает на файл расстановки.
  • COLFILE <имя файла> - ссылается на пак с физданными

Item Definition
IDE-файлы - это тоже текстовики. В них прописаны уникальные ID для каждого объекта, будь то здание, кусок дороги, машина или педестриан. Также, там указаны модель, текстурный архив, дистанции прорисовки и флаги, влияющие на рендер объекта. На данный момент, нам хватит секций OBJS и TOBJ. (TOBJ - секция, почти идентичная OBJS. Разница в том, что TOBJ имеет ещё и игровые часы, показывающие, в какое время суток рендерить этот объект)

Item Placement
IPL-файлы так же открываются блокнотом. Эти файлы содержат параметры для размещения в игровом мире объектов, указанных в IDE-файлах: позицию, скейл в виде векторов и поворот в виде кватерниона (сколько боли он мне доставил). Как и IDE, из IPL нам понадобится только секция INST - секция расстановки.

Если просто прочитать расположение моделей из INST-секции и нарисовать их, уже можно разобрать родные просторы и пустить скупую слезу:

Кирпи4 23.01.2015 09:08

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Не вдаваясь в описание формата моделей, скажу - он потный, и уровень его разбора мной - где-то в районе 40%, так как я ещё не дошёл до костей. Но, базовой структуры с минимумом погружения в его сумасшедшую иерархию мне хватило, чтобы загрузить статические, городские меши:



Igor 23.01.2015 11:07

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Это офигенно. Если нужна будет помощь - пиши. Я бы с шейдерами поигрался или с алгоритмами для движения автомобилей (В самой игре они могут исчезнуть, если просто отвернуться, это не труЪ, я за более реалистичную симуляцию)

Nex 23.01.2015 11:43

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Надо запрогать возможность плавать.

Кирпи4 23.01.2015 14:11

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Цитата:

Сообщение от Nex (Сообщение 292261)
Надо запрогать возможность плавать.

Оригинальные наборы анимаций для педов содержат только один вид плавания - топориком :crazy:

ABTOMAT 23.01.2015 14:36

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
По такому случаю можно из SA взять (ЕМНИП там формат моделей обратно совместим, так что в целом наверное можно заодно и его поддержку запилить).

Кирпи4 25.01.2015 19:25

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Затащил Git для проекта:
https://github.com/clashbyte/openvice

Mr_F_ 25.01.2015 21:17

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Молодец! Ностальгия, я когда-то так с мафией возился, тоже сначала вертексы вытягивал, потом уже нормальные модели, потом и скин, анимки... всё это у меня в виде допотопных тулз на блице/с++ и скриптов к максу, последние можно качать с фансайтов. Может тоже как-нибудь open проект замутить)...

Кирпи4 26.01.2015 08:28

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Цитата:

Сообщение от Mr_F_ (Сообщение 292334)
Молодец! Ностальгия, я когда-то так с мафией возился, тоже сначала вертексы вытягивал, потом уже нормальные модели, потом и скин, анимки... всё это у меня в виде допотопных тулз на блице/с++ и скриптов к максу, последние можно качать с фансайтов. Может тоже как-нибудь open проект замутить)...

Почему нет? Насколько я помню, там возможностей было в разы меньше чем в вайсе.

Mr_F_ 26.01.2015 12:06

Ответ: OpenVice, или садо-мазо реверс-инженеринг
 
Цитата:

Насколько я помню, там возможностей было в разы меньше чем в вайсе.
мафия менее аркадная, физика и система повреждений там в разы лучше была, перезарядка честная, даже гильзы с пола не исчезали, к графену подходили более основательно - лайтмапы хорошие были, интерьеры выглядели на порядок лучше, можно даже было честные отражающие зеркала создавать (есть даже моды с тачками с рабочими зеркалами заднего вида), нормальные тени от челов падали, а не пятнышки... в общем гта меня никогда не цепляло, всегда казалось игрушечной аркадкой оно мне, а вот мафия была "с душой" и "фсё как в риале!!11", вообще она во многом меня сподвигла на геймдев.
Но не будем холиварить)


Часовой пояс GMT +4, время: 10:56.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot