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


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

RPF


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

#1 Dageron

Dageron

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

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


Отправлено 12 March 2009 - 08:50

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

#2 Dageron

Dageron

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

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


Отправлено 12 March 2009 - 11:23

Оригинал статьи лежит на англовики. Единственное что объяснено там не очень хорошо как-то, поэтому надо бы дополнить. Ниже привожу то что пока не вошло в статью.
=====================================
Размер названий (папок и файлов, с разделителями "00") может быть вычислен так:
Размер таблицы содержимого - (Количество файлов * 16).
Оффсет начала блока названий:
(Количество файлов * 16)+2048.
(это необходимо делать т.к. в таблице содержимого указывается оффсет названия, "отложенный" от начала блока названий).

В таблице содержимого папки и файлы идут подряд.

Например вот такая структура (в квадратных скобках - количество содержимого):
>root [2]
				   >Папка A. [4]
					   >Файл А.А.
					   >Файл А.Б.
					   >Папка А.В. [5]
							>Файл А.В.А.
							>Файл А.В.Б.
							>Файл А.В.В.
							>Папка А.В.Г. [2]
								 >Файл А.В.Г.А
								 >Файл А.В.Г.Б   
							>Файл А.В.В.	
						>Файл А.Г.
				   >Папка Б.[1]
					   >Файл Б.А.
будет записана так:
root [2]
	   Папка А. [4]
	   Папка Б. [1]
	   Файл А.А.
	   Файл А.Б.
	   Папка А.В.[5]
	   Файл А.Г.
	   Файл А.В.А.
	   Файл А.В.Б.
	   Файл А.В.В.
	   Папка А.В.Г.[2]
	   Файл А.В.В.
	   Файл А.В.Г.А.
	   Файл А.В.Г.Б.
	   Файл Б.А.
Не представляю каким циклом можно привести такой неструктурный вид к структурному. IMG3 кажется гораздо более простым чем RPF2.
=====================================

Сообщение отредактировал Dageron: 12 March 2009 - 12:51

в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#3 VcSaJen

VcSaJen

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

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 21 May 2010 - 02:25

RPF в OpenIV есть версий 2 и 3. А версия 3 используется для GTA4? Если да, то структура такая же или нет?

#4 listener

listener

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

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


Отправлено 21 May 2010 - 06:08

RPF0 - Table Tennis RPF1 - Table Tennis RPF2 - IV RPF3 - IV, Midnight Club: LosAngelos RPF6 - Red Dead Redemption Отличия RPF0 - RPF1 и RPF2 - RPF3 в том, что четные (0, 2) содержат имена файлов, а нечетные - только хэши имен. RPF6 содержит хэши и может содержать имена (если я ничего не напутал)
You think your day was surreal? Try mine.

#5 VcSaJen

VcSaJen

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

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 22 June 2010 - 00:22

1) Какие флаги у папок (второе поле в каталоге папки (+0x4))? P.S. В статье есть неточности и недоговорённости: - Для папок в третьем (+0x8) поле всегда установлен бит 31 (это и отличает папки от файлов) - Для раздела файлов в смещении +0x8 не два поля, а одно (RSCType = f8&0xFF; Offset = f8&~0xFF) - Чтобы распаковать файл с помощью ZLib, нужно добавить к началу файла Word 0xDA78 - Для RSC файлов четвёртое поле (+0xС) содержит 4 байта со смещения +0x8 самого RSC файла - Четвёртое (+0xC) поле в структуре каталога файла для не-RSC содержит информацию о размере сжатого файла, а также флаг сжатости (30-ый бит). Когда файл не сжат, четвёртое и второе поле равны размеру файла. Когда файл сжат, второе поле равно несжатому размеру файла (округлённое до 4096 вверх), а четвёртое поле равно размеру сжатого файла + установлен 30-й бит. Кто-нибудь, поправьте статью. P.S. Вот для теста сделал редактор RPF. Конечно, ещё далеко не всё работает, это пре-пре-пре-альфа :) P.P.S. Черт. Забыл сделать чтение ключа и исходники GTAArchives.pas. Ну ладно, в следующий раз опубликую Spiro и GTAArchives.pas.

Сообщение отредактировал VcSaJen: 22 June 2010 - 01:03


#6 Dageron

Dageron

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

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


Отправлено 22 June 2010 - 10:58

Я не спорю, что в статье могут быть неточности (поскольку я ведь не свои описания выкладывал, а те, которые на англовики выложены были). Редактор RPF с исходниками это весьма не плохо, выкладывай). Статью, кстати, ты и сам можешь поправить ведь.
в проекте gtamodding.ru: декабрь 2008 - декабрь 2012

#7 listener

listener

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

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


Отправлено 24 June 2010 - 09:54

- Для папок в третьем (+0x8) поле всегда установлен бит 31 (это и отличает папки от файлов)
- Для раздела файлов в смещении +0x8 не два поля, а одно (RSCType = f8&0xFF; Offset = f8&~0xFF)
- Чтобы распаковать файл с помощью ZLib, нужно добавить к началу файла Word 0xDA78
- Для RSC файлов четвёртое поле (+0xС) содержит 4 байта со смещения +0x8 самого RSC файла
- Четвёртое (+0xC) поле в структуре каталога файла для не-RSC содержит информацию о размере сжатого файла, а также флаг сжатости (30-ый бит). Когда файл не сжат, четвёртое и второе поле равны размеру файла. Когда файл сжат, второе поле равно несжатому размеру файла (округлённое до 4096 вверх), а четвёртое поле равно размеру сжатого файла + установлен 30-й бит.


Там все не совсем так. Я пока разбирался с RPF6, понял общий подход (которы применяется и для IMG).
Если два размера: размер на диске и размер в памяти. (Т.е., сколько надо сдиска прочитать, и сколько места нужно выделить в памяти). Если весь файл загружается постранично (любой RSC), то длина в памяти указывается в страницах (вместе с размерами страниц).

Надо собрать все заметки на эту тему и написать нормальную статью (с форматами/описаниями всех пяти известных RPF)

PS. Чтобы не приписывать к файлу 0xDA78, нужно в вызове inflateInit указывать windowSize = -15.
You think your day was surreal? Try mine.

#8 VcSaJen

VcSaJen

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

  • Пользователи
  • PipPipPip
  • 270 сообщений
  • Пол:Мужчина
  • Интересы:GTA, скриптинг в GTA.


Отправлено 25 June 2010 - 09:57

Вот Spiro+GTAArchives.pas (в аттаче)
@Listener -

PS. Чтобы не приписывать к файлу 0xDA78, нужно в вызове inflateInit указывать windowSize = -15.

Спасибо
P.S Последняя версия Open LC - 20090115 ? В паблике только она вроде

Прикрепленные файлы

  • Прикрепленный файл  Spiro.rar   798.03К   8 загрузок

Сообщение отредактировал VcSaJen: 25 June 2010 - 10:02





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

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