GAME.PAK (Chinatown Wars)
Материал из GTAModding.ru
Версия от 15:29, 21 мая 2015; DK22 (обсуждение | вклад)
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; }