JSD format description


JSD (JA2 Structure Data) формат

by pipetz

 

Формат JSD используется в игре Jagged Alliance 2 для хранения информации

о физических свойствах объектов. 

 

 

 

Заголовок файла (16 байт, структура STRUCTURE_FILE_HEADER). 

 

Структура STRUCTURE_FILE_HEADER описана в TileEngine\Structure Internals.h

 

1-4 байты - символы “J2SD” идентификатор формата.

5-6 байты - (usNumberOfStructures) число структур\изображений связанных с объектом.

    По видимому всегда равно числу изображений в одноимённом STI-файле.

7-8 байты - (usNumberOfStructuresStored) число структур описанных в данном файле.  

    Может быть меньше чем число структур\изображений связанных с объектом. Бывает,  

    что не для каждого изображения хранящегося в одноимённом STI-файле нужна структура.  

    Для файлов типа 1 всегда равен 0. О типах ниже.

9-10 байты - суммарный размер структур в байтах. Для файлов типа 1 всегда

     равен 0. О типах ниже.

11 - байт - флаги. Определяют тип файла.  

 1 бит - равен 1 если файл содержит вспомогательную информацию.

 2 бит - равен 1 если файл содержит информацию о структурах.

 3-8 биты - не используются.

  Таким образом существует три типа JSD-файлов 1(00000001), 2(00000010) и 3(00000011).  

  3 тип содержит и вспомогательную и структурную информацию.  

12-14 байты  - не используются

15-16 байты - (usNumberOfImageTileLocsStored) не равен нулю только для некоторых  

      файлов типа 1. Назначение не ясно. По видимому всегда равен сумме значений

      поля ubNumberOfTiles по всем записям вспомогательных данных.

 

Для файлов типа 1 после 16-го байта идут записи вспомогательных данных.  

Суммарный размер - (число структур\изображений связанных с объектом) * 16.

Для файлов типа 2 после 16-го байта идут структурные данные.

Для файлов типа 3 после 16-го байта сначала записи вспомогательных данных,  

а потом структурные данные. 

 

Вспомогательные данные.

 

Записи вспомогательных данных загружаются в структуры AuxObjectData. Это таже структура,

что используется для загрузки данных приложения (Application Data) STI-файлов.

Aux - повидимому сокращение от "auxiliary" - вспомогательный.

 

Структура AuxObjectData описана в Standard Gaming Platform\imgfmt.h.

 

1 байт - ориентация стены (ubWallOrientation).

2 байт - количество тайлов (ubNumberOfTiles). Почти всегда равен 0. Когда больше нуля

         равен числу тайлов, занимаемых объектом. Не понятно чем определяется равенство  

         или неравенство нулю этого байта. Понятно, что ни один объект 0 тайлов не  

         занимает. :)

3-4 байты - смещение в тайлах первого тайла объекта, если пронумеровать по порядку все  

           тайлы всех объектов. Для превого объекта равен 0, для второго число тайлов  

           в первом, и т. д.

5-7 байты - не используются.

8 байт – порядковый номер кадра. Не равен нулю только для анимированых структур.

9 байт – равен числу изображений.

10 байт – флаги.

 1 бит - (AUX_FULL_TILE)

 2 бит - 1 если файл анимироанный (AUX_ANIMATED_TILE)

 3 бит - (AUX_DYNAMIC_TILE)

 4 бит - (AUX_INTERACTIVE_TILE)

 5 бит - (AUX_IGNORES_HEIGHT)

 6 бит - (AUX_USES_LAND_Z )

 7-8 бит - не используются.

11-16 байты – не используются.  

 

 

Структурные данные.

 

Структурные данные содержат для каждой структуры описанной в JSD-файле следующую информацию.

- Заголовок структуры (16 байт)

- Тайловые структуры ((число тайлов) * 32 байта) 

 

Заголовок структуры (16 байт, структура DB_STRUCTURE). 

 

Структура DB_STRUCTURE описана в TileEngine\Structure Internals.h.

 

1 байт - (ubArmour) Броня. Принимает значения от 0 до 26, все значения поименованы в

         в перечислении, которое описано в файле TileEngine\structure.h. Стоит заметить,  

         что значение этого байта не определяет велечину бронированности. ubArmour -  

         это индекс в массиве gubMaterialArmour[] =  

         {0,25,20,30,3,10,47,10,0,0,0,55,63,70,85,9,40,1,40,0,0,37,57,85,127,127, 57};  

         Описание этого массива в коде сопровождают интереные комментарии, которые здесь

         приводить не буду. Бронированность влияет на повреждение наносимые объекту.  

         На снижение скорости пули при прохождении через структуру. На звуки издаваемые

         при попадании, ударе, открывании/закрытии;

