The shrub region's end was the last unlocated bound in core_data. It was not in the core index, and unlike moby->tie it had no successor boundary to chain against, so the last shrub class in every level ran out to the lump's end and the aggregates over it (the "3.5M records / 28MB of shrub body") were artifacts of that oversized span. Range measured: for each level, from the last shrub class's geometry offset to the constant trailer. Nothing outside that range is read. Method: scan forward from the last shrub class for the pair (a) the constant two bytes f6 7c sitting immediately in front of (b) a chunk signature -- a 16-byte header ending 0xff, ten zero bytes, then four or more 0xf0-tagged offsets. The two halves are each weak alone, and the halves are measured separately: the marker pair occurs 25 to 103 times in a 5 to 17 MB lump, so matching it alone picks dozens of wrong offsets; the chunk shape matches random data often enough to need four tagged offsets before it is believed. Result: on all 27 levels the marker sits exactly two bytes before the first chunk header, and the two parts of the signature are never found apart. No chunk signature occurs inside any last shrub body, on any level. The three levels without shrub (10, 25, 26) carry the same marker before the container that closes tie instead, which is what makes the locator a property of the region rather than a shrub rule. Consequences: - All 358 shrub class bodies are bounded and are whole 8-byte records. That was not assertable while the last class in each level ran to the lump's end, and it is the check the boundary earns its keep for. - 9,600 records in total, against the 8,938 previously measurable in successor-bounded spans; 662 of them sit in the 24 last-class bodies. The shrub region totals 2,033,776 bytes across the 24 levels that have one. - The chunk container is 25,775,850 bytes across 27 levels (1,236 chunks, 22,562 records). The container measurements were previously taken over "the 900,000 bytes before the trailer", a window that did not align to its real extent: on level 0 it is 690,302 bytes, and 27 of 1,123 chunks were truncated at that invented edge. chunk_containers_resolve_on_every_level now reads the region from core_layout instead of measuring backwards from the end of the lump. core_layout takes core_data now: the container's start is the one bound that cannot be derived from the index. It gains the chunks region, so every byte of level-specific core_data belongs to a named region. Where the signature is not found the end stays None -- the region is left visible rather than clamped to the tail. Still open: the marker's meaning (constant across 27 levels, at exactly this position, unnamed) and the shrub body payload's encoding.
Going Commando
A native PC reimplementation of Ratchet & Clank: Going Commando (PlayStation 2, 2003), written in Rust.
The game is reimplemented, not emulated. There is no MIPS interpreter here and no CPU emulator: the systems are ported to Rust so they run as ordinary native code.
Status: initial scaffold. The disc is identified and verified, the
workspace builds, and nothing else is implemented yet. See
docs/roadmap.md for where things stand and what comes next.
The target
| Game | Ratchet & Clank: Going Commando |
| Platform | PlayStation 2 |
| Disc | SCUS_972.68 v1.01, USA Black Label |
| Video | NTSC, 60 Hz |
| Boot ELF SHA-1 | bacda860cbd6723142e86db56f197e47e728970f |
Verified against a real disc — see docs/disc-identification.md.
This is the build the reference projects pin; Greatest Hits v2.00 is a
different binary and is not the target.
No game content
This repository contains no game assets, no disc images, no BIOS dumps and no proprietary toolchains. You supply your own legally obtained copy of the disc as an input, the way the upstream reference projects do.
A pre-commit hook enforces this, blocking disc images, asset directories, container signatures and files over 50 MiB. If you clone elsewhere, enable it:
git config core.hooksPath .githooks
Layout
crates/
gc-formats/ asset format parsers (pure, no I/O beyond the caller's buffer)
gc-extract/ disc pipeline: identify, unpack, verify
gc-game/ game logic: hero, weapons, moby classes, progression, saves
gc-video/ IPU / MPEG-2 decode
gc-engine/ Bevy app: Graphics Synthesizer, VU0/VU1, renderer, frame loop
docs/
disc-identification.md which disc we build against, verified
roadmap.md phases, gates, current status
plan/ one file per subsystem, written as work proceeds
formats/ format specs, written as formats are reversed
tools/
identify-disc.py identify any Going Commando disc image
vendor/
rerac/ pinned upstream reference checkout (not tracked)
Building
Requires a Rust toolchain via rustup.
cargo check --workspace
cargo test --workspace
The host audio backend is disabled in Cargo.toml (see the comment there) so
that the workspace builds without system ALSA development headers. Audio decode
is the last phase of the port and lives in gc-video; re-enable it and install
alsa-lib-devel when that work starts.
Identifying a disc
python3 tools/identify-disc.py <your-disc.iso>
Reports the serial, version and video mode from SYSTEM.CNF, hashes the boot
executable, and warns when the disc is not the supported build. Reads only a
few megabytes, so it is near-instant.
How it will be verified
Visual and behavioural comparison against PCSX2, replaying recorded input and
comparing frames, level by level. The PS2 float model is reproduced rather than
approximated — see AGENTS.md.
Credits and licensing
This project learns from and is built on the work of others. Licences are
recorded in PROVENANCE.md and notices must travel with any
code derived from them.
- ReRAC — a native Rust/Bevy port of Ratchet & Clank (2002), the first game. ISC. The architecture this project follows.
- OpenRAC / rac2-gc-decomp — matching decompilation research for this game. MIT. Source of verified struct layouts and engine documentation.
- Wrench — community documentation of Insomniac's container formats. GPL, used as a specification reference only; no code is copied.
Ratchet & Clank is a trademark of Sony Interactive Entertainment. This is an unofficial fan project, not affiliated with or endorsed by Sony Interactive Entertainment or Insomniac Games.