XLINK > Sound / Effect Links
This format is used by .bslnk
and .belnk
files.
This file is structured as follows:
Header
Offset | Size | Description |
---|---|---|
0x0 | 4 | magic (XLNK ) |
0x4 | 4 | dataSize |
0x8 | 4 | version |
0xC | 4 | numResParam |
0x10 | 4 | numResAssetParam |
0x14 | 4 | numResTriggerOverwriteParam |
0x18 | 4 | triggerOverwriteParamTablePos |
0x1C | 4 | localPropertyNameRefTablePos |
0x20 | 4 | numLocalPropertyNameRefTable |
0x24 | 4 | numLocalPropertyEnumNameRefTable |
0x28 | 4 | numDirectValueTable |
0x2C | 4 | numRandomTable |
0x30 | 4 | numCurveTable |
0x34 | 4 | numCurvePointTable |
0x38 | 4 | exRegionPos |
0x3C | 4 | numUser |
0x40 | 4 | conditionTablePos |
0x44 | 4 | nameTablePos |
User Data Table
The number of entries is specified by the numUser
field in the header.
Offset | Size | Description |
---|---|---|
0x0 | 4 bytes per entry | CRC32 hashes. These must be sorted because a binary search algorithm is used. |
4 bytes per entry | Offset to data in ex region (absolute). Must be stored in the same order as the hashes. |
Param Define Table
Offset | Size | Description |
---|---|---|
0x0 | 4 | Size of this section |
0x4 | 4 | Number of user params |
0x8 | 4 | Number of asset params |
0xC | 4 | Unknown |
0x10 | 4 | Number of trigger params |
0x14 | User params | |
Asset params | ||
Trigger params | ||
Null-terminated strings for param names and default values |
Param Def
Offset | Size | Description |
---|---|---|
0x0 | 4 | Name (offset into string table) |
0x4 | 4 | Type |
0x8 | 4 | Default value |
Param Type
Value | Description |
---|---|
4 | String (default value is offset into string table) |
Resource Asset Param Table
The number of entries is specified by the numResAssetParam
field in the header.
Every entry starts with an 8-byte mask, where every bit represents an asset param def from the param define table.
Offset | Size | Description |
---|---|---|
0x0 | 8 | Mask |
0x8 | 4 | First reference (if mask & 1 ) |
4 | Second reference (if mask & 2 ) | |
4 | Third reference (if mask & 4 ) | |
... |
Every reference is stored as 0xXXYYYYYY
, where X
in indicates the reference type and Y
its value.
Trigger Overwrite Param Table
The number of entries in table is specified by the numResTriggerOverwriteParam
field in the header, and its position in the file is stored in the triggerOverwriteParamTablePos
field.
Every entry starts with a 4-byte mask, where every bit represents a trigger param def from the param define table.
Offset | Size | Description |
---|---|---|
0x0 | 4 | Mask |
0x4 | 4 | First reference (if mask & 1 ) |
4 | Second reference (if mask & 2 ) | |
4 | Third reference (if mask & 4 ) | |
... |
Every reference is stored as 0xXXYYYYYY
, where X
in indicates the reference type and Y
its value.
Local Property Name Ref Table
The number of entries in this table is specified by the numLocalPropertyNameRefTable
field in the header and its position in the file is stored in the localPropertyNameRefTablePos
field.
Every entry is an offset into the name table (4 bytes).
Local Property Enum Name Ref Table
This table is stored immediately behind the local property name ref table. The number of entries is specified by the numLocalPropertyEnumNameRefTable
field in the header.
Every entry is an offset into the name table (4 bytes).
Direct Value Table
This table is stored immediately behind the local property enum name ref table. The number of entries is specified by the numDirectValueTable
field in the header.
Every entry is just a 4-byte integer.
Random Table
This table is stored immediately behind the direct value table. The number of entries is specified by the numRandomTable
field in the header.
Every entry is stored as follows:
Offset | Size | Description |
---|---|---|
0x0 | 4 | Minimum (float) |
0x4 | 4 | Maximum (float) |
Curve Table
This table is stored immediately behind the random table. The number of entries is specified by the numCurveTable
field in the header.
Every entry consists of the following fields:
Offset | Size | Description |
---|---|---|
0x0 | 2 | curvePointStartPos |
0x2 | 2 | numPoint |
0x4 | 2 | curveType |
0x6 | 2 | isPropGlobal |
0x8 | 4 | propName |
0xC | 4 | propIdx |
0x10 | 2 | localPropertyNameIdx |
0x12 | 2 | Padding |
Curve Point Table
This table is stored immediately behind the curve table. The number of entries is specified by the numCurvePointTable
field in the header.
Every entry is stored as follows:
Offset | Size | Description |
---|---|---|
0x0 | 4 | X (float) |
0x4 | 4 | Y (float) |
Ex Region
This region contains user data that's pointed to by the user data table.
Condition Table
The position of this table in the file is stored in the conditionTablePos
field in the header. The size of this table can be determined by calculating the distance to the name table.
Every entry consists of the following fields:
Offset | Size | Description |
---|---|---|
0x0 | 4 | parentContainerType |
If parentContainerType is 1 or 2:
Offset | Size | Description |
---|---|---|
0x4 | 4 | weight (float) |
Else:
Offset | Size | Description |
---|---|---|
0x4 | 4 | propertyType |
0x8 | 4 | compareType |
0xC | 4 | value |
0x10 | 2 | localPropertyEnumNameIdx |
0x12 | 1 | isSolved |
0x13 | 1 | isGlobal |
Name Table
The position of this table in the file is stored in the nameTablePos
field in the header. It is always stored right behind the condition table. This section contains null-terminated strings.