Difference between revisions of "FF8/FileFormat DAT"
my_wiki>Myst6re |
m (18 revisions imported) |
||
(15 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
− | By Mirex, JWP and myst6re. | + | By Mirex, JWP, random_npc and myst6re. |
+ | Edit: We now know the animation and skeleton- see https://github.com/MaKiPL/OpenVIII/blob/4ac151daad7cd1475eb0694dd0715bc35d7a4b39/FF8/debug_battleDat.cs | ||
== Header == | == Header == | ||
Line 35: | Line 36: | ||
|- | |- | ||
|style="background:rgb(255,255,204)" | 2 | |style="background:rgb(255,255,204)" | 2 | ||
− | |style="background:rgb(255,255,204)" | 14 bytes | + | |style="background:rgb(255,255,204)" | 6 bytes |
+ | |style="background:rgb(255,255,204)" | Unknown | ||
+ | |- | ||
+ | | 8 | ||
+ | | s16f (divide by 4096f) | ||
+ | | scaleX | ||
+ | |- | ||
+ | | 10 | ||
+ | | s16f (divide by 4096f) | ||
+ | | scale -Z | ||
+ | |- | ||
+ | | 12 | ||
+ | | s16f (divide by 4096f) | ||
+ | | scale Y | ||
+ | |- | ||
+ | |style="background:rgb(255,255,204)" | 14 | ||
+ | |style="background:rgb(255,255,204)" | 2 bytes | ||
|style="background:rgb(255,255,204)" | Unknown | |style="background:rgb(255,255,204)" | Unknown | ||
|- | |- | ||
Line 56: | Line 73: | ||
|- | |- | ||
| 2 | | 2 | ||
− | | | + | | s16f (divide by 4096f) |
− | | Bone size | + | | Bone size (?) |
+ | |- | ||
+ | | 4 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown, multiplied by 360f | ||
+ | |- | ||
+ | | 6 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown, multiplied by 360f | ||
+ | |- | ||
+ | | 8 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown, multiplied by 360f | ||
+ | |- | ||
+ | | 10 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown | ||
+ | |- | ||
+ | | 12 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown | ||
+ | |- | ||
+ | | 14 | ||
+ | | s16f (divide by 4096f) | ||
+ | | unknown | ||
|- | |- | ||
− | |style="background:rgb(255,255,204)" | | + | |style="background:rgb(255,255,204)" | 16 |
− | |style="background:rgb(255,255,204)" | | + | |style="background:rgb(255,255,204)" | 28 bytes |
|style="background:rgb(255,255,204)" | Unknown (often empty) | |style="background:rgb(255,255,204)" | Unknown (often empty) | ||
|} | |} | ||
Line 80: | Line 121: | ||
| nbObjects * 4 bytes | | nbObjects * 4 bytes | ||
| Object Positions | | Object Positions | ||
+ | |- | ||
+ | | 4 + nbObjects * 4 | ||
+ | | Varies | ||
+ | | Object Data (see below) | ||
+ | |- | ||
+ | | Varies | ||
+ | | 4 bytes | ||
+ | | Total count of vertices | ||
|} | |} | ||
Line 95: | Line 144: | ||
| 2 | | 2 | ||
| Varies * NbVerticesData | | Varies * NbVerticesData | ||
− | | Vertices Data | + | | Vertices Data (see below) |
|- | |- | ||
| Varies | | Varies | ||
− | | absolutePosition % 4 | + | | 4 - (absolutePosition % 4) |
| Padding (0x00) | | Padding (0x00) | ||
|- | |- | ||
Line 111: | Line 160: | ||
| Varies | | Varies | ||
| 8 bytes | | 8 bytes | ||
− | | | + | | Always empty |
|- | |- | ||
| Varies | | Varies | ||
Line 120: | Line 169: | ||
| numQuads * 20 bytes | | numQuads * 20 bytes | ||
| Quads | | Quads | ||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
Line 148: | Line 193: | ||
==== Useful structures ==== | ==== Useful structures ==== | ||
− | + | struct vertice { | |
sint16 x, y, z; | sint16 x, y, z; | ||
− | } | + | }; |
(sizeof = 6) | (sizeof = 6) | ||
− | + | struct triangle { | |
− | uint16 vertex_indexes[3]; | + | uint16 vertex_indexes[3]; // vertex_indexes[0] &= 0xFFF, other bits are unknown |
uint8 texCoords1[2]; | uint8 texCoords1[2]; | ||
uint8 texCoords2[2]; | uint8 texCoords2[2]; | ||
Line 160: | Line 205: | ||
uint8 texCoords3[2]; | uint8 texCoords3[2]; | ||
uint16 u; // textureID_related2 | uint16 u; // textureID_related2 | ||
− | } | + | }; |
(sizeof = 16) | (sizeof = 16) | ||
− | + | struct quad { | |
− | uint16 vertex_indexes[4]; | + | uint16 vertex_indexes[4]; // vertex_indexes[0] &= 0xFFF, other bits are unknown |
uint8 texCoords1[2]; | uint8 texCoords1[2]; | ||
uint16 textureID_related; | uint16 textureID_related; | ||
Line 171: | Line 216: | ||
uint8 texCoords3[2]; | uint8 texCoords3[2]; | ||
uint8 texCoords4[2]; | uint8 texCoords4[2]; | ||
− | } | + | }; |
(sizeof = 20) | (sizeof = 20) | ||
Line 190: | Line 235: | ||
| nbAnimations * 4 bytes | | nbAnimations * 4 bytes | ||
| Animations Positions | | Animations Positions | ||
+ | |} | ||
+ | |||
+ | === Animation === | ||
+ | |||
+ | {| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;" | ||
+ | ! style="background:rgb(204,204,204)" | Offset | ||
+ | ! style="background:rgb(204,204,204)" | Length | ||
+ | ! style="background:rgb(204,204,204)" | Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | 1 byte | ||
+ | | Number of frames | ||
+ | |- | ||
+ | |style="background:rgb(255,255,204)" | 1 | ||
+ | |style="background:rgb(255,255,204)" | Varies | ||
+ | |style="background:rgb(255,255,204)" | Unknown | ||
|} | |} | ||
== Section 4: Unknown == | == Section 4: Unknown == | ||
− | + | Optional section, often empty. | |
== Section 5: Unknown == | == Section 5: Unknown == | ||
Line 241: | Line 302: | ||
| 32 | | 32 | ||
| 4 bytes | | 4 bytes | ||
− | | | + | | Vit values |
|- | |- | ||
| 36 | | 36 | ||
| 4 bytes | | 4 bytes | ||
− | | | + | | Mag values |
|- | |- | ||
| 40 | | 40 | ||
Line 389: | Line 450: | ||
} | } | ||
− | kernel_id is the used table in kernel.bin. May be 0x02 (= magic) or 0x08 (= monster ability). ability_id is the ability in the selected kernel table. | + | kernel_id is the used table in kernel.bin. May be 0x02 (= magic), 0x04 (= item) or 0x08 (= monster ability). ability_id is the ability in the selected kernel table. |
=== Draw/mug/drop === | === Draw/mug/drop === | ||
typedef struct { | typedef struct { | ||
− | uint8 id_1; // magic_id for | + | uint8 id_1; // magic_id for draw, item_id for mug & drop |
− | uint8 qty_1; | + | uint8 qty_1; // quantities are always 0 for draw |
uint8 id_2; | uint8 id_2; | ||
uint8 qty_2; | uint8 qty_2; | ||
Line 406: | Line 467: | ||
== Section 8: Battle scripts/AI == | == Section 8: Battle scripts/AI == | ||
+ | {| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;" | ||
+ | ! style="background:rgb(204,204,204)" | Offset | ||
+ | ! style="background:rgb(204,204,204)" | Length | ||
+ | ! style="background:rgb(204,204,204)" | Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | 4 bytes | ||
+ | | Number of sub-sections | ||
+ | |- | ||
+ | | 4 | ||
+ | | 4 bytes | ||
+ | | Offset to AI sub-section | ||
+ | |- | ||
+ | | 8 | ||
+ | | 4 bytes | ||
+ | | Offset to text offsets | ||
+ | |- | ||
+ | | 12 | ||
+ | | 4 bytes | ||
+ | | Offset to text sub-section | ||
+ | |} | ||
+ | |||
+ | === AI === | ||
+ | {| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;" | ||
+ | ! style="background:rgb(204,204,204)" | Offset | ||
+ | ! style="background:rgb(204,204,204)" | Length | ||
+ | ! style="background:rgb(204,204,204)" | Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | 4 bytes | ||
+ | | Offset to init code | ||
+ | |- | ||
+ | | 4 | ||
+ | | 4 bytes | ||
+ | | Offset to code executed at ennemy's turn | ||
+ | |- | ||
+ | | 8 | ||
+ | | 4 bytes | ||
+ | | Offset to counterattack code | ||
+ | |- | ||
+ | | 12 | ||
+ | | 4 bytes | ||
+ | | Offset to death code | ||
+ | |- | ||
+ | |style="background:rgb(255,255,204)" | 16 | ||
+ | |style="background:rgb(255,255,204)" | 4 bytes | ||
+ | |style="background:rgb(255,255,204)" | Unknown offset | ||
+ | |} | ||
+ | |||
+ | === Texts === | ||
+ | |||
+ | Text offsets is a list of text positions (2 bytes each) in the text sub-section. | ||
== Section 9: Sounds == | == Section 9: Sounds == | ||
− | Contains AKAO sequences. | + | Contains AKAO sequences (can be empty). |
+ | |||
+ | {| border="1" cellspacing="1" cellpadding="3" align="center" style="border: 1px solid black; border-collapse: collapse;" | ||
+ | ! style="background:rgb(204,204,204)" | Offset | ||
+ | ! style="background:rgb(204,204,204)" | Length | ||
+ | ! style="background:rgb(204,204,204)" | Description | ||
+ | |- | ||
+ | | 0 | ||
+ | | 2 bytes | ||
+ | | Number of AKAOs | ||
+ | |- | ||
+ | | 2 | ||
+ | | nbAKAOs * 2 bytes | ||
+ | | AKAOs Positions | ||
+ | |- | ||
+ | | 2 + nbAKAOs * 2 | ||
+ | | 2 bytes | ||
+ | | End of section 9 | ||
+ | |- | ||
+ | | 4 + nbAKAOs * 2 | ||
+ | | Varies * nbAKAOs | ||
+ | | AKAOs | ||
+ | |} | ||
+ | |||
− | == Section 10: Sounds == | + | == Section 10: Sounds/Unknown == |
− | Contains AKAO | + | Contains AKAO sequence + unknown data (can be empty). |
== Section 11: Textures == | == Section 11: Textures == |
Latest revision as of 05:24, 23 May 2019
By Mirex, JWP, random_npc and myst6re. Edit: We now know the animation and skeleton- see https://github.com/MaKiPL/OpenVIII/blob/4ac151daad7cd1475eb0694dd0715bc35d7a4b39/FF8/debug_battleDat.cs
Contents
Header
DAT file is divided into 11 sections (except for c0m127.dat, which contains only 2 sections : 7th and 8th).
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Number of sections (always =11, except for c0m127.dat) |
4 | nbSections * 4 bytes | Section Positions |
4 + nbSections * 4 | 4 bytes | File size |
Section 1: Skeleton
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Number of bones |
2 | 6 bytes | Unknown |
8 | s16f (divide by 4096f) | scaleX |
10 | s16f (divide by 4096f) | scale -Z |
12 | s16f (divide by 4096f) | scale Y |
14 | 2 bytes | Unknown |
16 | Number of bones * 48 bytes | Bones |
Bone struct
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Parent id |
2 | s16f (divide by 4096f) | Bone size (?) |
4 | s16f (divide by 4096f) | unknown, multiplied by 360f |
6 | s16f (divide by 4096f) | unknown, multiplied by 360f |
8 | s16f (divide by 4096f) | unknown, multiplied by 360f |
10 | s16f (divide by 4096f) | unknown |
12 | s16f (divide by 4096f) | unknown |
14 | s16f (divide by 4096f) | unknown |
16 | 28 bytes | Unknown (often empty) |
Section 2: Model geometry
Header (data sub table)
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Number of objects |
4 | nbObjects * 4 bytes | Object Positions |
4 + nbObjects * 4 | Varies | Object Data (see below) |
Varies | 4 bytes | Total count of vertices |
Object Data
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Number of Vertices Data |
2 | Varies * NbVerticesData | Vertices Data (see below) |
Varies | 4 - (absolutePosition % 4) | Padding (0x00) |
Varies | 2 bytes | Num triangles |
Varies | 2 bytes | Num quads |
Varies | 8 bytes | Always empty |
Varies | numTriangles * 16 bytes | Triangles |
Varies | numQuads * 20 bytes | Quads |
Vertice Data
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Bone id |
2 | 2 bytes | Number of vertices |
4 | nbVertices * 6 bytes | Vertices (nbVertices * 3 shorts) |
Useful structures
struct vertice { sint16 x, y, z; };
(sizeof = 6)
struct triangle { uint16 vertex_indexes[3]; // vertex_indexes[0] &= 0xFFF, other bits are unknown uint8 texCoords1[2]; uint8 texCoords2[2]; uint16 textureID_related; uint8 texCoords3[2]; uint16 u; // textureID_related2 };
(sizeof = 16)
struct quad { uint16 vertex_indexes[4]; // vertex_indexes[0] &= 0xFFF, other bits are unknown uint8 texCoords1[2]; uint16 textureID_related; uint8 texCoords2[2]; uint16 u; // textureID_related2 uint8 texCoords3[2]; uint8 texCoords4[2]; };
(sizeof = 20)
Section 3: Model animation
Header (data sub table)
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Number of animations |
4 | nbAnimations * 4 bytes | Animations Positions |
Animation
Offset | Length | Description |
---|---|---|
0 | 1 byte | Number of frames |
1 | Varies | Unknown |
Section 4: Unknown
Optional section, often empty.
Section 5: Unknown
Unknown sequences.
Header
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Number of sequences |
2 | nbSequences * 2 bytes | Sequences Positions |
Section 6: unknown
Can be empty.
Section 7: Informations & stats
Offset | Length | Description |
---|---|---|
0 | 24 bytes | Monster name |
24 | 4 bytes | HP values |
28 | 4 bytes | Str values |
32 | 4 bytes | Vit values |
36 | 4 bytes | Mag values |
40 | 4 bytes | Spr values |
44 | 4 bytes | Spd values |
48 | 4 bytes | Eva values |
52 | 16*4 bytes | Abilities, low level |
116 | 16*4 bytes | Abilities, med level |
180 | 16*4 bytes | Abilities, high level |
244 | 1 byte | Med level start |
245 | 1 byte | High level start |
246 | 1 byte | Unknown (flags, 3 bits used) |
247 | 1 byte | [LSB] Zombie / Fly / zz1 / zz2 / zz3 / Auto-Reflect / Auto-Shell / Auto-Protect [MSB] |
248 | 3 bytes | Cards (low/med/high) |
251 | 3 bytes | Devour (low/med/high) |
254 | 1 byte | [LSB] zz1 / zz2 / unused / unused / unused / unused / Diablos missed / Always obtains card [MSB] |
255 | 1 byte | Unknown (flags, 4 bits used) |
256 | 2 bytes | Extra EXP |
258 | 2 bytes | EXP |
260 | 8 bytes | Draw (low) |
268 | 8 bytes | Draw (med) |
276 | 8 bytes | Draw (high) |
284 | 8 bytes | Mug (low) |
292 | 8 bytes | Mug (med) |
300 | 8 bytes | Mug (high) |
308 | 8 bytes | Drop (low) |
316 | 8 bytes | Drop (med) |
324 | 8 bytes | Drop (high) |
332 | 1 byte | Mug rate |
333 | 1 byte | Drop rate |
334 | 1 byte | Padding (0x00) |
335 | 1 byte | APs |
336 | 16 bytes | Unknown |
352 | 8 bytes | Elemental resistance (Fire, Ice, Thunder, Earth, Poison, Wind, Water, Holy) |
360 | 20 bytes | Mental resistance (Death, Poison, Petrify, Darkness, |
Abilities
typedef struct { uint8 kernel_id; uint8 unknown; uint16 ability_id; }
kernel_id is the used table in kernel.bin. May be 0x02 (= magic), 0x04 (= item) or 0x08 (= monster ability). ability_id is the ability in the selected kernel table.
Draw/mug/drop
typedef struct { uint8 id_1; // magic_id for draw, item_id for mug & drop uint8 qty_1; // quantities are always 0 for draw uint8 id_2; uint8 qty_2; uint8 id_3; uint8 qty_3; uint8 id_4; uint8 qty_4; }
Section 8: Battle scripts/AI
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Number of sub-sections |
4 | 4 bytes | Offset to AI sub-section |
8 | 4 bytes | Offset to text offsets |
12 | 4 bytes | Offset to text sub-section |
AI
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Offset to init code |
4 | 4 bytes | Offset to code executed at ennemy's turn |
8 | 4 bytes | Offset to counterattack code |
12 | 4 bytes | Offset to death code |
16 | 4 bytes | Unknown offset |
Texts
Text offsets is a list of text positions (2 bytes each) in the text sub-section.
Section 9: Sounds
Contains AKAO sequences (can be empty).
Offset | Length | Description |
---|---|---|
0 | 2 bytes | Number of AKAOs |
2 | nbAKAOs * 2 bytes | AKAOs Positions |
2 + nbAKAOs * 2 | 2 bytes | End of section 9 |
4 + nbAKAOs * 2 | Varies * nbAKAOs | AKAOs |
Section 10: Sounds/Unknown
Contains AKAO sequence + unknown data (can be empty).
Section 11: Textures
Contains some TIMs with size 128x128 (8bit paletized).
Offset | Length | Description |
---|---|---|
0 | 4 bytes | Number of TIMs |
4 | nbTIMs * 4 bytes | TIMs Positions |
4 + nbTIMs * 4 | 4 bytes | End of file |
8 + nbTIMs * 4 | Varies * nbTIMs | TIMs |