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
Nintendo Switch Pro Controller showing twin analog sticks, D-pad and positional ABXY face buttons
SDL3 8-player gamepad layer supporting Switch Pro, GameCube, DualSense and XInput controllers

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 .rar mod packages (Linux uses bsdtar, 7zz, py7zr, or unrar).
  • Check (Conflicts & Updates, PR #124): Clicking Check (or running python tools/mods.py conflicts and updates) 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 DependencyHow OpenSmash-Ultimate Provides It Natively
ARCropolisProvided 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_paramconfigtools/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:

  1. Tail-branch function discovery (99.9% coverage): Rust plugins compile with panic=abort and strip unwind tables, so recomp.tail_entries traces tail branches to a fixpoint and disables cross-function register caching where LLVM’s machine outliner shares callee-saved registers.
  2. Synthesized C++ exception unwind tables (tools/plugin_eh.py): When a move is interrupted mid-animation, L2CAgentBase::coroutine_yield throws a C++ exception across the ACMD script stack. plugin_eh.py reconstructs an .eh_frame_hdr table from every Rust function prologue so libunwind cleanly unwinds interrupted custom moves without triggering svcBreak.
  3. Dispatch-table function hooking (A64HookFunction): Indirect calls swap entries in rt_lookup with zero game rebuild; direct call targets listed in dump/skyline/hooks.txt wrap through rt_lookup and rebuild in ~1–2 minutes (tools/skyline.py build --jobs 2).
  4. Headless CSK discovery probe: During Apply / Build plugins into the game, SSBU_SKYLINE_PROBE=1 boots once headlessly in an isolated temporary directory to record custom character entries into dump/skyline/csk.json.
Studied GameBanana ModPlugin BinaryUpstream 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–c127Verified 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.

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):

HardwareBest For in OpenSmash-UltimateInput Path & Latency NotesLink
Mayflash 4-Port GameCube Controller USB Adapter4-port GameCube controller playSwitch to Wii U mode for native 4-port GameCube input + rumble (second grey USB plug)View on Amazon
Nintendo Switch Pro ControllerNative positional ABXY layoutMatches Switch button positions out of the box via SDL3 (`[device switchpro]`)View on Amazon
GameSir Cyclone 2Low-latency 1000 Hz wireless SmashZero-drift TMR sticks, microswitch face buttons, XInput & Switch SDL3 modesView on Amazon
8BitDo Ultimate 2 WirelessDesktop & SteamOS handheld dockTMR sticks, charging dock, 2.4 GHz dongle + Switch / XInput mode switchView on Amazon
Sony DualSensePlayStation pad (`[device ps5]`)Full SDL3 support with configurable per-device rumble and deadzone in `controllers.ini`View on Amazon
Xbox Wireless ControllerZero-setup Windows 10/11 XInputWorks natively for players 1–4; set `layout = labels` or `style = gamecube` if desiredView on Amazon

As an Amazon Associate, this site earns from qualifying purchases.

Platform-fighter esports tournament venue packed with spectators watching a main-stage bracket match
Competitive Smash Ultimate bracket crowd and 60 FPS tournament stage pacing
Nintendo GameCube controller showing octagonal analog gate, C-stick, L/R analog shoulder triggers and A/B/X/Y layout
Native GameCube controller input via 4-port Wii U USB adapters (WinUSB / HID) with analog L/R triggers
Desktop gaming PC workstation with dual monitors and tempered glass chassis
Windows 10/11 x64 desktop build host for AArch64-to-C static recompilation, Direct3D 11 and Vulkan

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.