Перейти к содержимому


Фотография
- - - - -

RSC


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 17

#1 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 09 March 2009 - 09:30

Это тема для обсуждения статьи: RSC
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#2 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 09 March 2009 - 09:35

Как я понял, на ПК все ресурсы запакованы zlib-ом. Распаковывать следует пропустив первые 12 байт файла - идентификатор, версию и параметры (что за параметры?). Сделал свой распаковщик, но при распаковке у меня получается один сплошной кусок данных без разделителей, а Resoursaur от aru умеет различать в нем два сегмента. Вопрос в том, как их размеры определяются-то?
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#3 GooD-NTS

GooD-NTS

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 494 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 09 March 2009 - 11:20

идентификатор, версию и параметры (что за параметры?)

Из этих "параметров" как раз и можно узнать размеры сегментов.

Замечания по поводу статьи:
Идентификатор - это не "Идентификатор" это версия объекта ресурсов. Например, в xtd и wtd хранится один и тот же объект (ну это не совеем так, но не важно), но разных версий, в xtd была версия 7, а в wtd версия 8. Версии разных ресурсов никак не связаны между собой (например, и у whm /xhm и у wad/xad версиия 1).

Изображение

RAGE research project, public side: OpenIV (Журнал изменений План развития) | openFormats


#4 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 09 March 2009 - 11:31

Из этих "параметров" как раз и можно узнать размеры сегментов.

Можно чуть-чуть поподробнее как это делается?)
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#5 GooD-NTS

GooD-NTS

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 494 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 09 March 2009 - 11:45

Можно чуть-чуть поподробнее как это делается?)

Примерно так:
Flags:= //
   CPUSize:= (Flags AND $7FF) shl (((Flags shr 11) AND $F) + 8);
   GPUSize:= ((Flags shr 15) AND $7FF) shl (((Flags shr 26) AND $F)+8);
   TotalUnpackedLength:= CPUSize+GPUSize;

Если ты еще не читал это http://sannybuilder....opic.php?id=433 то почитай.

p.s:

Сделал свой распаковщик, но при распаковке у меня получается один сплошной кусок данных без разделителей,

Вот лучше бы вместо того что и так уже сделали что-нибудь бы полезное попробовал исследовать например метаданные для аудио из папки "Grand Theft Auto IV\pc\audio\Config"...

Изображение

RAGE research project, public side: OpenIV (Журнал изменений План развития) | openFormats


#6 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 09 March 2009 - 13:52

Спасибо за информацию. Компрессия ведь у всех ресурсов одинакова - zlib?
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#7 GooD-NTS

GooD-NTS

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 494 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 09 March 2009 - 15:37

Компрессия ведь у всех ресурсов одинакова - zlib?

Да, у всех сжатых ресурсов ПК версии zLib, на x360 используется другой алгоритм. Также существуют не сжатые ресурсы (сжат ресурс или нет, определяется из флагов ["параметров"]) но это неважно т.к. они лежат в очень интересном месте (хотя любой ресурс может быть сжатым или нет).

Сообщение отредактировал GooD-NTS: 09 March 2009 - 15:41

Изображение

RAGE research project, public side: OpenIV (Журнал изменений План развития) | openFormats


#8 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 09 March 2009 - 15:49

Да, у всех сжатых ресурсов ПК версии zLib, на x360 используется другой алгоритм.

У aru в исходниках SparkIV про lzx-компрессию сказано.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#9 GooD-NTS

GooD-NTS

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 494 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 18 March 2009 - 17:56

Dageron, я конечно не специально, но хочу тебя огорчить, приведенная тобой в статье функция для расчётов флагов для RSC не правильная. Потому что флаги это не "параметры содержащие размеры сегментов" а совершенное другие данные, а то, что из них можно получить размеры это побочный эффект.

Кстати, ты вообще, где это взял? O_O

Изображение

RAGE research project, public side: OpenIV (Журнал изменений План развития) | openFormats


#10 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 18 March 2009 - 18:00

