ASB: Difference between revisions
(added node types) |
m (minor update) |
||
(One intermediate revision by the same user not shown) | |||
Line 13: | Line 13: | ||
# Event Entry Offsets | # Event Entry Offsets | ||
# Node Bodies | # Node Bodies | ||
# | # Sync Data Entry Indices | ||
# | # Sync Data | ||
# | # State Transitions | ||
# Events | # Events | ||
# Transitions | # Transitions | ||
# Command Groups | # Command Groups | ||
# | # AS Blackboard Parameters | ||
# | # Partials | ||
# Bone Groups | # Bone Groups | ||
# Calculation Presets | # Calculation Presets | ||
Line 27: | Line 27: | ||
# Expression Binary | # Expression Binary | ||
# AS Markings | # AS Markings | ||
# | # Material Blend Settings | ||
# Enum Resolve Table | # Enum Resolve Table | ||
# String Pool | # String Pool | ||
Line 74: | Line 74: | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
|Partial | |Partial Count | ||
|- | |- | ||
|0x1C | |0x1C | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Sync Data Entry Count | ||
|- | |- | ||
|0x20 | |0x20 | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |AS Blackboard Parameters Offset | ||
|- | |- | ||
|0x24 | |0x24 | ||
Line 99: | Line 99: | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |State Transitions Offset | ||
|- | |- | ||
|0x30 | |0x30 | ||
Line 109: | Line 109: | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Partials Offset | ||
|- | |- | ||
|0x38 | |0x38 | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Sync Data Offset | ||
|- | |- | ||
|0x3C | |0x3C | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Sync Data Indices Array Offset | ||
|- | |- | ||
|0x40 | |0x40 | ||
Line 174: | Line 174: | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Material Blend Settings Offset (version 0x417 only) | ||
|} | |} | ||
Line 188: | Line 188: | ||
|0x00 | |0x00 | ||
|0x04 | |0x04 | ||
| | |u32 | ||
|Flags and Index | |Flags and Index | ||
|- | |- | ||
Line 197: | Line 197: | ||
|} | |} | ||
If the | If the top bit of the flags is set, then the bottom two bytes of the flags become an index value. If it is not set, then the provided value is value of the parameter. If <code>flags & 1 << 0x18 != 0</code>, then the index is an expression index (EXB) and the normal value field becomes the input value for the expression. If <code>flags & 1 << 0x1e != 0</code>, then the index is a calculation preset index. Note, this is only applicable if the parameter is a float. Otherwise, if <code>flags & 1 << 0x19 != 0</code>, then the index specifies the command data type. 0 is the current frame normalized (i.e. <code>(current_frame - start_frame)/total_duration</code>), 1 and 2 are random float values between 0.0 and 1.0, 3 is an unknown string value, 4 is the command's fade in frame, and 6 is an unknown float value. Note, this only applies if the parameter is a float or a string. In all other cases, the index is a blackboard index and value of the parameter is the value of the corresponding blackboard parameter. For float parameters specifically, <code>flags >> 0x1a & 3</code> specifies the exact parameter source. 0 is a float blackboard parameter while 1, 2, or 3 are a vector3f blackboard parameter with 1, 2, and 3 being the x, y, and z components respectively. | ||
==== AS Commands ==== | ==== AS Commands ==== | ||
Line 219: | Line 219: | ||
|- | |- | ||
|0x08 | |0x08 | ||
|0x08 | |0x08 | ||
|Parameter<float> | |Parameter<float> | ||
| | | | ||
|- | |- | ||
| | |0x10 | ||
|0x08 | |0x08 | ||
|Parameter< | |Parameter<bool> | ||
| | |Is Ignore Same Command | ||
|- | |- | ||
| | |0x18 | ||
|0x04 | |0x04 | ||
|u32 | |u32 | ||
| | |Interpolation Type (uncertain, but 0 = unspecified, 1 = no model morph, 3 = enable local bone morph, 4 = enable inertial blend) | ||
|- | |||
| rowspan="5" |0x1C | |||
| rowspan="5" |0x10 | |||
|u32 | |||
| rowspan="5" |GUID | |||
|- | |||
|u16 | |||
|- | |||
|u16 | |||
|- | |||
|u8[2] | |||
|- | |||
|u8[6] | |||
|- | |- | ||
| | |0x2C | ||
|0x02 | |0x02 | ||
|u16 | |u16 | ||
|Child Node Index | |Child Node Index | ||
|- | |- | ||
| | |0x2E | ||
| | |0x02 | ||
|u16 | |u16 | ||
| | | | ||
Line 266: | Line 274: | ||
|0x01 | |0x01 | ||
|u8 | |u8 | ||
| | |Sync Data Count | ||
|- | |- | ||
|0x03 | |0x03 | ||
|0x01 | |0x01 | ||
|u8 | |u8 | ||
| | |Does Not Have State Transition | ||
|- | |- | ||
|0x04 | |0x04 | ||
Line 296: | Line 304: | ||
|0x02 | |0x02 | ||
|u16 | |u16 | ||
| | |Sync Data Index Array Index | ||
|- | |- | ||
|0x12 | |0x12 | ||
Line 303: | Line 311: | ||
|AS Markings Index (-1 for index) | |AS Markings Index (-1 for index) | ||
|- | |- | ||
| rowspan="5" | | | rowspan="5" |0x14 | ||
| rowspan="5" |0x10 | | rowspan="5" |0x10 | ||
|u32 | |u32 | ||
Line 312: | Line 320: | ||
|u16 | |u16 | ||
|- | |- | ||
| | |u8[2] | ||
|- | |- | ||
|u8[6] | |u8[6] |
Latest revision as of 01:17, 12 April 2024
ASB (Animation Sequence Binary) is a file format used to store animation sequences for actors in recent Nintendo EPD games such as The Legend of Zelda: Tears of the Kingdom and Nintendo Switch Sports. This article is primarily aimed at the version that appears in Tears of the Kingdom (v0x0417). Other ASB versions include 0x304 (Ring Fit Adventure), 0x3FB (Labo Toy-Con 04 and Game Builder Garage), 0x407 (Animal Crossing: New Horizons), 0x40F (Nintendo Switch Sports), 0x410 (Splatoon 3), and 0x418 (Super Mario Bros. Wonder). ASB files can be found in the AS folder of the romfs as well as the AS folder of certain pack files.
File Structure
ASB is a little endian format which consists of node pathways triggered by AS commands. When an AS command is called, it runs the sequence of nodes connected to it which trigger and control animations and animation logic. Nodes are arranged in an array and referenced and accessed by their array index. Despite the presence of animation events in ASB files, these events do not appear to be used by the game.
All string offsets in the file are relative to the start of the string pool and name hashes are 32-bit murmur3 hashes. There are six possible parameter types: string, int (32-bit signed integer), float (32-bit floating point number), bool, vector3f, and pointer (object pointer).
Section Order
- File Header (0x6C bytes in version 0x417, 0x68 bytes in version 0x40F)
- AS Commands
- Nodes
- Event Entry Offsets
- Node Bodies
- Sync Data Entry Indices
- Sync Data
- State Transitions
- Events
- Transitions
- Command Groups
- AS Blackboard Parameters
- Partials
- Bone Groups
- Calculation Presets
- Valid Tag List
- Tag Groups
- Expression Binary
- AS Markings
- Material Blend Settings
- Enum Resolve Table
- String Pool
Sections
File Header
Offset | Size | Type | Description |
---|---|---|---|
0x00 | 0x04 | char[4] | Magic - "ASB " |
0x04 | 0x04 | u32 | Version (0x0417 in Tears of the Kingdom, 0x040F in Nintendo Switch Sports and Splatoon 3) |
0x08 | 0x04 | u32 | Filename Offset |
0x0C | 0x04 | u32 | AS Command Count |
0x10 | 0x04 | u32 | Node Count |
0x14 | 0x04 | u32 | Event Count |
0x18 | 0x04 | u32 | Partial Count |
0x1C | 0x04 | u32 | Sync Data Entry Count |
0x20 | 0x04 | u32 | AS Blackboard Parameters Offset |
0x24 | 0x04 | u32 | String Pool Offset |
0x28 | 0x04 | u32 | Enum Resolve Table Offset |
0x2C | 0x04 | u32 | State Transitions Offset |
0x30 | 0x04 | u32 | Event Entries Offset Array Offset |
0x34 | 0x04 | u32 | Partials Offset |
0x38 | 0x04 | u32 | Sync Data Offset |
0x3C | 0x04 | u32 | Sync Data Indices Array Offset |
0x40 | 0x04 | u32 | Calculation Presets Offset |
0x44 | 0x04 | u32 | Calculation Preset Count |
0x48 | 0x04 | u32 | Bone Groups Offset |
0x4C | 0x04 | u32 | Bone Group Count |
0x50 | 0x04 | u32 | String Pool Size |
0x54 | 0x04 | u32 | Transitions Offset |
0x58 | 0x04 | u32 | Tag List Offset |
0x5C | 0x04 | u32 | String Triplets Offset |
0x60 | 0x04 | u32 | EXB Offset (empty if section does not exist) |
0x64 | 0x04 | u32 | Command Groups Offset (empty if section does not exist) |
0x68 | 0x04 | u32 | Material Blend Settings Offset (version 0x417 only) |
ASB Parameter
Offset | Size | Type | Description |
---|---|---|---|
0x00 | 0x04 | u32 | Flags and Index |
0x04 | 0x04 or 0x0C | T | Value |
If the top bit of the flags is set, then the bottom two bytes of the flags become an index value. If it is not set, then the provided value is value of the parameter. If flags & 1 << 0x18 != 0
, then the index is an expression index (EXB) and the normal value field becomes the input value for the expression. If flags & 1 << 0x1e != 0
, then the index is a calculation preset index. Note, this is only applicable if the parameter is a float. Otherwise, if flags & 1 << 0x19 != 0
, then the index specifies the command data type. 0 is the current frame normalized (i.e. (current_frame - start_frame)/total_duration
), 1 and 2 are random float values between 0.0 and 1.0, 3 is an unknown string value, 4 is the command's fade in frame, and 6 is an unknown float value. Note, this only applies if the parameter is a float or a string. In all other cases, the index is a blackboard index and value of the parameter is the value of the corresponding blackboard parameter. For float parameters specifically, flags >> 0x1a & 3
specifies the exact parameter source. 0 is a float blackboard parameter while 1, 2, or 3 are a vector3f blackboard parameter with 1, 2, and 3 being the x, y, and z components respectively.
AS Commands
Offset | Size | Type | Description |
---|---|---|---|
0x00 | 0x04 | u32 | Name Offset |
0x04 | 0x04 | u32 | Tag Entry Offset (version 0x417+) |
0x08 | 0x08 | Parameter<float> | |
0x10 | 0x08 | Parameter<bool> | Is Ignore Same Command |
0x18 | 0x04 | u32 | Interpolation Type (uncertain, but 0 = unspecified, 1 = no model morph, 3 = enable local bone morph, 4 = enable inertial blend) |
0x1C | 0x10 | u32 | GUID |
u16 | |||
u16 | |||
u8[2] | |||
u8[6] | |||
0x2C | 0x02 | u16 | Child Node Index |
0x2E | 0x02 | u16 |
Nodes
Offset | Size | Type | Description |
---|---|---|---|
0x00 | 0x02 | AsbNodeType | Node Type |
0x02 | 0x01 | u8 | Sync Data Count |
0x03 | 0x01 | u8 | Does Not Have State Transition |
0x04 | 0x04 | u32 | Tag Entry Offset |
0x08 | 0x04 | u32 | Node Body Offset |
0x0C | 0x02 | u16 | Calculation Preset Index |
0x0E | 0x02 | u16 | Calculation Preset Count |
0x10 | 0x02 | u16 | Sync Data Index Array Index |
0x12 | 0x02 | u16 | AS Markings Index (-1 for index) |
0x14 | 0x10 | u32 | GUID |
u16 | |||
u16 | |||
u8[2] | |||
u8[6] |
Value (Hex) | Value (Dec) | Node Type |
---|---|---|
0x01 | 1 | FloatSelector |
0x02 | 2 | StringSelector |
0x03 | 3 | SkeletalAnimation |
0x04 | 4 | State |
0x05 | 5 | |
0x06 | 6 | OneDimensionalBlender |
0x07 | 7 | Sequential |
0x08 | 8 | IntSelector |
0x09 | 9 | Simultaneous |
0x0A | 10 | Event |
0x0B | 11 | MaterialAnimation |
0x0C | 12 | FrameController |
0x0D | 13 | DummyAnimation |
0x0E | 14 | RandomSelector |
0x0F | 15 | |
0x10 | 16 | PreviousTagSelector |
0x11 | 17 | BonePositionSelector |
0x12 | 18 | BoneVisibilityAnimation |
0x13 | 19 | InitialFrame |
0x14 | 20 | BoneBlender |
0x15 | 21 | BoolSelector |
0x16 | 22 | Alert |
0x17 | 23 | SubtractAnimation |
0x18 | 24 | ShapeAnimation |
0x19 | 25 |