OpenRAC brings the games' decompilation projects together. Each was imported
as a snapshot of its default branch (the first four on 2026-10-03), and their
later commits are synced in as diffs. A snapshot is the project's tree at one
commit, taken with git archive, not its git history. The histories hold material the projects
later removed, so they stay in the original repositories, which remain the
record of who wrote what. CREDITS.md lists the people behind
each project.
| Directory | Project | Repository | Branch | Commit | Its date | License |
|---|---|---|---|---|---|---|
games/rac1 |
rac1-decomp | https://github.com/OpenRAC/rac1-decomp | main | 693667f24057 |
2026-10-31 | GPL-3.0 (third-party parts keep theirs) |
games/rac1/ntsc |
Lombyte | https://github.com/lombyte-project/Lombyte | main | d29807486aeb |
2026-10-31 | GPL-3.0 (GPL-2.0 and newlib parts keep theirs) |
games/rac2/ntsc |
rac2-decomp | https://github.com/OpenRAC/rac2-gc-decomp | master | 8bc9d785bfec |
2026-10-20 | GPL-3.0 |
games/rac3/ntsc |
rac3-uya-decomp | https://github.com/OpenRAC/rac3-uya-decomp | main | bfd8278e8c73 |
2026-10-07 | GPL-3.0 |
games/rac4/ntsc |
rac-deadlocked-decomp | https://github.com/OpenRAC/rac-deadlocked-decomp | main | dedfcd416a1b |
2026-10-05 | MIT (GPL libgcc, newlib libm) |
games/rac5/ntsc |
rac5-sm-decomp | https://github.com/OpenRAC/rac5-sm-decomp | master | 57b025248ac0 |
2026-10-18 | GPL-3.0 |
games/rac6/ntsc |
rac-sac-decomp | https://github.com/OpenRAC/rac-sac-decomp | main | 4e38d3d88f62 |
2026-10-21 | GPL-3.0 |
The full commit hashes are in each games/<game>/game.json under source,
which tools/sources.py reads and updates. rac1/pal is
synced from the Veradictus fork's
main: upstream plus work waiting to be merged there, so its commit may not
exist upstream yet.
Everything else is exactly as it was at that commit.
rac1/pal
- Left out
.agents/mcp_config.json, a machine-specific MCP configuration. - Moved
tools/extract/(the level extractor) anddocs/GDSCRIPT_CONVENTIONS.mdto the top-leveleditor/, and pointedtools/overlays.py,tools/overlay_scan.py,tools/dossier.pyand the docs at it. tools/docker/run.shmounts all of OpenRAC in the build container, so the editor,baserom/andtoolchains/are reachable.- The tree lives at
games/rac1/itself (the merged game;"dir"ingames/rac1/game.json), notgames/rac1/pal/, sotools/docker/run.shlooks two levels up for OpenRAC's top instead of three. tools/wave.pynames its own directory in worker prompts instead of a path on one machine, and gives its commits therac1/palscope.README.md,THIRD_PARTY_NOTICES.md,docs/ASSETS.md,docs/OVERLAYS.mdanddocs/LLM_DECOMP_INSTRUCTIONS.mdpoint to the editor and OpenRAC's rules. Upstream rewrote its README on 2026-10-07; OpenRAC keeps that version with only its extractor link pointed at the editor.tools/lombyte.pyandtools/names.pyread Lombyte fromgames/rac1/ntscand its published report fromprogress/sources/;docs/SIBLING_DECOMPS.mdsays where the sibling projects are.src/game/space.cnames the display list's sizeD_0016100Citself, notD_00160000+ 0x100C: the same address on the console, but each level keeps its own copy of the variable and the port moves only the address the code names. The level's copy was left at the pause menu's size, and loading a save from the pause crashed the flight.src/game/loaders.creaches the class-resource arrays afterclass_resource_ids(D_001CBEA0,D_001CBF60,D_001CC0E0) from that base, as one block: the level loader pairs only the first base, so the port relocates the others with it.src/overlays/l07_umbris/taxi_platform.c: the Bombomatic's hit handler names its hit messagehit_message, nots16. A local named after the type shadows it, and hostgen writes casts by the type's name.nonmatching/game/func_0020E3D0.c(a candidate) declares the moby layout it reads itself:src/game/mobyfunc.c, where it goes, now usesinclude/moby.h, whose field names differ.
rac1/ntsc
- The README credits the NTSC decomp by that name only (removal requests).
docs/commit-messages.mdnotes that OpenRAC's commit convention applies.- Added
host/: a wrapper and a runner that build the project on an Apple Silicon Mac under rac1/pal's Wine (host/README.md). Nothing in the project reads them. - C patches for the native port (
port/game/rac1-ntsc), each listed with its reason in OPENRAC_PATCHES.md: the C made explicit where it relied on a register or named a PAL address. A sync keeps them, and leaves a.rejwhere the project changed the same lines; they are to be offered to the project.
rac2/ntsc
- Nothing changed. Since 2026-10-11 the project carries the sourcing edits OpenRAC used to make
itself (no
include/moby.h, the leaked-material passages gone from its docs) and states the sourcing rule in its own CONTRIBUTING.md and AGENTS.md. Its history was squashed when it was rebuilt to rac1-decomp's structure, so it was imported afresh at that commit. ports/pal-functional/(platypet2217-star's RAC2Decomp, MIT) comes along unchanged; it is not part of the matching sources or progress.
rac5/ntsc
- Nothing changed: imported as the project's commit, whole. It already states the sourcing rule in its own LEGAL.md, CONTRIBUTING.md and AGENTS.md.
rac6/ntsc
- Imported as the project's commit, whole; it states the sourcing rule in its own LEGAL.md, CONTRIBUTING.md and AGENTS.md.
config/toolchain.jsonnames the sibling workspace's compiler depot by its relative path (tools/compilers/...), without a local drive path.THIRD_PARTY_NOTICES.mdcredits GCC'sfp-bit.candlibgcc2.c(GPL-2.0-or-later with the libgcc exception) for the runtime-library bodies insrc/levels/bodies/.
rac4/ntsc
- In
src/game/00473A88.c, the five members of the local struct are named by offset (f20,f68,f69,f6A,fBE), as the project's ownLEGAL.mdasks. Four carried the names rac1/pal'sMobyInstanceheader uses at the same offsets, whose origin is open question 3. tools/docker/run.shmounts all of OpenRAC and can use rac1/pal's local image.tools/setup_asm.shhashes with python3 instead ofsha1sum.
rac3/ntsc
- Left out
localdecomp/server.py.bak_0926, a stale backup ofserver.py. localdecomp/server.pycommits and pushes only when its project is the top of its own git work tree, so never into OpenRAC..gitignorecovers the linker script splat writes during setup.
While the projects are still active in their own repositories, their new commits can be applied here as a diff, so the changes above survive:
python3 tools/sources.py status # how far each checkout is past its recorded commit
python3 tools/sources.py sync rac1/ntsc # apply the checkout's new commits to games/rac1/ntscA checkout is looked for at the path in game.json, written from the top of
OpenRAC (for example ../rac1-decomp-ntsc: the project cloned beside OpenRAC),
or in $OPENRAC_SOURCE_RAC1_NTSC when it lives elsewhere. A hunk
that touches a line changed here is left as a .rej file to resolve by hand.
After syncing rac2/ntsc, write the port's copy of the names its build derives
again from a build of that commit
(port/game/rac2-ntsc).
Before committing a sync, check it against the
sourcing policy, including the removal requests, and
commit it as one chore(import) commit per project, naming the new commit.
These are credited where their work is used, and in THIRD_PARTY_NOTICES.md:
- ReRAC (ISC): the moby, collision and animation formats in the editor, and function notes in rac1/pal.
- Wrench (GPL-3.0-or-later): asset formats, read for the editor; the tool rac2 and rac3 use to unpack discs.
- splat, spimdisasm, objdiff, asm-differ, decomp-permuter, m2c and wibo: the decompilation tooling the projects use; none is vendored here.