Wii decomp guide
New recomp tools and one finished decomp make the Wii a strong second system to learn.
What this system is like
The Wii runs PowerPC code, like the GameCube. The two systems share most tools. A Wii game is one main program file, main.dol. Many games also load extra code files called RELs.
Path A uses static recompilation. A tool reads the game's code and writes C++ that does the same thing. Since August 2026, most Wii ports reviewed here use the WiiCompiled translator and the Aurora graphics layer. The hard part is not the translator. It is the runtime: the code that stands in for the Wii's graphics, sound, input and files.
Path B is a matching decompilation. You write C or C++ that the original compiler turns back into the same bytes. The tools are decomp-toolkit, objdiff and the Metrowerks compiler. At least one Wii game, Mario Strikers Charged, is fully matched and linked. A PC port was built on top of it.
Almost everything runs on Windows. WSL is only needed for decomp-permuter's shared mode and for Linux builds. Wii games are big. The games checked here have 14,620 to 92,522 functions, so plan for a long Path B.
Same chip family as the GameCube
The Wii uses a faster GameCube chip. So decomp-toolkit, objdiff, Aurora and Dolphin all serve both systems. You can borrow GameCube work and advice.
Code is split into DOL and REL files
The main program is main.dol. Many games load more code from .rel modules at run time. A recompiler cannot see that code unless you link the RELs first, at fixed addresses.
GX graphics become many shaders
GX is a fixed-function pipeline. On PC each setting mix becomes its own GPU pipeline. One port compiled for 17 minutes on first launch. Ports ship a pipeline cache to avoid this.
A full recomp stack appeared in 2026
WiiCompiled came out in August 2026. By the end of October, six more of the ports reviewed here used it. Each new game still needed its runtime hooks moved to new addresses.
Every disc version has different code
Regions and revisions put functions at different addresses. Ports accept one exact disc and reject the rest. Pin your disc by its game ID and a hash before you start.
Motion controls need a stand-in
The Wii Remote uses an IR pointer and motion. Ports map these to mouse, keys and gamepads. At least two ports, Mario Kart and Metroid Prime 3, have no IR pointer for a real Wii Remote.
Two paths
Get it running on PC
You write a small YAML manifest for your game. The WiiCompiled translator reads main.dol and writes C++. You compile that with a runtime that replaces the Wii's system code. Aurora draws the GX graphics on your GPU. Most work goes into moving runtime hooks to your game's addresses and fixing one crash at a time.
Full decomp for porting
You split the game with decomp-toolkit using the dtk-template layout. You write C or C++ until each unit builds to the same bytes with the original Metrowerks compiler. objdiff scores each unit, and ninja checks the whole DOL hash. Then you port the source to PC with Aurora, using small patches.
Path A: Get it running on PC
You write a small YAML manifest for your game. The WiiCompiled translator reads main.dol and writes C++. You compile that with a runtime that replaces the Wii's system code. Aurora draws the GX graphics on your GPU. Most work goes into moving runtime hooks to your game's addresses and fixing one crash at a time.
Method: static recompilation (WiiCompiled translator + Aurora)
Pick this first when you want to play on PC soon. It does not give you readable source code. If a finished decomp of your game exists, port that instead.
Scope the game and pin the disc
You pick one game and one exact disc version. You record its ID and hash. You also look for work that already exists. A symbol map or a sister port can save weeks.
- Pick one disc version. Write down its six-letter game ID, for example
RMCE01. - Check the image with
nodtool info <IMAGE>andnodtool verify <IMAGE>. - Extract it outside your repo:
nodtool extract <IMAGE> D:/wii/<GAMEID>. - Hash the code in PowerShell:
Get-FileHash D:/wii/<GAMEID>/sys/main.dol -Algorithm SHA256. - List the REL modules under
files/. Check subfolders and other names too: Mario Kart hasfiles/rel/StaticR.rel, and Super Paper Mario usesfiles/rel/relF.bin. Note any.mapfile on the disc. - Search decomp.dev and GitHub for a decomp, a symbol list or a
WiiCompiledport of a sister game. - Write
SCOPE.md: goal, disc ID and revision, hash, technique, first milestone and what is out of scope.
Prompt for ClaudeGOAL: Draft `SCOPE.md` for a static recomp of <GAME> (<GAMEID>, revision <REV>) on WiiCompiled. READ FIRST: `D:/wii/<GAMEID>/` (read-only), https://github.com/patchzyy/Wiicompiled/blob/main/translator/README.md FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Never copy game files into the repo. Do not install anything. CHECK: Run `Get-FileHash D:/wii/<GAMEID>/sys/main.dol -Algorithm SHA256`. Done means the hash matches the one in `SCOPE.md`, and `SCOPE.md` names the disc ID, revision, the REL modules, the prior work found with links, and one first milestone with a check a script can run. BUDGET: Stop after 45 minutes of searching. IF BLOCKED: Stop. Do not guess a hash or a link. Tell me what you could not confirm and what you need. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the hash command output. 3) Files changed. 4) Open questions for me. 5) New parking-lot items.
Done whenSCOPE.mdlists the disc ID, revision andmain.dolSHA-256, and you approved it.Proof this works: Mario Kart WiiCompiled, Shake It! Native PC, https://github.com/encounter/nod
- Pick one disc version. Write down its six-letter game ID, for example
Set up the toolchain and the one check
You install the tools and clone
WiiCompiled. Then you write one script that builds and tests everything. Claude runs that script after every change.- Install the .NET 8 SDK, CMake 3.25 or newer, Ninja, Git, Python and PowerShell 7. The install commands are in the tools list.
- PowerShell 7 runs as
pwsh. It is a separate install from thepowershellthat comes with Windows. - Unzip
llvm-mingw-20261104-ucrt-x86_64.zipfrom the llvm-mingw releases page. Add itsbinfolder toPATH. - Clone with submodules:
git clone --recursive https://github.com/patchzyy/Wiicompiled, thencd Wiicompiled. The submoduleaurora-mainis the project's copy ofAurora. - Build the translator:
dotnet build translator/Translator.sln -c Release. - The translator then runs as
dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll <COMMAND>. - Run its tests:
dotnet test translator/Translator.sln -c Release. They need no game files. - Add
generated/,build/and your game folder to.gitignore. - Write
tools/check.ps1. It translates, builds, runs the golden run and prints one line:PASSorFAIL. - Give it the switches later steps use:
-BuildOnly,-Scenario <NAME>and-Full. Unfinished parts may print FAIL for now. - Write
CLAUDE.md,PROGRESS.mdandnotes/parking-lot.md.
Prompt for ClaudeGOAL: Make `pwsh tools/check.ps1` run translate, build and golden run, accept `-BuildOnly`, `-Scenario <NAME>` and `-Full`, and print PASS or FAIL as its last line. READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/examples/generic-dol.yml` FENCE: Edit only `tools/check.ps1`, `.gitignore`, `CLAUDE.md`, `PROGRESS.md`. Do not change `translator/` or `runtime/`. Do not install anything; tell me what is missing. CHECK: Run `dotnet test translator/Translator.sln -c Release` (must pass). Then run `pwsh tools/check.ps1`. Done means it runs to the end and prints PASS or FAIL. FAIL is fine at this stage. BUDGET: Stop after 3 failed tries on the same error. IF BLOCKED: Stop. Do not work around a missing tool. Tell me which tool and version is missing. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 20 lines of both commands. 3) Files changed. 4) What is left. 5) New parking-lot items.
Done whendotnet testpasses andpwsh tools/check.ps1runs to the end with a clear PASS or FAIL line.Proof this works: Mario Kart WiiCompiled, NSMB Wii Recompiled, https://github.com/patchzyy/Wiicompiled
Write the manifest and the function map
The translator only knows code it can reach from the entry point. A function map tells it where every function starts. You also link RELs offline so their code gets translated too.
- Copy
projects/examples/generic-dol.ymltoprojects/<game>/recomp.yml. - Set
inputs.dol.pathto yourmain.doland add its SHA-256 pin from step 1. A pinned file with a wrong hash is rejected. - Read the DOL header with
dtk dol info D:/wii/<GAMEID>/sys/main.dol. The entry point sits at offset0xE0. - Read the
lis/oripairs in__init_registers. Write them assda_base(r13) andsda2_base(r2). The translator will not guess them. - Build
MAP.txtwith onehexaddr nameline per function. Take names from a decomp'ssymbols.txtif one exists. Pointtranslation.function_map.pathat it. - With no decomp, use function starts from
dolrecompand names from Dolphin's signature database. Keep only exact-size, unique matches. - Change
allow_unsupported_instructionstofalse. The example file sets it totrue, and a build with it on can never ship. - If the game loads RELs at boot, link them offline at fixed addresses into one file, like
prelink_rels.pydoes. - Write
notes/functions.csvwith address, size, name source and status.
Prompt for ClaudeGOAL: Write `projects/<game>/recomp.yml` and `projects/<game>/MAP.txt` so `translate-recursive` covers the whole game. READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/examples/generic-dol.yml`, `<SYMBOL_SOURCE>` FENCE: Edit only `projects/<game>/` and `notes/functions.csv`. Never edit `generated/`. Set `allow_unsupported_instructions: false` and keep it there. CHECK: Run `dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll translate-recursive <ENTRY> --project projects/<game>/recomp.yml`. Done means it exits 0 with no unsupported instruction, and `notes/functions.csv` has one row per function. BUDGET: Stop after 5 failed translate runs, or 60 minutes with no new functions found. IF BLOCKED: Stop. Do not turn on `allow_unsupported_instructions`. Paste the failing address and instruction. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the translator summary. 3) Files changed. 4) How each SDA value was found. 5) New parking-lot items.
Done whentranslate-recursiveexits with no unsupported instruction, andnotes/functions.csvlists every function with its name source.Proof this works: Brawl Recompiled, New Super Paper Bros, Shake It! Native PC, OceanTriRecomp
- Copy
Translate and build the program
You run the three translator commands. Then CMake and Ninja compile the result. This is the first full pass from disc to
.exe. The game will not run yet.- Run each translator command as
dotnet translator/src/Translator.Cli/bin/Release/net8.0/Translator.Cli.dll <COMMAND>. Any command lists its options with--help. - Run
translate-recursive <ENTRY> --project projects/<game>/recomp.yml. - Run
generate-data-init --project projects/<game>/recomp.yml. - Run
emit-build-shards --project projects/<game>/recomp.yml. It writes the CMake build graph. The Mario Kart, NSMBW and Paper Mario builds also runemit-base-manifestbefore it. - Configure with CMake, the Ninja generator and
clangfrom llvm-mingw. Build theWiiCompiledtarget. - Allow one compile job per 2.5 GB of RAM. One job per core ran a 16 GB PC out of memory.
- Mark very slow functions
nooptorisolateinstead of waiting on them.
Prompt for ClaudeGOAL: Build one native `.exe` from the translated game with no compile or link errors. READ FIRST: `SCOPE.md`, `translator/README.md`, `projects/<game>/recomp.yml` FENCE: Edit only `tools/check.ps1` and `projects/<game>/`. Never edit `generated/` or `runtime/`. CHECK: Run `pwsh tools/check.ps1 -BuildOnly`. Done means the link step succeeds and a second clean run gives the same result. BUDGET: Stop after 3 failed builds on the same error. Use at most <N> parallel compile jobs. IF BLOCKED: Stop. If an error is in generated code, do not patch it; name the translator rule that made it. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 30 build lines. 3) Files changed. 4) Build time and peak RAM. 5) New parking-lot items.
Done whenThe build links one.exewith no errors, twice in a row from a cleanbuild/folder.Proof this works: Mario Kart WiiCompiled, Brawl Recompiled, Resident Evil: The Umbrella Chronicles
- Run each translator command as
Boot to the first frame
The runtime calls into the game at fixed addresses. These are hooks. You move each hook from the base game to yours. Every address needs proof, or the game breaks in odd ways.
- Start from the
WiiCompiledruntime. Copy it; do not write a new one. - List every hook and replaced SDK function the base runtime uses.
- Find each one in your game by a string, a caller or a matching code shape.
- Record it in
projects/<game>/hle_targets.tsvwith how you proved it. - Check the register use of each replaced SDK call against the real code.
- Run until a window shows the first frame. Save the screenshot and the log in
notes/.
Prompt for ClaudeGOAL: Boot <GAME> to its first drawn frame. READ FIRST: `SCOPE.md`, `PROGRESS.md`, `projects/<game>/hle_targets.tsv`, `runtime/` (hook list only) FENCE: Edit only `runtime/` and `projects/<game>/`. Never edit `generated/`. Every new address needs a proof note in `hle_targets.tsv`. CHECK: Run `pwsh tools/check.ps1 -Scenario boot`. Done means a frame is drawn, a screenshot is saved, and it shows the same screen Dolphin shows at that point. BUDGET: Stop after 4 hooks you could not prove, or 90 minutes with no new progress in the log. IF BLOCKED: Stop. Do not stub a function or fake an event to get past a screen. List the hook and the evidence you have. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Screenshot path and the last 20 log lines. 3) Files changed. 4) Hooks still unproven. 5) New parking-lot items.
Done whenA window shows the first frame, and the screenshot matches the same moment in Dolphin.Proof this works: NSMB Wii Recompiled, New Super Paper Bros, Resident Evil: The Umbrella Chronicles
- Start from the
Build a test harness
Claude needs to run the game without you. A harness feeds scripted input, waits for game states and saves proof. It becomes the golden run in your check script.
- Add scripted input and a time limit. Never send real keyboard or mouse input.
- Copy saves into a folder per run. Never touch your real saves.
- Run in a 1280x720 window, never fullscreen.
- Wait on game state, not on sleep timers.
- Write
report.jsonwith the state reached, the time and a screenshot. On failure, writefailure.json. - Add a level sweep: load each level, count undrawn pixels and keep a small screenshot.
- Make
tools/check.ps1call the harness.
Prompt for ClaudeGOAL: Add a harness so `pwsh tools/check.ps1` boots to the title screen with no person and writes `report.json`. READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1` FENCE: Edit only `tools/`, `tests/` and the harness hook in `runtime/`. Do not change game logic. Never use real input or real saves. Never run fullscreen. CHECK: Run `pwsh tools/check.ps1` three times. Done means all three runs reach the title screen and each writes `report.json` with a screenshot. BUDGET: Stop after 3 failed designs, or 2 hours. IF BLOCKED: Stop. Tell me what game state you could not detect and what you tried. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the three PASS lines and report paths. 3) Files changed. 4) What the harness cannot do yet. 5) New parking-lot items.
Done whenpwsh tools/check.ps1reaches the title screen three runs in a row and writesreport.jsoneach time.Proof this works: Resident Evil: The Umbrella Chronicles, New Super Paper Bros, Brawl Recompiled
Fix one problem at a time
This is the long middle. Each task is one crash, one missing call or one wrong picture. Claude proves the cause first, then fixes the right layer.
- Pick one item from
PROGRESS.md. - Reproduce it with a harness scenario before changing code.
- For
Missing translated target, add the address toMAP.txtor add a seeding rule for that code shape. - For a wrong picture, compare with Dolphin. Use a savestate and a FIFO log of one frame.
- Fix the translator, the manifest or the runtime. Never the generated code.
- Add a scenario that would have caught the bug.
Prompt for ClaudeGOAL: Fix <BUG_ID>: <ONE_LINE_DESCRIPTION>. READ FIRST: `PROGRESS.md`, `notes/findings.md`, the run folder `<RUN_DIR>` with `failure.json` FENCE: Edit only `runtime/`, `projects/<game>/` or `tests/`. Never edit `generated/`. No stubs, no fake events, no per-screen hacks. CHECK: Run `pwsh tools/check.ps1 -Scenario <SCENARIO>` and then the full `pwsh tools/check.ps1`. Done means both print PASS. BUDGET: Stop after 3 failed fixes, or 60 minutes without a proven cause. IF BLOCKED: Stop. Write what you know in `notes/findings.md` and tell me which evidence you need, such as a Dolphin capture. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The proven cause and both PASS lines. 3) Files changed. 4) The new scenario name. 5) New parking-lot items.
Done whenThe bug's scenario passes, and every older scenario still passes.Proof this works: OceanTriRecomp, Resident Evil: The Umbrella Chronicles, Crash of the Titans: Wiicompiled
- Pick one item from
Harden and package
You make sure old fixes stay fixed. You remove first-launch stutter. You package tools so players build the game from their own disc.
- Run the full level sweep on a clean checkout.
- Ship a seed of GPU pipelines seen in test runs, so first launch does not stall.
- Pin every input by hash: the disc, the toolchain and every download.
- Scan git for game files and translated code before each release.
- Ship the tools and let the player's PC translate and build, as
WiiCompileddoes. - Write player docs: the exact disc ID, CPU needs such as AVX2, and how to report a bug.
Prompt for ClaudeGOAL: Make a clean checkout pass the full check and produce a release with no game data. READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1`, `.gitignore` FENCE: Edit only `tools/`, `docs/` and packaging files. No gameplay changes. CHECK: In a fresh clone, run `pwsh tools/check.ps1 -Full`. Done means PASS, and `git ls-files` shows no `.dol`, `.rel`, disc image or `generated/` file. BUDGET: Stop after 3 failed tries on one problem. IF BLOCKED: Stop. List what fails and the log line. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the PASS line and the file scan. 3) Files changed. 4) What is left. 5) New parking-lot items.
Done whenA clean clone prints PASS frompwsh tools/check.ps1 -Full, and git holds no game data or translated code.Proof this works: Mario Kart WiiCompiled, Metroid Prime 3: Corruption PC, Shake It! Native PC
Path B: Full decomp for porting
You split the game with decomp-toolkit using the dtk-template layout. You write C or C++ until each unit builds to the same bytes with the original Metrowerks compiler. objdiff scores each unit, and ninja checks the whole DOL hash. Then you port the source to PC with Aurora, using small patches.
Method: matching decompilation (decomp-toolkit + objdiff + Metrowerks), then a port on Aurora
Pick this when you want source code you can read, change and port. Check decomp.dev first. Your game may already be done or well started.
Scope and look for prior work
A full decomp is months or years of work. First check if someone has started. A sister game decomp can give you a lot of code.
- Look up your game on decomp.dev and GitHub. Note matched and linked percent.
- If a decomp is at 100%, skip to the port steps.
- Look for a sister game on the same engine. The Strikers Charged decomp borrowed code from the GameCube Super Mario Strikers decomp.
- Read the project's rules on AI changes. Petari does not accept AI changes.
- Expect a large game. Strikers Charged has 17,689 functions. Brawl has 92,522.
- Write
SCOPE.mdwith the version, themain.dolSHA-1 and the first milestone.
Prompt for ClaudeGOAL: Draft `SCOPE.md` for a matching decomp of <GAME> (<GAMEID>). READ FIRST: https://decomp.dev, https://github.com/encounter/dtk-template, `notes/prior-work.md` FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not clone or download any decomp yet. CHECK: Run `Get-FileHash <DISC_FOLDER>/sys/main.dol -Algorithm SHA1`. Done means the hash matches the one in `SCOPE.md`, and `SCOPE.md` names the version, every prior project found with its matched and linked percent, any sister-game decomp, and upstream AI rules. BUDGET: Stop after 45 minutes. IF BLOCKED: Stop. Say which facts you could not confirm. Do not guess percentages. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table of prior work with links. 3) Files changed. 4) Your advice: start new, join, or port. 5) New parking-lot items.
Done whenSCOPE.mdnames the version, its SHA-1 and all prior work, and you approved it.Proof this works: https://decomp.dev/yannicksuter/mscharged-decomp, https://github.com/yannicksuter/mscharged-decomp, Nebula
Set up from dtk-template
dtk-templateis the layout most GameCube and Wii decomps use. It needs only Python and Ninja. The first build downloads the compilers and tools for you.- Create a new repo from
dtk-templateand clone it. - Install Python and Ninja on Windows:
pip install ninja. WSL is not needed. - Rename
orig/GAMEIDandconfig/GAMEIDto your game ID. - Put extracted game files in
orig/<GAMEID>, soorig/<GAMEID>/sys/main.dolexists. Use Dolphin's Data Partition, Extract Entire Partition, ornodtool extract <IMAGE> orig/<GAMEID>. The template also takes a whole disc image, but thensys/main.dolonly appears after the first build, so the hash command below fails. - Edit
config/<GAMEID>/config.yml. Removemodulesif the game has no RELs. - Make the hash file:
dtk shasum orig/<GAMEID>/sys/main.dol orig/<GAMEID>/files/*.rel -o config/<GAMEID>/build.sha1. On Wii, RELs often sit in a subfolder such asfiles/rel/, so list each REL path you found in step 1. - Change the paths in
build.sha1to point atbuild/. The DOL builds tobuild/<GAMEID>/main.doland each module tobuild/<GAMEID>/<MODULE>/<MODULE>.rel. - Set
VERSIONSinconfigure.py. Runpython configure.py, thenninja.
Prompt for ClaudeGOAL: Get a `dtk-template` project for <GAMEID> to run its first analysis. READ FIRST: `SCOPE.md`, `docs/getting_started.md`, `docs/dependencies.md`, `config/GAMEID/config.example.yml` FENCE: Edit only `config/<GAMEID>/`, `configure.py` and `.gitignore`. Never commit anything from `orig/`. CHECK: Run `python configure.py` then `ninja`. Done means the analysis finishes and writes `config/<GAMEID>/symbols.txt` and `splits.txt`. BUDGET: Stop after 3 failed runs on the same error. IF BLOCKED: Stop. Paste the error. Do not edit `build.sha1` hashes to get past it. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the last 20 lines of `ninja`. 3) Files changed. 4) What is left. 5) New parking-lot items.
Done whenninjafinishes the first analysis and writessymbols.txtandsplits.txt.Proof this works: https://github.com/encounter/dtk-template, https://github.com/yannicksuter/mscharged-decomp
- Create a new repo from
Map the binary and pass the hash
You make the project rebuild the original DOL while all code is still assembly. You mark library code so nobody decompiles it by hand first. The result is a ledger of every unit.
- If the disc has a
.mapfile, add amapkey inconfig.yml. Remove it after the analysis. - Set up the C++ exception split for Wii linkers, as the template docs show.
- Put SDK, runtime and middleware units in the
sdkprogress category. - Build until
ninjaprintsbuild/<GAMEID>/main.dol: OK. - Write
notes/units.csvfrombuild/<GAMEID>/report.json: unit, size, category, status.
Prompt for ClaudeGOAL: Make `ninja` rebuild a byte-identical `main.dol` with every unit still in assembly, and write the unit ledger. READ FIRST: `SCOPE.md`, `config/<GAMEID>/config.yml`, `config/<GAMEID>/splits.txt`, `docs/splits.md`, `docs/symbols.md` FENCE: Edit only `config/<GAMEID>/`, `configure.py` and `notes/units.csv`. Never edit `build.sha1`. CHECK: Run `ninja`. Done means it prints `build/<GAMEID>/main.dol: OK` and `notes/units.csv` has one row per unit. BUDGET: Stop after 5 failed split fixes, or 2 hours. IF BLOCKED: Stop. Paste the first link or hash error and the split you suspect. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the OK line. 3) Files changed. 4) Unit counts by category. 5) New parking-lot items.
Done whenninjaprintsbuild/<GAMEID>/main.dol: OKandnotes/units.csvlists every unit.Proof this works: https://github.com/encounter/dtk-template/blob/main/docs/getting_started.md, https://github.com/encounter/decomp-toolkit
- If the disc has a
Match one small unit end to end
This is first light for Path B. One unit goes from assembly to matching C. It proves the compiler, flags and diff loop all work.
- Pick the smallest game unit with few functions.
- Draft C with
m2c, using the targetppc-mwcc-c++orppc-mwcc-c. - Open the project in
objdiff. It readsobjdiff.jsonand rebuilds on save. - Edit until the unit shows 100% in
objdiff. - Mark the unit as matching in
configure.py. - Run
ninja. The DOL must still print OK.
Prompt for ClaudeGOAL: Make unit <UNIT> match 100% and link it from source. READ FIRST: `SCOPE.md`, `notes/units.csv`, the unit's assembly, `configure.py` FENCE: Edit only `src/<UNIT_PATH>`, its header in `include/`, and the unit's line in `configure.py`. No inline `asm`, no `#pragma` tricks, no edits to `build.sha1`. CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and `build/<GAMEID>/report.json` shows the unit at 100%. BUDGET: Stop after 5 real tries per function with no gain. IF BLOCKED: Stop. Show the best score and the exact differing instructions. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the OK line and the unit's score. 3) Files changed. 4) Compiler flags that mattered. 5) New parking-lot items.
Done whenobjdiffshows 100% for the unit, andninjaprintsbuild/<GAMEID>/main.dol: OKwith the unit linked from source.Proof this works: https://github.com/matt-kempster/m2c, https://github.com/encounter/objdiff, https://github.com/yannicksuter/mscharged-decomp
Grind units in parallel
Now many workers each take one unit. A script picks the next unit, not Claude. Each worker has a strict try limit and its own git worktree.
- Write
tools/next_units.py. It picks the smallest units first, then those most like matched code. - Give each worker one unit and one git worktree.
- Each worker drafts with
m2c, compiles, compares, and stops after 5 real tries. - Run
decomp-permuterin WSL only on near misses. Addpermuter_settings.tomlwithbuild_system = "ninja"to the repo root. Then run./import.py <FILE.c> <FILE.s>and./permuter.py <DIR> -j <THREADS>. - Explain a permuter result before you keep it.
- Merge one unit per commit. Run
ninjaon the merged branch after each merge. - Log every failed try in
notes/units.csvso no one repeats it.
Prompt for ClaudeGOAL: Run one batch of <N> units from `tools/next_units.py`, one worker per unit. READ FIRST: `CLAUDE.md`, `notes/units.csv`, `notes/compiler-quirks.md` FENCE: Each worker edits only its unit's `src/` file, its header and its `configure.py` line, in its own worktree. Use absolute paths. No inline `asm`. CHECK: After each merge, run `ninja` on the main branch. Done means `build/<GAMEID>/main.dol: OK` after every merge and each merged unit is at 100% in `report.json`. BUDGET: Each worker stops after 5 real tries with no gain. The batch stops after <M> units or 3 hours. IF BLOCKED: A blocked worker writes its best score and differing instructions to `notes/units.csv` and stops. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table: unit, result, score. 3) Merged commits. 4) Units sent to the hard queue. 5) New parking-lot items.
Done whenThe matched count innotes/units.csvrises andninjaprints OK after every merge.Proof this works: https://github.com/doldecomp/melee/pull/2076, https://github.com/encounter/objdiff, https://github.com/simonlindholm/decomp-permuter
- Write
Crack hard units and link the files
Some units resist. A stronger job type takes them with fresh eyes. Matching is not the end: each file must also link from source.
- Send units that failed 5 tries to a
hardjob. - Before calling a unit stuck, name the exact differing instructions and a reason class.
- Search matched units for the same code shape. Copy the pattern, not the code.
- Keep a unit
NonMatchingrather than force it with inline assembly. - Track linked percent as well as matched percent in
report.json.
Prompt for ClaudeGOAL: Match unit <UNIT>, which failed <K> earlier tries. READ FIRST: `notes/units.csv` row for <UNIT>, the earlier attempt files, `notes/compiler-quirks.md` FENCE: Edit only the unit's `src/` file and header. No inline `asm`, no section forcing, no `volatile` added only to match. CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and the unit is 100% in `report.json`. BUDGET: Stop after 8 real tries with no gain. IF BLOCKED: Stop. 'Compiler artifact' is not an answer. Name the differing instructions and two matched units with a similar shape. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Score before and after. 3) Files changed. 4) A one-line rule for `notes/compiler-quirks.md`. 5) New parking-lot items.
Done whenEvery unit is matched or markedNonMatchingwith a written reason, andninjaprints OK.Proof this works: https://github.com/zcanann/SFA-Decomp/blob/main/CLAUDE.md, https://jpb.dev/blog/teaching-a-model-to-decompile
- Send units that failed 5 tries to a
Harden the decomp
A byte match proves the code. It does not prove names or types. You add checks that keep the build honest and review the source.
- For each supported version, run
python configure.py --version <GAMEID>, thenninja all_sourceandninja. - Write a lint that fails on inline
asm, odd#pragmalines and edits tobuild.sha1. - Review names and types. Keep a name neutral when you are not sure.
- Keep a baseline report. No change may lower any unit's score.
- Have a fresh
verifysession read each batch for cheating.
Prompt for ClaudeGOAL: Add a full check that builds every version, runs the lint and compares against the baseline report. READ FIRST: `SCOPE.md`, `configure.py`, `notes/units.csv` FENCE: Edit only `tools/` and CI files. Do not change `src/`. CHECK: Run `python tools/full_check.py`. Done means it prints OK for every version, the lint finds nothing, and no unit scores lower than the baseline. BUDGET: Stop after 3 failed tries on one problem. IF BLOCKED: Stop. List what fails. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the output. 3) Files changed. 4) What is left. 5) New parking-lot items.
Done whenA clean clone builds every version to OK, and the lint and baseline check pass.Proof this works: https://github.com/yannicksuter/mscharged-decomp, https://github.com/lukechampine/melee-harness
- For each supported version, run
Port the decomp to PC
You build the matched source for a 64-bit PC. The decomp stays untouched. Every change is a small patch applied at build time.
- Start a new repo. Pin the decomp,
Aurora, Dawn andnodas git submodules at exact commits. - Never edit the decomp. Write each change as a small patch with its reason in the header.
- Keep two patch series: faithful fixes for a 64-bit little-endian PC, and gameplay tweaks.
- Use
Aurorafor GX, video and disc reads. Run the SDK's own audio and controller code on a native layer. - Swap the byte order of game data once, at load or import.
- Compile with clang and
-fno-strict-aliasingand-ffp-contract=off. - Read the player's own disc image at run time. Ship no game data.
Prompt for ClaudeGOAL: Boot the ported game to its title screen on Windows from my own disc image. READ FIRST: `SCOPE.md`, `patches/README.md`, https://github.com/encounter/aurora FENCE: Edit only `patches/`, `src/platform/` and `src/runtime/`. Never edit the pinned decomp copy. One patch per change, with a reason in its header. CHECK: Run `pwsh tools/check.ps1 -Scenario title`. Done means the title screen is reached by scripted input and a screenshot is saved. BUDGET: Stop after 3 failed tries on one crash, or 2 hours. IF BLOCKED: Stop. Paste the crash address and the patch you suspect. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Screenshot path and log tail. 3) New patches with one line each. 4) What is left. 5) New parking-lot items.
Done whenThe port reaches the title screen from the player's disc, and the decomp copy has no direct edits.Proof this works: Recharged, Nebula, https://github.com/encounter/aurora
- Start a new repo. Pin the decomp,
Prove the port with golden runs
You need proof the port plays like the original. A scripted tour with screenshots catches changes between builds. Random input finds crashes.
- Script a tour of the game with fixed inputs.
- Run it on the old and new build. Compare every screenshot.
- Add random-input crash runs and many boot runs.
- Ship a GPU pipeline list recorded from scripted runs.
- Build one game module per disc version from the decomp's version macros.
Prompt for ClaudeGOAL: Add a scripted tour that compares screenshots between two builds. READ FIRST: `SCOPE.md`, `PROGRESS.md`, `tools/check.ps1` FENCE: Edit only `tools/` and `tests/`. Do not change game code. CHECK: Run `pwsh tools/tour.ps1 -Old <OLD_BUILD> -New <NEW_BUILD>`. Done means every stop is reached and the report lists each picture as same or changed. BUDGET: Stop after 3 failed designs, or 3 hours. IF BLOCKED: Stop. Tell me which stop cannot be reached by script. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Paste the summary. 3) Files changed. 4) Stops still missing. 5) New parking-lot items.
Done whenThe scripted tour reaches every stop on a clean checkout, with no picture changes you did not intend.Proof this works: Nebula, Recharged
Tools you need
| Tool | What it does | How to get it | How we know |
|---|---|---|---|
| WiiCompiled translator Required both | Turns a Wii main.dol and its RELs into C++. It comes with a runtime for the Wii's system code. It needs the .NET 8 SDK, CMake 3.25 or newer, Ninja and Clang.Path A | git clone --recursive https://github.com/patchzyy/Wiicompiled ; cd Wiicompiled ; dotnet build translator/Translator.sln -c Release | README, translator/README.md, projects/examples/generic-dol.yml and .gitmodules (read 2026-11-13). The README shows only the build line; --recursive is needed because aurora-main is a submodule. Used by: Mario Kart WiiCompiled, NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, Shake It! Native PC |
| LLVM-MinGW Required Windows | A Clang compiler for Windows. WiiCompiled builds with it; its docs say MSVC is not the tested path.Path A Path B | Download `llvm-mingw-20261104-ucrt-x86_64.zip` from the releases page, unzip it and add `bin` to PATH | README and releases page (read 2026-11-13; release 20261104 has llvm-mingw-20261104-ucrt-x86_64.zip); WiiCompiled translator README names it as the shipped compiler; used by: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, Shake It! Native PC, Metroid Prime 3: Corruption PC, Recharged, OceanTriRecomp |
| Aurora Required both | A GameCube and Wii layer for PC. It draws GX graphics through WebGPU and also handles pads, discs and saves. Path A Path B | Comes inside WiiCompiled as `aurora-main` (a fork, patchzyy/aurora-wiicompiled). For a port, add it as a submodule: git submodule add https://github.com/encounter/aurora extern/aurora ; then add `add_subdirectory(extern/aurora EXCLUDE_FROM_ALL)` to your CMakeLists.txt | README and docs/building.md (read 2026-11-13; needs CMake 3.25 or newer and a C++20 compiler); WiiCompiled .gitmodules; used by: Recharged, Brawl Recompiled, New Super Paper Bros, Metroid Prime 3: Corruption PC |
| nodtool Required both | Reads, checks, extracts and converts Wii disc images, including RVZ and WBFS. Path A Path B | Download `nodtool-windows-x86_64.exe` from the nod releases page (v2.0.0-alpha.12), or `cargo install --locked nodtool` | README and releases page (read 2026-11-13); used by: Mario Kart WiiCompiled, Recharged, Metroid Prime 3: Corruption PC |
| Dolphin Required both | The GameCube and Wii emulator. Use it as the reference: compare frames, take savestates and FIFO logs, and debug through its GDB stub. Path A Path B | Download a build from dolphin-emu.org | repo and GDBStub source read 2026-11-13 (stub has Windows code); used by: Resident Evil: The Umbrella Chronicles, Mario Kart WiiCompiled, NSMB Wii Recompiled |
| decomp-toolkit (dtk) Required both | Splits a DOL and its RELs into objects, finds functions and library code, and checks hashes. It also prints DOL headers. Path B Path A | Downloaded by dtk-template on first build; or get `dtk-windows-x86_64.exe` (v1.8.4) from the releases page | README and releases page (read 2026-11-13); used by: mscharged-decomp (base of Recharged) |
| dtk-template Required both | The standard project layout for GameCube and Wii decomps. It needs only Python and Ninja. Path B | Create a repo from the template on GitHub, clone it, then `pip install ninja`, `python configure.py`, `ninja` | README, docs/dependencies.md, docs/getting_started.md, configure.py and tools/project.py (read 2026-11-13). Docs say native Windows is highly recommended and WSL is not required; Linux and macOS are also covered. It pins dtk v1.8.3 and objdiff v3.6.1. Used by: mscharged-decomp |
| objdiff Required both | Shows how close your compiled object is to the original, per function and data. Its CLI writes progress reports. Path B | Download `objdiff-windows-x86_64.exe` (v3.8.3) from the releases page; dtk-template downloads `objdiff-cli` itself | README and releases page (read 2026-11-13): PowerPC for GameCube and Wii is supported, and Linux builds exist. dtk-template's docs/dependencies.md says that under WSL objdiff gets no file change alerts, so run it on Windows |
| Metrowerks CodeWarrior compilers Required both | The original compilers. A match only counts when this compiler makes the same bytes. Path B | dtk-template downloads a pinned set on first build (`compilers_20251118`); you do not install them by hand | dtk-template configure.py (compilers_tag = "20251118") and docs/dependencies.md (read 2026-11-13). They are Windows programs; on Linux and macOS the template downloads wibo to run them |
| m2c Helpful both | Turns PowerPC assembly into a first draft of C or C++. The draft rarely matches at once. Path B | git clone https://github.com/matt-kempster/m2c ; cd m2c ; python m2c.py -t ppc-mwcc-c++ <ASM_FILE> -f <FUNCTION> | README and m2c/options.py (read 2026-11-13): targets are platform-compiler-language triples, and ppc, mwcc, c and c++ are all accepted, so ppc-mwcc-c++ and ppc-mwcc-c parse |
| decomp-permuter Helpful WSL/Linux | Tries many small random code changes to close a near miss. Path B | In WSL: git clone https://github.com/simonlindholm/decomp-permuter ; cd decomp-permuter ; python3 -m pip install pynacl toml Levenshtein | README and src/main.py (read 2026-11-13): supports PowerPC; permuter_settings.toml with build_system = "ninja" for Ninja projects; -j takes a thread count; pynacl and Levenshtein are optional; permuter@home does not work on native Windows, WSL works |
| DolRecomp Helpful both | Another GameCube and Wii recompiler. Useful here for its function boundary list and REL folder mode. Path A | git clone https://github.com/ExpansionPak/DolRecomp ; cd DolRecomp ; cmake -S . -B build ; cmake --build build --config Release | README (read 2026-11-13): needs CMake 3.16 and a C11 compiler; Windows tested with MSVC and MinGW; REL folder mode; Wii disc extraction needs wit. The README does not show how to export a function list; that use comes from the Shake It! card. Used by: Kirby Wii Recomp (ModernGekko), Shake It! Native PC (function boundaries) |
| Ghidra with the GameCube Loader Helpful both | A free disassembler and decompiler. The loader opens DOL and REL files with symbol maps. Path A Path B | Install Ghidra 12.1.4, the version GhidraMCP needs. Copy the loader zip from its releases page to `<GHIDRA>/Extensions/Ghidra`, then use File, Install Extensions. If Ghidra refuses the zip, build the loader with `./gradlew` and `GHIDRA_INSTALL_DIR` set, as its README shows | README and releases (read 2026-11-13): loads DOL, REL, apploaders and RAM dumps. The latest zip (1.3.1) is labelled Ghidra 12.1; Ghidra's latest is 12.2 and GhidraMCP asks for 12.1.4. Ghidra used by: OceanTriRecomp |
| .NET 8 SDK Required both | Builds and runs the WiiCompiled translator, which is written in C#.Path A | winget install Microsoft.DotNet.SDK.8 | Microsoft .NET install page (read 2026-11-13) gives the winget install Microsoft.DotNet.SDK.<VERSION> form; the winget package list has SDK 8 (8.0.428). WiiCompiled translator README requires the .NET 8 SDK |
| CMake and Ninja Required both | CMake sets up a C++ build. Ninja runs it. Path A builds the translated game with both, and dtk-template runs on Ninja.Path A Path B | winget install Kitware.CMake ; pip install ninja | cmake.org download page (read 2026-11-13, CMake 4.5.0 listed); winget package list has Kitware.CMake; pip install ninja is from dtk-template docs/dependencies.md. WiiCompiled needs CMake 3.25 or newer |
| Python 3 Required both | Runs dtk-template's configure.py, m2c and the helper scripts most Wii ports use.Path A Path B | Download the installer from python.org and add Python to PATH | dtk-template docs/dependencies.md (read 2026-11-13) says to install Python from python.org and add it to PATH; Python scripts used by: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros |
| PowerShell 7 (`pwsh`) Required Windows | Runs the tools/check.ps1 script in this guide. It installs next to the older Windows PowerShell 5.1 and does not replace it.Path A Path B | winget install --id Microsoft.PowerShell --source winget | Microsoft PowerShell install page (read 2026-11-13): PowerShell 7 runs as pwsh.exe, side by side with Windows PowerShell 5.1 |
| Git Required both | Clones the tools and keeps your project history. Path B uses one git worktree per worker. Path A Path B | winget install --id Git.Git -e --source winget | git-scm.com Windows install page (read 2026-11-13) gives this winget command |
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.
debug-game-in-emulator
Makes each Dolphin run the same way: a throwaway data folder, a log and a time limit. Claude must name the failing layer before it changes code.
npx skills add xsyetopz/skills --skill debug-game-in-emulator -a claude-code
decompile-to-matching-c-cpp
Rules for matching C and C++ with decomp-toolkit, m2c, objdiff-cli and the permuter. It bans fake matches. Read it first; the author is new.
npx skills add xsyetopz/skills --skill decompile-to-matching-c-cpp -a claude-code
matcher
A careful loop for one function. Claude tests one idea at a time and reports a fake match as not done. Install its sister skills too; they call each other.
npx skills add lemiur/game-decompilation-skill-for-claude --skill matcher -a claude-code
decomp-matching-workflow
Sets a try limit per function and gives parallel workers a claim queue, so two workers never take the same unit.
npx skills add madpai/game-decomp-compendium --skill decomp-matching-workflow -a claude-code
static-recomp-scope-plan
Makes you write down what a correct port means before Path A starts: the disc, the scenes to test and the numbers to hit.
npx skills add bgyss/switchrecomp --skill static-recomp-scope-plan -a claude-code
verification-before-completion
Claude may not say done without fresh proof. It must run tools/check.ps1 or ninja and show the output.
npx skills add obra/superpowers --skill verification-before-completion -a claude-code
handoff
Writes a short note so a fresh session can carry on. Tell it to save inside your repo, not the temp folder.
npx skills add mattpocock/skills --skill handoff -a claude-code
GhidraMCP
Lets Claude list, decompile and rename functions in a Ghidra project. Useful for proving hook addresses on Path A. A headless mode also exists.
Install `uv` and the GhidraMCP extension in Ghidra 12.1.4, then: claude mcp add ghidra -- uvx --from git+https://github.com/LaurieWired/GhidraMCP ghidra-mcp --ghidra-server http://127.0.0.1:8080/
dolphin-debugger-mcp
Lets Claude set breakpoints and read registers in Dolphin, with names from a dtk project's symbols. It was built for a GameCube decomp, so test it on your Wii game first.
Set `GDBPort = 2159` under `[General]` in `Dolphin.ini`, then: claude mcp add dolphin -e DOLPHIN_REPO_ROOT=<DECOMP_REPO> -e DOLPHIN_GAMEID=<GAMEID> -- python3 <PATH>/server.py
wii-run-scenario
Every Path A worker tests the game the same way. This copies the test skill that Resident Evil: The Umbrella Chronicles keeps in its repo.
A project skill in `.claude/skills/wii-run-scenario/SKILL.md`. It runs `pwsh tools/check.ps1 -Scenario <NAME>`, waits on game state, never uses real input or saves, runs at 1280x720, and on failure reads `failure.json` and the last screenshot.
wii-prove-address
Moving hooks is most of Path A. A fixed method stops Claude from trusting a signature name or guessing an address.
A project skill in `.claude/skills/wii-prove-address/SKILL.md`. Given a hook from the base runtime, it finds the address in your DOL by string, caller or code shape, and writes one row to `hle_targets.tsv` with the proof.
Claude setup for this system
Path A: one task is one hook to move, one crash, one missing call or one wrong picture. Each has a harness scenario that must pass. Path B: one task is one unit, a source file the compiler builds alone. ninja must still print OK after the merge. Keep the lists in PROGRESS.md and notes/units.csv, never in the chat.
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.
| Job | What it means on this system | Max 20x (now called Ultra) | Max 5x (now called Max) |
|---|---|---|---|
| Plan the project | Pick the disc version and the path. Look for decomps, symbol maps and sister ports. Write SCOPE.md. | Fable 5.2 effort highOne session. This choice shapes months of work. | Opus 5.5 effort highUse Fable 5.2 for this one session if you have weekly room. |
| Set up the project | Install .NET 8, LLVM-MinGW and Ninja, or set up dtk-template. Write tools/check.ps1 and CLAUDE.md. | Opus 5.5 effort medium | Sonnet 5.5 effort medium |
| Study the game file | Find SDA bases, entry point and function starts. Build MAP.txt. Prove hook addresses. Mark SDK and NW4R units. | Opus 5.5 effort high | Opus 5.5 effort mediumRaise to high for function edges and data layouts. A mistake there spreads. |
| Bulk units | Path B: small units with a 5-try limit, one per worktree. Path A: plain hook moves that follow a proven pattern. | Sonnet 5.5 effort mediumHaiku 5.5 for the plainest units. | Sonnet 5.5 effort mediumFewer workers at once. Haiku 5.5 for the plainest units. |
| Hard units | Units that failed 5 tries, jump tables, odd register shapes, and translator bugs in rare PowerPC instructions. | Fable 5.2 effort highGo to xhigh only after a failed try at high. | Opus 5.5 effort highSend only the last few that still fail to Fable 5.2. |
| Build the runtime | SDK stand-ins for OS, DVD, NAND, WPAD, AX audio and GX through Aurora. Port patches for 64-bit and byte order. | Opus 5.5 effort high | Opus 5.5 effort mediumRaise to high for timing and graphics bugs. |
| Find a bug | Find why the game crashes or draws wrong. Use failure.json, Dolphin savestates and FIFO logs. Prove the cause before any fix. | Opus 5.5 effort highAfter two failed tries with full evidence, move to Fable 5.2. | Opus 5.5 effort highOne bug at a time. |
| Check the work | A fresh session reruns the check, reads the diff and hunts for stubs, fake events, inline asm and edited hashes. | Opus 5.5 effort mediumAlways a new session, never the one that did the work. | Sonnet 5.5 effort highAlways a new session, never the one that did the work. |
| Keep the records | Update PROGRESS.md, notes/units.csv, notes/findings.md and the dead-end list after each batch. | Haiku 5.5 effort medium | Haiku 5.5 effort medium |
How many sessions at once
Max 20x (now called Ultra)
Path A: one lead session plus two or three workers, each on one bug in its own worktree. Translated shards are big, so cap compile jobs at one per 2.5 GB of RAM across all workers. Path B: one lead plus four to six unit workers, each in its own worktree, and one verify session per batch.
Max 5x (now called Max)
Path A: one worker at a time, with the lead and the worker in turns. Path B: one lead and two unit workers. Run long batches overnight. Save hard units for a few focused sessions.
Lines for this project's CLAUDE.md
- At the start of every session, read `SCOPE.md`, `PROGRESS.md` and `notes/findings.md`. Only the owner edits `SCOPE.md`. - The one check is `pwsh tools/check.ps1` (Path A) or `ninja` printing `build/<GAMEID>/main.dol: OK` (Path B). No PASS or OK line means not done. - Never edit `generated/`. It is build output. Fix the translator, `recomp.yml`, `MAP.txt` or `runtime/` instead. - Keep `allow_unsupported_instructions: false`. A build with it on can never ship. - Read-only: `orig/`, the disc folder, `config/<GAMEID>/build.sha1` and the SHA-256 pin in `recomp.yml`. - Every hook or SDK address goes in `hle_targets.tsv` with how it was proven. Signature names alone are not proof. - No stubs and no fake events. A missing SDK call stops with a clear error naming the address. - Live tests use the harness only: no real input, no real saves, 1280x720 window, never fullscreen. - No inline `asm`, `#pragma` tricks or match-only `volatile` in `src/`. A clean `NonMatching` unit beats a forced match. - In a worktree, use absolute paths and edit only the files on your task card. One writer per file. - Write dead ends and findings in `notes/findings.md`. Side issues go in `notes/parking-lot.md`; do not act on them. - Never commit disc images, `.dol` or `.rel` files, extracted assets or translated code.
Keep the context small
- Give Claude one address or one unit name, not pasted assembly. It can read the file itself.
- Have a subagent read big logs and the harness
failure.json, then report ten lines back. - Keep
CLAUDE.mdshort. Point tonotes/compiler-quirks.mdand the hook table by name. - Clear the chat between units. The ledger files carry the state, not the chat.
- Never let Claude read all of
generated/. Search it for one function by address.
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 choose between a recomp, a decomp or a port of an existing decomp.
GOAL: Tell me which path fits <GAME> (<GAMEID>) and draft `SCOPE.md`. READ FIRST: https://decomp.dev, https://github.com/patchzyy/Wiicompiled, `notes/prior-work.md` FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not download anything. CHECK: Run `Get-FileHash <DISC_FOLDER>/sys/main.dol -Algorithm SHA256`. Done means the hash matches the draft, and the draft lists the disc ID, revision, REL modules, every prior decomp or port with its percent, and one milestone with a runnable check. BUDGET: Stop after 45 minutes. IF BLOCKED: Stop. List the facts you could not confirm. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Your pick: recomp, decomp or port, with three reasons. 3) Files changed. 4) Risks. 5) New parking-lot items.
A good answer: A short pick with reasons tied to real links and percents. Any unknown is marked unknown, not guessed.
Map the binary
After setup, to build the function ledger that every later task uses.
GOAL: Write `notes/functions.csv` with every function in `main.dol` and the RELs. READ FIRST: `SCOPE.md`, `projects/<game>/MAP.txt` or `config/<GAMEID>/symbols.txt` FENCE: Edit only `notes/functions.csv`. Do not change the manifest or symbols. CHECK: Run `python tools/check_ledger.py`. Done means every function in the symbol file is in the ledger once, with size, name source and status. BUDGET: Stop after 60 minutes. IF BLOCKED: Stop. List the address ranges you could not classify. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Counts: game, SDK, middleware, unknown. 3) Files changed. 4) Ranges to look at. 5) New parking-lot items.
A good answer: A ledger with counts by category. SDK and NW4R code is marked so nobody works on it by hand first.
Path A unit loop: one crash
For each crash or missing call in the grind phase.
GOAL: Fix the crash in scenario <SCENARIO> at guest address <ADDR>. READ FIRST: `<RUN_DIR>/failure.json`, `PROGRESS.md`, `notes/findings.md` FENCE: Edit only `runtime/`, `projects/<game>/` or `tests/`. Never edit `generated/`. No stubs or fake events. CHECK: Run `pwsh tools/check.ps1 -Scenario <SCENARIO>`, then `pwsh tools/check.ps1`. Done means both print PASS. BUDGET: Stop after 3 failed fixes or 60 minutes without a proven cause. IF BLOCKED: Stop. Write the evidence in `notes/findings.md` and tell me what capture you need. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Cause and both PASS lines. 3) Files changed. 4) New scenario. 5) New parking-lot items.
A good answer: DONE with the proven cause in one sentence, the fix in the right layer, and both PASS lines pasted.
Path B unit loop: one unit
For each unit a bulk worker takes.
GOAL: Make unit <UNIT> match 100%. READ FIRST: the unit's assembly, `notes/units.csv` row for <UNIT>, `notes/compiler-quirks.md` FENCE: Edit only `src/<UNIT_PATH>`, its header and its `configure.py` line. No inline `asm`, no `#pragma` tricks, no edits to `build.sha1`. CHECK: Run `ninja`. Done means `build/<GAMEID>/main.dol: OK` and the unit is 100% in `build/<GAMEID>/report.json`. BUDGET: Stop after 5 real tries with no gain. Each try is a new file, so the best one survives. IF BLOCKED: Stop. Give the best score and the differing instructions. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) OK line and score. 3) Files changed. 4) One quirk learned, if any. 5) New parking-lot items.
A good answer: DONE with the OK line and 100% for the unit, or PARTIAL with the best score and exact differences.
Batch dispatch
In the lead session, to hand out the next set of tasks to workers.
GOAL: Launch <N> workers, one per task from `tools/next_units.py` (or the top of `PROGRESS.md`). READ FIRST: `CLAUDE.md`, `notes/units.csv` or `PROGRESS.md` FENCE: Do not do the tasks yourself. Give each worker its own worktree with absolute paths and one task card. Edit only the ledger. CHECK: After all workers report, run the full check on the main branch. Done means it passes and the ledger matches the reports. BUDGET: Stop after <N> tasks or 3 hours. Cap compile jobs at one per 2.5 GB of RAM in total. IF BLOCKED: Stop launching. Tell me which worker is stuck and why. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) A table of task, worker result and proof. 3) Merges made. 4) Tasks for the hard queue. 5) New parking-lot items.
A good answer: A table with one row per worker, each with pasted proof, and a final full check that passes.
Debug with evidence
When the port draws something wrong or behaves unlike the real game.
GOAL: Find the cause of <SYMPTOM> at <PLACE_IN_GAME>. Do not fix it yet. READ FIRST: the harness screenshot, a Dolphin savestate and FIFO log of the same frame at <PATHS> FENCE: Read-only. You may add logging in `runtime/` behind a flag. Write findings only in `notes/findings.md`. CHECK: First run `pwsh tools/check.ps1 -Scenario <SCENARIO>` and confirm it shows the symptom. Done means you name the first point where the port and Dolphin differ, such as a TEV stage, matrix load or memory write, with the values from both. BUDGET: Stop after 90 minutes. IF BLOCKED: Stop. Tell me what extra capture would split the cause. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The first difference with both values. 3) Files changed. 4) The likely fix and its layer. 5) New parking-lot items.
A good answer: One named difference with values from the port and from Dolphin, not a guess about what might be wrong.
Verify claimed work
After every batch, in a brand-new session that did none of the work.
GOAL: Check that the work in commits <RANGE> is real. READ FIRST: `git diff <RANGE>`, `CLAUDE.md`, the workers' reports FENCE: Read-only. Do not fix anything. CHECK: Rerun the full check from a clean build. Then search the diff for edits to `generated/`, `build.sha1` or the hash pin, inline `asm`, `#pragma`, stubs, fake events, disabled tests and edits outside each task's fence. BUDGET: Stop after 45 minutes. IF BLOCKED: Stop. Say which claim you could not test. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The check output. 3) Each problem with file and line. 4) Which claims hold. 5) New parking-lot items.
A good answer: A rerun check output and a list of problems with file and line, or a plain statement that none were found.
Status report
Once a week, or before you plan the next batch.
GOAL: Give me a status report from the ledger files only. READ FIRST: `PROGRESS.md`, `notes/units.csv` or `notes/functions.csv`, `notes/findings.md` FENCE: Read-only. CHECK: Every number comes from a file or a command you ran, such as `build/<GAMEID>/report.json`. BUDGET: 15 minutes. IF BLOCKED: Say which file is missing or out of date. REPORT: 1) Milestone and its check result. 2) Counts: done, in progress, stuck. 3) Top three blockers. 4) Next three tasks. No other text.
A good answer: Four short sections with numbers and their source files. No filler.
Session handoff
At the end of every session, so a fresh session can pick up.
GOAL: Write what the next session needs into the ledger files. READ FIRST: this session's changes (`git status`, `git log -5`), `PROGRESS.md` FENCE: Edit only `PROGRESS.md`, `notes/findings.md` and `notes/units.csv`. CHECK: Run `git diff --stat -- PROGRESS.md notes/` and paste it. Done means a new session could start the next task from these files alone, and each open task has its next step and its check command. BUDGET: 10 minutes. IF BLOCKED: Say what you could not record. OTHER PROBLEMS: Write them in `notes/parking-lot.md`. REPORT: 1) DONE or PARTIAL. 2) What works now, with proof. 3) Dead ends tried. 4) The next task card, ready to paste.
A good answer: Updated ledger files and a ready task card. Dead ends are written down so nobody repeats them.
Blocked or cannot deliver
When a task has gone around in circles, or Claude says it is impossible.
GOAL: Give me a plain answer on <TASK>: can it be done, and how? READ FIRST: `notes/findings.md`, the attempt files for <TASK> FENCE: Read-only. CHECK: Run the task's own check command once more and paste the output. Your answer names the exact blocker with evidence: differing instructions, a log line or an address. 'Compiler artifact' or 'probably' is not evidence. BUDGET: 20 minutes. IF BLOCKED: Say BLOCKED and what would unblock it. REPORT: 1) DONE, PARTIAL or BLOCKED. 2) The blocker in one sentence. 3) The evidence. 4) Two or three options with cost. 5) Your pick.
A good answer: A one-sentence blocker, real evidence and a few options. No pretending the task is done.
Scope change request
When Claude thinks a fix needs files outside the task's fence.
GOAL: Ask me before you leave the fence for <TASK>. READ FIRST: the task card, `SCOPE.md` FENCE: Change nothing until I answer yes. CHECK: Your request names the files, why the current fence is not enough, and the risk to other units or scenarios. BUDGET: 10 minutes. IF BLOCKED: Wait for my answer. REPORT: 1) BLOCKED. 2) Files you want to change. 3) Why. 4) Risk and how you would check it. 5) What you will do if I say no.
A good answer: A short request that waits for your yes or no. Nothing is changed before you answer.
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 detour | The rule to give Claude |
|---|---|
Claude edits translated C++ in generated/ to stop a crash. | Never edit generated/. Fix the translator, the manifest or the runtime. Block writes to generated/ with a hook. |
Claude turns on allow_unsupported_instructions to get past a translation error. | Keep it false. A failing instruction is a translator task with its own card. |
| Claude stubs an SDK call or fakes an event so the game passes a screen. | No stubs, no fake events. An unimplemented call stops with an error that names its address. |
| Claude trusts a signature name or guesses a hook address. | Every address needs proof in hle_targets.tsv: a string, a caller or a code shape. Check the register use too. |
| Claude claims a speed-up from one timed run. | Judge speed only with a fixed test and guest instruction counts, as the Resident Evil: The Umbrella Chronicles port does. One timed run can move by about 1% from code layout alone. |
| Claude takes over your keyboard, plays on your real saves or runs fullscreen. | Live tests go through the harness only: scripted input, copied saves, a 1280x720 window. |
On Path B, Claude forces a match with inline asm, #pragma lines or a changed build.sha1. | Ban these in CLAUDE.md, lint for them, and block edits to build.sha1 with a hook. NonMatching is accepted. |
| Claude calls a unit impossible and blames the compiler. | Before 'stuck', name the differing instructions and two matched units with a similar shape. |
Problems other projects hit
A different region or revision puts code at other addresses. The game breaks in ways that are hard to debug.
Fix: Pin one disc by game ID and main.dol SHA-256 in the manifest. Reject every other dump.
Seen in: Mario Kart WiiCompiled, NSMB Wii Recompiled, Brawl Recompiled, Shake It! Native PC
Code in REL modules is not translated, so the game stops when it loads one.
Fix: Link the RELs offline at the fixed addresses the game uses, then translate them with the DOL.
Seen in: NSMB Wii Recompiled, Brawl Recompiled, New Super Paper Bros, OceanTriRecomp
A missed vtable method, thunk or jump table entry stops the game with Missing translated target.
Fix: Seed function starts by code shape, such as vtables and thunks. Add each leftover address to the function map.
Seen in: OceanTriRecomp, Resident Evil: The Umbrella Chronicles
Compiling the translated game runs out of memory. A few huge functions take most of the time.
Fix: Run one compile job per 2.5 GB of RAM. Mark the slowest functions noopt or isolate.
Seen in: Brawl Recompiled, Resident Evil: The Umbrella Chronicles
First launch freezes while GX shaders compile. One port took about 17 minutes and 9 GB of RAM.
Fix: Record GPU pipelines in test runs and ship them as a cache. Compile them before the game starts.
Seen in: Metroid Prime 3: Corruption PC, Recharged
A hand-written SDK stand-in read the wrong registers, so loading stalled.
Fix: Check each stand-in's register use against the real code. Test it against the translated original, as OceanTriRecomp does.
Seen in: Resident Evil: The Umbrella Chronicles
Unlocking the frame rate broke code that counts frames, not time. Timeouts and fades ran at the wrong speed.
Fix: Audit code that steps per frame. Fix each site and keep a list of them.
Seen in: Resident Evil: The Umbrella Chronicles, OceanTriRecomp
Licences clash. NWiiRecomp is non-commercial, and Dolphin's audio code is GPL, so a built game could not be shared.
Fix: Read every licence in SCOPE.md. Let players build from their own disc if you mix licences.
Seen in: Crash of the Titans: Wiicompiled
Decomp code assumes 32-bit pointers and big-endian data, so it breaks on a PC.
Fix: Keep a faithful patch series for pointer width and byte order. Swap data bytes once at import.
Seen in: Recharged, Nebula
The upstream decomp refuses AI-made changes, so port fixes cannot go back.
Fix: Check the project's rules before you start. Keep your changes as patches in your own repo.
Seen in: Nebula
How long it takes
| Max 20x (now called Ultra) | Max 5x (now called Max) | One person, no AI | How sure | |
|---|---|---|---|---|
| Path A: running on PC | 3 to 10 weeks | 2 to 6 months | 6 to 18 months | medium confidence |
| Path B: full decomp | 5 to 18 months, of which 1 to 3 months is the port | 9 months to 3 years, port included | 5 to 10 years | low confidence |
Read this first
All ranges assume one medium game and one person giving 10 to 15 hours a week. Path A is medium confidence. One project is dated clearly, and several partly dated ones agree on weeks. Most Wii ports hid private work before their first commit, so real times may be longer. Path B is low confidence. No one-person, AI-assisted Wii decomp has published dates. The numbers lean on community projects and on GameCube's Melee, so treat them as rough. Path B ranges include porting the finished decomp to PC.
What makes it faster or slower
- Whether a sister game already has a
WiiCompiledport or a decomp. Brawl Recompiled had its first release a day after it forked the same author's Super Paper Mario port. - Whether a symbol map exists. Without one, missed functions show up one crash at a time.
- How many RELs the game loads. A game with one
main.dolis simpler than Metroid Prime 3 with 74 modules or Brawl with 126. - Game size. Strikers Charged has 17,689 functions; Brawl has 92,522.
- Whether you build a harness early. Without it, every test needs you at the keyboard.
- Compile time and RAM. Building the Wario Land port on a player's PC takes 15 to 45 minutes and 16 GB of RAM is advised.
The facts behind these numbers
| Project | What happened | Link |
|---|---|---|
| Resident Evil: The Umbrella Chronicles | First commit 2026-10-11, first real translation 2026-10-12, first playable release 2026-10-26. One person, own translator, AI agents per the developer. | source |
| Mario Kart WiiCompiled | Repo created 2026-08-10, first release 2026-08-23, 21 releases by 2026-11-10, 20 contributors. README says AI coding tools were used. | source |
| Brawl Recompiled | Forked from the author's Super Paper Mario port on 2026-10-21. First release 2026-10-22, v0.5.3 on 2026-10-31. 26 of 40 commits have AI co-author lines. | source |
| Crash of the Titans: Wiicompiled | Repo created 2026-10-18, first public pre-release 2026-10-23 per the changelog. Developer says AI agents wrote all of it. | source |
| Mario Strikers Charged decomp | First commit 2026-08-20. All 17,689 functions matched and linked for five disc versions by about 2026-10-23. Four contributors. AI use not stated. It borrowed code from the GameCube sister-game decomp. | source |
| Recharged | Port of the finished Strikers decomp. First commit 2026-10-01, first release 2026-10-10. README says it is built with AI help. | source |
| Petari (Super Mario Galaxy decomp) | Repo created 2019-04-28. On 2026-11-10: 100% of 42,036 functions matched, 68.8% of code linked. 66 contributors. Does not accept AI changes. | source |
| Super Smash Bros. Brawl decomp | Repo created 2024-03-30. On 2026-11-08: 1.7% of code matched across 92,522 functions. | source |
| Super Smash Bros. Melee decomp (GameCube, same tools) | 48.54% matched on 2026-01-10 and 100% on 2026-09-07, with AI-assisted pull requests from a community. | source |
| NWiiRecomp | A recompiler built mostly by hand. Repo created 2026-05-30, 226 commits by 2026-08-07. Its README says AI was used only for commit titles and for putting code comments into English. | source |
Projects reviewed (13)
The top-starred project for each of the top 12 Wii games on RecompLauncher, plus one project its developer says was written by AI. RecompLauncher lists 25 Wii projects for 19 games. None came from outside it.
What each project teaches
Mario Kart WiiCompiled
Mario Kart Wii
Started: 2026-08. First release: 2026-08. Code: C# and C++.
AI: yes: README says AI coding tools were used; output is checked against real hardware
Lesson: Keep the translator generic and put every game address in one YAML manifest. Ghosts, which are input replays, gave a free check that physics match the Wii.
Nebula
Super Mario Galaxy
Started: 2026-10. First release: 2026-10. Code: C++.
AI: yes: README says the host, renderer, installer, tests and docs were written with Claude agents
Lesson: It began as a recomp and moved to the decomp once the host was ready. A scripted tour with 386 screenshots checks each new build.
Project Reignition
Sonic and the Secret Rings
Started: 2022-03. First release: 2024-06. Code: C# and GDScript.
AI: none stated
Lesson: This is a remake, not a decomp. It took 4,476 commits and 14 people since 2022, so it is no shortcut.
Brawl Recompiled
Super Smash Bros. Brawl
Started: 2026-10. First release: 2026-10. Code: C++ and C#.
AI: yes: 26 of 40 commits carry Claude co-author lines; an AGENTS.md is cited but not published
Lesson: It started as a copy of the same author's Super Paper Mario port, so its first release came one day later. It used a decomp only for its symbol list.
Recharged
Mario Strikers Charged
Started: 2026-10. First release: 2026-10. Code: C++.
AI: yes: README says AI agents help with refactors, tests and repeated changes; game code comes from the matching decomp
Lesson: It never edits the decomp. Every change is a small patch on a pinned copy. Faithful fixes and gameplay tweaks sit in two separate series.
NSMB Wii Recompiled
New Super Mario Bros. Wii
Started: 2026-08. First release: 2026-10. Code: C++ and C#.
AI: yes: README says the port was entirely coded by Claude, directed and tested by the author
Lesson: The translator moved to a new game unchanged. The runtime did not. Every hook moved to new addresses, with scripts to find and check them.
New Super Paper Bros
Super Paper Mario
Started: 2026-10. First release: 2026-10. Code: C++ and C#.
AI: yes: 70 of 72 commits carry Claude co-author lines; agent notes are git-ignored
Lesson: A map sweep loads every level, counts undrawn pixels and keeps a screenshot. It also matched code shapes against the NSMBW port to move hooks fast.
Kirby Wii Recomp
Kirby's Return to Dream Land
Started: 2026-07. First release: 2026-07. Code: C++.
AI: none stated (one branch name starts with agent/)
Lesson: One shared runtime can serve many GameCube and Wii games. The Kirby files are not public, so you cannot repeat its build.
Resident Evil: The Umbrella Chronicles
Resident Evil: The Umbrella Chronicles
Started: 2026-10. First release: 2026-10. Code: C++ and Python.
AI: yes: developer says Claude and Codex did research, launcher code, port code and docs Agent files: AGENTS.md, .claude/skills/uc-test/SKILL.md.
Lesson: A test server inside the game lets an agent play it with no keyboard. Small dated tests, each with a pass mark, came before every big choice.
Shake It! Native PC
Wario Land: Shake It!
Started: 2026-10. First release: 2026-10. Code: C++ and C#.
AI: none stated
Lesson: A game with one main.dol and no RELs is the easiest kind to start with. Proven addresses live in small tables next to the manifest.
Metroid Prime 3: Corruption PC
Metroid Prime 3: Corruption
Started: 2026-10. First release: 2026-10. Code: unknown (source not public).
AI: yes: 13 of 20 commits in the docs repo carry Claude co-author lines; the port source is private
Lesson: GX state turns into thousands of GPU pipelines. Ship a seed cache, or first launch takes about 17 minutes. A key that zips a bug report helps testers.
OceanTriRecomp
Monster Hunter Tri
Started: 2026-10. First release: 2026-10. Code: C++.
AI: yes: README says Claude did about 85% of the work (CONTRIBUTING.md says 65%)
Lesson: Seed function starts by code shape, not one crash at a time. Beware: its README build steps do not match the files in the repo.
Crash of the Titans: Wiicompiled
Crash of the Titans
Started: 2026-10. First release: 2026-10. Code: Python and C++.
AI: yes: developer says AI agents wrote all of it under his guidance and testing
Lesson: About 300 small fix scripts and 114 check scripts run in order, and the build stops at the first failure. Read licences early: NWiiRecomp is non-commercial.
What we could not check
- When most Wii ports really started. Many published their first commit and first release on the same day, so earlier private work is unknown.
- Whether AI was used on the Mario Strikers Charged decomp. Its README and CONTRIBUTING.md do not say, and no commit has an AI co-author line.
- When exactly the Strikers decomp reached 100%. The date above comes from its last regional linking commits.
- Whether plain
decomp-permuterruns on native Windows. Its README only says permuter@home does not. - Whether the Ghidra GameCube Loader opens Wii DOL files. Its README names GameCube only, and its latest zip targets Ghidra 12.1.
- Whether
dolphin-debugger-mcpworks on a Wii project. It was built for a GameCube decomp. - The Dolphin download page. It refused automated reading again on 2026-11-13 (HTTP 403), so the install line was not checked there.
- Which compilers third-party Wii games used. The reviewed decomps only show Metrowerks tools.
- The
tools/check.ps1(with its-BuildOnly,-Scenarioand-Fullswitches),tools/check_ledger.py,tools/next_units.py,tools/tour.ps1andtools/full_check.pyfiles are ones you write. No reviewed project ships them under these names. Only Shake It! Native PC keeps anhle_targets.tsv. - The manifest key name for the
main.dolSHA-256 pin. The translator README says the pin exists, but the example manifest does not show it. Copy it from a reviewed port'srecomp.yml. - Whether the Ghidra GameCube Loader zip labelled Ghidra 12.1 installs on Ghidra 12.1.4. If not, build it from source.
- How to export a function list from
DolRecomp. Its README does not show it; Shake It! Native PC says it used DolRecomp boundaries. - The folder layout
nodtool extractgives for a Wii disc. Thesys/andfiles/layout here comes from WiiCompiled's macOS guide, read through its review card. Check thatsys/main.dolexists after you extract. - The exact arguments
WiiCompiledbuild scripts pass on Windows. The full list was read only from its macOS guide and from the Brawl and Super Paper Mario cards. - Time ranges for one person. No reviewed project gives hours spent.
Sources
- WiiCompiled README
- WiiCompiled translator README
- Aurora README
- nod and nodtool README
- decomp-toolkit README
- dtk-template getting started
- dtk-template dependencies
- objdiff README
- m2c README
- decomp-permuter README
- DolRecomp README
- NWiiRecomp README and licence
- llvm-mingw README
- Ghidra GameCube Loader README
- GhidraMCP README
- Dolphin debugger MCP README
- Mario Strikers Charged decomp README
- decomp.dev: Mario Strikers Charged
- decomp.dev: Petari
- decomp.dev: Brawl
- WiiBrew: DOL format
- WiiBrew: Broadway CPU
- WiiBrew: Hollywood
- MKWii wiki: REL file format
- Melee decomp final pull request
- WiiCompiled example manifest
- Aurora build and CMake guide
- m2c target options
- Microsoft: install .NET on Windows
- Microsoft: install PowerShell on Windows
- CMake downloads
- Python downloads
- Git for Windows install