2 байт - (ubHitPoints) Живучесть. Урон, который надо нанести объекту для его разрушения;

3 байт - (ubDensity) Плотность. Принимает значения от 0 до 100. Влияет на вероятность  

         прохождения пули сквозь объект, на вероятность нанесения критического урона  

         (и на прозрачность/просматриваемость?);

4 байт - (ubNumberOfTiles) число тайлов занимаемых структурой

5-8 байты - флаги. Определяют тип структуры.

 1 бит - STRUCTURE_BASE_TILE.

 2 бит - STRUCTURE_OPEN

 3 бит - STRUCTURE_OPENABLE/STRUCTURE_CLOSEABLE/STRUCTURE_SEARCHABLE

 4 бит - STRUCTURE_HIDDEN

 5 бит - STRUCTURE_MOBILE

 6 бит - STRUCTURE_PASSABLE

 7 бит - STRUCTURE_EXPLOSIVE

 8 бит - STRUCTURE_TRANSPARENT

 9 бит - STRUCTURE_GENERIC

 10 бит - STRUCTURE_TREE

 11 бит - STRUCTURE_FENCE

 12 бит - STRUCTURE_WIREFENCE

 13 бит - STRUCTURE_HASITEMONTOP            

 14 бит - STRUCTURE_SPECIAL

 15 бит - STRUCTURE_LIGHTSOURCE

 16 бит - STRUCTURE_VEHICLE

 17 бит - STRUCTURE_WALL

 18 бит - STRUCTURE_WALLNWINDOW

 19 бит - STRUCTURE_SLIDINGDOOR

 20 бит - STRUCTURE_DOOR

 21 бит - STRUCTURE_MULTI

 22 бит - STRUCTURE_CAVEWALL

 23 бит - STRUCTURE_DDOOR_LEFT

 24 бит - STRUCTURE_DDOOR_RIGHT

 25 бит - STRUCTURE_NORMAL_ROOF

 26 бит - STRUCTURE_SLANTED_ROOF

 27 бит - STRUCTURE_TALL_ROOF

 28 бит - STRUCTURE_SWITCH

 29 бит - STRUCTURE_ON_LEFT_WALL

 30 бит - STRUCTURE_ON_RIGHT_WALL

 31 бит - STRUCTURE_CORPSE

 32 бит - STRUCTURE_PERSON

9-10 байты - порядковай номер структуры.

11 байт - (ubWallOrientation) ориентация стены.

12 байт - (bDestructionPartner) Определяет индекс в тайлсете изображения объекта  

          после разрушения. Как определяет не совсем понятно. В коде вот такой  

          комментарий: >0 = debris number (bDP - 1), <0 = partner graphic  

13 байт - (bPartnerDelta) Определяет разность индексов в тайлсете открытой и  

          закрытой структуры (например двери).

14 байт - (bZTileOffsetX)

15 байт - (bZTileOffsetY) 14, 15 байты по видимому, определяют дополнительные  

          смещения при отрисовке нескольких объектов на одном тайле. Определяют  

          как-то так:  

        sOffsetX = sOffsetX - pDBStructure->bZTileOffsetX * (WORLD_TILE_X / 2) +  

          pDBStructure->bZTileOffsetY * (WORLD_TILE_X / 2);

        sOffsetY = sOffsetY - pDBStructure->bZTileOffsetY * (WORLD_TILE_Y / 2);  

          почему так не совсем понятно. WORLD_TILE_X = 40 - ширина тайла в пикселях.

          WORLD_TILE_Y = 20 - высота тайла в пикселях.

16 байт - не используется. 

 

Тайловая структура (32 байта, структура DB_STRUCTURE_TILE). 

 

Структура DB_STRUCTURE_TILE описана в TileEngine\Structure Internals.h.

 

1-2 байт - (sPosRelToBase) Судя по всему, смещение порядкового номера тайла относительно

           порядкового номера базового (первого) тайла объекта. Почему-то очень часто

           равен 0.

3 байт - (bXPosRelToBase) Смещение тайла относительно базового по оси X.

