ASB

From EPD Wiki
Revision as of 12:36, 7 January 2026 by Watertoon (talk | contribs) (Begin adding some information on asb version 0x41b)
Jump to navigation Jump to search

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 and Mario vs Donkey Kong (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), 0x418 (Super Mario Bros. Wonder), and 0x41A (Nintendo Switch Online: Playtest Program). 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, this is not actually possible in ASB, only usable in AINB).

Documentation is still sparse, refer to this repository for more details (names may not match exactly).

Section Order

Version 0x417

  1. File Header (0x6C bytes in version 0x417, 0x68 bytes in version 0x40F)
  2. AS Commands
  3. Nodes
  4. Event Entry Offsets
  5. Node Bodies
  6. Sync Data Entry Indices
  7. Sync Data
  8. State Transitions
  9. Events (in games that use BAEV, these events are non-functional)
  10. Transitions
  11. Command Groups
  12. AS Blackboard Parameters
  13. Partials
  14. Bone Groups
  15. Calculation Result Cache
  16. Valid Tag List
  17. Tag Groups
  18. Expression Binary
  19. AS Markings
  20. Material Blend Settings
  21. Enum Resolve Table
  22. String Pool

Structures

Helpers

AsbString

Represents a u32 offset relative to the start of the file's string pool.

AsbPtr <T>

Represents a u32 absolute offset from the start of the file to the struct of type "T" enclosed by <>.

AsbArray <T>

Represents a u32 absolute offset from the start of the file to:

Offset Size Type Description
0x0 0x4 u32 Count
0x4 T[Count] Array of struct of type T. Note; asb files only use 32-bit aligned types.

File Header

File Header (0x417)
Offset Size Type Description
0x00 0x04 char[4] Magic - "ASB "
0x04 0x04 u32 Version (0x0417 in Tears of the Kingdom)
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 Result Cache Offset
0x44 0x04 u32 Calculation Result Cache 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 Expression 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)
File Header (0x41b)
Offset Size Type Description
0x0 0x4 u32 Magic - "ASB "
0x4 0x4 u32 Version - (0x41b in Nintendo Switch Online: Playtest version 021)
0x8 0x4 AsbString Name Offset
0xc 0x4 u32 Command Count
0x10 0x4 AsbPtr<Command[Command Count]> Command Array
0x14 0x4 u32 Element Count
0x18 0x4 AsbPtr<Element[Element Count]> Element Array
0x1c 0x4 u32 Event Count - The pointer and count are erroneously present, but the section is not actually written in applications that support the baev file format.
0x20 0x4 AsbPtr<Event[Event Count]> Event Array
0x24 0x4 u32 Parts Count
0x28 0x4 AsbPtr<Parts> Parts Region - Pointer to start of parts region.
0x2c 0x4 AsbPtr<u32[Parts Count]> Parts Index Array - Array of indices to parts
0x30 0x4 AsbPtr<Blackboard> Blackboard
0x34 0x4 AsbPtr<char> String Pool
0x38 0x4 u32 Float Property Ex Count
0x3c 0x4 AsbPtr<Float Property Ex[Float Property Ex Count]> Float Property Ex Array
0x40 0x4 u32 Bone Blend Count
0x44 0x4 AsbPtr<Bone Blend[Bone Blend Count]> Bone Blend Array
0x48 0x4 u32 Partial Skeleton Count
0x4c 0x4 AsbPtr<Partial Skeleton[Partial Skeleton Count]> Partial Skeleton Array
0x50 0x4 u32 String Pool Size
0x54 0x4 AsbPtr<Transition Array> Transition Array
0x58 0x4 AsbPtr<AsbArray<u32>> Transition Partial Skeleton Array
0x5c 0x4 AsbPtr<AsbArray<AsbString>> Tag Array
0x60 0x4 AsbPtr<AsbArray<External Action>> External Action Array
0x64 0x4 AsbPtr<AsbArray<Exb>> Exb
0x68 0x4 u32 Transition Group Array
0x6c 0x4 AsbPtr<AsbArray<Material Blend>> Material Blend Array

Property<T>

Property types include s32 (can be an enum), bool(32-bit), float, AsbString, and Vector3f.

Property<T>
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 result cache index (this stores the previously evaluated value and calculates the new value from the cached value on subsequent accesses). 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.

Command

Defines a command that can be played by an as::Controller. The command is composed of a behavior tree of elements.

Command (0x417)
Offset Size Type Description
0x00 0x04 u32 Name Offset
0x04 0x04 u32 Tag Entry Offset (version 0x417+)
0x08 0x08 Property<float>
0x10 0x08 Property<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
Command (0x41b)
Offset Size Type Description
0x00 0x4 AsbString Name
0x04 0x4 AsbPtr<AsbArray<AsbString>> Tag Array
0x08 0x8 Property<float> Frame Count
0x10 0x4 u32 Debug flag for host io?
0x14 0x8 Property<InterpolationType> Default Interpolation Type
0x1c 0x10 Guid Guid
0x2c 0x2 u16 Element Id
0x2e 0x2 u16

