|
С# Средство разработки на платформе .Net |
22.01.2015, 17:11
|
#1
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
OpenVice, или садо-мазо реверс-инженеринг
Доброго времени суток, господа булчане.
Одним январским вечером, захотелось мне чего-то нового, нового и неизведанного для моей программистской сущности. Рыская по нЁдрам своего жёсткого, набрёл на Vice City... Устраивайтесь поудобнее и слушайте сказ дяди Миши, как скрестить OpenTK, C# и файлы игры, стараясь при всём этом заставить полученный гибрид работать с должной скоростью.
Вооружившись OpenTK и своим ненаглядным SharpDevelop'ом, началась писанина GL-каркаса. GL я юзаю 2.4, с вершинными буфферами, но не использую VAO, потому как смысла в нём не вижу. Второй GL потому, что использую Immediate для рисования интерфейса.
Хотелось бы сразу откреститься, что я никак не связан с Rockstar Games, все зарегистрированные торговые марки принадлежат их владельцам. Реверс-инжиниринг проводится только для саморазвития и ни в коем случае не для продажи, и вообще, при первой опасности, я гражданин Кубы и на все вопросы следователей буду отвечать "Que?"
|
(Offline)
|
|
Эти 10 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
22.01.2015, 17:30
|
#2
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
IMG Archive, или самая большая игровая свалка данных.
Первым делом, конечно же, становится разбор игровых архивов. Сам по себе вайсовский архив (а так же сан андреасовский, вайс сити сториевский, и далее по списку) - это два файла: - DIR - Заголовочный файл
- IMG - Один толстый кирпич из данных
Оговорочка. В описании структур я буду использовать блицевские типы данных, потому как других нам тут и не надо.
DIR состоит из незамысловатой повторяющейся структуры:
int offset - позиция файла в IMG
int size - размер файла
chr[24] name - название файла
То бишь получается, чтобы узнать количество файлов в архиве, нужно разделить размер DIR-файла на 32.
Самое интересное в том, что оффсеты и размеры файлов нужно умножать на 2кб - размер сектора диска.
Вайс имеет при себе следующие IMG-ахивы: - models/gta3.img - все объекты игрового мира, а так же их текстуры (об их форматах чуть попозже).
- anim/cuts.img - анимации роликов между миссиями. Сами персонажи, а так же декорации лежат в gta3.img, озвучка лежит отдельно в папке audio в формате mp3.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
22.01.2015, 18:30
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
А вот было бы интересно узнать: информация где-то почерпнута или получена аналитическим путём (в принципе, довольно-таки ожидаемый формат).
деление на 32 - круто. Округление размеров файлов - не очень круто, в общем случае получается не только не архив, но и наоборот.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.01.2015, 18:44
|
#4
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: 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, два байта терялись и ломали остальные данные. После поправки, всё встало на свои места:
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
22.01.2015, 18:46
|
#5
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Сообщение от impersonalis
А вот было бы интересно узнать: информация где-то почерпнута или получена аналитическим путём (в принципе, довольно-таки ожидаемый формат).
деление на 32 - круто. Округление размеров файлов - не очень круто, в общем случае получается не только не архив, но и наоборот.
|
Информация получена из различных спецификаций, но частями - кусок оттуда, кусок оттуда... Спеки очень разнятся, приходится некоторые вещи подбирать на коленке.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
23.01.2015, 09:02
|
#6
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: 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-секции и нарисовать их, уже можно разобрать родные просторы и пустить скупую слезу:
|
(Offline)
|
|
Эти 6 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
|
23.01.2015, 09:08
|
#7
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
|
(Offline)
|
|
Эти 13 пользователя(ей) сказали Спасибо Кирпи4 за это полезное сообщение:
|
ABTOMAT (23.01.2015), Артем Валерьевич (18.01.2016), Android (25.01.2015), ARA (23.01.2015), Gector (23.01.2015), Igor (23.01.2015), impersonalis (23.01.2015), Mr_F_ (23.01.2015), pax (23.01.2015), Randomize (23.01.2015), SBJoker (23.01.2015), St_AnGer (23.01.2015), Жека (23.01.2015)
|
23.01.2015, 11:07
|
#8
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Это офигенно. Если нужна будет помощь - пиши. Я бы с шейдерами поигрался или с алгоритмами для движения автомобилей (В самой игре они могут исчезнуть, если просто отвернуться, это не труЪ, я за более реалистичную симуляцию)
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.01.2015, 11:43
|
#9
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Надо запрогать возможность плавать.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.01.2015, 14:11
|
#10
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Сообщение от Nex
Надо запрогать возможность плавать.
|
Оригинальные наборы анимаций для педов содержат только один вид плавания - топориком
|
(Offline)
|
|
23.01.2015, 14:36
|
#11
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
По такому случаю можно из SA взять (ЕМНИП там формат моделей обратно совместим, так что в целом наверное можно заодно и его поддержку запилить).
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.01.2015, 19:25
|
#12
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
|
(Offline)
|
|
25.01.2015, 21:17
|
#13
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Молодец! Ностальгия, я когда-то так с мафией возился, тоже сначала вертексы вытягивал, потом уже нормальные модели, потом и скин, анимки... всё это у меня в виде допотопных тулз на блице/с++ и скриптов к максу, последние можно качать с фансайтов. Может тоже как-нибудь open проект замутить)...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.01.2015, 08:28
|
#14
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Сообщение от Mr_F_
Молодец! Ностальгия, я когда-то так с мафией возился, тоже сначала вертексы вытягивал, потом уже нормальные модели, потом и скин, анимки... всё это у меня в виде допотопных тулз на блице/с++ и скриптов к максу, последние можно качать с фансайтов. Может тоже как-нибудь open проект замутить)...
|
Почему нет? Насколько я помню, там возможностей было в разы меньше чем в вайсе.
|
(Offline)
|
|
26.01.2015, 12:06
|
#15
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Насколько я помню, там возможностей было в разы меньше чем в вайсе.
|
мафия менее аркадная, физика и система повреждений там в разы лучше была, перезарядка честная, даже гильзы с пола не исчезали, к графену подходили более основательно - лайтмапы хорошие были, интерьеры выглядели на порядок лучше, можно даже было честные отражающие зеркала создавать (есть даже моды с тачками с рабочими зеркалами заднего вида), нормальные тени от челов падали, а не пятнышки... в общем гта меня никогда не цепляло, всегда казалось игрушечной аркадкой оно мне, а вот мафия была "с душой" и "фсё как в риале!!11", вообще она во многом меня сподвигла на геймдев.
Но не будем холиварить)
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:42.
|