<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hyper</id>
	<title>HedgeDocs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://hedgedocs.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hyper"/>
	<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php/Special:Contributions/Hyper"/>
	<updated>2026-06-13T04:20:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Games&amp;diff=1533</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Games&amp;diff=1533"/>
		<updated>2026-05-28T20:10:41Z</updated>

		<summary type="html">&lt;p&gt;Hyper: Added Acroarts section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists games by their engine, alongside their internal name. In this page, you can access each game&#039;s own wiki page, containing game-specific guides, tools, and documentation.&lt;br /&gt;
&lt;br /&gt;
This section may also list non-Sonic games, but there is no intent on documenting these games on this wiki, as they&#039;re listed for research purposes only.&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Unleashed|Sonic Unleashed (Sonic World Adventure)]]&lt;br /&gt;
|SWA&lt;br /&gt;
|2008&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|sonic2010&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Generations]]&lt;br /&gt;
|BlueBlur&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|sonic2013&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate*&lt;br /&gt;
|Rainbow&lt;br /&gt;
|2021&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Generations (SONIC X SHADOW GENERATIONS)&lt;br /&gt;
|miller_g&lt;br /&gt;
|2024&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Colors: Ultimate also makes use of a forked version of Godot 3.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine 2 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games]]&lt;br /&gt;
|unison&lt;br /&gt;
|2016&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Forces]]&lt;br /&gt;
|wars&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Olympic Games Tokyo 2020 - The Official Video Game&lt;br /&gt;
|musashi&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2019&lt;br /&gt;
|-&lt;br /&gt;
|Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games&lt;br /&gt;
|rings&lt;br /&gt;
|-&lt;br /&gt;
|(New) Sakura Wars&lt;br /&gt;
|arukas&lt;br /&gt;
|-&lt;br /&gt;
|Puyo Puyo Tetris 2&lt;br /&gt;
|tenpex&lt;br /&gt;
|2020&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins]]*&lt;br /&gt;
|hite&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2022&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Frontiers]]&lt;br /&gt;
|rangers&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Frontiers: Digital Art Book with Mini Digital Soundtrack&lt;br /&gt;
|rangers_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins|Sonic Origins Plus]]*&lt;br /&gt;
|hiteplus&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars - Digital Artbook and mini-OST&lt;br /&gt;
|orion_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadow Generations]] / SONIC X SHADOW GENERATIONS&lt;br /&gt;
|miller&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2024&lt;br /&gt;
|-&lt;br /&gt;
|SONIC X SHADOW GENERATIONS: Art Book with Mini Soundtrack&lt;br /&gt;
|miller_das&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Origins (Plus) also makes use of Retro Engine v5U.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Acroarts ==&lt;br /&gt;
&#039;&#039;&#039;Acroarts&#039;&#039;&#039; is a proprietary graphics middleware developed by SEGA Games before ownership was transferred to CRI in 2016.&amp;lt;ref&amp;gt;SEGA Press Release (June 22, 2016). [https://web.archive.org/web/20260114134140/https://www.sega.co.jp/release/sega-games/images/160622_01.pdf SEGA Games and CRI Agree to Transfer the &amp;quot;Acroarts&amp;quot; Graphics Middleware Business].&amp;lt;/ref&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&lt;br /&gt;
|Marathon&lt;br /&gt;
|Ver20060209 R1&lt;br /&gt;
|2006&lt;br /&gt;
|-&lt;br /&gt;
|Rambo&lt;br /&gt;
|Clarith&lt;br /&gt;
|Ver20050809 R2&lt;br /&gt;
|2008&lt;br /&gt;
|-&lt;br /&gt;
|Mushiking Battle Gacchu Guts!!&lt;br /&gt;
|mk4exp&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Ver20100108 R1&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|Transformers: Human Alliance&lt;br /&gt;
|TF_Gun&lt;br /&gt;
|2013&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== NN ==&lt;br /&gt;
&#039;&#039;&#039;NN&#039;&#039;&#039; is a proprietary graphics library developed by SEGA Creative Center&#039;s Graphics Section.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sega Ages 2500 Series Vol. 5: Golden Axe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;&amp;gt;Argx2121 (2020-2025). [https://github.com/Argx2121/Sega_NN_tools/blob/master/io/nn_import_data.py Sega NN Tools import data].&amp;lt;/ref&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2003&lt;br /&gt;
|-&lt;br /&gt;
|Dabi Tsuku 3 - Derby-ba o Tsukurou!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.07.02 for GAMECUBE&amp;lt;br&amp;gt;1.07.04l for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sega Superstars&lt;br /&gt;
|&lt;br /&gt;
|1.13.00 for PlayStation2&lt;br /&gt;
|2004&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.03.03 for Lindbergh&lt;br /&gt;
|2005&lt;br /&gt;
|-&lt;br /&gt;
|Phantasy Star Universe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |2006&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|Marathon&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicR&lt;br /&gt;
|1.18.43 for PlayStation2&amp;lt;br&amp;gt;1.18.43 for DirectX G1.1&amp;lt;br&amp;gt;1.18.52 for Xbox&lt;br /&gt;
|-&lt;br /&gt;
|Bleach: Shattered Blade&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|nigo&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Banana Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.19.09 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Secret Rings&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicWildFire&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2007&lt;br /&gt;
|-&lt;br /&gt;
|Too Spicy&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.04.03 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Ghost Squad&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.02 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders: Zero Gravity&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SR2&lt;br /&gt;
|1.20.04 for GAMECUBE&amp;lt;br&amp;gt;1.18.56 for PlayStation2&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2008&lt;br /&gt;
|-&lt;br /&gt;
|Rambo&lt;br /&gt;
|Clarith&lt;br /&gt;
|1.04.04 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Unleashed (Sonic World Adventure) (Wii/PS2)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.14 for GAMECUBE&amp;lt;br&amp;gt;1.18.56 for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Black Knight&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2009&lt;br /&gt;
|-&lt;br /&gt;
|Loving Deads: The House of the Dead EX&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Step &amp;amp; Roll&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |2010&lt;br /&gt;
|-&lt;br /&gt;
|Mushiking Battle Gacchu Guts!!&lt;br /&gt;
|mk4exp&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K-On! After School Live!!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode I&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|hog&lt;br /&gt;
|1.01.05 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Free Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SRN&lt;br /&gt;
|1.01.06 for DirectX G2.0 on XBOX360&lt;br /&gt;
|-&lt;br /&gt;
|Sega Golden Gun&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Ticket Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4 (PSN)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2012&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode II&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06b for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Let&#039;s Go Safari&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K.O. Drive&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2013&lt;br /&gt;
|-&lt;br /&gt;
|Transformers: Human Alliance&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|TF_Gun&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unity ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dash&lt;br /&gt;
|&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Runners&lt;br /&gt;
|&lt;br /&gt;
|4.6.9f1&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2015&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Boom Dash (Sonic Dash 2: Sonic Boom Run)&lt;br /&gt;
|&lt;br /&gt;
|6000.0.68f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Forces: Speed Battle&lt;br /&gt;
|sprint&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing&lt;br /&gt;
|&lt;br /&gt;
|2018.4.16f1&lt;br /&gt;
|2019&lt;br /&gt;
|-&lt;br /&gt;
|The Murder of Sonic the Hedgehog&lt;br /&gt;
|&lt;br /&gt;
|2021.3.9f1&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars&lt;br /&gt;
|orion&lt;br /&gt;
|2021.3.25f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dream Team&lt;br /&gt;
|&lt;br /&gt;
|2022.3.54f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Rumble Party&lt;br /&gt;
|&lt;br /&gt;
|2022.3.64f1&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unreal Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing: CrossWorlds&lt;br /&gt;
|UNION&lt;br /&gt;
|5.4&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1532</id>
		<title>Text Font Map</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1532"/>
		<updated>2026-05-05T17:51:27Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Map&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character information.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under the &amp;lt;code&amp;gt;./text/&amp;lt;/code&amp;gt; directory from [[Sonic the Hedgehog (2006) File System#Platform Root|platform root]] as &amp;lt;code&amp;gt;*.ftm&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Atlas Size&lt;br /&gt;
!Pictures?&lt;br /&gt;
!Cell Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;fontmap.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|2048x2048&lt;br /&gt;
|✔️&lt;br /&gt;
|28x28&lt;br /&gt;
|For system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;font2map.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|1024x512&lt;br /&gt;
|❌&lt;br /&gt;
|37x50&lt;br /&gt;
|For main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;font3map.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|512x512&lt;br /&gt;
|❌&lt;br /&gt;
|31x41&lt;br /&gt;
|For main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&#039;&#039;&#039;Text Font Map&#039;&#039;&#039; uses a [[Binary Resource]] container.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x14&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;FNTM&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageCount&lt;br /&gt;
|The number of code pages mapped in this font.&lt;br /&gt;
This is a zero-based count, so 0 = 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageTableOffset&lt;br /&gt;
|The offset of the table of code page offsets.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|Byte&lt;br /&gt;
|Columns&lt;br /&gt;
|The number of columns in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0D&lt;br /&gt;
|Byte&lt;br /&gt;
|Rows&lt;br /&gt;
|The number of rows in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32&lt;br /&gt;
|FontNameOffset&lt;br /&gt;
|The offset of the name of this font.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Page Table ===&lt;br /&gt;
The code page table is an indirection table with a fixed size of 256 elements.&lt;br /&gt;
&lt;br /&gt;
Each element is a 32-bit offset that points to a fixed 256 element page of characters in Unicode. These characters consist of cell information and flags that map to the font atlas texture.&lt;br /&gt;
&lt;br /&gt;
=== Character ===&lt;br /&gt;
Each character is stored as the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x04&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Byte&lt;br /&gt;
|Column&lt;br /&gt;
|The column of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|Byte&lt;br /&gt;
|Row&lt;br /&gt;
|The row of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|UInt16&lt;br /&gt;
|Flags&lt;br /&gt;
|The flags for this character.&lt;br /&gt;
If &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;, this character will be unset.&lt;br /&gt;
|}&lt;br /&gt;
To get the Unicode character this element pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(CodePageIndex &amp;lt;&amp;lt; 8) | CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Font Data ===&lt;br /&gt;
The game stores the last remaining font information in a static array in the executable.&lt;br /&gt;
&lt;br /&gt;
The array can be found at the following addresses:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Platform&lt;br /&gt;
!File&lt;br /&gt;
!Virtual Address&lt;br /&gt;
!Physical Address&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360&lt;br /&gt;
|&amp;lt;code&amp;gt;default.xex&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x82B7F860&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0xB82860&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PlayStation 3&lt;br /&gt;
|&amp;lt;code&amp;gt;EBOOT.BIN&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x100DDA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x178DA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The array consists of three elements of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x1C&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|uint32_t&lt;br /&gt;
|ID&lt;br /&gt;
|The ID of this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|const char*&lt;br /&gt;
|pTexturePath&lt;br /&gt;
|A pointer to the path to the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureWidth&lt;br /&gt;
|The width of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureHeight&lt;br /&gt;
|The height of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontMapPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text&#039;&#039;&#039; &#039;&#039;&#039;Font Map&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontProportionPath&lt;br /&gt;
|A pointer to the path to the [[Text Font Proportion]] for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontPicturePath&lt;br /&gt;
|A pointer to the path to the [[Text Font Picture]] for this font.&lt;br /&gt;
If non-applicable, this should be null.&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x1A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellHeight&lt;br /&gt;
|The height of each character cell in the font atlas texture.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1531</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1531"/>
		<updated>2026-05-05T17:48:15Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|For system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff2.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|For main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff3.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|For main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a character has a width of zero, it&#039;ll fallback to the value stored in &amp;lt;code&amp;gt;CellWidth&amp;lt;/code&amp;gt; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1530</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1530"/>
		<updated>2026-05-05T17:43:38Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|For system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff2.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|For main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff3.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|For main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If a character has a width of zero, it&#039;ll fallback to the value stored in &#039;&#039;&#039;CellWidth&#039;&#039;&#039; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1529</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1529"/>
		<updated>2026-05-05T17:41:17Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|For system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff2.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|For main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff3.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|For main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If a character has a width of zero, it&#039;ll fallback to the value stored in &#039;&#039;&#039;CellWidth&#039;&#039;&#039; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1528</id>
		<title>Text Font Map</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1528"/>
		<updated>2026-05-05T17:41:16Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Map&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character information.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under the &amp;lt;code&amp;gt;./text/&amp;lt;/code&amp;gt; directory from [[Sonic the Hedgehog (2006) File System#Platform Root|platform root]] as &amp;lt;code&amp;gt;*.ftm&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Atlas Size&lt;br /&gt;
!Pictures?&lt;br /&gt;
!Cell Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;fontmap.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|2048x2048&lt;br /&gt;
|✔️&lt;br /&gt;
|28x28&lt;br /&gt;
|For system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;font2map.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|1024x512&lt;br /&gt;
|❌&lt;br /&gt;
|37x50&lt;br /&gt;
|For main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;font3map.ftm&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|512x512&lt;br /&gt;
|❌&lt;br /&gt;
|31x41&lt;br /&gt;
|For main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&#039;&#039;&#039;Text Font Map&#039;&#039;&#039; uses a [[Binary Resource]] container.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x14&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;FNTM&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageCount&lt;br /&gt;
|The number of code pages mapped in this font.&lt;br /&gt;
This is a zero-based count, so 0 = 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageTableOffset&lt;br /&gt;
|The offset of the table of code page offsets.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|Byte&lt;br /&gt;
|Columns&lt;br /&gt;
|The number of columns in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0D&lt;br /&gt;
|Byte&lt;br /&gt;
|Rows&lt;br /&gt;
|The number of rows in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32&lt;br /&gt;
|FontNameOffset&lt;br /&gt;
|The offset of the name of this font.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Page Table ===&lt;br /&gt;
The code page table is an indirection table with a fixed size of 256 elements.&lt;br /&gt;
&lt;br /&gt;
Each element is a 32-bit offset that points to a fixed 256 element page of characters in Unicode. These characters consist of cell information and flags that map to the font atlas texture.&lt;br /&gt;
&lt;br /&gt;
=== Character ===&lt;br /&gt;
Each character is stored as the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x04&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Byte&lt;br /&gt;
|Column&lt;br /&gt;
|The column of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|Byte&lt;br /&gt;
|Row&lt;br /&gt;
|The row of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|UInt16&lt;br /&gt;
|Flags&lt;br /&gt;
|The flags for this character.&lt;br /&gt;
If &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;, this character will be unset.&lt;br /&gt;
|}&lt;br /&gt;
To get the Unicode character this element pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(CodePageIndex &amp;lt;&amp;lt; 8) | CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Font Data ===&lt;br /&gt;
The game stores the last remaining font information in a static array in the executable.&lt;br /&gt;
&lt;br /&gt;
The array can be found at the following addresses:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Platform&lt;br /&gt;
!File&lt;br /&gt;
!Virtual Address&lt;br /&gt;
!Physical Address&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360&lt;br /&gt;
|&amp;lt;code&amp;gt;default.xex&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x82B7F860&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0xB82860&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PlayStation 3&lt;br /&gt;
|&amp;lt;code&amp;gt;EBOOT.BIN&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x100DDA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x178DA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The array consists of three elements of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x1C&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|uint32_t&lt;br /&gt;
|ID&lt;br /&gt;
|The ID of this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|const char*&lt;br /&gt;
|pTexturePath&lt;br /&gt;
|A pointer to the path to the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureWidth&lt;br /&gt;
|The width of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureHeight&lt;br /&gt;
|The height of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontMapPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text&#039;&#039;&#039; &#039;&#039;&#039;Font Map&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontProportionPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontPicturePath&lt;br /&gt;
|A pointer to the path to the [[Text Font Picture]] for this font.&lt;br /&gt;
If non-applicable, this should be null.&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x1A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellHeight&lt;br /&gt;
|The height of each character cell in the font atlas texture.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1527</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1527"/>
		<updated>2026-05-05T17:39:47Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|Used for system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff2.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|Used for main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;pf20_ff3.pfi&amp;lt;/code&amp;gt;&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|Used for main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If a character has a width of zero, it&#039;ll fallback to the value stored in &#039;&#039;&#039;CellWidth&#039;&#039;&#039; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1526</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1526"/>
		<updated>2026-05-05T17:38:56Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|pf20_ff.pfi&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|Used for system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|pf20_ff2.pfi&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|Used for main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|pf20_ff3.pfi&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|Used for main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If a character has a width of zero, it&#039;ll fallback to the value stored in &#039;&#039;&#039;CellWidth&#039;&#039;&#039; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1525</id>
		<title>Text Font Map</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1525"/>
		<updated>2026-05-05T17:38:54Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Map&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character information.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under the &amp;lt;code&amp;gt;./text/&amp;lt;/code&amp;gt; directory from [[Sonic the Hedgehog (2006) File System#Platform Root|platform root]] as &amp;lt;code&amp;gt;*.ftm&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Font&lt;br /&gt;
!Size&lt;br /&gt;
!Atlas Size&lt;br /&gt;
!Pictures?&lt;br /&gt;
!Cell Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|fontmap.ftm&lt;br /&gt;
|Rodin Pro Demi Bold&lt;br /&gt;
|18 ~ 20 px&lt;br /&gt;
|2048x2048&lt;br /&gt;
|✔️&lt;br /&gt;
|28x28&lt;br /&gt;
|Used for system text and subtitles.&lt;br /&gt;
|-&lt;br /&gt;
|font2map.ftm&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~24.5 px&lt;br /&gt;
|1024x512&lt;br /&gt;
|❌&lt;br /&gt;
|37x50&lt;br /&gt;
|Used for main menu header text.&lt;br /&gt;
|-&lt;br /&gt;
|font3map.ftm&lt;br /&gt;
|New Rodin Pro Ultra Bold&lt;br /&gt;
|~19.5 px&lt;br /&gt;
|512x512&lt;br /&gt;
|❌&lt;br /&gt;
|31x41&lt;br /&gt;
|Used for main menu option text.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&#039;&#039;&#039;Text Font Map&#039;&#039;&#039; uses a [[Binary Resource]] container.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x14&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;FNTM&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageCount&lt;br /&gt;
|The number of code pages mapped in this font.&lt;br /&gt;
This is a zero-based count, so 0 = 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageTableOffset&lt;br /&gt;
|The offset of the table of code page offsets.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|Byte&lt;br /&gt;
|Columns&lt;br /&gt;
|The number of columns in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0D&lt;br /&gt;
|Byte&lt;br /&gt;
|Rows&lt;br /&gt;
|The number of rows in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32&lt;br /&gt;
|FontNameOffset&lt;br /&gt;
|The offset of the name of this font.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Page Table ===&lt;br /&gt;
The code page table is an indirection table with a fixed size of 256 elements.&lt;br /&gt;
&lt;br /&gt;
Each element is a 32-bit offset that points to a fixed 256 element page of characters in Unicode. These characters consist of cell information and flags that map to the font atlas texture.&lt;br /&gt;
&lt;br /&gt;
=== Character ===&lt;br /&gt;
Each character is stored as the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x04&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Byte&lt;br /&gt;
|Column&lt;br /&gt;
|The column of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|Byte&lt;br /&gt;
|Row&lt;br /&gt;
|The row of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|UInt16&lt;br /&gt;
|Flags&lt;br /&gt;
|The flags for this character.&lt;br /&gt;
If &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;, this character will be unset.&lt;br /&gt;
|}&lt;br /&gt;
To get the Unicode character this element pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(CodePageIndex &amp;lt;&amp;lt; 8) | CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Font Data ===&lt;br /&gt;
The game stores the last remaining font information in a static array in the executable.&lt;br /&gt;
&lt;br /&gt;
The array can be found at the following addresses:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Platform&lt;br /&gt;
!File&lt;br /&gt;
!Virtual Address&lt;br /&gt;
!Physical Address&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360&lt;br /&gt;
|&amp;lt;code&amp;gt;default.xex&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x82B7F860&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0xB82860&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PlayStation 3&lt;br /&gt;
|&amp;lt;code&amp;gt;EBOOT.BIN&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x100DDA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x178DA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The array consists of three elements of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x1C&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|uint32_t&lt;br /&gt;
|ID&lt;br /&gt;
|The ID of this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|const char*&lt;br /&gt;
|pTexturePath&lt;br /&gt;
|A pointer to the path to the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureWidth&lt;br /&gt;
|The width of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureHeight&lt;br /&gt;
|The height of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontMapPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text&#039;&#039;&#039; &#039;&#039;&#039;Font Map&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontProportionPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontPicturePath&lt;br /&gt;
|A pointer to the path to the [[Text Font Picture]] for this font.&lt;br /&gt;
If non-applicable, this should be null.&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x1A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellHeight&lt;br /&gt;
|The height of each character cell in the font atlas texture.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1524</id>
		<title>Text Font Proportion</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Proportion&amp;diff=1524"/>
		<updated>2026-05-05T17:23:03Z</updated>

		<summary type="html">&lt;p&gt;Hyper: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Text Font Proportion&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; is a file format used in Sonic the Hedgehog (2006) for storing font character proportions.  These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.  == Specification ==  === Header === The header consists of the following data structure: {| class=&amp;quot;wikitable&amp;quot; |+Length: 0x10 !Offset !Type !Name !Description |- |0x00 |Char[4] |Signature |Always &amp;quot;PRFI&amp;quot;. |- |0x04 |UInt32 |DataOffset |Th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character proportions.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under &amp;lt;code&amp;gt;./common/text/&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;*.pfi&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x10&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;PRFI&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the &#039;&#039;&#039;Proportion Table&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt16&lt;br /&gt;
|Kerning&lt;br /&gt;
|The amount of spacing between each character in a string.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|UInt16&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageSeek&lt;br /&gt;
|The amount of characters to skip from the beginning of the code page.&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|CodePageLength&lt;br /&gt;
|The total size of the code page (including the skipped characters from &#039;&#039;&#039;CodePageSeek&#039;&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Proportion Table ===&lt;br /&gt;
The proportion table is an array of bytes that correspond to pixel widths of Unicode characters. The first 0x20 bytes in the code page are usually skipped, as they&#039;re control characters and typically aren&#039;t intended to be displayed.&lt;br /&gt;
&lt;br /&gt;
The length of the array can be calculated after reading the header by using the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageLength - CodePageSeek - 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If a character has a width of zero, it&#039;ll fallback to the value stored in &#039;&#039;&#039;CellWidth&#039;&#039;&#039; in the header. This is usually the case for Japanese characters, as they always have the same fixed width.&lt;br /&gt;
&lt;br /&gt;
To get the Unicode character a width pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CodePageSeek + CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1523</id>
		<title>Text Font Map</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Text_Font_Map&amp;diff=1523"/>
		<updated>2026-05-05T17:20:18Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Text Font Map&#039;&#039;&#039;&#039;&#039; is a file format used in [[Sonic the Hedgehog (2006)]] for storing font character information.&lt;br /&gt;
&lt;br /&gt;
These files are located in &amp;lt;code&amp;gt;text.arc&amp;lt;/code&amp;gt; under the &amp;lt;code&amp;gt;./text/&amp;lt;/code&amp;gt; directory from [[Sonic the Hedgehog (2006) File System#Platform Root|platform root]] as &amp;lt;code&amp;gt;*.ftm&amp;lt;/code&amp;gt; files.&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
&#039;&#039;&#039;Text Font Map&#039;&#039;&#039; uses a [[Binary Resource]] container.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x14&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;FNTM&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageCount&lt;br /&gt;
|The number of code pages mapped in this font.&lt;br /&gt;
This is a zero-based count, so 0 = 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|CodePageTableOffset&lt;br /&gt;
|The offset of the table of code page offsets.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|Byte&lt;br /&gt;
|Columns&lt;br /&gt;
|The number of columns in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0D&lt;br /&gt;
|Byte&lt;br /&gt;
|Rows&lt;br /&gt;
|The number of rows in the font atlas.&lt;br /&gt;
This field is not used by the game. See [[Text Font Map#Static Font Data|Static Font Data]].&lt;br /&gt;
|-&lt;br /&gt;
|0x0E&lt;br /&gt;
|UInt16&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always 1.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32&lt;br /&gt;
|FontNameOffset&lt;br /&gt;
|The offset of the name of this font.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Page Table ===&lt;br /&gt;
The code page table is an indirection table with a fixed size of 256 elements.&lt;br /&gt;
&lt;br /&gt;
Each element is a 32-bit offset that points to a fixed 256 element page of characters in Unicode. These characters consist of cell information and flags that map to the font atlas texture.&lt;br /&gt;
&lt;br /&gt;
=== Character ===&lt;br /&gt;
Each character is stored as the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x04&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Byte&lt;br /&gt;
|Column&lt;br /&gt;
|The column of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|Byte&lt;br /&gt;
|Row&lt;br /&gt;
|The row of this character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x02&lt;br /&gt;
|UInt16&lt;br /&gt;
|Flags&lt;br /&gt;
|The flags for this character.&lt;br /&gt;
If &amp;lt;code&amp;gt;0xFFFF&amp;lt;/code&amp;gt;, this character will be unset.&lt;br /&gt;
|}&lt;br /&gt;
To get the Unicode character this element pertains to, use the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
(CodePageIndex &amp;lt;&amp;lt; 8) | CharacterIndex&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Static Font Data ===&lt;br /&gt;
The game stores the last remaining font information in a static array in the executable.&lt;br /&gt;
&lt;br /&gt;
The array can be found at the following addresses:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Platform&lt;br /&gt;
!File&lt;br /&gt;
!Virtual Address&lt;br /&gt;
!Physical Address&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360&lt;br /&gt;
|&amp;lt;code&amp;gt;default.xex&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x82B7F860&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0xB82860&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|PlayStation 3&lt;br /&gt;
|&amp;lt;code&amp;gt;EBOOT.BIN&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x100DDA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;0x178DA20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
The array consists of three elements of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x1C&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|uint32_t&lt;br /&gt;
|ID&lt;br /&gt;
|The ID of this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|const char*&lt;br /&gt;
|pTexturePath&lt;br /&gt;
|A pointer to the path to the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureWidth&lt;br /&gt;
|The width of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|TextureHeight&lt;br /&gt;
|The height of the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontMapPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text&#039;&#039;&#039; &#039;&#039;&#039;Font Map&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontProportionPath&lt;br /&gt;
|A pointer to the path to the &#039;&#039;&#039;Text Font Proportion&#039;&#039;&#039; for this font.&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|const char*&lt;br /&gt;
|pTextFontPicturePath&lt;br /&gt;
|A pointer to the path to the [[Text Font Picture]] for this font.&lt;br /&gt;
If non-applicable, this should be null.&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellWidth&lt;br /&gt;
|The width of each character cell in the font atlas texture.&lt;br /&gt;
|-&lt;br /&gt;
|0x1A&lt;br /&gt;
|uint16_t&lt;br /&gt;
|CellHeight&lt;br /&gt;
|The height of each character cell in the font atlas texture.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Games&amp;diff=1522</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Games&amp;diff=1522"/>
		<updated>2026-05-03T19:27:40Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists games by their engine, alongside their internal name. In this page, you can access each game&#039;s own wiki page, containing game-specific guides, tools, and documentation.&lt;br /&gt;
&lt;br /&gt;
This section may also list non-Sonic games, but there is no intent on documenting these games on this wiki, as they&#039;re listed for research purposes only.&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Unleashed|Sonic Unleashed (Sonic World Adventure)]]&lt;br /&gt;
|SWA&lt;br /&gt;
|2008&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|sonic2010&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Generations]]&lt;br /&gt;
|BlueBlur&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|sonic2013&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate*&lt;br /&gt;
|Rainbow&lt;br /&gt;
|2021&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Generations (SONIC X SHADOW GENERATIONS)&lt;br /&gt;
|miller_g&lt;br /&gt;
|2024&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Colors: Ultimate also makes use of a forked version of Godot 3.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine 2 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games]]&lt;br /&gt;
|unison&lt;br /&gt;
|2016&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Forces]]&lt;br /&gt;
|wars&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Olympic Games Tokyo 2020 - The Official Video Game&lt;br /&gt;
|musashi&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2019&lt;br /&gt;
|-&lt;br /&gt;
|Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games&lt;br /&gt;
|rings&lt;br /&gt;
|-&lt;br /&gt;
|(New) Sakura Wars&lt;br /&gt;
|arukas&lt;br /&gt;
|-&lt;br /&gt;
|Puyo Puyo Tetris 2&lt;br /&gt;
|tenpex&lt;br /&gt;
|2020&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins]]*&lt;br /&gt;
|hite&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2022&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Frontiers]]&lt;br /&gt;
|rangers&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Frontiers: Digital Art Book with Mini Digital Soundtrack&lt;br /&gt;
|rangers_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins|Sonic Origins Plus]]*&lt;br /&gt;
|hiteplus&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars - Digital Artbook and mini-OST&lt;br /&gt;
|orion_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadow Generations]] / SONIC X SHADOW GENERATIONS&lt;br /&gt;
|miller&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2024&lt;br /&gt;
|-&lt;br /&gt;
|SONIC X SHADOW GENERATIONS: Art Book with Mini Soundtrack&lt;br /&gt;
|miller_das&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Origins (Plus) also makes use of Retro Engine v5U.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== NN ==&lt;br /&gt;
&#039;&#039;&#039;NN&#039;&#039;&#039; is a proprietary graphics library developed by SEGA Creative Center&#039;s Graphics Section.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sega Ages 2500 Series Vol. 5: Golden Axe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;&amp;gt;[https://github.com/Argx2121/Sega_NN_tools/blob/master/io/nn_import_data.py Sega NN Tools import data]&amp;lt;/ref&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2003&lt;br /&gt;
|-&lt;br /&gt;
|Dabi Tsuku 3 - Derby-ba o Tsukurou!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.07.02 for GAMECUBE&amp;lt;br&amp;gt;1.07.04l for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sega Superstars&lt;br /&gt;
|&lt;br /&gt;
|1.13.00 for PlayStation2&lt;br /&gt;
|2004&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.03.03 for Lindbergh&lt;br /&gt;
|2005&lt;br /&gt;
|-&lt;br /&gt;
|Phantasy Star Universe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |2006&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|Marathon&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicR&lt;br /&gt;
|1.18.43 for PlayStation2&amp;lt;br&amp;gt;1.18.43 for DirectX G1.1&amp;lt;br&amp;gt;1.18.52 for Xbox&lt;br /&gt;
|-&lt;br /&gt;
|Bleach: Shattered Blade&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|nigo&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Banana Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.19.09 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Secret Rings&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicWildFire&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2007&lt;br /&gt;
|-&lt;br /&gt;
|Too Spicy&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.04.03 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Ghost Squad&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.02 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders: Zero Gravity&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SR2&lt;br /&gt;
|1.20.04 for GAMECUBE&amp;lt;br&amp;gt;1.18.56 for PlayStation2&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2008&lt;br /&gt;
|-&lt;br /&gt;
|Rambo&lt;br /&gt;
|Clarith&lt;br /&gt;
|1.04.04 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Unleashed (Sonic World Adventure) (Wii/PS2)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.14 for GAMECUBE&amp;lt;br&amp;gt;1.18.56 for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Black Knight&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2009&lt;br /&gt;
|-&lt;br /&gt;
|Loving Deads: The House of the Dead EX&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Step &amp;amp; Roll&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |2010&lt;br /&gt;
|-&lt;br /&gt;
|Mushiking Battle Gacchu Guts!!&lt;br /&gt;
|mk4exp&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K-On! After School Live!!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode I&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|hog&lt;br /&gt;
|1.01.05 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Free Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SRN&lt;br /&gt;
|1.01.06 for DirectX G2.0 on XBOX360&lt;br /&gt;
|-&lt;br /&gt;
|Sega Golden Gun&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Ticket Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4 (PSN)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2012&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode II&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06b for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Let&#039;s Go Safari&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K.O. Drive&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2013&lt;br /&gt;
|-&lt;br /&gt;
|Transformers: Human Alliance&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|TF_Gun&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unity ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dash&lt;br /&gt;
|&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Runners&lt;br /&gt;
|&lt;br /&gt;
|4.6.9f1&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2015&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Boom Dash (Sonic Dash 2: Sonic Boom Run)&lt;br /&gt;
|&lt;br /&gt;
|6000.0.68f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Forces: Speed Battle&lt;br /&gt;
|sprint&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing&lt;br /&gt;
|&lt;br /&gt;
|2018.4.16f1&lt;br /&gt;
|2019&lt;br /&gt;
|-&lt;br /&gt;
|The Murder of Sonic the Hedgehog&lt;br /&gt;
|&lt;br /&gt;
|2021.3.9f1&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars&lt;br /&gt;
|orion&lt;br /&gt;
|2021.3.25f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dream Team&lt;br /&gt;
|&lt;br /&gt;
|2022.3.54f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Rumble Party&lt;br /&gt;
|&lt;br /&gt;
|2022.3.64f1&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unreal Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing: CrossWorlds&lt;br /&gt;
|UNION&lt;br /&gt;
|5.4&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Games&amp;diff=1521</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Games&amp;diff=1521"/>
		<updated>2026-05-03T19:14:26Z</updated>

		<summary type="html">&lt;p&gt;Hyper: Identified Sonic Racing: CrossWorlds engine version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists games by their engine, alongside their internal name. In this page, you can access each game&#039;s own wiki page, containing game-specific guides, tools, and documentation.&lt;br /&gt;
