<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sadocs.unreliable.network/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ItsEasyActually</id>
	<title>SA Docs - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sadocs.unreliable.network/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=ItsEasyActually"/>
	<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/wiki/Special:Contributions/ItsEasyActually"/>
	<updated>2026-06-16T20:28:10Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=344</id>
		<title>SADX Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=344"/>
		<updated>2025-10-08T18:04:51Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sadx-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sadx-mod-loader/blob/master/SADXModLoader/include/SADXModInfo.h SADXModInfo.h]&lt;br /&gt;
{{DocHeader|header=HelperFunctions|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions =&lt;br /&gt;
{&lt;br /&gt;
	ModLoaderVer,&lt;br /&gt;
	&amp;amp;RegisterStartPosition,&lt;br /&gt;
	&amp;amp;ClearStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterFieldStartPosition,&lt;br /&gt;
	&amp;amp;ClearFieldStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterPathList,&lt;br /&gt;
	&amp;amp;ClearPathListList,&lt;br /&gt;
	&amp;amp;RegisterCharacterPVM,&lt;br /&gt;
	&amp;amp;ClearCharacterPVMList,&lt;br /&gt;
	&amp;amp;RegisterCommonObjectPVM,&lt;br /&gt;
	&amp;amp;ClearCommonObjectPVMList,&lt;br /&gt;
	&amp;amp;RegisterTrialLevel,&lt;br /&gt;
	&amp;amp;ClearTrialLevelList,&lt;br /&gt;
	&amp;amp;RegisterTrialSubgame,&lt;br /&gt;
	&amp;amp;ClearTrialSubgameList,&lt;br /&gt;
	&amp;amp;GetMainSavePath,&lt;br /&gt;
	&amp;amp;GetChaoSavePath,&lt;br /&gt;
	&amp;amp;GetReplaceablePath,&lt;br /&gt;
	&amp;amp;_ReplaceFile,&lt;br /&gt;
	&amp;amp;SetWindowTitle,&lt;br /&gt;
	&amp;amp;RegisterSoundList,&lt;br /&gt;
	&amp;amp;RegisterMusicFile,&lt;br /&gt;
	&amp;amp;LoadEXEData,&lt;br /&gt;
	&amp;amp;LoadDLLData,&lt;br /&gt;
	&amp;amp;_ReplaceFileForce,&lt;br /&gt;
	&amp;amp;PushScaleUI,&lt;br /&gt;
	&amp;amp;PopScaleUI,&lt;br /&gt;
	&amp;amp;SetScaleFillMode,&lt;br /&gt;
	&amp;amp;GetScaleFillMode,&lt;br /&gt;
	&amp;amp;ReplaceTexture,&lt;br /&gt;
	&amp;amp;MipmapBlacklistGBIX,&lt;br /&gt;
	&amp;amp;RegisterEnglishVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterJapaneseVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterCharacterWelds,&lt;br /&gt;
	&amp;amp;loaderSettings,&lt;br /&gt;
	&amp;amp;modList,&lt;br /&gt;
	&amp;amp;weightFuncs,&lt;br /&gt;
	&amp;amp;RegisterVoice,&lt;br /&gt;
	&amp;amp;PushInterpolationFix,&lt;br /&gt;
	&amp;amp;PopInterpolationFix,&lt;br /&gt;
	&amp;amp;RegisterPermanentTexlist,&lt;br /&gt;
	&amp;amp;ExpandPVMList,&lt;br /&gt;
	&amp;amp;UnreplaceFile,&lt;br /&gt;
	&amp;amp;PrintDebugUnicode,&lt;br /&gt;
	&amp;amp;PrintDebugLocal,&lt;br /&gt;
	&amp;amp;PrintDebugCodepage,&lt;br /&gt;
	&amp;amp;GetFileModIndex,&lt;br /&gt;
	&amp;amp;ReplaceFileAtIndex&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Please be aware that all examples on this page will be using &amp;lt;code&amp;gt;helperFunctions&amp;lt;/code&amp;gt; which is how the variable is sent to a mod.|type=info}}&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (helperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
    PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Weight Functions ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
BasicWeightFuncs weightFuncs;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a new Start Position for the specified character.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID &lt;br /&gt;
    0,                          // Act ID&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Position&lt;br /&gt;
    0                           // Y Rotation&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
helperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Running this inside of your mod&#039;s Init export would&lt;br /&gt;
// clear all of Sonic&#039;s Start Positions for his stages.&lt;br /&gt;
helperFunctions.ClearStartPositionList(Characters_Sonic);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Field Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterFieldStartPosition(unsigned char character, const FieldStartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Field Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearFieldStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Path List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterPathList(const PathDataPtr&amp;amp; paths)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Path List List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearPathListList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Character PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCharacterPVM(unsigned char character, const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Character PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCharacterPVMList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Common Object PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCommonObjectPVM(const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Common Object PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCommonObjectPVMList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Level ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialLevel(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Level List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialLevelList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Subgame ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialSubgame(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Subgame List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialSubgameList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const char* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Sound List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterSoundList(const SoundList&amp;amp; list)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Music File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterMusicFile(const MusicInfo&amp;amp; track)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Load EXE Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadEXEData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Load DLL Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadDLLData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File Force ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFileForce(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushScaleUI(uiscale::Align align, bool is_background, float ratio_h, float ratio_v)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopScaleUI()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetScaleFillMode(uiscale::FillMode mode)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uiscale::FillMode GetScaleFillMode()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mipmap Blacklist GBIX ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void MipmapBlacklistGBIX(Uint32 index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register English Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEnglishVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Japanese Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterJapaneseVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Character Welds ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterCharacterWelds(const uint8_t character, const char* iniPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN, uint16_t durationJP, uint16_t durationEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Permanent Texlist ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterPermanentTexlist(NJS_TEXLIST* texlist)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Expand PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TEX_PVMTABLE* ExpandPVMList(TEX_PVMTABLE* sourcepvmlist, const TEX_PVMTABLE &amp;amp;newpvmentry)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Unicode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugUnicode(char* utf8)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Local ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugLocal(char* buf)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Codepage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugCodepage(char* buf, unsigned int source_cp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Write example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=343</id>
		<title>Mod Loaders</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=343"/>
		<updated>2025-10-08T17:59:10Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.&lt;br /&gt;
&lt;br /&gt;
Below you&#039;ll find links to documentation pertaining to each mod loader respectively. These include in-depth looks at each one&#039;s specific APIs.&lt;br /&gt;
&lt;br /&gt;
* [[SADX Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
* [[SA2B Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
= Mod Loader Export References =&lt;br /&gt;
&lt;br /&gt;
Below is an overview of the general exports that are available in the mod loaders. An [[Mod_Loaders#Example|example]] of a complete export can be seen below.&lt;br /&gt;
== Variable Exports ==&lt;br /&gt;
&lt;br /&gt;
=== ModInfo ===&lt;br /&gt;
ModInfo is a required export from any code based mod. Without it, the mod loader will not load the mod and will throw an error alerting the user that a mod is not a valid mod.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Example of exporting the ModInfo for SADX.&lt;br /&gt;
__declspec(dllexport) ModInfo SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
// Example of exporting the ModInfo for SA2B.&lt;br /&gt;
__declspec(dllexport) ModInfo SA2ModInfo = { ModLoaderVer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Function Exports ==&lt;br /&gt;
The mod loaders support loading various function exports from a mod. While these are all optional, many mods make use of at least one of these exports as their entry point. This is most commonly the [[Mod_Loaders#Init|Init]] export.&lt;br /&gt;
&lt;br /&gt;
Inside these exported functions you can put your own C++ code to manipulate data, replace assets or interface with the game.&lt;br /&gt;
&lt;br /&gt;
=== Init ===&lt;br /&gt;
The Init (short for Initialize) export is used for initializing information within your mod and passing some variables from the mod loader into the mod itself. The include the mod&#039;s path (local path to the mod folder from the game&#039;s root), HelperFunctions (see each respective page for each mod loader for more information on this struct), and the mod&#039;s index in the list.&lt;br /&gt;
&lt;br /&gt;
This is fired for all enabled mods first. It&#039;s fired in the order in which mods are loaded (top to bottom).&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void Init(const char* path, HelperFunctions&amp;amp; helperFunctions, const unsigned int index)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnInitEnd ===&lt;br /&gt;
This is run after all mods have finished running their Init, but before the game has completely loaded. This is useful for any mods making APIs for other mods to utilize. &lt;br /&gt;
{{Note|text=This is only available in the SADX Mod Loader at this time.|type=info}}&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInitEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnFrame ===&lt;br /&gt;
This export will run every frame. This can be useful if you need to check something within the game constantly. Users who utilize this should consider cautionary measures to prevent running large amounts of logic every frame if it can be avoided for performance reasons.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnFrame()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnInput ===&lt;br /&gt;
This export will run when the game processes input. More specifically, it will run just prior to the game actually processing that input.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInput()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnControl ===&lt;br /&gt;
This export will run while the game is actively processing input.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnControl()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneStart ===&lt;br /&gt;
This export will run just before a game scene is rendered.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneStart()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneEnd ===&lt;br /&gt;
This export will run just after a game scene has finished rendering.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceReset ===&lt;br /&gt;
This export will run whenever the render device for the game is reset. For example, resizing the game window will cause the render device to be reset.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceReset()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceLost ===&lt;br /&gt;
This export will run whenever a game scene fails to render.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceLost()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnExit ===&lt;br /&gt;
This export runs just prior to the game completely closing.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnExit()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Useful Functions and Macros ==&lt;br /&gt;
Inside any of the exported functions above, apart from your own custom C or C++ code, you can use the following functions and macros to replace game code and data in memory.&lt;br /&gt;
&lt;br /&gt;
=== WriteData ===&lt;br /&gt;
WriteData writes the specified data at the specified memory address. You can use it to make small code patches, overwrite values, replace pointers etc.&lt;br /&gt;
&lt;br /&gt;
Useful hacks:&lt;br /&gt;
&lt;br /&gt;
* Write &amp;lt;code&amp;gt;0xC3&amp;lt;/code&amp;gt; to kill a function by writing a &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; instruction.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;0x90&amp;lt;/code&amp;gt; five times to kill a function call by writing five &amp;lt;code&amp;gt;nop&amp;lt;/code&amp;gt; instructions.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
WriteData&amp;lt;1&amp;gt;((Uint8*)0x005ADC40, 0xC3); // Writes 0xC3 (one byte) to the address 0x005ADC40, effectively disabling the function located at that address.&lt;br /&gt;
WriteData&amp;lt;5&amp;gt;((Uint8*)0x0062EC3C, 0x90); // Writes 0x90 (five bytes) to the address 0x0062EC3C, effectively disabling the function call located at that address.&lt;br /&gt;
WriteData((Float*)0x00652F74, 800.0f); // Writes the floating point value of 800.0 to the address 0x00652F74.&lt;br /&gt;
WriteData((Float**)0x004D73FB, &amp;amp;MyFloat); // Replaces the pointer located at 0x004D73FB with the pointer to MyFloat.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== WriteJump ===&lt;br /&gt;
WriteJump writes a &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; instruction at the specified memory address. You can use this to replace entire functions in the game with your own code.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
WriteJump((void*)0x005BBFE0, MyFunction); // Replaces the function at 0x005BBFE0 with a jump to MyFunction.&lt;br /&gt;
&lt;br /&gt;
WriteJump(Function1, MyFunction); // Replaces the function Function1 (if defined with a FunctionPointer) with a jump to MyFunction.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== WriteCall ===&lt;br /&gt;
WriteCall writes a &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt; instruction at the specified memory address. You can use this to call your own code from the game&#039;s functions without replacing them entirely.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
WriteCall((void*)0x005AEF29, MyFunction); // Replaces the function call at 0x005AEF29 with a call to MyFunction.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Exportable Lists == &lt;br /&gt;
The mod loaders also have support for exporting different types of lists. These are all optional exports.&lt;br /&gt;
&lt;br /&gt;
=== Patch List ===&lt;br /&gt;
A PatchList is comprised of an array of PatchInfo entries. The mod loader will generate these using WriteData.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Jumps, Calls, and Pointer Lists ===&lt;br /&gt;
These three exportable lists are all comprised of an array of PointerInfo entries. On the mod loader&#039;s side, these arrays are handled like so:&lt;br /&gt;
* Jumps are generated using WriteJump.&lt;br /&gt;
* Calls are generated using WriteCall.&lt;br /&gt;
* Pointers are generated using WriteData.&lt;br /&gt;
{{DocHeader|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert examples.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Example = &lt;br /&gt;
{{DocHeader|header=Example Export Table|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line copy&amp;gt;&lt;br /&gt;
// Inside of your mod&#039;s &amp;quot;main&amp;quot; cpp file (or whichever one houses your exports).&lt;br /&gt;
#include &amp;quot;pch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelperFunctions globalHelperFunctions;&lt;br /&gt;
const char* globalPath;&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    __declspec(dllexport) SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    __declspec(dllexport) Init(const char* path, HelperFunctions &amp;amp;helperFunctions, const unsigned int index)&lt;br /&gt;
    {&lt;br /&gt;
        // This passes the Mod Loader&#039;s HelperFunctions struct to your mod&#039;s.&lt;br /&gt;
        // This is necessary so the API related functions can work properly.&lt;br /&gt;
        globalHelperFunctions = helperFunctions;&lt;br /&gt;
&lt;br /&gt;
        // This passes the mod&#039;s local folder path to the mod itself.&lt;br /&gt;
        // This is helpful for loading custom files.&lt;br /&gt;
        globalPath = path;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Documentation&amp;diff=342</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Documentation&amp;diff=342"/>
		<updated>2025-10-08T17:57:28Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:OOjs_UI_icon_code-invert.svg|30px]] &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;border: 1px outset #72777D; padding: 15px; margin: -16px 0px 0px 0px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Template Usage|content=&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;{{Documenation|header=my cool header|content=that&#039;s some good content}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Render As:&lt;br /&gt;
{{Documentation|header=my cool header|content=that&#039;s some good content}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Content can also be filled in as normal by doing the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;{{Documentation|header=Example Code|content=&lt;br /&gt;
This is one sentence.&lt;br /&gt;
&lt;br /&gt;
This is another sentence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is also showing that other formatting methods are available.&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    void MyCoolExportFunction()&lt;br /&gt;
    {&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which this will render as the following:&lt;br /&gt;
{{Documentation|header=Example Code|content=&lt;br /&gt;
This is one sentence.&lt;br /&gt;
&lt;br /&gt;
This is another sentence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is also showing that other formatting methods are available.&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    void MyCoolExportFunction()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:DocHeader&amp;diff=341</id>
		<title>Template:DocHeader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:DocHeader&amp;diff=341"/>
		<updated>2025-10-08T17:57:04Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:OOjs_UI_icon_code-invert.svg|30px]] &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin: -16px 0px 0px 0px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Template Usage|content=&lt;br /&gt;
This template is for displaying what is essentially a copy of the [[Template:Documentation]] header without having the corresponding box where the content is filled display as well. This allows for more customization if desired and is recommended for any purely code examples.&lt;br /&gt;
&lt;br /&gt;
Usage (Header only)&lt;br /&gt;
&amp;lt;pre&amp;gt;{{DocHeader|header=Template Example|content=&lt;br /&gt;
my cool text&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renders As:&lt;br /&gt;
{{DocHeader|header=Template Example|content=&lt;br /&gt;
my cool text&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Usage (Code example):&lt;br /&gt;
&amp;lt;pre&amp;gt;{{DocHeader|header=Template Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renders As:&lt;br /&gt;
{{DocHeader|header=Template Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
extern &amp;quot;C&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;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=340</id>
		<title>SA2B Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=340"/>
		<updated>2025-10-08T17:52:30Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sa2-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sa2-mod-loader/blob/master/SA2ModLoader/include/SA2ModInfo.h SA2ModInfo.h]&lt;br /&gt;
{{DocHeader|header=HelperFunctions|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions = &lt;br /&gt;
{&lt;br /&gt;
    ModLoaderVer,&lt;br /&gt;
    RegisterStartPosition,&lt;br /&gt;
    ClearStartPositionList,&lt;br /&gt;
    Register2PIntroPosition,&lt;br /&gt;
    Clear2PIntroPositionList,&lt;br /&gt;
    GetMainSavePath,&lt;br /&gt;
    GetChaoSavePath,&lt;br /&gt;
    RegisterEndPosition,&lt;br /&gt;
    ClearEndPositionList,&lt;br /&gt;
    RegisterMission23EndPosition,&lt;br /&gt;
    ClearMission23EndPositionList,&lt;br /&gt;
    HookExport,&lt;br /&gt;
    GetReplaceablePath,&lt;br /&gt;
    _ReplaceFile,&lt;br /&gt;
    SetWindowTitle,&lt;br /&gt;
    debug_text::SetFontSize,&lt;br /&gt;
    debug_text::SetFontColor,&lt;br /&gt;
    debug_text::DisplayString,&lt;br /&gt;
    debug_text::DisplayStringFormatted,&lt;br /&gt;
    debug_text::DisplayNumber,&lt;br /&gt;
    &amp;amp;loaderSettings,&lt;br /&gt;
    &amp;amp;modList,&lt;br /&gt;
    &amp;amp;RegisterVoice,&lt;br /&gt;
    &amp;amp;ReplaceTexture,&lt;br /&gt;
    &amp;amp;UnreplaceFile,&lt;br /&gt;
    &amp;amp;PushInterpolationFix,&lt;br /&gt;
    &amp;amp;PopInterpolationFix,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Please be aware that all examples on this page will be using &amp;lt;code&amp;gt;helperFunctions&amp;lt;/code&amp;gt; which is how the variable is sent to a mod.|type=info}}&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (helperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
    PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Start Position for the specified character.&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is a declaration of an SA2 StartPosition struct.&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID&lt;br /&gt;
    0x4000,                     // Single Player Y Rotation &lt;br /&gt;
    0x4000,                     // Multiplayer, Player 1 Y Rotation&lt;br /&gt;
    0x4000,                     // Multiplayer, Player 2 Y Rotation&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Single Player Start Position&lt;br /&gt;
    { 90.0f, 200.0f, 100.0f },  // Multiplayer, Player 1 Start Position&lt;br /&gt;
    { 110.0f, 200.0f, 100.0f }  // Multiplayer, Player 2 Start Position&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
helperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register 2P Intro Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Register2PIntroPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Multiplayer Intro Position for the specified character. &lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear 2P Intro Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Clear2PIntroPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears all Multiplayer Intro Positions for the specified character.&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the game&#039;s Main Save File&#039;s path.&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEndPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearEndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Mission 2/3 End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterMission23EndPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Mission 2/3 End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearMission23EndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Hook Export ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void HookExport(LPCSTR exportName, const void* newdata)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const wchar_t* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Size ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontSize(float size)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Color ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontColor(int color)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayString(int loc, const char* str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String Formatted ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayStringFormatted(int loc, const char* Format, ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display Number ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayNumber(int loc, int value, int numdigits)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{DocHeader|header=Example Usage|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Add proper example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:DocHeader&amp;diff=339</id>
		<title>Template:DocHeader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:DocHeader&amp;diff=339"/>
		<updated>2025-10-08T17:47:51Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Created page with &amp;quot;&amp;lt;onlyinclude&amp;gt; &amp;lt;div&amp;gt;   &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;     30px &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;   &amp;lt;/p&amp;gt;   &amp;lt;div style=&amp;quot;margin: -16px 0px;&amp;quot;&amp;gt;     &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;   &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/onlyinclude&amp;gt;  {{Documentation|header=Template Usage|content= This template is for displaying what is essentially a copy of the Template:Documentation header without ha...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:OOjs_UI_icon_code-invert.svg|30px]] &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin: -16px 0px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Template Usage|content=&lt;br /&gt;
This template is for displaying what is essentially a copy of the [[Template:Documentation]] header without having the corresponding box where the content is filled display as well. This allows for more customization if desired and is recommended for any purely code examples.&lt;br /&gt;
&lt;br /&gt;
Usage (Header only)&lt;br /&gt;
&amp;lt;pre&amp;gt;{{DocHeader|header=Template Example|content=&lt;br /&gt;
my cool text&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renders As:&lt;br /&gt;
{{DocHeader|header=Template Example|content=&lt;br /&gt;
my cool text&lt;br /&gt;
&amp;lt;/br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
Usage (Code example):&lt;br /&gt;
&amp;lt;pre&amp;gt;{{DocHeader|header=Template Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Renders As:&lt;br /&gt;
{{DocHeader|header=Template Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
extern &amp;quot;C&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;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=338</id>
		<title>SA2B Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=338"/>
		<updated>2025-10-08T15:15:12Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sa2-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sa2-mod-loader/blob/master/SA2ModLoader/include/SA2ModInfo.h SA2ModInfo.h]&lt;br /&gt;
{{Documentation|header=HelperFunctions|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions = &lt;br /&gt;
{&lt;br /&gt;
    ModLoaderVer,&lt;br /&gt;
    RegisterStartPosition,&lt;br /&gt;
    ClearStartPositionList,&lt;br /&gt;
    Register2PIntroPosition,&lt;br /&gt;
    Clear2PIntroPositionList,&lt;br /&gt;
    GetMainSavePath,&lt;br /&gt;
    GetChaoSavePath,&lt;br /&gt;
    RegisterEndPosition,&lt;br /&gt;
    ClearEndPositionList,&lt;br /&gt;
    RegisterMission23EndPosition,&lt;br /&gt;
    ClearMission23EndPositionList,&lt;br /&gt;
    HookExport,&lt;br /&gt;
    GetReplaceablePath,&lt;br /&gt;
    _ReplaceFile,&lt;br /&gt;
    SetWindowTitle,&lt;br /&gt;
    debug_text::SetFontSize,&lt;br /&gt;
    debug_text::SetFontColor,&lt;br /&gt;
    debug_text::DisplayString,&lt;br /&gt;
    debug_text::DisplayStringFormatted,&lt;br /&gt;
    debug_text::DisplayNumber,&lt;br /&gt;
    &amp;amp;loaderSettings,&lt;br /&gt;
    &amp;amp;modList,&lt;br /&gt;
    &amp;amp;RegisterVoice,&lt;br /&gt;
    &amp;amp;ReplaceTexture,&lt;br /&gt;
    &amp;amp;UnreplaceFile,&lt;br /&gt;
    &amp;amp;PushInterpolationFix,&lt;br /&gt;
    &amp;amp;PopInterpolationFix,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Please be aware that all examples on this page will be using &amp;lt;code&amp;gt;helperFunctions&amp;lt;/code&amp;gt; which is how the variable is sent to a mod.|type=info}}&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (helperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
    PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Start Position for the specified character.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is a declaration of an SA2 StartPosition struct.&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID&lt;br /&gt;
    0x4000,                     // Single Player Y Rotation &lt;br /&gt;
    0x4000,                     // Multiplayer, Player 1 Y Rotation&lt;br /&gt;
    0x4000,                     // Multiplayer, Player 2 Y Rotation&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Single Player Start Position&lt;br /&gt;
    { 90.0f, 200.0f, 100.0f },  // Multiplayer, Player 1 Start Position&lt;br /&gt;
    { 110.0f, 200.0f, 100.0f }  // Multiplayer, Player 2 Start Position&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
helperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register 2P Intro Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Register2PIntroPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Multiplayer Intro Position for the specified character. &lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear 2P Intro Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Clear2PIntroPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears all Multiplayer Intro Positions for the specified character.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the game&#039;s Main Save File&#039;s path.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEndPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearEndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Mission 2/3 End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterMission23EndPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Mission 2/3 End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearMission23EndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Hook Export ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void HookExport(LPCSTR exportName, const void* newdata)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const wchar_t* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Size ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontSize(float size)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Color ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontColor(int color)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayString(int loc, const char* str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String Formatted ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayStringFormatted(int loc, const char* Format, ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display Number ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayNumber(int loc, int value, int numdigits)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=337</id>
		<title>SADX Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=337"/>
		<updated>2025-10-08T14:19:23Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sadx-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sadx-mod-loader/blob/master/SADXModLoader/include/SADXModInfo.h SADXModInfo.h]&lt;br /&gt;
{{Documentation|header=HelperFunctions|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions =&lt;br /&gt;
{&lt;br /&gt;
	ModLoaderVer,&lt;br /&gt;
	&amp;amp;RegisterStartPosition,&lt;br /&gt;
	&amp;amp;ClearStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterFieldStartPosition,&lt;br /&gt;
	&amp;amp;ClearFieldStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterPathList,&lt;br /&gt;
	&amp;amp;ClearPathListList,&lt;br /&gt;
	&amp;amp;RegisterCharacterPVM,&lt;br /&gt;
	&amp;amp;ClearCharacterPVMList,&lt;br /&gt;
	&amp;amp;RegisterCommonObjectPVM,&lt;br /&gt;
	&amp;amp;ClearCommonObjectPVMList,&lt;br /&gt;
	&amp;amp;RegisterTrialLevel,&lt;br /&gt;
	&amp;amp;ClearTrialLevelList,&lt;br /&gt;
	&amp;amp;RegisterTrialSubgame,&lt;br /&gt;
	&amp;amp;ClearTrialSubgameList,&lt;br /&gt;
	&amp;amp;GetMainSavePath,&lt;br /&gt;
	&amp;amp;GetChaoSavePath,&lt;br /&gt;
	&amp;amp;GetReplaceablePath,&lt;br /&gt;
	&amp;amp;_ReplaceFile,&lt;br /&gt;
	&amp;amp;SetWindowTitle,&lt;br /&gt;
	&amp;amp;RegisterSoundList,&lt;br /&gt;
	&amp;amp;RegisterMusicFile,&lt;br /&gt;
	&amp;amp;LoadEXEData,&lt;br /&gt;
	&amp;amp;LoadDLLData,&lt;br /&gt;
	&amp;amp;_ReplaceFileForce,&lt;br /&gt;
	&amp;amp;PushScaleUI,&lt;br /&gt;
	&amp;amp;PopScaleUI,&lt;br /&gt;
	&amp;amp;SetScaleFillMode,&lt;br /&gt;
	&amp;amp;GetScaleFillMode,&lt;br /&gt;
	&amp;amp;ReplaceTexture,&lt;br /&gt;
	&amp;amp;MipmapBlacklistGBIX,&lt;br /&gt;
	&amp;amp;RegisterEnglishVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterJapaneseVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterCharacterWelds,&lt;br /&gt;
	&amp;amp;loaderSettings,&lt;br /&gt;
	&amp;amp;modList,&lt;br /&gt;
	&amp;amp;weightFuncs,&lt;br /&gt;
	&amp;amp;RegisterVoice,&lt;br /&gt;
	&amp;amp;PushInterpolationFix,&lt;br /&gt;
	&amp;amp;PopInterpolationFix,&lt;br /&gt;
	&amp;amp;RegisterPermanentTexlist,&lt;br /&gt;
	&amp;amp;ExpandPVMList,&lt;br /&gt;
	&amp;amp;UnreplaceFile,&lt;br /&gt;
	&amp;amp;PrintDebugUnicode,&lt;br /&gt;
	&amp;amp;PrintDebugLocal,&lt;br /&gt;
	&amp;amp;PrintDebugCodepage,&lt;br /&gt;
	&amp;amp;GetFileModIndex,&lt;br /&gt;
	&amp;amp;ReplaceFileAtIndex&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Note|text=Please be aware that all examples on this page will be using &amp;lt;code&amp;gt;helperFunctions&amp;lt;/code&amp;gt; which is how the variable is sent to a mod.|type=info}}&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (helperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
    PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Weight Functions ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
BasicWeightFuncs weightFuncs;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a new Start Position for the specified character.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID &lt;br /&gt;
    0,                          // Act ID&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Position&lt;br /&gt;
    0                           // Y Rotation&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
helperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Running this inside of your mod&#039;s Init export would&lt;br /&gt;
// clear all of Sonic&#039;s Start Positions for his stages.&lt;br /&gt;
helperFunctions.ClearStartPositionList(Characters_Sonic);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Field Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterFieldStartPosition(unsigned char character, const FieldStartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Field Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearFieldStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Path List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterPathList(const PathDataPtr&amp;amp; paths)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Path List List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearPathListList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Character PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCharacterPVM(unsigned char character, const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Character PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCharacterPVMList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Common Object PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCommonObjectPVM(const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Common Object PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCommonObjectPVMList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Level ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialLevel(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Level List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialLevelList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Subgame ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialSubgame(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Subgame List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialSubgameList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const char* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Sound List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterSoundList(const SoundList&amp;amp; list)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Music File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterMusicFile(const MusicInfo&amp;amp; track)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Load EXE Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadEXEData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Load DLL Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadDLLData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File Force ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFileForce(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushScaleUI(uiscale::Align align, bool is_background, float ratio_h, float ratio_v)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopScaleUI()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Set Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetScaleFillMode(uiscale::FillMode mode)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uiscale::FillMode GetScaleFillMode()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Mipmap Blacklist GBIX ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void MipmapBlacklistGBIX(Uint32 index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register English Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEnglishVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Japanese Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterJapaneseVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Character Welds ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterCharacterWelds(const uint8_t character, const char* iniPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN, uint16_t durationJP, uint16_t durationEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Register Permanent Texlist ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterPermanentTexlist(NJS_TEXLIST* texlist)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Expand PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TEX_PVMTABLE* ExpandPVMList(TEX_PVMTABLE* sourcepvmlist, const TEX_PVMTABLE &amp;amp;newpvmentry)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Unicode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugUnicode(char* utf8)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Local ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugLocal(char* buf)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Codepage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugCodepage(char* buf, unsigned int source_cp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=336</id>
		<title>Mod Loaders</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=336"/>
		<updated>2025-10-08T13:37:44Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.&lt;br /&gt;
&lt;br /&gt;
Below you&#039;ll find links to documentation pertaining to each mod loader respectively. These include in-depth looks at each one&#039;s specific APIs.&lt;br /&gt;
&lt;br /&gt;
* [[SADX Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
* [[SA2B Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
= Mod Loader Export References =&lt;br /&gt;
&lt;br /&gt;
Below is an overview of the general exports that are available in the mod loaders. An [[Mod_Loaders#Example|example]] of a complete export can be seen below.&lt;br /&gt;
== Variable Exports ==&lt;br /&gt;
&lt;br /&gt;
=== ModInfo ===&lt;br /&gt;
ModInfo is a required export from any code based mod. Without it, the mod loader will not load the mod and will throw an error alerting the user that a mod is not a valid mod.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Example of exporting the ModInfo for SADX.&lt;br /&gt;
__declspec(dllexport) ModInfo SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
// Example of exporting the ModInfo for SA2B.&lt;br /&gt;
__declspec(dllexport) ModInfo SA2ModInfo = { ModLoaderVer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Function Exports ==&lt;br /&gt;
The mod loaders support loading various function exports from a mod. While these are all optional, many mods make use of at least one of these exports as their entry point. This is most commonly the [[Mod_Loaders#Init|Init]] export.&lt;br /&gt;
&lt;br /&gt;
Inside these exported functions you can put your own C++ code to manipulate data, replace assets or interface with the game.&lt;br /&gt;
&lt;br /&gt;
=== Init ===&lt;br /&gt;
The Init (short for Initialize) export is used for initializing information within your mod and passing some variables from the mod loader into the mod itself. The include the mod&#039;s path (local path to the mod folder from the game&#039;s root), HelperFunctions (see each respective page for each mod loader for more information on this struct), and the mod&#039;s index in the list.&lt;br /&gt;
&lt;br /&gt;
This is fired for all enabled mods first. It&#039;s fired in the order in which mods are loaded (top to bottom).&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void Init(const char* path, HelperFunctions&amp;amp; helperFunctions, const unsigned int index)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnInitEnd ===&lt;br /&gt;
This is run after all mods have finished running their Init, but before the game has completely loaded. This is useful for any mods making APIs for other mods to utilize. &lt;br /&gt;
{{Note|text=This is only available in the SADX Mod Loader at this time.|type=info}}&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInitEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnFrame ===&lt;br /&gt;
This export will run every frame. This can be useful if you need to check something within the game constantly. Users who utilize this should consider cautionary measures to prevent running large amounts of logic every frame if it can be avoided for performance reasons.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnFrame()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnInput ===&lt;br /&gt;
This export will run when the game processes input. More specifically, it will run just prior to the game actually processing that input.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInput()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnControl ===&lt;br /&gt;
This export will run while the game is actively processing input.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnControl()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneStart ===&lt;br /&gt;
This export will run just before a game scene is rendered.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneStart()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneEnd ===&lt;br /&gt;
This export will run just after a game scene has finished rendering.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceReset ===&lt;br /&gt;
This export will run whenever the render device for the game is reset. For example, resizing the game window will cause the render device to be reset.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceReset()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceLost ===&lt;br /&gt;
This export will run whenever a game scene fails to render.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceLost()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== OnExit ===&lt;br /&gt;
This export runs just prior to the game completely closing.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnExit()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Useful Functions and Macros ==&lt;br /&gt;
Inside any of the exported functions above, apart from your own custom C or C++ code, you can use the following functions and macros to replace game code and data in memory.&lt;br /&gt;
&lt;br /&gt;
=== WriteData ===&lt;br /&gt;
WriteData writes the specified data at the specified memory address. You can use it to make small code patches, overwrite values, replace pointers etc.&lt;br /&gt;
&lt;br /&gt;
Useful hacks:&lt;br /&gt;
&lt;br /&gt;
* Write &amp;lt;code&amp;gt;0xC3&amp;lt;/code&amp;gt; to kill a function by writing a &amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt; instruction.&lt;br /&gt;
* Write &amp;lt;code&amp;gt;0x90&amp;lt;/code&amp;gt; five times to kill a function call by writing five &amp;lt;code&amp;gt;nop&amp;lt;/code&amp;gt; instructions.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy=&amp;quot;&amp;quot;&amp;gt;&lt;br /&gt;
WriteData&amp;lt;1&amp;gt;((Uint8*)0x005ADC40, 0xC3); // Writes 0xC3 (one byte) to the address 0x005ADC40, effectively disabling the function located at that address.&lt;br /&gt;
WriteData&amp;lt;5&amp;gt;((Uint8*)0x0062EC3C, 0x90); // Writes 0x90 (five bytes) to the address 0x0062EC3C, effectively disabling the function call located at that address.&lt;br /&gt;
WriteData((Float*)0x00652F74, 800.0f); // Writes the floating point value of 800.0 to the address 0x00652F74.&lt;br /&gt;
WriteData((Float**)0x004D73FB, &amp;amp;MyFloat); // Replaces the pointer located at 0x004D73FB with the pointer to MyFloat.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== WriteJump ===&lt;br /&gt;
WriteJump writes a &amp;lt;code&amp;gt;jmp&amp;lt;/code&amp;gt; instruction at the specified memory address. You can use this to replace entire functions in the game with your own code.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
WriteJump((void*)0x005BBFE0, MyFunction); // Replaces the function at 0x005BBFE0 with a jump to MyFunction.&lt;br /&gt;
&lt;br /&gt;
WriteJump(Function1, MyFunction); // Replaces the function Function1 (if defined with a FunctionPointer) with a jump to MyFunction.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== WriteCall ===&lt;br /&gt;
WriteCall writes a &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt; instruction at the specified memory address. You can use this to call your own code from the game&#039;s functions without replacing them entirely.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
WriteCall((void*)0x005AEF29, MyFunction); // Replaces the function call at 0x005AEF29 with a call to MyFunction.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Exportable Lists == &lt;br /&gt;
The mod loaders also have support for exporting different types of lists. These are all optional exports.&lt;br /&gt;
&lt;br /&gt;
=== Patch List ===&lt;br /&gt;
A PatchList is comprised of an array of PatchInfo entries. The mod loader will generate these using WriteData.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Jumps, Calls, and Pointer Lists ===&lt;br /&gt;
These three exportable lists are all comprised of an array of PointerInfo entries. On the mod loader&#039;s side, these arrays are handled like so:&lt;br /&gt;
* Jumps are generated using WriteJump.&lt;br /&gt;
* Calls are generated using WriteCall.&lt;br /&gt;
* Pointers are generated using WriteData.&lt;br /&gt;
{{Documentation|header=Example|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert examples.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Example = &lt;br /&gt;
{{Documentation|header=Example Export Table|content=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line copy&amp;gt;&lt;br /&gt;
// Inside of your mod&#039;s &amp;quot;main&amp;quot; cpp file (or whichever one houses your exports).&lt;br /&gt;
#include &amp;quot;pch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelperFunctions globalHelperFunctions;&lt;br /&gt;
const char* globalPath;&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    __declspec(dllexport) SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    __declspec(dllexport) Init(const char* path, HelperFunctions &amp;amp;helperFunctions, const unsigned int index)&lt;br /&gt;
    {&lt;br /&gt;
        // This passes the Mod Loader&#039;s HelperFunctions struct to your mod&#039;s.&lt;br /&gt;
        // This is necessary so the API related functions can work properly.&lt;br /&gt;
        globalHelperFunctions = helperFunctions;&lt;br /&gt;
&lt;br /&gt;
        // This passes the mod&#039;s local folder path to the mod itself.&lt;br /&gt;
        // This is helpful for loading custom files.&lt;br /&gt;
        globalPath = path;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=335</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=335"/>
		<updated>2025-10-08T00:43:08Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:15px&amp;quot;&amp;gt;&lt;br /&gt;
  {{#switch: {{{type|}}}&lt;br /&gt;
        |info=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
        |help=[[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
        |warn=[[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
        |error=[[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
        |idea=[[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;br /&gt;
        |=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
    }} {{{text}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Template Usage|content=&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;{{Note|text=my cool note|type=warn}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Renders As: {{Note|text=my cool note|type=warn}}&lt;br /&gt;
&lt;br /&gt;
Available types:&lt;br /&gt;
&lt;br /&gt;
Info: [[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Help: [[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Warn: [[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Error: [[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Idea: [[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Documentation&amp;diff=334</id>
		<title>Template:Documentation</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Documentation&amp;diff=334"/>
		<updated>2025-10-08T00:41:47Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Created page with &amp;quot;&amp;lt;onlyinclude&amp;gt; &amp;lt;div&amp;gt;   &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;     30px &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;   &amp;lt;/p&amp;gt;   &amp;lt;div style=&amp;quot;border: 1px outset #72777D; padding: 15px; margin: -16px 0px;&amp;quot;&amp;gt;     &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;   &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/onlyinclude&amp;gt;  {{Documentation|header=Template Usage|content=  Syntax: &amp;lt;pre&amp;gt;{{Documenation|header=my cool header|content=that&amp;#039;s s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
  &amp;lt;p style=&amp;quot;border: 1px outset #72777D; border-radius: 20px 20px 0px 0px; background-color: #27292D; padding: 15px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:OOjs_UI_icon_code-invert.svg|30px]] &amp;lt;strong&amp;gt;{{{header}}}&amp;lt;/strong&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;border: 1px outset #72777D; padding: 15px; margin: -16px 0px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;{{{content}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|header=Template Usage|content=&lt;br /&gt;
&lt;br /&gt;
Syntax:&lt;br /&gt;
&amp;lt;pre&amp;gt;{{Documenation|header=my cool header|content=that&#039;s some good content}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Render As:&lt;br /&gt;
{{Documentation|header=my cool header|content=that&#039;s some good content}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Content can also be filled in as normal by doing the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;{{Documentation|header=Example Code|content=&lt;br /&gt;
This is one sentence.&lt;br /&gt;
&lt;br /&gt;
This is another sentence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is also showing that other formatting methods are available.&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    void MyCoolExportFunction()&lt;br /&gt;
    {&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Which this will render as the following:&lt;br /&gt;
{{Documentation|header=Example Code|content=&lt;br /&gt;
This is one sentence.&lt;br /&gt;
&lt;br /&gt;
This is another sentence.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is also showing that other formatting methods are available.&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    void MyCoolExportFunction()&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=332</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=332"/>
		<updated>2025-10-07T23:20:01Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:15px&amp;quot;&amp;gt;&lt;br /&gt;
  {{#switch: {{{type|}}}&lt;br /&gt;
        |info=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
        |help=[[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
        |warn=[[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
        |error=[[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
        |idea=[[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;br /&gt;
        |=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
    }} {{{text}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;{{Note|text=my cool note|type=warn}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Renders As: {{Note|text=my cool note|type=warn}}&lt;br /&gt;
&lt;br /&gt;
Available types:&lt;br /&gt;
&lt;br /&gt;
Info: [[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Help: [[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Warn: [[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Error: [[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Idea: [[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=331</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=331"/>
		<updated>2025-10-07T22:56:40Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 15px; position:relative;&amp;gt;&lt;br /&gt;
  &amp;lt;div background-color: #202122; border: 1px solid #404244; position:absolute; top:50%; height:10em; margin-top:-5em;&amp;gt;&lt;br /&gt;
    {{#switch: {{{type|}}}&lt;br /&gt;
        |info=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
        |help=[[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
        |warn=[[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
        |error=[[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
        |idea=[[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;br /&gt;
        |=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
    }} {{{text}}}&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;{{Note|text=my cool note|type=warn}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Renders As: {{Note|text=my cool note|type=warn}}&lt;br /&gt;
&lt;br /&gt;
Available types:&lt;br /&gt;
&lt;br /&gt;
Info: [[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Help: [[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Warn: [[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Error: [[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
&lt;br /&gt;
Idea: [[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=330</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=330"/>
		<updated>2025-10-07T22:44:35Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 15px; background-color: #202122; border: 1px solid #404244; padding: 10px; vertical-align:middle&amp;quot;&amp;gt;&lt;br /&gt;
{{#switch: {{{type|}}}&lt;br /&gt;
    |info=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
    |help=[[File:OOjs_UI_icon_help-ltr-progressive.svg|40px]]&lt;br /&gt;
    |warn=[[File:OOjs_UI_icon_alert-yellow.svg|40px]]&lt;br /&gt;
    |error=[[File:OOjs_UI_icon_close-ltr-destructive.svg|40px]]&lt;br /&gt;
    |idea=[[File:OOjs_UI_icon_bulb-progressive.svg|40px]]&lt;br /&gt;
    |=[[File:OOjs_UI_icon_info_big-invert.svg|40px]]&lt;br /&gt;
}} &lt;br /&gt;
{{{text}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pre&amp;gt;{{Note|type=warn|text=my cool note}}&amp;lt;/pre&amp;gt;&lt;br /&gt;
Renders As: {{Note|text=my cool note|warn}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Creating_Mods&amp;diff=290</id>
		<title>Creating Mods</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Creating_Mods&amp;diff=290"/>
		<updated>2025-10-05T20:53:32Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Fixing link to Cheat Codes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are many ways to modify Sonic Adventure DX and Sonic Adventure 2: Battle on PC using the Mod Loaders, from basic file editing to powerful code injection.&lt;br /&gt;
&lt;br /&gt;
The first step is to create your mod using the [[Mod Managers|Mod Manager]]. This will create a folder in which you will be able to put your modifications without affecting the original game files or executable.&lt;br /&gt;
&lt;br /&gt;
From there, you will be able to do:&lt;br /&gt;
&lt;br /&gt;
* [[Creating mods/File replacement|File replacement]]&lt;br /&gt;
* [[Creating mods/Texture replacement|Texture replacement]]&lt;br /&gt;
* [[Cheat Codes|Cheat codes]]&lt;br /&gt;
* [[Creating mods/Code injection|Code injection]] (DLL mod)&lt;br /&gt;
* [[Creating mods/Automatic updates|Automatic updates]]&lt;br /&gt;
* [[Creating mods/Mod configuration|Mod configuration]]&lt;br /&gt;
&lt;br /&gt;
= Creating a mod =&lt;br /&gt;
To create a mod you need the SA Mod Manager with Sonic Adventure DX and/or Sonic Adventure 2: Battle set up.&lt;br /&gt;
&lt;br /&gt;
First open SA Mod Manager with the game of your choice and click on the &amp;quot;Add Mod&amp;quot; button in the Mods tab.&lt;br /&gt;
[[File:Add-mod-button.png|none|509x509px]]&lt;br /&gt;
Then select &amp;quot;New Mod (For Developers)&amp;quot;&lt;br /&gt;
[[File:Add-mod-prompt.png|none|500x500px]]&lt;br /&gt;
This opens the mod creation form.&lt;br /&gt;
&lt;br /&gt;
=== Mod Information ===&lt;br /&gt;
[[File:New-mod-form-info.png|none|600x600px]]&lt;br /&gt;
Here are the information requested (* is mandatory):&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Name*&#039;&#039;&#039;: the name of the mod&lt;br /&gt;
* &#039;&#039;&#039;Author&#039;&#039;&#039;: your nickname, it is acceptable to add co-authors separated with commas&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: short description of the mod, it appears below the mod list&lt;br /&gt;
* &#039;&#039;&#039;Version&#039;&#039;&#039;: a version number, preferably numbers and dots. A common way to represent version is &amp;quot;major.minor&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;DLL&#039;&#039;&#039;: for code injection, this is the name of the DLL with the extension (e.g. &amp;quot;my-mod.dll&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;Category&#039;&#039;&#039;: one of the categories listed or none&lt;br /&gt;
* &#039;&#039;&#039;Mod ID*&#039;&#039;&#039;: a unique name for your mod that should not change, preferably without spaces (e.g. &amp;quot;game.author.modname&amp;quot;)&lt;br /&gt;
* &#039;&#039;&#039;Include Directories&#039;&#039;&#039;: this is used for codeless mod configuration&lt;br /&gt;
* &#039;&#039;&#039;Author URL&#039;&#039;&#039;: link to a page of your choice, ideally showcasing your mods (GameBanana or GitHub profile for example)&lt;br /&gt;
* &#039;&#039;&#039;Source Code URL&#039;&#039;&#039;: for code injection, link to the source code (GitHub repository for example)&lt;br /&gt;
&lt;br /&gt;
This should have created a folder with a system folder (for SADX) or a gd_PC folder (for SA2B), you can use these for [[file replacement]].&lt;br /&gt;
&lt;br /&gt;
=== Update information ===&lt;br /&gt;
[[File:New-mod-form-update.png|none|600x600px]]&lt;br /&gt;
This tab is for [[Creating mods/Automatic updates|automatic updates]], it is generally filled out later.&lt;br /&gt;
&lt;br /&gt;
For GitHub:&lt;br /&gt;
&lt;br /&gt;
* Author and repo is the right part of the repository URL (e.g. myself/my-mod)&lt;br /&gt;
* Release Asset is the name of the zip file in the release (e.g. my-mod.7z)&lt;br /&gt;
&lt;br /&gt;
For GameBanana:&lt;br /&gt;
&lt;br /&gt;
* Mod ID is the number in the mod&#039;s page URL (e.g. 123456)&lt;br /&gt;
* Mod Type shouldn&#039;t be changed (legacy)&lt;br /&gt;
&lt;br /&gt;
For self hosted:&lt;br /&gt;
&lt;br /&gt;
* Update URL: path to mod folder root on a remote http server&lt;br /&gt;
* Changelog URL: path to changelog file (plain text)&lt;br /&gt;
&lt;br /&gt;
=== Cheat codes ===&lt;br /&gt;
[[File:New-mod-form-cheat.png|none|600x600px]]&lt;br /&gt;
This tab is for [[Creating mods/Cheat Codes|cheat codes]].&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
[[File:New-mod-form-dependencies.png|none|600x600px]]&lt;br /&gt;
This tab is for mod dependencies. If your mod absolutely relies on another mod to function properly, you should add it here. The mod manager will warn users if they lack a dependency.&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Creating_mods/Cheat_Codes&amp;diff=289</id>
		<title>Creating mods/Cheat Codes</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Creating_mods/Cheat_Codes&amp;diff=289"/>
		<updated>2025-10-05T20:52:46Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: ItsEasyActually moved page Creating mods/Cheat Codes to Cheat Codes: Moving to non-sub name title.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Cheat Codes]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Creating_Mods/Cheat_Codes&amp;diff=288</id>
		<title>Creating Mods/Cheat Codes</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Creating_Mods/Cheat_Codes&amp;diff=288"/>
		<updated>2025-10-05T20:52:46Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: ItsEasyActually moved page Creating mods/Cheat Codes to Cheat Codes: Moving to non-sub name title.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Sonic Adventure DX and Sonic Adventure 2: Battle Mod Loaders allow you to edit the game&#039;s code and memory without resorting to a DLL mod. The syntax is similar to cheat code for consoles, such as Action Replay code. This is useful for simple modifications where a DLL would be overkill.&lt;br /&gt;
&lt;br /&gt;
== Creating a cheat code ==&lt;br /&gt;
&lt;br /&gt;
=== Using the SA Mod Manager ===&lt;br /&gt;
First edit your mod by right clicking it and clicking on Edit mod, or by selecting it and pressing Ctrl + E.&lt;br /&gt;
[[File:Samm-editmod-context.png|none|508x508px]]&lt;br /&gt;
Then go in the &amp;quot;Codes&amp;quot; tab and click on &amp;quot;New code&amp;quot;.&lt;br /&gt;
[[File:Samm-editmode-codestab.png|none|502x502px]]&lt;br /&gt;
You are now in the cheat code editor :&lt;br /&gt;
[[File:Samm-editmode-codeeditor.png|none|500x500px]]&lt;br /&gt;
Fields are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Name*&#039;&#039;&#039;: short name for the cheat code.&lt;br /&gt;
* &#039;&#039;&#039;Author&#039;&#039;&#039;: author(s) of the cheat code.&lt;br /&gt;
* &#039;&#039;&#039;Type*&#039;&#039;&#039;: &amp;quot;Code&amp;quot; will make your cheat code run every frame, &amp;quot;Patch&amp;quot; will make it run once at start up.&lt;br /&gt;
* &#039;&#039;&#039;Is Required&#039;&#039;&#039;: if checked, the cheat code will be forced on and won&#039;t appear in the Mod Manager &amp;quot;Codes&amp;quot; tab.&lt;br /&gt;
* &#039;&#039;&#039;Description&#039;&#039;&#039;: description of the cheat code.&lt;br /&gt;
&lt;br /&gt;
To write the code, see [[Creating mods/Cheat Codes#Writing a cheat code|Writing a cheat code]].&lt;br /&gt;
&lt;br /&gt;
When finished, save the cheat code, enable the mod and click &amp;quot;Save&amp;quot; to compile the cheat codes.&lt;br /&gt;
&lt;br /&gt;
=== Using notepad or another editor ===&lt;br /&gt;
In your mod folder, create an empty text file, preferably called &amp;quot;Codes.lst&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Then open your mod.ini to add the following line:&lt;br /&gt;
 Codes=Codes.lst&lt;br /&gt;
Save your mod.ini, then open Codes.lst with the editor of your choice.&lt;br /&gt;
&lt;br /&gt;
Here is the structure of a cheat code:&lt;br /&gt;
 [Type] [Name] (Required)&lt;br /&gt;
 [Code]&lt;br /&gt;
 Author [Author]&lt;br /&gt;
 Category [Category]&lt;br /&gt;
 Description [Description]&lt;br /&gt;
Fields are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Type*&#039;&#039;&#039;: &amp;quot;Code&amp;quot; will make your cheat code run every frame, &amp;quot;Patch&amp;quot; will make it run once at start up.&lt;br /&gt;
* &#039;&#039;&#039;Name*&#039;&#039;&#039;: short name for the cheat code.&lt;br /&gt;
* &#039;&#039;&#039;Required&#039;&#039;&#039;: the cheat code will be forced on and won&#039;t appear in the Mod Manager &amp;quot;Codes&amp;quot; tab.&lt;br /&gt;
* &#039;&#039;&#039;Code&#039;&#039;&#039;: the actual code, see [[Creating mods/Cheat Codes#Writing a cheat code|Writing a cheat code]].&lt;br /&gt;
* &#039;&#039;&#039;Author&#039;&#039;&#039;, &#039;&#039;&#039;Category&#039;&#039;&#039; and &#039;&#039;&#039;Description&#039;&#039;&#039; are optional.&lt;br /&gt;
&lt;br /&gt;
Once finished, save the Codes.lst file, open the Mod Manager, enable the mod if not already and click &amp;quot;Save&amp;quot; to compile the cheat codes.&lt;br /&gt;
&lt;br /&gt;
== Writing a cheat code ==&lt;br /&gt;
See the full [https://github.com/X-Hax/sadx-mod-loader/blob/master/doc/codes.md documentation].&lt;br /&gt;
&lt;br /&gt;
=== Memory operations ===&lt;br /&gt;
Each line follows the following format:&lt;br /&gt;
 [opcode] [address] [value] (repeat count)&lt;br /&gt;
The memory operations you can use are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Operation&lt;br /&gt;
!Opcodes&lt;br /&gt;
!Description&lt;br /&gt;
!C equivalent&lt;br /&gt;
|-&lt;br /&gt;
|Write&lt;br /&gt;
|write8&lt;br /&gt;
write16&lt;br /&gt;
write32&lt;br /&gt;
writefloat&lt;br /&gt;
|Write value at address&lt;br /&gt;
|*address = value;&lt;br /&gt;
|-&lt;br /&gt;
|Add&lt;br /&gt;
|add8&lt;br /&gt;
add16&lt;br /&gt;
add32&lt;br /&gt;
addfloat&lt;br /&gt;
|Add value at address&lt;br /&gt;
|*address += value;&lt;br /&gt;
|-&lt;br /&gt;
|Subtract&lt;br /&gt;
|sub8&lt;br /&gt;
sub16&lt;br /&gt;
sub32&lt;br /&gt;
subfloat&lt;br /&gt;
|Subtract value at address&lt;br /&gt;
|*address -= value;&lt;br /&gt;
|-&lt;br /&gt;
|Multiply&lt;br /&gt;
|mulu8&lt;br /&gt;
mulu16&lt;br /&gt;
mulu32&lt;br /&gt;
muls8&lt;br /&gt;
muls16&lt;br /&gt;
muls32&lt;br /&gt;
mulfloat&lt;br /&gt;
|Multiply value at address&lt;br /&gt;
|*address *= value;&lt;br /&gt;
|-&lt;br /&gt;
|Divide&lt;br /&gt;
|divu8&lt;br /&gt;
divu16&lt;br /&gt;
divu32&lt;br /&gt;
divs8&lt;br /&gt;
divs16&lt;br /&gt;
divs32&lt;br /&gt;
divfloat&lt;br /&gt;
|Divide value at address&lt;br /&gt;
|*address /= value;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bitwise operations ===&lt;br /&gt;
These are more advanced operations as they operate on the bit level.&lt;br /&gt;
 [opcode] [address] [value] (repeat count)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Operation&lt;br /&gt;
!Opcodes&lt;br /&gt;
!Description&lt;br /&gt;
!C equivalent&lt;br /&gt;
|-&lt;br /&gt;
|Shift left&lt;br /&gt;
|shl8&lt;br /&gt;
shl16&lt;br /&gt;
shl32&lt;br /&gt;
|Shift bits at address to the left&lt;br /&gt;
|*address &amp;lt;&amp;lt;= value;&lt;br /&gt;
|-&lt;br /&gt;
|Shift right&lt;br /&gt;
|shrs8&lt;br /&gt;
shrs16&lt;br /&gt;
shrs32&lt;br /&gt;
shru8&lt;br /&gt;
shru16&lt;br /&gt;
shru32&lt;br /&gt;
|Shift bits at address to the right&lt;br /&gt;
|*address &amp;gt;&amp;gt;= value;&lt;br /&gt;
|-&lt;br /&gt;
|AND&lt;br /&gt;
|and8&lt;br /&gt;
and16&lt;br /&gt;
and32&lt;br /&gt;
|AND bits at address&lt;br /&gt;
Often used to remove flags&lt;br /&gt;
|*address &amp;amp;= value;&lt;br /&gt;
|-&lt;br /&gt;
|OR&lt;br /&gt;
|or8&lt;br /&gt;
or16&lt;br /&gt;
or32&lt;br /&gt;
|OR bits at address&lt;br /&gt;
Often used to add flags&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;*address |= value;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|XOR&lt;br /&gt;
|xor8&lt;br /&gt;
xor16&lt;br /&gt;
xor32&lt;br /&gt;
|XOR bits at address&lt;br /&gt;
|*address ^= value;&lt;br /&gt;
|-&lt;br /&gt;
|Rotate left&lt;br /&gt;
|rol8&lt;br /&gt;
rol16&lt;br /&gt;
rol32&lt;br /&gt;
|Rotate bits left&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Rotate right&lt;br /&gt;
|ror8&lt;br /&gt;
ror16&lt;br /&gt;
ror32&lt;br /&gt;
|Rotate bits right&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Special operations ===&lt;br /&gt;
 [opcode] [address] [value]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Operation&lt;br /&gt;
!Opcodes&lt;br /&gt;
!Description&lt;br /&gt;
!C equivalent&lt;br /&gt;
|-&lt;br /&gt;
|Write NOP&lt;br /&gt;
|writenop&lt;br /&gt;
|Write NOP opcode at address N times&lt;br /&gt;
Often used to remove a call (writenop address 5)&lt;br /&gt;
|WriteData&amp;lt;value&amp;gt;((void*)address, 0x90);&lt;br /&gt;
|-&lt;br /&gt;
|Write JUMP&lt;br /&gt;
|writejump&lt;br /&gt;
|Write a JUMP opcode at address followed by rel jump address&lt;br /&gt;
Often used to redirect a function to another&lt;br /&gt;
|WriteJump((void*)address, (void*)value);&lt;br /&gt;
|-&lt;br /&gt;
|Write CALL&lt;br /&gt;
|writecall&lt;br /&gt;
|Write a CALL opcode at address followed by rel call address&lt;br /&gt;
Often used to replace a call to a function with another&lt;br /&gt;
|WriteCall((void*)address, (void*)value);&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Conditions ===&lt;br /&gt;
The cheat code system supports conditions and branching.&lt;br /&gt;
 [condition opcode] [address] [compared value] (repeat count)&lt;br /&gt;
 	...&lt;br /&gt;
 &#039;&#039;else&lt;br /&gt;
 	...&#039;&#039;&lt;br /&gt;
 endif&lt;br /&gt;
Here are the conditions available:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Operation&lt;br /&gt;
!Opcodes&lt;br /&gt;
!Description&lt;br /&gt;
!C equivalent&lt;br /&gt;
|-&lt;br /&gt;
|If equal&lt;br /&gt;
|ifeq8&lt;br /&gt;
ifeq16&lt;br /&gt;
ifeq32&lt;br /&gt;
ifeqfloat&lt;br /&gt;
|Check if value at address is equal&lt;br /&gt;
|if (*address == value)&lt;br /&gt;
|-&lt;br /&gt;
|If not equal&lt;br /&gt;
|ifne8&lt;br /&gt;
ifne16&lt;br /&gt;
ifne32&lt;br /&gt;
ifnefloat&lt;br /&gt;
|Check if value at address is different&lt;br /&gt;
|if (*address != value)&lt;br /&gt;
|-&lt;br /&gt;
|If lower&lt;br /&gt;
|ifltu8&lt;br /&gt;
ifltu16&lt;br /&gt;
ifltu32&lt;br /&gt;
iflts8&lt;br /&gt;
iflts16&lt;br /&gt;
iflts32&lt;br /&gt;
ifltfloat&lt;br /&gt;
|Check if value at address is lower&lt;br /&gt;
|if (*address &amp;lt; value)&lt;br /&gt;
|-&lt;br /&gt;
|If lower or equal&lt;br /&gt;
|ifltequ8&lt;br /&gt;
ifltequ16&lt;br /&gt;
ifltequ32&lt;br /&gt;
iflteqs8&lt;br /&gt;
iflteqs16&lt;br /&gt;
iflteqs32&lt;br /&gt;
iflteqfloat&lt;br /&gt;
|Check if value at address is lower or equal&lt;br /&gt;
|if (*address &amp;lt;= value)&lt;br /&gt;
|-&lt;br /&gt;
|If greater&lt;br /&gt;
|ifgtu8&lt;br /&gt;
ifgtu16&lt;br /&gt;
ifgtu32&lt;br /&gt;
ifgts8&lt;br /&gt;
ifgts16&lt;br /&gt;
ifgts32&lt;br /&gt;
ifgtfloat&lt;br /&gt;
|Check if value at address is greater&lt;br /&gt;
|if (*address &amp;gt; value)&lt;br /&gt;
|-&lt;br /&gt;
|If greater or equal&lt;br /&gt;
|ifgtequ8&lt;br /&gt;
ifgtequ16&lt;br /&gt;
ifgtequ32&lt;br /&gt;
ifgteqs8&lt;br /&gt;
ifgteqs16&lt;br /&gt;
ifgteqs32&lt;br /&gt;
ifgteqfloat&lt;br /&gt;
|Check if value at address is greater or equal&lt;br /&gt;
|if (*address &amp;gt;= value)&lt;br /&gt;
|-&lt;br /&gt;
|If mask&lt;br /&gt;
|ifmask8&lt;br /&gt;
ifmask16&lt;br /&gt;
ifmask32&lt;br /&gt;
|Check if value at address has specific bits&lt;br /&gt;
Often used to check flags&lt;br /&gt;
|if ((*address &amp;amp; value) == value)&lt;br /&gt;
|-&lt;br /&gt;
|If key pressed&lt;br /&gt;
|ifkbkey [keycode]&lt;br /&gt;
|Check if keyboard key is pressed&lt;br /&gt;
See Windows [https://learn.microsoft.com/fr-fr/windows/win32/inputdev/virtual-key-codes virtual key codes].&lt;br /&gt;
|if (GetAsyncKeyState(value))&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Registers ===&lt;br /&gt;
The cheat code system has 16 registers available, you can use them as variables.&lt;br /&gt;
&lt;br /&gt;
Most opcodes have a register equivalent, simply add &amp;quot;reg&amp;quot; before the type (writereg8, divregu8, ifmaskreg8...)&lt;br /&gt;
 [opcode] [address] [value] (repeat count)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Operation&lt;br /&gt;
!Opcodes&lt;br /&gt;
!Description&lt;br /&gt;
!C equivalent&lt;br /&gt;
|-&lt;br /&gt;
|Read&lt;br /&gt;
|readreg8&lt;br /&gt;
readreg16&lt;br /&gt;
readreg32&lt;br /&gt;
|Read value at address into register&lt;br /&gt;
|reg[value] = *address;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Values format ===&lt;br /&gt;
Values can be in decimal, hexadecimal, or float format.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!Example&lt;br /&gt;
|-&lt;br /&gt;
|Decimal&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|Hexadecimal&lt;br /&gt;
|0xA&lt;br /&gt;
|-&lt;br /&gt;
|Float&lt;br /&gt;
|10.0&lt;br /&gt;
|}&lt;br /&gt;
Repeat count should be preceded with x.&lt;br /&gt;
&lt;br /&gt;
Addresses can be in hexadecimal or pointer chain format.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Type&lt;br /&gt;
!Example&lt;br /&gt;
|-&lt;br /&gt;
|Hexadecimal&lt;br /&gt;
|03B0F0FC&lt;br /&gt;
|-&lt;br /&gt;
|Pointer chain&lt;br /&gt;
|&amp;lt;nowiki&amp;gt;p03B42E30|20|C0|6&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
These examples use Sonic Adventure DX (2004) addresses.&lt;br /&gt;
&lt;br /&gt;
=== Write to memory ===&lt;br /&gt;
 write16 03B0F0E4 999&lt;br /&gt;
This forces the ring count to 999 every frame.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;write16&amp;lt;/code&amp;gt; means that it will write to 2 bytes. This is because the Rings variable in SADX is a 2 bytes (a &amp;quot;short&amp;quot; or &amp;quot;Sint16&amp;quot; in c++).&lt;br /&gt;
* &amp;lt;code&amp;gt;03B0F0E4&amp;lt;/code&amp;gt; is the hexadecimal address of the Rings variable&lt;br /&gt;
* &amp;lt;code&amp;gt;999&amp;lt;/code&amp;gt; is the 2-byte values that is going to be written at the provided address.&lt;br /&gt;
&lt;br /&gt;
 writefloat 03B0F0FC 1.0&lt;br /&gt;
This forces the gravity to be upside down.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;writefloat&amp;lt;/code&amp;gt; means that the edited value is a (single precision) floating point value.&lt;br /&gt;
* &amp;lt;code&amp;gt;03B0F0FC&amp;lt;/code&amp;gt; is the hexadecimal address of the up gravity direction.&lt;br /&gt;
* &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt; is a float value that we will be writing, 1.0 for up gravity means upward.&lt;br /&gt;
&lt;br /&gt;
=== Conditions ===&lt;br /&gt;
 ifltu32 03B0F14C 9999&lt;br /&gt;
 	add32 03B0F14C 1&lt;br /&gt;
 endif&lt;br /&gt;
This increased the score counter every frame until it reaches 9999.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ifltu32&amp;lt;/code&amp;gt; means &amp;quot;if value is inferior to3 (9999 here)&lt;br /&gt;
* &amp;lt;code&amp;gt;03B0F14C&amp;lt;/code&amp;gt; is the level score.&lt;br /&gt;
&lt;br /&gt;
 ifmask32 03B0E9D0 0x10&lt;br /&gt;
 	mulfloat 03B0F0FC 1.05&lt;br /&gt;
 endif&lt;br /&gt;
This increases the gravity when you press d-pad up.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ifmask32&amp;lt;/code&amp;gt; means we are checking if the value at address has specific bits&lt;br /&gt;
* &amp;lt;code&amp;gt;03B0E9D0&amp;lt;/code&amp;gt; is the hexadecimal address of the pressed buttons variable, each bit corresponds to a button.&lt;br /&gt;
* &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt; is the bit mask for d-pad up.&lt;br /&gt;
&lt;br /&gt;
=== More examples ===&lt;br /&gt;
Check the [https://github.com/X-Hax/sadx-mod-loader/blob/master/data/Codes.lst SADX Mod Loader cheat codes] and [https://github.com/X-Hax/sa2-mod-loader/blob/master/data/Codes.lst SA2 Mod Loader cheat codes] for more examples.&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
To get addresses:&lt;br /&gt;
&lt;br /&gt;
* Check the RAM editing pages on sonicretro ([https://info.sonicretro.org/SCHG:Sonic_Adventure_DX:_PC/RAM_Editing SADX]/[https://info.sonicretro.org/SCHG:Sonic_Adventure_2_(PC)/RAM_Editing SA2PC])&lt;br /&gt;
* Start disassembling the game with IDA Pro or Ghidra&lt;br /&gt;
* Ask us for help on Discord&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=287</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=287"/>
		<updated>2025-10-05T20:34:13Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;margin: 15px; background-color: #202122; border: 1px solid #404244; padding: 10px; vertical-align:middle&amp;quot;&amp;gt;&lt;br /&gt;
{{#switch: {{{type|}}}&lt;br /&gt;
    |info=[[File:OOjs_UI_icon_info-progressive.svg|18px]]&lt;br /&gt;
    |=[[File:OOjs_UI_icon_info-progressive.svg|18px]]&lt;br /&gt;
}}|{{{text}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=284</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=284"/>
		<updated>2025-10-05T20:17:43Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;width: auto; margin-left: 20px; margin-right: 15px; background-color: #202122; border: 2px outset #404244; padding-top: 5px; padding-left: 5px; padding-right: 5px; padding-bottom: 5px&amp;quot;&amp;gt;&lt;br /&gt;
{{{text}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=283</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=283"/>
		<updated>2025-10-05T20:07:33Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{{text}}}&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=282</id>
		<title>Template:Note</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Template:Note&amp;diff=282"/>
		<updated>2025-10-05T20:05:35Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Attempting a Template for Notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
{{{text}}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=219</id>
		<title>SA2B Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SA2B_Mod_Loader&amp;diff=219"/>
		<updated>2025-10-04T14:51:21Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Writing SA2B Mod Loader page and documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sa2-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sa2-mod-loader/blob/master/SA2ModLoader/include/SA2ModInfo.h SA2ModInfo.h] &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions = &lt;br /&gt;
{&lt;br /&gt;
    ModLoaderVer,&lt;br /&gt;
    RegisterStartPosition,&lt;br /&gt;
    ClearStartPositionList,&lt;br /&gt;
    Register2PIntroPosition,&lt;br /&gt;
    Clear2PIntroPositionList,&lt;br /&gt;
    GetMainSavePath,&lt;br /&gt;
    GetChaoSavePath,&lt;br /&gt;
    RegisterEndPosition,&lt;br /&gt;
    ClearEndPositionList,&lt;br /&gt;
    RegisterMission23EndPosition,&lt;br /&gt;
    ClearMission23EndPositionList,&lt;br /&gt;
    HookExport,&lt;br /&gt;
    GetReplaceablePath,&lt;br /&gt;
    _ReplaceFile,&lt;br /&gt;
    SetWindowTitle,&lt;br /&gt;
    debug_text::SetFontSize,&lt;br /&gt;
    debug_text::SetFontColor,&lt;br /&gt;
    debug_text::DisplayString,&lt;br /&gt;
    debug_text::DisplayStringFormatted,&lt;br /&gt;
    debug_text::DisplayNumber,&lt;br /&gt;
    &amp;amp;loaderSettings,&lt;br /&gt;
    &amp;amp;modList,&lt;br /&gt;
    &amp;amp;RegisterVoice,&lt;br /&gt;
    &amp;amp;ReplaceTexture,&lt;br /&gt;
    &amp;amp;UnreplaceFile,&lt;br /&gt;
    &amp;amp;PushInterpolationFix,&lt;br /&gt;
    &amp;amp;PopInterpolationFix,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (globalHelperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
    PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Start Position for the specified character.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// This is a declaration of an SA2 StartPosition struct.&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID&lt;br /&gt;
    0x4000,                     // Single Player Y Rotation &lt;br /&gt;
    0x4000,                     // Multiplayer, Player 1 Y Rotation&lt;br /&gt;
    0x4000,                     // Multiplayer, Player 2 Y Rotation&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Single Player Start Position&lt;br /&gt;
    { 90.0f, 200.0f, 100.0f },  // Multiplayer, Player 1 Start Position&lt;br /&gt;
    { 110.0f, 200.0f, 100.0f }  // Multiplayer, Player 2 Start Position&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
globalHelperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 2P Intro Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Register2PIntroPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a Multiplayer Intro Position for the specified character. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear 2P Intro Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void Clear2PIntroPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears all Multiplayer Intro Positions for the specified character.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the game&#039;s Main Save File&#039;s path.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEndPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearEndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Mission 2/3 End Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterMission23EndPosition(unsigned char character, const LevelEndPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Mission 2/3 End Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ClearMission23EndPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Hook Export ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void HookExport(LPCSTR exportName, const void* newdata)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const wchar_t* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Size ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontSize(float size)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Set Font Color ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetFontColor(int color)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayString(int loc, const char* str)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display String Formatted ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayStringFormatted(int loc, const char* Format, ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug Text : Display Number ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void DisplayNumber(int loc, int value, int numdigits)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=218</id>
		<title>SADX Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=218"/>
		<updated>2025-10-04T14:41:23Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Added missing methods.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sadx-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sadx-mod-loader/blob/master/SADXModLoader/include/SADXModInfo.h SADXModInfo.h] &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions =&lt;br /&gt;
{&lt;br /&gt;
	ModLoaderVer,&lt;br /&gt;
	&amp;amp;RegisterStartPosition,&lt;br /&gt;
	&amp;amp;ClearStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterFieldStartPosition,&lt;br /&gt;
	&amp;amp;ClearFieldStartPositionList,&lt;br /&gt;
	&amp;amp;RegisterPathList,&lt;br /&gt;
	&amp;amp;ClearPathListList,&lt;br /&gt;
	&amp;amp;RegisterCharacterPVM,&lt;br /&gt;
	&amp;amp;ClearCharacterPVMList,&lt;br /&gt;
	&amp;amp;RegisterCommonObjectPVM,&lt;br /&gt;
	&amp;amp;ClearCommonObjectPVMList,&lt;br /&gt;
	&amp;amp;RegisterTrialLevel,&lt;br /&gt;
	&amp;amp;ClearTrialLevelList,&lt;br /&gt;
	&amp;amp;RegisterTrialSubgame,&lt;br /&gt;
	&amp;amp;ClearTrialSubgameList,&lt;br /&gt;
	&amp;amp;GetMainSavePath,&lt;br /&gt;
	&amp;amp;GetChaoSavePath,&lt;br /&gt;
	&amp;amp;GetReplaceablePath,&lt;br /&gt;
	&amp;amp;_ReplaceFile,&lt;br /&gt;
	&amp;amp;SetWindowTitle,&lt;br /&gt;
	&amp;amp;RegisterSoundList,&lt;br /&gt;
	&amp;amp;RegisterMusicFile,&lt;br /&gt;
	&amp;amp;LoadEXEData,&lt;br /&gt;
	&amp;amp;LoadDLLData,&lt;br /&gt;
	&amp;amp;_ReplaceFileForce,&lt;br /&gt;
	&amp;amp;PushScaleUI,&lt;br /&gt;
	&amp;amp;PopScaleUI,&lt;br /&gt;
	&amp;amp;SetScaleFillMode,&lt;br /&gt;
	&amp;amp;GetScaleFillMode,&lt;br /&gt;
	&amp;amp;ReplaceTexture,&lt;br /&gt;
	&amp;amp;MipmapBlacklistGBIX,&lt;br /&gt;
	&amp;amp;RegisterEnglishVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterJapaneseVoiceDuration,&lt;br /&gt;
	&amp;amp;RegisterCharacterWelds,&lt;br /&gt;
	&amp;amp;loaderSettings,&lt;br /&gt;
	&amp;amp;modList,&lt;br /&gt;
	&amp;amp;weightFuncs,&lt;br /&gt;
	&amp;amp;RegisterVoice,&lt;br /&gt;
	&amp;amp;PushInterpolationFix,&lt;br /&gt;
	&amp;amp;PopInterpolationFix,&lt;br /&gt;
	&amp;amp;RegisterPermanentTexlist,&lt;br /&gt;
	&amp;amp;ExpandPVMList,&lt;br /&gt;
	&amp;amp;UnreplaceFile,&lt;br /&gt;
	&amp;amp;PrintDebugUnicode,&lt;br /&gt;
	&amp;amp;PrintDebugLocal,&lt;br /&gt;
	&amp;amp;PrintDebugCodepage,&lt;br /&gt;
	&amp;amp;GetFileModIndex,&lt;br /&gt;
	&amp;amp;ReplaceFileAtIndex&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (globalHelperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
        PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weight Functions ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
BasicWeightFuncs weightFuncs;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a new Start Position for the specified character.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID &lt;br /&gt;
    0,                          // Act ID&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Position&lt;br /&gt;
    0                           // Y Rotation&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
globalHelperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Running this inside of your mod&#039;s Init export would&lt;br /&gt;
// clear all of Sonic&#039;s Start Positions for his stages.&lt;br /&gt;
globalHelperFunctions.ClearStartPositionList(Characters_Sonic);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Field Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterFieldStartPosition(unsigned char character, const FieldStartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Field Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearFieldStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Path List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterPathList(const PathDataPtr&amp;amp; paths)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Path List List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearPathListList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Character PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCharacterPVM(unsigned char character, const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Character PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCharacterPVMList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Common Object PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCommonObjectPVM(const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Common Object PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCommonObjectPVMList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Level ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialLevel(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Level List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialLevelList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Subgame ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialSubgame(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Subgame List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialSubgameList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const char* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Sound List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterSoundList(const SoundList&amp;amp; list)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Music File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterMusicFile(const MusicInfo&amp;amp; track)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load EXE Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadEXEData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load DLL Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadDLLData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File Force ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFileForce(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Push Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushScaleUI(uiscale::Align align, bool is_background, float ratio_h, float ratio_v)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pop Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopScaleUI()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetScaleFillMode(uiscale::FillMode mode)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uiscale::FillMode GetScaleFillMode()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mipmap Blacklist GBIX ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void MipmapBlacklistGBIX(Uint32 index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register English Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEnglishVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Japanese Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterJapaneseVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Character Welds ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterCharacterWelds(const uint8_t character, const char* iniPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN, uint16_t durationJP, uint16_t durationEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Permanent Texlist ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterPermanentTexlist(NJS_TEXLIST* texlist)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Expand PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TEX_PVMTABLE* ExpandPVMList(TEX_PVMTABLE* sourcepvmlist, const TEX_PVMTABLE &amp;amp;newpvmentry)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Unicode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugUnicode(char* utf8)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Local ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugLocal(char* buf)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Print Debug Codepage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PrintDebugCodepage(char* buf, unsigned int source_cp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get File Mod Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int GetFileModIndex(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File At Index ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceFileAtIndex(const char* src, const char* dst, int modIndex)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=217</id>
		<title>SADX Mod Loader</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=SADX_Mod_Loader&amp;diff=217"/>
		<updated>2025-10-04T14:29:58Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Adding initial SADX Mod Loader page + documentation.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://github.com/X-Hax/sadx-mod-loader/ Source Code]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= HelperFunctions API =&lt;br /&gt;
&lt;br /&gt;
== Struct ==&lt;br /&gt;
Below is the initialized version of the HelperFunctions struct. For the definition of the struct, you can find that in [https://github.com/X-Hax/sadx-mod-loader/blob/master/SADXModLoader/include/SADXModInfo.h SADXModInfo.h] &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
HelperFunctions helperFunctions =&lt;br /&gt;
{&lt;br /&gt;
    ModLoaderVer,&lt;br /&gt;
    &amp;amp;RegisterStartPosition,&lt;br /&gt;
    &amp;amp;ClearStartPositionList,&lt;br /&gt;
    &amp;amp;RegisterFieldStartPosition,&lt;br /&gt;
    &amp;amp;ClearFieldStartPositionList,&lt;br /&gt;
    &amp;amp;RegisterPathList,&lt;br /&gt;
    &amp;amp;ClearPathListList,&lt;br /&gt;
    &amp;amp;RegisterCharacterPVM,&lt;br /&gt;
    &amp;amp;ClearCharacterPVMList,&lt;br /&gt;
    &amp;amp;RegisterCommonObjectPVM,&lt;br /&gt;
    &amp;amp;ClearCommonObjectPVMList,&lt;br /&gt;
    &amp;amp;RegisterTrialLevel,&lt;br /&gt;
    &amp;amp;ClearTrialLevelList,&lt;br /&gt;
    &amp;amp;RegisterTrialSubgame,&lt;br /&gt;
    &amp;amp;ClearTrialSubgameList,&lt;br /&gt;
    &amp;amp;GetMainSavePath,&lt;br /&gt;
    &amp;amp;GetChaoSavePath,&lt;br /&gt;
    &amp;amp;GetReplaceablePath,&lt;br /&gt;
    &amp;amp;_ReplaceFile,&lt;br /&gt;
    &amp;amp;SetWindowTitle,&lt;br /&gt;
    &amp;amp;RegisterSoundList,&lt;br /&gt;
    &amp;amp;RegisterMusicFile,&lt;br /&gt;
    &amp;amp;LoadEXEData,&lt;br /&gt;
    &amp;amp;LoadDLLData,&lt;br /&gt;
    &amp;amp;_ReplaceFileForce,&lt;br /&gt;
    &amp;amp;PushScaleUI,&lt;br /&gt;
    &amp;amp;PopScaleUI,&lt;br /&gt;
    &amp;amp;SetScaleFillMode,&lt;br /&gt;
    &amp;amp;GetScaleFillMode,&lt;br /&gt;
    &amp;amp;ReplaceTexture,&lt;br /&gt;
    &amp;amp;MipmapBlacklistGBIX,&lt;br /&gt;
    &amp;amp;RegisterEnglishVoiceDuration,&lt;br /&gt;
    &amp;amp;RegisterJapaneseVoiceDuration,&lt;br /&gt;
    &amp;amp;RegisterCharacterWelds,&lt;br /&gt;
    &amp;amp;loaderSettings,&lt;br /&gt;
    &amp;amp;modList,&lt;br /&gt;
    &amp;amp;weightFuncs,&lt;br /&gt;
    &amp;amp;RegisterVoice,&lt;br /&gt;
    &amp;amp;PushInterpolationFix,&lt;br /&gt;
    &amp;amp;PopInterpolationFix,&lt;br /&gt;
    &amp;amp;RegisterPermanentTexlist,&lt;br /&gt;
    &amp;amp;ExpandPVMList,&lt;br /&gt;
    &amp;amp;UnreplaceFile,&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Version ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int ModLoaderVer;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the version of the mod loader. This can be used to check if the user has an old version of the mod loader that may not have functionality your mod requires.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
if (globalHelperFunctions.ModLoaderVer &amp;lt;= 10)&lt;br /&gt;
        PrintDebug(&amp;quot;This Mod Loader is way out of date.\n&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod Loader Settings ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
LoaderSettings loaderSettings;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mod List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
std::vector&amp;lt;Mod&amp;gt; modlist;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weight Functions ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
BasicWeightFuncs weightFuncs;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
&lt;br /&gt;
=== Register Start Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterStartPosition(unsigned char character, const StartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Registers a new Start Position for the specified character.&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
StartPosition myStageStartPos = { &lt;br /&gt;
    1,                          // Level ID &lt;br /&gt;
    0,                          // Act ID&lt;br /&gt;
    { 100.0f, 200.0f, 100.0f }, // Position&lt;br /&gt;
    0                           // Y Rotation&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// We pass our StagePosition variable as a pointer to this function&lt;br /&gt;
// and we have specified Sonic, so the level for this ID would now use&lt;br /&gt;
// our StartPosition instead of the original.&lt;br /&gt;
globalHelperFunctions.RegisterStartPosition(Characters_Sonic, &amp;amp;myStageStartPos);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Clears the Start Positions for the specified character. &lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Running this inside of your mod&#039;s Init export would&lt;br /&gt;
// clear all of Sonic&#039;s Start Positions for his stages.&lt;br /&gt;
globalHelperFunctions.ClearStartPositionList(Characters_Sonic);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Field Position ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterFieldStartPosition(unsigned char character, const FieldStartPosition&amp;amp; position)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Field Start Position List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearFieldStartPositionList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Path List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterPathList(const PathDataPtr&amp;amp; paths)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Path List List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearPathListList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Character PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCharacterPVM(unsigned char character, const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Character PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCharacterPVMList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Common Object PVM ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterCommonObjectPVM(const PVMEntry&amp;amp; pvm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Common Object PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearCommonObjectPVMList()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Level ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialLevel(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Level List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialLevelList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Trial Subgame ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void RegisterTrialSubgame(unsigned char character, const TrialLevelListEntry&amp;amp; level)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Clear Trial Subgame List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static void ClearTrialSubgameList(unsigned char character)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Main Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetMainSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Chao Save Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
static const char* GetChaoSavePath()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Replaceable Path ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
const char* __cdecl GetReplaceablePath(const char* path)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFile(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set Window Title ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetWindowTitle(const char* title)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Sound List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterSoundList(const SoundList&amp;amp; list)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Music File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
int RegisterMusicFile(const MusicInfo&amp;amp; track)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load EXE Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadEXEData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Load DLL Data ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void LoadDLLData(const wchar_t* filename, const wchar_t* mod_dir)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace File Force ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void _ReplaceFileForce(const char* src, const char* dst)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Push Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushScaleUI(uiscale::Align align, bool is_background, float ratio_h, float ratio_v)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pop Scale UI ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopScaleUI()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Set Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void SetScaleFillMode(uiscale::FillMode mode)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get Scale Fill Mode ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uiscale::FillMode GetScaleFillMode()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Replace Texture ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void ReplaceTexture(const char* pvm_name, const char* tex_name, const char* file_path, uint32_t gbix, uint32_t width, uint32_t height)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mipmap Blacklist GBIX ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void MipmapBlacklistGBIX(Uint32 index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register English Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterEnglishVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Japanese Voice Duration ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterJapaneseVoiceDuration(const uint16_t voiceID, const uint16_t duration)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Character Welds ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterCharacterWelds(const uint8_t character, const char* iniPath)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Voice ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
uint16_t RegisterVoice(const char* fileJP, const char* fileEN, uint16_t durationJP, uint16_t durationEN)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Push Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PushInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pop Interpolation Fix ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void PopInterpolationFix()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register Permanent Texlist ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void RegisterPermanentTexlist(NJS_TEXLIST* texlist)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Unreplace File ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
void UnreplaceFile(const char* file)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Expand PVM List ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
TEX_PVMTABLE* ExpandPVMList(TEX_PVMTABLE* sourcepvmlist, const TEX_PVMTABLE &amp;amp;newpvmentry)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Example ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=195</id>
		<title>Mod Loaders</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=195"/>
		<updated>2025-10-03T14:27:57Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Formatting adjustments on spacing and adding separator lines between sub heading groups.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.&lt;br /&gt;
&lt;br /&gt;
Below you&#039;ll find links to documentation pertaining to each mod loader respectively. These include in-depth looks at each one&#039;s specific APIs.&lt;br /&gt;
&lt;br /&gt;
* [[SADX Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
* [[SA2B Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
= Mod Loader Export References =&lt;br /&gt;
&lt;br /&gt;
Below is an overview of the general exports that are available in the mod loaders. An [[Mod_Loaders#Example|example]] of a complete export can be seen below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Variable Exports ==&lt;br /&gt;
&lt;br /&gt;
=== ModInfo ===&lt;br /&gt;
ModInfo is a required export from any code based mod. Without it, the mod loader will not load the mod and will throw an error alerting the user that a mod is not a valid mod.&lt;br /&gt;
&amp;lt;---&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Example of exporting the ModInfo for SADX.&lt;br /&gt;
__declspec(dllexport) ModInfo SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
// Example of exporting the ModInfo for SA2B.&lt;br /&gt;
__declspec(dllexport) ModInfo SA2ModInfo = { ModLoaderVer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Function Exports ==&lt;br /&gt;
The mod loaders support loading various function exports from a mod. While these are all optional, many mods make use of at least one of these exports as their entry point. This is most commonly the [[Mod_Loaders#Init|Init]] export.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Init ===&lt;br /&gt;
The Init (short for Initialize) export is used for initializing information within your mod and passing some variables from the mod loader into the mod itself. The include the mod&#039;s path (local path to the mod folder from the game&#039;s root), HelperFunctions (see each respective page for each mod loader for more information on this struct), and the mod&#039;s index in the list.&lt;br /&gt;
&lt;br /&gt;
This is fired for all enabled mods first. It&#039;s fired in the order in which mods are loaded (top to bottom).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void Init(const char* path, HelperFunctions&amp;amp; helperFunctions, const unsigned int index)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnInitEnd ===&lt;br /&gt;
This is run after all mods have finished running their Init, but before the game has completely loaded. This is useful for any mods making APIs for other mods to utilize. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NOTE: This is only available in the SADX Mod Loader at this time.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInitEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnFrame ===&lt;br /&gt;
This export will run every frame. This can be useful if you need to check something within the game constantly. Users who utilize this should consider cautionary measures to prevent running large amounts of logic every frame if it can be avoided for performance reasons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnFrame()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnInput ===&lt;br /&gt;
This export will run when the game processes input. More specifically, it will run just prior to the game actually processing that input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInput()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnControl ===&lt;br /&gt;
This export will run while the game is actively processing input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnControl()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneStart ===&lt;br /&gt;
This export will run just before a game scene is rendered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneStart()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneEnd ===&lt;br /&gt;
This export will run just after a game scene has finished rendering.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceReset ===&lt;br /&gt;
This export will run whenever the render device for the game is reset. For example, resizing the game window will cause the render device to be reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceReset()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceLost ===&lt;br /&gt;
This export will run whenever a game scene fails to render.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceLost()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnExit ===&lt;br /&gt;
This export runs just prior to the game completely closing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnExit()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exportable Lists == &lt;br /&gt;
The mod loaders also have support for exporting different types of lists. These are all optional exports.&lt;br /&gt;
&lt;br /&gt;
=== Patch List ===&lt;br /&gt;
A PatchList is comprised of an array of PatchInfo entries. The mod loader will generate these using WriteData.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Jumps, Calls, and Pointer Lists ===&lt;br /&gt;
These three exportable lists are all comprised of an array of PointerInfo entries. On the mod loader&#039;s side, these arrays are handled like so:&lt;br /&gt;
* Jumps are generated using WriteJump.&lt;br /&gt;
* Calls are generated using WriteCall.&lt;br /&gt;
* Pointers are generated using WriteData.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert examples.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Example = &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line copy&amp;gt;&lt;br /&gt;
// Inside of your mod&#039;s &amp;quot;main&amp;quot; cpp file (or whichever one houses your exports).&lt;br /&gt;
#include &amp;quot;pch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelperFunctions globalHelperFunctions;&lt;br /&gt;
const char* globalPath;&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    __declspec(dllexport) SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    __declspec(dllexport) Init(const char* path, HelperFunctions &amp;amp;helperFunctions, const unsigned int index)&lt;br /&gt;
    {&lt;br /&gt;
        // This passes the Mod Loader&#039;s HelperFunctions struct to your mod&#039;s.&lt;br /&gt;
        // This is necessary so the API related functions can work properly.&lt;br /&gt;
        globalHelperFunctions = helperFunctions;&lt;br /&gt;
&lt;br /&gt;
        // This passes the mod&#039;s local folder path to the mod itself.&lt;br /&gt;
        // This is helpful for loading custom files.&lt;br /&gt;
        globalPath = path;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=194</id>
		<title>Mod Loaders</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=194"/>
		<updated>2025-10-03T14:08:48Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.&lt;br /&gt;
&lt;br /&gt;
Below you&#039;ll find links to documentation pertaining to each mod loader respectively. These include in-depth looks at each one&#039;s specific APIs.&lt;br /&gt;
&lt;br /&gt;
* [[SADX Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
* [[SA2B Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
= Mod Loader Export References =&lt;br /&gt;
&lt;br /&gt;
Below is an overview of the general exports that are available in the mod loaders. An [[Mod_Loaders#Example|example]] of a complete export can be seen below.&lt;br /&gt;
&lt;br /&gt;
== Variable Exports ==&lt;br /&gt;
&lt;br /&gt;
=== ModInfo ===&lt;br /&gt;
ModInfo is a required export from any code based mod. Without it, the mod loader will not load the mod and will throw an error alerting the user that a mod is not a valid mod.&lt;br /&gt;
&amp;lt;---&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// Example of exporting the ModInfo for SADX.&lt;br /&gt;
__declspec(dllexport) ModInfo SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
// Example of exporting the ModInfo for SA2B.&lt;br /&gt;
__declspec(dllexport) ModInfo SA2ModInfo = { ModLoaderVer };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Function Exports ==&lt;br /&gt;
The mod loaders support loading various function exports from a mod. While these are all optional, many mods make use of at least one of these exports as their entry point. This is most commonly the [[Mod_Loaders#Init|Init]] export.&lt;br /&gt;
&lt;br /&gt;
=== Init ===&lt;br /&gt;
The Init (short for Initialize) export is used for initializing information within your mod and passing some variables from the mod loader into the mod itself. The include the mod&#039;s path (local path to the mod folder from the game&#039;s root), HelperFunctions (see each respective page for each mod loader for more information on this struct), and the mod&#039;s index in the list.&lt;br /&gt;
&lt;br /&gt;
This is fired for all enabled mods first. It&#039;s fired in the order in which mods are loaded (top to bottom).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void Init(const char* path, HelperFunctions&amp;amp; helperFunctions, const unsigned int index)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnInitEnd ===&lt;br /&gt;
This is run after all mods have finished running their Init, but before the game has completely loaded. This is useful for any mods making APIs for other mods to utilize. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;NOTE: This is only available in the SADX Mod Loader at this time.&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInitEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnFrame ===&lt;br /&gt;
This export will run every frame. This can be useful if you need to check something within the game constantly. Users who utilize this should consider cautionary measures to prevent running large amounts of logic every frame if it can be avoided for performance reasons.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnFrame()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnInput ===&lt;br /&gt;
This export will run when the game processes input. More specifically, it will run just prior to the game actually processing that input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnInput()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnControl ===&lt;br /&gt;
This export will run while the game is actively processing input.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnControl()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneStart ===&lt;br /&gt;
This export will run just before a game scene is rendered.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneStart()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderSceneEnd ===&lt;br /&gt;
This export will run just after a game scene has finished rendering.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderSceneEnd()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceReset ===&lt;br /&gt;
This export will run whenever the render device for the game is reset. For example, resizing the game window will cause the render device to be reset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceReset()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnRenderDeviceLost ===&lt;br /&gt;
This export will run whenever a game scene fails to render.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnRenderDeviceLost()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OnExit ===&lt;br /&gt;
This export runs just prior to the game completely closing.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; copy&amp;gt;&lt;br /&gt;
__declspec(dllexport) void OnExit()&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exportable Lists == &lt;br /&gt;
The mod loaders also have support for exporting different types of lists. These are all optional exports.&lt;br /&gt;
&lt;br /&gt;
=== Patch List ===&lt;br /&gt;
A PatchList is comprised of an array of PatchInfo entries. The mod loader will generate these using WriteData.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert example.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Jumps, Calls, and Pointer Lists ===&lt;br /&gt;
These three exportable lists are all comprised of an array of PointerInfo entries. On the mod loader&#039;s side, these arrays are handled like so:&lt;br /&gt;
* Jumps are generated using WriteJump.&lt;br /&gt;
* Calls are generated using WriteCall.&lt;br /&gt;
* Pointers are generated using WriteData.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// TODO: Insert examples.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Example = &lt;br /&gt;
 &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot; line copy&amp;gt;&lt;br /&gt;
// Inside of your mod&#039;s &amp;quot;main&amp;quot; cpp file (or whichever one houses your exports).&lt;br /&gt;
#include &amp;quot;pch.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
HelperFunctions globalHelperFunctions;&lt;br /&gt;
const char* globalPath;&lt;br /&gt;
&lt;br /&gt;
extern &amp;quot;C&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
    __declspec(dllexport) SADXModInfo = { ModLoaderVer };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    __declspec(dllexport) Init(const char* path, HelperFunctions &amp;amp;helperFunctions, const unsigned int index)&lt;br /&gt;
    {&lt;br /&gt;
        // This passes the Mod Loader&#039;s HelperFunctions struct to your mod&#039;s.&lt;br /&gt;
        // This is necessary so the API related functions can work properly.&lt;br /&gt;
        globalHelperFunctions = helperFunctions;&lt;br /&gt;
&lt;br /&gt;
        // This passes the mod&#039;s local folder path to the mod itself.&lt;br /&gt;
        // This is helpful for loading custom files.&lt;br /&gt;
        globalPath = path;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=176</id>
		<title>Mod Loaders</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Mod_Loaders&amp;diff=176"/>
		<updated>2025-10-03T11:36:50Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Created page with &amp;quot;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.  Below you&amp;#039;ll find links to documentation pertaining to each mod loader respectively.  * SADX Mod Loader  * SA2B Mod Loader&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Mod Loaders are Dynamic Link Libraries (DLL) files that inject themselves into the Sonic Adventure titles by replacing existing DLL files from the game. This is what allows mods to exist external to editing the existing files within the game as well as inject their own code into the game.&lt;br /&gt;
&lt;br /&gt;
Below you&#039;ll find links to documentation pertaining to each mod loader respectively.&lt;br /&gt;
&lt;br /&gt;
* [[SADX Mod Loader]]&lt;br /&gt;
&lt;br /&gt;
* [[SA2B Mod Loader]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Main_Page&amp;diff=175</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Main_Page&amp;diff=175"/>
		<updated>2025-10-03T11:24:27Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Updating links to point to same named pages.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to SA Docs, the main knowledge base for Sonic Adventure modding!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the latest attempt by the [[X-hax|x-hax community]] to document mod development and tools for SADX/SA2.&lt;br /&gt;
&lt;br /&gt;
We need your help! If you have experience with mods or tools, please register an account and help us transfer pages from the [[Other wikis|older wikis]]. You can also create new pages for the tools that haven&#039;t been documented, or write tutorials on modding. To contribute, please register an account and ask on the #sa-docs channel on the [https://discord.gg/gqJCF47 x-hax Discord server] to get editing permissions.&lt;br /&gt;
&lt;br /&gt;
== Categories ==&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
[[Installing mods]]&lt;br /&gt;
&lt;br /&gt;
[[Creating mods]]&lt;br /&gt;
&lt;br /&gt;
[[Ripping assets]]&lt;br /&gt;
=== Modding software ===&lt;br /&gt;
[[SA Tools]]&lt;br /&gt;
&lt;br /&gt;
[https://x-hax.github.io/SonicAdventureBlenderIO/ SAIO Blender add-on]&lt;br /&gt;
&lt;br /&gt;
[[Mod Loaders]]&lt;br /&gt;
&lt;br /&gt;
[[Mod Managers]]&lt;br /&gt;
&lt;br /&gt;
[[Mod Installers]]&lt;br /&gt;
&lt;br /&gt;
[[Game Launchers]]&lt;br /&gt;
&lt;br /&gt;
[[Other tools]]&lt;br /&gt;
&lt;br /&gt;
=== Games ===&lt;br /&gt;
[[Sonic Adventure]] and its ports&lt;br /&gt;
&lt;br /&gt;
[[Sonic Adventure 2]] and its ports&lt;br /&gt;
&lt;br /&gt;
Although we focus on SA1/DX and SA2 for the most part, the [[SA Tools]] can be used to view and edit some data in other games. Among such games are:&lt;br /&gt;
&lt;br /&gt;
[[Billy Hatcher|Billy Hatcher and the Giant Egg]]&lt;br /&gt;
&lt;br /&gt;
[[Phantasy Star Online]]&lt;br /&gt;
&lt;br /&gt;
[[Sonic Shuffle]]&lt;br /&gt;
&lt;br /&gt;
[[Skies of Arcadia]]&lt;br /&gt;
&lt;br /&gt;
[[Sonic Heroes]]&lt;br /&gt;
&lt;br /&gt;
[[Shadow the Hedgehog]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
	<entry>
		<id>https://sadocs.unreliable.network/index.php?title=Main_Page&amp;diff=174</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sadocs.unreliable.network/index.php?title=Main_Page&amp;diff=174"/>
		<updated>2025-10-03T11:19:02Z</updated>

		<summary type="html">&lt;p&gt;ItsEasyActually: Adjusting some titles to use a title formatting (e.g. &amp;quot;Mod Loaders&amp;quot; instead of &amp;quot;Mod loaders.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&amp;lt;strong&amp;gt;Welcome to SA Docs, the main knowledge base for Sonic Adventure modding!&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is the latest attempt by the [[X-hax|x-hax community]] to document mod development and tools for SADX/SA2.&lt;br /&gt;
&lt;br /&gt;
We need your help! If you have experience with mods or tools, please register an account and help us transfer pages from the [[Other wikis|older wikis]]. You can also create new pages for the tools that haven&#039;t been documented, or write tutorials on modding. To contribute, please register an account and ask on the #sa-docs channel on the [https://discord.gg/gqJCF47 x-hax Discord server] to get editing permissions.&lt;br /&gt;
&lt;br /&gt;
== Categories ==&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
[[Installing mods]]&lt;br /&gt;
&lt;br /&gt;
[[Creating mods]]&lt;br /&gt;
&lt;br /&gt;
[[Ripping assets]]&lt;br /&gt;
=== Modding software ===&lt;br /&gt;
[[SA Tools]]&lt;br /&gt;
&lt;br /&gt;
[https://x-hax.github.io/SonicAdventureBlenderIO/ SAIO Blender add-on]&lt;br /&gt;
&lt;br /&gt;
[[Mod loaders|Mod Loaders]]&lt;br /&gt;
&lt;br /&gt;
[[Mod managers|Mod Managers]]&lt;br /&gt;
&lt;br /&gt;
[[Mod installers|Mod Installers]]&lt;br /&gt;
&lt;br /&gt;
[[Game launchers|Game Launchers]]&lt;br /&gt;
&lt;br /&gt;
[[Other tools]]&lt;br /&gt;
&lt;br /&gt;
=== Games ===&lt;br /&gt;
[[Sonic Adventure]] and its ports&lt;br /&gt;
&lt;br /&gt;
[[Sonic Adventure 2]] and its ports&lt;br /&gt;
&lt;br /&gt;
Although we focus on SA1/DX and SA2 for the most part, the [[SA Tools]] can be used to view and edit some data in other games. Among such games are:&lt;br /&gt;
&lt;br /&gt;
[[Billy Hatcher|Billy Hatcher and the Giant Egg]]&lt;br /&gt;
&lt;br /&gt;
[[Phantasy Star Online]]&lt;br /&gt;
&lt;br /&gt;
[[Sonic Shuffle]]&lt;br /&gt;
&lt;br /&gt;
[[Skies of Arcadia]]&lt;br /&gt;
&lt;br /&gt;
[[Sonic Heroes]]&lt;br /&gt;
&lt;br /&gt;
[[Shadow the Hedgehog]]&lt;/div&gt;</summary>
		<author><name>ItsEasyActually</name></author>
	</entry>
</feed>