IMG архив — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
Строка 119: Строка 119:
  
 
Длина каждого содержимого файла высчитывается так :
 
Длина каждого содержимого файла высчитывается так :
  Размер таблицы - (Количество объектов * объекта)
+
  Размер таблицы - (Количество объектов * размер конкретного объекта)
 
Далее строка будет разбита на '\x0'
 
Далее строка будет разбита на '\x0'
  

Версия 09:21, 26 января 2009

В IMG архивах GTA в основном хранятся игровые модели, текстуры, транспортные и пешеходные пути, анимации, а так же внешние скрипты. IMG архив имеет расширение .img. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой GTA IV).

Содержание

Структура

Версия 1 - GTA III & VC

Архивы первой версии, используемые в GTA III и Vice City, разделены на два файла: директория содержимого архива (.dir) и сам архив, содержащий файлы (.img).

Директория содержит список файлов, их имена, смещение и размер. Значения смещения и размера файлов должны быть умножены на 2048. Файлы расположены в блоках по 2 КБ. Это означает, что даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы (обычно) не имеют сортировку, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).

Чтобы найти общее количество элементов (файлов) в .img архиве, необходимо разделить размер .dir файла на 32.

Файл директории не имеет заголовка, просто массив элементов по 32 байта на каждый:

Элемент (повторяется n-раз, где n - общее количество элементов):

 4 байта  - DWORD	- смещение файла (в блоках) в .img архиве, относительно его начала
 4 байта  - DWORD 	- размер файла (в блоках) в .img архиве
24 байта  - CHAR[24] 	- имя файла

Сам .img архив не имеет заголовка, просто файлы, как говорилось ранее, расположенные в блоках по 2 КБ.

Схема распределения файлов в IMG архиве

Версия 2 - GTA SA

Архивы второй версии, используемые в GTA San Andreas, содержат .dir и .img файлы в одном .img файле. Директория имеет такой же формат, как и в формате 1-ой версии, но располагается в начале .img файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются от начала самого архива, а не от конца списка файлов.

Заголовок:

 4 байта	 - CHAR[4]	- сигнатура архива, всегда имеет значение "VER2"
 4 байта	 - DWORD	- общее количество элементов (файлов)

Элемент: (повторяется n-раз, где n - общее количество элементов):

 4 байта - DWORD     - смещение файла (в блоках) в архиве
 4 байта - DWORD     - размер файла (в блоках)
24 байта - CHAR[24]  - имя файла

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

Пример программы на Delphi по работе с форматом

  1.  procedure TForm1.Button1Click(Sender: TObject); //Процедура открытия архива
  2.  var
  3.    Size, Offset, FileNum, A : Integer;
  4.    Name : PChar;
  5.    FileName : String;
  6.    ListItem : TListItem;
  7.  begin
  8.    if OpenDialog1.Execute then
  9.    begin
  10.      CFileName.Text := OpenDialog1.FileName;
  11.      Size := 0;
  12.      Offset := 0;
  13.      Name := PChar(AllocMem(24));                                 
  14.      CFileList.Clear;
  15.      FileName := OpenDialog1.FileName;
  16.      Stream := TFileStream.Create(FileName, fmOpenRead);   // Открываем архив для чтения
  17.      Stream.Seek(4, 0);   // Пропускаем первые 4 байта, так как они всегда равны "VER2"
  18.      Stream.Read(FileNum, 4);   // Считываем количество файлов
  19.      for A := 0 to FileNum - 1 do  // Цикл считывания всех файлов
  20.      begin
  21.        Stream.Read(Offset, 4);   // Считываем смещение файла
  22.        Stream.Read(Size, 4);   // Считываем размер файла
  23.        Stream.Read(Name^, 24);  // Считываем имя файла
  24.        ListItem := CFileList.Items.Add;                  //
  25.        ListItem.Caption := Name;                         // Добавляем файл со всеми 
  26.        ListItem.SubItems.Add(IntToStr(Size * 2048));     // параметрами в список файлов
  27.        ListItem.SubItems.Add(IntToStr(Offset * 2048));   // 
  28.      end;
  29.    end;
  30.  end;
  31.  
  32.  procedure TForm1.Button2Click(Sender: TObject); //Процедура извлечения файлов
  33.  var
  34.    Size, Offset : Integer;
  35.    DestFile : TFileStream;  // Сюда будем загружать файл для сохранения
  36.  begin
  37.    if CFileList.SelCount > 0 then   // Если что-либо выделено в списке файлов 
  38.     begin
  39.      SaveDialog1.FileName := CFileList.Selected.Caption;
  40.      if SaveDialog1.Execute then
  41.      begin
  42.        DestFile := TFileStream.Create(SaveDialog1.FileName, fmCreate);   // Создаём файл
  43.        DestFile.Seek(0, 0);   // Смещаемся в начало файла.
  44.        Size := StrToInt(CFileList.Selected.SubItems.Strings[0]);// Узнаём размер выделенного файла
  45.        Offset := StrToInt(CFileList.Selected.SubItems.Strings[1]);// Узнаём смещение выделенного файла
  46.        Stream.Seek(Offset, 0);  // Смещаемся к смещению (то есть, к началу) файла в архиве
  47.        DestFile.CopyFrom(Stream, Size);  // Копируем количество байт, равным размеру файла в архиве
  48.        DestFile.Free;   // Закрываем файл
  49.      end;
  50.    end;
  51.  end;

Версия 3 - GTA IV

Данная версия архива имеет более сложную структуру. Но изменился не только формат - отныне каждый архив может быть шифрован. Файлы так же размещены в блоках по 2 КБ, как и в предыдущих версиях.

Заголовок

Заголовок не шифрованного файла всегда равен 20 байтам.

4 byte - DWORD      - Идентификатор (0xA94E2A52 если архив не зашифрован)
4 byte - DWORD      - Версия (всегда 3)
4 byte - DWORD      - Количество объектов
4 byte - DWORD      - Размер таблицы (в байтах)
2 byte - WORD       - Размер объектов таблицы (всегда должно быть равно 0x10)
2 byte - WORD       - Неизвестно

IMG таблица

Таблица содержит информацию о содержимых файлах. Каждый заголовок имеет размер 16 байт .

4 byte - DWORD      - Размер конкретного объекта (в байтах)
4 byte - DWORD      - Тип ресурса
4 byte - DWORD      - Оффсет (блоками)
2 byte - WORD       - Используемые блоки
2 byte - WORD       - Заполнение

Длина каждого содержимого файла высчитывается так :

Размер таблицы - (Количество объектов * размер конкретного объекта)

Далее строка будет разбита на '\x0'


Тип ресурса идентифицируется 4b DWORD значением:

  • 0x01: Общие
  • 0x08: Текстурный архив
  • 0x20: Bounds
  • 0x6E: Файл модели
  • 0x24: xpfl