&lt;br /&gt;
This section may also list non-Sonic games, but there is no intent on documenting these games on this wiki, as they&#039;re listed for research purposes only.&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Unleashed|Sonic Unleashed (Sonic World Adventure)]]&lt;br /&gt;
|SWA&lt;br /&gt;
|2008&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|sonic2010&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Generations]]&lt;br /&gt;
|BlueBlur&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|sonic2013&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate*&lt;br /&gt;
|Rainbow&lt;br /&gt;
|2021&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Generations (SONIC X SHADOW GENERATIONS)&lt;br /&gt;
|miller_g&lt;br /&gt;
|2024&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Colors: Ultimate also makes use of a forked version of Godot 3.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine 2 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games]]&lt;br /&gt;
|unison&lt;br /&gt;
|2016&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Forces]]&lt;br /&gt;
|wars&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Olympic Games Tokyo 2020 - The Official Video Game&lt;br /&gt;
|musashi&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2019&lt;br /&gt;
|-&lt;br /&gt;
|Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games&lt;br /&gt;
|rings&lt;br /&gt;
|-&lt;br /&gt;
|(New) Sakura Wars&lt;br /&gt;
|arukas&lt;br /&gt;
|-&lt;br /&gt;
|Puyo Puyo Tetris 2&lt;br /&gt;
|tenpex&lt;br /&gt;
|2020&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins]]*&lt;br /&gt;
|hite&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2022&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Frontiers]]&lt;br /&gt;
|rangers&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Frontiers: Digital Art Book with Mini Digital Soundtrack&lt;br /&gt;
|rangers_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins|Sonic Origins Plus]]*&lt;br /&gt;
|hiteplus&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars - Digital Artbook and mini-OST&lt;br /&gt;
|orion_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadow Generations]] / SONIC X SHADOW GENERATIONS&lt;br /&gt;
|miller&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2024&lt;br /&gt;
|-&lt;br /&gt;
|SONIC X SHADOW GENERATIONS: Art Book with Mini Soundtrack&lt;br /&gt;
|miller_das&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Origins (Plus) also makes use of Retro Engine v5U.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== NN ==&lt;br /&gt;
&#039;&#039;&#039;NN&#039;&#039;&#039; is a proprietary graphics library developed by SEGA Creative Center&#039;s Graphics Section.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sega Ages 2500 Series Vol. 5: Golden Axe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;&amp;gt;[https://github.com/Argx2121/Sega_NN_tools/blob/master/io/nn_import_data.py Sega NN Tools import data]&amp;lt;/ref&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2003&lt;br /&gt;
|-&lt;br /&gt;
|Dabi Tsuku 3 - Derby-ba o Tsukurou!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.07.02 for GAMECUBE&amp;lt;br&amp;gt;1.07.04l for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sega Superstars&lt;br /&gt;
|&lt;br /&gt;
|1.13.00 for PlayStation2&lt;br /&gt;
|2004&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.03.03 for Lindbergh&lt;br /&gt;
|2005&lt;br /&gt;
|-&lt;br /&gt;
|Phantasy Star Universe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |2006&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|Marathon&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicR&lt;br /&gt;
|1.18.43 for PlayStation2&amp;lt;br&amp;gt;1.18.43 for DirectX G1.1&amp;lt;br&amp;gt;1.18.52 for Xbox&lt;br /&gt;
|-&lt;br /&gt;
|Bleach: Shattered Blade&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|nigo&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Banana Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.19.09 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Secret Rings&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicWildFire&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2007&lt;br /&gt;
|-&lt;br /&gt;
|Too Spicy&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.04.03 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Ghost Squad&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.02 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders: Zero Gravity&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SR2&lt;br /&gt;
|1.18.56 for PlayStation2&amp;lt;br&amp;gt;1.20.04 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2008&lt;br /&gt;
|-&lt;br /&gt;
|Rambo&lt;br /&gt;
|Clarith&lt;br /&gt;
|1.04.04 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Unleashed (Sonic World Adventure)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.14 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Black Knight&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2009&lt;br /&gt;
|-&lt;br /&gt;
|Loving Deads: The House of the Dead EX&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Step &amp;amp; Roll&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |2010&lt;br /&gt;
|-&lt;br /&gt;
|Mushiking Battle Gacchu Guts!!&lt;br /&gt;
|mk4exp&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K-On! After School Live!!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode I&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|hog&lt;br /&gt;
|1.01.05 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Free Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SRN&lt;br /&gt;
|1.01.06 for DirectX G2.0 on XBOX360&lt;br /&gt;
|-&lt;br /&gt;
|Sega Golden Gun&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Ticket Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4 (PSN)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2012&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode II&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06b for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Let&#039;s Go Safari&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K.O. Drive&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2013&lt;br /&gt;
|-&lt;br /&gt;
|Transformers: Human Alliance&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|TF_Gun&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unity ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dash&lt;br /&gt;
|&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Runners&lt;br /&gt;
|&lt;br /&gt;
|4.6.9f1&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2015&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Boom Dash (Sonic Dash 2: Sonic Boom Run)&lt;br /&gt;
|&lt;br /&gt;
|6000.0.68f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Forces: Speed Battle&lt;br /&gt;
|sprint&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing&lt;br /&gt;
|&lt;br /&gt;
|2018.4.16f1&lt;br /&gt;
|2019&lt;br /&gt;
|-&lt;br /&gt;
|The Murder of Sonic the Hedgehog&lt;br /&gt;
|&lt;br /&gt;
|2021.3.9f1&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars&lt;br /&gt;
|orion&lt;br /&gt;
|2021.3.25f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dream Team&lt;br /&gt;
|&lt;br /&gt;
|2022.3.54f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Rumble Party&lt;br /&gt;
|&lt;br /&gt;
|2022.3.64f1&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unreal Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing: CrossWorlds&lt;br /&gt;
|UNION&lt;br /&gt;
|5.4&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Games&amp;diff=1520</id>
		<title>Games</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Games&amp;diff=1520"/>
		<updated>2026-05-03T19:11:03Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists games by their engine, alongside their internal name. In this page, you can access each game&#039;s own wiki page, containing game-specific guides, tools, and documentation.&lt;br /&gt;
&lt;br /&gt;
This section may also list non-Sonic games, but there is no intent on documenting these games on this wiki, as they&#039;re listed for research purposes only.&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Unleashed|Sonic Unleashed (Sonic World Adventure)]]&lt;br /&gt;
|SWA&lt;br /&gt;
|2008&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|sonic2010&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Generations]]&lt;br /&gt;
|BlueBlur&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|sonic2013&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate*&lt;br /&gt;
|Rainbow&lt;br /&gt;
|2021&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Generations (SONIC X SHADOW GENERATIONS)&lt;br /&gt;
|miller_g&lt;br /&gt;
|2024&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Colors: Ultimate also makes use of a forked version of Godot 3.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Hedgehog Engine 2 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|[[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games]]&lt;br /&gt;
|unison&lt;br /&gt;
|2016&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Forces]]&lt;br /&gt;
|wars&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Olympic Games Tokyo 2020 - The Official Video Game&lt;br /&gt;
|musashi&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2019&lt;br /&gt;
|-&lt;br /&gt;
|Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games&lt;br /&gt;
|rings&lt;br /&gt;
|-&lt;br /&gt;
|(New) Sakura Wars&lt;br /&gt;
|arukas&lt;br /&gt;
|-&lt;br /&gt;
|Puyo Puyo Tetris 2&lt;br /&gt;
|tenpex&lt;br /&gt;
|2020&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins]]*&lt;br /&gt;
|hite&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2022&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Frontiers]]&lt;br /&gt;
|rangers&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Frontiers: Digital Art Book with Mini Digital Soundtrack&lt;br /&gt;
|rangers_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Origins|Sonic Origins Plus]]*&lt;br /&gt;
|hiteplus&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars - Digital Artbook and mini-OST&lt;br /&gt;
|orion_artbook&lt;br /&gt;
|-&lt;br /&gt;
|[[Shadow Generations]] / SONIC X SHADOW GENERATIONS&lt;br /&gt;
|miller&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2024&lt;br /&gt;
|-&lt;br /&gt;
|SONIC X SHADOW GENERATIONS: Art Book with Mini Soundtrack&lt;br /&gt;
|miller_das&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;&amp;lt;small&amp;gt;* Sonic Origins (Plus) also makes use of Retro Engine v5U.&amp;lt;/small&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== NN ==&lt;br /&gt;
&#039;&#039;&#039;NN&#039;&#039;&#039; is a proprietary graphics library developed by SEGA Creative Center&#039;s Graphics Section.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sega Ages 2500 Series Vol. 5: Golden Axe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;&amp;gt;[https://github.com/Argx2121/Sega_NN_tools/blob/master/io/nn_import_data.py Sega NN Tools import data]&amp;lt;/ref&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2003&lt;br /&gt;
|-&lt;br /&gt;
|Dabi Tsuku 3 - Derby-ba o Tsukurou!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.07.02 for GAMECUBE&amp;lt;br&amp;gt;1.07.04l for PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|Sega Superstars&lt;br /&gt;
|&lt;br /&gt;
|1.13.00 for PlayStation2&lt;br /&gt;
|2004&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.03.03 for Lindbergh&lt;br /&gt;
|2005&lt;br /&gt;
|-&lt;br /&gt;
|Phantasy Star Universe&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |2006&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|Marathon&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicR&lt;br /&gt;
|1.18.43 for PlayStation2&amp;lt;br&amp;gt;1.18.43 for DirectX G1.1&amp;lt;br&amp;gt;1.18.52 for Xbox&lt;br /&gt;
|-&lt;br /&gt;
|Bleach: Shattered Blade&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|nigo&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Banana Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.19.09 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Secret Rings&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SonicWildFire&lt;br /&gt;
|1.19.095 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2007&lt;br /&gt;
|-&lt;br /&gt;
|Too Spicy&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.04.03 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Ghost Squad&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.02 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Riders: Zero Gravity&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SR2&lt;br /&gt;
|1.18.56 for PlayStation2&amp;lt;br&amp;gt;1.20.04 for GAMECUBE&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2008&lt;br /&gt;
|-&lt;br /&gt;
|Rambo&lt;br /&gt;
|Clarith&lt;br /&gt;
|1.04.04 for LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Unleashed (Sonic World Adventure)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.14 for GAMECUBE&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Black Knight&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2009&lt;br /&gt;
|-&lt;br /&gt;
|Loving Deads: The House of the Dead EX&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Step &amp;amp; Roll&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.20.20 for Wii&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; |2010&lt;br /&gt;
|-&lt;br /&gt;
|Mushiking Battle Gacchu Guts!!&lt;br /&gt;
|mk4exp&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K-On! After School Live!!&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode I&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|hog&lt;br /&gt;
|1.01.05 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Free Riders&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|SRN&lt;br /&gt;
|1.01.06 for DirectX G2.0 on XBOX360&lt;br /&gt;
|-&lt;br /&gt;
|Sega Golden Gun&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Super Monkey Ball: Ticket Blitz&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|2011&lt;br /&gt;
|-&lt;br /&gt;
|The House of the Dead 4 (PSN)&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|?&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2012&lt;br /&gt;
|-&lt;br /&gt;
|Sonic the Hedgehog 4: Episode II&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06b for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|Let&#039;s Go Safari&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|-&lt;br /&gt;
|K.O. Drive&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2013&lt;br /&gt;
|-&lt;br /&gt;
|Transformers: Human Alliance&amp;lt;ref name=&amp;quot;ref_sega_nn_tools&amp;quot;/&amp;gt;&lt;br /&gt;
|TF_Gun&lt;br /&gt;
|1.01.06 for DirectX G2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unity ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dash&lt;br /&gt;
|&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2013&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Runners&lt;br /&gt;
|&lt;br /&gt;
|4.6.9f1&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |2015&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Boom Dash (Sonic Dash 2: Sonic Boom Run)&lt;br /&gt;
|&lt;br /&gt;
|6000.0.68f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Forces: Speed Battle&lt;br /&gt;
|sprint&lt;br /&gt;
|6000.0.58f2&lt;br /&gt;
|2017&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing&lt;br /&gt;
|&lt;br /&gt;
|2018.4.16f1&lt;br /&gt;
|2019&lt;br /&gt;
|-&lt;br /&gt;
|The Murder of Sonic the Hedgehog&lt;br /&gt;
|&lt;br /&gt;
|2021.3.9f1&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |2023&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Superstars&lt;br /&gt;
|orion&lt;br /&gt;
|2021.3.25f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Dream Team&lt;br /&gt;
|&lt;br /&gt;
|2022.3.54f1&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Rumble Party&lt;br /&gt;
|&lt;br /&gt;
|2022.3.64f1&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Unreal Engine ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game Name&lt;br /&gt;
!Internal Name&lt;br /&gt;
!Version&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Racing: CrossWorlds&lt;br /&gt;
|UNION&lt;br /&gt;
|5&lt;br /&gt;
|2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=U8_Archive&amp;diff=1519</id>
		<title>U8 Archive</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=U8_Archive&amp;diff=1519"/>
		<updated>2026-05-03T19:07:49Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;U8 Archive&#039;&#039;&#039;&#039;&#039; is a hierarchical archive format developed by Nintendo during the GameCube era and was predominantly used on the Wii.&lt;br /&gt;
&lt;br /&gt;
== Titles using U8 Archive ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Game&lt;br /&gt;
!Usage&lt;br /&gt;
!Platforms&lt;br /&gt;
!Year&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Heroes&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Used as the packed file system.&lt;br /&gt;
|PlayStation 2&lt;br /&gt;
|2003&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&lt;br /&gt;
|Xbox 360, PlayStation 3&lt;br /&gt;
|2006&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Secret Rings&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Used for operating system only.&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Wii&lt;br /&gt;
|2007&lt;br /&gt;
|-&lt;br /&gt;
|Sonic and the Black Knight&lt;br /&gt;
|2009&lt;br /&gt;
|-&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|Used as the packed file system.&lt;br /&gt;
|2010&lt;br /&gt;
|-&lt;br /&gt;
|Sonic Colors: Ultimate&lt;br /&gt;
|Used as the packed file system for data not covered by Godot.&lt;br /&gt;
|Windows, Xbox One, PlayStation 4, Switch&lt;br /&gt;
|2021&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specification ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x20&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|UInt32&lt;br /&gt;
|Signature&lt;br /&gt;
|Always 0x55AA382D (big-endian) or 0x2D38AA55 (little-endian).&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|FSTableOffset&lt;br /&gt;
|The offset of the file system table.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|FSTableLength&lt;br /&gt;
|The length of the file system table (including the string pool).&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt32&lt;br /&gt;
|DataOffset&lt;br /&gt;
|The offset of the file data.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32[4]&lt;br /&gt;
|Reserved&lt;br /&gt;
|These fields appear to be populated in archives for &#039;&#039;&#039;Sonic the Hedgehog (2006)&#039;&#039;&#039;, but this is bogus data from uninitialised memory and should be ignored.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;For the sake of tooling heuristics, writing &amp;lt;code&amp;gt;0xE4F91300&amp;lt;/code&amp;gt; (big-endian) to index 0 and &amp;lt;code&amp;gt;0x78013800&amp;lt;/code&amp;gt; (big-endian) to index 3 would be ideal for detecting whether an archive is from that game specifically.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== File System ===&lt;br /&gt;
The file system consists of an array of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x0C (or 0x10 for Sonic the Hedgehog (2006))&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|Boolean (UInt8)&lt;br /&gt;
|IsDirectory&lt;br /&gt;
|Determines whether this node is a directory.&lt;br /&gt;
|-&lt;br /&gt;
|0x01&lt;br /&gt;
|UInt24&lt;br /&gt;
|NameOffset&lt;br /&gt;
|The offset of this node&#039;s name in the string pool.&amp;lt;br&amp;gt;If root, always zero.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|Union (UInt32, UInt32)&lt;br /&gt;
|DataOffset, ParentIndex&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|File&lt;br /&gt;
|The offset of this file&#039;s data.&lt;br /&gt;
|-&lt;br /&gt;
|Directory&lt;br /&gt;
|The index of the parent node for this directory.&amp;lt;br&amp;gt;If root, always zero.&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Union (UInt32, UInt32)&lt;br /&gt;
|Length, NodeCount&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|File&lt;br /&gt;
|The length of this file&#039;s data.&lt;br /&gt;
|-&lt;br /&gt;
|Directory&lt;br /&gt;
|The total number of nodes in this directory.&amp;lt;br&amp;gt;If root, the total number of nodes in this archive.&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt32&lt;br /&gt;
|UncompressedLength&lt;br /&gt;
|This field is unique to archives for &#039;&#039;&#039;Sonic the Hedgehog (2006)&#039;&#039;&#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|File&lt;br /&gt;
|The uncompressed length of this file&#039;s data. This field can be set to zero to disable compression for this file, allowing its data to be stored uncompressed.&lt;br /&gt;
|-&lt;br /&gt;
|Directory&lt;br /&gt;
|Undefined. Much like the reserved bytes in the header, this field will appear to be populated, but again, this is bogus data from uninitialised memory.&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
The total number of nodes to read is determined by the root node&#039;s &amp;lt;code&amp;gt;NodeCount&amp;lt;/code&amp;gt; field. As this is a hierarchical file system, nodes should be read recursively to build the file system correctly.&lt;br /&gt;
&lt;br /&gt;
The first node &#039;&#039;&#039;must&#039;&#039;&#039; be a root node defined as a directory, with the &amp;lt;code&amp;gt;NodeCount&amp;lt;/code&amp;gt; field set to the total number of nodes in the archive. This is necessary for determining the length of the file system table.&lt;br /&gt;
&lt;br /&gt;
=== String Pool ===&lt;br /&gt;
The string pool offset can be calculated after reading the root node and using the following expression:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
FSTableOffset + (Root.NodeCount * FSNodeSize) // FSNodeSize = 0x0C (or 0x10 for Sonic the Hedgehog (2006))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Each string in the pool is ASCII-encoded and null-terminated, the offsets to which are relative to the start of the pool.&lt;br /&gt;
&lt;br /&gt;
The string pool &#039;&#039;&#039;must&#039;&#039;&#039; have a single null terminator at the beginning for the root node, as it does not have a name.&lt;br /&gt;
&lt;br /&gt;
=== File Data ===&lt;br /&gt;
Files are aligned by 32 bytes per file after the string pool.&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;&#039;Sonic the Hedgehog (2006)&#039;&#039;&#039;, files may be compressed using [[wikipedia:Zlib|zlib]]. This compression is optional, and files can be stored uncompressed so long as &amp;lt;code&amp;gt;UncompressedLength&amp;lt;/code&amp;gt; is set to zero.&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Sonic_the_Hedgehog_(2006)&amp;diff=1518</id>
		<title>Sonic the Hedgehog (2006)</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Sonic_the_Hedgehog_(2006)&amp;diff=1518"/>
		<updated>2026-05-03T18:55:20Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Guides ==&lt;br /&gt;
