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

Материал из GTAModding.ru
Перейти к: навигация, поиск
м
м (Ссылки)
 
(не показаны 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(ranges[i] == 0xFFFFFFFF)
 
            break;
 
 
         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