PORTCLUB
Port nativo

Robox (Recompiled)

Port nativo de Robox (Recompiled) para PC.

Robox (Recompiled)

Port nativo basado en su ficha de origen.

README del repositorio

ROBOX Recompiled

A static recompilation of Robox (WiiWare, Dreambox Games, 2010) to a native PC executable. The game's PowerPC code is translated ahead of time into C — 12,831 functions across 51 files — and linked against a host-side reimplementation of the parts of the Wii it used: the GX graphics pipeline on OpenGL, the AX audio mixer, the OS threading and heap layer, and the disc/NAND filesystem.

It is not an emulator. There is no interpreter and no JIT; the game is the executable.

Getting it running

You need your own copy of the game. No game data is distributed here and none ever will be — see THIRD-PARTY.md.

Run the executable. On first launch a setup screen offers two routes:

  • Install from a WAD — point it at your Robox WAD and it does the rest: decrypts the contents, decompresses the LZ11 executable, unpacks the ~1,500 asset files, and builds the soundfont. Drop the WAD beside the exe and it finds it without being asked. This route needs a Wii common key (key.bin), which is not shipped here; the setup will ask for one.
  • Locate files manually — if you already have the game unpacked, pick the .dol and then the Assets folder. They need not be in the same place.

Either way it happens once and the choice is remembered.

On first run the game also writes, beside the executable:

filewhat it is
controls.cfgthe key map, editable, documented in its own comments
mods/mods.cfgwhich mods are on
mods/wav_music.cfghow to swap a song for your own audio
mods/robox.dlsthe soundfont, built from your own copy of the game
nand/saves, and rebinds made from the in-game menu
nand/video.cfgfullscreen and internal resolution, remembered when you change them

None are overwritten once they exist, so edits survive.

Building

Building needs two things this repository does not contain: the recompiler, and your own copy of the game. The recompiled C is generated here at configure time rather than committed, because it is a translation of the retail executable and therefore a derivative of it — the same reason no game data is here.

git clone https://github.com/Eggscantfly/WiiRecomp.git ../WiiRecomp
cp "/path/to/Robox USA.dol" private/

Then, Windows / MSYS2 mingw64:

export PATH=/c/msys64/mingw64/bin:$PATH
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build

or run build.bat, which does the same incrementally.

CMake runs the recompiler on the first configure — 12,831 functions, a few seconds — and leaves the result alone afterwards. Delete src/generated/ to force a regeneration after changing the recompiler.

Both locations are overridable if you keep things elsewhere:

cmake -S . -B build -G Ninja \
      -DROBOX_RECOMPILER=/path/to/WiiRecomp \
      -DROBOX_DOL="/path/to/Robox USA.dol"

Note this is the build requirement. A released binary already contains the recompiled code and only asks for game assets on first run.

Build Release. A Debug build cannot hold real-time pace in the softsynth and MIDI sequencer, and the symptom is held notes rather than an obvious slowdown.

gcc needs C:\msys64\mingw64\bin on PATH — not merely an absolute path to the binary. Invoked absolutely it fails with exit 1 and no diagnostics at all, because the driver cannot find its own DLLs. That looks exactly like a silent compiler bug and is not one.

You will also need SDL2 and Python 3; the build runs a few generator scripts.

Building from a clean clone

The overlay font is extracted from the game's own Assets/fonts/title.brfna at configure time, so a fresh clone cannot build without game assets present. That is a known wart — you need the game unpacked before you can build the program that unpacks the game. Bundling an openly-licensed font would fix it.

Other targets

Each non-desktop port has its own repository:

targetrepository
Android (iOS planned)robox-recompiled-mobile
Browser / Emscriptenrobox-recompiled-web
Nintendo 3DSrobox-recompiled-3ds

Each holds its packaging and the source files that are only that platform, and consumes this repository as a submodule. Build from the port repository, not this one; point this build at a port with -DROBOX_PLATFORM_DIR=<port>/platform.

The conditional code stayed here — the #if defined(__ANDROID__) / __EMSCRIPTEN__ / __3DS__ blocks are woven through video.c, gx_ogl.c, main.c and others, and compile to nothing on targets that are not them. Separating those properly is a refactor across a dozen core files that nobody could test without all three toolchains at once, so it was not attempted.

All three arrive with their game data already in place — the APK extracts it, the 3DS reads RomFS, the web build preloads MEMFS — so the setup screen compiles out to a no-op on each.

Streaming over Discord

If the window freezes while it has focus and runs fine when it does not, press F11 to leave fullscreen. Windows promotes a focused borderless-fullscreen window to independent flip presentation, bypassing the compositor; a screen capture that needs a composed copy then fights it every frame and the present blocks. Unfocused, the window falls back to normal composition and runs — which is why the symptom looks backwards.

The choice is saved to nand/video.cfg, so it only has to be made once.

Mods

mods/mods.cfg turns them on and off; ROBOX_MOD_<ID>=0|1 overrides it for a single run. A mod whose data file is missing is forced off and says which file it wanted.

idwhat it does
musicHost MIDI + DLS sampler, replacing the game's wavetable synth
wavmusicMusic packs — swap any song for a WAV/OGG/RBXS file
marioBit-exact Super Mario Bros. movement physics
discordRich Presence
coopLocal / online co-op (work in progress, off by default)
luaLua scripting for mods — see below

.rbxs is a small container: a 24-byte header carrying loop points in front of an OGG or WAV payload. Loop points are the thing a bare OGG cannot express — intro once, then the loop region forever. Build one with tools/make_rbxs.py.

Writing your own — MODDING.md

Every mod in the table above is C, and changing one line of any of them costs a full recompile of the whole translated game. So there is a scripting runtime too: drop a .lua file in mods/lua/ and it runs, and saving it reloads it while the game is still going.

-- mods/lua/first.lua
robox.on("draw", function()
  robox.draw.text(24, 24, "hello")
end)

Scripts get guest memory, hooks on any function in the game by its original Wii address, calls back into it, the player, input (including injecting it), HUD drawing and persisted settings. The examples in mods/lua/ are written to be read in order.

Robox also embeds a Lua 5.1 of its own — the engine really does ship one, and only ever uses it for tileset tables and translated strings. Scripts in mods/lua/guest/ run inside that VM, during the game's own boot, with the engine's asset bindings in scope. No patching: they are appended to script/game.lua on its way through the content system.

Environment variables

variableeffect
RECOMP_WINDOWED=1Do not launch fullscreen (F11 toggles at runtime)
RECOMP_FORCE_SETUP=1Show the setup screen even with a good install
RECOMP_NO_SETUP=1Never show it
RECOMP_NO_SPLASH=1Skip the intro
RECOMP_ASSETS=<dir>Use an Assets tree somewhere else
RECOMP_IR_SCALE=1..4Internal resolution multiplier over the native 640x480 EFB. Defaults to roughly the panel height (2x at 1080p, 3x at 1440p, 4x at 4K); raise it for supersampling
RECOMP_LOG=1Write the engine log to logs/run.log. Off by default — a normal run is silent and leaves no files
ROBOX_AXDUMP=1Dump the audio mixer output to axmix.wav (~23 MB for the 2-minute cap)
ROBOX_DUMPS=1Bring-up dumps: guest RAM on a stall (88 MB), every decoded texture as PNG, and the software EFB. All off by default
ROBOX_LUA_RELOAD=0Stop watching mods/lua/ for changes. Scripts still load at startup; they just stop reloading when you save

A crash still writes logs/crash.log regardless of RECOMP_LOG — the fatal handlers reopen stderr onto it before dumping registers and the guest backtrace, so a quiet build still leaves a post-mortem behind.

Layout

sdk/            host-side Wii: GX→OpenGL, AX audio, OS/threads, filesystem, mods
src/            entry point and the PPC runtime
src/generated/  recompiled PowerPC — generated, never committed
quirks/         per-title behaviour patches
tools/          build-time generators and standalone tests
vendor/lua/     Lua 5.4.7, the VM behind the scripting runtime
mods/           default mod configuration
mods/lua/       example Lua mods; mods/lua/guest/ runs inside the game's own VM
Setup/          the setup screen's own music and sound
splash/         the intro animation's stills and cues
private/        where you put your own .dol — generated, never committed

The recompiler itself is a separate repository, in the same arrangement XenonRecomp has with UnleashedRecomp.

A note on AI assistance

Parts of this project were written with Claude (Anthropic). Commits carrying a Co-Authored-By: Claude trailer had AI involvement.

This is stated plainly for two reasons. One is attribution — it should be clear which work was not written unaided. The other matters more if you are reading the code: AI-written code can be confidently wrong in ways that read as authoritative, and its comments are no exception. Where a comment here explains why something is done a particular way, treat it as a claim to check rather than a citation.

That said, the load-bearing parts are not taken on trust. tools/ holds standalone tests that check the WAD extraction against real dumps and the soundfont generator byte-for-byte against the Python it was ported from, and the recompiler's output was diffed against a known-good tree before the generated code was allowed to become a build step.

Credits

The approach this project takes comes from I Built a PS1 Static Recompiler With No Prior Experience (and Claude Code) by Matthew Stanley (March 2026), which describes building psxrecomp — a static recompiler for the original PlayStation — with Claude Code alongside Ghidra.

What is borrowed is the method that article sets out: translate the binary ahead of time, then close the gap with an iterative loop of build, watch it fail, fix, and check the fix against the disassembly. The console and the instruction set are different here; the approach is not. This project would not exist in this form without that write-up.

Licence

GPL-2.0-or-later. Parts of the renderer are ported from Dolphin, which is GPL, and a port is a derivative work. Full text in LICENSE; every component and its terms in THIRD-PARTY.md.

Comentarios (0)

Inicia sesión para dejar un comentario.

Sé el primero en comentar sobre este juego.