=== Level Editing ===&lt;br /&gt;
* [[How To Use Sonic GLvl with Sonic &#039;06|Sonic GLvl]]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
=== General ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) File System|File System]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) Shaders|Shaders]]&lt;br /&gt;
* [[Texture Tags]]&lt;br /&gt;
&lt;br /&gt;
=== Player ===&lt;br /&gt;
* [[Player State IDs]]&lt;br /&gt;
* [[Player State Maps]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) Script Functions|Script Functions]]&lt;br /&gt;
* [[Mission Parameters]]&lt;br /&gt;
* [[Player Parameters]]&lt;br /&gt;
* [[Scene Parameters]]&lt;br /&gt;
&lt;br /&gt;
=== Stage ===&lt;br /&gt;
* [[Section IDs]]&lt;br /&gt;
&lt;br /&gt;
== Formats ==&lt;br /&gt;
&lt;br /&gt;
=== Acroarts ===&lt;br /&gt;
* [[Acroarts Resource]] (*.mab)&lt;br /&gt;
* [[DirectDraw Map]] (*.ddm)&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
* [[U8 Archive|Arc File]] (*.arc)&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* [[Sound Bank]] (*.sbk)&lt;br /&gt;
&lt;br /&gt;
=== Event ===&lt;br /&gt;
* [[Event Playbook]] (*.epb)&lt;br /&gt;
* [[Time Event]] (*.tev)&lt;br /&gt;
&lt;br /&gt;
=== Kynapse ===&lt;br /&gt;
* [[Kynapse Big File]] (*.kbf)&lt;br /&gt;
* [[Kynogon A* Data]] (*.adl)&lt;br /&gt;
* [[Kynogon Find Nearest Data]] (*.fdl)&lt;br /&gt;
* [[Kynogon Path Cost Data]] (*.cdl)&lt;br /&gt;
* [[Kynogon Path Way]] (*.pwl)&lt;br /&gt;
* [[Kynogon Spatial Graph]] (*.pdl)&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
* [[Land Collision]] (collision.bin)&lt;br /&gt;
* [[Reflection Area]] (*.rab)&lt;br /&gt;
* [[Spline Path]] (*.path)&lt;br /&gt;
* [[Spline Path (Old)]] (*.bin)&lt;br /&gt;
&lt;br /&gt;
=== [[NN Chunk Format|Ninja]] ===&lt;br /&gt;
* Camera (*.xnc, *.xnd)&lt;br /&gt;
* Camera Motion (*.xnd)&lt;br /&gt;
* Effect List (*.xne)&lt;br /&gt;
* Light (*.xni, *.xnl)&lt;br /&gt;
* Light Motion (*.xni)&lt;br /&gt;
* Material Motion (*.xnv)&lt;br /&gt;
* Morph Motion (*.xnf)&lt;br /&gt;
* Morph Target (*.xng)&lt;br /&gt;
* Node Motion (*.xnm)&lt;br /&gt;
* Node Name (*.xna)&lt;br /&gt;
* Object (*.xno)&lt;br /&gt;
* Texture List (*.xnt)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* [[Enemy Parameter List]] (ScriptParameter.bin)&lt;br /&gt;
* [[Enemy Shot Parameter List]] (ShotParameter.bin)&lt;br /&gt;
* [[Object Explosion Parameter List]] (Explosion.bin)&lt;br /&gt;
* [[Object Physics Parameter List]] (Common.bin)&lt;br /&gt;
* [[Package]] (*.pkg)&lt;br /&gt;
* [[Path Object Parameter List]] (PathObj.bin)&lt;br /&gt;
&lt;br /&gt;
=== Particle ===&lt;br /&gt;
* [[Particle Container]] (*.plc)&lt;br /&gt;
* [[Particle Effect Bank]] (*.peb)&lt;br /&gt;
* [[Particle Global Settings]] (*.pgs)&lt;br /&gt;
* [[Particle Texture Bank]] (*.ptb)&lt;br /&gt;
&lt;br /&gt;
=== Placement ===&lt;br /&gt;
* [[Prop Library]] (*.prop)&lt;br /&gt;
* [[Stage Set]] (*.set)&lt;br /&gt;
&lt;br /&gt;
=== Save ===&lt;br /&gt;
* [[Save Data]] (SonicNextSaveData.bin)&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
* [[Lua Binary]] (*.lub)&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
* [[Text Book]] (*.mst)&lt;br /&gt;
* [[Text Font Map]] (*.ftm)&lt;br /&gt;
* [[Text Font Picture]] (*.pft)&lt;br /&gt;
* [[Text Font Proportion]] (*.pfi)&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Sonic_the_Hedgehog_(2006)&amp;diff=1517</id>
		<title>Sonic the Hedgehog (2006)</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Sonic_the_Hedgehog_(2006)&amp;diff=1517"/>
		<updated>2026-05-03T18:48:03Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Guides ==&lt;br /&gt;
