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, или садо-мазо реверс-инженеринг
Цитата:
Но не будем холиварить) |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Что лучше: мафия или гта?
Что лучше: столы или стулья? |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Столы, они и заменят крышу над головой и кровать, а так же могут выполнять функции плота, защиты от ядерного взрыва.
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Вообще можно найти много критериев и по каждому та или иная игра будет лучше.
Я же думаю что сравнивать их не надо -- они дополняют друг друга и создают определённый общий взгляд на игры того времени. Мне посчастливилось играть в gta3, vice city и mafia в их время (2002-2003), я считаю что правильное время тоже влияет на полученное впечатления от игр. Например играя сейчас в старые игры, если знакомишься с ними первый раз, уже не получишь таких ощущений, как игрок который поиграл в них "вовремя". Также игроки игравшие "вовремя" могут вызывать прошлые впечатления даже если переигрывают старую игру в настоящем, и получают более глубоких опыт от игры. Иногда правда бывает что старая игра осталась в памяти в более приятном виде, чем когда через много лет видишь её снова: особенно это касается графики, на контрасте с современными играми сразу вылезает много недостатков старой игры. (кстати gta3 и vicecity мои любимые части, sa и gta4 уже как-то по нисходящей пошли). А по теме: Насколько мне известно с Vice City вроде всё в порядке с работой на современном железе, может нужно раскапывать игры которые по каким то причинам стали глючить или неподдерживать большие разрешения и фиксить это? И скилл прокачается и польза общественности будет. |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Вспомнил: http://habrahabr.ru/post/188594/
Но там больше дизассемблирование, программирования и нет как такового. |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
По поводу пользы общественности на поприще реверс-нижиниринга: |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Курлык, очистил репозиторий и переписал двигло совсем-совсем по новой. Попутно, кто то меня укусил и я стал писать очень много комментариев, аж на двух языках =3
Репозиторий на гитхабчике |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Появилось правильное небо, почти полностью повторяющее оригинал (пока нет облаков и солнца), освещение статики как в оригинале, плавное проявление статических объектов, разобраны файлы коллизий. Сейчас планирую прикрутить физдвижок, после будут файлы анимаций (ifp), дальше доработка звуковой системы
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Скрины давай!
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
Наконец раздуплился с физдвигом (кошмарный жонгляж одними и теми же данными, только из-за того, что когда-то какая то обезьяна придумала, что в GL z-ось должна быть направлена назад). До конца разобрал файлы коллизий и запилил статичные коллайдеры: |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Дело шло к костной анимации - но тут засада. Оказалось, что матрица поворота кости хранится в некорректном формате. Бился несколько часов, так и не смог понять, какие из координат перепутаны Т_Т
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
А трансформации остальных объектов на карте нормально хранятся?
Т-поза тоже не норм (на скрине она)? |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Цитата:
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Такое чувство, что надо где-то на минус один умножить, но, думаю, ты и так уже кучу раз пытался это сунуть во все места :-D
|
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Задача решилась в лоб - сделал кватернион как есть, и уже в нём поменял значения.
Код:
Angles = Quaternion.FromMatrix( |
Ответ: OpenVice, или садо-мазо реверс-инженеринг
Не прошло и четыре года - у меня есть смешивание анимаций + относительно рабочий контроллер персонажа
|
Часовой пояс GMT +4, время: 13:45. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot