Post-mortem · June 2026
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.
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:
3OMT object shows its authored objects.omt shape, not the generic fallback.carl3.bmp → carl.png digit-strip rule).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).
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.
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.
C3DVehicle player-car (six-wheel steering & suspension) and the AI-vehicle children (light cones, contact horns, the sailboat's sine-bob) wait on the effect/Goddard subsystems.RequiredLevel / ExactLevel are env-driven because the original's ~550-range campaign-progress value isn't ground-truthed yet. This is the single most-cited unknown; nailing it unlocks correct quest-spawn and story-gated visibility across the campaign.C3DTrigger editor-placeholder finding above — decide invisible vs. authored..grn clips await type-tree/skinning decode to animate the cast.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