GAME.PAK (Chinatown Wars) — различия между версиями
Материал из GTAModding.ru
DK22 (обсуждение | вклад) м |
DK22 (обсуждение | вклад) м (→Ссылки) |
||
(не показаны 10 промежуточных версий 1 участника) | |||
Строка 67: | Строка 67: | ||
for(int i = 0; i < 8; i++) // 2 итерации вместо 8, если версия файла - 'PK01' | for(int i = 0; i < 8; i++) // 2 итерации вместо 8, если версия файла - 'PK01' | ||
{ | { | ||
− | |||
− | |||
if(resourceId >= ranges[i]) | if(resourceId >= ranges[i]) | ||
offset += 0x8000000; | offset += 0x8000000; | ||
Строка 80: | Строка 78: | ||
= Ресурсы = | = Ресурсы = | ||
− | == Таблицы ресурсов == | + | == 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): | ||
+ | <source lang="cpp"> | ||
+ | // fixed32 - 32-битное число с фиксированной запятой | ||
+ | float fixedToFloat(int fixed32) | ||
+ | { | ||
+ | return (float)fixed32 / 4096.0f; | ||
+ | } | ||
+ | |||
+ | // fixed16 - 16-битное число с фиксированной запятой | ||
+ | float fixedToFloat(short fixed16) | ||
+ | { | ||
+ | return (float)fixed16 / 4096.0f; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | === Таблицы ресурсов === | ||
+ | |||
+ | === Текстуры === | ||
+ | |||
+ | 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 цветов) | ||
+ | |} | ||
+ | = Ссылки = | ||
+ | *[http://gtaforums.com/topic/781150-relctw-chinatown-wars-mobile-resource-explorer/ Chinatown Wars Mobile Explorer] - программа для просмотра содержимого файлов GAME.PAK (Mobile, частично PSP), ROM.WAD (Mobile, PSP) и DXT.bin (Mobile) | ||
+ | *[https://github.com/DK22Pac/ctw-gxt-tools GXT tools for GTA Chinatown Wars] - набор программ для редактирования текста (файлы GXT, а также параметры шрифтов в файлах BIN) в GTA Chinatown Wars | ||
[[Категория:Форматы файлов]] | [[Категория:Форматы файлов]] |
Текущая версия на 10:10, 19 марта 2016
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