GAME.PAK (Chinatown Wars) — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
м (Представление дробных чисел)
м (Представление дробных чисел)
Строка 86: Строка 86:
 
  FIXED16 - 16-битное число, в котором нижние 12 бит отведены на дробную часть и следующие 4 бит - на целую
 
  FIXED16 - 16-битное число, в котором нижние 12 бит отведены на дробную часть и следующие 4 бит - на целую
  
Таким образом, тип FIXED32 может представлять числа в дипазоне (524288.0; -524289.0), а тип FIXED16 - (8.0; -9.0). Погрешность (или "шаг") дробной части составляет ~0,000244.
+
Таким образом, тип FIXED32 может представлять числа в дипазоне (524288.0; -524288.0], а тип FIXED16 - (8.0; -8.0]. Погрешность (или "шаг") дробной части составляет ~0,000244.
  
 
Для получения числа с плавающей запятой достаточно разделить число с фиксированной запятой на 4096 (2^12):
 
Для получения числа с плавающей запятой достаточно разделить число с фиксированной запятой на 4096 (2^12):

Версия 14:00, 22 мая 2015

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(resourceId >= ranges[i])
            offset += 0x8000000;
        else
            break;
    }
    return offset + resourcesOffset;
}

Ресурсы

Mobile (Android, iOS)

Представление дробных чисел

Для арифметики дробных чисел в Mobile версии используются числа с фиксированной запятой.

FIXED32 - 32-битное число, в котором нижние 12 бит отведены на дробную часть и следующие 20 бит - на целую
FIXED16 - 16-битное число, в котором нижние 12 бит отведены на дробную часть и следующие 4 бит - на целую

Таким образом, тип FIXED32 может представлять числа в дипазоне (524288.0; -524288.0], а тип FIXED16 - (8.0; -8.0]. Погрешность (или "шаг") дробной части составляет ~0,000244.

Для получения числа с плавающей запятой достаточно разделить число с фиксированной запятой на 4096 (2^12):

// fixed32 - 32-битное число с фиксированной запятой
float fixedToFloat(int fixed32)
{
    return (float)fixed32 / 4096.0f
}
 
// fixed16 - 16-битное число с фиксированной запятой
float fixedToFloat(short fixed16)
{
    return (float)fixed16 / 4096.0f
}

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

Текстуры

2b - USHORT   - Ширина
2b - USHORT   - Высота
2b - USHORT   - Формат пиксельных данных
1b - UCHAR    - Глубина цвета
1b - BOOL     - Навявность альфа-канала
4b - UINT     - Размер пиксельных данных (может быть неверным, если пиксельные данные хранятся в формате с компрессией)
Xb - UCHAR[X] - Пиксельные данные

Пиксельные данные могут храниться в таких форматах:

Формат Название Описание
0x1906 PIXEL_ALPHA 8-битный A
0x1907 PIXEL_RGB 32-битный или 16-битный XRGB
0x1908 PIXEL_RGBA 32-битный или 16-битный ARGB
0x1909 PIXEL_LUMINANCE 8-битный L
0x190A PIXEL_LUMINANCE_ALPHA 16-битный AL
0x8032 PIXEL_PACKED_R3G3B2 16-битный RGB
0x8033 PIXEL_PACKED_A4R4G4B4 16-битный ARGB
0x8034 PIXEL_PACKED_A1R5G5B5 16-битный ARGB
0x8035 PIXEL_PACKED_A8R8G8B8 32-битный ARGB
0x8036 PIXEL_PACKED_A2R10G10B10 32-битный ARGB
0x8363 PIXEL_RGB 32-битный или 16-битный XRGB
0x83F0 PIXEL_DXT1_RGB Компрессия DXT1
0x83F3 PIXEL_DXT5_RGB Компрессия DXT5
0x87EE PIXEL_ATC_RGBA Компрессия ATC
0x8C00 PIXEL_PVRTC_RGBA Компрессия PVRTC
0x8C01 PIXEL_PVRTC_RGBA Компрессия PVRTC
0x8C02 PIXEL_PVRTC_RGBA Компрессия PVRTC
0xBEEF PIXEL_PNG_RGBA Пиксельные данные - это PNG-файл (включая заголовки)

Модели

Блоки карты

PSP

Текстуры

4b - UINT        - Формат пиксельных данных
1b - UCHAR       - Ширина в виде степени двойки
1b - UCHAR       - Высота в виде степени двойки
1b - UCHAR       - Неизвестно (обычно 0)
1b - BOOL        - Навявность альфа-канала
4b - UINT        - Неизвестно (обычно 0)
4b - UINT        - Общий размер пиксельных данных и палитры
Xb - UCHAR[X]    - Пиксельные данные (размер пиксельных данных рассчитывается на основе формата и размеров тектсуры)
Xb - UCHAR[4][X] - Палитра (RGBA; от 1 до 16/256 цветов (зависит от формата))

Пиксельные данные могут храниться в таких форматах:

Формат Название Описание
4 PIXEL_PAL4 4-битная палитра (максимум 16 цветов)
5 PIXEL_PAL8 8-битная палитра (максимум 256 цветов)