THE NINJAWARRIORS (US): NATIVE BACKGROUND/GRAPHICS RESOURCE ARCHIVE

All data is extracted from the supplied US SNES ROM. No external sprite sheets, artwork, or replacement graphics were used. The original source ROM remains unchanged.

173 directory entries at CPU2F:8000 (headerless ROM0x178000) cover 140 unique stored streams. Each stream is preserved with its three-byte compression header, decoded bytes, SHA256 identifiers and directory aliases. All 173 decodes were compared byte-for-byte against the original CPU00:8ACC decompressor and matched.

Format: one flag byte (0=raw), little-endian 16-bit decoded size. Compressed streams use groups of 16 flag bits, LSB first; 0 is a literal byte, 1 is a 16-bit backreference. Distance=(word&0x7ff)+1 and length=(word>>11)+3. The extraction script retains exact native data. Diagnostic grayscale 2bpp/4bpp tile sheets are interpretations, not labeled assembled images.

The global map descriptor table at CPU00:A283 has 36 pointer slots and 26 unique 66-byte descriptors. Its 19 distinct graphics/palette/layout configurations are all represented by compact native region atlases: 296 total 256x256 region definitions, including definitions that are not placed in a visible room. All 34 stored foreground/secondary region-grid planes are also preserved as full-world PNGs, with every placement and native coordinate in JSON. World planes include default/filler positions exactly as the native grid does; compact region atlases avoid redundant default tiles in the gallery.

World assembly follows the original CPU00:CF8B/00:D2AA lookup: region grids at 7FA000/7FA400 select 128-byte metatile layouts at 7FE000, which select 32-byte 16-tile definitions at 7FB000. Native graphics use standard SNES 4bpp planes and BGR555 palettes, with hardware horizontal/vertical flips retained. 108 representative tile queries across nine area configurations matched the original lookup routine exactly. Initial palette slot 0 is replaced with indexed palette 0xC0, matching the original loader's HUD/default palette step.

The archive contains 192 indexed 16-color palettes from CPU06:85A6 plus the 16 palettes in the default full CGRAM upload at 06:9DA6. Unused all-FFFF placeholder slots are retained and marked. Raw bank containers A9-AF include the directory, source graphics streams and all tail bytes. This retains even the 40 nonzero unused tail bytes at the end of bank AB rather than silently dropping them.

Static layer assembly does not flatten sprites, HUD, parallax, palette animation, color math or destructible/mid-level RAM changes into a composite scene. Separate runtime scene/layer captures and sprite extraction complement this archive. The files here are whole native backgrounds/regions and raw resources; individual tiles are not represented as complete sprites.

Manifest: work/graphics-rom/backgrounds-manifest.json
Native resource inventory: work/graphics-rom/resource-inventory.json
ROM decoder verification: work/graphics-rom/resource-emulator-validation.json
World lookup verification: work/graphics-rom/world-map-emulator-validation.json
Full world placements: work/graphics-rom/world-maps/world-placement-maps.json
Palettes/map descriptors/raw bank containers: work/graphics-rom/native/

Reproduction requires the original headerless ROM under source/ and the preserved Snes9x headless host for emulator comparison. Run extract_resources.py, validate_resources.py, build_background_archive.py, validate_world_maps.py, then finalize_background_archive.py. All scripts and outputs are stored on L: in the preservation project.
