yuzu-mirror.github.io/help/feature/game-modding/index.html

244 lines
13 KiB
HTML

<!DOCTYPE html>
<html lang=" en-us "class="has-navbar-fixed-top">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<meta name="theme-color" content="#404040">
<meta property="og:title" content="Game Modding &middot; yuzu" />
<meta property="og:site_name" content="yuzu" />
<meta property="og:url" content="https://yuzu-mirror.github.io/help/feature/game-modding/" />
<meta property="og:description" content="Game modding features" />
<meta name="description" content="Game modding features" />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://yuzu-mirror.github.io/logo.png" />
<link rel="icon" href="https://yuzu-mirror.github.io/favicon.ico" />
<link rel="shortcut icon" href="https://yuzu-mirror.github.io/favicon.ico" type="image/x-icon" />
<link rel="canonical" href="https://yuzu-mirror.github.io/help/feature/game-modding/">
<title>Game Modding - yuzu</title>
<link href="https://fonts.googleapis.com/css?family=Ubuntu|Dosis" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v6.4.0/css/all.css" rel="stylesheet">
<link rel="stylesheet" href="https://yuzu-mirror.github.io/scss/style.min.css" />
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112443698-1"></script>
<script type="text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'UA-112443698-1');
</script>
</head>
<body>
<nav class="navbar is-dark is-size-6 is-fixed-top" role="navigation" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="https://yuzu-mirror.github.io">
<svg xmlns="http://www.w3.org/2000/svg" class="navbar-logo" viewBox="0 0 515.83 163.11"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#ff3c28;}.cls-3{fill:#0ab9e6;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M515.83,23.23v73c0,14.5-2.24,25.24-6.84,32.82-5.92,10.15-16.2,15.32-30.53,15.32s-24.62-5.23-30.58-15.57c-4.56-7.64-6.79-18.42-6.79-32.92V23.23a4.51,4.51,0,0,1,4.51-4.51h2.28a4.51,4.51,0,0,1,4.51,4.51v72.5c0,33.53,14.88,37.4,26.07,37.4,12.14,0,26.08-4.17,26.08-36.71V23.23a4.51,4.51,0,0,1,4.51-4.51h2.27A4.51,4.51,0,0,1,515.83,23.23Z"/><path class="cls-1" d="M421.34,144.4H353.45c-2.35,0-4.72-1.88-4.72-6.08a8.32,8.32,0,0,1,1.33-4.49L410.39,29.36H360.8a4.51,4.51,0,0,1-4.51-4.5V23.28a4.51,4.51,0,0,1,4.48-4.51h.81c58.68-.11,59.11,0,59.66.07a5.19,5.19,0,0,1,4,5.8,8.74,8.74,0,0,1-1.32,3.75L363.33,133.17h58a4.51,4.51,0,0,1,4.51,4.51v2.21A4.51,4.51,0,0,1,421.34,144.4Z"/><path class="cls-1" d="M248.45,23.23v82.06c0,26-11.8,38.44-37.12,39.09h-.12a4.51,4.51,0,0,1-4.51-4.51V137.5a4.51,4.51,0,0,1,4.48-4.5c18.49-.15,26-8.23,26-27.9v-2.37a32.34,32.34,0,0,1-3.34,3.28c-6.39,5.5-14.5,8.29-24.07,8.29-22.86,0-35-12.41-35-35.89V23.23a4.52,4.52,0,0,1,4.51-4.51h2.22a4.52,4.52,0,0,1,4.5,4.51v55c0,7.6,1.82,14.22,5,18.18,3.57,4.56,9.17,6.49,18.75,6.49,10.13,0,17.32-3.76,22-11.5,3.61-5.92,5.43-13.66,5.43-23V23.23a4.52,4.52,0,0,1,4.51-4.51h2.22A4.52,4.52,0,0,1,248.45,23.23Z"/><path class="cls-1" d="M338.12,23.23v73c0,14.5-2.24,25.24-6.84,32.82-5.92,10.15-16.2,15.32-30.53,15.32s-24.62-5.23-30.58-15.57c-4.56-7.64-6.79-18.42-6.79-32.92V23.23a4.51,4.51,0,0,1,4.51-4.51h2.28a4.51,4.51,0,0,1,4.51,4.51v72.5c0,33.53,14.88,37.4,26.07,37.4,12.14,0,26.08-4.17,26.08-36.71V23.23a4.51,4.51,0,0,1,4.51-4.51h2.27A4.51,4.51,0,0,1,338.12,23.23Z"/><g id="g823"><g id="right"><g id="g827"><g id="g833"><path id="path835" class="cls-2" d="M81.56,32.62V163.11a65.25,65.25,0,0,0,0-130.49M94.3,46.91a52.54,52.54,0,0,1,0,101.91V46.91"/></g></g></g><g id="left"><g id="g839"><g id="g845"><path id="path847" class="cls-3" d="M65.24,0a65.25,65.25,0,0,0,0,130.49ZM52.5,14.29V116.2A52.52,52.52,0,0,1,28.12,28.12,52.16,52.16,0,0,1,52.5,14.29"/></g></g></g></g></g></g></svg>
</a>
<div class="burger navbar-burger is-dark" data-target="navMenu">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="navbar-menu" id="navMenu">
<div class="navbar-start">
<a class="navbar-item px-lg" href="/entry">
Blog
</a>
<a class="navbar-item px-lg" href="/downloads">
Download
</a>
<a class="navbar-item px-lg" href="/wiki/faq">
FAQs
</a>
<a class="navbar-item px-lg" href="/game">
Compatibility
</a>
<a class="navbar-item px-lg" href="/screenshots">
Screenshots
</a>
<a class="navbar-item px-lg" href="https://www.patreon.com/yuzuteam">
Patreon
</a>
<a class="navbar-item px-lg" href="https://profile.yuzu-mirror.github.io">
Profile
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://discord.gg/u77vRWY" target="_blank">
<i class="fab fa-discord mr-sm"></i> Discord
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://twitter.com/yuzuemu" target="_blank">
<i class="fab fa-twitter mr-sm"></i> Twitter
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://github.com/yuzu-mirror/yuzu" target="_blank">
<i class="fab fa-github mr-sm"></i> GitHub
</a>
</div>
<div class="navbar-end">
<a class="navbar-item px-lg is-hidden-touch" href="https://discord.gg/u77vRWY" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-discord"></i>
</span>
</a>
<a class="navbar-item px-lg is-hidden-touch" href="https://twitter.com/yuzuemu" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-twitter"></i>
</span>
</a>
<a class="navbar-item px-lg is-hidden-touch" href="https://github.com/yuzu-mirror/yuzu" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-github"></i>
</span>
</a>
</div>
</div>
</div>
</nav>
<section class="section" style="padding-bottom: 0px;">
<div class="container">
<a href="/help/">
<article class="message">
<div class="message-body">
<span class="icon">
<i class="fas fa-arrow-circle-left"></i>
</span>
Return to the previous page.
</div>
</article>
</a>
</div>
</section>
<div class="container">
<div class="columns is-centered">
<div class="column is-four-fifths">
<section class="section">
<h1 class="title">Game Modding</h1>
<div class="content">
<h1 id="game-modding">Game Modding</h1>
<p>Yuzu has a powerful modding framework allowing for multiple formats of patches, flexibility in distribution, and easy organization and change.</p>
<h3 id="directory-structure">Directory Structure</h3>
<p>The following is an example of a mod in yuzu.<br>
Each one is its own directory within the Mod Data dir that can be opened by right-clicking on the game in yuzu (alternatively <code>%YUZU_DIR%/load/&lt;title_id&gt;</code>)</p>
<pre tabindex="0"><code>mod_directory
- exefs
- romfs
- romfs_ext
</code></pre><h4 id="exefs">ExeFS</h4>
<p>The ExeFS dir contains patches for the game&rsquo;s executable(s).
These types of mods typically alter game behavior or logic.
Currently this translates to two types of patches: <code>IPS</code> and <code>IPSwitch</code>.</p>
<p>To use an <code>IPS</code> patch, create a file with the NSO build ID as the name and <code>.ips</code> as the extension and put it in the ExeFS dir.
More details on the <code>IPS</code> format can be found on <a href="https://zerosoft.zophar.net/ips.php">ZeroSoft</a>.</p>
<p>For <code>IPSwitch</code>, the filename can be whatever you want as long as the extension is <code>.pchtxt</code> and it contains a NSO build ID.
More details on the <code>IPSwitch</code> format can be found on it&rsquo;s <a href="https://github.com/3096/ipswitch">GitHub repo</a>.</p>
<h4 id="romfs">RomFS</h4>
<p>The RomFS dir contains replacements for the game&rsquo;s assets and general files.
These types of mods typically alter a game&rsquo;s textures, text, fonts, sounds, or other graphical assets.
If this directory is not empty, yuzu will combine the contents of it with the base game with files from this directory taking precedence over the base.
This technique is called LayeredFS.</p>
<pre tabindex="0"><code>It is important to note that for this to work properly,
the directory structure of the game has to be mirrored in this dir.
</code></pre><p>It is much easier to get started with a RomFS mod than an ExeFS mod.
To dump the game&rsquo;s RomFS, right-click on the game and select <code>Dump RomFS</code>.
Selecting full will extract everything while skeleton will only create the directories.
The output of this will be opened after the dump and can be found at <code>%YUZU_DIR%/dump/&lt;title id&gt;</code>.</p>
<h4 id="romfs-extension-romfs_ext">RomFS Extension (romfs_ext)</h4>
<p>The RomFS Extension dir contains patches and stubs for romfs files.
This allows modders to delete files within the romfs if a file of the same name but the extension <code>.stub</code> is found at the same directory within <code>romfs_ext</code>.
Similarly, if a file with the same name but with extension <code>.ips</code> is found at the same directory within <code>romfs_ext</code>, the base game file will be patched with it.</p>
<h3 id="example">Example</h3>
<p>For example, let&rsquo;s examine Splatoon 2, a popular game for modding.</p>
<p>Since Splatoon 2&rsquo;s title id is <code>01003BC0000A0000</code>, all of our mods for this game will go in <code>%YUZU_DIR%/load/01003BC0000A0000</code>.</p>
<p>Say we have two mods to play with, Mod X and Mod Y.
Therefore, we would make two directories in the <code>01003BC0000A0000</code> folder, one called &ldquo;Mod X&rdquo; and one called &ldquo;Mod Y&rdquo;.</p>
<p>Within the &ldquo;Mod X&rdquo; folder, there are the <code>exefs</code>, <code>romfs</code>, and <code>romfs_ext</code> directories provided by the author.
It is okay to omit one (or more) of them if it is empty. Additionally, if the mod folder is empty yuzu will ignore it.</p>
<h3 id="conclusion">Conclusion</h3>
<p>If you are a modder looking to distribute mods for yuzu and have another question or found part of this guide confusing, feel free to come ask in out discord.</p>
<p>If you are a user trying to install a mod for yuzu and it seems like a critical piece of the puzzle is missing, try asking the mod author for help. Otherwise, feel free to come ask in the discord.</p>
</div>
</section>
</div>
<div class="column">
<div class="px-md">
<ins class="adsbygoogle"
style="display:block; margin-left:25px;"
data-ad-client="ca-pub-4126545610079023"
data-ad-slot="6276099127"
data-ad-format="auto"></ins>
<br>
<p class="is-size-6 has-text-centered">Advertisement</p>
</div>
</div>
</div>
<div class="column">
<div class="px-md has-text-centered">
<p class="is-size-6 has-text-centered">Advertisement</p>
<br>
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:100px" data-ad-client="ca-pub-4126545610079023" data-ad-slot="1038554045"></ins>
</div>
</div>
</div>
<div class="container">
<footer class="footer">
<div class="content has-text-centered">
copyright &copy; 2025 yuzu emulator team
</div>
</footer>
</div>
<script src="https://yuzu-mirror.github.io/js/script.min.js"></script>
<script type="text/javascript">
for (var i = 0; i < document.getElementsByClassName('adsbygoogle').length; i++) {
(adsbygoogle = window.adsbygoogle || []).push({});
}
</script>
</body>
</html>