Havok clips and skeletons
Animation binders contain Havok hkaAnimationContainer tagfiles: skeletons, animations and bindings specifying the
skeleton bone driven by each track. Motion data and TAE events are separate files
in the binder. Observed
The named skeleton contains bone names, signed 16-bit parent indices (-1 is a root), reference transforms and
optional float slots. A binding carries originalSkeletonName, transform-track-to-bone indices, float-track-to-slot
indices, partitions and a blend hint. Sourced · HKLib
Four-float lanes; quaternion components are x, y, z, w.
| Offset | Size | Type | Field | Confidence | Notes |
|---|---|---|---|---|---|
| 0x0 | 16 | f32[4] | translation | Observed | Fourth lane is padding |
| 0x10 | 16 | f32[4] | rotation quaternion | Observed | |
| 0x20 | 16 | f32[4] | scale | Observed | Fourth lane is padding |
The fourth lane of a translation and of a scale is padding that holds whatever bytes the writer left. Over the 15,920 bones of Sekiro’s 316 skeletons a translation’s fourth lane is exactly 0.0 on 2,079, exactly 1.0 on 318, a nonzero value below 1e-3 in magnitude on 1,680 and some other value on 11,843; over Elden Ring’s 72,571 bones in 966 skeletons the counts are 5,919, 974, 6,918 and 58,760. A scale’s fourth lane is 0.0 on 15,602 (Sekiro) and 71,596 (Elden Ring) bones and 1.0 on 318 and 975. Every rotation is a unit quaternion to within 1e-4. Proven · Sekiro, Elden Ring · over the skeletons read
A negative track-to-bone index drives no bone; two examined c7300 files use such a binding in Sekiro.
Observed · Sekiro Extracted root motion is a separate sampled reference frame with up and forward vectors,
duration and four-float samples containing XYZ translation and rotation about up. Sourced · HKLib
Header and binding fields
Section titled “Header and binding fields”The census below covers every animation tagfile of the animation binders of both installs: 11,170 distinct tagfiles in Sekiro’s 465 binders (12,121 binder members), of which 11,159 open (10 name a compendium that only another character’s binder holds, 1 is SDK 2015.1), and 39,736 in Elden Ring’s 1,657 binders (44,735 members), all of which open.
| Sekiro | Elden Ring | |
|---|---|---|
| Animations | 10,866 | 38,770 |
hkaSplineCompressedAnimation |
10,865 | 38,769 |
hkaInterleavedUncompressedAnimation |
1 | 1 |
| Animations with extracted motion | 6,864 | 20,606 |
frameType of every reference frame |
0 | 0 |
blendHint 0 / 1 / 2 |
10,542 / 321 / 3 | 34,634 / 4,136 / 0 |
| Bindings whose track lists match the animation’s track counts | 10,866 | 38,770 |
Proven · Sekiro, Elden Ring · over the tagfiles that open
The reference frame’s frameType member carries member flags 0x21 in the type tables, where the stored members such
as blendHint carry 0x20 (the 160 distinct Sekiro type tables that describe the class all agree).
Proven · Sekiro · over the Sekiro tables The extra bit is the flag Havok gives a member that is not written to
the file. Inferred The member reads 0 in all 27,470 reference frames (6,864 in Sekiro, 20,606 in Elden Ring), so it
holds no data. Proven · Sekiro, Elden Ring · over the frames read
blendHint is 0 on ordinary clips and 1 on additive ones (321 of Sekiro’s bindings, in 62 binders; 4,136 of
Elden Ring’s). The value 2 occurs on three Sekiro bindings, all in c9520, whose clips (a000_009500, a000_009600,
a000_009999) have the same numbers as additive clips that every other Sekiro character stores with 1.
Proven · Sekiro, Elden Ring · over the bindings read The type tables name the enum hkaAnimationBinding::BlendHint
but list no members, so the files do not say what 1 and 2 mean (whether an additive clip’s deltas are in the parent’s
or the child’s space). Proven · Sekiro, Elden Ring · over every table of both installs Other sources name the
values differently: HKLib’s Havok 2018.1 registry names 1 ADDITIVE_PARENT_SPACE and 2 ADDITIVE_CHILD_SPACE
Sourced · HKLib, while the Havok 2014 class dumps Smithbox carries for Dark Souls III name 0 NORMAL,
1 ADDITIVE_DEPRECATED and 2 ADDITIVE. Sourced · Smithbox Both agree that 1 and 2 are additive. In the running Sekiro 1.06 game, one clip (the same clip with blend hint 0, 1 and 2, in a
character’s behaviour layer that plays at weight 1 over the idle pose) gives three different poses on the 47 bones where the layer
reaches the pose: with 0 the bone rotation is the clip’s own; with 1 it is the clip’s rotation times the idle rotation (clip on the left,
the parent-space reading, quaternion product with the right operand acting first); with 2 it is the idle rotation times the clip’s (the
child-space reading). Every one of the 30 pose snapshots of each run matches its own reading to 0.002 rad on all 47 bones and the other
two readings fit fewer (the nearest one 83 percent of the bones). Observed · Sekiro · one clip, one layer, one run per hint value
This matches HKLib’s names (1 parent space, 2 child space); the Smithbox names say nothing about the space.
In Elden Ring’s runtime the space is not shown yet: what hints 1 and 2 do there is below.
In Elden Ring, setting blendHint to 1 or to 2 on every clip of the player’s 11 animation binders changes the player’s
final pose in the same way for both values: idling and walking, 126 (hint 1) and 127 (hint 2) of the 150 bones come out as with the stored hint, which for a bone
a clip drives is the clip’s value, and 7 bones that no clip drives (the foot, hand and pelvis
dummies, Jaw, Lips_Lower) hold the identity rotation instead of their reference-pose rotation. Observed · Elden Ring
(Rotations of the live model-space pose compared with the stock pose frame by frame, over 20 s of idle and 10 s of walking
in each of the three runs; 17 helper bones the graph derives from others differ otherwise and are not explained.) The
clip’s value is therefore a delta that starts from the identity, with absent components neutral, when the hint is 1 or 2;
whether the engine composes it onto a base pose in the parent’s or the child’s space is not shown, since no
additive blend sits above the clip in the idle and walking states. Observed · Elden Ring
Every animation stores the type of its class, so the class and the value say the same thing: 1 for
hkaInterleavedUncompressedAnimation, 3 for hkaSplineCompressedAnimation and, in Sekiro’s 431
hkaQuantizedAnimation objects, 4 (HKLib’s names are in Enumerated members).
Observed · every distinct tagfile read
The player’s behaviour graph has a layer generator above its state machines whose layers each play one clip, with the
weight of ten of them bound to a float variable (AddBlend00 to AddBlend09, initial value 0) and the stored weight 1.0.
Observed · Elden Ring Two of those layers play a000_098120 (Jaw up to 0.12 rad, Lips_Lower 0.351 rad) and a000_098130
(both eyeA bones 0.620 rad), stored with blendHint 1. Above them, the speaking layer (off by default, switched by events, bone weights
Jaw and Lips_Lower) and the blinking layer (on by default, weight variable 1.0, bone weights the four eye bones) set those bones, so the
eyeA rotations of the final pose say nothing about the clips below. Observed · Elden Ring With the two layers’ variable bindings removed so that each weight is a constant 1.0, a buffer that holds the clip’s own sampled values
on Lips_Lower and Jaw exists in the process and does not exist in the stock run. In captures whose pose array is tied to the player
(the player’s ChrIns found from the module that moved under a held key, the array reached by pointers from it), the final pose has Jaw and
Lips_Lower within 0.001 rad of their reference rotation, though the clip’s Lips_Lower value is 0.351 rad: in 1,528 snapshots with the stored
blendHint 1 and in 1,615 with every clip’s hint set to 2. A hint 1 or 2 clip that the layer samples at weight 1 changes neither bone in the final
pose, in either composition space. Observed · Elden Ring With the hint set to 0, the same array holds the clip’s
values on 112 of the 130 bones the clip drives (within 0.01 rad over 1,579 snapshots; the median over those bones is 0.996 rad from the stock
pose): a hint 0 clip in that layer replaces the pose. The 18 other bones are the four eye bones, which the blinking layer above sets, and 14 leg bones, whose
difference from the clip is not explained: the calf, foot and foot-target bones are 1.571 rad from the identity (the clip’s values) and 0.9 to 1.6 rad from the stock pose, the knee helper bones half of that from the identity (0.785), the calf twists at the identity. A modifier list above the layer generator holds a foot IK controls modifier, handle-on-bone modifiers for the foot targets and twist modifiers on the thighs, legs and feet, and the capture is of another spawn, so the legs may come from a later stage or from another state of the player. Observed · Elden Ring (Rotations of the live model-space
pose converted to the parent’s space, compared with the stock pose and the clip’s values; one capture of 20 s of idle each. The hint 0 capture
started at another place of the map than the two others (the player’s spawn position), the same pointers reaching the array. Runs with
unrelated edits started at that other place too, so the move is not tied to the hint.) Unknown
In a capture at the stock spawn, with one behaviour member edited so that the layer AddBlend02 plays a000_098200 (a stored blendHint 0 clip of
the face) at a constant weight 1, and the player’s pose array tied as above, Head, Jaw and Lips_Lower of the final pose are within 0.01 rad of
the clip’s values in every one of 415 snapshots sampled from 1,659 of 20 s of idle (their median distance from the clip: 0.0000, 0.0018, 0.0009 rad;
from their rotation in the stock run: 0.127, 0.107, 0.146 rad; within 0.01 rad of the reference rotation in 100%, 5% and 7% of the snapshots).
Observed · Elden Ring A hint 0 clip that a layer samples at weight 1 in the stock scene reaches the final pose, where the hint 1 and hint 2
clips of the same layer do not (above). Observed · Elden Ring In the same capture 43 of the 130 bones, the legs, feet and foot targets
and the left arm among them, differ from the stock run by more than 0.01 rad (feet targets 0.2 to 0.62 rad) without taking the clip’s values, so the
leg bones that the hint 0 capture above leaves unexplained are not the layer’s clip either. Observed · Elden Ring (The edit’s file was not
logged as served in this run; the clip’s values on Jaw and Lips_Lower, which the stock run does not have, are what show it was read.)
The one interleaved clip of each game stores duration as (samples - 1) frames of 1/30 s: Sekiro’s c1050
a000_400600 has 166 samples of 101 tracks and lasts 5.5 s; Elden Ring’s c4751 a000_030000 has 2 samples of 185
tracks and lasts 1/30 s. Observed
A clip’s annotation tracks differ by game. Every Sekiro animation has one annotation track per transform track and none of them holds an annotation; the track’s name is the name of the bone its transform track drives in 9,365 of the 9,400 animations whose skeleton is in the same binder (the other 35 are clips authored on another object’s skeleton). Elden Ring’s animations mostly have none (36,245 of 38,770); the other 2,525 have one per transform track, again with no annotations. Proven · Sekiro, Elden Ring · over the animations read
Compendia and inline type tables
Section titled “Compendia and inline type tables”An animation binder holds no compendium or one: Sekiro 85 and 380 of its 465 binders, Elden Ring 763 and 894 of its
1,657. A compendium names 1 to 3 type-table ids (Sekiro 65, 312 and 3 compendia; Elden Ring 113, 702 and 79), and a
tagfile with a TCRF section names one of them. Every clip and skeleton tagfile of both games names an id its own
binder’s compendium holds, except 10 Sekiro clips in c0010_c5000.anibnd, a binder with no compendium of its own: their
id is the common Sekiro character type table, which the compendia of 104 other binders hold, among them the player’s.
Proven · Sekiro, Elden Ring · over the tagfiles read
Some stock animation tagfiles carry their own TYPE section instead. In Sekiro 49 distinct tagfiles do: 42 object and
part skeleton.hkx, six effect clips (s04016_a000_000000.hkx and others, each holding one animation) and the one
SDK 2015.1 clip c1090’s a000_205000.hkx. In Elden Ring 530 do: 473 skeletons, including c2130’s and c4370’s, and
57 effect clips, all SDK 2018.1; no Elden Ring character clip does.
Proven · Sekiro, Elden Ring · over the tagfiles read
Binder relationships
Section titled “Binder relationships”An animation member named a000_003000.hkx corresponds to animation record 3000 in TAE; for groups other than a000
the record number depends on the character, see TAE. Observed
How the binders are divided differs between the games; see each game’s section.
Animation and model skeletons differ
Section titled “Animation and model skeletons differ”The animation skeleton is not necessarily the FLVER skeleton. Each game’s section gives an example.
Name correspondence and matching model-space poses can construct a coherent pose across different hierarchies. That reconstruction alone does not establish the engine’s complete mapping, additive blending, IK or procedural bone rules. Live Sekiro poses retain residual differences on some finger and twist bones.
Sekiro
Section titled “Sekiro”Binder relationships
Section titled “Binder relationships”only in Sekiro c0000.anibnd contains the player skeleton and markers such as c0000_a000_hi.txt naming companion
animation binders. Object animation can be nested: 233 of the 1,395 object binders examined contain an .anibnd
member. Observed · Sekiro
The player’s clips are in the seven companion binders those markers name: c0000_a000_hi, c0000_a000_md,
c0000_a000_lo and the a00x, a05x, a07x and a2xx sets. They hold 1,248 spline-compressed animations, 671
with extracted root motion sampled once per frame with up vector (0, 1, 0). Observed · Sekiro
The reference frames of 6,858 of the 6,864 Sekiro clips with extracted motion, and of all 20,606 Elden Ring ones, have
up (0, 1, 0) and forward (0, 0, 1); six Sekiro clips have up (0, 0, 1) and forward (1, 0, 0).
Proven · Sekiro, Elden Ring · over the frames read In the clips whose path turns and whose steps keep one direction
in the character’s own frame, the heading of the translation steps minus the rotation angle is constant for one sign
of the angle (a circular resultant above 0.95) and not for the other (below 0.8) in 27 Sekiro clips and 74 Elden Ring
clips. The sign that holds is the one where the heading rises with the stored angle, measured from forward towards
up × forward: all 27 Sekiro clips and 71 of the 74 Elden Ring clips. Observed The angle is then a right-handed
rotation about up. The other 666 turning Sekiro clips and 2,092 Elden Ring clips are not decided by this test,
because their steps change direction in the character’s frame. Inferred
Animation and model skeletons
Section titled “Animation and model skeletons”Sekiro’s c1010 has 127 Havok bones and 400 FLVER
bones. Shared reference poses agree in examined c1010 and player c0000 data, but this does not establish equal
bone counts or index orders. Observed · Sekiro
The running pose
Section titled “The running pose”The running game (1.06) holds the player’s local pose as arrays of 146 hkQsTransform records in Havok skeleton
order, and the skeleton’s reference pose is in memory exactly as stored. During idle, an array matches clip
a000_000000 evaluated at fractional frames (frame × 1/30 s) within 1e-5 on 59 to 64 of the 146 bones. Five bones
(4, 5, 6, 11 and 26) differ from every decoding of the clip by 2e-3 to 8e-3, and about 25 finger and twist bones by
about 3e-4. Observed · Sekiro
The player’s local pose array is rewritten once per frame: sampled from memory about 600 times a second for 24 s, it changed exactly 1,440 times, at the 60 Hz frame rate. Observed · Sekiro Over those 1,440 snapshots, which cover standing idle, starting and stopping a walk, strafing and sprinting, every one of the 146 rotations has a length within 4.4e-7 of 1 (float rounding). During the walk transitions and the sprint, bones sit up to 105 to 149 degrees from their idle rotation, so a linear blend of two such rotations that is not renormalised would be 0.27 to 0.7 short of unit length: the pose the game hands on is normalised. Observed · Sekiro The arrays that hold the clip samples before blending were not found, so whether the blender or a later stage does the normalising is not established. Unknown · Sekiro
Elden Ring
Section titled “Elden Ring”Rewritten clips are loaded
Section titled “Rewritten clips are loaded”The player’s skeleton has 150 bones and the running game (1.17.2, offline) holds the local pose as arrays of 150 hkQsTransform
records, rewritten every frame; bone 7, RootPos, has a static Y translation of 0.9349806 in the live pose and in the clips. A clip
of the player’s animation binders rewritten with one static translation changed (that bone’s Y plus 0.6 m, in each of the 1,257
clips of eleven binders whose RootPos Y is a single static value) is loaded and played: the live pose then holds 1.5349805, the stock
value plus 0.6, and nothing crashes. The same holds when each rewritten clip carries its type table inline (TYPE) in place of the
TCRF reference to the binder’s compendium: the compendium’s TYPE container is put where the TCRF leaf was and the outer
length is updated. Observed · Elden Ring The character’s position does not follow the changed root bone. Observed · Elden Ring
The player’s root chain
Section titled “The player’s root chain”The player’s Havok skeleton splits at RootPos: Master → RootPos → Pelvis (the legs), and RootPos → RootRotY →
RootRotXZ → Spine → Spine1 → Spine2 → Neck (the upper body). In the rest pose Master is turned −90° about Y,
RootPos +90°, RootRotY −90° and RootRotXZ not at all. Observed · Elden Ring
The Uchigatana’s first light attack, a029_030000, tracks 42 of the 150 bones (no finger, twist or mantle bones) at 60 frames
a second, 139 frames. Master, RootPos and RootRotY carry one yaw with alternating signs, so the legs get no net yaw while the
upper body turns by the yaw less 90°: +18° at 0 s, +52° at 0.1 s, 0° at 0.3 s and −88° at 0.53 s; RootRotXZ pitches the upper
body forward by up to 35° from 0.5 to 0.63 s. Two independent decoders agree to 0.0001° on all 42 bones every 1/30 s from 0 to
0.8 s. Observed · Elden Ring · one clip The clip is held only by c0000_a2x.anibnd (the a2x compendium), not by the
expansion binders or any other c0000 binder, and its TAE record only by c0000.anibnd’s
a29.tae, which gives it a blend event (type 16) over 0 to 0.2 s and an Enable Twist Modifier event (type 700) naming the
behaviour graph’s twist 100 (behaviour graphs).
Observed · Elden Ring
In the game, with no lock-on and no stick input, the attack from the idle turns the whole figure (hips, back, head and sword
together) 40 to 50° further to the character’s left than the clip alone, from 3 to 6 frames in and mostly by 0.2 s, and it ends
facing where it started; the physics module’s yaw (+0x50) stays constant throughout. So the swing is not a change of facing.
Observed · Elden Ring · one run, matched-camera renders at 15° steps Which graph variable carries it was not measured.
The standing forward jump plays Jump_F (a000_202020) at rate 1 from the start of the crouch: the pelvis-area anchor bone dips
0.26 m, peaks 1.26 m up about 0.47 s after the clip starts and is back at standing height about 0.86 s after it (the clip lasts
0.8 s), then the landing crouch (−0.26 m) follows, and Jump_Loop (a000_202040) gets no visible time. The clip’s own root has a
similar arc (crouch −0.32 m, peak 1.165 m at 0.467 s) but is still 0.46 m up at its end, so the game’s vertical arc is not the
clip’s root alone. Observed · Elden Ring · one jump, 639 recorded steps
Binder relationships
Section titled “Binder relationships”only in Elden Ring Character animation can be split into divisions. For example, c2010.anibnd contains the skeleton
and .blf markers naming c2010_div00.anibnd and c2010_div01.anibnd. Player companion markers can instead use
.txt. Observed · Elden Ring
Elden Ring’s 293 character animation binders hold 5,846 animations, all Havok 2018.1: 5,845
hkaSplineCompressedAnimation and one hkaInterleavedUncompressedAnimation, with 612,478 transform tracks, no
float tracks, and 3,233 animations with extracted motion. Observed · Elden Ring
Animation and model skeletons
Section titled “Animation and model skeletons”Elden Ring’s c3000 FLVER has 368 joints, 265 parentless; its Spine (75 joints) and Pelvis (30) chains are separate
roots there but share an animation hierarchy in Havok, where Spine is under Pelvis. The clips move 26 of the 265
parentless joints; the other 239 never move. Its Havok skeleton has 129 joints, and 128 of them store a rest scale
that differs from 1 by up to 1.19e-6, float noise in the reference pose. Observed · Elden Ring