← Jimmy Neutron, rebuilt

Post-mortem · June 2026

The Asset Catalog & the road to parity

The catalog is finished. It is the moment the project stops collecting the game and starts accounting for it — every asset now carries its resolution, its texture truth, and the levels that use it. Here is what it does, what it cost, why it reshapes the native Linux port, and the concrete path from "renders Retroville" to full parity with the 2002 original.

219FourCCs cataloged
5,807asset files indexed
208/208decomp specs
44FourCCs with native behavior
0used-in-level FourCCs draw a box
4genuinely untextured meshes

What the catalog does

In a little over two months this project pulled everything out of a 2002 Direct3D 7 game — 4,900 assets, a public download library, 208 reverse-engineered class specs. But the assets were harvested, not accounted for. Nothing recorded the one thing the native port actually needs at every step: how is this asset resolved, where does its texture come from, and where in the game is it used?

The Asset Catalog is that accounting layer. It is a single deterministic generator that joins the project's own sources of truth — the live engine resolver tables, the sprite-canvas map, the behavior table, the class-id table, all 208 decomp specs and their asset tables, the decomp ledger, and every one of the 35 level files — into 219 per-FourCC resolution rows and a 5,807-file inventory, published as a searchable, filterable site. It reads those sources in place; it never re-derives or duplicates them, so it cannot drift from the engine it describes.

Each FourCC row answers the whole question at once:

The texture-truth ladder — never guess

  1. Decomp spec — the class's own Assets table names the PNG (highest authority).
  2. Resolver — an explicit texture path curated into the engine.
  3. Sprite canvas — a billboard: the authored sprites.omt canvas is the texture.
  4. ASE bitmap — the mesh's declared bitmap, resolved exactly as the runtime does (a repo path loads directly; a Windows BMP basename remaps via the engine's carl3.bmp → carl.png digit-strip rule).
  5. GLB-embedded — the modern mesh carries its own texture.
  6. Explicitly unresolved — marked, not invented, and listed in the gaps checklist.

Post-mortem — what it cost, what it taught

The catalog was built in one focused pass by a discipline that is worth stating plainly: join the existing truth, don't re-derive it. Every datum already lived somewhere authoritative — the resolver in C, the canvas map in a generated header, usage in the level files. The generator's whole job was to connect them. That is why it is cheap to maintain (re-run after any change) and why it cannot lie: it shows exactly what the shipped engine does.

Getting that fidelity right forced us to encode the engine's quirks into the catalog rather than approximate them — the precise resolver precedence, the BMP digit-strip rule, the distinction between an OMT-export mesh's repo-relative texture path and a legacy Windows bitmap. The payoff was immediate and a little poetic: the catalog found its own first bug.

The catalog as an audit instrument. It surfaced that the invisible trigger class C3DTrigger currently resolves to an editor placeholder icon (the "triger" sprite) instead of drawing nothing — a faithfulness question no one had asked, made visible the instant every FourCC's resolution was laid out in one table. The catalog reports the engine honestly; it does not silently "fix" it. That is the point.

Validation held throughout: the engine's faithfulness sweep stayed at 0 findings across all 35 levels, the page loads with zero broken links against the live asset tree, and the committed manifest is a lean 210 KB (the heavy file inventory stays regenerable).

Why this changes the native port

The port has always had two independent coverage tables, and "implemented" meant something different in each. The catalog is the first artifact that measures both at a glance:

That last line is the whole strategic picture, and the catalog is what makes it legible. It converts the central question of the port — "what is this object, where is it used, and is it ported yet?" — from an afternoon of capture-spelunking into a single lookup. It is, finally, the "role-annotation layer" the project set as its thesis a month ago: found assets are tagged with truth and usage once, and every later feature reads the tag instead of re-discovering it.

Paired with the faithfulness sweep, the catalog also becomes a running parity scoreboard: visual fidelity is held at zero findings, the unresolved checklist names the remaining texture gaps, and the behavior column is the burn-down chart for the rest of the game.

The road to full parity

With the visual layer essentially closed, parity is now overwhelmingly a behavior and game-flow problem. The work sorts into five tiers, each grounded in what the decomp specs already pin down.

1 · The behavior frontier largest lift

2 · Game-flow completion structural

3 · The last visual gaps small, bounded

4 · HUD & audio finish harvestable now

5 · Ground-truth tooling enabling

How we will know it's done

Parity has a definition now, and instruments to measure it. Visual parity is the faithfulness sweep at zero findings and the catalog's unresolved list emptied. Behavior parity is the catalog's native-coverage column reaching the full placeable-class set — every object that the original makes act doing so here. And the original game's own captured Direct3D 7 command stream remains the validator of last resort for any motion or pixel in doubt. The catalog doesn't finish the port — but for the first time, it tells us exactly how much is left, and points at each piece of it.

Open the Asset Catalog → Unresolved checklist Native-port plan Project history