GAME.PAK (Chinatown Wars)

Материал из GTAModding.ru
Перейти к: навигация, поиск

GAME.PAK - основной архив ресурсов GTA Chinatown Wars. Используется во всех версиях игры (Android, iOS, PSP, Nintendo DS). Формат архива и ресурсов одинаковый в Android и iOS версиях, в версии для PSP используется другой формат. GAME.PAK содержит такие ресурсы, как:

  • текстуры
  • модели
  • аналоги .dat файлов из других серий GTA (в бинарном виде)
  • таблицы ресурсов (ресурс, который ссылается на другие ресурсы)
  • блоки карты - ресурс, который одновременно содержит модели карты (здания, дороги и пр.) и информацию об их расположении

Содержание

Общая структура файла

Mobile (Android, iOS)

4b     - UINT          - Версия файла (обычно 1)
12b    - UINT[3]       - "Границы" запаковки ресурсов
4b     - UINT          - Количество ресурсов в архиве
4b     - UINT          - Число, используемое для расчёта офсета второй таблицы ресурсов (для получения офсета это число умножается на 4096)
4072b  - USHORT[2036]  - Первая таблица офсетов - числа, используемые для расчёта офсета ресурсов
Xb     - UCHAR[X]      - Ресурсы (каждый ресурс выравнен в размере в 4096 байт)
Xb     - USHORT[X]     - Вторая таблица офсетов - числа, используемые для расчёта офсета ресурсов

Общее кол-во офсетов в таблицах равно кол-ву ресурсов. Для расчёта офсета ресурса применяется такой алгоритм:

// resourceId - Id ресурса
// pResourceOffsets - указатель на массив/массив чисел из двух таблиц ресурсов (числа из второй таблицы следуют за числами из первой)
// ranges - массив чисел, "границы" запаковки ресурсов
unsigned int getResourceOffset(unsigned int resourceId)
{
    unsigned int offset = pResourceOffsets[resourceId] * 4096;
    if(resourceId >= ranges[0])
    {
        if(resourceId >= ranges[1])
        {
            if(resourceId >= ranges[2])
                offset += 0x30000000;
            else
                offset += 0x20000000;
        }
        else
            offset += 0x10000000;
    }
    return offset;
}

PSP

4b     - UINT          - Версия файла ('PK01' или 'PK02')
# Если версия файла - 'PK01'
8b     - UINT[2]       - "Границы" запаковки ресурсов.
# Если версия файла - 'PK02'
32b    - UINT[8]       - "Границы" запаковки ресурсов.
#
4b     - UINT          - Количество ресурсов в архиве
4b     - UINT          - Офсет на ресурсы (офсет на первый ресурс)
Xb     - USHORT[X]     - Таблица офсетов - числа, используемые для расчёта офсета ресурсов (кол-во офсетов равно кол-ву ресурсов)
Xb     - UCHAR[X]      - Выравнивание (в 2048 байт)
Xb     - UCHAR[X]      - Ресурсы (каждый ресурс выравнен в размере в 2048 байт)

Для расчёта офсета ресурса применяется такой алгоритм:

// resourceId - Id ресурса
// pResourceOffsets - указатель на массив/массив чисел таблицы ресурсов
// ranges - массив чисел, "границы" запаковки ресурсов
// resourcesOffset - офсет на ресурсы
unsigned int getResourceOffset(unsigned int resourceId)
{
    unsigned int offset = pResourceOffsets[resourceId] * 2048;
    for(int i = 0; i < 8; i++) // 2 итерации вместо 8, если версия файла - 'PK01'
    {
        if(ranges[i] == 0xFFFFFFFF)
            break;
        if(resourceId >= ranges[i])
            offset += 0x8000000;
        else
            break;
    }
    return offset + resourcesOffset;
}

Ресурсы

Таблицы ресурсов

Текстуры

Модели

Блоки карты