OpenVice, или садо-мазо реверс-инженеринг
Доброго времени суток, господа булчане. Одним январским вечером, захотелось мне чего-то нового, нового и неизведанного для моей программистской сущности. Рыская по нЁдрам своего жёсткого, набрёл на Vice City... Устраивайтесь поудобнее и слушайте сказ дяди Миши, как скрестить OpenTK, C# и файлы игры, стараясь при всём этом заставить полученный гибрид работать с должной скоростью. Вооружившись OpenTK и своим ненаглядным SharpDevelop'ом, началась писанина GL-каркаса. GL я юзаю 2.4, с вершинными буфферами, но не использую VAO, потому как смысла в нём не вижу. Второй GL потому, что использую Immediate для рисования интерфейса. Хотелось бы сразу откреститься, что я никак не связан с Rockstar Games, все зарегистрированные торговые марки принадлежат их владельцам. Реверс-инжиниринг проводится только для саморазвития и ни в коем случае не для продажи, и вообще, при первой опасности, я гражданин Кубы и на все вопросы следователей буду отвечать "Que?" |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
IMG Archive, или самая большая игровая свалка данных.
Первым делом, конечно же, становится разбор игровых архивов. Сам по себе вайсовский архив (а так же сан андреасовский, вайс сити сториевский, и далее по списку) - это два файла:
DIR состоит из незамысловатой повторяющейся структуры: Код:
int offset - позиция файла в IMG Самое интересное в том, что оффсеты и размеры файлов нужно умножать на 2кб - размер сектора диска. Вайс имеет при себе следующие IMG-ахивы:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
А вот было бы интересно узнать: информация где-то почерпнута или получена аналитическим путём (в принципе, довольно-таки ожидаемый формат).
деление на 32 - круто. Округление размеров файлов - не очень круто, в общем случае получается не только не архив, но и наоборот. |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Texture Dictionary
Текстуры в вайсе упакованы в формате движка игры - RenderWare. Формат сам по себе чанковый, и на первый взгляд немного неудобный. Базовая структура каждого чанка: Код:
int section - тип чанка Код:
chunk struct - чанк, содержащий базовую информацию об архиве текстур. Код:
int texCount - количество текстур. Код:
chunk struct - собственно одна текстура. Имеет самую толстую спеку из всех чанков. Код:
int platform - для вайса должно быть равно 8, иначе алярм. Код:
int[256] palette - цвета палитры для каждого индекса в формате RGBA. Цитата:
Хранится всё в одном инте, но используются по сути два первых байта. Первый байт - это режим фильтрации, список режимов прилагается. Следующий байт надо разбить на два блока по 4 бита, первый блок - адресация по U, второй - по V. Типы адресации тоже прилагаются. Типы растра: Код:
FORMAT_DEFAULT 0x0000 Код:
FILTER_NONE 0x00 Код:
WRAP_NONE 0x00 Однако, спустя некоторое время я понял, что неправильно читал размер для каждого мип-уровня. Вместо int я читал short, два байта терялись и ломали остальные данные. После поправки, всё встало на свои места: |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
gta_vc.dat - грузим наш город
По сути, корневой DAT-файл является простым текстовиком, который указывает игре, какие IDE и IPL подключать и где они находятся, а так же ссылается на Generic-текстуры, типа дорог или пальм. Существенными для нас будут следующие команды:
Item Definition IDE-файлы - это тоже текстовики. В них прописаны уникальные ID для каждого объекта, будь то здание, кусок дороги, машина или педестриан. Также, там указаны модель, текстурный архив, дистанции прорисовки и флаги, влияющие на рендер объекта. На данный момент, нам хватит секций OBJS и TOBJ. (TOBJ - секция, почти идентичная OBJS. Разница в том, что TOBJ имеет ещё и игровые часы, показывающие, в какое время суток рендерить этот объект) Item Placement IPL-файлы так же открываются блокнотом. Эти файлы содержат параметры для размещения в игровом мире объектов, указанных в IDE-файлах: позицию, скейл в виде векторов и поворот в виде кватерниона (сколько боли он мне доставил). Как и IDE, из IPL нам понадобится только секция INST - секция расстановки. Если просто прочитать расположение моделей из INST-секции и нарисовать их, уже можно разобрать родные просторы и пустить скупую слезу: |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Не вдаваясь в описание формата моделей, скажу - он потный, и уровень его разбора мной - где-то в районе 40%, так как я ещё не дошёл до костей. Но, базовой структуры с минимумом погружения в его сумасшедшую иерархию мне хватило, чтобы загрузить статические, городские меши:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Это офигенно. Если нужна будет помощь - пиши. Я бы с шейдерами поигрался или с алгоритмами для движения автомобилей (В самой игре они могут исчезнуть, если просто отвернуться, это не труЪ, я за более реалистичную симуляцию)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Надо запрогать возможность плавать.
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
По такому случаю можно из SA взять (ЕМНИП там формат моделей обратно совместим, так что в целом наверное можно заодно и его поддержку запилить).
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Затащил Git для проекта:
https://github.com/clashbyte/openvice |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Молодец! Ностальгия, я когда-то так с мафией возился, тоже сначала вертексы вытягивал, потом уже нормальные модели, потом и скин, анимки... всё это у меня в виде допотопных тулз на блице/с++ и скриптов к максу, последние можно качать с фансайтов. Может тоже как-нибудь open проект замутить)...
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
Но не будем холиварить) |
Часовой пояс GMT +4, время: 13:50. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot