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

Материал из GTAModding.ru
Перейти к: навигация, поиск
м
 
(не показаны 27 промежуточных версий 8 участников)
Строка 1: Строка 1:
В '''IMG архивах''' GTA в основном хранятся игровые модели, текстуры, транспортные и пешеходные пути, анимации, а так же [[Внешние скрипты|внешние скрипты]]. IMG архив имеет расширение <code>.img</code>. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой GTA 4).
+
В '''<code>[[IMG|*.img]]</code> архивах''' GTA, в основном, хранятся игровые модели, текстуры, файлы коллизий, бинарные ipl, транспортные и пешеходные пути, анимации, а так же [[Внешние скрипты|внешние скрипты]]. Эти архивы разделяются на версии и имеют схожий между собой формат (за исключением версии, используемой [[GTA 4]]).
  
 
== Структура ==
 
== Структура ==
  
=== Версия 1 - GTA III & VC ===
+
=== Версия 1 - GTA III, GTA VC, GTA LCS, GTA VCS ===
Архивы первой версии, используемые в GTA III и Vice City, разделены на два файла: директория содержимого архива <code>.dir</code> и сам архив, содержащий файлы <code>.img</code>.
+
Архивы первой версии включают в себя:
 +
# IMG - файловый архив, содержащий непосредственно игровые ресурсы, обычно имеет разрешение <code>[[IMG|*.img]]</code>;
 +
# DIR - директория содержимого архива, в котором указана информация, о файлах, содержащихся в IMG. Как правило, имеет разрешение <code>*.dir</code>.
  
Директория содержит список файлов, их имена, смещение и размер. Изначально формат IMG оптимизировался для использования на DVD или CD, поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы (обычно) не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).
+
Формат <code>[[IMG|*.img]]</code> был разработан DMA Design для использования на CD и DVD (от сюда, скорее всего, и внутреннее название - CD'''IM'''A'''G'''E), поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы в архиве, как правило, не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).
  
Чтобы найти общее количество элементов (файлов) в IMG архиве, необходимо разделить размер .dir файла на 32.
+
Чтобы найти общее количество элементов (файлов) в <code>[[IMG|*.img]]</code> архиве, необходимо разделить размер DIR- файла на 32.
  
Файл директории не имеет заголовка, просто массив элементов по 32 байта на каждый:
+
Содержимое DIR представляет собой массив элементов по 32 байта на каждый:
  
 
  Элемент (повторяется n-раз, где n - общее количество элементов):
 
  Элемент (повторяется n-раз, где n - общее количество элементов):
 
   
 
   
   4 байта  - DWORD - смещение файла (в блоках) в .img архиве, относительно его начала
+
   4 байта  - DWORD - смещение файла (в блоках) в *.img архиве, относительно его начала
   4 байта  - DWORD - размер файла (в блоках) в .img архиве
+
   4 байта  - DWORD - размер файла (в блоках) в *.img архиве
 
  24 байта  - CHAR[24] - имя файла
 
  24 байта  - CHAR[24] - имя файла
  
Сам IMG архив не имеет заголовка, просто файлы, как говорилось ранее, расположенные в блоках по 2 КБ.
+
В IMG-архиве файлы, как говорилось ранее, расположены в блоках по 2 КБ.
  
[[Изображение:IMG_file_alloc.png|center|Схема распределения файлов в IMG архиве]]
+
[[Изображение:IMG_file_alloc.png|center|Схема распределения файлов в <code>[[IMG|*.img]]</code> архиве]]
 +
 
 +
В [[GTA LCS]] и [[GTA VCS|VCS]] к первой версии относятся только архивы <code>CUTS.IMG, MOCAP.IMG, GTA3PS2.IMG, GTA3PSP.IMG и GTA3PSPHR.IMG</code>, все остальные относятся к версии 1А. Кроме того, такие игры используются, к примеру, в Bully: Schoolarship Edition.
 +
 
 +
У GTA3PS2.IMG, GTA3PSP.IMG и GTA3PSPHR.IMG есть своя особенность - отсутствие вышеописанного DIR-файла в открытом виде из-за того, что данные архивы загружаются игрой через несколько DIR - свой для объектов анимации, динамических объектов и свой для текстур.
 +
 
 +
==== Дополнительные архивы ====
 +
При помощи [[gta_vc.dat]] или [[gta.dat]] можно подключать к игре свои IMG-архивы. Формат следующий:
 +
CDIMAGE MODELS\FOO.IMG
 +
При этом IMG и DIR должны иметь одинаковые имена и располагаться в директории <code>..\models\</code>
 +
 
 +
==== Сжатие данных ====
 +
На PS2 и PC все данные хранятся в несжатом виде, но на XBOX была добавлена компрессия данных в кодировке [http://www.oberhumer.com/opensource/lzo/lzonews.php lzo1x-999]. Декомпрессия реализована в [[Dffxbox2pc]] от Alex.
 +
 
 +
===Версия 1А - GTA:LCS и GTA:VCS===
 +
Единственная особенность данной версии <code>[[IMG|*.img]]</code>-архивов - отсутствие DIR-файла. Общим с версией 1 осталось только то, что файлы выравнены по размеру сектора (2048 байт). Загрузка файлов из архива реализовано за счёт переходов (офсетов) из определённых точек ведущего (master [[WRLD]]) в ведомые (slave [[WRLD]]) файлы архивов. Для того, чтобы распаковать всё содержимое архивов, нужно распаковать master [[WRLD]] из архива с расширением [[LVZ]] (с помощью любого Zlib-распаковщика, например встроенного в [[Stories WRLD Tool]]) и найти там таблицы начал для slave [[WRLD]] и подчинённых к ним текстур радаров, по которым можно определить, к какой части карты относится содержимое slave [[WRLD]]. Каждая строка, состоящая из 32 байт, является глобальным заголовком slave [[WRLD]] и в конце содержит офсет на продолжение в одноимённом с [[LVZ]] <code>[[IMG|*.img]]</code>-архиве. Автоматическую распаковку таких архивов производит утилита [[unimg]]. Извлечение [[WRLD]] из <code>[[IMG|*.img]]</code>, а так же просмотр и извлечение ресурсов из [[WRLD]] реализовано в [[Stories WRLD Tool]], просмотр и редактирование текстур в [[WRLD]] возможно с помощью [[GTA Stories Texture Explorer]].
 +
Однако, так как теоретически, DIR-файл для такого архива может быть построен. Для того чтобы создать такой архив, нужно либо извлечь таблицу файлов из [[DTZ|game.dtz]], либо составить "безымянный" DIR на основе поиска заголовков файлов, например, при по помощи программы [[YAIE]].
  
 
=== Версия 2 - GTA SA ===
 
=== Версия 2 - GTA SA ===
Архивы второй версии, используемые в GTA San Andreas, содержат <code>.dir</code> и <code>.img</code> файлы в одном IMG файле. Директория имеет такой же формат, как и в формате 1-ой версии, но располагается в начале IMG файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются ''от начала самого архива'', а не от конца списка файлов.
+
Архивы второй версии, используемые в [[GTA SA|GTA San Andreas]], представляют собой комбинированный DIR и IMG в одном <code>[[IMG|*.img]]</code>-файле. Таблица файлов имеет такую же структуру, как и в формате 1-ой версии, но располагается в начале <code>[[IMG|*.img]]</code> файла. Файлы так же размещены в блоках по 2 КБ. Смещения файлов задаются ''от начала самого архива'', а не от конца списка файлов.
  
 
  Заголовок:
 
  Заголовок:
 
   
 
   
   4 байта - CHAR[4] - сигнатура архива, всегда имеет значение "VER2"
+
   4 байта - CHAR[4] - сигнатура архива, всегда имеет значение "VER2"
   4 байта - DWORD - общее количество элементов (файлов)
+
   4 байта - DWORD - общее количество элементов (файлов)
 
   
 
   
 
  Элемент: (повторяется n-раз, где n - общее количество элементов):
 
  Элемент: (повторяется n-раз, где n - общее количество элементов):
Строка 36: Строка 54:
 
  24 байта - CHAR[24]  - имя файла
 
  24 байта - CHAR[24]  - имя файла
  
Недостаток этого формата - это его расширяемость. Если вы добавите слишком много файлов, директория начнёт записываться ''поверх первых файлов в архиве'', поэтому вам нужно будет записывать первые файлы в конец архива.
+
Недостаток этого формата - неудобство его расширяемости. Если вы добавите слишком много файлов, директория начнёт записываться ''поверх первых файлов в архиве'', поэтому вам нужно будет записывать первые файлы в конец архива.
  
<div class="NavFrame collapsed"><div class="NavHead">'''Пример программы на Delphi по работе с форматом GTAIII/VC/SA'''</div>
+
==== Дополнительные архивы ====
<div class="NavContent">
+
При помощи [[gta.dat]] можно подключать к игре свои IMG-архивы. Формат следующий:
 
+
  IMG MODELS\FOO.IMG
<source lang="delphi" line>
+
Изначально, GTA San Andreas поддерживает 8 IMG-архивов, 5 из которых можно подключить через [[gta.dat]]. Данный лимит можно поднять, воспользовавшись [http://www.gtaforums.com/index.php?showtopic=500814 IMG Limit Adjuster].
 
+
{В глобальные переменные}
+
 
+
  Stream, DIRStream: TFileStream;  //Stream - переменная для загрузки архива, DIRStream - переменная для загрузки DIR файла
+
  Size, Offset, FileNum, A : Integer; //Целые данные - размер, смещение, количество файлов
+
  ID:Array [0..3] of AnsiChar;    //Для идентификатора формата
+
  FileName, DirName : String;    //Для названия IMG и DIR
+
{}
+
 
+
 
+
procedure TForm1.Close1Click(Sender: TObject);  //Процедура открытия архива
+
var
+
  ListItem : TListItem;
+
  Name: Array [0..23] of AnsiChar;  //Переменная для сохранения имен
+
  Z:Integer;
+
  DestFile : TFileStream;  // Сюда будем загружать файл для сохранения
+
  Label VER1,VER2,MAINEND;
+
 
+
 
+
begin
+
  if OpenDialog1.Execute then    //Вызываем диалог открытия
+
  begin
+
    CFileName.Text := OpenDialog1.FileName;
+
    DirName:= CFileName.Text;  //Присваиваем DirName название самого архива
+
    Delete (DirName, Length (DirName)-3, 4); //Удаляем расширение
+
    DirName:=DirName+'.dir';  //Ставим расширение ".dir"
+
    Size := 0;
+
    Offset := 0;
+
    CFileList.Clear;
+
    FileName := OpenDialog1.FileName;
+
    Stream := TFileStream.Create(FileName, fmOpenRead);  // Открываем архив для чтения
+
    Stream.Read(ID, 4);    // Записываем первые три байта чтобы проверить верисию архива
+
    if ID='VER2' then  GOTO VER2 else GOTO VER1;  //Если идентификатор - "VER2" то смещаемся к метке VER2, если нет - к метке VER1
+
 
+
VER2:
+
    begin
+
        label2.Caption:='Загружен архив версии №2 - SanAndreas';
+
        Stream.Read(FileNum, 4);  // Считываем количество файлов
+
        for A := 0 to FileNum - 1 do // Цикл считывания всех файлов
+
        begin
+
          Stream.Read(Offset, 4);  // Считываем смещение файла
+
          Stream.Read(Size, 4);  // Считываем размер файла
+
          Stream.Read(Name, 24);  // Считываем имя файла
+
          ListItem := CFileList.Items.Add;                  //
+
          ListItem.Caption := Name;                        // Добавляем файл со всеми
+
          ListItem.SubItems.Add(IntToStr(Size * 2048));    // параметрами в список файлов
+
          ListItem.SubItems.Add(IntToStr(Offset * 2048));  //
+
        end;
+
    end;
+
GOTO MainEnd;  //Переходим в конец процедуры
+
 
+
VER1:
+
begin;
+
if FileExists(DirName) then label2.Caption:='Загружен архив версии №1 - GTAIII/ViceCity' else label2.Caption:='Ошибка загрузки архива версии №2 - не найден DIR файл';
+
    Stream.Read(ID, 3);  //Считываем первые три байта
+
    DIRStream := TFileStream.Create(DirName, fmOpenRead); //Создаем область памяти куда будем записывать DIR
+
    FileNum:=DIRStream.Size div 32; //Высчитыввем число файлов
+
        //ProgressBar1.Step:=1;
+
        //ProgressBar1.Max:=FileNum;
+
        for A := 0 to FileNum - 1 do  // Цикл считывания всех файлов
+
        begin
+
          DIRStream.Read(Offset, 4);  // Считываем смещение файла
+
          DIRStream.Read(Size, 4);  // Считываем размер файла
+
          DIRStream.Read(Name, 24);  // Считываем имя файла
+
          ListItem := CFileList.Items.Add;                  //
+
          ListItem.Caption := Name;                        // Добавляем файл со всеми
+
          ListItem.SubItems.Add(IntToStr(Size * 2048));    // параметрами в список файлов
+
          ListItem.SubItems.Add(IntToStr(Offset * 2048));  //
+
        end;
+
end;
+
 
+
  MainEnd:; //Конец процедуры
+
  end;
+
end;
+
</source>
+
</div></div>
+
 
+
===Версия 2А - GTA:LCS и GTA:VCS===
+
Архивы портативных GTA делятся на два типа - сжатые и несжатые.
+
 
+
Структура несжатого архива почти не отличается от структуры версии 1. Отсутствует <code>.dir</code> файл. Имена файлов, их смещение и размер содержатся в [[GAME.DTZ]] архиве (ближе к началу файла). То есть для того чтобы открыть несжатый архив, нужно либо извлечь данные из [[GAME.DTZ]], либо сделать <code>.dir</code> таблицу файлов самостоятельно (причем второй вариант оказался гораздо более простым и умеет делать это [[YAIE]]).
+
 
+
Сжатые архивы имеют гораздо более сложную структуру. В таком <code>.img</code> файле нет разделителей и читать данные о смещении и размере неоткуда. На смену <code>.dir</code> пришел <code>.lvz</code> - новый, неизвестный формат по своей сути полностью отличающийся от предшественника.
+
  
 
===Версия 3 - GTA IV===
 
===Версия 3 - GTA IV===
Строка 134: Строка 69:
 
Заголовок файла всегда равен '''20 байтам'''.
 
Заголовок файла всегда равен '''20 байтам'''.
  
  4 byte - DWORD      - Идентификатор (0xA94E2A52) Если, это поле имеет другое значение, архив зашифрован
+
  4 байта - DWORD      - Идентификатор (0xA94E2A52) Если, это поле имеет другое значение, архив зашифрован
  4 byte - DWORD      - Версия (всегда 3)
+
  4 байта - DWORD      - Версия (всегда 3)
  4 byte - DWORD      - Количество объектов
+
  4 байта - DWORD      - Количество объектов
  4 byte - DWORD      - Размер каталога (в байтах)
+
  4 байта - DWORD      - Размер каталога (в байтах)
  2 byte - WORD      - Размер элемента каталога (всегда должен быть равен 0x10)
+
  2 байта - WORD      - Размер элемента каталога (всегда должен быть равен 0x10)
  2 byte - WORD      - Неизвестно
+
  2 байта - WORD      - Неизвестно
  
 
==== Каталог архива ====
 
==== Каталог архива ====
  
 
Каталог архива состоит из двух частей: описателей файлов, содержащих смещение и размер файла внутри архива и имен файлов.  
 
Каталог архива состоит из двух частей: описателей файлов, содержащих смещение и размер файла внутри архива и имен файлов.  
 +
В зависимости от способа загрузки файла, формат полей описателя может отливаться. Для [[RSC]], указывается размер и количество выделяемых блоков памяти (страниц), для обычных файлов, указывается общая длина.
 +
 +
Определить, какой из форматов описателя используется ([[RSC]]/не [[RSC]]), можно по старшему биту поля dwLength (для RSC он равен 1)
  
 
В начале идет массив описателей по 16 байт:
 
В начале идет массив описателей по 16 байт:
  
  4 byte - DWORD     - Размер объекта и флаги
+
{| {{Таблица}}
  4 byte - DWORD     - Версия ресурса (только для RSC, для остальных объектов не используется)
+
!Размер        || Имя поля    || Назначение              || RSC-файлы                                    || Остальные файлы   
4 byte - DWORD     - Смещение от начала IMG в блоках (2048 байт)
+
|-
  2 byte - WORD       - Количество используемых блоков
+
|4 byte - DWORD || dwLength    || Размер объекта в памяти || Поле флагов из заголовка RSC                || Размер объекта
  2 byte - WORD       - Размер неиспользуемого места в последнем блоке
+
|-
 +
|4 byte - DWORD || dwVersion    || Версия ресурса         || Поле версии из заголовка RCS                || не используется
 +
|-
 +
|4 byte - DWORD || dwOffset    || Позиция в IMG          || Смещение в блоках                           || Смещение в блоках 
 +
|-
 +
|2 byte - WORD || wSectorCount || Размер объекта на диске ||  Кол-во блоков                               || Кол-во блоков     
 +
|-
 +
|2 byte - WORD || wPaddingSize || Размер объекта на диске || PaddingSize+установлен бит 13                ||  PaddingSize   
 +
|}
  
За описателями следуют имена файлов, разделенные '\x0', в том же порядке, что и описатели.
+
PaddingSize - Размер неиспользуемого места в последнем блоке
 +
 
 +
За описателями следуют имена файлов, разделенные '\x0' (нулевым байтом), в том же порядке, что и описатели.
  
 
==== Чтение зашифрованных архивов ====
 
==== Чтение зашифрованных архивов ====
  
Если идентификатор архива не равен 0xA94E2A52, архив считается зашифрованным.
+
Если идентификатор архива не равен <code>0xA94E2A52</code>, архив считается зашифрованным.
 
Для чтения такого архива, следует прочитать заголовок (20 байт), но дешифровать только первые 16 байт.
 
Для чтения такого архива, следует прочитать заголовок (20 байт), но дешифровать только первые 16 байт.
 
После этого, следует снова проверить идентификатор. Если идентификатор корректный, следует считать каталог (размер берется из расшифрованного заголовка) и дешифровать его, округлив размер до числа кратного 16, вниз. (Например, если указан размер 259 байт, дешифруются только первые 256).
 
После этого, следует снова проверить идентификатор. Если идентификатор корректный, следует считать каталог (размер берется из расшифрованного заголовка) и дешифровать его, округлив размер до числа кратного 16, вниз. (Например, если указан размер 259 байт, дешифруются только первые 256).
  
 +
Шифрование - стандартное для IV - [[Шифрование (GTA 4)|AES]].
 +
 +
==Ссылки==
 +
[http://sannybuilder.com/forums/viewtopic.php?id=1176 Компоненты для работы с IMG, RPF, WTD для Delphi]
 +
 +
{{SA-navi}}{{VC-navi}}{{GTA3-navi}}
 
[[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]][[Категория:GTA 4]][[Категория:Форматы файлов]]
 
[[Категория:GTA 3]][[Категория:GTA VC]][[Категория:GTA SA]][[Категория:GTA 4]][[Категория:Форматы файлов]]

Текущая версия на 11:44, 25 апреля 2022

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

Содержание

Структура

Версия 1 - GTA III, GTA VC, GTA LCS, GTA VCS

Архивы первой версии включают в себя:

  1. IMG - файловый архив, содержащий непосредственно игровые ресурсы, обычно имеет разрешение *.img;
  2. DIR - директория содержимого архива, в котором указана информация, о файлах, содержащихся в IMG. Как правило, имеет разрешение *.dir.

Формат *.img был разработан DMA Design для использования на CD и DVD (от сюда, скорее всего, и внутреннее название - CDIMAGE), поэтому размер и смещение файлов кратны сектору DVD (2048 байт). Даже если файл имеет размер менее 2-х КБ (например, 218 байт), то в архиве он будет занимать 2 КБ. Файлы в архиве, как правило, не сортированы, не сжаты и располагаются "друг за другом" (никакой древовидной иерархии).

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

Содержимое DIR представляет собой массив элементов по 32 байта на каждый:

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

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

В IMG-архиве файлы, как говорилось ранее, расположены в блоках по 2 КБ.

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

В GTA LCS и VCS к первой версии относятся только архивы CUTS.IMG, MOCAP.IMG, GTA3PS2.IMG, GTA3PSP.IMG и GTA3PSPHR.IMG, все остальные относятся к версии 1А. Кроме того, такие игры используются, к примеру, в Bully: Schoolarship Edition.

У GTA3PS2.IMG, GTA3PSP.IMG и GTA3PSPHR.IMG есть своя особенность - отсутствие вышеописанного DIR-файла в открытом виде из-за того, что данные архивы загружаются игрой через несколько DIR - свой для объектов анимации, динамических объектов и свой для текстур.

Дополнительные архивы

При помощи gta_vc.dat или gta.dat можно подключать к игре свои IMG-архивы. Формат следующий:

CDIMAGE MODELS\FOO.IMG

При этом IMG и DIR должны иметь одинаковые имена и располагаться в директории ..\models\

Сжатие данных

На PS2 и PC все данные хранятся в несжатом виде, но на XBOX была добавлена компрессия данных в кодировке lzo1x-999. Декомпрессия реализована в Dffxbox2pc от Alex.

Версия 1А - GTA:LCS и GTA:VCS

Единственная особенность данной версии *.img-архивов - отсутствие DIR-файла. Общим с версией 1 осталось только то, что файлы выравнены по размеру сектора (2048 байт). Загрузка файлов из архива реализовано за счёт переходов (офсетов) из определённых точек ведущего (master WRLD) в ведомые (slave WRLD) файлы архивов. Для того, чтобы распаковать всё содержимое архивов, нужно распаковать master WRLD из архива с расширением LVZ (с помощью любого Zlib-распаковщика, например встроенного в Stories WRLD Tool) и найти там таблицы начал для slave WRLD и подчинённых к ним текстур радаров, по которым можно определить, к какой части карты относится содержимое slave WRLD. Каждая строка, состоящая из 32 байт, является глобальным заголовком slave WRLD и в конце содержит офсет на продолжение в одноимённом с LVZ *.img-архиве. Автоматическую распаковку таких архивов производит утилита unimg. Извлечение WRLD из *.img, а так же просмотр и извлечение ресурсов из WRLD реализовано в Stories WRLD Tool, просмотр и редактирование текстур в WRLD возможно с помощью GTA Stories Texture Explorer. Однако, так как теоретически, DIR-файл для такого архива может быть построен. Для того чтобы создать такой архив, нужно либо извлечь таблицу файлов из game.dtz, либо составить "безымянный" DIR на основе поиска заголовков файлов, например, при по помощи программы YAIE.

Версия 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]  - имя файла

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

Дополнительные архивы

При помощи gta.dat можно подключать к игре свои IMG-архивы. Формат следующий:

IMG MODELS\FOO.IMG

Изначально, GTA San Andreas поддерживает 8 IMG-архивов, 5 из которых можно подключить через gta.dat. Данный лимит можно поднять, воспользовавшись IMG Limit Adjuster.

Версия 3 - GTA IV

Данная версия архива имеет более сложную структуру. Общим со старыми версиями осталось только то, что файлы выравнены по размеру сектора (2048 байт). Каталог архива может быть зашифрован.

Заголовок

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

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

Каталог архива

Каталог архива состоит из двух частей: описателей файлов, содержащих смещение и размер файла внутри архива и имен файлов. В зависимости от способа загрузки файла, формат полей описателя может отливаться. Для RSC, указывается размер и количество выделяемых блоков памяти (страниц), для обычных файлов, указывается общая длина.

Определить, какой из форматов описателя используется (RSC/не RSC), можно по старшему биту поля dwLength (для RSC он равен 1)

В начале идет массив описателей по 16 байт:

Размер Имя поля Назначение RSC-файлы Остальные файлы
4 byte - DWORD dwLength Размер объекта в памяти Поле флагов из заголовка RSC Размер объекта
4 byte - DWORD dwVersion Версия ресурса Поле версии из заголовка RCS не используется
4 byte - DWORD dwOffset Позиция в IMG Смещение в блоках Смещение в блоках
2 byte - WORD wSectorCount Размер объекта на диске Кол-во блоков Кол-во блоков
2 byte - WORD wPaddingSize Размер объекта на диске PaddingSize+установлен бит 13 PaddingSize

PaddingSize - Размер неиспользуемого места в последнем блоке

За описателями следуют имена файлов, разделенные '\x0' (нулевым байтом), в том же порядке, что и описатели.

Чтение зашифрованных архивов

Если идентификатор архива не равен 0xA94E2A52, архив считается зашифрованным. Для чтения такого архива, следует прочитать заголовок (20 байт), но дешифровать только первые 16 байт. После этого, следует снова проверить идентификатор. Если идентификатор корректный, следует считать каталог (размер берется из расшифрованного заголовка) и дешифровать его, округлив размер до числа кратного 16, вниз. (Например, если указан размер 259 байт, дешифруются только первые 256).

Шифрование - стандартное для IV - AES.

Ссылки

Компоненты для работы с IMG, RPF, WTD для Delphi

п · о · р
San Andreas Grand Theft Auto: San Andreas
Форматы файлов.col.cfg.cut.dff.dat.fxp.gxt.ide.ifp.img.ipl.rep.rrr.scm.txd.set
Документацияcarcols.datCarrecPed EventsPed TypeАдреса Памяти Функций (SA)Анимация моделей в SAВизуальные эффекты в скриптинге
Загруженные звукиКатсценыНомера оружияРисование на экранеТрюки с меткамиСтатистикаСтруктура аудио в SABeta версия
ИнструментыCLEOCollision File Editor IIENBSeriesG-ToolsGXT EditorIMG ToolPS2 TXD ModPS2 TXD ViewerLimit AdjusterMap EditorPathViewer
San Andreas Audio ToolkitSan Andreas Texture PlacerSanny BuilderTXD WorkshopTXDFuckerXBOX TXD PowerTool
ТуториалыРедактирование аудио в SAИзменение cutsceneDecision MakerПропуск роликовКонвертация автомобилей в SA
Основы маппинга GTA:SAДелаем ломающиеся объектыКонвертирование персонажа в SA2dfx в SanAndreasМоддинг San Andreas v2.0
Новая анимация персонажейУниверсальный солдат (GTA SA)
МодыAlien CityDesign Your Own MissionGTA: UnitedGTA StoriesGTA Berlin
МультиплеерgtaTournamentMulti Theft AutoSan Andreas Multiplayer
п · о · р
Vice City Grand Theft Auto: Vice City
Форматы файлов.adf.col.cfg.dff.dat.gxt.ide.ifp.img/.dir.ipl.raw/.sdt.rep.sc.scm.set.txd.zon
ИнструментыCLEOClump ViewerCol-IO‎Collision File Editor IIData toolDFF Viewerdffxbox2pcG-ToolsGame Archive Viewer
GTA Garage Mod ManagerGTA3 Script CompilerGXT EditorIMG ToolKam's Max ScriptsMap EditorMod GeneratorMod InstallerMoo Mapper
PS2 TXD ModPS2 TXD ViewerResourse HackerRotation CalculatorRW AnalyzeSanny BuilderTXD Workshop
TXD_2048TXDFuckerVC Limit AdjusterVC Mission BuilderViceTXDVC SeterVCFCToolWater EditorYAIEZModeler
МодификацииUltimate VCModern ModSnow ModDeluxeMilleniumNew AgeKiller KipAliens vs. Predator
GTA Long NightGTA Liberty CityGTA Myriad IslandsGTA State Of Liberty
ОтечественныеМентовский БеспределCделано в СССРUndergroundLost HeavenКыштымНостальгияXBox Mod (Коктейль)
МультиплейерMulti Theft AutoVice City Online
п · о · р
GTA III Grand Theft Auto III
Форматы файлов.b.a3d.anm.col.cfg.dff.dat.gxt.ide.ifp.img/.dir.ipl.raw/.sdt.rep.sc.scm.set.txd.zon
Документацияcarcols.datCHASE.DATCULLZONE.DATcuts.imgdefault.datfistfite.datflight.datgta3.exegta3.dat
gta3.imggta3.zonhandling.cfgmain.scmmap.datmap.zonobject.datparticle.cfgped.datpedgrp.dat
pedstats.datsfx.rawsurface.datTimeCyc.DATtracks.dattrain.datwater.datwaterpro.datweapon.dat
ИнструментыCLEOClump ViewerCol-IO‎Collision File Editor IIData toolDFF Viewerdffxbox2pcG-ToolsGTA Garage Mod Manager
GXT EditorGTA3 Limit AdjusterGTA3 Mission BuilderGTA3 PatcherIMG ToolKam's Max ScriptsMap Editor
Mod GeneratorMod InstallerMoo MapperPS2 TXD ModPS2 TXD ViewerResourse HackerRotation Calculator
RW AnalyzeViceTXDWater EditorSanny BuilderTXD ToolTXD WorkshopYAIEZModeler
Туториалыраздел в разработке
Классические МодыGPS RadarBye-Bye BikiniUltimate Stunt ParkThe SphereMiss LibertyIllandoIntercity HighwayShoreside Bridge
Rockstar HeightsLighthouse BridgeBlade FunparkOrbital CityLakeside IslandLiberty PenitentiaryJEM Island
Illando HelixCliff Climbing Mountain
Глобальные МодыReal GTA3Twenty TenSnow CityFrosted WinterUltimateBeta modX-box modBad BusinessGTA3 HDUltra mod
OpenTunnelsBack to the Future
МультиплеерMulti Theft AutoLiberty Unleashed
Исходники4x48ballambulanceasukaasusbcameracar_gencatcopcardebugdemodiablofiretruckfrankgates
genstufhealthhjhoodimportintrojoeykenjiloveluigimayhemmeatpickupsrampagerayrcswitch
taxitoniusjwantedyard