Mods, Skyline Plugins & Custom Fighters
Manage GameBanana skins, extra c08+/c120+ character slots, native ARCropolis & Smashline 2 hooks, and ahead-of-time recompiled Skyline plugin.nro movesets.
- Built-in ARCropolis & CSK
- Rust plugin.nro -> C
- Mod Check & Share (#124)
- hook.h & C++ ACMD

Installing & managing GameBanana mods in OpenSmash.exe
OpenSmash-Ultimate includes a full mod manager inside OpenSmash.exe’s Mods view (as well as launchers\WindowSmash Mods.bat on Windows and the web-app Mods tab in opensmash-launcher.sh / OpenSmash Launcher.command on Linux and macOS). Every surface reads and writes the same mods\mods.json manifest:
- One-click browse & archive import: Browse GameBanana’s Super Smash Bros. Ultimate catalog directly or install local
.zip,.7z, or.rarmod packages (Linux usesbsdtar,7zz,py7zr, orunrar). - Check (Conflicts & Updates, PR #124): Clicking Check (or running
python tools/mods.py conflictsandupdates) lists any files modified by two enabled mods simultaneously and checks GameBanana for newer versions. - Share (Modpack Lists, PR #124): Clicking Share (
tools/mods.py export-list/import-list) exports your active mod list into a lightweight shareable file so friends in an online room can install the exact same mod set automatically. - Clean unmodded toggle: ARCropolis code patches default to
auto: enabled whenever at least one mod is active, and completely bypassed when all mods are off so unmodded matches run stock 13.0.5 code.
Native runtime replacements: what NOT to install
On a modded Switch console, moveset and character mods require several helper .nro plugins in skyline/plugins/. In OpenSmash-Ultimate, do not install standalone dependency NROs because the host runtime provides them natively for version 13.0.5:
| Console Dependency | How OpenSmash-Ultimate Provides It Natively |
|---|---|
| ARCropolis | Provided natively in the runtime (mods:/ virtual mount, c08+ extra costume code patches set to auto, arcrop_is_mod_enabled, and event callbacks). Do not install libarcropolis.nro. |
| Smashline 2 (v2.0 & v1.6) | Implemented natively in runtime/hle_skyline.c via dispatch-table agent factory hooks, plus automatic symbol adapters so both Smashline 2.0 and legacy 1.6 clone_weapon plugins run. Do not install libsmashline_plugin.nro. |
| lib_paramconfig | tools/paramconfig.py + runtime/hle_paramconfig.c parse each enabled mod’s config_param.toml into dump/skyline/paramconfig.json natively without hanging on the console NRO. |
| CSK Collection (Custom Fighters) | Decoded natively into dump/skyline/csk.json and merged by tools/csk.py into ui_chara_db.prc / ui_layout_db.prc, redirecting extra slots (c120+) to standalone Character Select Screen icons (PR #130 scales the CSS to any fighter count). |
How Skyline Rust plugin.nro movesets run natively on PC
GameBanana movesets ship compiled ARM64 Rust code (plugin.nro built with skyline-rs). Because an x86-64 PC cannot execute ARM64 binaries directly, tools/skyline.py statically recompiles each enabled mod’s plugin.nro to C and links it into your game build:
- Tail-branch function discovery (99.9% coverage): Rust plugins compile with
panic=abortand strip unwind tables, sorecomp.tail_entriestraces tail branches to a fixpoint and disables cross-function register caching where LLVM’s machine outliner shares callee-saved registers. - Synthesized C++ exception unwind tables (
tools/plugin_eh.py): When a move is interrupted mid-animation,L2CAgentBase::coroutine_yieldthrows a C++ exception across the ACMD script stack.plugin_eh.pyreconstructs an.eh_frame_hdrtable from every Rust function prologue solibunwindcleanly unwinds interrupted custom moves without triggeringsvcBreak. - Dispatch-table function hooking (
A64HookFunction): Indirect calls swap entries inrt_lookupwith zero game rebuild; direct call targets listed indump/skyline/hooks.txtwrap throughrt_lookupand rebuild in ~1–2 minutes (tools/skyline.py build --jobs 2). - Headless CSK discovery probe: During
Apply/Build plugins into the game,SSBU_SKYLINE_PROBE=1boots once headlessly in an isolated temporary directory to record custom character entries intodump/skyline/csk.json.
| Studied GameBanana Mod | Plugin Binary | Upstream Recompilation & Test Result |
|---|---|---|
Sonic Re-Imagined v3.2 (GB 443018) | sonic_reimagined (172 KB) | 1,253 functions (29,245 insts) lifted to C; installs 103 ACMD scripts + 8 per-frame callbacks; full 60 FPS match verified with synthesized .eh_frame_hdr unwind tables. |
Shadow the Hedgehog (GB 578451) | Custom fighter over Wolf c120–c127 | Verified playable custom CSS slot via native CSK Collection redirect and ARCropolis event callback registration. |
Waluigi Moveset (GB 443150) | Waluigi_Moveset (664 KB) | Custom fighter over Terry (dolly) slots c120–c127 importing 129 main symbols and 10 CSK Collection calls. |
Silver Moveset (GB 470041) | Silver_Mewtwo (610 KB) | Custom fighter over Mewtwo slots c128–c135 importing 136 main symbols and 10 CSK Collection calls. |
Native C/C++ modding: hook.h & readable ACMD fighter source
Beyond Switch Skyline ports, PC modders can write native host mods directly in C or C++ against hook.h (replacing any game function by symbol without rebuilding the entire 98-module binary) or edit decompiled ACMD(fighter, move) C++ source files inside ssbu-recomp/fighter_sdk that recompile in roughly one second. Note that inline single-instruction ARM64 hooks (A64InlineHook) and raw code-page writes (sky_memcpy to text segments) cannot apply to statically recompiled C and are logged as skipped.
Smash PC controllers & adapters
OpenSmash-Ultimate and WindowSmash support up to 8 concurrent players via SDL3, XInput, and native Wii U / Switch GameCube USB adapter polling (both Windows HID and Zadig WinUSB drivers, with analog L/R triggers and rumble):
| Hardware | Best For in OpenSmash-Ultimate | Input Path & Latency Notes | Link |
|---|---|---|---|
| Mayflash 4-Port GameCube Controller USB Adapter | 4-port GameCube controller play | Switch to Wii U mode for native 4-port GameCube input + rumble (second grey USB plug) | View on Amazon |
| Nintendo Switch Pro Controller | Native positional ABXY layout | Matches Switch button positions out of the box via SDL3 (`[device switchpro]`) | View on Amazon |
| GameSir Cyclone 2 | Low-latency 1000 Hz wireless Smash | Zero-drift TMR sticks, microswitch face buttons, XInput & Switch SDL3 modes | View on Amazon |
| 8BitDo Ultimate 2 Wireless | Desktop & SteamOS handheld dock | TMR sticks, charging dock, 2.4 GHz dongle + Switch / XInput mode switch | View on Amazon |
| Sony DualSense | PlayStation pad (`[device ps5]`) | Full SDL3 support with configurable per-device rumble and deadzone in `controllers.ini` | View on Amazon |
| Xbox Wireless Controller | Zero-setup Windows 10/11 XInput | Works natively for players 1–4; set `layout = labels` or `style = gamecube` if desired | View on Amazon |
As an Amazon Associate, this site earns from qualifying purchases.



Common questions
Can I use mods in online Quickplay or Local Wireless rooms?
Only when every player in the room has the exact same enabled mods and ARCropolis code-patch state. In Netplay v3 (Esc → Lobby), placing the cursor on a room highlights which mods differ, and the launcher’s Share button lets your group sync identical mod lists.
Why did a new character mod stay as the base fighter on Linux in older builds?
Early Linux builds mistakenly invoked the Windows linker step during plugin builds. Current unified Linux builds compile plugin C via recomp.py all --generate-only followed by tools/linux/build_linux.py into build-linux/ssbu when you click Build plugins into the game.
Do skin-only, music, or stage mods require rebuilding C code?
No. Pure asset mods (costumes c00–c07 or extra slots c08+, music .nus3audio, UI, and stages) mount through the native ARCropolis layer on next game restart without invoking Clang.