This information was mirrored from the Nexus Wiki, contributed by Bodowens86, with some additions.
Offset | Name | Type |
---|---|---|
0 |
Header | Header |
28 |
Row Data | Type depends on table structure, count is Line Count in Header |
28 + line size * line count |
String Data |
Line size can be calculated as (file size - header size - string data size) / line count
.
Offset | Name | Type |
---|---|---|
0 |
File Format Version | int32 |
4 |
Descriptors Hash | uint32 |
8 |
Layout Hash | uint32 |
12 |
Table Version | int32 |
16 |
Line Count | int32 |
20 |
String Data Size | int32 |
24 |
Unique String Count | int32 |
Generating new hashes is unnecessary because new XML files cannot be added without modifying the game binaries.
These hashes are not dynamically generated based on the table content; they are hardcoded.
Hash | Algorithm | Initial Value |
---|---|---|
Descriptors Hash | 32-bit FNV-1a | 0x811c9dc5 |
Layout Hash | 32-bit FNV-1a | 0x811c9dc5 |
Additional hash information and pseudocode provided by moggabor and Bodowens86.
This pseudocode describes how the descriptors and layout hashes are generated.
descriptorsHash = 0x811c9dc5
layoutHash = 0x811c9dc5
explicitPaddingSize = 0
maxColumnAlignment = 1
lineSize = 0
for column in columns:
descriptorsHash = crc32(column.name, descriptorsHash)
descriptorsHash = crc32(column.typeID, descriptorsHash)
layoutHash = crc32(column.offset, layoutHash)
if columnDataType == Padding:
explicitPaddingSize += column.size
continue
nextOffset = column.offset + column.size
if lineSize < nextOffset:
lineSize = nextOffset
if maxColumnAlignment < column.alignment:
maxColumnAlignment = column.alignment
lineSize += explicitPaddingSize
if lineSize % maxColumnAlignment:
lineSize = maxColumnAlignment * ((lineSize + maxColumnAlignment - 1) / maxColumnAlignment)
layoutHash = crc32(lineSize, layoutHash)
Type ID | Name | Bit Width | Width in Bytes | XML Type Name |
---|---|---|---|---|
-1 |
InvalidType |
|||
0 |
Int |
32 bit | 4 bytes | integer |
1 |
Int64 |
64 bit | 8 bytes | bigint |
2 |
Float |
32 bit | 4 bytes | real |
3 |
Guid |
128 bit | 16 bytes | uuid |
4 |
Bool |
8 bit | 1 byte | boolean |
5 |
String |
32 bit | 4 bytes | text , character varying |
6 |
Vec3 |
96 bit (3 * 32 bit) | 12 bytes | vec3 |
7 |
Quat |
128 bit (4 * 32 bit) | 16 bytes | quat |
8 |
QuatT |
224 bit ((4 + 3) * 32 bit) | 28 bytes | quatt |
9 |
Padding |
variable |
Type IDs provided by moggabor.