4 байт - (bYPosRelToBase) Смещение тайла относительно базового по оси Y.

5-29 байты - (Shape) Форма тайла. Байты в этом массиве принимают значения от 0 (0000)  

          до 15 (1111). Тайл разбивается на 25 частей, 5 строк и 5 столбцов. Таким  

          образом, каждый байт массива соответствует столбику из 4 кубиков стоящему  

          на одной из 25 частей тайла. Если какой-то из 4 бит байта равен 1, то  

          соответствующий кубик считается заполненным структурой. Другими словами

          кубик с координатами X, Y, Z будет заполнен если  

          (Shape[X * 5 + Y] / 2Z) % 2 = 1.

          Кажеться так.

30 байт - (fFlags) флаги.

 1 бит - тайл находится на уровне крыши.

 2 бит - тайл доступен для прохода.

 3-8 биты - не используются.

31 байт - (ubVehicleHitLocation) местоположение удара по транспортному средству.

          По видимому нигде не используется.  

32 байт - не используетя. 

 

Схема расположения данных JSD-файла типа 3. У файла типа 1 нет структурных данных (синий прямоугольник), у файлов типа 2 нет вспомогательных данных (зелёный прямоуольник).

 

 

 

 

JSD Editor

 

 

 

by Терапевт

 

Здесь будем собирать информацию о формате JSD.

Просьба сильно не флудить. ;)

Вот что удалось понять на данный момент.

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

Структура описывающая 16 байтный заголовок файла JSD.

typedef struct TAG_STRUCTURE_FILE_HEADER

{

 CHAR8  szId[4];

 union

 {

  struct

  {

   UINT16 usNumberOfStructures;

  };

  struct

  {

   UINT16 usNumberOfImages;

  };

 };

 UINT16 usNumberOfStructuresStored;

 UINT16 usStructureDataSize;

 UINT8 fFlags;

 UINT8 bUnused[3];

 UINT16 usNumberOfImageTileLocsStored;

} STRUCTURE_FILE_HEADER; // 16 bytes

Поле szID[4] содержит идентификатор файла "J2SD".

Поле usNumberOfStructures (2 байта) содержит число страниц в соответствующем STI-файле.

Поле usNumberOfImages (2 байта) содержат количество страниц данных в файле JSD.

Поле usNumberOfStructuresStored (2 байта) содержит длину файла JSD (размер сохранённых данных) без 16 байтного заголовка файла.

Остальное пока не понятно.

У каждой страницы, составляющей JSD-файл, есть 16 байтный заголовок, за которым идут, собственно, данные о тайлах, описываемых страницей.

Его описывает следующая структура.

typedef struct TAG_DB_STRUCTURE

{

 UINT8  ubArmour;

 UINT8  ubHitPoints;

 UINT8  ubDensity;

 UINT8  ubNumberOfTiles;

 UINT32  fFlags;

 UINT16  usStructureNumber;

 UINT8  ubWallOrientation;

 INT8  bDestructionPartner; // >0 = debris number (bDP - 1), <0 = partner graphic  

 INT8  bPartnerDelta; // opened/closed version, etc... 0 for unused

 INT8  bZTileOffsetX;

 INT8  bZTileOffsetY;

 BYTE  bUnused[1];

} DB_STRUCTURE; // 16 bytes

Я думаю, что многое понятно из названий.

Поле ubArmour (1 байт) видимо определяет численное значение брони объекта.

Поле ubHitPoints (1 байт) вероятно содержит величину "жизни" объекта.

Поле ubDensity (1 байт) - что-то вроде плотности (?) объекта.

Поле ubNumberOfTiles (1 байт) определяет число тайлов (клеток), занимаемых объектом.

Поле fFlags (4 байта) - флаги.

Поле usStructureNumber (2 байта) содержит номер соответствия страницы в STI-файле.

С остальными полями ещё нужно разбираться.

Каждый тайл объекта в странице описывается следующей 32 байтной структурой.

typedef struct TAG_STRUCTURE_TILE

{

 INT16  sPosRelToBase;  // "single-axis"

 INT8  bXPosRelToBase;

 INT8  bYPosRelToBase;

 PROFILE  Shape;  // 25 bytes

 UINT8  fFlags;

 UINT8  ubVehicleHitLocation;

 BYTE  bUnused[1];

} DB_STRUCTURE_TILE; // 32 bytes

Тут пока что-то прокомментировать сложно.