<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://okami.speedruns.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Akito</id>
	<title>Ōkami Speedrun Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://okami.speedruns.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Akito"/>
	<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/Special:Contributions/Akito"/>
	<updated>2026-05-06T00:24:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.2</generator>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1847</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1847"/>
		<updated>2025-09-07T22:42:02Z</updated>

		<summary type="html">&lt;p&gt;Akito: /* (Example): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the ''Property Family'' of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, curves will be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This ''Property Family'' is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This ''Property Family'' Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the bone index 0''', being set on a '''Quantized Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only ''Property Family'' that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After reading the keyframes header, what follows up are the keyframes in which the actual keyframes are stored in.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this ''Property Family'', the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the bone index 0''', being set on a '''Quantized-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Full-Precision Curve ==&lt;br /&gt;
This is the most straightforward ''Property Family''. However, the most expensive (in storaging terms).&lt;br /&gt;
Different from the Quantized types, this one is not dependent of a ''Keyframe Header.''&lt;br /&gt;
Instead, it tells the values right away, Rendering this ''Property Family'' the easiest to compute (considering this is not a single pose), the one with the most accurate movements, but the most expensive to store in storage terms.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 80 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Full-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Padding, used to align the file, It has no use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Keyframe Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After that, the values can be used straight into the cubic interpolation formula.&lt;br /&gt;
&lt;br /&gt;
===Final Notes:===&lt;br /&gt;
The space in which the movement of bones takes in also depends of the ''Property Family'' the curve is set in. For instance, if a bone's rest position's property (let's say it's 125.14 for X) is animated on a quantized curve, Since this is a big value, movement information will be lost due to the nature of the quantized ''Property Family'', especially when not used in a ''Quantized-Precision Curve''. Because of that, '''The bone's movements are relative to the bone's parent's pose on quantized types.''' For full precision however, since quantization is not needed, '''the property values are absolute.'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1846</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1846"/>
		<updated>2025-09-07T22:41:24Z</updated>

		<summary type="html">&lt;p&gt;Akito: /* (Example): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the ''Property Family'' of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, curves will be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This ''Property Family'' is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This ''Property Family'' Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the bone index 0''', being set on a '''Quantized Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only ''Property Family'' that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After reading the keyframes header, what follows up are the keyframes in which the actual keyframes are stored in.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this ''Property Family'', the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Full-Precision Curve ==&lt;br /&gt;
This is the most straightforward ''Property Family''. However, the most expensive (in storaging terms).&lt;br /&gt;
Different from the Quantized types, this one is not dependent of a ''Keyframe Header.''&lt;br /&gt;
Instead, it tells the values right away, Rendering this ''Property Family'' the easiest to compute (considering this is not a single pose), the one with the most accurate movements, but the most expensive to store in storage terms.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 80 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Full-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Padding, used to align the file, It has no use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Keyframe Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After that, the values can be used straight into the cubic interpolation formula.&lt;br /&gt;
&lt;br /&gt;
===Final Notes:===&lt;br /&gt;
The space in which the movement of bones takes in also depends of the ''Property Family'' the curve is set in. For instance, if a bone's rest position's property (let's say it's 125.14 for X) is animated on a quantized curve, Since this is a big value, movement information will be lost due to the nature of the quantized ''Property Family'', especially when not used in a ''Quantized-Precision Curve''. Because of that, '''The bone's movements are relative to the bone's parent's pose on quantized types.''' For full precision however, since quantization is not needed, '''the property values are absolute.'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1845</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1845"/>
		<updated>2025-09-07T20:57:42Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the ''Property Family'' of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, curves will be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This ''Property Family'' is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This ''Property Family'' Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only ''Property Family'' that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After reading the keyframes header, what follows up are the keyframes in which the actual keyframes are stored in.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this ''Property Family'', the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Full-Precision Curve ==&lt;br /&gt;
This is the most straightforward ''Property Family''. However, the most expensive (in storaging terms).&lt;br /&gt;
Different from the Quantized types, this one is not dependent of a ''Keyframe Header.''&lt;br /&gt;
Instead, it tells the values right away, Rendering this ''Property Family'' the easiest to compute (considering this is not a single pose), the one with the most accurate movements, but the most expensive to store in storage terms.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 80 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Full-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Padding, used to align the file, It has no use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Keyframe Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After that, the values can be used straight into the cubic interpolation formula.&lt;br /&gt;
&lt;br /&gt;
===Final Notes:===&lt;br /&gt;
The space in which the movement of bones takes in also depends of the ''Property Family'' the curve is set in. For instance, if a bone's rest position's property (let's say it's 125.14 for X) is animated on a quantized curve, Since this is a big value, movement information will be lost due to the nature of the quantized ''Property Family'', especially when not used in a ''Quantized-Precision Curve''. Because of that, '''The bone's movements are relative to the bone's parent's pose on quantized types.''' For full precision however, since quantization is not needed, '''the property values are absolute.'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1844</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1844"/>
		<updated>2025-09-07T20:57:23Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the ''Property Family'' of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, curves will be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This ''Property Family'' is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This ''Property Family'' Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only ''Property Family'' that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After reading the keyframes header, what follows up are the keyframes in which the actual keyframes are stored in.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this ''Property Family'', the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes header are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Full-Precision Curve ==&lt;br /&gt;
This is the most straightforward ''Property Family''. However, the most expensive (in storaging terms).&lt;br /&gt;
Different from the Quantized types, this one is not dependent of a ''Keyframe Header.''&lt;br /&gt;
Instead, it tells the values right away, Rendering this ''Property Family'' the easiest to compute (considering this is not a single pose), the one with the most accurate movements, but the most expensive to store in storage terms.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 80 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Full-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframes are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Padding, used to align the file, It has no use.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Keyframe Value&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After that, the values can be used straight into the cubic interpolation formula.&lt;br /&gt;
&lt;br /&gt;
===Final nodes===&lt;br /&gt;
The space in which the movement of bones takes in also depends of the ''Property Family'' the curve is set in. For instance, if a bone's rest position's property (let's say it's 125.14 for X) is animated on a quantized curve, Since this is a big value, movement information will be lost due to the nature of the quantized ''Property Family'', especially when not used in a ''Quantized-Precision Curve''. Because of that, '''The bone's movements are relative to the bone's parent's pose on quantized types.''' For full precision however, since quantization is not needed, '''the property values are absolute.'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1843</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1843"/>
		<updated>2025-09-07T20:46:25Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the ''Property Family'' of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, curves will be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This ''Property Family'' is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This ''Property Family'' Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only ''Property Family'' that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this ''Property Family'', the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve ''Property Family''.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Full-Precision Curve ===&lt;br /&gt;
This is the most straightforward ''Property Family''. However, the most expensive (in storaging terms).&lt;br /&gt;
Different from the Quantized types, this however is not dependent of a ''Keyframe Header.''&lt;br /&gt;
Instead, it tells the values right away, Rendering this ''Property Family'' the easiest to compute (considering this is not a single pose), but the most expensive to store in storage terms.&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1842</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1842"/>
		<updated>2025-09-07T20:36:01Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time '''(Relative to the time of the last keyframe).'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this Property Family, the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed, since now the file can use float32's instead, which are more precise and stable in comparision. This results on the size of the keyframe header to be extended to '''24 bytes each.'''&lt;br /&gt;
===(Keyframe):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Keyframe time '''(Absolute)'''.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
Aside from the keyframe time being '''Aboslute''', the rest of the process remains the exact same.&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1841</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1841"/>
		<updated>2025-09-07T20:31:40Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Quantized-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Quantized-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Quantized-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Quantized-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Quantized-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Quantized-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Quantized-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Quantized-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Quantized-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quantized Curve Keyframe Header (12 bytes length)===&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
=== Quantized Keyframes (4 bytes length)===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;br /&gt;
&lt;br /&gt;
After computing the full values, The curve is to be computed using the Hermite Cubic Interpolation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quantized-Precision Curve ==&lt;br /&gt;
For this Property Family, the process is almost the exact same. However, there are some changes.&lt;br /&gt;
First of, This is a more precise version of the Quantized curves. Therefore, the values are doubled up.&lt;br /&gt;
&lt;br /&gt;
===(Example):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 50 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized-Precision Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
===(Keyframes header):===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float32_t&amp;lt;/code&amp;gt; || 4 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
You can notice that, since the values were doubled up, The use of the custom float16_t were completely removed.&lt;br /&gt;
===(Keyframe):===&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1840</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1840"/>
		<updated>2025-09-07T20:21:09Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
:[[File:Formula.png|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1839</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1839"/>
		<updated>2025-09-07T20:19:29Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every curve is computed using the '''Cubic Hermite interpolation formula.''' That means every curve is treated as a Hermite Curve. &lt;br /&gt;
[[File:Formula.png|thumb|Formula of the Cubic Hermite Interpolation, used in curves.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' This formula's image was taken from the [https://en.wikipedia.org/wiki/Cubic_Hermite_spline ''Cubic Hermite spline Wiki''.] &lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
* P_value = '''minimum_value + maximum_value * delta_value'''&lt;br /&gt;
* M0_value = '''minimum_m0 + maximum_m0 * delta_m0'''&lt;br /&gt;
* M1_value = '''minimum_m1 + maximum_m1 * delta_m1'''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=File:Formula.png&amp;diff=1838</id>
		<title>File:Formula.png</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=File:Formula.png&amp;diff=1838"/>
		<updated>2025-09-07T20:17:36Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Formula of the cubic Hermite interpolation&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1837</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1837"/>
		<updated>2025-09-07T20:04:52Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (m1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (m1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent. (m0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent. (m1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the '''output value is blending from the minimum to the maximum value, based on the value of Delta.'''&lt;br /&gt;
&lt;br /&gt;
So, that would leave us with...&lt;br /&gt;
P_value = minimum_value + maximum_value * delta_value&lt;br /&gt;
M0_value = minimum_m0 + maximum_m0 * delta_m0&lt;br /&gt;
M1_value = minimum_m1 + maximum_m1 * delta_m1&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1836</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1836"/>
		<updated>2025-09-07T20:00:56Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The keyframe deltas are calculated as following:&lt;br /&gt;
X = Y + Z * W&lt;br /&gt;
Where X is the output value, Y is the minimum value, Z is the maximum value, and W is the delta value.&lt;br /&gt;
Essentially, the formula is telling that the output value is blending from the minimum to the maximum value, based on the value of Delta.&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1835</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1835"/>
		<updated>2025-09-07T19:32:11Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's start tangent.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's end tangent.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For quantized keyframes, The logic is that, when the Delta Value of the keyframe equals 0, the keyframe is set to '''the Minimum value of the keyframe'''(Given in the Curve Keyframe Header). And when it's set to 255, it's set to '''the Maximum value of the keyframe'''(Given in the Curve Keyframe Header).&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1834</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1834"/>
		<updated>2025-09-07T19:27:12Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (p1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (p1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;br /&gt;
&lt;br /&gt;
After that, the keyframes are given.&lt;br /&gt;
&lt;br /&gt;
== Quantized Keyframes (4 bytes length)==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Keyframe time (Relative to the time of the last keyframe).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the Keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's P0 start tangent.&lt;br /&gt;
|-&lt;br /&gt;
| 0x03 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Delta value of the keyframe's P1 end tangent.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1833</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1833"/>
		<updated>2025-09-07T19:19:38Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (p1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (p1)&lt;br /&gt;
|}&lt;br /&gt;
This is the only Property Family that uses the '''float16_t''' type. That's a special type of float that can be represented as two bytes. Especifically, this type of float is built with a 1 bit sign, 6 bit exponent, a 9 bit significand and a bias of 47. The bias favours smaller numbers. That means, the highest the number, the less precise it is. That's to compensate the small amount of data two bytes can pack.&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1832</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1832"/>
		<updated>2025-09-07T19:10:57Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
'''Only Quantized property families contain a keyframe Header'''. That's because Every keyframe is dependent on the values given on the Header.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of a keyframe.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the start tangent (p0)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Minimum value of the end tangent (p1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x0A || &amp;lt;code&amp;gt;float16_t&amp;lt;/code&amp;gt; || 2 || Maximum value of the end tangent (p1)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1831</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1831"/>
		<updated>2025-09-07T18:31:05Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info (8 bytes length) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are handled as hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve Keyframe Header (12 bytes length)==&lt;br /&gt;
Only Quantized property families contain a keyframe Header. That's because Every keyframe is dependent on the values given on the Header.&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1830</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1830"/>
		<updated>2025-09-07T18:14:57Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done. But since it animates bones most of the times, i will threat it as curves that animates bones.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve info count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. it's only set as a float if the property family of the curve is a Single Pose. Otherwise, it's a offset.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 0 || This field is telling that '''the curve is animating the bone index 0 of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 16 || This field is telling that '''the curve animates the X Position of the root bone''', being set on a '''Quantized Curve Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 4 || This field is telling that '''there's 4 keyframes on this curve.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 512 || This field is '''telling in which offset of the file the keyframe infos are located'''.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1829</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1829"/>
		<updated>2025-09-07T18:08:26Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve info count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. That's handled when the curve property is defined. It depends on the Property Family the curve is set in.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's the most eficient type of curve, regarding storage size.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1828</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1828"/>
		<updated>2025-09-07T18:03:45Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve info count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. That's handled when the curve property is defined. It depends on the Property Family the curve is set in.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
From now on, every single other curve are hermite curves. See more bellow...&lt;br /&gt;
&lt;br /&gt;
== Quantized Curve ==&lt;br /&gt;
This Property Family Is known for having Quantized values. It's &lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computing needed.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1827</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1827"/>
		<updated>2025-09-07T17:57:38Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve info count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. That's handled when the curve property is defined. It depends on the Property Family the curve is set in.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the cheapest to compute. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that '''the curve is animating the root bone of the model.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that '''the curve animates the Z rotation of the root bone''', being set on a '''Single-Pose Property Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that '''there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Family.'''&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is '''telling the value or the Z rotation right away''', no more computation needed.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1826</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1826"/>
		<updated>2025-09-07T17:56:36Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's curve info count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint32_t / float32_t&amp;lt;/code&amp;gt; || 4 || Keyframes offset / value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
the 4th offset of each curve info can be either a float, or uint32. That's handled when the curve property is defined. It depends on the Property Family the curve is set in.&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Property Family tells the game how the keyframes are handled ingame. Depending on the Family the property is set in, it can be readen diferently.&lt;br /&gt;
== Single Pose ==&lt;br /&gt;
This Property Family is the easiest one to Decode. Because since it's a single pose, The there's only one keyframe, in which is given on the Curve Info.&lt;br /&gt;
&lt;br /&gt;
(Example):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Value !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || -1 || This field is telling that the curve is animating the root bone of the model.&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || 5 || This field is telling that the curve animates the Z rotation of the root bone, being set on a Single-Pose Property Family.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || 1 || This field is telling that there's only one keyframe on this curve, which makes sense, since this curve is set on a Single-Pose Family.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 0.52 || This field is telling the value or the Z rotation right away, no more computation needed.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1825</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1825"/>
		<updated>2025-09-07T17:46:52Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's property count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 50 || Semi-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 51 || Semi-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 52 || Semi-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 53 || Semi-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 54 || Semi-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 55 || Semi-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 56 || Semi-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 57 || Semi-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 58 || Semi-Precision Curve || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 80 || Full-Precision Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 81 || Full-Precision Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 82 || Full-Precision Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 83 || Full-Precision Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 84 || Full-Precision Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 85 || Full-Precision Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 86 || Full-Precision Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 87 || Full-Precision Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 88 || Full-Precision Curve || Scale Z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1824</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1824"/>
		<updated>2025-09-07T17:44:52Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's property count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve properties (See below).&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The curve property will define what property of the bone/object it is animating. There's some properties who could not be determined yet. See some already identified values bellow.&lt;br /&gt;
&lt;br /&gt;
== Curve Properties (Already identified) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value !! Property Family !! Property&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Single Pose || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Single Pose || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Single Pose || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Single Pose || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Single Pose || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Single Pose || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Single Pose || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Single Pose || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Single Pose || Scale Z&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 16 || Quantized Curve || Position X&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Quantized Curve || Position Y&lt;br /&gt;
|-&lt;br /&gt;
| 18 || Quantized Curve || Position Z&lt;br /&gt;
|-&lt;br /&gt;
| 19 || Quantized Curve || Rotation X&lt;br /&gt;
|-&lt;br /&gt;
| 20 || Quantized Curve || Rotation Y&lt;br /&gt;
|-&lt;br /&gt;
| 21 || Quantized Curve || Rotation Z&lt;br /&gt;
|-&lt;br /&gt;
| 22 || Quantized Curve || Scale X&lt;br /&gt;
|-&lt;br /&gt;
| 23 || Quantized Curve || Scale Y&lt;br /&gt;
|-&lt;br /&gt;
| 24 || Quantized Curve || Scale Z&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1823</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1823"/>
		<updated>2025-09-07T17:34:05Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot main header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's property count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
on Offset 8, The File gives informations about the curves, i.e: what bone it animates, etc.&lt;br /&gt;
&lt;br /&gt;
== Curve Info ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Bone index (-1 means it animates the mode's root bone).&lt;br /&gt;
|-&lt;br /&gt;
| 0x01 || &amp;lt;code&amp;gt;int8_t&amp;lt;/code&amp;gt; || 1 || Curve property.&lt;br /&gt;
|-&lt;br /&gt;
| 0x02 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Curve keyframe count.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1822</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1822"/>
		<updated>2025-09-07T17:27:23Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Mot header ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt; || 2 || Animation's frame count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Animation's property count.&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt; || 1 || Loop flag, sets if the animation either loops or not (1/0).&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1821</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1821"/>
		<updated>2025-09-07T17:24:21Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || File identifier (Magic number).&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;uint16_t[numEntries]&amp;lt;/code&amp;gt; || 8 * numEntries || String offsets.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1820</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1820"/>
		<updated>2025-09-07T17:23:05Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates '''curves and/or properties''' for an given embbed model. Because of that, it's almost always certain that they are contained in a file container (dat).&lt;br /&gt;
There's instances of mots that controlled properties instead of bones, so it's not always certain of what it animates. A further inspection have to be done.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset !! Type !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; || 4 || Number of entries.&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || &amp;lt;code&amp;gt;int64_t[numEntries]&amp;lt;/code&amp;gt; || 8 * numEntries || String offsets.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1819</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1819"/>
		<updated>2025-09-07T17:20:25Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
This file incorporates curves and/or properties for an given embbed model. Because of that, it's almost always certain that they are contained in a file container(dat).&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1818</id>
		<title>File Formats</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1818"/>
		<updated>2025-09-07T17:18:30Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Here you will find an incomplete list of descriptions of file formats in Okami, discovered via [[Reverse Engineering]].&lt;br /&gt;
&lt;br /&gt;
'''Extension''' is a list of file extensions associated with this type.&lt;br /&gt;
&lt;br /&gt;
'''Short Description''' is an short explanation of the point of the file.&lt;br /&gt;
&lt;br /&gt;
== Archives == &lt;br /&gt;
&lt;br /&gt;
Archives are simply expanded into more files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description&lt;br /&gt;
|-&lt;br /&gt;
| .bin || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .dat || Generic Archive with some exceptions. (See below.)&lt;br /&gt;
|-&lt;br /&gt;
| .DDP || Image Archive (DDS)&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .TBL || Generic Archive &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''.dat''' has a few exceptions: files in the event/ folder have their own format. Some (but not all) of the .dat files in the id/ folder as well as privilege/IllustPrivilege.dat are just DDS files one after the next. &lt;br /&gt;
&lt;br /&gt;
== Level Files (st#) ==&lt;br /&gt;
&lt;br /&gt;
Level files are found in data_pc/st#. See [[Map Table]] for a complete list.&lt;br /&gt;
&lt;br /&gt;
'''Archive''' is whether the files is stored in the .bin or .dat for the level in Okami HD for PC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description !! Archive&lt;br /&gt;
|-&lt;br /&gt;
| .ACT || Something to do with NPCs. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .AKT || Archive of collision models (.AK) || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Animal Group (.ANS) File Format|.ANS]] || Animals. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .BMH || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CAM || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CMP || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .EAR || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Encounter (.ECT) File Format|.ECT]] || Encounters. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Unknown Archive. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .FI2 || Atmospheric Effects || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Shop Contents (.ISL) File Format|.ISL]] || Shop contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Loot (.ITS) File Format|.ITS]] || Guaranteed loot locations. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Exit Destination (.JMP) File Format|.JMP]] || Exit destinations. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .LI3 || Lighting. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Zones (.MEH/.SCA/.SCI) File Format|.MEH &amp;lt;br&amp;gt;.SCA &amp;lt;br&amp;gt;.SCI]] || Zone definitions, such as dialogue, exits, bit flags. || .bin &amp;lt;br&amp;gt;.bin &amp;lt;br&amp;gt;.dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Motion (.MOT) File Format|.MOT]] || Animation file. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .MRT || Unknown. Has locations of map restoration areas. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .MSA || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Message_Data_(.MSD)_File_Format|.MSD]] || Dialogue text. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Object_Placement_(.TAT/.TRE/.TSC)_File_Format|_objtbl.TSC &amp;lt;br&amp;gt;_objtbl2.TRE &amp;lt;br&amp;gt;_objtbl3.TAT]] || Objects placed around the map.  || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Drop Table (.RNI) File Format|_randtbl.RNI]] || Drop tables. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .RHT || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCL || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCP || Archive containing texture models (.SCR) and a texture archive (.DDP). || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCR || Texture model definitions. || .dat/.SCP&lt;br /&gt;
|-&lt;br /&gt;
| .SCM || Unknown || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Dojo Contents (.SSL) File Format|.SSL]] || Dojo contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .TS || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1817</id>
		<title>Motion (.MOT) File Format</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=Motion_(.MOT)_File_Format&amp;diff=1817"/>
		<updated>2025-09-07T17:17:12Z</updated>

		<summary type="html">&lt;p&gt;Akito: Created page with &amp;quot;'''''Note''': This page pertains to Reverse Engineering of Okami File Formats.''&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''''Note''': This page pertains to Reverse Engineering of Okami File Formats.''&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1816</id>
		<title>File Formats</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1816"/>
		<updated>2025-09-07T17:14:11Z</updated>

		<summary type="html">&lt;p&gt;Akito: /* Level Files (st#) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Here you will find an incomplete list of descriptions of file formats in Okami, discovered via [[Reverse Engineering]].&lt;br /&gt;
&lt;br /&gt;
'''Extension''' is a list of file extensions associated with this type.&lt;br /&gt;
&lt;br /&gt;
'''Short Description''' is an short explanation of the point of the file.&lt;br /&gt;
&lt;br /&gt;
== Archives == &lt;br /&gt;
&lt;br /&gt;
Archives are simply expanded into more files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description&lt;br /&gt;
|-&lt;br /&gt;
| .bin || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .dat || Generic Archive with some exceptions. (See below.)&lt;br /&gt;
|-&lt;br /&gt;
| .DDP || Image Archive (DDS)&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .TBL || Generic Archive &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''.dat''' has a few exceptions: files in the event/ folder have their own format. Some (but not all) of the .dat files in the id/ folder as well as privilege/IllustPrivilege.dat are just DDS files one after the next. &lt;br /&gt;
&lt;br /&gt;
== Level Files (st#) ==&lt;br /&gt;
&lt;br /&gt;
Level files are found in data_pc/st#. See [[Map Table]] for a complete list.&lt;br /&gt;
&lt;br /&gt;
'''Archive''' is whether the files is stored in the .bin or .dat for the level in Okami HD for PC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description !! Archive&lt;br /&gt;
|-&lt;br /&gt;
| .ACT || Something to do with NPCs. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .AKT || Archive of collision models (.AK) || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Animal Group (.ANS) File Format|.ANS]] || Animals. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .BMH || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CAM || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CMP || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .EAR || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Encounter (.ECT) File Format|.ECT]] || Encounters. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Unknown Archive. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .FI2 || Atmospheric Effects || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Shop Contents (.ISL) File Format|.ISL]] || Shop contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Loot (.ITS) File Format|.ITS]] || Guaranteed loot locations. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Exit Destination (.JMP) File Format|.JMP]] || Exit destinations. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .LI3 || Lighting. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Zones (.MEH/.SCA/.SCI) File Format|.MEH &amp;lt;br&amp;gt;.SCA &amp;lt;br&amp;gt;.SCI]] || Zone definitions, such as dialogue, exits, bit flags. || .bin &amp;lt;br&amp;gt;.bin &amp;lt;br&amp;gt;.dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Motion (.MOT) File Format|.MOT]] || Animation file. || .mot&lt;br /&gt;
|-&lt;br /&gt;
| .MRT || Unknown. Has locations of map restoration areas. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .MSA || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Message_Data_(.MSD)_File_Format|.MSD]] || Dialogue text. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Object_Placement_(.TAT/.TRE/.TSC)_File_Format|_objtbl.TSC &amp;lt;br&amp;gt;_objtbl2.TRE &amp;lt;br&amp;gt;_objtbl3.TAT]] || Objects placed around the map.  || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Drop Table (.RNI) File Format|_randtbl.RNI]] || Drop tables. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .RHT || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCL || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCP || Archive containing texture models (.SCR) and a texture archive (.DDP). || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCR || Texture model definitions. || .dat/.SCP&lt;br /&gt;
|-&lt;br /&gt;
| .SCM || Unknown || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Dojo Contents (.SSL) File Format|.SSL]] || Dojo contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .TS || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1815</id>
		<title>File Formats</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1815"/>
		<updated>2025-09-07T17:13:48Z</updated>

		<summary type="html">&lt;p&gt;Akito: /* Level Files (st#) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Here you will find an incomplete list of descriptions of file formats in Okami, discovered via [[Reverse Engineering]].&lt;br /&gt;
&lt;br /&gt;
'''Extension''' is a list of file extensions associated with this type.&lt;br /&gt;
&lt;br /&gt;
'''Short Description''' is an short explanation of the point of the file.&lt;br /&gt;
&lt;br /&gt;
== Archives == &lt;br /&gt;
&lt;br /&gt;
Archives are simply expanded into more files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description&lt;br /&gt;
|-&lt;br /&gt;
| .bin || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .dat || Generic Archive with some exceptions. (See below.)&lt;br /&gt;
|-&lt;br /&gt;
| .DDP || Image Archive (DDS)&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .TBL || Generic Archive &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''.dat''' has a few exceptions: files in the event/ folder have their own format. Some (but not all) of the .dat files in the id/ folder as well as privilege/IllustPrivilege.dat are just DDS files one after the next. &lt;br /&gt;
&lt;br /&gt;
== Level Files (st#) ==&lt;br /&gt;
&lt;br /&gt;
Level files are found in data_pc/st#. See [[Map Table]] for a complete list.&lt;br /&gt;
&lt;br /&gt;
'''Archive''' is whether the files is stored in the .bin or .dat for the level in Okami HD for PC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description !! Archive&lt;br /&gt;
|-&lt;br /&gt;
| .ACT || Something to do with NPCs. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .AKT || Archive of collision models (.AK) || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Animal Group (.ANS) File Format|.ANS]] || Animals. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .BMH || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CAM || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CMP || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .EAR || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Encounter (.ECT) File Format|.ECT]] || Encounters. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Unknown Archive. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .FI2 || Atmospheric Effects || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Shop Contents (.ISL) File Format|.ISL]] || Shop contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Loot (.ITS) File Format|.ITS]] || Guaranteed loot locations. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Exit Destination (.JMP) File Format|.JMP]] || Exit destinations. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .LI3 || Lighting. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Zones (.MEH/.SCA/.SCI) File Format|.MEH &amp;lt;br&amp;gt;.SCA &amp;lt;br&amp;gt;.SCI]] || Zone definitions, such as dialogue, exits, bit flags. || .bin &amp;lt;br&amp;gt;.bin &amp;lt;br&amp;gt;.dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Motion (.MOT) File Format|.JMP]] || Animation file. || .mot&lt;br /&gt;
|-&lt;br /&gt;
| .MRT || Unknown. Has locations of map restoration areas. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .MSA || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Message_Data_(.MSD)_File_Format|.MSD]] || Dialogue text. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Object_Placement_(.TAT/.TRE/.TSC)_File_Format|_objtbl.TSC &amp;lt;br&amp;gt;_objtbl2.TRE &amp;lt;br&amp;gt;_objtbl3.TAT]] || Objects placed around the map.  || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Drop Table (.RNI) File Format|_randtbl.RNI]] || Drop tables. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .RHT || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCL || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCP || Archive containing texture models (.SCR) and a texture archive (.DDP). || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCR || Texture model definitions. || .dat/.SCP&lt;br /&gt;
|-&lt;br /&gt;
| .SCM || Unknown || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Dojo Contents (.SSL) File Format|.SSL]] || Dojo contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .TS || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
	<entry>
		<id>https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1814</id>
		<title>File Formats</title>
		<link rel="alternate" type="text/html" href="https://okami.speedruns.wiki/index.php?title=File_Formats&amp;diff=1814"/>
		<updated>2025-09-07T17:11:35Z</updated>

		<summary type="html">&lt;p&gt;Akito: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{File Format}}&lt;br /&gt;
==Explanation==&lt;br /&gt;
&lt;br /&gt;
Here you will find an incomplete list of descriptions of file formats in Okami, discovered via [[Reverse Engineering]].&lt;br /&gt;
&lt;br /&gt;
'''Extension''' is a list of file extensions associated with this type.&lt;br /&gt;
&lt;br /&gt;
'''Short Description''' is an short explanation of the point of the file.&lt;br /&gt;
&lt;br /&gt;
== Archives == &lt;br /&gt;
&lt;br /&gt;
Archives are simply expanded into more files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description&lt;br /&gt;
|-&lt;br /&gt;
| .bin || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .dat || Generic Archive with some exceptions. (See below.)&lt;br /&gt;
|-&lt;br /&gt;
| .DDP || Image Archive (DDS)&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Generic Archive&lt;br /&gt;
|-&lt;br /&gt;
| .TBL || Generic Archive &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''.dat''' has a few exceptions: files in the event/ folder have their own format. Some (but not all) of the .dat files in the id/ folder as well as privilege/IllustPrivilege.dat are just DDS files one after the next. &lt;br /&gt;
&lt;br /&gt;
== Level Files (st#) ==&lt;br /&gt;
&lt;br /&gt;
Level files are found in data_pc/st#. See [[Map Table]] for a complete list.&lt;br /&gt;
&lt;br /&gt;
'''Archive''' is whether the files is stored in the .bin or .dat for the level in Okami HD for PC.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Extension !! Short Description !! Archive&lt;br /&gt;
|-&lt;br /&gt;
| .ACT || Something to do with NPCs. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .AKT || Archive of collision models (.AK) || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Animal Group (.ANS) File Format|.ANS]] || Animals. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .BMH || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CAM || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .CMP || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .EAR || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Encounter (.ECT) File Format|.ECT]] || Encounters. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .EFF || Unknown Archive. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .FI2 || Atmospheric Effects || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Shop Contents (.ISL) File Format|.ISL]] || Shop contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Loot (.ITS) File Format|.ITS]] || Guaranteed loot locations. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Exit Destination (.JMP) File Format|.JMP]] || Exit destinations. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .LI3 || Lighting. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Zones (.MEH/.SCA/.SCI) File Format|.MEH &amp;lt;br&amp;gt;.SCA &amp;lt;br&amp;gt;.SCI]] || Zone definitions, such as dialogue, exits, bit flags. || .bin &amp;lt;br&amp;gt;.bin &amp;lt;br&amp;gt;.dat&lt;br /&gt;
|-&lt;br /&gt;
| .MOT || Animation (Motion). || .mot&lt;br /&gt;
|-&lt;br /&gt;
| .MRT || Unknown. Has locations of map restoration areas. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .MSA || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Message_Data_(.MSD)_File_Format|.MSD]] || Dialogue text. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Object_Placement_(.TAT/.TRE/.TSC)_File_Format|_objtbl.TSC &amp;lt;br&amp;gt;_objtbl2.TRE &amp;lt;br&amp;gt;_objtbl3.TAT]] || Objects placed around the map.  || .dat&lt;br /&gt;
|-&lt;br /&gt;
| [[Drop Table (.RNI) File Format|_randtbl.RNI]] || Drop tables. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .RHT || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCL || Unknown. || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCP || Archive containing texture models (.SCR) and a texture archive (.DDP). || .dat&lt;br /&gt;
|-&lt;br /&gt;
| .SCR || Texture model definitions. || .dat/.SCP&lt;br /&gt;
|-&lt;br /&gt;
| .SCM || Unknown || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .SSD || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| [[Dojo Contents (.SSL) File Format|.SSL]] || Dojo contents and prices. || .bin&lt;br /&gt;
|-&lt;br /&gt;
| .TS || Unknown. || .bin&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Akito</name></author>
	</entry>
</feed>