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(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 - Навявность альфа-канала # Присутствует только в Android-версии 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 цветов) |
Ссылки
- Chinatown Wars Mobile Explorer - программа для просмотра содержимого файлов GAME.PAK (Mobile, частично PSP), ROM.WAD (Mobile, PSP) и DXT.bin (Mobile)
- GXT tools for GTA Chinatown Wars - набор программ для редактирования текста (файлы GXT, а также параметры шрифтов в файлах BIN) в GTA Chinatown Wars