Interpolation Type

Enum for (known) interpolation types.

Interpolation Type
Name Value Description
Default 0
None 1
Cross Fade 2
Local Bone 3
Inertia Local Bone 4
Parts 5

Element

Element (0x417)
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 Result Cache Index
0x0E 0x02 u16 Calculation Result Cache 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]
Element (0x41b)
Offset Size Type Description
0x0 0x2 u16 Element Type
0x2 0x1 u8 Is Flag
0x3 0x1 u8 Flag (unknown use)
0x4 0x4 AsbPtr<AsbArray<AsbString>> Tag Array
0x8 0x4 AsbPtr<ElementParam<Element Type>> Element Param
0xc 0x2 u16 Float Property Ex Flags
0xe 0x2 u16 Float Property Ex Count
0x10 0x2 u16 Base Parts Index Id
0x12 0x2 u16 External Action Id
0x14 0x10 Guid

Element Type

Enum of element types.

Element Type
Value (Hex) Value (Dec) Node Type
0x01 1 FloatSelector
0x02 2 StringSelector
0x03 3 SkeletalAnimation
0x04 4 State
0x05 5 StateEnd
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 StateEnd
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
0x1a 26 TwoDimensionalBlender
0x1b 27

ElementPlugs

The plug struct provides relative offsets to "plug" data.

ElementPlugs (0x41b)
Offset Size Type Description
0x0 0x1 u8 State Count
0x1 0x1 u8 State Base Index
0x2 0x1 u8 Unknown Count
0x3 0x1 u8 Unknown Base Index
0x4 0x1 u8 Child Count
0x5 0x1 u8 Child Base Index
0x6 0x1 u8 Exb Count
0x7 0x1 u8 Exb Base Index
0x8 0x1 u8 Event Count
0x9 0x1 u8 Event Base Index
0xa 0x1 u8 Frame Controller Count
0xb 0x1 u8 Frame Controller Base Index
0xc 0x4 * Frame Controller Base Index + Frame Controller Count u32[] Plug Data Offset Array - Offsets relative to start of plug table
Child Plug

Only known are listed.

Default
Offset Size Type Description
0x0 0x4 u32 Child Element Id
FloatSelector, OneDimensionalBlender, BonePositionSelector Elements
Offset Size Type Description
0x0 0x8 Property<float> Min
0x8 0x8 Property<float> Max
0x10 0x4 u32 Child Element Id
StringSelector Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Value
0x8 0x4 u32 Child Element Id
IntSelector Element
Offset Size Type Description
0x0 0x8 Property<s32> Value
0x8 0x4 u32 Child Element Id
RandomSelector Element
Offset Size Type Description
0x0 0x8 Property<float> Value
0x8 0x4 u32 Child Element Id
PreviousTagSelector Element
Offset Size Type Description
0x0 0x8 AsbPtr<AsbArray<AsbString>> Tag Array
0x8 0x4 u32 Child Element Id
Event Plug
Offset Size Type Description
0x0 0x4 u32 Event Element Id
Frame Controller Plug
Offset Size Type Description
0x0 0x4 u32 Frame Controller Element Id

ElementParam<Element Type>

