| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

JSD format description

This version was saved 15 years ago View current version     Page history
Saved by Little Alien
on April 7, 2009 at 1:54:42 pm
 

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 нет вспомогательных данных (зелёный прямоуольник).

 

 

 

 

 

 

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

 

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

 

Comments (0)

You don't have permission to comment on this page.