=== Level Editing ===&lt;br /&gt;
* [[How To Use Sonic GLvl with Sonic &#039;06|Sonic GLvl]]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
=== General ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) File System|File System]]&lt;br /&gt;
&lt;br /&gt;
=== Graphics ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) Shaders|Shaders]]&lt;br /&gt;
* [[Texture Tags]]&lt;br /&gt;
&lt;br /&gt;
=== Player ===&lt;br /&gt;
* [[Player State IDs]]&lt;br /&gt;
* [[Player State Maps]]&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
* [[Sonic the Hedgehog (2006) Script Functions|Script Functions]]&lt;br /&gt;
* [[Mission Parameters]]&lt;br /&gt;
* [[Player Parameters]]&lt;br /&gt;
* [[Scene Parameters]]&lt;br /&gt;
&lt;br /&gt;
=== Stage ===&lt;br /&gt;
* [[Section IDs]]&lt;br /&gt;
&lt;br /&gt;
== Formats ==&lt;br /&gt;
=== Archive ===&lt;br /&gt;
* [[U8 Archive]]&lt;br /&gt;
&lt;br /&gt;
=== Event ===&lt;br /&gt;
* [[Event Playbook]]&lt;br /&gt;
&lt;br /&gt;
=== Ninja ===&lt;br /&gt;
* [[NN Chunk Format]]&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
* [[Text Book]]&lt;br /&gt;
* [[Text Font Map]]&lt;br /&gt;
* [[Text Font Picture]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Marathon&amp;diff=1516</id>
		<title>Marathon</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Marathon&amp;diff=1516"/>
		<updated>2026-05-03T18:40:19Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Marathon|image=Marathon_Logo.png|author=Hyper|download=https://github.com/hyperbx/Marathon/releases/latest|website=https://github.com/hyperbx/Marathon}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Marathon&#039;&#039;&#039;&#039;&#039; is a toolkit and library for [[Sonic the Hedgehog (2006)]] file formats.&lt;br /&gt;
&lt;br /&gt;
Formerly known as &#039;&#039;&#039;Sonic &#039;06 Toolkit&#039;&#039;&#039;, it originally started out as a frontend for external tools written in Visual Basic .NET, then later C#.&lt;br /&gt;
&lt;br /&gt;
The current name is derived from the internal name of &#039;&#039;&#039;Sonic the Hedgehog (2006)&#039;&#039;&#039;, known as &amp;quot;Marathon&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Supported ==&lt;br /&gt;
&#039;&#039;&#039;Marathon&#039;&#039;&#039; is currently in active development and is undergoing a large refactoring in the v2.0.0 branch, so many of these formats have either been changed since the latest public release, or are only available in that branch via the API.&lt;br /&gt;
&lt;br /&gt;
=== Acroarts ===&lt;br /&gt;
* Acroarts Resource (*.mab)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;&amp;gt;Available only in the v2.0.0 branch.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* DirectDraw Map (*.ddm)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
* [[U8 Archive|Arc File]] (*.arc)&amp;lt;ref&amp;gt;Formerly &amp;quot;U8 Archive&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* Sound Bank (*.sbk)&lt;br /&gt;
&lt;br /&gt;
=== Event ===&lt;br /&gt;
* [[Event Playbook]] (*.epb)&lt;br /&gt;
* Time Event (*.tev)&lt;br /&gt;
&lt;br /&gt;
=== Kynapse ===&lt;br /&gt;
* Kynapse Big File (*.kbf)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon A* Data (*.adl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Find Nearest Data (*.fdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Path Cost Data (*.cdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Path Way (*.pwl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Spatial Graph (*.pdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
* Land Collision (collision.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Collision&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Reflection Area (*.rab)&amp;lt;ref&amp;gt;Formerly &amp;quot;Reflection Zone&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Spline Path (*.path)&amp;lt;ref&amp;gt;Formerly &amp;quot;Path Spline&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Spline Path (Old) (*.bin)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[NN Chunk Format|Ninja]] ===&lt;br /&gt;
* Camera (*.xnc, *.xnd)&lt;br /&gt;
* Camera Motion (*.xnd)&lt;br /&gt;
* Effect List (*.xne)&lt;br /&gt;
* Light (*.xni, *.xnl)&lt;br /&gt;
* Light Motion (*.xni)&lt;br /&gt;
* Material Motion (*.xnv)&lt;br /&gt;
* Morph Motion (*.xnf)&lt;br /&gt;
* Morph Target (*.xng)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Node Motion (*.xnm)&lt;br /&gt;
* Node Name (*.xna)&lt;br /&gt;
* Object (*.xno)&lt;br /&gt;
* Texture List (*.xnt)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* Enemy Parameter List (ScriptParameter.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Script Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Enemy Shot Parameter List (ShotParameter.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Shot Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Object Explosion Parameter List (Explosion.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Explosion Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Object Physics Parameter List (Common.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Common Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Package (*.pkg)&amp;lt;ref&amp;gt;Formerly &amp;quot;Asset Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Path Object Parameter List (PathObj.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Path Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Particle ===&lt;br /&gt;
* Particle Container (*.plc)&lt;br /&gt;
* Particle Effect Bank (*.peb)&lt;br /&gt;
* Particle Global Settings (*.pgs)&amp;lt;ref&amp;gt;Formerly &amp;quot;Particle Generation System&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Particle Texture Bank (*.ptb)&lt;br /&gt;
&lt;br /&gt;
=== Placement ===&lt;br /&gt;
* Prop Library (*.prop)&amp;lt;ref&amp;gt;Formerly &amp;quot;Property Database&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Stage Set (*.set)&amp;lt;ref&amp;gt;Formerly &amp;quot;Set Data&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Save ===&lt;br /&gt;
* Save Data (SonicNextSaveData.bin)&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
* Lua Binary (*.lub)&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
* [[Text Book]] (*.mst)&amp;lt;ref&amp;gt;Formerly &amp;quot;Message Table&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Text Font Map]] (*.ftm)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* [[Text Font Picture]] (*.pft)&amp;lt;ref&amp;gt;Formerly &amp;quot;Picture Font&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Text Font Proportion (*.pfi)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Binary_Resource&amp;diff=1515</id>
		<title>Binary Resource</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Binary_Resource&amp;diff=1515"/>
		<updated>2026-05-03T18:38:53Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&#039;&#039;Binary Resource&#039;&#039;&#039;&#039;&#039; (or &#039;&#039;&#039;BINA&#039;&#039;&#039;) is a container format for binary data developed by Sonic Team.&lt;br /&gt;
&lt;br /&gt;
== Engines using Binary Resource ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Engine&lt;br /&gt;
!Version&lt;br /&gt;
!Games&lt;br /&gt;
|-&lt;br /&gt;
|SoX&lt;br /&gt;
|1&lt;br /&gt;
|[[Sonic the Hedgehog (2006)]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Games#Hedgehog Engine|Hedgehog Engine]]&lt;br /&gt;
|1&lt;br /&gt;
|[[Sonic Colors]]&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|[[Sonic Lost World]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Games#Hedgehog Engine 2|Hedgehog Engine 2]]&lt;br /&gt;
|2&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&#039;&#039;&#039;Binary Resource&#039;&#039;&#039; has two known major versions.&lt;br /&gt;
&lt;br /&gt;
== Version 1 ==&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The header consists of the following data structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x20&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|UInt32&lt;br /&gt;
|ResourceSize&lt;br /&gt;
|The size of the resource.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|RelocTableOffset&lt;br /&gt;
|The offset of the relocation table relative to the end of the header.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|UInt32&lt;br /&gt;
|RelocTableLength&lt;br /&gt;
|The length of the relocation table.&lt;br /&gt;
|-&lt;br /&gt;
|0x0C&lt;br /&gt;
|UInt32&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Usually zero.&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|UInt32&lt;br /&gt;
|ChunkCount&lt;br /&gt;
|The total number of chunks in the data section. Only used in &#039;&#039;&#039;Sonic Colors&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Version&lt;br /&gt;
|The first two characters are skipped, leaving Revision and Endianness.&lt;br /&gt;
The endianness character is either &#039;&amp;lt;nowiki/&amp;gt;&#039;&#039;&#039;L&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039; or &#039;&#039;&#039;&#039;B&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;, for little-endian and big-endian respectively.&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|Char[4]&lt;br /&gt;
|Signature&lt;br /&gt;
|Always &amp;quot;BINA&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|UInt32&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Usually zero.&lt;br /&gt;
|}&lt;br /&gt;
Due to the nature of the header, you &#039;&#039;&#039;must&#039;&#039;&#039; read ahead &#039;&#039;&#039;0x14&#039;&#039;&#039; bytes to read the &amp;lt;code&amp;gt;Version&amp;lt;/code&amp;gt; field to get the endianness of the file before proceeding with the rest of the fields at the start of the file.&lt;br /&gt;
&lt;br /&gt;
=== Data Section ===&lt;br /&gt;
The data after the header is specific to each file format contained within a &#039;&#039;&#039;Binary Resource&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
All offset fields inside the data section are relative to the end of the header, so you must add the size of the header to the offset to get the absolute offset to where it&#039;s pointing to in the file on disk.&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
MyOffset = ReadUInt32() + HeaderSize // HeaderSize = 0x20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Relocation Table ===&lt;br /&gt;
After the data section is a relocation table, which is used by the &#039;&#039;&#039;Binary Resource&#039;&#039;&#039; loader to locate offsets in the data section to make them absolute pointers. This allows the data section to be mapped directly to a structure without having to read it manually.&lt;br /&gt;
&lt;br /&gt;
The relocation table must be aligned to 4 bytes before and after writing it.&lt;br /&gt;
&lt;br /&gt;
Each entry in the relocation table is encoded as such:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Type Bits&lt;br /&gt;
!Length&lt;br /&gt;
!Minimum&lt;br /&gt;
!Maximum&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0b01000000&lt;br /&gt;
|6 bits&lt;br /&gt;
|0x00&lt;br /&gt;
|0x3F&lt;br /&gt;
|The offset is stored in the remaining six bits after the type bits.&lt;br /&gt;
|-&lt;br /&gt;
|0b10000000&lt;br /&gt;
|14 bits&lt;br /&gt;
|0x3F&lt;br /&gt;
|0x3FFF&lt;br /&gt;
|The offset is stored in the remaining six bits after the type bits, including an extra byte.&lt;br /&gt;
|-&lt;br /&gt;
|0b11000000&lt;br /&gt;
|30 bits&lt;br /&gt;
|0x3FFF&lt;br /&gt;
|0x3FFFFFFF&lt;br /&gt;
|The offset is stored in the remaining six bits after the type bits, including an extra three bytes.&lt;br /&gt;
|}&lt;br /&gt;
To encode an entry in the relocation table, first subtract the current offset with the previous offset that was encoded, then bit shift the result to the right by two bits. When encoding the first entry in the relocation table, the previous offset will be the size of the header (&#039;&#039;&#039;0x20&#039;&#039;&#039;).&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
EncodedOffset = (CurrentOffset - PreviousOffset) &amp;gt;&amp;gt; 2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After this, the value of the encoded offset can be used to determine which type bits are needed to fit it in the relocation table.&lt;br /&gt;
&lt;br /&gt;
=== Footer ===&lt;br /&gt;
If the &amp;lt;code&amp;gt;ChunkCount&amp;lt;/code&amp;gt; field in the header is non-zero, a footer must be written to the end of the file. The purpose of this footer isn&#039;t fully understood, but it only appears to be used in &#039;&#039;&#039;Sonic Colors&#039;&#039;&#039;.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Length: 0x0C&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x00&lt;br /&gt;
|UInt32&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always 16.&lt;br /&gt;
|-&lt;br /&gt;
|0x04&lt;br /&gt;
|UInt32&lt;br /&gt;
|N/A&lt;br /&gt;
|Unknown. Always zero.&lt;br /&gt;
|-&lt;br /&gt;
|0x08&lt;br /&gt;
|Char[4]&lt;br /&gt;
|N/A&lt;br /&gt;
|Always &amp;quot;bvh\0&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PXD&amp;diff=1514</id>
		<title>PXD</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PXD&amp;diff=1514"/>
		<updated>2026-05-03T18:37:52Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}&lt;br /&gt;
&lt;br /&gt;
===== If you are looking for tools to edit &amp;lt;code&amp;gt;.pxd&amp;lt;/code&amp;gt; files, see [[PXD Animation Tools|PXD Animation Tools.]] =====&lt;br /&gt;
&lt;br /&gt;
== PXD Files ==&lt;br /&gt;
Hedgehog Engine 2 games from [[Mario &amp;amp; Sonic at the Tokyo 2020 Olympic Games|Tokyo 2020 Olympic Games]] to [[Shadow Generations]] contain skeleton and skeletal animation files with the file extensions &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; respectively, stored in a [[Binary Resource]] container. Skeletons contain pose data that usually result in a T-Pose, bone and parent indices, and bone names. Animations contain playback metadata such as frame rate and frame count, track count, and either compressed animation pose data using [https://github.com/nfrechette/acl ACL compression,] or raw uncompressed pose data that use bone and frame indices to specify keyframed transforms, with linear interpolation between keyframes. For both skeletons and animations, position and rotation data for each bone is an absolute transform relative to the parent position, whereas scales are inherited from their respective parents locally, and have no effect on their positions. &lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Animation files are stored in a [[Binary Resource]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt; identified as &amp;lt;code&amp;gt;PXAN&amp;lt;/code&amp;gt;, possibly for &amp;quot;PXD Animation&amp;quot; or similar:&lt;br /&gt;
&lt;br /&gt;
=== PXAN Header ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct Header {&lt;br /&gt;
	char[4] magic;		// &#039;NAXP&#039;&lt;br /&gt;
	uint32_t version;	// Always 0x200&lt;br /&gt;
	uint8_t additive;	// 0x01 if additive, else 0x00&lt;br /&gt;
	uint8_t compressed;	// 0x08 if ACL compressed, 0x00 if uncompressed&lt;br /&gt;
	char[6];			// Null alignment to 8 bytes&lt;br /&gt;
	uint64_t metadata_offset;	// Offset to metadata, always 0x18&lt;br /&gt;
	float duration;				// Duration of the animation in seconds, calculated as ((frame_count - 1) / FPS)&lt;br /&gt;
	uint32_t frame_count;	&lt;br /&gt;
	uint32_t track_count;		// Bone count&lt;br /&gt;
	uint64_t skel_anim_offset;	// Offset for character&#039;s skeletal animation, always 0x40 if compressed, 0x38 if uncompressed&lt;br /&gt;
	uint64_t root_anim_offset;	// Offset for root motion animation, 0x00 if no root motion is present, aligned to 16 bytes&lt;br /&gt;
	if (compressed == 0x08)&lt;br /&gt;
	char[8];		// Null alignment to 0x10 bytes for ACL data. &lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL Data ===&lt;br /&gt;
All Hedgehog Engine 2 games that utilize the ACL library appear to use v2.0.0, first seen in [[Sonic Origins]], and unchanged in any implementation since then. [https://github.com/nfrechette/acl/tree/a54c5c2781be9f14b840a60f8dd8ec6c5065885d/docs See the ACL docs for more info.] If &amp;lt;code&amp;gt;compressed == 0x08&amp;lt;/code&amp;gt;, skeletal animations and root motion animations are compressed. &lt;br /&gt;
&lt;br /&gt;
==== Compressed Data ====&lt;br /&gt;
Below is a high level overview of the stored ACL chunk data:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct ACLData {&lt;br /&gt;
	uint32_t acl_chunk_size;&lt;br /&gt;
	int32_t acl_hash;&lt;br /&gt;
&lt;br /&gt;
	uint32_t acl_tag;		// Identifies ACL buffer type, always 0xAC11AC11 to mark compressed_tracks&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/buffer_tag.h#L49&lt;br /&gt;
&lt;br /&gt;
	uint16_t acl_version;	// ACL Version Enum Identifier. 0x07 indicates v2.0.0, the only version observed in any HE2 game.&lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/compressed_tracks_version.h#L71&lt;br /&gt;
&lt;br /&gt;
	char acl_padding;		// always 0x00&lt;br /&gt;
	uint8_t acl_track_type;	// ACL Track Type Enum. 0x0C indicates qvvf, the only track type observed in any HE2 game. &lt;br /&gt;
	// https://github.com/nfrechette/acl/blob/976ff051048477f2281c7d3609fddf0b3cba2c2d/includes/acl/core/track_types.h#L68&lt;br /&gt;
&lt;br /&gt;
	uint32_t track_count;	// Bone count if skeletal animation, 0x01 if root motion. Should match header track_count if skeletal. &lt;br /&gt;
	uint32_t sample_count;	// Frame count, should match header frame_count.&lt;br /&gt;
	float32 sample_rate;	// Playback FPS of animation, should equal header ((frame_count - 1) / duration)&lt;br /&gt;
	char[acl_chunk_size - 0x1C] acl_data;   // String of compressed ACL data&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;At the end of an ACL chunk, if it is a skeletal animation chunk and root motion is present in the file, the chunk will be null padded to 16 bytes. If the ACL chunk is a root motion chunk or a skeletal animation with no associated root motion chunk in the file, the chunk will be null padded to 4 bytes. The last ACL chunk is immediately followed by the [[Binary Resource]] relocation table. &lt;br /&gt;
&lt;br /&gt;
==== Raw/Decompressed Track List ====&lt;br /&gt;
The index lookup for which transform set belongs to which bone can be found in the skeleton file [[PXD#.skl.pxd Structure|(see .skl.pxd Structure)]]. Each bone uses an [https://github.com/nfrechette/rtm RTM] [https://github.com/nfrechette/rtm/blob/7c9a61e32744ee9ff2978328d0e585635fd55615/includes/rtm/types.h#L393 qvvf] struct for transformation. Though the &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; element of each vector has no bearing on the final animation, the games usually store a value in there anyways and appears to have an effect on compression:&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct qvvf&lt;br /&gt;
{&lt;br /&gt;
	quatf rotation;			// XYZW Quaternion&lt;br /&gt;
	vector4f translation;	// XYZW Vector, W is undefined but appears to be bone length&lt;br /&gt;
	vector4f scale;			// XYZW Vector, W is undefined and always 1.0&lt;br /&gt;
};&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Native Uncompressed Data ===&lt;br /&gt;
{{Notice|type=note|content=This section could use a less confusing explanation.}}&lt;br /&gt;
Alternatively to compressed ACL track data, the PXAN structure can store individual components (rotation, translation, scale) of any given track at any frame, and linearly interpolate between them independently. This system was first seen in the [[Mario &amp;amp; Sonic at the Rio 2016 Olympic Games|M&amp;amp;S Tokyo 2020 Olympic Games]] as the exclusive method of storing animations. ACL compression may have an advantage in reducing the file size of many of these animations but—though rare—uncompressed animations have been observed in subsequent games for certain animations, presumably to combat any potential jitter during close up cutscenes or similar situations. Though the actual end data contained in this method is simple, the structure can end up like a spider&#039;s nest at first glance:&lt;br /&gt;
&lt;br /&gt;
==== Track Offset Tables ====&lt;br /&gt;
The first struct array found in the file is a track table for each bone. Within it, for each transform type (translation, rotation, scale), there is a keyframe count, offset pointing to a frame table, and offset pointing to an array of transforms. &amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;struct TrackTableOffsets {&lt;br /&gt;
	uint64_t pos_key_count;			// Total number of translation keyframes for this bone&lt;br /&gt;
	uint64_t pos_table_offset;		// Offset for this bone&#039;s translation frame table&lt;br /&gt;
	uint64_t pos_values_offset;		// Starting offset for this bone&#039;s array of translation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t rot_key_count;			// Total number of rotation keyframes for this bone&lt;br /&gt;
	uint64_t rot_table_offset;		// Offset for this bone&#039;s rotation frame table&lt;br /&gt;
	uint64_t rot_values_offset;		// Starting offset for this bone&#039;s array of rotation values&lt;br /&gt;
&lt;br /&gt;
	uint64_t scale_key_count;		// Total number of scale keyframes for this bone&lt;br /&gt;
	uint64_t scale_table_offset;	// Offset for this bone&#039;s scale frame table&lt;br /&gt;
	uint64_t scale_values_offset;	// Starting offset for this bone&#039;s array of scale values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
TrackTableOffsets TrackTables[track_count];		// One for each bone, track_count from PXAN header&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Frame Tables and Transforms ====&lt;br /&gt;
Each transform type will get a frame table as &amp;lt;code&amp;gt;uint16_t[key_count] keys;&amp;lt;/code&amp;gt; where each value is the frame that the keyframe will be inserted to, and transform array &amp;lt;code&amp;gt;vector4f[key_count] transforms; // XYZW floats&amp;lt;/code&amp;gt; that will correspond to the frame with the matching array index. Unlike in ACL decompressed tracks, native uncompressed tracks&#039; &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; component for translation and scale is always &amp;lt;code&amp;gt;0.0&amp;lt;/code&amp;gt;. Both of these element arrays will be null aligned to 16 bytes.&lt;br /&gt;
&lt;br /&gt;
==== Posing and Transform Inheritance ====&lt;br /&gt;
Each bone&#039;s transformation is stored as an object space (AKA &#039;Pose Space&#039; or &#039;Model Space&#039;) transform relative to its parent bone&#039;s final transformation. That means, regardless of what the reset pose or bone orientations are in the model&#039;s skeleton, the stored values of any given frame will completely overwrite any pose previously present. &lt;br /&gt;
&lt;br /&gt;
However, there are two quirks that are unlike most interchange formats for 3D animations:&lt;br /&gt;
&lt;br /&gt;
# Scale inheritance is a simple local space copy of the parent&#039;s local space scale. There is no shearing or skewing of any kind.&lt;br /&gt;
#* &amp;lt;sub&amp;gt;In Blender, a bone&#039;s scale inheritance mode can be changed from `Full` to `Aligned` to achieve this effect&amp;lt;/sub&amp;gt;&lt;br /&gt;
# Calculating the position and rotation of any given bone is to be done independent of any scale values.&lt;br /&gt;
&lt;br /&gt;
When reading in-game, though scales from recursive parents are inherited and multiplied, translation is completely unaffected in any capacity, unintuitively. Therefore, before applying any object space transformation in a setting where parent scale is assumed to affect the child bone&#039;s location, each bone&#039;s final scale must be calculated and applied by multiplying its and each recursive parent&#039;s scales together. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Trivia&#039;&#039;&#039;: &#039;&#039;The inheritance and relationships behavior for bone transform values have been found to be identical to all previous HE games that used Havok, possibly indicating that Sonic Team&#039;s custom implementation of animation playback and posing is loosely based on Havok&#039;s &amp;lt;code&amp;gt;hka&amp;lt;/code&amp;gt; functions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt; Structure ==&lt;br /&gt;
Skeleton files are stored in a [[Binary Resource]] container. Below is the contents stored within the &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; node beginning at file offset &amp;lt;code&amp;gt;0x40&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;lt;sub&amp;gt;TODO...&amp;lt;/sub&amp;gt;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Thanks ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/Turk645 Turk645:] Original uncompressed PXD blender importer scripts&lt;br /&gt;
* [https://github.com/WistfulHopes WistfulHopes:] ACL tools, blender export scripts&lt;br /&gt;
* [https://github.com/ik-01 ik-01]: Format and game code research, filling in gaps for unknown values&lt;br /&gt;
* [https://github.com/AdelQue AdelQue:] Format research, math relations and bone inheritance behaviors&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Marathon&amp;diff=1513</id>
		<title>Marathon</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Marathon&amp;diff=1513"/>
		<updated>2026-05-03T02:03:13Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Marathon|image=Marathon_Logo.png|author=Hyper|download=https://github.com/hyperbx/Marathon/releases/latest|website=https://github.com/hyperbx/Marathon}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Marathon&#039;&#039;&#039; is a toolkit and library for [[Sonic the Hedgehog (2006)]] file formats.&lt;br /&gt;
&lt;br /&gt;
Formerly known as &#039;&#039;&#039;Sonic &#039;06 Toolkit&#039;&#039;&#039;, it originally started out as a frontend for external tools written in Visual Basic .NET, then later C#.&lt;br /&gt;
&lt;br /&gt;
The current name is derived from the internal name of &#039;&#039;&#039;Sonic the Hedgehog (2006)&#039;&#039;&#039;, known as &amp;quot;Marathon&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Supported ==&lt;br /&gt;
&#039;&#039;&#039;Marathon&#039;&#039;&#039; is currently in active development and is undergoing a large refactoring in the v2.0.0 branch, so many of these formats have either been changed since the latest public release, or are only available in that branch via the API.&lt;br /&gt;
&lt;br /&gt;
=== Acroarts ===&lt;br /&gt;
* Acroarts Resource (*.mab)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;&amp;gt;Available only in the v2.0.0 branch.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* DirectDraw Map (*.ddm)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Archive ===&lt;br /&gt;
* [[U8 Archive|Arc File]] (*.arc)&amp;lt;ref&amp;gt;Formerly &amp;quot;U8 Archive&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
* Sound Bank (*.sbk)&lt;br /&gt;
&lt;br /&gt;
=== Event ===&lt;br /&gt;
* [[Event Playbook]] (*.epb)&lt;br /&gt;
* Time Event (*.tev)&lt;br /&gt;
&lt;br /&gt;
=== Kynapse ===&lt;br /&gt;
* Kynapse Big File (*.kbf)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon A* Data (*.adl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Find Nearest Data (*.fdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Path Cost Data (*.cdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Path Way (*.pwl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Kynogon Spatial Graph (*.pdl)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
* Land Collision (collision.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Collision&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Reflection Area (*.rab)&amp;lt;ref&amp;gt;Formerly &amp;quot;Reflection Zone&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Spline Path (*.path)&amp;lt;ref&amp;gt;Formerly &amp;quot;Path Spline&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Spline Path (Old) (*.bin)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[NN Chunk Format|Ninja]] ===&lt;br /&gt;
* Camera (*.xnc, *.xnd)&lt;br /&gt;
* Camera Motion (*.xnd)&lt;br /&gt;
* Effect List (*.xne)&lt;br /&gt;
* Light (*.xni, *.xnl)&lt;br /&gt;
* Light Motion (*.xni)&lt;br /&gt;
* Material Motion (*.xnv)&lt;br /&gt;
* Morph Motion (*.xnf)&lt;br /&gt;
* Morph Target (*.xng)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* Node Motion (*.xnm)&lt;br /&gt;
* Node Name (*.xna)&lt;br /&gt;
* Object (*.xno)&lt;br /&gt;
* Texture List (*.xnt)&lt;br /&gt;
&lt;br /&gt;
=== Parameter ===&lt;br /&gt;
* Enemy Parameter List (ScriptParameter.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Script Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Enemy Shot Parameter List (ShotParameter.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Shot Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Object Explosion Parameter List (Explosion.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Explosion Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Object Physics Parameter List (Common.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Common Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Package (*.pkg)&amp;lt;ref&amp;gt;Formerly &amp;quot;Asset Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Path Object Parameter List (PathObj.bin)&amp;lt;ref&amp;gt;Formerly &amp;quot;Path Package&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Particle ===&lt;br /&gt;
* Particle Container (*.plc)&lt;br /&gt;
* Particle Effect Bank (*.peb)&lt;br /&gt;
* Particle Global Settings (*.pgs)&amp;lt;ref&amp;gt;Formerly &amp;quot;Particle Generation System&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Particle Texture Bank (*.ptb)&lt;br /&gt;
&lt;br /&gt;
=== Placement ===&lt;br /&gt;
* Prop Library (*.prop)&amp;lt;ref&amp;gt;Formerly &amp;quot;Property Database&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Stage Set (*.set)&amp;lt;ref&amp;gt;Formerly &amp;quot;Set Data&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Save ===&lt;br /&gt;
* Save Data (SonicNextSaveData.bin)&lt;br /&gt;
&lt;br /&gt;
=== Script ===&lt;br /&gt;
* Lua Binary (*.lub)&lt;br /&gt;
&lt;br /&gt;
=== Text ===&lt;br /&gt;
* [[Text Book]] (*.mst)&amp;lt;ref&amp;gt;Formerly &amp;quot;Message Table&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* [[Text Font Map]] (*.ftm)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
* [[Text Font Picture]] (*.pft)&amp;lt;ref&amp;gt;Formerly &amp;quot;Picture Font&amp;quot; in v1.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Text Font Proportion (*.pfi)&amp;lt;ref name=&amp;quot;ref_v2&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=File:Marathon_Logo.png&amp;diff=1512</id>
		<title>File:Marathon Logo.png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=File:Marathon_Logo.png&amp;diff=1512"/>
		<updated>2026-05-03T01:44:11Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Documentation&amp;diff=1511</id>
		<title>Documentation</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Documentation&amp;diff=1511"/>
		<updated>2026-05-01T21:20:32Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This section lists documentation pages for resources you&#039;ll find in Sonic games. You&#039;ll find information about certain file formats and other general game resources.&lt;br /&gt;
&lt;br /&gt;
== Rendering ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Info&lt;br /&gt;
|-&lt;br /&gt;
| [[Normal mapping]]&lt;br /&gt;
| How normal mapping works.&lt;br /&gt;
|-&lt;br /&gt;
| [[Vertex Colors]]&lt;br /&gt;
| How vertex colors work.&lt;br /&gt;
|-&lt;br /&gt;
| [[Mesh Layers]]&lt;br /&gt;
| Model mesh layers.&lt;br /&gt;
|-&lt;br /&gt;
| [[Opacity]]&lt;br /&gt;
| The concept of opacity explained.&lt;br /&gt;
|- &lt;br /&gt;
| [[Texture Blending]]&lt;br /&gt;
| The different ways to blend textures.&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
|-&lt;br /&gt;
|[[Hedgehog Engine Rendering|Hedgehog Engine]]&lt;br /&gt;
|Engine first used in Sonic Unleashed.&lt;br /&gt;
|-&lt;br /&gt;
|[[Hedgehog Engine 2 Rendering|Hedgehog Engine 2]]&lt;br /&gt;
|Engine first used in Sonic Forces.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Models ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Info&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[SCA Parameters]]&lt;br /&gt;
|Model and material parameters stored in SCA file headers.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Shaders ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Info&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[Shader Features]]&lt;br /&gt;
|Hedgehog Engine 1 shader features.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Placement ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[HSON Format|HSON]] (Hedgehog Set Object Notation)&lt;br /&gt;
|Universal object placement representation format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.hson&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== User Interface ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[NCP File Format|NCP]] (Ninja CellSpriteDraw Project)&lt;br /&gt;
|Describes a user interface in most Hedgehog Engine games.&lt;br /&gt;
|&amp;lt;span style=&amp;quot;text-align: center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.xncp&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.yncp&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.gncp&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.sncp&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
* [[Kunai]]&lt;br /&gt;
* [[Shuriken]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Archives ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[Binary Resource]]&lt;br /&gt;
|Generic container format used for storing chunks of binary data.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[NN Chunk Format|NN Chunk]]&lt;br /&gt;
|Generic container format used for storing SEGA NN binary data.&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[U8 Archive]]&lt;br /&gt;
|Hierarchical archive format.&lt;br /&gt;
|&amp;lt;code&amp;gt;.arc&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Name&lt;br /&gt;
!Description&lt;br /&gt;
!Extension&lt;br /&gt;
!Tools&lt;br /&gt;
|-&lt;br /&gt;
|[[PXD|PXD Animation]]&lt;br /&gt;
|Skeleton and skeletal animation format in Hedgehog Engine 2 games.&lt;br /&gt;
|&amp;lt;span style=&amp;quot;text-align: center&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.anm.pxd&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;.skl.pxd&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
|[[Frontiers Animation Tools]]&lt;br /&gt;
|-&lt;br /&gt;
|[[PBA|PBA Skeleton]]&lt;br /&gt;
|Physics Based Animation Skeleton for Hedgehog Engine 2 games.&lt;br /&gt;
|&amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PBA&amp;diff=1510</id>
		<title>PBA</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PBA&amp;diff=1510"/>
		<updated>2026-05-01T21:17:43Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=WIP Page, just adding to start}}&lt;br /&gt;
[[File:PBA cloth demonstration.gif|alt=Depicted in Blender using built-in cloth simulation, and bones constrained to corresponding vertex group|thumb|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt; contains a node for a cloth mesh made up of only vertices and edges, interconnected in such a way to maintain shape with internal springs|325x325px]]&lt;br /&gt;
Physics Based Animation ( &amp;lt;code&amp;gt;.pba&amp;lt;/code&amp;gt; ) files are bone physics files first found in [[Sonic Frontiers]], and first regularly used in [[Shadow Generations|Shadow Generations.]] The system is capable of using bouncy bones/jiggle physics, rag-doll physics, and cloth simulation. The format is still relatively unknown and has only been brute forced through hex analysis more than code analysis, and there are unfortunately not many examples files to reference. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
|+List of known PBA file examples&lt;br /&gt;
!Game&lt;br /&gt;
!Filename&lt;br /&gt;
!Description&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line and lure&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_knucklesdrill.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Knuckles&#039; drill tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_kodama01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Plant toppers on Koco variants&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_sage.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Dress cloth physics and self collisions with legs&lt;br /&gt;
|Unused. This is the only known file with a cloth node, and unknown if self collisions were ever in a working state when ported to Shadow Generations&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;enm_wolf01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Wolf tail&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|rangers&lt;br /&gt;
|&amp;lt;code&amp;gt;mbo_tracker01.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Tracker&#039;s brain stem&lt;br /&gt;
|Only used PBA file in Frontiers&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;bos_metaloverload.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Metal Overlord&#039;s pipes/tubes&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_big.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Big&#039;s fishing line, hook and lure&lt;br /&gt;
|Has collision and more bones than Frontiers version&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Shadow&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dameba.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Ameba Doom Morph&#039;s tentacles and legs&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_shadow_dwing.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Doom Wings entirety&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|miller&lt;br /&gt;
|&amp;lt;code&amp;gt;chr_terios.pba&amp;lt;/code&amp;gt;&lt;br /&gt;
|Terios&#039;s head quills&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Binary Structure ==&lt;br /&gt;
TODO: Decipher, clean up, explain 0_0 might have lots of wrong info!&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
//--- 010 Editor v12.0.1 Binary Template&lt;br /&gt;
//&lt;br /&gt;
//      File: &lt;br /&gt;
//   Authors: Ashrindy, AdelQ&lt;br /&gt;
//   Version: 0.0.1&lt;br /&gt;
//   Purpose: Shadow Gens PhysicalSkeleton&lt;br /&gt;
//  Category: &lt;br /&gt;
// File Mask: *.pba&lt;br /&gt;
//  ID Bytes: &lt;br /&gt;
//   History: &lt;br /&gt;
//------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../include.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local uint64 dataPos;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    Vector4 rows[4];&lt;br /&gt;
}Matrix4x4&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    byte UnkB1; // Always 2 or 1, unknown flag&lt;br /&gt;
    byte UnkB2; // Always 0 or 1, unknown flag&lt;br /&gt;
    byte UnkB3[2];  // Padding?&lt;br /&gt;
    float Unk_f[4];    // Upper/Lower limits of something?&lt;br /&gt;
}LimitsStruct&amp;lt;optimize=false&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    int unk; // if this is related to collision, this could be an enum for the collision shape&lt;br /&gt;
    float unk2; // Physics dampening? Lower values make bones wobble for longer&lt;br /&gt;
    Matrix4x4 mat;  // Most likely not a matrix, has parameters that affect gravity, stretch, etc, and possibly capsule/collision bounds(?) but still working through&lt;br /&gt;
}CollisionStruct&amp;lt;optimize=false&amp;gt;;   // Has params that affect physics intensity still, maybe general physics&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    byte Unk1[4]; // All known examples are 01 01 14 00. could be bitflags by the looks of it&lt;br /&gt;
    int16 LocalParentBoneIndex;    // FF FF if no bone parent&lt;br /&gt;
    int16 LocalBoneIndex;&lt;br /&gt;
    int16 RealParentBoneIndex; // Usually the parent of this bone on the real skeleton, but can be any bone in practice. Perhaps a reference for the offset transform?&lt;br /&gt;
    int16 Unk3;&lt;br /&gt;
    LimitsStruct Limits[6]; // Unknown what these limits line up to (Pos to Neg X, Pos to Neg Y, etc)&lt;br /&gt;
    float Unk4&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    Matrix4x4 mat;  // Possibly bone offset matrix relative to RealParentBoneIndex? A: Two quaternions in row 2 and 4?&lt;br /&gt;
}&lt;br /&gt;
JiggleStruct&amp;lt;optimize=false&amp;gt;; // Handles bone chain relations for bendy/jiggle physics, as well as presumably transform limits&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    // Starting point needs to align to 16 bytes&lt;br /&gt;
    local uint64 CurPos = FTell();&lt;br /&gt;
    local uint64 AlignCheck = CurPos % 0x10;&lt;br /&gt;
    if (AlignCheck)&lt;br /&gt;
        FSeek(CurPos + 0x10 - AlignCheck);&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset BoneName;&lt;br /&gt;
    float unk0; // All known examples = 0.01&lt;br /&gt;
    int16 unk1&amp;lt;hidden=true&amp;gt;; // Always FF FF&lt;br /&gt;
    int16 if_pinned;    // 1 if no parent present. Possibly this bone controls corresponding vertex if 1, versus vertex controls cooresponding bone if 0&lt;br /&gt;
    int16 child_idx;    // FF if no child&lt;br /&gt;
    int16 parent_idx;   // FF if no parent&lt;br /&gt;
    int16 unk2[2]&amp;lt;hidden=true&amp;gt;;  // Always FF FF&lt;br /&gt;
    int16 left_idx;&lt;br /&gt;
    int16 right_idx;&lt;br /&gt;
}cloth_node&amp;lt;optimize=false&amp;gt;;    // Defines up to 4 neighboring bones in a cloth bone grid&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    int16 verts[2];&lt;br /&gt;
    float edge_length;&lt;br /&gt;
    float unk_factor;   // Normalized, lateral direct connections = 0.5, lateral skip connections = 0.3, vertical direct connections = 1.0. Maybe a stretch/shrink factor?&lt;br /&gt;
}cloth_edges&amp;lt;optimize=false&amp;gt;;   // Cloth sim edge mesh&lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    StringOffset cloth_name;&lt;br /&gt;
    float unk1[10];&lt;br /&gt;
    int16 unk_count1[2];&lt;br /&gt;
    int32 cloth_node_count;&lt;br /&gt;
    int32 cloth_edge_count;&lt;br /&gt;
    int32 unk3&amp;lt;hidden=true&amp;gt;; // Align&lt;br /&gt;
    int64 cloth_node_ptr;&lt;br /&gt;
    int64 cloth_edge_ptr;&lt;br /&gt;
    local int64 prePos = FTell();&lt;br /&gt;
    FSeek(cloth_node_ptr + dataPos);&lt;br /&gt;
    cloth_node bones[cloth_node_count];&lt;br /&gt;
    FSeek(cloth_edge_ptr + dataPos);&lt;br /&gt;
    cloth_edges edges[cloth_edge_count];&lt;br /&gt;
    FSeek(prePos);&lt;br /&gt;
}ClothStruct&amp;lt;optimize=false&amp;gt;;   &lt;br /&gt;
&lt;br /&gt;
typedef struct{&lt;br /&gt;
    SetRandomBackColor();&lt;br /&gt;
    char signature[4]&amp;lt;name=&amp;quot;Signature&amp;quot;&amp;gt;;&lt;br /&gt;
    int version &amp;lt;format=hex, name=&amp;quot;Version&amp;quot;&amp;gt;;&lt;br /&gt;
    StringOffset SkeletonName;&lt;br /&gt;
    uint32 CollisionCount;&lt;br /&gt;
    uint32 JiggleCount;&lt;br /&gt;
    uint64 CollisionOffset;&lt;br /&gt;
    uint64 JiggleOffset;&lt;br /&gt;
    uint32 ClothCount;&lt;br /&gt;
    uint32 UnkCount;&lt;br /&gt;
    uint64 ClothOffset;&lt;br /&gt;
    uint64 UnkOffset;&lt;br /&gt;
    FSeek(CollisionOffset + dataPos);&lt;br /&gt;
    CollisionStruct CollisionStructs[CollisionCount];&lt;br /&gt;
    FSeek(JiggleOffset + dataPos);&lt;br /&gt;
    JiggleStruct JiggleStructs[JiggleCount];&lt;br /&gt;
    FSeek(ClothOffset + dataPos);&lt;br /&gt;
    ClothStruct ClothStructs[ClothCount];&lt;br /&gt;
}&lt;br /&gt;
ResPhysicalSkeleton&amp;lt;open=true&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
ResBinaryFile file(&amp;quot;ResPhysicalSkeleton&amp;quot;)&amp;lt;name=Str(&amp;quot;%s&amp;quot;, FileNameGetBase(GetFileName()))&amp;gt;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=NN_Chunk_Format&amp;diff=1509</id>
		<title>NN Chunk Format</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=NN_Chunk_Format&amp;diff=1509"/>
		<updated>2026-05-01T21:17:28Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is still a work in progress! Any additions and updates are greatly appreciated!}}{{Notice|type=info|content=HedgeDocs&#039; initial NN documentation was written by: &amp;lt;b&amp;gt;Radfordhound&amp;lt;/b&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Thanks to:&lt;br /&gt;
* &amp;lt;b&amp;gt;ItsEasyActually&amp;lt;/b&amp;gt;: For sharing his NN findings with me, which helped immensely in getting me started on my journey to reverse-engineer and document all of NN across all of its many crazy iterations and platforms.&lt;br /&gt;
* &amp;lt;b&amp;gt;ArMM1998&amp;lt;/b&amp;gt;: For sharing his documentation on some more obscure NN file types with me (specifically Puyo Puyo stuff, including DS games that used NN which I didn&#039;t know was a thing); I never would&#039;ve known about these otherwise!&lt;br /&gt;
* &amp;lt;b&amp;gt;TGE&amp;lt;/b&amp;gt; and &amp;lt;b&amp;gt;WamWooWam&amp;lt;/b&amp;gt;: For decompiling SEGA&#039;s &amp;lt;s&amp;gt;unholy&amp;lt;/s&amp;gt; port of Sonic 4 Episode I to Windows Phone 7, which used the NN library, and just-so-happened to include complete symbols for everything (even enum values)! I can&#039;t understate how much this information has helped me!&lt;br /&gt;
* &amp;lt;b&amp;gt;Shadowth117&amp;lt;/b&amp;gt; for a ton of extremely useful information and help throughout, especially with regards to the PSO2 variants of the formats!&lt;br /&gt;
* &amp;lt;b&amp;gt;SEGA&amp;lt;/b&amp;gt;: For making these games, and for letting us freely mod them. Seriously, not many companies let us do this stuff openly, and I think it&#039;s awesome. (Also, for releasing that awful version of Sonic 4 Episode I on Windows Phone 7 which had all the symbols in it. Thanks guys, you&#039;re the best!! &amp;lt;3)}}&lt;br /&gt;
The NN Chunk Format is a generic &amp;quot;container&amp;quot; format developed by SEGA Creative Center&#039;s Graphics Section.&lt;br /&gt;
&lt;br /&gt;
The format is heavily based on the older &amp;quot;SEGA Ninja Chunk Model&amp;quot; format, which was originally developed for the SEGA Dreamcast and was utilized in many Dreamcast games (it was even included as part of the Dreamcast&#039;s &amp;quot;Katana&amp;quot; SDK).&lt;br /&gt;
&lt;br /&gt;
While the exact meaning of the &amp;quot;NN&amp;quot; is still currently unknown, given that it is so heavily based off of the older Ninja format, it&#039;s almost certainly an acronym for something like &amp;quot;New Ninja&amp;quot; or &amp;quot;Ninja Next&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Common Definitions ==&lt;br /&gt;
Please see the [[NN Chunk Format - Common Definitions|Common Definitions]] page for a list of definitions (structs, enums, etc.) that are referenced throughout this specification.&lt;br /&gt;
&lt;br /&gt;
== Platforms ==&lt;br /&gt;
The NN Chunk Format, much like the older Ninja format it&#039;s based on, is designed heavily around the specific hardware/software requirements of whatever platform it is intended to be used on.&lt;br /&gt;
&lt;br /&gt;
Unlike the older Ninja format, however (which only supports one platform: the SEGA Dreamcast), the NN Chunk Format is &amp;quot;multi-platform&amp;quot;, and therefore comes in many different platform-specific variants.&lt;br /&gt;
&lt;br /&gt;
All known used platforms are listed in the following chart:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!ID&lt;br /&gt;
!CC&lt;br /&gt;
!Used on&lt;br /&gt;
!Endianness&lt;br /&gt;
!Alignment&lt;br /&gt;
!NN Library Version&lt;br /&gt;
|-&lt;br /&gt;
|NS&lt;br /&gt;
|s&lt;br /&gt;
|PlayStation 2&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|PlayStation2&lt;br /&gt;
|-&lt;br /&gt;
|NG&lt;br /&gt;
|g&lt;br /&gt;
|GameCube/Wii&lt;br /&gt;
|Big&lt;br /&gt;
|32&lt;br /&gt;
|GAMECUBE/Wii&lt;br /&gt;
|-&lt;br /&gt;
|NX&lt;br /&gt;
|x&lt;br /&gt;
|Xbox/Xbox 360/Windows&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|DirectX G1.1&lt;br /&gt;
|-&lt;br /&gt;
|NL&lt;br /&gt;
|l&lt;br /&gt;
|SEGA Lindbergh&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|LINDBERGH&lt;br /&gt;
|-&lt;br /&gt;
|NU&lt;br /&gt;
|u/s&lt;br /&gt;
|PlayStation Portable&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|PSP&lt;br /&gt;
|-&lt;br /&gt;
|NC&lt;br /&gt;
|c&lt;br /&gt;
|PlayStation 3&lt;br /&gt;
|Big&lt;br /&gt;
|16&lt;br /&gt;
|PS3&lt;br /&gt;
|-&lt;br /&gt;
|NY&lt;br /&gt;
|y ?&lt;br /&gt;
|Xbox 360/PlayStation 3&lt;br /&gt;
|?&lt;br /&gt;
|16 ?&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|NE&lt;br /&gt;
|e&lt;br /&gt;
|Xbox 360&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|DirectX G2.0 on XBOX360&lt;br /&gt;
|-&lt;br /&gt;
|NZ&lt;br /&gt;
|z&lt;br /&gt;
|Windows&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|DirectX G2.0 on WINDOWS&lt;br /&gt;
|-&lt;br /&gt;
|NI&lt;br /&gt;
|i ?&lt;br /&gt;
|iOS/Android/Windows Phone&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|OpenGL ES 1.1&lt;br /&gt;
|-&lt;br /&gt;
|DS&lt;br /&gt;
|?&lt;br /&gt;
|Nintendo DS/3DS&lt;br /&gt;
|Little&lt;br /&gt;
|16&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Data Chunks ==&lt;br /&gt;
As the name implies, files in the NN Chunk Format are comprised of a series of one or more &amp;quot;data chunks&amp;quot;, one after another.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;data chunk&amp;quot; is simply a block of data (structs, arrays, strings, etc.) that represents a single resource of a specific type.&lt;br /&gt;
&lt;br /&gt;
All known data chunk types are listed in the following chart:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!ID&lt;br /&gt;
!CC&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|TL&lt;br /&gt;
|t&lt;br /&gt;
|[[NN Chunk Format - TEXLIST|TEXLIST]]&lt;br /&gt;
|A list of textures.&lt;br /&gt;
|-&lt;br /&gt;
|EF&lt;br /&gt;
|e&lt;br /&gt;
|EFFECTLIST&lt;br /&gt;
|A list of effects (shaders).&lt;br /&gt;
|-&lt;br /&gt;
|NN&lt;br /&gt;
|a&lt;br /&gt;
|[[NN Chunk Format - NODENAMELIST|NODENAMELIST]]&lt;br /&gt;
|A list of names for the nodes (bones) within an object (a model).&lt;br /&gt;
|-&lt;br /&gt;
|MN&lt;br /&gt;
|u&lt;br /&gt;
|[[NN Chunk Format - MATERIALNAMELIST|MATERIALNAMELIST]]&lt;br /&gt;
|A list of names for the materials within an object (a model).&lt;br /&gt;
|-&lt;br /&gt;
|TN&lt;br /&gt;
|?&lt;br /&gt;
|MTNAMELIST&lt;br /&gt;
|A list of names for the morph targets within an object (a model).&lt;br /&gt;
|-&lt;br /&gt;
|OB&lt;br /&gt;
|j/o&lt;br /&gt;
|OBJECT&lt;br /&gt;
|A model. Uses &#039;o&#039; as its CC if its TEXLIST is embedded, and &#039;j&#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|MO&lt;br /&gt;
|m&lt;br /&gt;
|[[NN Chunk Format - MOTION|MOTION]]&lt;br /&gt;
|A node (bone) animation.&lt;br /&gt;
|-&lt;br /&gt;
|MM&lt;br /&gt;
|f&lt;br /&gt;
|[[NN Chunk Format - MOTION|MOTION]]&lt;br /&gt;
|A morph animation.&lt;br /&gt;
|-&lt;br /&gt;
|MC&lt;br /&gt;
|d&lt;br /&gt;
|[[NN Chunk Format - MOTION|MOTION]]&lt;br /&gt;
|A camera animation.&lt;br /&gt;
|-&lt;br /&gt;
|ML&lt;br /&gt;
|i&lt;br /&gt;
|[[NN Chunk Format - MOTION|MOTION]]&lt;br /&gt;
|A light animation.&lt;br /&gt;
|-&lt;br /&gt;
|MA&lt;br /&gt;
|v&lt;br /&gt;
|[[NN Chunk Format - MOTION|MOTION]]&lt;br /&gt;
|A material animation.&lt;br /&gt;
|-&lt;br /&gt;
|LI&lt;br /&gt;
|i/l&lt;br /&gt;
|LIGHT&lt;br /&gt;
|A light. Uses &#039;i&#039; as its CC if its animation is embedded, and &#039;l&#039; otherwise.&lt;br /&gt;
|-&lt;br /&gt;
|CA&lt;br /&gt;
|c&lt;br /&gt;
|CAMERA&lt;br /&gt;
|A camera.&lt;br /&gt;
|-&lt;br /&gt;
|MT&lt;br /&gt;
|g&lt;br /&gt;
|MORPH&lt;br /&gt;
|A morph target.&lt;br /&gt;
|-&lt;br /&gt;
|NT&lt;br /&gt;
|?&lt;br /&gt;
|NODE_TREE_OBJECT ?&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|ME&lt;br /&gt;
|?&lt;br /&gt;
|MESH_OBJECT ?&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|SF&lt;br /&gt;
|?&lt;br /&gt;
|SHADERFILE&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|SI&lt;br /&gt;
|?&lt;br /&gt;
|SHADERIDX&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
Each data chunk has a &amp;quot;root struct&amp;quot; associated with it, which is the starting point for the data in the chunk, and usually references other data (structs, arrays, strings, etc.).&lt;br /&gt;
&lt;br /&gt;
For information on the formats of the data contained within these data chunk types, please refer to the linked pages in the above chart.&lt;br /&gt;
&lt;br /&gt;
== File Types ==&lt;br /&gt;
Just like with the older Ninja format, NN chunk files come in two forms:&lt;br /&gt;
&lt;br /&gt;
* [[NN Chunk Format#Binary-Form File Format|Binary-Form]]&lt;br /&gt;
* [[NN Chunk Format#Text-Form File Format|Text-Form]] (aka &amp;quot;Ascii-Form&amp;quot;)&lt;br /&gt;
{{Notice|type=info|content=&amp;lt;b&amp;gt;The vast majority of NN chunk files in released games are in binary-form.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To our knowledge, all released games using NN don&#039;t support loading text-form files at runtime, meaning that &amp;lt;b&amp;gt;all NN text-form files found in the games are unused developer leftovers!&amp;lt;/b&amp;gt;}}&lt;br /&gt;
Both of these forms represent the same thing: A series of one or more data chunks. However, they do so in different ways.&lt;br /&gt;
&lt;br /&gt;
File extensions for NN chunk files typically consist of three characters:&lt;br /&gt;
&lt;br /&gt;
# The &amp;quot;CC&amp;quot; (character-code) of the [[NN Chunk Format#Platforms|platform]].&lt;br /&gt;
# &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; for [[NN Chunk Format#Binary-Form File Format|Binary-Form]] files, or &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; for [[NN Chunk Format#Text-Form File Format|Text-Form]] files.&lt;br /&gt;
# The &amp;quot;CC&amp;quot; (character-code) of the last [[NN Chunk Format#Data Chunks|data chunk]] contained within the file.&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Extension&lt;br /&gt;
!Meaning&lt;br /&gt;
|-&lt;br /&gt;
|.xno&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Xbox | Binary-Form | OBJECT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|.gno&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Gamecube | Binary-Form | OBJECT&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|.xtv&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Xbox | Text-Form | MOTION (material)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|.snt&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;Sony | Binary-Form | TEXLIST&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Binary-Form File Format ==&lt;br /&gt;
Binary-Form NN chunk files are represented as a series of consecutive &amp;quot;binary chunks&amp;quot;, each of which begins with the following data:&lt;br /&gt;
{{Notice|type=note|content=All instances of this struct (and ONLY this struct) are represented in &amp;lt;B&amp;gt;little-endian&amp;lt;/b&amp;gt;, regardless of the endianness specified by the [[#Platforms|platform]]. &amp;lt;b&amp;gt;Everything else&amp;lt;/b&amp;gt; in Binary-Form NN chunk files is represented in the endianness specified by the [[#Platforms|platform]].}}{{Notice|type=note|content=A struct type with this name does not actually exist (to my knowledge) in real Sega NN implementations; these fields are just embedded directly within every NNS_BINCNK_ struct. This is just an easier way to think about it for our purposes.}}&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_HEADER&lt;br /&gt;
{&lt;br /&gt;
  // The four-character identifier for this binary chunk;&lt;br /&gt;
  // specifies what type of binary chunk this is.&lt;br /&gt;
  uint32_t Id;&lt;br /&gt;
&lt;br /&gt;
  // The offset to the next four-character identifier in the&lt;br /&gt;
  // file, relative to the end of this struct (such that after&lt;br /&gt;
  // doing `fread(&amp;amp;OfsNextId, sizeof(OfsNextId), 1, file)`&lt;br /&gt;
  // you can just do `fseek(file, OfsNextId, SEEK_CUR)`.&lt;br /&gt;
  int32_t OfsNextId;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Immediately following this struct comes all of the data (structs, strings, etc.) required to represent the binary chunk. The format of this data depends on the value of the Id field.&lt;br /&gt;
&lt;br /&gt;
After each binary chunk (including all of its data) has been written, the file is padded (with null bytes) to a position that is divisible by the &amp;quot;alignment&amp;quot; specified by the [[NN Chunk Format#Platforms|platform]] (usually it&#039;s 16, but notably, it&#039;s 32 on Gamecube/Wii).&lt;br /&gt;
&lt;br /&gt;
What follows is documentation for all known binary chunk types, in the order that they appear within binary-form NN chunk files.&lt;br /&gt;
&lt;br /&gt;
=== Info Chunk ===&lt;br /&gt;
{{Notice|type=note|content=&amp;lt;b&amp;gt;This chunk is required to be present at the beginning of all binary-form NN chunk files!&amp;lt;/b&amp;gt; The Sega NN games I&#039;ve checked actually rely on this behavior, so you can too.}}&lt;br /&gt;
This binary chunk serves as the header for a binary-form NN chunk file, and contains info needed to parse the file. It is represented as the following struct:&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_FILEHEADER&lt;br /&gt;
{&lt;br /&gt;
  // Binary chunk header; must be present at the beginning of all binary chunks.&lt;br /&gt;
  //&lt;br /&gt;
  // The chunk ID is set to &amp;quot;**IF&amp;quot;, where &amp;quot;**&amp;quot; is the &amp;quot;ID&amp;quot; of&lt;br /&gt;
  // the platform (e.g. &amp;quot;NGIF&amp;quot; for Gamecube binary chunk headers).&lt;br /&gt;
  NNS_BINCNK_HEADER ChunkHeader;&lt;br /&gt;
&lt;br /&gt;
  // The number of data chunks in the file.&lt;br /&gt;
  int32_t nChunk;&lt;br /&gt;
&lt;br /&gt;
  // The absolute offset to the first data chunk in the file.&lt;br /&gt;
  int32_t OfsData;&lt;br /&gt;
&lt;br /&gt;
  // The combined size of all of the data chunks in the file, in bytes, including any padding.&lt;br /&gt;
  int32_t SizeData;&lt;br /&gt;
&lt;br /&gt;
  // The absolute offset to the (required) NOF0 binary chunk.&lt;br /&gt;
  int32_t OfsNOF0;&lt;br /&gt;
&lt;br /&gt;
  // Size of the (required) NOF0 binary chunk, including its header.&lt;br /&gt;
  // Depending on the variant of the format, this size either includes&lt;br /&gt;
  // the padding that comes after the NOF0 binary chunk, or it doesn&#039;t.&lt;br /&gt;
  // &lt;br /&gt;
  // TODO: Figure out exactly which versions include padding.&lt;br /&gt;
  // It seems PSP files and .[x]ncp files don&#039;t count the padding,&lt;br /&gt;
  // but everything else does??&lt;br /&gt;
  int32_t SizeNOF0;&lt;br /&gt;
&lt;br /&gt;
  // 1 in most files, 0 in some newer variants.&lt;br /&gt;
  // (Maybe they just stopped using this value?)&lt;br /&gt;
  int32_t Version;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{Notice|type=note|content=Further research NIFL header chunks and add info on those.}}&lt;br /&gt;
&lt;br /&gt;
=== Data Chunk Header ===&lt;br /&gt;
After the [[NN Chunk Format#Info Chunk|Info Chunk]], comes the main contents of the file: A sequence of one or more [[NN Chunk Format#Data Chunks|data chunks]].&lt;br /&gt;
&lt;br /&gt;
In binary-form NN chunk files, each data chunk begins with the following struct:&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_DATAHEADER&lt;br /&gt;
{&lt;br /&gt;
  // Binary chunk header; must be present at the beginning of all binary chunks.&lt;br /&gt;
  //&lt;br /&gt;
  // The chunk ID is set to the &amp;quot;ID&amp;quot; of the platform, followed&lt;br /&gt;
  // by the &amp;quot;ID&amp;quot; of the data chunk type being written (e.g.&lt;br /&gt;
  // &amp;quot;NXOB&amp;quot; for Xbox OBJECT data chunks).&lt;br /&gt;
  NNS_BINCNK_HEADER ChunkHeader;&lt;br /&gt;
&lt;br /&gt;
  // The offset to the root struct that makes up this data chunk&lt;br /&gt;
  // (e.g. an offset to a NNS_NODENAMELIST if the chunk type indicates&lt;br /&gt;
  // that this is a NODE_NAME data chunk), relative to the&lt;br /&gt;
  // position specified by the [OfsData] field from the info chunk.&lt;br /&gt;
  //&lt;br /&gt;
  // Please refer to the linked pages in the data chunks chart&lt;br /&gt;
  // to learn about their root structs.&lt;br /&gt;
  int32_t OfsMainData;&lt;br /&gt;
&lt;br /&gt;
  // Always 0 in every file I&#039;ve seen thus far.&lt;br /&gt;
  int32_t Version;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Immediately following this struct comes all of the data (structs, strings, etc.) required to represent the data chunk. The format of this data depends on the value of the Id field.&lt;br /&gt;
&lt;br /&gt;
See the linked pages in the [[NN Chunk Format#Data Chunks|data chunks chart]].&lt;br /&gt;
&lt;br /&gt;
=== Offsets List Chunk ===&lt;br /&gt;
{{Notice|type=note|content=&amp;lt;b&amp;gt;This chunk is required to be present in all binary-form NN chunk files!&amp;lt;/b&amp;gt;}}&lt;br /&gt;
After all of the data chunks, comes the offsets list chunk.&lt;br /&gt;
&lt;br /&gt;
This binary chunk represents a list of positions for all of the pointers (&amp;quot;offsets&amp;quot;) in all of the data chunks in the file, relative to the value of the &amp;lt;code&amp;gt;[OfsData]&amp;lt;/code&amp;gt; field from the info chunk.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_NOF0HEADER&lt;br /&gt;
{&lt;br /&gt;
  // Binary chunk header; must be present at the beginning of all binary chunks.&lt;br /&gt;
  // &lt;br /&gt;
  // The chunk ID is set to &amp;quot;NOF0&amp;quot;.&lt;br /&gt;
  NNS_BINCNK_HEADER ChunkHeader;&lt;br /&gt;
&lt;br /&gt;
  // The number of pointer positions listed within this chunk.&lt;br /&gt;
  int32_t nData;&lt;br /&gt;
&lt;br /&gt;
  // Padding; must always be 0 in files.&lt;br /&gt;
  //&lt;br /&gt;
  // This is because some games use this value as a marker that states&lt;br /&gt;
  // whether or not the pointers have been &amp;quot;fixed&amp;quot;.&lt;br /&gt;
  //&lt;br /&gt;
  // In those games, after they&#039;re done &amp;quot;fixing&amp;quot; all of the pointers&lt;br /&gt;
  // listed within this chunk, they will set this value to 1 in memory.&lt;br /&gt;
  int32_t Pad;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Immediately following this struct comes an array of &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt; values of size &amp;lt;code&amp;gt;[nData]&amp;lt;/code&amp;gt;. These values represent the positions of every pointer in all of the data chunks in the file, relative to the &amp;lt;code&amp;gt;[OfsData]&amp;lt;/code&amp;gt; field from the info chunk.&lt;br /&gt;
&lt;br /&gt;
Most NN games use this chunk to quickly &amp;quot;fix&amp;quot; all of the pointers within the data chunks (that is, to convert all of the offsets into absolute memory addresses that can then just be used as normal pointers).&lt;br /&gt;
&lt;br /&gt;
Some games, however, (namely: Sonic 4 Episode I for Windows Phone) ignore the values in this chunk, and instead, just manually add &amp;lt;code&amp;gt;[OfsData]&amp;lt;/code&amp;gt; to each offset to get an absolute file position whenever they need to jump there.&lt;br /&gt;
&lt;br /&gt;
Regardless of whether the data is actually used or not, it is always present in valid files.&lt;br /&gt;
{{Notice|type=note|content=Add pseudo-code for &amp;quot;fixing&amp;quot; the offsets listed in this chunk.}}&lt;br /&gt;
&lt;br /&gt;
=== File Name Chunk ===&lt;br /&gt;
{{Notice|type=info|content=&amp;lt;b&amp;gt;This chunk is completely optional&amp;lt;/b&amp;gt; and seems to only be used for debugging/internal-tooling purposes.}}&lt;br /&gt;
This chunk simply states the name and extension (without the path) of the file it&#039;s contained in.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_NFN0HEADER&lt;br /&gt;
{&lt;br /&gt;
  // Binary chunk header; must be present at the beginning of all binary chunks.&lt;br /&gt;
  //&lt;br /&gt;
  // The chunk ID is set to &amp;quot;NFN0&amp;quot;.&lt;br /&gt;
  NNS_BINCNK_HEADER ChunkHeader;&lt;br /&gt;
&lt;br /&gt;
  // Padding; always 0 in files.&lt;br /&gt;
  uint32_t Pad[2];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Immediately following this header comes a null-terminated string which represents the file&#039;s name and extension (without its path).&lt;br /&gt;
&lt;br /&gt;
=== End Chunk ===&lt;br /&gt;
{{Notice|type=note|content=&amp;lt;b&amp;gt;This chunk is required to be present in all binary-form NN chunk files!&amp;lt;/b&amp;gt;}}&lt;br /&gt;
This is the last chunk in all binary-form NN chunk files. It exists purely to indicate that there are no more chunks left in the file, so that you know when to stop reading if you&#039;re reading the file sequentially, one chunk at a time.&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct NNS_BINCNK_NENDHEADER&lt;br /&gt;
{&lt;br /&gt;
  // Binary chunk header; must be present at the beginning of all binary chunks.&lt;br /&gt;
  //&lt;br /&gt;
  // The chunk ID is set to &amp;quot;NEND&amp;quot;.&lt;br /&gt;
  NNS_BINCNK_HEADER ChunkHeader;&lt;br /&gt;
&lt;br /&gt;
  // Padding; always 0 in files.&lt;br /&gt;
  uint32_t Pad[2];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Text-Form File Format ==&lt;br /&gt;
Text-form NN chunk files, just like the text-form Ninja chunk model files that precede them, are text files comprised of code in what is actually a very limited subset of the C programming language, heavily utilizing special NN types/preprocessor defines, which are, presumably, defined within the official NN SDK.&lt;br /&gt;
&lt;br /&gt;
This allows them to both be parsable by tooling (it is unclear if they actually do this), and to be directly &amp;lt;code&amp;gt;#include&amp;lt;/code&amp;gt;d within the C or C++ files which make up their game&#039;s source code, embedding the data directly within the game&#039;s executable!&lt;br /&gt;
&lt;br /&gt;
Their general layout is as follows:&lt;br /&gt;
{{Notice|type=note|content=Replace these special phrases in all of the following &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; snippets as follows:&lt;br /&gt;
&lt;br /&gt;
* \t: Replace with one or more tab characters (&amp;lt;b&amp;gt;NOT&amp;lt;/b&amp;gt; spaces), used to align the text.&lt;br /&gt;
* TYPE: Replace with the name of the type currently being written.&lt;br /&gt;
* NAME: Replace with the name of whatever you&#039;re currently writing.}}&lt;br /&gt;
&lt;br /&gt;
# A (required?) &amp;quot;header&amp;quot; comment that is comprised of the following, in order:&lt;br /&gt;
## The name and version number of the tool used to create this file.&lt;br /&gt;
## &amp;lt;code&amp;gt;Create\t:&amp;lt;/code&amp;gt; followed by the date this file was created in the &amp;lt;code&amp;gt;ddd MMM dd HH:mm:ss yyyy&amp;lt;/code&amp;gt; .NET DateTime format.&lt;br /&gt;
## The names of each of the root structs for every data chunk in the file, in this format: &amp;lt;code&amp;gt;TYPE\t: NAME&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt; refers to the root struct&#039;s type (e.g. &amp;lt;code&amp;gt;NNS_TEXFILELIST&amp;lt;/code&amp;gt;). See the linked pages in the [[NN Chunk Format#Data Chunks|data chunks chart]].&lt;br /&gt;
# One or more data chunks, each of which is comprised of the following, in order:&lt;br /&gt;
## A comment with the text: &amp;lt;code&amp;gt;TYPE START&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt; refers to the [[NN Chunk Format#Data Chunks|data chunk&#039;s type]] (e.g. &amp;lt;code&amp;gt;TEXLIST&amp;lt;/code&amp;gt;).&lt;br /&gt;
## All of the data used by this data chunk, represented as C code comprised heavily of special NN preprocessor macros. See the linked pages in the [[NN Chunk Format#Data Chunks|data chunks chart]].&lt;br /&gt;
## A comment with the text: &amp;lt;code&amp;gt;TYPE END&amp;lt;/code&amp;gt;, where &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt; refers to the [[NN Chunk Format#Data Chunks|data chunk&#039;s type]] (e.g. &amp;lt;code&amp;gt;TEXLIST&amp;lt;/code&amp;gt;).&lt;br /&gt;
# A (required?) comment with the text: &amp;lt;code&amp;gt;End of File&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The files also always use tab characters (&amp;lt;code&amp;gt;\t&amp;lt;/code&amp;gt;) for indentation, rather than spaces.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a sample Text-form NN chunk file, to better understand the format:&lt;br /&gt;
{{Notice|type=example|content=&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    Sample NN Exporter Version 1.00.00&lt;br /&gt;
    Create  : Wed Feb 08 21:06:46 2023&lt;br /&gt;
    NNS_TEXFILELIST : nntexfilelist_SampleFile&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* TEXLIST START */&lt;br /&gt;
&lt;br /&gt;
NNS_TEXFILE nntexfile_SampleFile[] =&lt;br /&gt;
{&lt;br /&gt;
    TEXFILE(&lt;br /&gt;
        TF_FILENAME( &amp;quot;SampleTex_dif.dds&amp;quot; ),&lt;br /&gt;
        TF_FILTER( NND_MIN_LINEAR_MIPMAP_NEAREST, NND_MAG_LINEAR )&lt;br /&gt;
    ),&lt;br /&gt;
    TEXFILE(&lt;br /&gt;
        TF_FILENAME( &amp;quot;SampleTex_spec.dds&amp;quot; ),&lt;br /&gt;
        TF_FILTER( NND_MIN_LINEAR_MIPMAP_NEAREST, NND_MAG_LINEAR )&lt;br /&gt;
    ),&lt;br /&gt;
    TEXFILE(&lt;br /&gt;
        TF_FILENAME( &amp;quot;SampleTex_norm.dds&amp;quot; ),&lt;br /&gt;
        TF_FILTER( NND_MIN_LINEAR_MIPMAP_NEAREST, NND_MAG_LINEAR )&lt;br /&gt;
    ),&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
NNS_TEXFILELIST nntexfilelist_SampleFile[] =&lt;br /&gt;
{&lt;br /&gt;
    TEXFILELIST(&lt;br /&gt;
        TFL_N_TEXFILE( 3 ),&lt;br /&gt;
        TFL_TEXFILE( nntexfile_SampleFile )&lt;br /&gt;
    )&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* TEXLIST END */&lt;br /&gt;
&lt;br /&gt;
/* End of File */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}{{Notice|type=info|content=All of the following in the above example are type/preprocessor defines from the NN library:&lt;br /&gt;
&lt;br /&gt;
* NNS_TEXFILE&lt;br /&gt;
* TEXFILE&lt;br /&gt;
* TF_FILENAME&lt;br /&gt;
* TF_FILTER&lt;br /&gt;
* NND_MIN_LINEAR_MIPMAP_NEAREST&lt;br /&gt;
* NND_MAG_LINEAR&lt;br /&gt;
* NNS_TEXFILELIST&lt;br /&gt;
* TEXFILELIST&lt;br /&gt;
* TFL_N_TEXFILE&lt;br /&gt;
* TFL_TEXFILE&lt;br /&gt;
&lt;br /&gt;
For a complete list of all of these defines, please refer to the individual pages linked in the [[#Data Chunks|data chunks chart]] (for the ones used in this example, refer to the [[NN Chunk Format - TEXTLIST|TEXLIST]] documentation).}}&lt;br /&gt;
Note that in C, code is parsed sequentially: left-to-right, top-to-bottom.&lt;br /&gt;
&lt;br /&gt;
If a name is used in the file before it has been declared, that&#039;s an error.&lt;br /&gt;
&lt;br /&gt;
Thus, the ordering of the data within each data chunk is generally written to the file in &amp;quot;reverse&amp;quot; order, such that any reference to a value will not be written until &#039;&#039;after&#039;&#039; the value it is referencing has been written, avoiding this problem.&lt;br /&gt;
&lt;br /&gt;
In some cases, the NN exporters will instead declare the value early, and define it later on in the file, using an extern declaration like so:&lt;br /&gt;
{{Notice|type=example|content=Here, the &amp;lt;code&amp;gt;nnvertex_plb_op_en_Kyozoress_head_l__2_w2_Eye&amp;lt;/code&amp;gt; value is declared so that it can be referenced by the &amp;lt;code&amp;gt;VTX_LISTPTR&amp;lt;/code&amp;gt; field in &amp;lt;code&amp;gt;nnvertexdesc_plb_op_en_Kyozoress_head_l__2_w2_Eye&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
extern NNS_VTXTYPE_XB_PW4INCT nnvertex_plb_op_en_Kyozoress_head_l__2_w2_Eye[];&lt;br /&gt;
&lt;br /&gt;
NNS_VTXLIST_DX_DESC nnvertexdesc_plb_op_en_Kyozoress_head_l__2_w2_Eye[] =&lt;br /&gt;
{&lt;br /&gt;
    VTXDESC(&lt;br /&gt;
        /* ... */&lt;br /&gt;
        VTX_LISTPTR( nnvertex_plb_op_en_Kyozoress_head_l__2_w2_Eye ),&lt;br /&gt;
        /* ... */&lt;br /&gt;
    ),&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, later on in the file, the referenced &amp;lt;code&amp;gt;nnvertex_plb_op_en_Kyozoress_head_l__2_w2_Eye&amp;lt;/code&amp;gt; value is defined as usual (contents redacted due to extreme length):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
NNS_VTXTYPE_XB_PW4INCT nnvertex_plb_op_en_Kyozoress_head_l__2_w2_Eye[] =&lt;br /&gt;
{&lt;br /&gt;
    /* ... */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=NCP_File_Format&amp;diff=1508</id>
		<title>NCP File Format</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=NCP_File_Format&amp;diff=1508"/>
		<updated>2026-05-01T21:17:07Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This page is written as a guide on how to go through an NCP file using 010 Editor with the [https://github.com/tge-was-taken/010-Editor-Templates/blob/master/templates/sonic_xncp_yncp.bt XNCP Template]}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NCP&#039;&#039;&#039; (Ninja CellSpriteDraw Project) is a file format used to specify user interfaces in most Hedgehog Engine games. There are several variants of this file format, each with it&#039;s own target platform:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;u&amp;gt;X&amp;lt;/u&amp;gt;&#039;&#039;&#039;NCP - Used on PC / Xbox&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;u&amp;gt;Y&amp;lt;/u&amp;gt;&#039;&#039;&#039;NCP - Used on PlayStation 3&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;u&amp;gt;G&amp;lt;/u&amp;gt;&#039;&#039;&#039;NCP - Used on GameCube / Wii&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;u&amp;gt;S&amp;lt;/u&amp;gt;&#039;&#039;&#039;NCP - Used on PlayStation 2&lt;br /&gt;
&lt;br /&gt;
In this page, you will read about how to open an NCP file in 010 editor and how this file is structured.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
First of all, you will need to download the [https://www.sweetscape.com/010editor/ 010 Editor]. This program is used for hex editing, and in our case, to modify XNCP files. You&#039;ll also need to download the [https://github.com/tge-was-taken/010-Editor-Templates/blob/master/templates/sonic_xncp_yncp.bthttps://github.com/tge-was-taken/010-Editor-Templates/blob/master/templates/sonic_xncp_yncp.bt XNCP Template]. Essentially, this file will make it so that you can read and understand the XNCP file&#039;s contents, otherwise you&#039;d only see hex numbers, and that&#039;s not exactly readable.&lt;br /&gt;
&lt;br /&gt;
== Opening an XNCP file ==&lt;br /&gt;
After installing the 010 Editor, and downloaded the XNCP Template, it&#039;s time to open a file.&lt;br /&gt;
&lt;br /&gt;
Open the 010 Editor and click on &#039;&#039;&#039;File &amp;gt; Open File...&#039;&#039;&#039;, and open the file that you need to edit.&lt;br /&gt;
[[File:010 Editor open file.png|center|thumb|397x397px]]&lt;br /&gt;
After opening the file, you&#039;ll see a bunch of numbers. Don&#039;t get freaked out, this is normal. These are the contents of the XNCP file.&lt;br /&gt;
[[File:010 editor xncp hex.png|center|thumb|702x702px]]&lt;br /&gt;
Now, you need to go to &#039;&#039;&#039;Templates &amp;gt; Open Template...&#039;&#039;&#039;, and open the file that we downloaded before. It&#039;s called &#039;&#039;&#039;sonic_xncp_yncp.bt&#039;&#039;&#039;.&lt;br /&gt;
[[File:010 Editor open template.png|center|thumb|343x343px]]&lt;br /&gt;
After opening the file, a window should pop up with the template&#039;s code. You can just ignore this window and hide it wherever you&#039;d like, you won&#039;t need to modify this.&lt;br /&gt;
&lt;br /&gt;
Now, go back to &#039;&#039;&#039;Templates&#039;&#039;&#039; and click on &#039;&#039;&#039;Run Template&#039;&#039;&#039;. This should now make the numbers have colorful backgrounds, and a new window will appear below the hex view.&lt;br /&gt;
[[File:010 Editor xncp template executed.png|center|thumb|944x944px]]&lt;br /&gt;
This new window that has appeared will be your workspace. This&#039;ll be the way in which you edit all aspects of a UI file. Click on the &#039;&#039;&#039;struct TFAPC File&#039;&#039;&#039; dropdown, then &#039;&#039;&#039;struct TFAPCEmbeddedRes Resources[0]&#039;&#039;&#039;, then &#039;&#039;&#039;struct TNNNCPJChunk CsdmProject&#039;&#039;&#039;, and then on &#039;&#039;&#039;struct TCSDNode Root&#039;&#039;&#039;. Now you&#039;ll have a few variables here; I&#039;ll explain what some of them mean!&lt;br /&gt;
&lt;br /&gt;
== The structure of an XNCP file (Resource 0) ==&lt;br /&gt;
&#039;&#039;&#039;Scenes&#039;&#039;&#039; are essentially the containers for a specific group of UI elements, think of it like a folder inside a folder, and you&#039;ll need &#039;&#039;&#039;SceneIDTable&#039;&#039;&#039; to understand which Scene is what. This table contains the name and index of each Scene (e.g: Scene &amp;quot;gauge&amp;quot; in ui_gameplay.xncp is the &amp;quot;folder&amp;quot; that contains all elements of the boost bar in the HUD). Scenes also have a few variables that may be of interest, like:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ZIndex&#039;&#039;&#039;, this is essentially the layer in which the UI elements (known as &#039;&#039;&#039;Casts&#039;&#039;&#039;) will render&lt;br /&gt;
* &#039;&#039;&#039;Groups&#039;&#039;&#039;, are exactly what they are called, they are groups of &#039;&#039;&#039;Casts&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;SubImages&#039;&#039;&#039;, these are essentially textures that have been cut in specific portions to be used by Casts&lt;br /&gt;
* &#039;&#039;&#039;CastDictionary&#039;&#039;&#039;, this will be one of the most useful variables when editing XNCP files, these contain all the names, indexes, and group indexes needed to find a specific Cast in the scene.&lt;br /&gt;
* &#039;&#039;&#039;AnimationKeyFrameDataList&#039;&#039;&#039;, &#039;&#039;&#039;AnimationDictionary&#039;&#039;&#039;, &#039;&#039;&#039;AnimationFrameDataList&#039;&#039;&#039;, &#039;&#039;&#039;AnimationData2List&#039;&#039;&#039;, all of these control animations. You can read more about them later on in this page.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;And the most important one of all:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Casts&#039;&#039;&#039;, these are the UI elements of XNCP files, these contain the necessary data to display text, move other elements, or display an image.&lt;br /&gt;
&lt;br /&gt;
== The structure of a Cast ==&lt;br /&gt;
The Cast has several variables that you can change:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Field04&#039;&#039;&#039; controls the type of the cast, these types can be:&lt;br /&gt;
&lt;br /&gt;
 0 - No Draw (invisible)&lt;br /&gt;
 1 - Sprite&lt;br /&gt;
 2 - Font&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IsEnabled&#039;&#039;&#039; will enable and disable a cast. 0 for disabled and 1 for enabled&lt;br /&gt;
** &#039;&#039;&#039;NOTE&#039;&#039;&#039;: If you&#039;re disabling a cast, make sure that it does not have children, or it might make the UI look weird!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Field0C&#039;&#039;&#039;, &#039;&#039;&#039;Field14&#039;&#039;&#039;, &#039;&#039;&#039;Field1C&#039;&#039;&#039;, &#039;&#039;&#039;Field24&#039;&#039;&#039; change the positions of the corners of the cast, Top Left, Bottom Left, Top Right, Bottom Right respectively. These only really affect casts that render sprites&lt;br /&gt;
* &#039;&#039;&#039;Offset&#039;&#039;&#039; changes the position of the element relative to its parent. This is useful for moving elements around, although it&#039;s not used much.&lt;br /&gt;
* &#039;&#039;&#039;Field30Data&#039;&#039;&#039; contains most of the fun things that you can edit in a Cast, like:&lt;br /&gt;
&lt;br /&gt;
 Translation&lt;br /&gt;
 Rotation&lt;br /&gt;
 Scale&lt;br /&gt;
 Color - where the variable &amp;quot;Color&amp;quot; will change the main color of the image, and GradientTopLeft,BottomLeft,TopRight,BottomRight will change the colors of the corners of the image&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Field40Data&#039;&#039;&#039; contains data about a cast&#039;s subimages. If the cast is a nodraw or font type, this will be all set to -1 most of the time. Each of these variables is a holder for a specific index of a subimage. However, only the first one is used all the time, all of the other ones are for animations.&lt;br /&gt;
&lt;br /&gt;
== The structure of an XNCP file (Resource 1) ==&lt;br /&gt;
Before, I wrote that you needed to go into Resource 0. This is because Resource 0 has most of the cool stuff that you can edit, while Resource 1 contains data about image file locations.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TextureList&#039;&#039;&#039;, this is a list of all the textures used by the UI... this is pretty much it. Each texture will have a name, and it&#039;s index will be the number specified next to the &amp;quot;Textures&amp;quot; name.&lt;br /&gt;
[[File:010 Editor xncp texture list.png|center|thumb|813x813px]]&lt;br /&gt;
&lt;br /&gt;
== XNCP Animations ==&lt;br /&gt;
XNCP animations for a specific scene are listed in &#039;&#039;&#039;AnimationDictionary&#039;&#039;&#039;, which behaves the same way as the CastDictionary:&lt;br /&gt;
[[File:XNCP Animation Dictionary.png|center|thumb|658x658px]]&lt;br /&gt;
In &#039;&#039;&#039;AnimationFrameDataList&#039;&#039;&#039;, it’s possible to control the amount of keyframes that a specific animation has:&lt;br /&gt;
[[File:XNCP Animation Frame Data List.png|center|thumb|503x503px]]&lt;br /&gt;
To control the speed of these animations, we have a single field in the scene that controls the frame rate:&lt;br /&gt;
[[File:XNCP Animation Framerate.png|center|thumb|694x694px]]&lt;br /&gt;
&#039;&#039;&#039;AnimationKeyFrameDataList&#039;&#039;&#039; contains the information for all the keyframes in the animation, as well as the casts that belong in that animation.&lt;br /&gt;
[[File:XNCP Animation Key Frame Data List.png|center|thumb|628x628px]]&lt;br /&gt;
In the screenshot above, we’re seeing the data referring to Animation 0 (&#039;&#039;&#039;Intro_Anim&#039;&#039;&#039; when following the dictionary). XNCPs usually follow this naming scheme for animations:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Intro_Anim&#039;&#039;&#039; - Animation that plays when the scene appears&lt;br /&gt;
* &#039;&#039;&#039;Usual_Anim&#039;&#039;&#039; - Normally a looping animation, is used during the scenes visible state&lt;br /&gt;
* &#039;&#039;&#039;Outro_Anim&#039;&#039;&#039; - Played before the scene disappears They can obviously store other animations, and those have their own names.&lt;br /&gt;
&lt;br /&gt;
So, in Intro_Anim, we have several &#039;&#039;&#039;CastAnimationData&#039;&#039;&#039;. These control what happens to each cast in this animation. Let’s see what happens to Cast 0 (position, which usually is the parent of all casts in a scene and controls their position)...&lt;br /&gt;
[[File:XNCP Cast Animation Data.png|center|thumb|511x511px]]&lt;br /&gt;
Seems like we have flags! It’s a bitfield, and it controls what actually animates in this cast. Here’s the meaning of each bit:&lt;br /&gt;
 0000 0000(0)   - Nothing&lt;br /&gt;
 0000 0001(1)   - Hide Flag&lt;br /&gt;
 0000 0010(2)   - X Position&lt;br /&gt;
 0000 0100(4)   - Y Position&lt;br /&gt;
 0000 1000(8)   - Rotation&lt;br /&gt;
 0001 0000(16)  - X Scale&lt;br /&gt;
 0010 0000(32)  - Y Scale&lt;br /&gt;
 0100 0000(64)  - SubImage&lt;br /&gt;
 1000 0000(128) - Colour Mask&lt;br /&gt;
So, with this info, we now know what animates in the position cast: It is its X Position. The &#039;&#039;&#039;CastAnimationDataSubData1List&#039;&#039;&#039; is what stores the actual animation data. The amount of entries in this list depends on the number of bits signaled in the &#039;&#039;&#039;Flags&#039;&#039;&#039; field. The first entry in the list is referring to the first bit signaled from right to left. So by that logic, the list only has one entry.&lt;br /&gt;
[[File:XNCP Cast Animation Data Sub Data 1 List.png|center|thumb|500x500px]]&lt;br /&gt;
And there we go. This entry is what stores the actual &#039;&#039;&#039;KeyFrames&#039;&#039;&#039;. Let’s open one up to see how it is.&lt;br /&gt;
[[File:XNCP Key Frame.png|center|thumb|410x410px]]&lt;br /&gt;
Scary right? I don’t understand much of what’s going on here, but here we go.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame&#039;&#039;&#039; defines which global frame this keyframe is in. Remember &#039;&#039;&#039;AnimationFrameDataList&#039;&#039;&#039;? Yeah, this animation has a total of 10 frames, and is played at 60 FPS. For each frame, you define the global frame that it refers to. So, since this cast controls the position of the entire scene, and this is the intro animation, maybe the other keyframe has the frame field set to 10? We’ll see about that shortly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Data&#039;&#039;&#039; store the data of this keyframe. The meaning of data changes depending on the flags. Data can be:&lt;br /&gt;
&lt;br /&gt;
* A position&lt;br /&gt;
* An angle (for rotation)&lt;br /&gt;
* A size (for X and Y scale)&lt;br /&gt;
* An index (for SubImage)&lt;br /&gt;
* A colour (for ColorMask)&lt;br /&gt;
&lt;br /&gt;
According to the flags of this specific cast, these keyframes are supposed to control the X Position, which means that “Data” actually represents the X Position of the cast in this frame.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Offset&#039;&#039;&#039; and &#039;&#039;&#039;Offset2&#039;&#039;&#039; fields control the casts&#039; Offset position value, where &amp;quot;Offset&amp;quot; is X, while &amp;quot;Offset2&amp;quot; is Y. For example, the buttons in the title screen of Sonic Generations use these values to stay in place when they&#039;re clicked since they get scaled up and down. Let’s look at the second keyframe:&lt;br /&gt;
[[File:XNCP Key Frame 2.png|center|thumb|356x356px]]&lt;br /&gt;
As we suspected, the &#039;&#039;&#039;Frame&#039;&#039;&#039; field is now set to 10, meaning this is referring to the last frame in the animation. The value in &#039;&#039;&#039;Data&#039;&#039;&#039; has increased, so this means that &#039;&#039;&#039;this cast slides from left to right&#039;&#039;&#039; in this animation!&lt;br /&gt;
&lt;br /&gt;
Looking at the remaining &#039;&#039;&#039;CastAnimationData&#039;&#039;&#039; entries, we can see that none of them animate, since their &#039;&#039;&#039;Flags&#039;&#039;&#039; field is set to 0. So we can conclude that &#039;&#039;&#039;Intro_Anim&#039;&#039;&#039; makes the &#039;&#039;&#039;position&#039;&#039;&#039; cast slide from &#039;&#039;&#039;left to right&#039;&#039;&#039;, and since “position” controls the entire scene, every single cast from this scene slides from left to right in this animation!&lt;br /&gt;
[[File:XNCP Cast Animation Data No Anim.png|center|thumb|571x571px]]&lt;br /&gt;
&lt;br /&gt;
== Additional Notes ==&lt;br /&gt;
An animation can only be looped using code, so that can&#039;t be controlled via the XNCP. However, &#039;&#039;&#039;Field00&#039;&#039;&#039; in &#039;&#039;&#039;CastAnimationDataSubData&#039;&#039;&#039; does seem to control how fast a loop occurs, where the value &#039;&#039;&#039;1&#039;&#039;&#039; seems to loop it with a delay, while &#039;&#039;&#039;2&#039;&#039;&#039; makes it loop smoother.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Hope I explained XNCP animations well enough. Have fun!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;PS: there’s also AnimationData2List but...&#039;&#039;&lt;br /&gt;
[[File:XNCP Animation Data 2 List.png|center|thumb|629x629px]]&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HSON_Format&amp;diff=1507</id>
		<title>HSON Format</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HSON_Format&amp;diff=1507"/>
		<updated>2026-05-01T21:16:55Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;The Hedgehog Set Object Notation Format&#039;&#039;&#039; (&amp;quot;HSON&amp;quot;) is a custom JSON-based file format designed collaboratively by &#039;&#039;&#039;Darío&#039;&#039;&#039;, &#039;&#039;&#039;Radfordhound&#039;&#039;&#039;, &#039;&#039;&#039;ĐeäTh&#039;&#039;&#039;, &#039;&#039;&#039;Skyth&#039;&#039;&#039;, and &#039;&#039;&#039;Sajid&#039;&#039;&#039; to represent object placement in a &amp;quot;universal&amp;quot; (non-game/editor-specific) way.&lt;br /&gt;
&lt;br /&gt;
It was designed with the following principles in-mind:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Be universal.&#039;&#039;&#039; Specifically, it must be able to represent object placement data from &#039;&#039;at least&#039;&#039; any mainline 3D Sonic game in a non-game/editor-specific way.&lt;br /&gt;
* &#039;&#039;&#039;Be simple.&#039;&#039;&#039; Specifically, it must not be difficult to parse and to generate.&lt;br /&gt;
* &#039;&#039;&#039;Be flexible.&#039;&#039;&#039; Specifically, it must be able to be adapted to do anything future games and tools may require.&lt;br /&gt;
&lt;br /&gt;
== JSON Schema ==&lt;br /&gt;
The official JSON Schema for the HSON Format can be found at the [https://github.com/hedge-dev/hson-schema hson-schema GitHub repository].&lt;br /&gt;
&lt;br /&gt;
It&#039;s useful (but not necessary) to validate .hson files against this schema in editors which support this feature, as doing so allows you to have autocompletion, descriptions of each property, and data validation.&lt;br /&gt;
&lt;br /&gt;
To validate &#039;&#039;all&#039;&#039; .hson files against the schema in your editor of choice, refer to the instructions in the README from the above repository.&lt;br /&gt;
&lt;br /&gt;
To manually validate against the schema on a per-file basis, include the following line at the top-level of your HSON file(s), before the HSON file format [[HSON Format#1. version|version parameter]].&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;$schema&amp;quot;: &amp;quot;https://raw.githubusercontent.com/hedge-dev/hson-schema/main/hson.schema.json&amp;quot;,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;If writing tooling that generates HSON, consider having your tooling write this line to generated files.&lt;br /&gt;
&lt;br /&gt;
== Implementations ==&lt;br /&gt;
As of the time of writing, the following known implementations exist:&lt;br /&gt;
&lt;br /&gt;
=== C# ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://github.com/hedge-dev/libHSON-csharp libHSON]:&#039;&#039;&#039; The official C# implementation of HSON. Allows for simple, efficient, feature-complete, two-way serialization of HSON data.&lt;br /&gt;
&lt;br /&gt;
=== C++ ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://github.com/Radfordhound/HedgeLib HedgeLib]:&#039;&#039;&#039; Radfordhound&#039;s open-source library and collection of tools that aims to makes modding games in the Sonic the Hedgehog franchise easier. It contains a feature-complete two-way HSON implementation, which is used in its level-editing tooling.&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
The following is an example file in the HSON Format, which represents a &amp;quot;project&amp;quot; called &amp;quot;Sample Project&amp;quot; that contains 5 objects.&lt;br /&gt;
&lt;br /&gt;
This example file will be referenced periodically throughout the [[HSON Format#Format Specification|format specification]].&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;$schema&amp;quot;: &amp;quot;https://raw.githubusercontent.com/hedge-dev/hson-schema/main/hson.schema.json&amp;quot;,&lt;br /&gt;
  &amp;quot;version&amp;quot;: 1,&lt;br /&gt;
  &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
    &amp;quot;name&amp;quot;: &amp;quot;Sample Project&amp;quot;,&lt;br /&gt;
    &amp;quot;author&amp;quot;: &amp;quot;Takashi Iizuka, Morio Kishimoto&amp;quot;,&lt;br /&gt;
    &amp;quot;date&amp;quot;: &amp;quot;2023-02-09T22:38:42Z&amp;quot;,&lt;br /&gt;
    &amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
    &amp;quot;description&amp;quot;: &amp;quot;green hill is looking a lot more like sand hill rn&amp;quot;,&lt;br /&gt;
    &amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
      &amp;quot;viewportTabIndex&amp;quot;: 0&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;objects&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;,&lt;br /&gt;
      &amp;quot;name&amp;quot;: &amp;quot;Spring #1&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Spring&amp;quot;,&lt;br /&gt;
      &amp;quot;position&amp;quot;: [ 100.0, 0.0, 0.0 ],&lt;br /&gt;
      &amp;quot;rotation&amp;quot;: [ 0.0, 0.0, 0.0, 1.0 ],&lt;br /&gt;
      &amp;quot;scale&amp;quot;: [ 1.0, 1.0, 1.0 ],&lt;br /&gt;
      &amp;quot;isEditorVisible&amp;quot;: true,&lt;br /&gt;
      &amp;quot;isExcluded&amp;quot;: false,&lt;br /&gt;
      &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;tags&amp;quot;: {&lt;br /&gt;
          &amp;quot;RangeSpawning&amp;quot;: {&lt;br /&gt;
            &amp;quot;rangeIn&amp;quot;: 100.0,&lt;br /&gt;
            &amp;quot;rangeOut&amp;quot;: 20.0&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;visual&amp;quot;: &amp;quot;Normal&amp;quot;,&lt;br /&gt;
        &amp;quot;firstSpeed&amp;quot;: 420,&lt;br /&gt;
        &amp;quot;outOfControl&amp;quot;: 2.5,&lt;br /&gt;
        &amp;quot;isHorming&amp;quot;: true,&lt;br /&gt;
        &amp;quot;actions&amp;quot;: [&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;On&amp;quot;,&lt;br /&gt;
            &amp;quot;objectIds&amp;quot;: [&lt;br /&gt;
                &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
                &amp;quot;{38285a58-9969-4c5f-a649-b91440962a71}&amp;quot;&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;delayTime&amp;quot;: 0.5&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;Off&amp;quot;,&lt;br /&gt;
            &amp;quot;objectIds&amp;quot;: [],&lt;br /&gt;
            &amp;quot;delayTime&amp;quot;: 0.0&lt;br /&gt;
          },&lt;br /&gt;
          {&lt;br /&gt;
            &amp;quot;action&amp;quot;: &amp;quot;Off&amp;quot;,&lt;br /&gt;
            &amp;quot;objectIds&amp;quot;: [],&lt;br /&gt;
            &amp;quot;delayTime&amp;quot;: 0.0&lt;br /&gt;
          }&lt;br /&gt;
        ],&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
      &amp;quot;parentId&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;,&lt;br /&gt;
      &amp;quot;position&amp;quot;: [ 0.0, 1.0, 0.0 ],&lt;br /&gt;
      &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;visibility&amp;quot;: &amp;quot;Visible&amp;quot;,&lt;br /&gt;
        &amp;quot;respawnTime&amp;quot;: 0.0&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;myCustomValue&amp;quot;: 893.5,&lt;br /&gt;
      &amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
        &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
        &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;{38285a58-9969-4c5f-a649-b91440962a71}&amp;quot;,&lt;br /&gt;
      &amp;quot;instanceOf&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
      &amp;quot;position&amp;quot;: [ 0.0, 2.0, 0.0 ],&lt;br /&gt;
      &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
        &amp;quot;respawnTime&amp;quot;: 0.5&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;id&amp;quot;: &amp;quot;{81fdcaff-aa37-4c47-a665-5b6265a6b780}&amp;quot;,&lt;br /&gt;
      &amp;quot;parentId&amp;quot;: &amp;quot;{00000000-0000-0000-0000-000000000000}&amp;quot;,&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;DashPanel&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Format Specification ==&lt;br /&gt;
What follows is a specification of all standard properties supported by the HSON Format.&lt;br /&gt;
{{Notice|type=note|content=All of the following properties are &amp;lt;b&amp;gt;OPTIONAL&amp;lt;/b&amp;gt;, unless otherwise specified.}}&lt;br /&gt;
&lt;br /&gt;
=== 1. version ===&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: number&lt;br /&gt;
• &amp;lt;b&amp;gt;Minimum&amp;lt;/b&amp;gt;: 1&lt;br /&gt;
&lt;br /&gt;
This value is &amp;lt;b&amp;gt;REQUIRED&amp;lt;/b&amp;gt; to be present in all HSON files.}}&lt;br /&gt;
&#039;&#039;&#039;The version of the HSON format being used by this file.&#039;&#039;&#039; It is represented as a number that is restricted in the following ways:&lt;br /&gt;
&lt;br /&gt;
* It must have a zero fractional part (e.g. &amp;lt;code&amp;gt;1.5&amp;lt;/code&amp;gt; would not be allowed, but &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; are).&lt;br /&gt;
* It must be greater than or equal to 1.&lt;br /&gt;
&lt;br /&gt;
Because of these restrictions, it is valid for tooling to parse this value into an &amp;lt;code&amp;gt;unsigned int&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Currently, version 1 is the latest version.&lt;br /&gt;
&lt;br /&gt;
=== 2. metadata ===&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: object}}&lt;br /&gt;
&#039;&#039;&#039;Metadata for the project represented by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
It is intended to be used purely for tooling display purposes.&lt;br /&gt;
&lt;br /&gt;
metadata is represented as a JSON &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; consisting of the following properties:&lt;br /&gt;
&lt;br /&gt;
==== 2.1. name ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The name of the project represented by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 2.2. author ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The author(s) of the project represented by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If the project has multiple authors, we recommend writing each author&#039;s name with a comma and space separating them, like so:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;author&amp;quot;: &amp;quot;Me, Myself, I&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2.3. date ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The date/time the project was created at&#039;&#039;&#039;, represented as a string in the [https://www.rfc-editor.org/rfc/rfc3339 RFC 3339 format] (a similar standard to ISO 8601).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;It is invalid to represent the date using any other format.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This limitation makes parsing dates in tooling a lot easier.&lt;br /&gt;
{{Notice|type=example|content=Feel free to copy-paste any of these code snippets and do what you want with them.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;C#&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
public static string GetRFC3339Time()&lt;br /&gt;
{&lt;br /&gt;
    return DateTime.UtcNow.ToString(&amp;quot;yyyy-MM-ddTHH:mm:ssK&amp;quot;,&lt;br /&gt;
        CultureInfo.InvariantCulture);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;C++11&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
#include &amp;lt;stdexcept&amp;gt;&lt;br /&gt;
#include &amp;lt;ctime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
std::string getRFC3339Time()&lt;br /&gt;
{&lt;br /&gt;
    char buf[32]; // This is a few extra characters than should be necessary, just to be safe.&lt;br /&gt;
    const auto time = std::time(nullptr);&lt;br /&gt;
    const auto len = std::strftime(buf, sizeof(buf), &amp;quot;%FT%TZ&amp;quot;, std::gmtime(&amp;amp;time));&lt;br /&gt;
&lt;br /&gt;
    if (!len)&lt;br /&gt;
    {&lt;br /&gt;
        throw std::runtime_error(&amp;quot;Failed to get RFC 3339 format time&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return std::string(buf, len);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;C&amp;lt;/b&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
    Returns 0 on failure, or the number of bytes written&lt;br /&gt;
    into buf (not including the null terminator) on success.&lt;br /&gt;
*/&lt;br /&gt;
int getRFC3339Time(size_t bufSize, char* buf)&lt;br /&gt;
{&lt;br /&gt;
    const time_t time = time(NULL);&lt;br /&gt;
    return strftime(buf, bufSize, &amp;quot;%FT%TZ&amp;quot;, gmtime(&amp;amp;time));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==== 2.4. version ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The version number of the project&#039;&#039;&#039;, represented as a string.&lt;br /&gt;
&lt;br /&gt;
How you want to version your project is up to you; these are all valid:&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;&lt;br /&gt;
&amp;quot;version&amp;quot;: &amp;quot;1&amp;quot;&lt;br /&gt;
&amp;quot;version&amp;quot;: &amp;quot;beta release&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&#039;&#039;&#039;Tooling should treat this as an arbitrary string in no particular format.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== 2.5. description ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The description of the project represented by this file.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== 3. objects ===&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: array}}&lt;br /&gt;
&#039;&#039;&#039;An array containing all of the objects contained within the project.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Each object is represented as a JSON &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; consisting of the following properties:&lt;br /&gt;
&lt;br /&gt;
==== 3.1. id ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The UUID (aka GUID) of the object&#039;&#039;&#039;, represented as a case-insensitive string formatted like this: &amp;lt;code&amp;gt;{11111111-2222-3333-4444-555555555555}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that it is enclosed in curly brackets; this is to make it clear that it is supposed to be parsed as a UUID, and &#039;&#039;&#039;NOT&#039;&#039;&#039; as a number.&lt;br /&gt;
&lt;br /&gt;
The object&#039;s UUID is used to reference the object throughout the project.&lt;br /&gt;
&lt;br /&gt;
It must be unique throughout the project; that is, &#039;&#039;&#039;no two objects within the same project are allowed to have the same UUID.&#039;&#039;&#039; That&#039;s what makes them &#039;&#039;UUIDs&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
It also &#039;&#039;&#039;cannot be set to the following value&#039;&#039;&#039;: &amp;lt;code&amp;gt;{00000000-0000-0000-0000-000000000000}&amp;lt;/code&amp;gt;, as this value is reserved for &amp;quot;null&amp;quot; object references.&lt;br /&gt;
&lt;br /&gt;
This property can be omitted (leaving the object without a specified UUID) if the object never needs to be referenced. This helps to save some space.&lt;br /&gt;
&lt;br /&gt;
Tools are free to generate their own UUIDs for objects without a specified UUID, or to just think of the object as not having a UUID. Whichever is more convenient.&lt;br /&gt;
{{Notice|type=example|content=&amp;lt;b&amp;gt;Valid UUID&amp;lt;/b&amp;gt; (lowercase):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Valid UUID&amp;lt;/b&amp;gt; (uppercase):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;{FD3E6BC9-5D2D-4DA8-A22D-F88E709B3E48}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Invalid UUID&amp;lt;/b&amp;gt; (no enclosing curly brackets):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Invalid UUID&amp;lt;/b&amp;gt; (not a UUID):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;{2}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Invalid UUID&amp;lt;/b&amp;gt; (the special &amp;quot;null&amp;quot; UUID value is not valid to use as the object&#039;s id):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;id&amp;quot;: &amp;quot;{00000000-0000-0000-0000-000000000000}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Valid object references&amp;lt;/b&amp;gt; (the special &amp;quot;null&amp;quot; UUID value is valid to use in object references):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;parentId&amp;quot;: &amp;quot;{00000000-0000-0000-0000-000000000000}&amp;quot;,&lt;br /&gt;
&amp;quot;instanceOf&amp;quot;: &amp;quot;{00000000-0000-0000-0000-000000000000}&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==== 3.2. name ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The name of the object.&#039;&#039;&#039; This is an arbitrary string that can be anything you want.&lt;br /&gt;
&lt;br /&gt;
It is intended to be used purely for tooling display purposes.&lt;br /&gt;
&lt;br /&gt;
==== 3.3. parentId ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The [[HSON Format#3.1. id|id]] of this object&#039;s parent object&#039;&#039;&#039;, or a null UUID.&lt;br /&gt;
&lt;br /&gt;
If specified as a valid, non-null UUID, this object is a child of the object with the given UUID, meaning that the object&#039;s transform (represented via &amp;lt;code&amp;gt;[[HSON Format#3.6. position|position]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[HSON Format#3.7. rotation|rotation]]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[[HSON Format#3.8. scale|scale]]&amp;lt;/code&amp;gt;) is relative to the parent&#039;s transform (which is relative to its parent&#039;s transform, and so on).&lt;br /&gt;
&lt;br /&gt;
Otherwise, if it is not specified, or is specified as a null UUID, this object has no parent object, and the transform is global.&lt;br /&gt;
{{Notice|type=example|content=&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;,&lt;br /&gt;
  &amp;quot;position&amp;quot;: [ 0.0, 1.0, 0.0 ],&lt;br /&gt;
  &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
    &amp;quot;visibility&amp;quot;: &amp;quot;Visible&amp;quot;,&lt;br /&gt;
    &amp;quot;respawnTime&amp;quot;: 0.0&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;myCustomValue&amp;quot;: 893.5,&lt;br /&gt;
  &amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
    &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
    &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this snippet from [[HSON Format#Example|the example file]], the object has specified a position of &amp;lt;code&amp;gt;[ 0.0, 1.0, 0.0 ]&amp;lt;/code&amp;gt;, and a parentId of &amp;lt;code&amp;gt;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;lt;/code&amp;gt;, which means that its transform is local to the transform of the object which uses that UUID (not included in this snippet).&lt;br /&gt;
&lt;br /&gt;
This parent object has a position of &amp;lt;code&amp;gt;[ 100.0, 0.0, 0.0 ]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
So, the above object&#039;s global position is &amp;lt;code&amp;gt;[ 100.0, 1.0, 0.0 ]&amp;lt;/code&amp;gt;.}}{{Notice|type=example|content=&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{81fdcaff-aa37-4c47-a665-5b6265a6b780}&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;{00000000-0000-0000-0000-000000000000}&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;DashPanel&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this snippet from [[HSON Format#Example|the example file]], the object has specified a parentId of &amp;lt;code&amp;gt;{00000000-0000-0000-0000-000000000000}&amp;lt;/code&amp;gt; (the special UUID null value), which is equivalent to not specifying a parentId. This means that this object has no parent.}}&lt;br /&gt;
&lt;br /&gt;
==== 3.4. instanceOf ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string}}&lt;br /&gt;
&#039;&#039;&#039;The [[HSON Format#3.1. id|id]] of the object to be instanced&#039;&#039;&#039;, or a null UUID.&lt;br /&gt;
&lt;br /&gt;
If specified as a valid, non-null UUID, this object is an instance of the object with the given UUID, meaning that it will inherit &#039;&#039;&#039;ALL&#039;&#039;&#039; &#039;&#039;unspecified properties&#039;&#039; from the instanced object, &#039;&#039;&#039;with the notable exception of the &amp;lt;code&amp;gt;[[HSON Format#3.1. id|id]]&amp;lt;/code&amp;gt; property&#039;&#039;&#039;, instead of falling back to the usual defaults.&lt;br /&gt;
&lt;br /&gt;
Note that it will &#039;&#039;&#039;NOT&#039;&#039;&#039; affect the object&#039;s &#039;&#039;specified properties&#039;&#039;; these will effectively &amp;quot;override&amp;quot; any properties taken from the instanced object.&lt;br /&gt;
&lt;br /&gt;
Otherwise, if it is not specified, or is specified as a null UUID, this object is not an instance.&lt;br /&gt;
{{Notice|type=example|content=&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;,&lt;br /&gt;
  &amp;quot;position&amp;quot;: [ 0.0, 1.0, 0.0 ],&lt;br /&gt;
  &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
    &amp;quot;visibility&amp;quot;: &amp;quot;Visible&amp;quot;,&lt;br /&gt;
    &amp;quot;respawnTime&amp;quot;: 0.0&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;myCustomValue&amp;quot;: 893.5,&lt;br /&gt;
  &amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
    &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
    &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
  }&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{38285a58-9969-4c5f-a649-b91440962a71}&amp;quot;,&lt;br /&gt;
  &amp;quot;instanceOf&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
  &amp;quot;position&amp;quot;: [ 0.0, 2.0, 0.0 ],&lt;br /&gt;
  &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
    &amp;quot;respawnTime&amp;quot;: 0.5&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In this snippet from [[HSON Format#Example|the example file]], the second listed object (UUID: &amp;lt;code&amp;gt;38285a58-9969-4c5f-a649-b91440962a71&amp;lt;/code&amp;gt;) is an instance of the first listed object (UUID: &amp;lt;code&amp;gt;2737e92f-4842-46cb-a590-e074f7b882f0&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
As such, it will inherit all of the unspecified properties from the first object, including the &amp;lt;code&amp;gt;[[HSON Format#3.3. parentId|parentId]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[HSON Format#3.5. type|type]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;myCustomValue&amp;lt;/code&amp;gt;, and &amp;lt;codemyCustomEditor&amp;lt;/code&amp;gt; properties, as well as the visibility parameter.&lt;br /&gt;
&lt;br /&gt;
It will &amp;lt;b&amp;gt;NOT&amp;lt;/b&amp;gt;, however, inherit the specified properties, including the &amp;lt;code&amp;gt;[[HSON Format#3.1. id|id]]&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;[[HSON Format#3.4. instanceOf|instanceOf]]&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;[[HSON Format#3.6. position|position]]&amp;lt;/code&amp;gt; properties, as well as the &amp;lt;code&amp;gt;respawnTime&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
This means that the second object in the above snippet will be equivalent to the following object:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{38285a58-9969-4c5f-a649-b91440962a71}&amp;quot;,&lt;br /&gt;
  &amp;quot;parentId&amp;quot;: &amp;quot;{fd3e6bc9-5d2d-4da8-a22d-f88e709b3e48}&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;,&lt;br /&gt;
  &amp;quot;instanceOf&amp;quot;: &amp;quot;{2737e92f-4842-46cb-a590-e074f7b882f0}&amp;quot;,&lt;br /&gt;
  &amp;quot;position&amp;quot;: [ 0.0, 2.0, 0.0 ],&lt;br /&gt;
  &amp;quot;parameters&amp;quot;: {&lt;br /&gt;
    &amp;quot;visibility&amp;quot;: &amp;quot;Visible&amp;quot;,&lt;br /&gt;
    &amp;quot;respawnTime&amp;quot;: 0.5&lt;br /&gt;
  },&lt;br /&gt;
  &amp;quot;myCustomValue&amp;quot;: 893.5,&lt;br /&gt;
  &amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
    &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
    &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
As you can see, this is a simple, yet powerful system that allows for many possibilities.}}{{Notice|type=note|content=UUIDs have a special exception; they &amp;lt;b&amp;gt;never&amp;lt;/b&amp;gt; get inherited from the instanced object.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;id&amp;quot;: &amp;quot;{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}&amp;quot;,&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;Ring&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;instanceOf&amp;quot;: &amp;quot;{AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The second object listed in the above example will inherit all properties from the first object, &amp;lt;i&amp;gt;except&amp;lt;/i&amp;gt; for the &amp;lt;code&amp;gt;[[HSON Format#3.1. id|id]]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
This is due to the fact that every valid object must have its own unique UUID.}}&lt;br /&gt;
&lt;br /&gt;
==== 3.5. type ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: string&lt;br /&gt;
&lt;br /&gt;
This value is &amp;lt;b&amp;gt;REQUIRED&amp;lt;/b&amp;gt; to be present, &amp;lt;b&amp;gt;unless this object is an [[HSON Format#3.4. instanceOf|instance of]] another object&amp;lt;/b&amp;gt;, in which case, it is optional, as the type will just be taken from the instanced object.}}&lt;br /&gt;
&#039;&#039;&#039;The type of the object&#039;&#039;&#039; (e.g. &amp;quot;Spring&amp;quot;, &amp;quot;Ring&amp;quot;, etc.).&lt;br /&gt;
&lt;br /&gt;
Note that this value is not game-specific and can be set to anything, with one exception: &#039;&#039;&#039;it is not valid for type to be an empty string&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== 3.6. position ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: array&lt;br /&gt;
• &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;: &amp;lt;code&amp;gt;[ 0.0, 0.0, 0.0 ]&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&#039;&#039;&#039;The position of the object within 3D space.&#039;&#039;&#039; Represented as a three-dimensional array of &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;s, representing a vector3 using Y-Up right-handed coordinates (X-right, Y-up, and Z-backwards), and meters as its units.&lt;br /&gt;
&lt;br /&gt;
If this object is a child of another object, this position value is local to the transform of the parent object (which is local to the transform of its parent, and so on).&lt;br /&gt;
&lt;br /&gt;
Otherwise, this position value is global.&lt;br /&gt;
&lt;br /&gt;
If this property is not specified, the value &amp;lt;code&amp;gt;[ 0.0, 0.0, 0.0 ]&amp;lt;/code&amp;gt; will be used as a fallback.&lt;br /&gt;
&lt;br /&gt;
==== 3.7. rotation ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: array&lt;br /&gt;
• &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;: &amp;lt;code&amp;gt;[ 0.0, 0.0, 0.0, 1.0 ]&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&#039;&#039;&#039;The rotation of the object within 3D space.&#039;&#039;&#039; Represented as a four-dimensional array of &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;s, representing a quaternion using Y-up right-handed coordinates.&lt;br /&gt;
&lt;br /&gt;
If this object is a child of another object, this rotation value is local to the transform of the parent object (which is local to the transform of its parent, and so on).&lt;br /&gt;
&lt;br /&gt;
Otherwise, this rotation value is global.&lt;br /&gt;
&lt;br /&gt;
If this property is not specified, the value &amp;lt;code&amp;gt;[ 0.0, 0.0, 0.0, 1.0 ]&amp;lt;/code&amp;gt; will be used as a fallback.&lt;br /&gt;
{{Notice|type=note|content=Rotation values &amp;lt;b&amp;gt;must&amp;lt;/b&amp;gt; be represented as a four-dimensional array representing a quaternion.&lt;br /&gt;
&lt;br /&gt;
It is not valid to represent rotation values using other methods, such as by using three-dimensional arrays representing euler angles or binary angle measurement (BAMS).&lt;br /&gt;
&lt;br /&gt;
When dealing with formats that utilize these (or other) methods, tooling must convert to/from quaternions as necessary.}}&lt;br /&gt;
&lt;br /&gt;
==== 3.8. scale ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: array&lt;br /&gt;
• &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;: &amp;lt;code&amp;gt;[ 1.0, 1.0, 1.0 ]&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&#039;&#039;&#039;The scale of the object within 3D space.&#039;&#039;&#039; Represented as a three-dimensional array of &amp;lt;code&amp;gt;number&amp;lt;/code&amp;gt;s, representing a vector3 using Y-up right-handed coordinates (X-right, Y-up, and Z-backwards), and meters as its units.&lt;br /&gt;
&lt;br /&gt;
If this object is a child of another object, this scale value is local to the transform of the parent object (which is local to the transform of its parent, and so on).&lt;br /&gt;
&lt;br /&gt;
Otherwise, this scale value is global.&lt;br /&gt;
&lt;br /&gt;
If this property is not specified, the value &amp;lt;code&amp;gt;[ 1.0, 1.0, 1.0 ]&amp;lt;/code&amp;gt; will be used as a fallback.&lt;br /&gt;
&lt;br /&gt;
==== 3.9. isEditorVisible ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: boolean&lt;br /&gt;
• &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;: &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&#039;&#039;&#039;Whether the object should be visible in the editor&#039;s 3D display&#039;&#039;&#039; (as applicable). Note that this is purely for editors, and has no effect on whether the object is visible in-game.&lt;br /&gt;
&lt;br /&gt;
When converting from HSON to game-specific file(s), tooling should ignore this value.&lt;br /&gt;
&lt;br /&gt;
If this property is not specified, the value &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; will be used as a fallback.&lt;br /&gt;
&lt;br /&gt;
==== 3.10. isExcluded ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: boolean&lt;br /&gt;
• &amp;lt;b&amp;gt;Default&amp;lt;/b&amp;gt;: &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&#039;&#039;&#039;Whether the object should be excluded from game data.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If specified as &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, editors should (as applicable) hide the object from 3D display, but still show it in the object hierarchy as a disabled object, and provide a mechanism for users to un-exclude it.&lt;br /&gt;
&lt;br /&gt;
When converting from HSON to a game format, tooling should treat excluded objects as if they do not exist, by simply not writing them to the resulting game-specific file(s).&lt;br /&gt;
&lt;br /&gt;
If this property is not specified, the value &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; will be used as a fallback.&lt;br /&gt;
&lt;br /&gt;
==== 3.11. parameters ====&lt;br /&gt;
{{Notice|type=info|content=• &amp;lt;b&amp;gt;Type&amp;lt;/b&amp;gt;: object}}&lt;br /&gt;
&#039;&#039;&#039;All named parameters specific to this object type and/or game.&#039;&#039;&#039; For example, the &amp;lt;code&amp;gt;firstSpeed&amp;lt;/code&amp;gt; parameter for objects of the &amp;lt;code&amp;gt;Spring&amp;lt;/code&amp;gt; type in Sonic Frontiers, which specifies the speed the object will launch the player off with.&lt;br /&gt;
&lt;br /&gt;
This is the place to put all parameters that are specific to objects of the specified &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;. It&#039;s also a great place to put game-specific parameters, such as object visibility ranges.&lt;br /&gt;
&lt;br /&gt;
Any number of properties of any JSON type are allowed here, all of which are always entirely optional.&lt;br /&gt;
&lt;br /&gt;
Tooling should treat this as an arbitrary list of key-value pairs, and provide some mechanism that allows the user to modify &#039;&#039;&#039;ALL&#039;&#039;&#039; of them as they please. It does not, however, have to provide a mechanism to add, remove, or edit the type of these parameters, as this may be undesirable depending on your use-case.&lt;br /&gt;
&lt;br /&gt;
Tooling should not require any of these parameters to be present. When converting, tooling should, instead, lookup each parameter by its name as needed, and either error-out or fallback to a default value if a required parameter is not present.&lt;br /&gt;
{{Notice|type=note|content=&amp;lt;b&amp;gt;Note that the following are not allowed to be used as parameter names:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• Empty strings.&lt;br /&gt;
• Strings which contain forward slashes.}}{{Notice|type=info|content=The &amp;quot;no forward slash&amp;quot; rule allows tooling to access parameters by &amp;quot;path&amp;quot;, like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;parameters&amp;quot;: {&lt;br /&gt;
  &amp;quot;tags&amp;quot;: {&lt;br /&gt;
    &amp;quot;RangeSpawning&amp;quot;: {&lt;br /&gt;
      &amp;quot;rangeIn&amp;quot;: 100.0,&lt;br /&gt;
      &amp;quot;rangeOut&amp;quot;: 20.0&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;&amp;quot;tags/RangeSpawning/rangeIn&amp;quot;: 100.0&amp;lt;/code&amp;gt;&lt;br /&gt;
• &amp;lt;code&amp;gt;&amp;quot;tags/RangeSpawning/rangeIn&amp;quot;: 20.0&amp;lt;/code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Custom Properties ==&lt;br /&gt;
In addition to all of the standard properties listed in the above specification, it is also completely valid to have your own custom properties which are not part of the specification, as demonstrated with the &amp;lt;code&amp;gt;myCustomEditor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;myCustomValue&amp;lt;/code&amp;gt; properties shown in [[HSON Format#Example|the example file]].&lt;br /&gt;
&lt;br /&gt;
If you use custom properties, it&#039;s highly recommended to place them in a property named after your tooling, as demonstrated with the &amp;lt;code&amp;gt;myCustomEditor&amp;lt;/code&amp;gt; properties in the example.&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
  &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
  &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Doing this helps to reduce potential name collisions with custom properties from other tools, which might end up sharing the same name(s).&lt;br /&gt;
&lt;br /&gt;
If your custom property is intended to be used across multiple tools (e.g. an unofficial &amp;quot;extension&amp;quot; to the HSON format), then it&#039;s recommended to ignore the above advice and just use the custom property directly instead, as demonstrated with the &amp;lt;code&amp;gt;myCustomValue&amp;lt;/code&amp;gt; property in the example.&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;myCustomValue&amp;quot;: 893.5,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;{{Notice|type=note|content=&amp;lt;b&amp;gt;Note that the following are not allowed to be used as custom property names:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• Names which directly collide with properties that are part of the HSON specification (e.g. you can have a custom property called &amp;quot;position&amp;quot;, but it has to be placed such that it does not collide with [[HSON Format#3.6. position|HSON&#039;s position property]]).&lt;br /&gt;
• Empty strings&lt;br /&gt;
• Strings which contain forward slashes.}}{{Notice|type=info|content=The &amp;quot;no forward slash&amp;quot; rule allows tooling to access custom properties by &amp;quot;path&amp;quot;, like so:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;myCustomEditor&amp;quot;: {&lt;br /&gt;
  &amp;quot;presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;,&lt;br /&gt;
  &amp;quot;presetPlacementDistance&amp;quot;: 1.0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
• &amp;lt;code&amp;gt;&amp;quot;myCustomEditor/presetPlacementType&amp;quot;: &amp;quot;LINE&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
• &amp;lt;code&amp;gt;&amp;quot;myCustomEditor/presetPlacementDistance&amp;quot;: 1.0&amp;lt;/code&amp;gt;}}&lt;br /&gt;
[[Category:File Formats]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=SonicColorsXTBConv&amp;diff=1506</id>
		<title>SonicColorsXTBConv</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=SonicColorsXTBConv&amp;diff=1506"/>
		<updated>2026-05-01T21:16:17Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=SonicColorsXTBConv|author=TheExentist151|website=https://github.com/TheExentist151/SonicColorsXTBConv|download=https://github.com/TheExentist151/SonicColorsXTBConv/releases/tag/2.1.0|image=}}&lt;br /&gt;
&#039;&#039;&#039;SonicColorsXTBConv&#039;&#039;&#039; is a tool to edit &amp;lt;code&amp;gt;.xtb&amp;lt;/code&amp;gt; files from &#039;&#039;&#039;Sonic Colors, Sonic Unleashed, Sonic Generations&#039;&#039;&#039; and &#039;&#039;&#039;Mario &amp;amp; Sonic at the London 2012 Olympic Games&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&amp;lt;code&amp;gt;SonicColorsXTBConv.exe &amp;lt;input file&amp;gt; &amp;lt;format version&amp;gt; (or you can just drag and drop a file)&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Converse&amp;diff=1505</id>
		<title>Converse</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Converse&amp;diff=1505"/>
		<updated>2026-05-01T21:16:07Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Converse|author=NextinHKRY, Hedgeturd, brianuuuSonic|website=https://github.com/NextinMono/converse|download=https://github.com/NextinMono/converse/releases/latest|image=Converse-Icon.png}}&lt;br /&gt;
&#039;&#039;&#039;Converse&#039;&#039;&#039; is a tool to edit .fco (Font Converse) files from &#039;&#039;&#039;Sonic Unleashed&#039;&#039;&#039; and &#039;&#039;&#039;Sonic Generations&#039;&#039;&#039;. For a guide on how to use the tool, check out [[How to use Converse|How to use Converse.]]&lt;br /&gt;
== File Support ==&lt;br /&gt;
The tool can open any &#039;&#039;&#039;fco&#039;&#039;&#039; and &#039;&#039;&#039;fte&#039;&#039;&#039; file from &#039;&#039;&#039;Sonic Unleashed&#039;&#039;&#039; and &#039;&#039;&#039;Sonic Generations&#039;&#039;&#039;, although some files from the &#039;&#039;&#039;Sonic Unleashed Preview Builds&#039;&#039;&#039; will not work, as they were older internal revisions of the fco and fte formats.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=NeedleTextureStreamingUtility&amp;diff=1504</id>
		<title>NeedleTextureStreamingUtility</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=NeedleTextureStreamingUtility&amp;diff=1504"/>
		<updated>2026-05-01T21:15:58Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=NeedleTextureStreamingUtility|author=Justin113D|website=https://github.com/Justin113D/NeedleTextureStreamingUtility}}&lt;br /&gt;
&lt;br /&gt;
A utility for viewing info, packing and unpacking of Needle texture streaming packages.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Hedgehog_Converter&amp;diff=1503</id>
		<title>Hedgehog Converter</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Hedgehog_Converter&amp;diff=1503"/>
		<updated>2026-05-01T21:15:47Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Notice|type=info|content=This page is incomplete.}}{{ToolInfobox|title=Hedgehog Converter|author=DarioSamo|website=https://github.com/DarioSamo/libgens-sonicglvl|image=|download=https://github.com/DarioSamo/libgens-sonicglvl/releases}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hedgehog Converter&#039;&#039;&#039; is a LibGens tool that allows you to import custom stages into Sonic Unleashed, Sonic Generations and Sonic Lost World.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Terrain2fbx-png&amp;diff=1502</id>
		<title>Terrain2fbx-png</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Terrain2fbx-png&amp;diff=1502"/>
		<updated>2026-05-01T21:15:36Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=terrain2fbx-png|author=Skyth|website=https://github.com/blueskythlikesclouds/SkythTools|download=https://github.com/blueskythlikesclouds/SkythTools/tree/master/Common}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;terrain2fbx-png&#039;&#039;&#039; is a SkythTools tool that can convert &amp;lt;code&amp;gt;.terrain-model&amp;lt;/code&amp;gt; files into FBX files. It is functionally identical to [[terrain2fbx]], but it searches for png files instead. To use it, you need to have a folder with the required files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;.terrain-model&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.terrain-instanceinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.material&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Terrain2fbx&amp;diff=1501</id>
		<title>Terrain2fbx</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Terrain2fbx&amp;diff=1501"/>
		<updated>2026-05-01T21:15:26Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=terrain2fbx|author=Skyth|website=https://github.com/blueskythlikesclouds/SkythTools|download=https://github.com/blueskythlikesclouds/SkythTools/tree/master/Common}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;terrain2fbx&#039;&#039;&#039; is a SkythTools tool that can convert &amp;lt;code&amp;gt;.terrain-model&amp;lt;/code&amp;gt; files into FBX files. To use it, you need to have a folder with the required files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;.terrain-model&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.terrain-instanceinfo&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.material&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;.dds&amp;lt;/code&amp;gt;&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Modelfbx&amp;diff=1500</id>
		<title>Modelfbx</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Modelfbx&amp;diff=1500"/>
		<updated>2026-05-01T21:15:17Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This page is incomplete.}}{{ToolInfobox|title=modelfbx|author=DarioSamo|website=https://github.com/DarioSamo/libgens-sonicglvl|image=|download=https://github.com/DarioSamo/libgens-sonicglvl/releases}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;modelfbx&#039;&#039;&#039; is a LibGens tool that converts .model / .terrain-model / .hkx files to FBX.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Model_Converter&amp;diff=1499</id>
		<title>Model Converter</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Model_Converter&amp;diff=1499"/>
		<updated>2026-05-01T21:15:07Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Model Converter|author=Skyth|website=https://github.com/blueskythlikesclouds/ModelConverter|download=https://github.com/blueskythlikesclouds/ModelConverter/releases}}&lt;br /&gt;
&lt;br /&gt;
Model Converter is a tool that converts 3D model formats like FBX to Hedgehog Engine .model files.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HedgeMatEdit&amp;diff=1498</id>
		<title>HedgeMatEdit</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HedgeMatEdit&amp;diff=1498"/>
		<updated>2026-05-01T21:14:57Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox&lt;br /&gt;
|title=HedgeMatEdit&lt;br /&gt;
|author=Justin113D&lt;br /&gt;
|website=https://github.com/hedge-dev/HedgeMatEdit&lt;br /&gt;
|download=https://github.com/hedge-dev/HedgeMatEdit/releases&lt;br /&gt;
|image=HedgeMatEdit.png&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;HedgeMatEdit&amp;lt;/b&amp;gt; is a tool to edit .material files for all Hedgehog Engine games.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Hedgehog_Engine_Blender_I/O&amp;diff=1497</id>
		<title>Hedgehog Engine Blender I/O</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Hedgehog_Engine_Blender_I/O&amp;diff=1497"/>
		<updated>2026-05-01T21:14:47Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Hedgehog Engine Blender I/O|author=Justin113D|website=https://hedge-dev.github.io/HedgehogEngineBlenderIO/index.html}}&lt;br /&gt;
&lt;br /&gt;
The Hedgehog Engine Blender I/O Addon, short “&#039;&#039;&#039;HEIO&#039;&#039;&#039;”, is an addon for Blender, adding the ability to import and export 3D related file formats used by Hedgehog Engine and Hedgehog Engine 2 games.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HE2_Shader_Compiler&amp;diff=1496</id>
		<title>HE2 Shader Compiler</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HE2_Shader_Compiler&amp;diff=1496"/>
		<updated>2026-05-01T21:14:33Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=HE2 Shader Compiler|author=Justin113D|website=https://github.com/hedge-dev/NeedleShaders}}&lt;br /&gt;
&lt;br /&gt;
The HE2 Shader compiler can compile HLSL code into Hedgehog Engine 2 shader object files (pso, vso, cso), as well as extract data and information from shader object files.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=SonicLightTools&amp;diff=1495</id>
		<title>SonicLightTools</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=SonicLightTools&amp;diff=1495"/>
		<updated>2026-05-01T21:14:22Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=SonicLightTools|author=SWS90|website=https://github.com/SWS90/SonicLightTools|download=https://github.com/SWS90/SonicLightTools/tree/master/bin}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SonicLightTools&#039;&#039;&#039; is a collection of tools to read, write and edit &amp;lt;code&amp;gt;.light&amp;lt;/code&amp;gt; files for Sonic Generations, Sonic Lost World and Sonic Forces.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HedgeBake&amp;diff=1494</id>
		<title>HedgeBake</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HedgeBake&amp;diff=1494"/>
		<updated>2026-05-01T21:14:12Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=HedgeBake|author=cosagets|website=https://github.com/cosagets/HedgeBake|download=https://github.com/cosagets/HedgeBake/releases/tag/v1.0.0}}&#039;&#039;&#039;HedgeBake&#039;&#039;&#039; is a Blender addon that allows you to bake global illumination data for Hedgehog Engine 1 games using the Cycles engine.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HedgeGI&amp;diff=1493</id>
		<title>HedgeGI</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HedgeGI&amp;diff=1493"/>
		<updated>2026-05-01T21:14:00Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=HedgeGI|author=Skyth|website=https://github.com/blueskythlikesclouds/HedgeGI|download=https://github.com/blueskythlikesclouds/HedgeGI/releases}}&#039;&#039;&#039;HedgeGI&#039;&#039;&#039; is a tool that allows you to bake global illumination and light-field data for Hedgehog Engine games.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=GI_Atlas_Converter&amp;diff=1492</id>
		<title>GI Atlas Converter</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=GI_Atlas_Converter&amp;diff=1492"/>
		<updated>2026-05-01T21:13:51Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Notice|type=info|content=This page is incomplete.}}{{ToolInfobox|title=GI Atlas Converter|author=DarioSamo|website=https://github.com/DarioSamo/libgens-sonicglvl|image=|download=https://github.com/DarioSamo/libgens-sonicglvl/releases}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;GI Atlas Converter&#039;&#039;&#039; is a LibGens tool that allows you to import custom global illumination textures into stages in Sonic Unleashed and Sonic Generations.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Meta_Instancer&amp;diff=1491</id>
		<title>Meta Instancer</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Meta_Instancer&amp;diff=1491"/>
		<updated>2026-05-01T21:13:40Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This Addon is not yet finished, as there are some issues with exporting rotations and the import function has not yet been implemented.}}&lt;br /&gt;
{{ToolInfobox|title=Meta Instancer|author=Hedgeturd|website=https://github.com/Hedgeturd/MetaInstancer-Blender/|image=|download=https://github.com/Hedgeturd/MetaInstancer-Blender/releases/latest}}&lt;br /&gt;
&#039;&#039;&#039;Meta Instancer&#039;&#039;&#039; is a Blender addon to modify meta-instancer files (.mti) from &#039;&#039;&#039;Hedgehog Engine 1&#039;&#039;&#039;, which are primarily used for grass in levels.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
=== Scene Setup ===&lt;br /&gt;
Make a surface which has a Particle System set on it, use the settings from this image.&lt;br /&gt;
[[File:MetaInstancersettings1.png|thumb|Scene Setup|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To have more randomized patches of grass, use these settings below.&lt;br /&gt;
&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=&amp;quot;360&amp;quot; heights=&amp;quot;240&amp;quot;&amp;gt;&lt;br /&gt;
File:Metainstancersetting-2.png|Take note here that &amp;quot;Hair Length&amp;quot; is 4 metres, only use this value for previewing!&lt;br /&gt;
File:Metainstancersettings3.png|alt=&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Painting ===&lt;br /&gt;
&lt;br /&gt;
If you want more control over the placement you can add weight paints to the Particle Settings, use the settings below; &amp;quot;Group&amp;quot; being the vertex group that will be used to paint the grass onto the surface. After you set this up, you can now begin painting.&amp;lt;gallery mode=&amp;quot;packed&amp;quot; widths=&amp;quot;360&amp;quot; heights=&amp;quot;200&amp;quot;&amp;gt;&lt;br /&gt;
File:Metainstancersettings4.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you&#039;re ready to export, make sure to go back to your Particle Emission Settings and reduce the Hair Length to 0, then go to &#039;&#039;&#039;File &amp;gt; Export &amp;gt; Meta Instancer (.mti)&#039;&#039;&#039; and finally name and export your MTI file.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=SonicGLvl&amp;diff=1490</id>
		<title>SonicGLvl</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=SonicGLvl&amp;diff=1490"/>
		<updated>2026-05-01T21:13:23Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This page is incomplete.}}{{ToolInfobox|title=SonicGLvl|author=DarioSamo|website=https://github.com/DarioSamo/libgens-sonicglvl|image=GLVL Logo.png|download=https://github.com/DarioSamo/libgens-sonicglvl/releases}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SonicGLvl&#039;&#039;&#039; is a LibGens tool for editing levels for &#039;&#039;[[Sonic Unleashed]]&#039;&#039; and &#039;&#039;[[Sonic Generations]]&#039;&#039;. Developed originally to assist in the development of the &#039;&#039;Unleashed Project&#039;&#039; mod, it has been a staple of level editing for &#039;&#039;Generations&#039;&#039; mods over the years.&lt;br /&gt;
&lt;br /&gt;
Its main purpose is to modify dynamic objects in a pre-existing level. To make your own level, use &#039;&#039;[[Hedgehog Converter]]&#039;&#039; to generate terrain, and &#039;&#039;[[Havok Converter]]&#039;&#039; for collision. &lt;br /&gt;
&lt;br /&gt;
For general information on how to use SonicGLvl, refer to [[How To Use Sonic GLvl with Sonic Generations|this guide]]. &lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
=== Overview ===&lt;br /&gt;
[[File:GLVL WindowExample.webp|alt=An example of Jungle Joyride Act 1 (Night) in SonicGLVL, showcasing several features of the editor including game-accurate shaders, object templates, and more.|left|thumb|272x272px|The SonicGLvl main window]]&lt;br /&gt;
SonicGLvl is designed to modify set object data from &#039;&#039;Unleashed&#039;&#039; and &#039;&#039;Generations&#039;&#039;. As such, it offers a full 3D viewport to navigate levels with 3D manipulators for changing position and rotation data. GLvl provides object palettes of different types of objects, such as common, stage-specific, and enemy objects, and helper objects such as &amp;quot;SonicSpawn&amp;quot; which can assist in iterating on level design. Each object has a collection of parameters that can be modified with live feedback depending on the type of object. How these parameters affect what is displayed in-editor can be configured by the user on a per-object basis, through modifying its &amp;quot;template,&amp;quot; which will be explained later. &lt;br /&gt;
&lt;br /&gt;
Levels in both games use &amp;quot;Layers&amp;quot; which categorize and organize objects of different types. In Generations, this is limited to a certain amount of layers that are always active (such as &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;effect&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sound&amp;lt;/code&amp;gt;, etc.), along with layers numbered &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;09&amp;lt;/code&amp;gt; which can be enabled and disabled through trigger objects. In &#039;&#039;Unleashed,&#039;&#039; users can define as many layers as they want in &amp;lt;code&amp;gt;Stage.stg.xml&amp;lt;/code&amp;gt;. These layers can be set as the &amp;quot;active layer&amp;quot; through the option on the bottom left of the window, titled &amp;quot;Current Object Set,&amp;quot; along with a visibility toggle--for particularly large levels, this can be quite useful for removing visual noise while editing.&lt;br /&gt;
[[File:GLVL MaterialEditor.webp|alt=A view of the material editor for SonicGLVL showing an animated Sonic with game-accurate shaders.|thumb|SonicGLvl&#039;s material editor]]&lt;br /&gt;
SonicGLvl also features a material editor, with a live preview window utilizing translated shaders from the original games to provide an accurate view of what the user&#039;s materials will look like in-game. This window also allows the user to import a skeletal mesh and preview any animation, useful when designing new designs for set objects and decorations.&lt;br /&gt;
&lt;br /&gt;
=== Object Templates ===&lt;br /&gt;
[[File:GLVL ObjectTemplate.webp|alt=An example of a SonicGLvl object template for the object &amp;quot;ChangeMode_3DtoForward&amp;quot; as seen in Sublime Text 3.  |left|thumb|An example of a SonicGLvl object template.]]&lt;br /&gt;
SonicGLvl uses &amp;quot;object templates&amp;quot; to define dynamic objects that can be placed in the game world. These are manually defined by the user based on the object definitions in a given &amp;lt;code&amp;gt;setdata&amp;lt;/code&amp;gt; XML file. Note that if SonicGLvl does not recognize an object present in a level&#039;s &amp;lt;code&amp;gt;setdata&amp;lt;/code&amp;gt; files, the program will generate a default template based on the available information. This template will be incomplete, however--it will assume default values based on what it&#039;s presented in the given file, will assume all values are floating point numbers when some may in fact be integer values, and it will not have a model reference or support extra features such as collision previews. These features must be added manually by the user after-the-fact in order to take full advantage of the template system.&lt;br /&gt;
&lt;br /&gt;
Most objects have had their templates created for them, though at time of writing some may have their parameters misattributed or incomplete. Beyond that, understanding the template format can be very useful for anyone creating their own set objects, something only possible through code injection. Currently, only custom objects in &#039;&#039;Sonic Generations&#039;&#039; are supported through use of &#039;&#039;[https://github.com/blueskythlikesclouds/BlueBlur BlueBlur API]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== In-game Parameters ====&lt;br /&gt;
There are two main types of parameters: In-game and &amp;quot;Extra.&amp;quot; In-game parameters are read by the game directly and are saved in their provided &amp;lt;code&amp;gt;setdata&amp;lt;/code&amp;gt; XML files. The structure of an in-game parameter can be observed below:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;PARAMETER_NAME type=&amp;quot;---&amp;quot; default=&amp;quot;---&amp;quot; description=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;PARAMETER_NAME&amp;lt;/code&amp;gt; refers to whatever the name of a parameter is in an object&#039;s definition in an XML file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt; can be filled in by the user to provide a tooltip when the mouse cursor is overlaying the parameter. This field can be left blank, though for unintuitively named parameters this can be very useful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; refers to the default value for this parameter whenever a new object is created from the object palette. This can vary depending on the parameter&#039;s type.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; defines what type the parameter variable is. A full list of available types is listed below:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;u&amp;gt;Type&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;u&amp;gt;Description&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;Can be either &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, case-sensitive&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;Any number &#039;&#039;not&#039;&#039; containing decimal places.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Often used for object &amp;quot;types,&amp;quot; i.e. size variants or different colors.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;Any number containing decimal places.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Most common parameter type.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;References a string of characters.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Somewhat uncommon; used by hint ring objects, object physics, &#039;&#039;Unleashed&#039;&#039; NPCs, and a few others.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A special type of integer referring to another object&#039;s &amp;lt;code&amp;gt;SetObjetID&amp;lt;/code&amp;gt; in the world&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Setting this to &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;integer&amp;lt;/code&amp;gt; allows SonicGLvl to select a target object from the 3D viewport.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;id_list&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A list of &amp;lt;code&amp;gt;SetObjectID&amp;lt;/code&amp;gt;s that can be arbitrarily extended.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Often used for objects that target multiple objects, such as &amp;lt;code&amp;gt;Switch&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;EventSetter&amp;lt;/code&amp;gt;.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;vector&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A &amp;lt;code&amp;gt;Position&amp;lt;/code&amp;gt; parameter containing X, Y, and Z &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt; components. Defines a point in 3D space.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Note that positions in &#039;&#039;Unleashed&#039;&#039; have an unused &amp;quot;W&amp;quot; component. This defaults to 1 and can be ignored.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;vector_list&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A list of &amp;lt;code&amp;gt;Position&amp;lt;/code&amp;gt; parameters that can be arbitrarily extended.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Often used for &amp;quot;waypoints&amp;quot; for certain enemy types, or anything else that requires multiple points in space.&amp;lt;/small&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For reference, this is what a basic object would look like in a &amp;lt;code&amp;gt;setdata&amp;lt;/code&amp;gt; XML:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MyObject&amp;gt;&lt;br /&gt;
    &amp;lt;MyParameter&amp;gt;0&amp;lt;/MyParameter&amp;gt;&lt;br /&gt;
    &amp;lt;Position&amp;gt;&lt;br /&gt;
        &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;
        &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;&lt;br /&gt;
        &amp;lt;z&amp;gt;0&amp;lt;/z&amp;gt;&lt;br /&gt;
    &amp;lt;/Position&amp;gt;&lt;br /&gt;
    &amp;lt;Rotation&amp;gt;&lt;br /&gt;
        &amp;lt;w&amp;gt;1&amp;lt;/w&amp;gt;&lt;br /&gt;
        &amp;lt;x&amp;gt;0&amp;lt;/x&amp;gt;&lt;br /&gt;
        &amp;lt;y&amp;gt;0&amp;lt;/y&amp;gt;&lt;br /&gt;
        &amp;lt;z&amp;gt;0&amp;lt;/z&amp;gt;&lt;br /&gt;
    &amp;lt;/Rotation&amp;gt;&lt;br /&gt;
    &amp;lt;SetObjectID&amp;gt;1234&amp;lt;/SetObjectID&amp;gt;&lt;br /&gt;
&amp;lt;/MyObject&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This custom object &amp;quot;MyObject&amp;quot; only has one custom parameter, that being &amp;lt;code&amp;gt;MyParameter&amp;lt;/code&amp;gt; with a value of 0. Defining this parameter in a template file would look like this:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;MyParameter type=&amp;quot;float&amp;quot; default=&amp;quot;0.0&amp;quot; description=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Note that some parameters, such as &amp;quot;Position,&amp;quot; &amp;quot;Rotation,&amp;quot; and &amp;quot;SetObjectID&amp;quot; are part of the default parameters for all objects in &#039;&#039;Unleashed&#039;&#039; and &#039;&#039;Generations&#039;&#039;, with &#039;&#039;Generations&#039;&#039; adding a &amp;quot;Range&amp;quot; value. Some objects could benefit from a higher range value, however, so adding one to your template with a desired default value is still recommended.&lt;br /&gt;
&lt;br /&gt;
==== Extra Parameters ====&lt;br /&gt;
&amp;quot;Extra&amp;quot; parameters are specific to SonicGLvl and are useful for better representing objects in the viewport. Their syntax differs from in-game parameters in a few important ways. Here&#039;s an example:&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;Extra type=&amp;quot;Type&amp;quot; name=&amp;quot;---&amp;quot; /&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; contains a string of characters that are specific to whatever type the Extra parameter is. This can change drastically, and unlike &amp;quot;description&amp;quot; for in-game parameters, this should &#039;&#039;not&#039;&#039; be left blank. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; defines how this parameter interacts with SonicGLvl&#039;s editor, often affecting the viewport.&lt;br /&gt;
&lt;br /&gt;
A full list of available types is listed below:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;u&amp;gt;Type&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;&amp;lt;u&amp;gt;Description&amp;lt;/u&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;model&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A string for a 3D model file from the game resources.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;An example would be &amp;lt;code&amp;gt;chr_Sonic_HD.model&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;skeleton&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A string for a &amp;lt;code&amp;gt;.skl.hkx&amp;lt;/code&amp;gt; file from the game resources. Required for animation playback.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;An example would be &amp;lt;code&amp;gt;chr_Sonic_HD.model&amp;lt;/code&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;animation&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A string for a havok animation (or &amp;lt;code&amp;gt;.anm.hkx&amp;lt;/code&amp;gt;) file from the game resources.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;An example would be &amp;lt;code&amp;gt;sn_idle00.anm.hkx&amp;lt;/code&amp;gt;. This animation will loop perpetually.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;Note that more than one &amp;quot;animation&amp;quot; parameters can be made to change the default animation.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;description&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;A string that describes the object.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;Will show up as a tooltip when hovering over the object in the object palette.&amp;lt;/small&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;scale_[*]&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;This property will set the scale of an object. Accepts either numerical values or a string.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;The [*] should be replaced with the desired axis to be scaled.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a number is provided in the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; field, it should be enclosed in quotation marks as if it were a string. Thus the syntax for a value of &amp;quot;3&amp;quot; in the X axis of this parameter should be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;scale_x&amp;quot; name=&amp;quot;3&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a string is provided, it should match the name of an in-game parameter exactly. For example, the object &amp;lt;code&amp;gt;SszUpDownPole&amp;lt;/code&amp;gt; uses the parameter &amp;lt;code&amp;gt;ModelLengthWidth&amp;lt;/code&amp;gt; to control the X scale of the model. This syntax would be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;scale_x&amp;quot; name=&amp;quot;ModelLengthWidth&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;offset_rotation_[*]&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;This property will set the rotation of an object. Accepts either numerical values or a string.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;The [*] should be replaced with the desired axis to rotate along in euler angles.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a number is provided in the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; field, it should be enclosed in quotation marks as if it were a string. Thus the syntax for a value of &amp;quot;180&amp;quot; in the Y axis of this parameter should be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;offset_rotation_y&amp;quot; name=&amp;quot;180&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a string is provided, it should match the name of an in-game parameter exactly. For example, if an object had a parameter labeled &amp;lt;code&amp;gt;Twist&amp;lt;/code&amp;gt; to control the Z rotation of the model, that syntax would be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;offset_rotation_z&amp;quot; name=&amp;quot;Twist&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&amp;lt;code&amp;gt;offset_rotation_[*]_speed&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
|&amp;lt;small&amp;gt;This property will set the rotation of an object &#039;&#039;&#039;&#039;&#039;over time&#039;&#039;&#039;&#039;&#039;. Accepts either numerical values or a string.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;The [*] should be replaced with the desired axis to rotate along in euler angles.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a number is provided in the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; field, it should be enclosed in quotation marks as if it were a string. Thus the syntax for a value of &amp;quot;120&amp;quot; units per second for the Y axis of this parameter should be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;offset_rotation_y_speed&amp;quot; name=&amp;quot;120&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a string is provided, it should match the name of an in-game parameter exactly. For example, if an object had a parameter labeled &amp;lt;code&amp;gt;TwistSpeed&amp;lt;/code&amp;gt; to control its Z rotation over time, that syntax would be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;offset_rotation_z_speed&amp;quot; name=&amp;quot;TwistSpeed&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;preview_box_[*]&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;small&amp;gt;This property will set the scale of a transparent box when selected. Useful for objects that have collision volumes, such as &amp;lt;code&amp;gt;ChangeVolumeCamera&amp;lt;/code&amp;gt;. Accepts either numerical values or a string.&amp;lt;/small&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;The [*] should be replaced with the desired axis to scale the preview box.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a number is provided in the &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; field, it should be enclosed in quotation marks as if it were a string. Thus the syntax for a value of &amp;quot;1&amp;quot; in the Z axis of this parameter should be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;scale_z&amp;quot; name=&amp;quot;1&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;If a string is provided, it should match the name of an in-game parameter exactly. For example, the object &amp;lt;code&amp;gt;ChangeVolumeCamera&amp;lt;/code&amp;gt; uses the parameter &amp;lt;code&amp;gt;Collision_Width&amp;lt;/code&amp;gt; to control the X scale of the collider. This syntax would be written as:&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;small&amp;gt;&amp;lt;Extra type=&amp;quot;preview_box_x&amp;quot; name=&amp;quot;Collision_Width&amp;quot; /&amp;gt;&amp;lt;/small&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Note that these extra parameters only exist to make visual feedback in SonicGLvl more intuitive. They will not affect what is saved into the game&#039;s &amp;lt;code&amp;gt;setdata&amp;lt;/code&amp;gt; files in any way.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Havok_Converter&amp;diff=1489</id>
		<title>Havok Converter</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Havok_Converter&amp;diff=1489"/>
		<updated>2026-05-01T21:13:10Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=info|content=This page is heavily incomplete.}}{{ToolInfobox|title=HavokConverter|author=DarioSamo|website=https://github.com/DarioSamo/libgens-sonicglvl|image=HavokConverter.png}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Havok Converter&#039;&#039;&#039; is a LibGens tool to convert FBX files into collision files (HKX) for stages.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=Ar0pack-ar0unpack&amp;diff=1488</id>
		<title>Ar0pack-ar0unpack</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=Ar0pack-ar0unpack&amp;diff=1488"/>
		<updated>2026-05-01T21:12:57Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This tool cannot extract Xbox compressed archives. For such archives, please use the latest version of [[HedgeArcPack]] instead.}}{{ToolInfobox|title=ar0pack|author=Skyth|website=https://github.com/blueskythlikesclouds/SkythTools|download=https://github.com/blueskythlikesclouds/SkythTools/blob/master/Sonic%20Generations/ar0pack.exe}}&lt;br /&gt;
{{ToolInfobox|title=ar0unpack|author=Skyth|website=https://github.com/blueskythlikesclouds/SkythTools|download=https://github.com/blueskythlikesclouds/SkythTools/blob/master/Sonic%20Generations/ar0unpack.exe}}&lt;br /&gt;
&#039;&#039;&#039;ar0pack&#039;&#039;&#039; and &#039;&#039;&#039;ar0unpack&#039;&#039;&#039; are SkythTools tools designed to pack and extract &amp;lt;code&amp;gt;.ar&amp;lt;/code&amp;gt; files from Sonic Unleashed and Sonic Generations. To use them, drag a file ending with &amp;lt;code&amp;gt;.ar&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.ar.00&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;.pfd&amp;lt;/code&amp;gt;. Please note however that ar0pack cannot repack .pfd files. For that, use [[pfdpack]] or [[pfdpackUnleashed]].&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HedgeArcPack&amp;diff=1487</id>
		<title>HedgeArcPack</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HedgeArcPack&amp;diff=1487"/>
		<updated>2026-05-01T21:12:43Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=HedgeArcPack|author=Radfordhound|website=https://github.com/Radfordhound/HedgeLib/tree/HedgeLib%2B%2B/HedgeTools/HedgeArcPack|download=https://github.com/Radfordhound/HedgeLib/releases|image=Hedgeliblogo2025.png}}HedgeArcPack is a command line tool that allows the extraction and creation of Hedgehog Engine package files (AR, PFD and PAC).&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=HedgeArchiveEditor&amp;diff=1486</id>
		<title>HedgeArchiveEditor</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=HedgeArchiveEditor&amp;diff=1486"/>
		<updated>2026-05-01T21:12:32Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=HedgeArchiveEditor|author=Radfordhound, PTKay|download=https://github.com/HedgeDocs/HedgeDocs.github.io/releases/download/CompiledTools/HedgeArchiveEditor.7z}}&lt;br /&gt;
&lt;br /&gt;
HedgeArchiveEditor is a user interface for [[HedgeArcPack]].&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=YACpkTool&amp;diff=1485</id>
		<title>YACpkTool</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=YACpkTool&amp;diff=1485"/>
		<updated>2026-05-01T21:12:18Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToolInfobox|title=Yet Another CPK Tool|author=Brolijah|website=https://github.com/Brolijah/YACpkTool|download=https://github.com/Brolijah/YACpkTool/releases/tag/v1.1b}}&lt;br /&gt;
&#039;&#039;&#039;YACpkTool&#039;&#039;&#039; (Yet Another Cpk Tool) is a tool to extract and pack CRIWARE .cpk files. To use it, you can drag a folder into the program to pack it, or drag a .cpk file into it to extract it.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
	<entry>
		<id>https://hedgedocs.com/index.php?title=PackCpk&amp;diff=1484</id>
		<title>PackCpk</title>
		<link rel="alternate" type="text/html" href="https://hedgedocs.com/index.php?title=PackCpk&amp;diff=1484"/>
		<updated>2026-05-01T21:12:04Z</updated>

		<summary type="html">&lt;p&gt;Hyper: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Notice|type=warn|content=This page is unfinished.}}{{ToolInfobox|title=PackCpk|author=Skyth|website=https://github.com/blueskythlikesclouds/SkythTools|download=https://github.com/blueskythlikesclouds/SkythTools/tree/master/Common}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PackCpk&#039;&#039;&#039; is a SkythTools tool designed to extract and pack CPK files.&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>Hyper</name></author>
	</entry>
</feed>