Hotfix: P2 frozen on Master Hand in Co-Op Classic mode, added 2P for challenger fight, added contributors to port credits menu.
I'm really excited to bring this release to everyone. There's a host of new features and quality of life improvements from myself and a lot of other contributors.
Headline: This is the modding release. It ships a native C mod system that works on Windows, Linux, and macOS, with documentation and example mods. Alongside it: Classic Co-op (2-player local Classic mode), a music shuffler + selection screen, Z-cancel assist options, the hi-res texture pack is supported on Android, and a fix that makes the game fill the whole window.
New Features
1. Native C mod support - cross platform
The big feature. Write mods in C, compiled at runtime through TinyCC, packaged into .o2r, with hot-reload for development and tooling to convert PNG/WAV assets. Brought to you by @Mickemoose, with expansion to cross-platform by me.
- Engine foundation — runtime TinyCC compilation,
.o2rpackaging, hot reload, asset converters. - Cross-platform hook backend — replaced the Windows-only MinHook with funchook (Windows x64, Linux x64/arm64, macOS arm64) behind the existing per-mod hot-reload chain interface. Bundled-capstone bumped 4.0.2→5.0.1 so it builds on CMake ≥ 4.
- macOS Apple Silicon detours — lifted all three W^X barriers that blocked runtime prologue patching on signed
__TEXT(mach_vm_protect + VM_PROT_COPY, JIT entitlements, Mach-Omaxprotrewrite). True three-platform parity. - Character mod hooks (#230) — fighter registry +
FighterEventsurface, reloc/byteswap support for mod-supplied data, and theCharacterEnginehook path. - Engine data exports for mods —
gGCCommonLinksaccessor and the MP ground-collision data pointer exposed through the mod bridge (stage bounds, fighter list). - The event system (
port/hooks/,EngineEvent+FighterEvent) ships on every target; only TinyCC scripting is gated off on Android (DISABLE_SCRIPTING).
2. Classic Co-op - 2-player Classic mode (#229)
Bring a friend to play the original Classic mode with you. Friendly fire can be enabled or disabled. Original CSS assets are reused at runtime for a truly native feel. Your P2 appears in the VS screen along with you prior to each stage. The feature is enabled by default, from me..
3. Music shuffler + music selection screen
Randomize the stage background music or select a track yourself from a new in-game selection screen in VS modes. From @the-outcaster
4. Z-cancel assist options (#219)
Checkbox options for Auto Z-Cancel and Flash on Failed Z-Cancel. Practice practice practice! By @the-outcaster
5. Hi-res texture support on Android + in-place .zip packs (#235)
The SSB Reloaded texture pack can now be dropped into your mods folder as the .zip it's distributed as.
On android, you can enable hi-res support in the menu. Download the .zip. Then, on your phone screen, hold the BattleShip icon to select the hi-res pack.
Quality-of-Life improvements
- Input & controls UI cleanup (#216) — renamed the input/controls tabs and widened the ESC-menu left column for readability. (the-outcaster)
- Modding guide + worked example (#234) —
docs/modding.md: the three extension models (event listeners, function detours, fighter query/override events), a full firing-site event catalog, gotchas, plus the playertint example mod (per-player fighter tint viaFighterEnvColorQueryEvent). Makes the new mod system actually discoverable. From @Zorkats - Per-PR cross-platform CI build gate (#233) — compiles the
ssb64target on Windows/Linux/macOS for every PR and push to main, catching platform-specific breaks (e.g. Windows-only mod loaders) before review. From @Zorkats
Bug Fixes
- Game now fills the window — SSB64 bakes a 10px title-safe overscan inset on every side; on a desktop window that showed up as a black frame. Cropped at present time in
Gui::DrawGame, with aCrop Overscan Bordertoggle + H/V sliders under Settings → Enhancements (default on; skipped in pixel-perfect mode). - Multi-gamepad "second pad dead" family — plug-and-play port routing no longer reverts on device events; the Nth new pad auto-assigns to the first free port; ports 2–4 get default mappings at init; identical controllers get unique input-editor IDs.
- Crash-handler lost its backtrace — the readability probe wrote to
/dev/null, which never copies from the source buffer, so it reported every address readable; the FP walk then stepped onto a coroutine guard page and SIGBUS'd inside the signal handler. Reworked to probe via a self-pipe (realEFAULT). Coroutine-stack crashes now produce a full backtrace. - Yoshi's Story clouds vanished when stage hazards were disabled (#220) — Yoshi's Story is whitelisted from the hazard process-pause and its cloud-evaporation timer is frozen instead of stopped. From @the-outcaster
Contributors
@Zorkats had his first contribution to the project!
Full Changelog: v1.3...v1.4