Я взял этот код из темы про RSC на gtaF. Привел функцию steve-m, я только разобрался как использовать. Работает, кстати, добавил в свою программку функцию импорта сегментов.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#11 GooD-NTS

GooD-NTS

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 494 сообщений
  • Пол:Мужчина
  • Город:Нижний Новгород


Отправлено 18 March 2009 - 18:06

Неа не работает :)

Потому что это берд (у меня тоже была функция для расчета флагов, и даже побольше чем эта и даже сходилась с оригинальными файлами больше 50%). Но флаги нельзя рассчитать простой (да и сложной тоже :D ) функцией, в которую передаются размеры сегментов.

Изображение

RAGE research project, public side: OpenIV (Журнал изменений План развития) | openFormats


#12 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 18 March 2009 - 19:39

Я взял этот код из темы про RSC на gtaF. Привел функцию steve-m, я только разобрался как использовать.


В теме на форумсе - некорректный вариант. Он будет работать в некоторых случаях, но далеко не всегда и не везде.
Относительно корректная функция рассчета флагов занимает порядка 300 строк, и параметром ей передается полный список всех структур в файле (т.к. нужно не только посчитать размеры, но и пересортировать объекты).

Совсем корректный вариант должен делать несколько проходов и брать лучший получившийся результат.
You think your day was surreal? Try mine.

#13 Dageron

Dageron

    Активный участник

  • Пользователи
  • PipPipPip
  • 1130 сообщений
  • Пол:Мужчина
  • Город:Пермь


Отправлено 23 June 2009 - 09:51

Данный скрин может показаться интересным:
Изображение
Все это идеально рабочее в совокупности с xcompress32.dll из Xenon SDK (за что выражается огромная благодарность одному человеку с форума XenTax).

Наверняка возник вопрос по названию - не шутка ли все это? Не шутка - программу и исходник (C#) выкладываю на дропбокс.

Крайне жалко что GooD не видит(. Хотя не знаю понравилось ему это бы или нет - в любом случае все это дальше на публику я распространять не собираюсь. Наоборот, теперь самое время заняться непосредственным строением pgDictionary<grcTextureXenon>. И редактировать xtd мне не особо надо, а вот просмотреть...
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#14 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 19 August 2009 - 19:27

Кто-нибудь знает, как, имея размер распакованного ресурса, записать флаги (с 8 по 12 байт в RSC)?

#15 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 19 August 2009 - 22:23

В общем случае - никак. Они завязаны на внутреннюю структуру ресурса. Если есть точный размер, можно попробовать подобрать: максимум понадобится пять попыток на каждую часть.
You think your day was surreal? Try mine.

#16 RussianCJ

RussianCJ

    Активный участник

  • Пользователи
  • PipPipPip
  • 54 сообщений

Отправлено 19 August 2009 - 22:48

Сам ресурс (WTD) присутствует в распакованном и запакованном виде, так что с доступом во внутреннюю структуру не должно возникнуть проблем.

Сообщение отредактировал RussianCJ: 19 August 2009 - 22:49


#17 listener

listener

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 356 сообщений
  • Пол:Мужчина
  • Город:Ft.Lauderdale


Отправлено 20 August 2009 - 12:27

Для WTD было вот здесь:
http://sannybuilder....?pid=5850#p5850
You think your day was surreal? Try mine.

#18 max

max

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 23 August 2010 - 06:39

Всем привет
Прочитал статью возникло много вопросов.
1.написал програмульку которая выкидывает первые 12 байтов из *.wft
но разархивировать получившийся файл не могу.
2 Не разу не писал проги для чтения бинарников нельзя ли подробнее описать
например не понял что за переменная flag bool?

Посмотрел исходники Dageron
сразу возник вопрос а есть на С++ аналог integer?
исползовал char* но туда пишется из файла не то
char* T;
char* Flags;
T = new char[3];
Flags = new char[3];

xfile.seekg(4, std::ios::beg);
xfile.read(T, sizeof T);
xfile.read(Flags, sizeof Flags);

Всё разобрался :)

Сообщение отредактировал max: 04 September 2010 - 06:00





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных