Skip to the page
It's Decomplicated
Nintendo, 2012

Wii U decomp guide

Recomps now run many Wii U games. No game has a full, verified decomp that builds alone.

What this system is like

The Wii U runs on a PowerPC chip called Espresso. Each game keeps its main code in one .rpx file. An .rpx is a changed kind of ELF file, the common format for programs. Since 2026, tools turn that file into C or C++ that a PC can build. This is called static recompilation.

Ten of the 14 projects reviewed here used static recompilation. Most new ones did not start from zero. They borrowed the recompiler and runtime of an earlier port, such as the Wind Waker HD port. A runtime is the code that stands in for the console. Several reached a first boot within days.

A full decomp is harder. The original compiler, Green Hills MULTI, is a paid tool that hobbyists cannot simply get. So byte matching is mostly closed. The best result so far, for Wind Waker HD, checks each readable function against the recompiled original. It is nearly complete, but it still needs the recomp to run.

Path A runs on Windows. Plan to use WSL for the Path B test harness and for any Linux build.

Borrow a runtime, do not write one

The Wind Waker HD port spawned three other ports in weeks. New Super Mario Bros. U, Twilight Princess HD and Captain Toad all reused its recompiler and runtime. Tekken's cafe-recomp was reused for Smash 4. Start from one of these.

The system calls are listed in the file

An .rpx names every system function it imports, grouped by library. You can compare that list with what your runtime already has. Captain Toad found 62 missing imports this way at the start.

Paired singles and strict threads

Espresso has paired-single math that PC chips lack. Recompilers must handle it, or the game breaks. The console also runs one thread at a time per core. Ports that let threads overlap saw corrupted game data.

Pin one exact executable

Most reviewed ports check the .rpx by its hash and refuse any other. A hash is a short fingerprint of a file. Regions and updates change addresses, so hooks for one build break on another.

No free original compiler

Wii U games were built with Green Hills MULTI. Matching needs that exact compiler under licence. So the strongest Wii U decomp checks behavior instead. It runs each new function next to its recompiled twin on 10,000 inputs.

Two paths

Path A

Get it running on PC

A recompiler reads your game's .rpx and writes C for every function. You build that C together with a runtime that stands in for Cafe OS, GX2 graphics, sound and input. You borrow the runtime from a working port. Then you fill in the system calls your game needs, one at a time.

Go to the steps

Path B

Full decomp for porting

No Wii U game has a full matching decomp. The route here starts from your Path A recomp. You replace machine-made functions with readable C++, one unit at a time. A test harness runs each new function next to its recompiled twin and compares every result. The Wind Waker HD decomp verified 38,828 functions this way.

Go to the steps

Path A: Get it running on PC

A recompiler reads your game's .rpx and writes C for every function. You build that C together with a runtime that stands in for Cafe OS, GX2 graphics, sound and input. You borrow the runtime from a working port. Then you fill in the system calls your game needs, one at a time.

Method: static recompilation on a borrowed Wii U runtime

Pick this first for any Wii U game. It is the path 10 of the 14 reviewed projects took. It also gives Path B the reference it checks against.

  1. Scope the game and pin the exact file

    Pick one game, one region and one update. Check if someone already ported it, or a game on the same engine. Then write the Scope Contract. Every later session works on that same file.

    • Search RecompLauncher and GitHub for your game. Twilight Princess HD started as a fork of the Wind Waker HD port.
    • Dump your own copy with Dumpling on your Wii U. It writes the game, its update and DLC as extracted code/, content/ and meta/ folders.
    • Merge the update over the base game into one game/ folder. Captain Toad does this with hash-checked copies into an empty folder.
    • Record the hash of the main file. In PowerShell run Get-FileHash game/code/<NAME>.rpx -Algorithm SHA256.
    • Write SCOPE.md: game, region, title ID, update version, the .rpx hash, the donor port, and what is out of scope.
    Prompt for Claude
    GOAL: Draft SCOPE.md for a static recompilation of <GAME> on Wii U.
    READ FIRST: `notes/game-files.txt` (my folder list, title ID and the `.rpx` hash), `notes/prior-work.md` if it exists.
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Game|Region|Title ID|Update|Hash|Donor port|Milestone|Out of scope)$'`. Done means it prints 8 lines. The Hash section must hold the same SHA-256 that `Get-FileHash game/code/<NAME>.rpx -Algorithm SHA256` prints. The Donor port section names one port and one reason, with a link.
    BUDGET: Stop after 30 minutes of searching for prior work.
    IF BLOCKED: Stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the Select-String output and both hashes. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenSelect-String -Path SCOPE.md -Pattern '^## (Game|Region|Title ID|Update|Hash|Donor port|Milestone|Out of scope)$' prints 8 lines. The hash in SCOPE.md equals what Get-FileHash prints. Then you approve it.

    Proof this works: Twilight Princess HD: Recompiled, Captain Toad EUR - Android recompilation prototype, Smash 4 PC, https://github.com/dumpling-app/dumpling

  2. Set up the Windows tools and the donor runtime

    Install the compiler, the build tools and the Vulkan SDK. Copy the donor port at one fixed commit. Prove the toolchain works before any game code goes in. Then write one check command.

    • Install LLVM from LLVM-23.1.5-win64.msi, CMake, Ninja and the Vulkan SDK 1.4.363.1. Add Visual Studio's Desktop development with C++ workload for the Windows headers. Put clang, clang++, cmake and ninja on PATH, and set VULKAN_SDK.
    • Run pip install pycryptodome for the donor's disc extractor. pip install capstone is optional. It powers the disassembler helper tools/ppcdis.py.
    • Clone the donor: git clone https://github.com/ZeldaWWHDRecomp/ZeldaWWHDRecomp donor. Then pin it with git -C donor checkout <COMMIT>. Captain Toad also pins its donor to one commit.
    • Build the donor with placeholder code first. Run python donor/tools/recomp/stubgen.py build/gen-stub, then configure with -DGEN_DIR=$PWD/build/gen-stub.
    • Configure and build: cmake -S donor -B build/windows -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release, then cmake --build build/windows. The build folder stays outside donor/, so the checkout stays clean.
    • Use Clang, never cl.exe. The generated code needs Clang's musttail feature.
    • Add game/, build/ and generated/ to .gitignore. Write tools/check.ps1 that builds, runs ctest, runs --renderer-smoke and prints PASS or FAIL.
    Prompt for Claude
    GOAL: Make `tools/check.ps1` build the pinned donor runtime with stub game code and print PASS or FAIL.
    READ FIRST: `SCOPE.md`, the donor README section Windows (Native LLVM), `donor/CMakeLists.txt`.
    FENCE: Edit only `tools/`, `.gitignore` and `CLAUDE.md`. The `donor/` checkout and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Stub`. Done means it runs `stubgen.py`, configures with Clang and Ninja, builds, runs `ctest --test-dir build/windows --output-on-failure` and `--renderer-smoke`, then prints one line: PASS or FAIL with the reason. The switches `-Stub`, `-Codegen`, `-BootSeconds <N>` and `-Golden [<name>]` must exist. A switch with nothing to test yet prints SKIP.
    BUDGET: Stop after 3 failed tries at the same error.
    IF BLOCKED: Stop. Do not switch to `cl.exe` or edit the donor to get past it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the last 20 lines of the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpowershell -ExecutionPolicy Bypass -File tools/check.ps1 -Stub prints PASS: the stub build, ctest and --renderer-smoke all pass with no game files.

    Proof this works: Wind Waker HD Recomp, NSMBU Recomp, VR-WakerHD, https://github.com/ZeldaWWHDRecomp/ZeldaWWHDRecomp

  3. Map the executable and audit its imports

    Learn what the game asks of the system before you build it. List every import and compare it with the donor runtime. Also export a function list to track progress.

    • Install Ghidra 12.0 with Java 21. Copy GhidraRPXLoader-0.9.2-d496d43-Ghidra_12.0.zip into Ghidra's Extensions/Ghidra folder. Then add it with File, Install Extensions.
    • Import <NAME>.rpx, pick the Gekko/Broadway/Espresso language, then run fix_primary_imports.java so imports show real names.
    • Write tools/audit_imports.py. It lists each .fimport_* and .dimport_* entry and marks it present or missing in the runtime. Captain Toad's audit_rpx.py found 362 function imports this way.
    • Export every function to notes/functions.csv with address, size, name and a status column. Cha-Cha keeps these tables in config/*.csv.
    • Check for a symbol table. Minecraft and Tekken had .symtab names. Super Mario Maker had none, so its functions were found from branch targets.
    Prompt for Claude
    GOAL: Fill `notes/imports.csv` and `notes/functions.csv` for <GAME>'s `<NAME>.rpx`.
    READ FIRST: `SCOPE.md`, the Ghidra export in `notes/ghidra/`, the donor's Cafe OS folder `donor/runtime/src/`.
    FENCE: Edit only `notes/imports.csv`, `notes/functions.csv`, `notes/findings.md` and `tools/audit_imports.py`. Ghidra project files, `donor/` and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `python tools/audit_imports.py game/code/<NAME>.rpx donor/runtime/src`. Done means it prints PASS and a count line: total imports, present, missing. Every row of `notes/functions.csv` has address, size and status, with no overlaps.
    BUDGET: Stop after 60 minutes.
    IF BLOCKED: Stop. Do not guess an import's meaning. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the count line and five sample missing imports. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whentools/audit_imports.py prints PASS with a missing-import count, and notes/functions.csv has a status column.

    Proof this works: Captain Toad EUR - Android recompilation prototype, Cha-Cha-Plus, Project Yamamura, https://github.com/Maschell/GhidraRPXLoader

  4. Run the first codegen with the donor's hooks off

    Now the recompiler writes C for your game. First switch off the donor's game patches. Those hooks were made for another game's addresses. Left on, they would patch random code in yours.

    • Empty the donor's hook lists. Copy donor/tools/recomp to tools/recomp in your repo. Delete its hooks*.txt, then create an empty hooks.txt. The Wind Waker HD decomp empties the hooks the same way.
    • Run python tools/recomp/recomp.py game/code/<NAME>.rpx build/gen. Never edit build/gen by hand.
    • Point CMake at it with -DGEN_DIR=$PWD/build/gen and build. The first build compiles hundreds of thousands of lines, so allow time and memory.
    • Add your own game target and hook file in your repo, not in donor/. Captain Toad keeps its changes as patch files.
    • Log any words the recompiler could not decode. Captain Toad found 36 that may be data or padding.
    • Give your game its own .rpx check. The donor runtime checks at start that game/code/cking.rpx matches the generated code. Captain Toad adds a profile with its own .rpx hash.
    Prompt for Claude
    GOAL: Make the recompiler run on <GAME>'s `<NAME>.rpx` and make the generated code build.
    READ FIRST: `SCOPE.md`, `donor/docs/how-it-works.md`, the last log in `out/logs/codegen.txt`.
    FENCE: Edit only `patches/`, `tools/recomp/hooks.txt`, `CMakeLists.txt` in my repo and `notes/findings.md`. `build/gen` is machine-made and read-only. `donor/` is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Codegen`. Done means `recomp.py` exits 0, the build links, and the donor's hook lists are empty. Copy every undecoded word into `notes/findings.md` with its address.
    BUDGET: Stop after 3 failed tries on one error.
    IF BLOCKED: Stop. Do not edit generated files to make them compile. Tell me the error, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: last log lines and the empty hook list. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpowershell -ExecutionPolicy Bypass -File tools/check.ps1 -Codegen prints PASS: codegen exits 0, the game executable links, and no donor hook is active.

    Proof this works: Captain Toad EUR - Android recompilation prototype, https://github.com/ZeldaWWHDDecomp/wwhd, Pikmin 3: native Windows port (static recompilation)

  5. Boot to the first frame

    Run the game until it stops. Most early stops are a missing system call. Add that call to the runtime, rebuild and run again. Repeat until a picture shows.

    • Run the game under a time limit, such as ./build/windows/<game>.exe with a -BootSeconds 120 wrapper in tools/check.ps1.
    • Make every missing import fail loudly with its name. Captain Toad exits with code 78 rather than faking success.
    • Write each missing call in the runtime's Cafe OS folder, named after the real export, such as OSCreateThread. Track each one in notes/imports.csv as stub, partial or done.
    • Keep the console's thread rules: one thread at a time per core, strict priorities. Wind Waker HD saw data corruption without them.
    • Compare with Cemu when unsure what a call should return.
    Prompt for Claude
    GOAL: Get <GAME> past its next boot stop at import <IMPORT> or address <ADDRESS>.
    READ FIRST: `SCOPE.md`, the last 50 lines of `out/logs/boot.txt`, `notes/imports.csv`.
    FENCE: Edit only `src/cafe/` and `notes/imports.csv`. `build/gen`, `donor/` and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -BootSeconds 120`. Done means the log no longer stops at <IMPORT>. Paste the old and new last log lines.
    BUDGET: One stop per session. Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not return a fake success code to move on. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: old and new last log lines. 3) Files changed. 4) The import's new status, and why. 5) New parking-lot items.
    Done whenpowershell -ExecutionPolicy Bypass -File tools/check.ps1 -BootSeconds 120 prints PASS: the log shows the first-frame line you chose, and out/shots/boot.png exists.

    Proof this works: Captain Toad EUR - Android recompilation prototype, Cha-Cha-Plus, Wind Waker HD Recomp, https://github.com/cemu-project/Cemu

  6. Fix one bug at a time, with evidence

    Now play forward. Each crash, hang, wrong picture or missing sound is one unit of work. Find the cause first. Run the same scene in Cemu before you change code.

    • Log each bug in notes/bugs.md with exact steps to see it.
    • Run the same scene in Cemu. If it breaks there too, look at the original game's behavior before blaming the port.
    • Change behavior with a hook in your repo. Tekken's design lets you replace sub_<address> and still call sub_<address>_orig. Never edit generated code.
    • Use RenderDoc for graphics bugs. Pikmin 3 found lost shader writes only this way.
    • Check memory rules on a hang. Tekken and Smash mark every guest load and store volatile, because Clang folded a spin-wait into one read.
    Prompt for Claude
    GOAL: Find and fix the cause of bug <BUG-ID> in <GAME>.
    READ FIRST: `notes/bugs.md` entry <BUG-ID>, `notes/findings.md`, the log and capture files named in the bug.
    FENCE: Edit only `src/` and `tools/recomp/hooks.txt`. `build/gen`, `donor/` and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden`. Done means the bug's repro run passes and every older golden run still passes. Show the cause with evidence, such as a Cemu comparison or a RenderDoc capture, before you change code.
    BUDGET: Stop after 2 failed fixes, or 45 minutes with no new evidence.
    IF BLOCKED: Stop. Do not hide the crash by skipping the call. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the cause with its evidence, then the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpowershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden prints PASS for the bug's repro run and for every older golden run.

    Proof this works: Tekken Tag Tournament 2 Ultimate, Smash 4 PC, Pikmin 3: native Windows port (static recompilation), Wind Waker HD Recomp

  7. Build golden runs

    Playing by hand does not scale. Script runs that reach a scene, play fixed input and check the result. Run them after every change. Then old fixes stay fixed.

    • Add a way to start in any scene. Twilight Princess HD uses a warp setting, WWHD_WARP, to load each of its 78 stages.
    • Record and replay input. SplatPC uses RBREW_INPUT_RECORD and RBREW_INPUT_REPLAY to reproduce bugs the same way each time.
    • Take a screenshot and log line at a set time. Compare them with saved baselines.
    • Give Claude a command line for the running game. NSMBU's nsmbu tool can boot a scene, wait, take a picture and diff two runs.
    • Wrap it all in powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden so one command prints PASS or FAIL for each run.
    Prompt for Claude
    GOAL: Add golden run <NAME> that reaches <SCENE> and checks it.
    READ FIRST: `SCOPE.md`, `tools/check.ps1`, `tests/golden/README.md`.
    FENCE: Edit only `tests/golden/` and `tools/`. Never touch my real save folder. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden <NAME>` three times. Done means it passes all three times on the current build. It must also FAIL when I swap in the screenshot from <OTHER-SCENE>.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not loosen the image threshold to make it pass. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the three passing runs and the one forced failure. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOn a clean checkout, powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden prints PASS for every golden run.

    Proof this works: Twilight Princess HD: Recompiled, SplatPC, NSMBU Recomp, Wind Waker HD Recomp

  8. Package it without game data

    Players must use their own copy. Your repo and releases hold only your code. The reviewed ports build the game on the player's PC from the player's own dump.

    • Check the player's .rpx by SHA-256 against your known list. Refuse the rest with a clear reason. Tekken's recompiler refuses any other Tekken.rpx.
    • Keep build/gen, game/ and save states out of git. Twilight Princess HD scans each release zip for game code and keys with guard.py.
    • Keep CI working without the game. Build against stub game code and run ctest. NSMBU uses stubgen.py. BotW Native links a guest stub.
    • Pin every downloaded tool by version and hash. VR-WakerHD checks llvm-mingw by SHA-256.
    • Check the licence of borrowed code. The Wind Waker HD port and Cemu use MPL-2.0. Tekken uses MIT.
    Prompt for Claude
    GOAL: Make the setup accept only supported copies of <GAME> and keep game data out of the repo and releases.
    READ FIRST: `SCOPE.md`, `installer/`, `config/supported-versions.json`.
    FENCE: Edit only `installer/`, `config/supported-versions.json` and `tools/check-boundary.ps1`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check-boundary.ps1` and `powershell -ExecutionPolicy Bypass -File installer/test.ps1`. Done means both print PASS. A changed `.rpx` must be rejected with a reason. The boundary check must FAIL when I add a test file named `game/code/test.rpx` to git.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not weaken the hash check. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both outputs, the rejection message and the forced failure. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOn a clean clone with your own dump, powershell -ExecutionPolicy Bypass -File tools/check-boundary.ps1 and powershell -ExecutionPolicy Bypass -File installer/test.ps1 both print PASS.

    Proof this works: Tekken Tag Tournament 2 Ultimate, Twilight Princess HD: Recompiled, NSMBU Recomp, VR-WakerHD

Path B: Full decomp for porting

No Wii U game has a full matching decomp. The route here starts from your Path A recomp. You replace machine-made functions with readable C++, one unit at a time. A test harness runs each new function next to its recompiled twin and compares every result. The Wind Waker HD decomp verified 38,828 functions this way.

Method: verified non-matching decompilation, grown from a working recomp

Pick this only after Path A runs well, and only if you want readable source. Recomp ports already run on Windows, Linux, macOS and Android. So a port alone does not need Path B.

  1. Choose how you will prove each function

    Decide what counts as correct. Matching means your code builds to the exact original bytes. That needs the Green Hills compiler under licence. Verified non-matching uses your Path A recomp as the judge instead.

    • Look for prior work: a decomp of the same game on GameCube, Wii, Xbox 360 or Switch. Wind Waker HD used zeldaret/tww. Minecraft used the Xbox 360 build as a behavior reference.
    • Check for a symbol table and C++ type info in the .rpx. Minecraft's unstripped file named every class.
    • If you hold a Green Hills licence, matching is possible. Project Yamamura matched 2,360 Super Mario Maker functions with ccppc 5.3.27.
    • Without a licence, take the verified non-matching route. The rest of this path covers that route.
    • Update SCOPE.md with the route, the per-function check and what done means.
    Prompt for Claude
    GOAL: Recommend matching or verified non-matching decompilation for <GAME> and update SCOPE.md.
    READ FIRST: `SCOPE.md`, `notes/prior-work.md`, https://github.com/ZeldaWWHDDecomp/wwhd, https://github.com/Jacobwasbeast/mcwiiu-reconstructed.
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Route|Per-function check|Compiler|Sister decomp|Symbols|First unit)$'`. Done means it prints 6 lines, and every claim under them has a link or a file path.
    BUDGET: Stop after 45 minutes.
    IF BLOCKED: Stop. Do not suggest ways to get the Green Hills compiler that may break its licence. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the new SCOPE.md sections. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenSelect-String -Path SCOPE.md -Pattern '^## (Route|Per-function check|Compiler|Sister decomp|Symbols|First unit)$' prints 6 lines. Then you approve it.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Project Yamamura, Minecraft: Wii U Edition - source reconstruction

  2. Freeze a plain recomp as your reference

    Your recompiled game is the oracle. An oracle is a trusted source of right answers. Build a plain copy with no game patches, so it acts exactly like the original. Then pin it so it never drifts.

    • Copy the recompiler and empty its hook lists, as in Path A step 4.
    • Regenerate from a copy of the recompiler. The Wind Waker HD decomp runs WWHD_RECOMP_PLAIN=1 python3 tools/recomp_verify/recomp.py game/code/cking.rpx build/gen --ppc-nan-propagation. Check which flags your donor supports.
    • Tag the port commit, for example git tag reference-v1. The Wind Waker HD decomp names its exact port commit in the README.
    • Save your golden runs and their screenshots from Path A.
    Prompt for Claude
    GOAL: Build and freeze a plain recompiled reference of <GAME> for Path B.
    READ FIRST: `SCOPE.md`, `tools/check.ps1`, the donor's recompiler options in `donor/docs/how-it-works.md`.
    FENCE: Edit only `tools/make_reference.ps1`, `notes/reference.md` and git tags. Code, config and `build/gen` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/make_reference.ps1` then `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden` on a clean clone of the tag. Done means the plain reference has zero hooks, every golden run passes, and `notes/reference.md` lists the tag, donor commit, recompiler flags and `.rpx` hash.
    BUDGET: Stop after 2 failed clean builds.
    IF BLOCKED: Stop. Do not change code to make a run pass. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and the hook count. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whengit tag lists the reference tag. On a clean clone of it, powershell -ExecutionPolicy Bypass -File tools/make_reference.ps1 reports zero hooks and check.ps1 -Golden prints PASS.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Wind Waker HD Recomp

  3. Name functions and split them into units

    A decomp needs names, types and sensible units of work. Get names from the file itself, then from a sister decomp. Record each name with how you know it.

    • Read names from .symtab and C++ type info when present. Cha-Cha named 26,000 functions from engine tables and Green Hills type info.
    • Match against a sister decomp if one exists. The Wind Waker HD port runs python3 tools/decomp/match.py game/code/cking.rpx tww build/names.tsv.
    • Mark unsure names with a ? suffix, as Cha-Cha's rules ask. Never invent a library name. NSMBU keeps sub_<ADDRESS> instead.
    • Group functions into units: one class family or one source file each. Minecraft uses one header and one code file per class family.
    • Mark library code, such as the Green Hills C runtime and nw::font. Wind Waker HD left those as recompiled code.
    Prompt for Claude
    GOAL: Name the functions in unit <UNIT> of <GAME> and record the evidence.
    READ FIRST: `notes/functions.csv`, `notes/findings.md`, the Ghidra export for the unit's address range.
    FENCE: Edit only `notes/functions.csv`, `notes/findings.md`, `notes/units.csv` and `tools/check_names.py`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: If `tools/check_names.py` is missing, write it first. Run `python tools/check_names.py`. Done means it prints PASS (no duplicate names, no name clashes with Cafe OS imports), and each new name has evidence and a confidence: confirmed, probable or guess.
    BUDGET: Name at most 25 functions. Stop after 60 minutes.
    IF BLOCKED: Stop. Keep `sub_<ADDRESS>` instead of inventing a name. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and a count by confidence. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpython tools/check_names.py prints PASS, and every function in the unit has a name or sub_<ADDRESS>, a confidence and an evidence note.

    Proof this works: Cha-Cha-Plus, NSMBU Recomp, Minecraft: Wii U Edition - source reconstruction, https://github.com/ZeldaWWHDDecomp/wwhd

  4. Build the differential test harness

    Write one tool that runs a function both ways and compares the results. Every worker will use it. Then test the tester, so a broken function cannot pass.

    • Start from the Wind Waker HD decomp's tools/verify/. It runs both versions on 10,000 generated inputs per seed. Then it compares what each returns, writes and calls.
    • Track coverage: the inputs must reach nearly all basic blocks of the original. A basic block is a run of code with no branch inside.
    • Add mutation testing. Break the new code on purpose with mutate.py and confirm the harness catches it.
    • Run it in WSL. The harness uses Linux signals such as SIGUSR1, and a few units need tens of GB of memory.
    • Make it print one row per function: address, name, inputs passed, coverage and the first difference.
    Prompt for Claude
    GOAL: Adapt a differential harness so `tools/verify/verify.py <UNIT>` compares rewritten functions of <GAME> with their recompiled twins.
    READ FIRST: `SCOPE.md`, `notes/reference.md`, https://github.com/ZeldaWWHDDecomp/wwhd/blob/main/tools/verify/README.md.
    FENCE: Edit only `tools/verify/` and `notes/harness.md`. `build/gen`, `src/decomp/` and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: In WSL run `python3 tools/verify/verify.py <TEST-UNIT> -n 10000 -seed 1` on an exact copy of one function: every row must say ok. Then change one constant in the copy: the row must FAIL and name the first difference.
    BUDGET: Stop after 3 failed designs.
    IF BLOCKED: Stop. Do not compare only the return value. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the ok run and the forced FAIL run. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenIn WSL, python3 tools/verify/verify.py <TEST-UNIT> -n 10000 -seed 1 prints ok for an exact copy, and FAIL with the first difference for a broken one.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Wind Waker HD Recomp, Tekken Tag Tournament 2 Ultimate

  5. First light: one readable function

    Take one small function that calls nothing else. Write it as plain C++ with real names and types. Prove it acts the same on both seeds. A seed is a starting number for the random inputs.

    • Pick a leaf function of 6 to 16 instructions. Project Yamamura started with leaves of that size.
    • Read the disassembly as evidence only. Never paste it into the source. Minecraft's rules forbid decompiler output in source/.
    • Write it in src/decomp/<unit>/<name>.cpp with the original address in a comment.
    • Run python3 tools/verify/verify.py <unit> -n 10000 -seed 1 and again with -seed 7.
    • Run python3 tools/verify/mutate.py <unit> --n 1000 --max 200 to prove the test can catch a broken copy.
    Prompt for Claude
    GOAL: Rewrite `sub_<ADDR>` (<NAME>) of <GAME> as readable C++ that acts the same.
    READ FIRST: the disassembly of `sub_<ADDR>` from `tools/verify/wdis.py <ADDR>` or Ghidra, the `notes/functions.csv` row for it.
    FENCE: Edit only `src/decomp/<UNIT>/<NAME>.cpp` and the unit spec in `tools/verify/units/<UNIT>`. `build/gen` and the harness code are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: In WSL run `python3 tools/verify/verify.py <UNIT> -n 10000 -seed 1` and `-seed 7`. Done means both rows say ok with coverage of at least <COVERAGE>, and `mutate.py <UNIT> --n 1000 --max 200` reports no surviving mutant you cannot explain.
    BUDGET: Stop after 5 tries with no gain.
    IF BLOCKED: Stop. Do not call the original address from inside the new function. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both verify rows and the mutation summary. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpython3 tools/verify/verify.py <UNIT> -n 10000 prints ok with the agreed coverage on -seed 1 and -seed 7, and mutate.py <UNIT> --n 1000 --max 200 leaves no unexplained mutant alive.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Project Yamamura, Minecraft: Wii U Edition - source reconstruction

  6. Grind through the units in parallel

    Now repeat for many units. Do leaf functions first, then the ones that call them. Each worker takes one unit in its own git worktree. A worktree is a second copy of the repo on its own branch.

    • A lead session picks the next units from notes/units.csv and writes one task card each.
    • Start each worker with claude -w <name> so it gets its own worktree. Link build/ and game/ into it, since ignored folders are not copied.
    • Give each worker its evidence pack: disassembly, callers, callees and names. Minecraft hands workers one class family at a time with evidence.
    • Merge only when the unit passes both seeds on the merged branch.
    • Send units that fail three tries to a hard job. Record what was tried in the ledger.
    Prompt for Claude
    GOAL: Rewrite the next <N> units of <GAME> from the ledger, one worker each.
    READ FIRST: `notes/units.csv` (status todo), `CLAUDE.md`.
    FENCE: You are the lead. Edit only `notes/units.csv` and `notes/dispatch.md`. Workers each edit one unit folder in `src/decomp/`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: After each merge, run `python3 tools/verify/verify.py <UNIT> -n 10000 -seed 1` and `-seed 7` on main in WSL. Done means every merged unit passes both, and the ledger shows each unit as done, hard or failed.
    BUDGET: At most <WORKERS> workers at once. Each worker stops after 3 tries.
    IF BLOCKED: Stop dispatching. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: ledger counts before and after, and the last verify rows. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe ledger shows the batch as done, hard or failed. Every done unit passes verify.py on -seed 1 and -seed 7 on main.

    Proof this works: Minecraft: Wii U Edition - source reconstruction, https://github.com/ZeldaWWHDDecomp/wwhd, https://code.claude.com/docs/en/worktrees.md

  7. Recover structures and make it readable

    Readable code needs real classes and fields, not raw offsets. Write headers for the game's objects. Then rewrite machine-like code into the style a person would write.

    • Write one header per class with its fields, offsets and size. Add static_assert checks for every offset and the total size.
    • Ban machine idioms. Minecraft's rules forbid raw memory loads for member access, hand-built vtables and decompiler names.
    • Run a readability check. The Wind Waker HD decomp has readable_check.py and readable_lint.py.
    • Rerun the harness after every rewrite. Wind Waker HD checked that results and coverage did not change.
    Prompt for Claude
    GOAL: Write a header for class <CLASS> of <GAME> and use it in the rewritten functions that touch it.
    READ FIRST: `notes/findings.md` entries for <CLASS>, the rewritten files listed in `notes/units.csv` for it.
    FENCE: Edit only `src/decomp/include/<CLASS>.h` and the rewritten files that use it. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Build the units with every `static_assert`. Then in WSL run `python3 tools/verify/verify.py <UNIT> -n 10000 -seed 1` and `-seed 7` for each touched unit, and the readability check. Done means all pass and coverage is not lower than before.
    BUDGET: Stop after 3 failed layouts.
    IF BLOCKED: Stop. Use a padding field marked unknown instead of guessing. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: build output, verify rows and coverage before and after. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe headers build with every assert on, every touched unit passes both seeds, and coverage did not drop.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Minecraft: Wii U Edition - source reconstruction

  8. Harden the decomp

    Check that the progress is real. A fresh session hunts for cheats. Then swap the decompiled code into the running game and compare it with the normal build.

    • Run every unit from a clean clone, once per seed: python3 tools/verify/verify_all.py -n 10000 -seed 1, then the same with -seed 7.
    • Run a fresh verify session on each merged batch. It looks for calls back to the function's own original address, stubs and edited unit specs.
    • Swap decompiled functions into the game and replay a scripted session. Wind Waker HD compared camera, random numbers, sounds and the picture step by step. Its swap build is not in the decomp repo. The port's -DWWHD_DECOMP=ON build does this on macOS only, so on Windows you must build your own.
    • Track the share of verified functions in PROGRESS.md.
    Prompt for Claude
    GOAL: Verify the last batch of rewritten units of <GAME> is real work.
    READ FIRST: `git log` since tag <TAG>, `notes/units.csv`, `CLAUDE.md`.
    FENCE: Read-only review. Edit only `notes/verify-<DATE>.md`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: On a clean clone in WSL, run `python3 tools/verify/verify_all.py -n 10000 -seed 1` and again with `-seed 7`. Done means you list each claimed unit as OK or SUSPECT. Look for: calls to the function's own original address, stubs, edited unit specs or input steering, lowered coverage, and changes outside the fence.
    BUDGET: Stop after 90 minutes.
    IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the run summary and the OK and SUSPECT lists. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOn a clean clone, verify_all.py -n 10000 -seed 1 and -seed 7 pass every unit. The verify note has no unexplained SUSPECT unit.

    Proof this works: https://github.com/ZeldaWWHDDecomp/wwhd, Wind Waker HD Recomp

  9. Build it on its own, then port

    A verified unit still calls other functions by their original address. To port, remove that glue so the code stands alone. Then put the console parts behind clear interfaces and build for the new system.

    • Replace each call-by-address with a direct call once both sides are decompiled. The Wind Waker HD code uses gabi::call(0xADDR, ...) until then.
    • For a rebuild that boots on Wii U or in Cemu, compile with a Green Hills ABI compiler. Minecraft runs python tools/prepare.py, then python tools/build.py, which builds RedHills in Docker. Then it runs python tools/package.py and Cemu -g build/title/code/Minecraft.Client.rpx.
    • Keep a platform seam. Minecraft's rule: a function sits below the seam only if it reaches a system import.
    • Turn PowerPC sync, lwsync and eieio into real memory barriers on ARM chips such as Apple Silicon. Make file paths case-insensitive on Linux.
    • Run the golden runs on the new system.
    Prompt for Claude
    GOAL: Make <GAME> build and boot on <TARGET> from the decompiled source.
    READ FIRST: `SCOPE.md`, `notes/port-<TARGET>.md`, the build log from the last try.
    FENCE: Edit only `src/platform/<TARGET>/`, `CMakeLists.txt` and `notes/port-<TARGET>.md`. Verified code in `src/decomp/` is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `<TARGET BUILD COMMAND>`, then the golden runs on <TARGET>. Done means it boots and the first golden run passes.
    BUDGET: One build error or one crash per session. Stop after 3 failed tries.
    IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: build and golden run output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOn the new system, the golden run command prints PASS for the same runs as on Windows.

    Proof this works: Minecraft: Wii U Edition - source reconstruction, https://github.com/ZeldaWWHDDecomp/wwhd, Wind Waker HD Recomp

Tools you need

ToolWhat it doesHow to get itHow we know
ZeldaWWHDRecomp (recompiler and runtime)
Required both
A working Wind Waker HD port. Its tools/recomp/recomp.py turns an .rpx into C, and its runtime stands in for Cafe OS, GX2, sound and input. Three other ports borrowed it.
Path A Path B
git clone https://github.com/ZeldaWWHDRecomp/ZeldaWWHDRecomp donor && git -C donor checkout <COMMIT>README sections Requirements, Building and Windows (read 2026-11-13); used by Wind Waker HD Recomp, NSMBU Recomp, Twilight Princess HD, Captain Toad and VR-WakerHD
cafe-recomp (in the Tekken Tag 2 port)
Helpful WSL/Linux
A second Wii U recompiler. It writes one C++ function per guest function, so any function can be swapped out. It refuses an unknown .rpx.
Path A
In a Linux newer than Ubuntu 24.04, such as Arch Linux in WSL: git clone https://github.com/Petexy/Tekken-Tag-2-Ultimate-Edition.git && cd Tekken-Tag-2-Ultimate-Edition && python3 tools/setup_deps.py && cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ && cmake --build build --target wua_extract cafe-recompREADME sections Requirements, Building, How it works and Tests (read 2026-11-13); its README says Ubuntu 24.04 and Debian 12 headers are too old, and shows Arch Linux packages; used by Tekken Tag Tournament 2 Ultimate and Smash 4 PC
LLVM Clang with Visual Studio headers
Required Windows
The compiler for the generated code. It must be Clang, because the code needs its musttail feature. Visual Studio supplies the Windows headers.
Path A Path B
Run LLVM-23.1.5-win64.msi from the LLVM 23.1.5 release, and install Visual Studio Community with the Desktop development with C++ workloadLLVM release llvmorg-23.1.5 assets (2026-11-03) and the ZeldaWWHDRecomp README Windows section (both read 2026-11-13)
llvm-mingw
Helpful Windows
A portable Clang for Windows in one zip. Use it if Visual Studio's Clang fails on the runtime.
Path A
Download llvm-mingw-20261104-ucrt-x86_64.zip from release 20261104 and unzip itreleases page (read 2026-11-13); used by VR-WakerHD, Smash 4 PC and MH3U Native PC; VR-WakerHD found Visual Studio's Clang 19 failed
CMake and Ninja
Required both
CMake writes the build plan and Ninja runs it fast. Every reviewed recomp builds with CMake, and most use Ninja.
Path A Path B
Install CMake 4.5.0 from cmake.org, and Ninja 1.13.2 with pip install ninjaCMake release v4.5.0 (2026-11-12) and Ninja release v1.13.2 (read 2026-11-13); the ZeldaWWHDRecomp README asks for CMake 3.20 or newer
Vulkan SDK
Required both
Headers and tools for the Vulkan graphics API, which the runtime draws with on Windows and Linux.
Path A
Download the Windows installer for Vulkan SDK 1.4.363.1 from vulkan.lunarg.com and set VULKAN_SDKvulkan.lunarg.com/sdk/latest.json lists 1.4.363.1 for Windows and Linux (read 2026-11-13); the ZeldaWWHDRecomp README requires it
Python 3 with pycryptodome (capstone optional)
Required both
Runs the recompiler, extract and audit scripts. pycryptodome decrypts disc images. The optional capstone powers the disassembler helper tools/ppcdis.py.
Path A Path B
Install Python 3 from python.org, then run pip install pycryptodome. Optional: pip install capstoneZeldaWWHDRecomp README Requirements (read 2026-11-13: pycryptodome for tools/wudextract.py, capstone optional for tools/ppcdis.py); python.org download page answers (2026-11-13); capstone also used by VR-WakerHD and Minecraft (crscan.py)
Git for Windows
Required both
Clones the donor port and the decomp harness, and pins each to one commit. Parallel workers in worktrees need it too.
Path A Path B
Download the installer from https://git-scm.com/downloads/win and run it. In WSL: sudo apt install gitgit-scm.com Windows download page and packages.ubuntu.com/noble/git answer (read 2026-11-13); the ZeldaWWHDRecomp and wwhd READMEs clone and pin with git
WSL with Ubuntu, clang and Python
Required WSL/Linux
Linux inside Windows. The Path B harness needs it, because it uses Linux signals. Use it for a Linux build too.
Path B
In PowerShell as administrator, run wsl --install, then restart. In Ubuntu: sudo apt install clang python3Microsoft WSL install page (read 2026-11-13: wsl --install installs Ubuntu); packages.ubuntu.com lists clang 18 and python3 for Ubuntu 24.04 (read 2026-11-13); the wwhd README asks for Python 3 and clang with C++20
Dumpling
Required Wii U console
Runs on your Wii U and copies your game, update and DLC as plain folders. No disc keys are needed after that.
Path A Path B
On the Wii U, open dumplingapp.com, or extract dumpling.zip from release 2.7.2 to the root of your SD card and start it from the Homebrew LauncherREADME and releases (read 2026-11-13: 2.7.2 of 2024-05-12); Smash 4 PC asks for a Dumpling dump; the app runs on the console and you copy its output to your PC
Cemu
Required both
A Wii U emulator. Run the same scene in it to tell a port bug from the game's own behavior. Minecraft also tests its rebuilt .rpx in it.
Path A Path B
Download the Windows portable zip of v2.6 from the releases page and unzip itREADME and releases (read 2026-11-13: v2.6 of 2025-02-06); used as reference by Cha-Cha-Plus, Tekken and Wind Waker HD Recomp, and to run Minecraft's rebuild
Ghidra with GhidraRPXLoader
Required both
A free disassembler and decompiler. The loader opens .rpx files with the Espresso chip, paired singles included.
Path A Path B
Unzip Ghidra 12.0 and install JDK 21. Copy GhidraRPXLoader-0.9.2-d496d43-Ghidra_12.0.zip into <GHIDRA>/Extensions/Ghidra, then add it with File, Install Extensionsloader README and release 0.9.2 (2026-01-13), Ghidra releases and application.properties at 12.0.4 (Java 21), read 2026-11-13; Cha-Cha-Plus and Pikmin 3 used Ghidra, Project Yamamura used it with a Wii U loader
RenderDoc
Helpful both
Captures one frame so you can step through every draw. Use it for graphics bugs.
Path A
Download the Windows installer for v1.47 from renderdoc.orgrepo and releases (read 2026-11-13: v1.47 of 2026-10-31); used by Pikmin 3
wiiurpxtool
Helpful Windows
Unpacks a compressed .rpx into a plain ELF file that other tools can read.
Path B
Download wiiurpxtool.zip from release v1.3 and run wiiurpxtool -d <NAME>.rpx <NAME>.elfREADME and releases (read 2026-11-13); used by Project Yamamura and Cha-Cha-Plus
m2c
Helpful both
Turns PowerPC assembly into a first C draft. It has no Green Hills profile, so treat its output as a rough start.
Path B
git clone https://github.com/matt-kempster/m2c.git, then run python3 m2c/m2c.py -t <TARGET> <FILE>.s with a ppc targetREADME (read 2026-11-13: usage is python3 m2c.py with -t; platform ppc; compilers ido, gcc, mwcc; no pip install documented); used by Project Yamamura, where 724 drafts needed repair
Differential harness from the Wind Waker HD decomp
Required WSL/Linux
Runs a rewritten function next to its recompiled twin on generated and recorded inputs. It compares results, memory writes and calls, and tests itself with mutants.
Path B
In WSL: git clone https://github.com/ZeldaWWHDDecomp/wwhd decomp, then copy decomp/tools/verify into your port checkout as its README showsREADME and tools/verify/README.md (read 2026-11-13: needs Python 3 and clang with C++20; uses SIGUSR1 and mmap; verify_all.py takes one -seed per run); built for Wind Waker HD only, so you must adapt it to your game
RedHills and wut
Helpful both
RedHills is a Clang fork that lays out C++ classes like the Green Hills compiler. wut is the homebrew Wii U SDK. Together they rebuild a standalone .rpx.
Path B
Install devkitPro, then run dkp-pacman -Syu --needed wiiu-dev; build RedHills from https://github.com/Jacobwasbeast/RedHills in Docker as the Minecraft repo's tools/build.py doesRedHills repo metadata and wut README (read 2026-11-13); used by Minecraft: Wii U Edition; RedHills is experimental, with 0 stars

Skills and add-ons

Read any skill before you install it. A skill is a set of instructions that Claude will follow. See Tools and Skills for the full list and safety notes.

verification-before-completion

skills.sh

Claude may not say done without fresh proof. That fits Wii U work, where a green build often hides a boot that still fails.

npx skills add obra/superpowers --skill verification-before-completion -a claude-code

static-recomp-scope-plan

skills.sh

Makes you name the exact build, the scenes to test and the numbers to hit before work starts. That is Path A step 1. It was written for Codex, so check its paths.

npx skills add bgyss/switchrecomp --skill static-recomp-scope-plan -a claude-code

ghidra-headless

skills.sh

Runs Ghidra with no window and saves functions and symbols to files. It needs no MCP server, so you can keep the Ghidra version the .rpx loader needs. It needs bash, such as Git Bash, and JDK 17 or newer. Set GHIDRA_HOME yourself on Windows.

npx skills add trailofbits/skills-curated --skill ghidra-headless -a claude-code

systematic-debugging

skills.sh

No fix until the cause is found. That matches the Wii U bug loop: compare with Cemu or RenderDoc first.

npx skills add obra/superpowers --skill systematic-debugging -a claude-code

dispatching-parallel-agents

skills.sh

Shows the lead session how to brief one worker per Path B unit, and when not to split.

npx skills add obra/superpowers --skill dispatching-parallel-agents -a claude-code

handoff

skills.sh

Writes a short note so the next session can carry on. Tell it to save inside your project, not the temp folder.

npx skills add mattpocock/skills --skill handoff -a claude-code

GhidraMCP

MCP server

Lets Claude list and rename functions in your open Ghidra project. It needs Ghidra 12.1.4, so you must build the .rpx loader for that version first.

Install Ghidra 12.1.4 and uv, add the GhidraMCP 2.0 extension, then run claude mcp add ghidra -- uvx --from git+https://github.com/LaurieWired/GhidraMCP ghidra-mcp --ghidra-server http://127.0.0.1:8080/

Wind Waker HD world-editor MCP

MCP server

A real Wii U port that lets Claude act on the running game. Use it as a model for your own debug port, so a script can read game state.

Start the port with --editor --mcp, then add it with claude mcp add --transport http wwhd-editor http://127.0.0.1:47615/mcp and the token header from docs/mod-stages-ai.md

verify (write your own)

write-your-own

NSMBU's verify skill does this, and its AGENTS.md makes Claude read it before finishing any change.

Make `.claude/skills/verify/SKILL.md`. It lists every check a command can settle: `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden`, the import audit, and for Path B both harness seeds. It ends with Host, Place, Actions and Pass lines for any step only a person can test, marked unverified.

scenes and crash (write your own)

write-your-own

NSMBU keeps scenes and crash skills so Claude boots a level and reads a crash without asking. It also warns Claude never to run a command that opens an interactive screen.

Make `.claude/skills/scenes/SKILL.md` with one recipe per test scene: the warp or save to use, the flags, and the screenshot to expect. Make `.claude/skills/crash/SKILL.md` saying where boot, run and crash logs live and how to read the last 50 lines.

Claude setup for this system

Cut Path A by stop point. One unit is one missing import, one crash, or one wrong picture, each with a repro run. Cut Path B by unit. One unit is one class family or source file, checked by the harness on two seeds. Keep library code, such as the Green Hills runtime, out of the units. Every unit ends with a run, never with a build alone.

Which model and effort for each job

The model and effort names come from one shared table, so they stay the same on every guide. See Claude Setup for the reasons.

JobWhat it means on this systemMax 20x (now called Ultra)Max 5x (now called Max)
Plan the projectPick the region, update and donor port. Look for a sister decomp or port on the same engine. Write SCOPE.md with the .rpx hash.Fable 5.2
effort high
One session. This choice shapes months of work.
Opus 5.5
effort high
Use Fable 5.2 for this one session if you have weekly room.
Set up the projectInstall LLVM, CMake, Ninja and the Vulkan SDK. Pin the donor commit. Write tools/check.ps1 and prove it with the stub build.Opus 5.5
effort medium
Sonnet 5.5
effort medium
Study the game fileOpen the .rpx in Ghidra with the loader. Audit imports against the runtime. Name functions from symbols, type info and sister decomps, with a confidence for each.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for function edges and data layouts. A mistake there spreads.
Bulk unitsAdd the next missing Cafe OS imports, one each. In Path B, rewrite leaf units that the harness can prove.Sonnet 5.5
effort medium
Haiku 5.5 for the plainest units.
Sonnet 5.5
effort medium
Fewer workers at once. Haiku 5.5 for the plainest units.
Hard unitsPaired-single math, thread handshakes, units the harness keeps failing, and functions that failed three bulk tries.Fable 5.2
effort high
Go to xhigh only after a failed try at high.
Opus 5.5
effort high
Send only the last few that still fail to Fable 5.2.
Build the runtimeCafe OS threads and sync, file paths, saves, GX2 features the donor lacks, shaders, sound mixing and input.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for timing and graphics bugs.
Find a bugCrashes and hangs. Compare with Cemu, capture frames in RenderDoc, replay recorded input. Prove the cause before the fix.Opus 5.5
effort high
After two failed tries with full evidence, move to Fable 5.2.
Opus 5.5
effort high
One bug at a time.
Check the workA fresh session reruns the golden runs or both harness seeds and reads the diff. It hunts for fake success codes, stubs, calls to a function's own original address and edits to generated code.Opus 5.5
effort medium
Always a new session, never the one that did the work.
Sonnet 5.5
effort high
Always a new session, never the one that did the work.
Keep the recordsUpdate PROGRESS.md, notes/imports.csv, notes/functions.csv, notes/units.csv and the bug list after each unit.Haiku 5.5
effort medium
Haiku 5.5
effort medium

How many sessions at once

Max 20x (now called Ultra)

Run one lead session and three to four workers, each in its own worktree. A full build of the generated code needs about 0.5 GB of memory per compile job, per BotW Native. So cap jobs per worker. In Path B, give each worker one unit.

Max 5x (now called Max)

Run one lead and one or two workers. Use workers for import stubs and leaf units. Keep runtime, debug and hard jobs to one at a time.

Lines for this project's CLAUDE.md

Add to CLAUDE.md
- Read `SCOPE.md` and `PROGRESS.md` at the start of every session.
- Never edit `build/gen` or any generated file. Change the recompiler config, the hook list or the runtime instead.
- `game/`, `donor/` and `build/` are read-only. Never commit game files, keys, generated code, save states or screenshots.
- Addresses belong to one build. If the `.rpx` hash differs from `SCOPE.md`, stop and tell me.
- Do not guess facts about the binary. Confirm in Ghidra or Cemu first, and mark unsure names with a `?` suffix.
- A missing system call fails loudly with its name. Never return a fake success to get past it.
- The only proof is `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden`, or both harness seeds for Path B. A green build alone is not done.
- Record every finding in `notes/findings.md` with date, address, evidence and confidence. Record dead ends too.
- Run the game only under a time limit. Stop only your own process, by its process ID.
- Never run a command that opens an interactive screen. Use flags only.
- In a worktree, use absolute paths and run the full check before you report.
- Start every report with DONE, PARTIAL or BLOCKED, then paste the check output.

Keep the context small

  • Never let Claude list or read all of build/gen. Point it at one function by address.
  • Give the last 50 log lines and the stop address, not the whole log.
  • Keep findings in CSV and short notes that the next session reads first, as Cha-Cha does with HANDOFF.md and docs/research-log.md.
  • Add Read(./game/**) to permissions.deny in .claude/settings.json.
  • Use /clear between units. The state lives in the ledger files, not the chat.

More prompts for this system

Each step above has its own prompt. These extra prompts cover the rest of the work. Fill in the parts in <ANGLE_BRACKETS>.

Scope and feasibility

Before any work, to see if your game is a good first target.

Prompt for Claude
GOAL: Tell me if <GAME> (Wii U, title ID <TITLE ID>) is a good recomp target, and draft SCOPE.md.
READ FIRST: `notes/game-files.txt`, RecompLauncher's list for my game, https://github.com/ZeldaWWHDRecomp/ZeldaWWHDRecomp, https://github.com/Petexy/Tekken-Tag-2-Ultimate-Edition.
FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Prior work|Donor port|Update|Engine|Risks)$'`. Done means it prints 5 lines: prior ports of this game or its engine with links, the donor you suggest and why, the update needed, the engine if known, and risks. Each fact has a link or a file path.
BUDGET: Stop after 45 minutes of research.
IF BLOCKED: Stop. Say what you could not find. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the links. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A short yes, no or maybe, with links to any port on the same engine, a suggested donor and a draft SCOPE.md.

Map the binary

After setup, to build the function and import ledgers.

Prompt for Claude
GOAL: Produce `notes/functions.csv` and `notes/imports.csv` for `game/code/<NAME>.rpx`.
READ FIRST: `SCOPE.md`, the Ghidra headless export in `notes/ghidra/`, `donor/runtime/src/`.
FENCE: Edit only `notes/functions.csv`, `notes/imports.csv`, `notes/findings.md` and `tools/`. `game/` and `donor/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: If `tools/ledger_check.py` is missing, write it first. Run `python tools/audit_imports.py game/code/<NAME>.rpx donor/runtime/src` and `python tools/ledger_check.py notes/functions.csv`. Done means both print PASS. Report the function count, how many have names, and how many imports are missing.
BUDGET: Stop after 60 minutes.
IF BLOCKED: Stop. Do not invent names. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both outputs and the counts. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: Two CSV files, a missing-import count, and a list of library areas to leave alone.

Unit loop, Path A: one missing import

Many times during boot and play, one import per session.

Prompt for Claude
GOAL: Implement Cafe OS import <IMPORT> so <GAME> gets past it.
READ FIRST: `notes/imports.csv` row for <IMPORT>, the last 50 lines of `out/logs/boot.txt`, how Cemu handles <IMPORT> (read only, copy no code).
FENCE: Edit only `src/cafe/<LIBRARY>/` and `notes/imports.csv`. `build/gen`, `donor/` and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -BootSeconds 120` and `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden`. Done means the log passes <IMPORT> and every golden run still passes.
BUDGET: Stop after 3 failed tries.
IF BLOCKED: Stop. Do not return a fake success. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: old and new last log lines and the golden run output. 3) Files changed. 4) The import's new status. 5) New parking-lot items.

A good answer: One import marked partial or done, with the log line that proves the game moved on.

Unit loop, Path B: one unit

Many times during the decomp grind, one unit per worker.

Prompt for Claude
GOAL: Rewrite unit <UNIT> of <GAME> as readable C++ that passes the harness.
READ FIRST: `notes/units.csv` row for <UNIT>, its evidence pack in `notes/packs/<UNIT>/`, `CLAUDE.md`.
FENCE: Edit only `src/decomp/<UNIT>/` and `tools/verify/units/<UNIT>`. Never call a function's own original address from its new body. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: In WSL run `python3 tools/verify/verify.py <UNIT> -n 10000 -seed 1` and `-seed 7`. Done means every row says ok and coverage is at least <COVERAGE>.
BUDGET: Stop after 5 tries with no gain.
IF BLOCKED: Stop. Leave the unit as recompiled code. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both verify outputs. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: Readable C++ with real names, two ok runs, and coverage at or above the target.

Batch dispatch

When the lead session hands out the next set of units.

Prompt for Claude
GOAL: Pick the next <N> units for <GAME> and launch one worker per unit.
READ FIRST: `notes/units.csv`, `notes/imports.csv`, `PROGRESS.md`.
FENCE: You are the lead. Edit only `notes/dispatch.md` and the status column of the ledgers. Do not edit code. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Each worker reports its check output. Done means every unit in `notes/dispatch.md` is marked done, hard or failed, with pasted proof.
BUDGET: At most <WORKERS> workers at once. Stop after one batch.
IF BLOCKED: Stop dispatching. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the dispatch table with results. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A table of units, workers and outcomes, each backed by a pasted check.

Debug with evidence

When a crash, hang or wrong picture has no clear cause.

Prompt for Claude
GOAL: Find the cause of <SYMPTOM> in <GAME>. Do not fix it yet.
READ FIRST: `notes/bugs.md` entry <BUG-ID>, the last 50 lines of its log, the RenderDoc capture or input recording named there.
FENCE: Read-only, except `notes/bugs.md` and new files in `notes/traces/`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Done means you name one cause and show two pieces of evidence: the same scene in Cemu, a frame capture, a trace or a replayed input that shows it. State how a fix would be checked.
BUDGET: Stop after 45 minutes with no new evidence.
IF BLOCKED: Stop. List what you ruled out and what evidence you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the evidence. 3) Files changed. 4) Suggested fix and its check. 5) New parking-lot items.

A good answer: One proven cause, such as a missing memory barrier or a thread running on the wrong core, with the evidence and a test plan.

Verify (hunt for cheating)

After every batch, in a fresh session with no memory of the work.

Prompt for Claude
GOAL: Check that the claimed work in <BRANCH OR TAG RANGE> for <GAME> is real.
READ FIRST: `git log <RANGE>`, `git diff <RANGE>`, `CLAUDE.md`.
FENCE: Read-only review. Edit only `notes/verify-<DATE>.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: On a clean clone, run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden`, and for Path B run `python3 tools/verify/verify_all.py -n 10000 -seed 1` and `-seed 7` in WSL. Done means each claimed unit is listed OK or SUSPECT. Look for: edits to generated code, fake success returns, new stubs not in `notes/imports.csv`, calls to a function's own original address, edited baselines or unit specs, lowered coverage, and changes outside the fence.
BUDGET: Stop after 90 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check outputs and the OK and SUSPECT lists. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A short OK and SUSPECT list. Each SUSPECT names the file, the line and the rule it breaks.

Status report

Once a week, or before you plan the next milestone.

Prompt for Claude
GOAL: Report the status of the <GAME> project with numbers only.
READ FIRST: `PROGRESS.md`, `notes/imports.csv`, `notes/functions.csv`, `notes/units.csv`, `notes/bugs.md`.
FENCE: Read-only. Edit only `PROGRESS.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `powershell -ExecutionPolicy Bypass -File tools/check.ps1 -Golden` once. Done means `PROGRESS.md` shows imports done of total, golden runs passing of total, open bugs, and for Path B verified functions of total, each with the date.
BUDGET: Stop after 20 minutes.
IF BLOCKED: Stop. Say which number you could not get. Tell me what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and the counts. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A table of counts with dates, and no padding.

Session handoff

At the end of every session, or when your plan limit is close.

Prompt for Claude
GOAL: Write what the next session needs into the ledger files for <GAME>.
READ FIRST: `PROGRESS.md`, `notes/findings.md`, `git status`, `git log -5`.
FENCE: Edit only `PROGRESS.md`, `notes/handoff.md` and `notes/findings.md`. Do not edit code. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Done means `notes/handoff.md` has four parts: what works with proof, what is half done with the file names, the next unit with its check command, and open questions. A fresh session must be able to start from it alone.
BUDGET: Stop after 15 minutes.
IF BLOCKED: Stop. Tell me what blocked you and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the new `notes/handoff.md`. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A one-page handoff that names the next unit, its check command and the dead ends to skip.

Blocked or cannot deliver

When a unit keeps failing and Claude starts to circle.

Prompt for Claude
GOAL: Give me a plain answer on whether <UNIT OR BUG> in <GAME> can be done with the current tools.
READ FIRST: `notes/findings.md`, `notes/bugs.md` or `notes/units.csv` entries for <UNIT OR BUG>, the logs of the failed tries.
FENCE: Read-only. Edit only `notes/findings.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Done means you answer CAN, CANNOT or UNKNOWN in the first line, then list what was tried, the exact failing output, and two or three options with their cost in sessions.
BUDGET: Stop after 20 minutes.
IF BLOCKED: Stop. Answer UNKNOWN and say what evidence would decide it.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the failing output. 3) Files changed. 4) Options. 5) New parking-lot items.

A good answer: One word first, then the evidence and real options, such as leaving the unit as recompiled code.

Scope change request

When Claude finds work outside the fence that seems needed.

Prompt for Claude
GOAL: Ask me before you leave the fence for <TASK> in <GAME>.
READ FIRST: `SCOPE.md`, the current task card, `notes/parking-lot.md`.
FENCE: Do not edit any file outside the current fence. Edit only `notes/scope-requests.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Done means `notes/scope-requests.md` has one entry with: the file or folder you want to touch, why the task needs it, the risk, and how the change would be checked.
BUDGET: Stop after 10 minutes.
IF BLOCKED: Stop and wait for my answer. Do not start the change.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the new entry. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A short request I can answer yes or no, with no code changed yet.

Keep Claude on task

These are the detours Claude tends to take on this system, and the rule that stops each one. The full method is on Stay on Task.

The detourThe rule to give Claude
Claude edits the generated C in build/gen to fix a crash. The next codegen wipes the fix and hides the cause.Never edit build/gen. Fix the recompiler config, a hook or the runtime. Add Edit(./build/gen/**) to permissions.deny in .claude/settings.json.
Claude makes a missing system call return success so the game moves on. The game now runs, but wrong.A missing import fails loudly with its name. Track each one in notes/imports.csv as stub, partial or done. Captain Toad uses exit code 78 for this.
Claude applies addresses or hooks from the donor game to yours, or from one region to another.Empty the donor's hook lists. If the .rpx hash differs from SCOPE.md, stop and tell me. Cha-Cha's CLAUDE.md has the same rule.
Claude invents a function or class name that sounds right.Confirm every name in Ghidra, Cemu or a sister decomp. Otherwise keep sub_<ADDRESS>, or add a ? suffix. NSMBU's decompile skill forbids invented library names.
In Path B, a rewritten function calls its own original address and so passes the harness without real work.A unit may call other functions by address, but never itself. The verify session greps for this and marks the unit SUSPECT.
Claude says a feature works because it builds, or because the change looks right.Done needs pasted check output. Do not claim graphics, speed or gameplay you did not test. Captain Toad's AGENTS.md says this, and MH3U shows why.
Claude copies code from Cemu or other emulators into the repo.Cemu is a reference only. Copy no code from it without asking me first. Cha-Cha had to rewrite its public history after code was copied in.

Problems other projects hit

Guest threads that ran truly in parallel on one core corrupted shared game data.

Fix: Copy Cafe OS scheduling: one running thread per core, with strict priorities.

Seen in: Wind Waker HD Recomp, NSMBU Recomp, Twilight Princess HD: Recompiled

Clang folded a guest spin-wait into a single read, so threads never saw each other and the game hung.

Fix: Make every guest load and store volatile, and keep a test that guards it, like memory_model_test.

Seen in: Tekken Tag Tournament 2 Ultimate, Smash 4 PC

The generated code does not build with cl.exe, MSVC or clang-cl.

Fix: Build with Clang. The ZeldaWWHDRecomp family needs Clang's musttail. BotW Native needs MinGW gcc for pthreads instead, so check your donor's README.

Seen in: Wind Waker HD Recomp, VR-WakerHD, BotW Native, NSMBU Recomp

Apple Silicon reorders memory more than Espresso does, so plain recompiled code can break there.

Fix: Turn sync, lwsync and eieio into real memory barriers in the recompiler, as these ports do.

Seen in: Wind Waker HD Recomp, NSMBU Recomp, Twilight Princess HD: Recompiled

Wii U file names are not case-sensitive, but Linux file names are. Files failed to load on Linux.

Fix: Resolve path case in the runtime's file system layer.

Seen in: Wind Waker HD Recomp

Builds need lots of memory and disk. Generated code takes about 0.5 GB per compile job, and SplatPC needs about 40 GB free.

Fix: Cap compile jobs at about (RAM in GB minus 2) divided by 0.75, as BotW Native advises. Check free disk space before setup.

Seen in: BotW Native, SplatPC, Smash 4 PC, Pikmin 3: native Windows port (static recompilation)

Ubuntu 24.04 ships SDL and Vulkan headers that are too old, and SDL3 is not packaged there.

Fix: Build SDL3 from source in WSL, or build on Windows instead. Tekken's README lists the minimum versions.

Seen in: Tekken Tag Tournament 2 Ultimate, Wind Waker HD Recomp

A changelog claimed a rumble fix that did not work. The game never asks for rumble.

Fix: Check what the game actually calls before you claim a feature. Test it in a run before you write release notes.

Seen in: MH3U Native PC

Stock GCC or Clang lays out C++ classes differently from Green Hills, so a rebuilt game misbehaves.

Fix: Use a Clang fork with the Green Hills ABI, such as RedHills, for any standalone rebuild.

Seen in: Minecraft: Wii U Edition - source reconstruction

How long it takes

Max 20x (now called Ultra)Max 5x (now called Max)One person, no AIHow sure
Path A: running on PC3 to 10 weeks2 to 6 months6 to 18 monthsmedium confidence
Path B: full decomp6 to 18 months, after Path A1 to 3 years5 to 10 years, not realistic for one personlow confidence

Read this first

The numbers assume one medium commercial game and one person giving 10 to 15 hours a week. Path A comes from three dated Wii U projects whose makers say they used AI. They agree that a first boot takes days. But two were forks of a working port, and their real hours are unknown, so confidence is medium. No Wii U recomp predates agents, so the no-AI range borrows from Xbox 360 work. Path B rests on two AI-assisted projects that leaned on sister codebases, and neither is a full standalone decomp, so confidence is low.

What makes it faster or slower

  • A donor port of a sister game. Twilight Princess HD forked the Wind Waker HD port and reached its title screen by 2026-10-14. That port's first commit was 2026-10-01.
  • How many imports and GX2 features your game needs that the donor lacks. Captain Toad started with 62 missing imports.
  • Region and update. Each build has its own addresses, so hooks and names do not carry over.
  • For Path B, a sister decomp. Wind Waker HD borrowed names and structures from the GameCube decomp.
  • For Path B, game size. Wind Waker HD has 39,713 functions; Tekken's recompiler found 205,200 entry points.

The facts behind these numbers

ProjectWhat happenedLink
Wind Waker HD RecompFirst commit 2026-10-01. First release 2026-10-05. 21 contributors. Playable start to finish. AI use flagged by the store.source
NSMBU RecompForked from the Wind Waker HD port. First release 2026-10-09. README says it was made with the help of AI agents.source
Cha-Cha-Plus (Cha-Cha)Own recompiler. Local work began about 2026-10-23. Its notes date version 0.1.0 to 2026-10-28. First GitHub release 2026-11-02. Described as AI assisted, with a CLAUDE.md.source
Twilight Princess HD: RecompiledFork of the Wind Waker HD port. Boots to the title screen and Ordon Village by 2026-10-14. Credits say Claude assisted.source
Tekken Tag Tournament 2 UltimateOwn recompiler. Design decided 2026-10-01. First release 2026-10-23. Three contributors.source
Wind Waker HD verified decompFirst commit 2026-10-05. 38,828 of 39,713 functions verified by 2026-11-12. 42 commits under one shared author name; 33 carry a Claude co-author line.source
Minecraft: Wii U Edition reconstructionFirst commit 2026-09-02. 77.4% of compared functions clean by its parity script on 2026-10-18. Written by AI agents under review.source
red-pro2 (New Super Mario Bros. U decomp)Started 2022-06. One contributor, 451 commits, still partial. No AI use is stated. Its README jokes it may reach 100% in 50 years.source
Unleashed Recompiled (Xbox 360, also PowerPC)Before coding agents. First commit 2024-09-30. First release 2025-03-01. 26 contributors.source

Projects reviewed (14)

RecompLauncher has fewer than 10 games for Wii U: 8 projects for 6 games, and we reviewed all 8. We added 6 projects from outside RecompLauncher, one per new game, for 14 projects and 12 games. More than 10 real projects exist, but the field is young: most started in October 2026.

What each project teaches

Wind Waker HD Recomp

The Legend of Zelda: The Wind Waker HD

Top rated on RecompLauncherstatic recompplayable
tools/recomp/recomp.pyClangCMakeNinjaVulkanMetal

Started: 2026-10. First release: 2026-10. Code: C++ and C.

AI: store flag only; the repo documents Claude Code with its world-editor MCP for modding

Lesson: The base most other Wii U ports grew from. It builds only from your own dump, and it reuses Cemu's shader code instead of writing its own.

BotW Native

The Legend of Zelda: Breath of the Wild

Top rated on RecompLauncherstatic recompin progress
tools/recompile.pyMSYS2 MinGW gccCMakeNinjaVulkanCemu Latte layer

Started: 2026-10. First release: 2026-10. Code: C++.

AI: none stated

Lesson: A fork that added Windows to an iPhone and Mac port. It shows a big open-world game can run, but it was tested on one PC only.

NSMBU Recomp

New Super Mario Bros. U

Top rated on RecompLauncherstatic recompplayable
recomp/recomp.pyClangCMakeNinjansmbu CLIVulkan

Started: 2026-10. First release: 2026-10. Code: C++, Python and TypeScript.

AI: yes: README says it is made with the help of AI agents Agent files: AGENTS.md, tools/cli/AGENTS.md, .agents/skills/verify/SKILL.md, .agents/skills/cli/SKILL.md.

Lesson: The best model for directing Claude here. A scriptable game command line plus a verify skill let the agent prove each change without a person.

Tekken Tag Tournament 2 Ultimate

Tekken Tag Tournament 2: Wii U Edition

Top rated on RecompLauncherstatic recompplayable
cafe-recompcafe-censusClangCMakeNinjaVulkan

Started: 2026-10. First release: 2026-10. Code: C++ and Python.

AI: store flag only; none stated in the repo

Lesson: Wrote its own recompiler and tested every instruction form against Dolphin's interpreter. Marking guest memory volatile fixed a hang.

Smash 4 PC

Super Smash Bros. for Wii U

Top rated on RecompLauncherstatic recompplayable
cafe-recompllvm-mingwCMakeNinjaVulkanPowerShell build scripts

Started: 2026-10. First release: 2026-10. Code: C++ and Python.

AI: store flag only; none stated in the repo

Lesson: Retargeted the Tekken recompiler and runtime to a new game. Its design document still describes Tekken, so check what really applies.

SplatPC

Splatoon

From outside RecompLauncherstatic recompin progress
RebrewU (fork)CMakeNinjaVulkanglslangGo builder

Started: 2026-10. First release: unknown. Code: C++.

AI: yes: AGENTS.md has coding rules; docs credit Codex for one optimisation Agent files: AGENTS.md.

Lesson: Puts every game-specific change in a manifest or a hooks folder, so the recompiler stays generic. Input record and replay make bugs repeatable.

Cha-Cha-Plus

Monster Hunter 3 Ultimate

Top rated on RecompLauncherstatic recompin progress
own recompilerGhidra 12.0 headlessCemu (reference)VulkanSDL3CMake

Started: 2026-10. First release: 2026-11. Code: C++.

AI: yes: GitHub description says AI Assisted; CLAUDE.md and HANDOFF.md guide Claude sessions Agent files: CLAUDE.md.

Lesson: Its CLAUDE.md is a good template: stop on a hash mismatch, confirm names before saving them, and log every finding with date and address.

Twilight Princess HD: Recompiled

The Legend of Zelda: Twilight Princess HD

From outside RecompLauncherstatic recompin progress
tools/recomp/recomp.pyclangCMakeMetaltools/decomp/match.py

Started: 2026-10. First release: none. Code: C++.

AI: yes: CREDITS.md says the additions were developed with Claude

Lesson: Forking a sister game's port gave a title screen and all 78 stages loading by 2026-10-14. It is macOS only so far.

Minecraft: Wii U Edition - source reconstruction

Minecraft: Wii U Edition

From outside RecompLauncherotherin progress
RedHillsdevkitPPCwutld.lldDockertools/measure/parity.py

Started: 2026-09. First release: none. Code: C++03.

AI: yes: README says all source was written by AI agents under human direction; workers were Claude agents

Lesson: A non-matching decomp that builds its own .rpx and boots in Cemu. It first built a Clang fork with the Green Hills class layout.

Pikmin 3: native Windows port (static recompilation)

Pikmin 3

From outside RecompLauncherstatic recompplayable
XenonRecomp (patched)Ghidradecaf-emu GX2Vulkanclang-clRenderDoc

Started: 2026-10. First release: none. Code: C++ and C.

AI: none stated

Lesson: Adapted an Xbox 360 recompiler by adding paired-single math. It fed it a 45,000-function list exported from Ghidra.

Captain Toad EUR - Android recompilation prototype

Captain Toad: Treasure Tracker

From outside RecompLauncherstatic recompin progress
ZeldaWWHDRecomp (pinned commit)tools/audit_rpx.pycdecryptAndroid NDKCMakeCTest

Started: 2026-10. First release: unknown. Code: C++ and Python.

AI: AGENTS.md exists; how AI is used is not stated Agent files: AGENTS.md.

Lesson: The clearest recipe for a new game on a borrowed runtime: pin the donor, switch off its hooks, and audit imports first.

MH3U Native PC

Monster Hunter 3 Ultimate

Lower rated on RecompLaunchermod of a portin progress
mh3u-tools (modified mh3u-port)llvm-mingwPySide6Python unittest

Started: 2026-10. First release: 2026-10. Code: Python (launcher); Rust engine upstream.

AI: store flag only; none stated in the repo

Lesson: Keeps its engine changes as numbered patch files. Its changelog admits a claimed fix did not work, which shows why proof matters.

VR-WakerHD

The Legend of Zelda: The Wind Waker HD

Lower rated on RecompLaunchermod of a portin progress
tools/recomp/recomp.pyllvm-mingwCMakeNinjaOpenXRctest

Started: 2026-11. First release: 2026-11. Code: C++.

AI: store flag only; none stated in the repo

Lesson: Adds VR on top of the Wind Waker HD port and keeps it as an upstream remote. It found Visual Studio's Clang failed and used llvm-mingw.

Project Yamamura

Super Mario Maker

From outside RecompLaunchermatching decompin progress
Green Hills ccppc 5.3.27wiiurpxtoolGhidram2ctools/match.py

Started: 2026-11. First release: none. Code: C.

AI: yes: GitHub description says made with AI assistance

Lesson: Byte matching works if you own the Green Hills compiler. Nobody without that licence can repeat its checks.

What we could not check

  • No reviewed project uses the ZeldaWWHDRecomp recompiler on a new game through the exact steps in Path A. Captain Toad comes closest, but its public build does not yet make a playable game.
  • Adding your own game target to the donor's CMake setup was not tested here. How much work it takes is not known.
  • The donor runtime checks for cking.rpx at start. How much must change so it accepts another game's .rpx was not tested.
  • WWHD_WARP was seen only in the Twilight Princess HD card. A code search of the donor repo did not find it.
  • The in-game swap test of Path B has no public Windows setup. The port's decomp build runs on macOS only so far.
  • The harness was not built in WSL here. Whether Ubuntu 24.04's clang 18 is new enough was not tested.
  • The cafe-recomp route was not tried in WSL. Its README targets Linux and shows Arch Linux packages.
  • The PowerShell check commands were tested here only on small sample files, in Windows PowerShell 5.1.
  • Whether GhidraRPXLoader-0.9.2, built for Ghidra 12.0, also loads in Ghidra 12.0.4 was not tested.
  • Building the loader for Ghidra 12.1.4, so that GhidraMCP can run beside it, was not tested.
  • The Wind Waker HD harness uses Linux signals, so the guide says WSL. Whether it runs on native Windows was not checked.
  • The harness was built for Wind Waker HD only. How much it must change for another game is not known.
  • RedHills has no releases and 0 stars. Its build steps were read in the Minecraft card, not run here.
  • Whether objdiff can compare Wii U code was not checked. Its README lists PowerPC for GameCube, Wii, PS3 and Xbox 360 only.
  • Whether you may legally use any Green Hills compiler copy is your call. The Breath of the Wild matching repo downloads one, and this guide does not recommend that.
  • AI use for several projects comes only from a store flag, not from the developers.
  • None of the tools or projects was built or run here. Commands come from their READMEs and the review cards.

Sources