FloatSelector Element
Offset Size Type Description
0x0 0x8 Property<float> Select Value
0x8 0x8 Property<bool> Is Slot Sync
0x10 0x4 u32
0x14 0xc + N ElementPlugs Plugs
StringSelector Element
Offset Size Type Description
0x0 0x8 Property<float> Select Value
0x8 0x8 Property<bool> Is Slot Sync
0x10 0x4 u32
0x14 0xc + N ElementPlugs Plugs
SkeletalAnimation Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Animation Name
0x8 0x4 u32
0xc 0x4 u32
0x10 0x8 Property<bool> Is Offset Frame
0x18 0x8 Property<float> Frame Offset
0x20 0xc + N ElementPlugs Plugs
State Element
Offset Size Type Description
0x0 0xc + N ElementPlugs Plugs
OneDimensionalBlender Element
Offset Size Type Description
0x0 0x8 Property<float> Selector weight
0x8 0x4 u32 Easing Type (1 = ease)
0xc 0xc + N ElementPlugs Plugs
Sequential Element
Offset Size Type Description
0x0 0x8 Property<bool>
0x8 0x8 Property<s32>
0x10 0x8 Property<bool>
0x18 0xc + N ElementPlugs Plugs
IntSelector Element
Offset Size Type Description
0x0 0x8 Property<s32> Select Value
0x8 0x8 Property<bool> Is Slot Sync
0x10 0x4 u32
0x14 0xc + N ElementPlugs Plugs
Simultaneous Element
Offset Size Type Description
0x0 0x4 u32 State End Type (0 = no children, 1 = first child state end)
0x8 0xc + N ElementPlugs Plugs
Event Element
Offset Size Type Description
0x0 0x4 u32
0x8 0xc + N ElementPlugs Plugs
MaterialAnimation Element
Offset Size Type Description
0x0 0x4 u32 Material Blend Id
0x4 0x8 Property<AsbString> Animation Name
0xc 0x8 Property<bool>
0x14 0xc + N ElementPlugs Plugs
FrameController Element
Offset Size Type Description
0x0 0x8 Property<float> Play Rate
0x8 0x8 Property<float> Loop Start
0x10 0x8 Property<float> Loop End
0x18 0x4 u32
0x1c 0x8 Property<bool> Is Kill Loop
0x24 0x8 Property<bool>
0x2c 0x8 Property<s32> Frame Count
0x34 0x8 Property<s32> Random Range
0x3c 0x8 Property<bool> Is Local Random
0x44 0x8 Property<float> Frame Offset
0x4c 0x8 Property<float> Current Frame
0x54 0x8 Property<float>
0x5c 0x4 u32
0x60 0x8 Property<float>
0x68 0x8 Property<bool>
0x70 0x8 Property<bool> Is Retarget Play Rate
0x78 0xc + N ElementPlugs Plugs
DummyAnimation Element
Offset Size Type Description
0x0 0x8 Property<float> Frame Count
0x8 0x8 Property<bool> Is Looping
0x10 0xc + N ElementPlugs Plugs
RandomSelector Element
Offset Size Type Description
0x0 0x4 u32 Judge Timing
0x4 0x8 Property<bool> Is Slot Sync
0xc 0x8 Property<s32>
0x14 0x8 Property<> Unknown
0x1c 0x4 u32
0x20 0xc + N ElementPlugs Plugs
PreviousTagSelector Element
Offset Size Type Description
0x0 0x4 u32
0x4 0xc + N ElementPlugs Plugs
BonePositionSelector Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Left Bone Name
0x8 0x8 Property<AsbString> Right Bone Name
0xc 0x4 u32 Component Id - (0 = X, 1 = Y, 2 = Z) component to generate bone position difference from
0x10 0x4 u32 Judge Timing
0x14 0x8 Property<bool> Is Slot Sync
0x1c 0xc + N ElementPlugs Plugs
BoneVisibilityAnimation Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Animation Name
0x8 0x8 Property<bool>
0x10 0x8 Property<bool> Is Offset Frame
0x18 0x8 Property<float> Frame Offset
0x20 0xc + N ElementPlugs Plugs
InitialFrame Element
Offset Size Type Description
0x0 0x4 u32 Initial Frame Type
0x4 0x4 AsbPtr<AsbArray<AsbString>> Tag Array
0x8 0x8 Property<bool> Is Share By Same Anim key
0x10 0x8 Property<AsbString> Left Bone Name
0x18 0x8 Property<AsbString> Right Bone Name
0x20 0x4 u32 Component Id
0x24 0x8 Property<bool> Is Random
0x2c 0x8 Property<bool> Is Fixed Random
0x34 0xc + N ElementPlugs Plugs
Initial Frame Type
Name
Start
FrameOffset
InvFrameOffset
Random
BonePosition
End
Frame
InvFrame
SlotSync
BoneBlender Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Bone Blend Name
0x8 0x4 u32 Sync Child Id
0xc 0x8 Property<float> Bone Blend Mode Value
0x14 0x4 u32 Bone Blend Mode
0x18 0x4 u32 State End Mode (0 = all, 1 = child 0, 2 = child 1)
0x1c 0xc + N ElementPlugs Plugs
BoolSelector Element
Offset Size Type Description
0x0 0x8 Property<bool> Select Value
0x8 0x8 Property<bool> Is Slot Sync
0x10 0x4 u32
0x14 0xc + N ElementPlugs Plugs
Alert
Offset Size Type Description
0x0 0x8 Property<AsbString> Alert
0x8 0xc + N ElementPlugs Plugs
SubtractAnimation Element
Offset Size Type Description
0x0 0xc + N ElementPlugs Plugs
ShapeAnimation Element
Offset Size Type Description
0x0 0x8 Property<AsbString> Animation Name
0x8 0xc + N ElementPlugs Plugs
TwoDimensionalBlender Element
Offset Size Type Description
0x0 0x8 Property<float>
0x8 0x8 Property<float>
0x10 0x4 u32 Offset to key frame array relative to 0x10 of this struct?
0x14 0x4 u32 Offset to key data array relative to 0x10 of this struct?
0x18 0xc + N ElementPlugs Plugs