Kingdom Hearts II - ANB (Animation Binary)
ANB files are used by the game engine to animate a 3D model and trigger events in specific frames. They are used for both gameplay and cutscenes. All the gameplay ANB files are located inside MSET files in obj/
, while for cutscenes they are located in anm/{WORLD}/{MODEL}/
.
Internally they are just BAR archives and for what it’s known the only two files that can be found in are motion data and effect data.
Motion data
This file is responsible of animating a 3D model. It comes in two forms, interpolated and RAW. Due to the bigger complexity of interpolated-type motion files, they will be documented in a separate document.
The game engine assumes that the maximum frame rate is 60
; this is referred as Global Frame Rate (or GFR). But every motion can run at a different frame rate; this is referred as Local Frame Rate (or LFR).
The RAW animation type just takes an array of matrices for each frame and applies them to the bones of a model. It is a very cheap technique in terms of CPU usage, but it requires a big amount of memory.
Motion header
Like model files, the first 0x90
are reserved an always set to 00
. Offsets and file size ignores the first 0x90
. This document refers to the motion type 1
, which is the RAW one. When the motion type is 0
, the rest of the file after the header will be very different; refer to interpolated motion document.
Offset | Type | Description |
---|---|---|
0 | int | Type |
4 | int | Subtype |
8 | int | Extra Offset (Equal to size of motion) |
12 | int | Extra Size |
Motion Types
Types for the unknown extra data.
Channel | Description |
---|---|
0 | Interpolated |
1 | Raw |
Motion Subtypes
Types for the unknown extra data.
Channel | Description |
---|---|
0 | Normal |
1 | Ignore Scale |
Extra Types
Types for the unknown extra data.
Channel | Description |
---|---|
0 | Weapon Cns |
1 | Terminate |
Raw motion header
This is located straight after the motion header.
Offset | Type | Description |
---|---|---|
0x00 | int | Bone count. Must match with the bone count of the model. |
0x04 | int[3] | Reserved |
0x10 | int | Frame count: Amount of GFR in a loop (FrameEnd - FrameLoop ) |
0x14 | int | Total Frame count, expressed in LFR |
0x18 | int | Animation Matrix Offset |
0x1c | int | Position Matrix Offset |
0x20 | vec4f | Bounding Box minimum |
0x30 | vec4f | Bounding Box maximum |
0x40 | float | Frame start |
0x44 | float | Frame end |
0x48 | float | Frames per second, defines the LFR |
0x4c | float | Frame return, expressed in LFR |
Raw motion matrices
An array of array of 4x4 matrices (Matrix4x4[][]
). The first dimension of the array refers to the total amount of frames, while the second dimension is the bone count. For each frame (LFR), the game engine takes BoneCount amount of Matrix4x4
and multiplies them to the mesh that corresponds to a specific bone.
Raw motion more matrices
This is optionally defined and its purpose is unknown. It is an array of 4x4 matrices (Matrix4x4[]
), where the size of the array is equal to the bone count. For the few files that has been analysed, those matrices are always a Matrix Identity.
Motion Triggers
This file describe triggers that happens during a motion and it’s believed they are located into a different file to favour decoupling.
Motion Triggers structure
Amount | Description |
---|---|
Single | Header |
Array | Range Trigger count (Happens during X frames) |
Array | Frame Trigger count (Triggered on a specific frame) |
Motion Trigger Header
Offset | Variable Type | Description |
---|---|---|
0 | byte | Range Trigger count |
1 | byte | Frame Trigger count |
2 | short | Frame Triggers offset |
Range Trigger
Offset | Variable Type | Description |
---|---|---|
0 | short | Start frame |
2 | short | End frame |
4 | byte | Range Trigger ID |
5 | byte | Param size as shorts |
6 | short[] | Param |
Frame Trigger
Offset | Variable Type | Description |
---|---|---|
0 | short | Trigger frame |
2 | byte | Frame Trigger ID |
3 | byte | Param size as shorts |
4 | short[] | Param |
Range Trigger list
ID | Trigger | Parameter Size | Parameter Desc |
---|---|---|---|
0 | STATE: Grounded | 0 | |
1 | STATE: Falling | 0 | |
2 | STATE: Grounded 2 | 0 | |
3 | STATE: No gravity | 0 | |
4 | Enable collision flag | 1 | |
5 | Disable collision flag | 1 | |
6 | Enable RECOM flag | 2 | |
7 | Disable RECOM flag (UNUSED?) | ? | |
8 | <unknown> (Prints “using NO_DAMAGE_REACTION attribute”?) (UNUSED?) | ? | |
9 | STATE: <unknown> | 0 | |
10 | Motion attack on | 2 | |
11 | STATE: Allows combo attack | 0 | |
12 | STATE: <unknown> | 0 | |
13 | STATE: <unknown> | 0 | |
14 | STATE: Allows Battle RCs | 0 | |
15 | STATE: <unknown> (UNUSED?) | ? | |
16 | <unknown> (“Mobility enhancement”, eg: LW’s dash) | 0 | |
17 | <unknown> (AI combo 1) | 0 | |
18 | <unknown> (AI combo 2) | 0 | |
19 | <unknown> (“Disable forced i-frames”, eg: LW’s idle, ground and air) | 0 | |
20 | Reaction Command (Self) | 2 | |
21 | STATE: <unknown> | 0 | |
22 | Turn to target | 1 | Turn speed |
23 | Texture animation | 1 | |
24 | PROPERTY: <unknown> (Disable gravity but keeps kinetics) | 1 | |
25 | PROPERTY: <unknown> (AnmatrCommand; Reaction command on other object) | ? | |
26 | PROPERTY: <unknown> (AnmatrCommand) | 1 | |
27 | STATE: Hitbox off (Can’t be hit) | 0 | |
28 | Turn to lock on | 1 | Turn speed |
29 | STATE: <unknown> (Can’t fall off edges easily) | 0 | |
30 | STATE: <unknown> (Freeze animation? Immovable?) | 0 | |
31 | STATE: <unknown> | 0 | |
32 | STATE: <unknown> | 0 | |
33 | motion attack on (Enemy) | 3 | |
34 | STATE: <unknown> (UNUSED?) | ? | |
35 | STATE: <unknown> (Eg: Fire. Makes fire count as combo) | 0 | |
36 | Pattern enable (LW attacks. Teleport to player?) | 0 | |
37 | Pattern disable | 0 | |
38 | STATE: <unknown> | 0 | |
39 | STATE: <unknown> (UNUSED?) | ? | |
40 | STATE: <unknown> | 0 | |
41 | STATE: <unknown> | 0 | |
42 | STATE: <unknown> (Eg: landing, using items) | 0 | |
43 | STATE: <unknown> (UNUSED?) | ? | |
44 | STATE: <unknown> (Eg: Explosion finisher, LW bow. Not movable by other objects?) | 0 | |
45 | STATE: <unknown> (UNUSED?) | ? | |
46 | STATE: <unknown> (UNUSED?) | ? | |
47 | STATE: <unknown> | 0 | |
48 | STATE: <unknown> (UNUSED?) | ? | |
49 | STATE: <unknown> (Eg: Dodge roll) | 0 | |
50 | STATE: <unknown> (Allows combo finisher next) | 0 | |
51 | Play singleton SE | 3 | |
52 | STATE: <unknown> | 0 | |
53 | STATE: <unknown> | 0 |
Frame Trigger list
ID | Trigger | Parameter Size | Parameter Desc |
---|---|---|---|
0 | Jump State | 0 | |
1 | Play PAX effect from a.fm | 1 | PAX effect Id |
2 | Play footstep sound | 2 | Sound Id |
3 | Dusk Jump State (animation in slot 628) | 0 | |
4 | Texture animation start | 1 | |
5 | Texture animation stop (UNUSED?) | ? | |
6 | Use Item effect | 0 | |
7 | <unknown> (LIMIT: AnmatrCallback; Limit RC?) | 2 | |
8 | Play SE sound from a.fm | 4 | |
9 | <unknown> (VariousTrigger 1) | 0 | |
10 | <unknown> (VariousTrigger 2) | 0 | |
11 | <unknown> (VariousTrigger 4) | 0 | |
12 | <unknown> (VariousTrigger 8) | 0 | |
13 | Plays an enemy vsb voice | 1/2 | VSB Id |
14 | Plays an ally vsb voice | 1 | VSB Id |
15 | Turn to Target | 1 | |
16 | <unknown> (DisableCommandTime; Eg: When hit on air) | 1 | |
17 | Magic cast | 1 | |
18 | <UNDEFINED> | ||
19 | Apply footstep effect (Footprint, water splashes…) | 1 | |
20 | <UNDEFINED> | ||
21 | Turn to lock on | 1 | |
22 | Makes the keyblade appear | 0 | |
23 | Fade start (Opacity decrease) | 1 | |
24 | Fade start (Opacity increase) | 1 | |
25 | <unknown> (Related to the party) | 0 | |
26 | Set mesh color | 2 | |
27 | Reset mesh color | 2 | |
28 | Revenge check | 0 | |
29 | Plays a Keyblade appearance sprite | 0 | |
30 | <unknown> (LIMIT: PlayVoice) (UNUSED?) | ? | |
31 | Trigger vibration | 1 | |
32 | <UNDEFINED> | ||
33 | <UNDEFINED> | ||
34 | Check for Dodge Roll to Airslide (Quick Run) | 0 | |
35 | <unknown> (MOTION: start; Eg: dodge roll) | 0 |
Note: This data has been checked on normal MSET files. Those marked as (UNUSED?) are probably used in RC and Limit files.