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.