Skip to content

Latest commit

 

History

History
409 lines (405 loc) · 157 KB

FORMATS.md

File metadata and controls

409 lines (405 loc) · 157 KB

Supported Formats & Technical Reference

This document contains detailed technical notes, reverse-engineering findings, and the complete format capability registry for Wiimms SZS Tools Plus.


Format Capability Index

Format Platform / Category Decode Encode Notes
AJJPG / AJPG GBA / Still Image ✅ ✅ GBA-era still image container
ADJB Switch / Model sidecar ✅ ❌ Smash Ultimate mesh triangle adjacency (model.adjb): per-mesh id + u16 index lists, sized like Adjb.cs
AFS Wii / Archive ✅ ❌ Sega/CRI-style flat archive reused by Spike Co.'s engine for Dragon Ball Z: Budokai Tenkaichi 3 (wzs3us0/1/2.afs); magic AFS\0 + u32 LE file count, then that many {offset,size} u32 LE pairs, one trailing pair pointing at a 48-byte-per-entry name/date metadata table; decode-only, verified against retail samples by direct hexdump
SCB / IMB / PLB DS / Background ✅ ❌ Luminous Arc 2 screen maps with same-stem tiles and palette; 250 retail PNGs checked, audit
LZE DS / Compression ✅ ❌ Luminous Arc 2 Le streams, four token forms; 1,275 retail resources verified against CUE, audit
IEAR DS / Archive ✅ ❌ Luminous Arc MAIN/JTBL typed resource archives; indexed payload extraction, retail audit
ALAR DS / Archive ✅ ❌ Jump Stars type 2 / type 3 named archives, including nested DSCP wrappers; retail audit
SOMA-DAD DS / Compression ✅ ❌ Monolith Soft / Procyon Studio Soma Bringer LZSS compression (DAD\x01); 20/20 retail archives decompressed cleanly, retail audit
SOMA-OBP DS / Graphics ✅ ❌ Monolith Soft Soma Bringer sprite/object tile banks with RGB555 palette (OBP1); structured inspection via wszst text / dump, retail audit
SOMA-BGP DS / Graphics ✅ ❌ Monolith Soft Soma Bringer 256x192 background tile maps with RGB555 palette (BGP1); structured inspection via wszst text / dump, retail audit
SOMA-PCS DS / Animation ✅ ❌ Monolith Soft Soma Bringer 2D layout and animation keyframe sequence (pcs\0); structured inspection via wszst text / dump, retail audit
CV-SPR DS / Animation & Sprites ✅ ❌ Konami Castlevania DS sprite object definition (0xBEEFF00D, Dawn of Sorrow, Portrait of Ruin, Order of Ecclesia); parts, hitboxes, frames, frame delays, and animation tracks disassembled to text via wszst text / dump, 512/512 retail files verified, retail audit
CPAC DS / Archive ✅ ❌ Capcom Ghost Trick: Phantom Detective / Resident Evil: Deadly Silence multi-section archive container (cpac_2d.bin / cpac_3d.bin); tagged sections (BKEY models/animations/textures, PKEY palettes), LZ11 auto-decompression, 26,000+ retail members verified, retail audit
CING-WPF DS / Archive ✅ ✅ CiNG Wish Pack File (Hotel Dusk: Room 215 / Wish Room, .wpf / .tbl); contiguous 32-byte directory records with 24-byte filename, 32-bit payload size, and 32-bit offset stride to next member; extraction via wszst extract and creation via wszst create, 275 retail archives and 6,605 members verified byte-for-byte, retail audit
JUPITER-PCK DS / Archive ✅ ❌ Jupiter Corp Nintendo DS Model/Motion Package (The World Ends with You, Kingdom Hearts: Re:coded, .pck); header length, member count, and 32-bit entry sizes table followed by Nitro 3D resources (BMD0, BCA0, BTP0, BTX0, BTA0, BMA0, COLI); 90 retail archives verified byte-for-byte, retail audit
RL GBA/DS / Compression ✅ ❌ Nintendo 8-bit Run Length compression (magic 0x30), including wrapped containers (e.g. Professor Layton / Level-5 DS .arc / .arj with method code 1); decompressed via wszst decompress, 58/58 retail Layton 1 samples verified byte-for-byte, retail audit
L5-PAC DS / Archive ✅ ❌ Level-5 / Armor Project PAC archive container (.pac / .dat, Dragon Quest IX: Sentinels of the Starry Skies); contiguous 80-byte member headers with declared filename, uncompressed payload size, and allocation stride; 316 retail archives and 1,475 member files verified, retail audit
SSZL Wii / Compression ✅ ✅ Namco Museum Remix LZSS0 compressed stream (SSZL magic, .lzs); decompression via wszst decompress, extraction via wszst extract, retail audit
VCRA Wii / Archive ✅ ✅ Namco Museum Remix resource archive (VCRA magic, .vcra / .bin); extracted via wszst extract and created via wszst create, 56-byte member names, retail audit
INIO-LZO DS / Compression ✅ ❌ iNiS LZO1X compressed stream (1OZL magic, Osu! Tatakae! Ouendan, Moero! Nekketsu Rhythm Damashii, Elite Beat Agents); 12-byte header with decompressed and compressed sizes; verified across 15,702 retail files byte-for-byte, retail audit
THOR Wii / Resource package ✅ ❌ Behaviour Interactive resource package (.wii, Phineas and Ferb: Quest for Cool Stuff) -- not a disc image; 0x40-byte header with an ASCII "Thor" marker at 0x3C, a mostly-empty run of 8-byte BE (key,val) slots ending in a {0xFFFFFFFF,count}/{table_offset,0} marker pair, then count 12-byte BE {id,offset,size} resource records; many blobs carry a small 0xABABABAB-prefixed envelope with an embedded name used for extraction, others are dumped raw by index; decode-only, verified against all 85 retail samples by direct byte analysis
ALZ1 DS / Compression ✅ ✅ Arika 4096-byte window LZSS with inverted flag bits
Arika (INFO.DAT/GAME.DAT) DS/DSi / Archive ✅ ✅ Obfuscated directory decryption and member decompression
ARCV Wii / Archive ✅ ✅ Pac-Man Party (Wii) archive; byte-exact round-trip
ART / IMG Wii / Texture ✅ ✅ Monster Games GUI image format
ASH0 GameCube/Wii / Compression ✅ ✅ Nintendo ASH0 compression (System Menu, Animal Crossing, My Pokémon Ranch; automatic 11/15-bit distance tree fallback)
AGI Wii / Archive ✅ ❌ Toys for Bob "AGI" archive (\x1AAGI, Skylanders: Swap Force files/*.pak): big-endian header + backslash-path name table; extract-only. Two entry-table record layouts, tried in order: plain 2-word (offset,size) pairs (pure audio-bank .pak files) and 4-word (0, offset, unk, flag) groups whose on-disk size is derived from the gap to the next block-aligned offset (mixed audio + .igz/.igx model/material .pak files). Verified against all 2339 retail .pak files sampled from the Swap Force DATA partition: 100% parse successfully (1559 via the 2-word layout, 780 via the 4-word layout). Raw FSB5 audio members are tagged .fsb and auto-decoded to WAV via the existing FSB4/FSB5 decoder; .igz/.igx model/material members are extracted raw (IGZ internals out of scope)
AT7 PS2/Wii / Archive ✅ ✅ Koei Tecmo container
BCBNK 3DS / Audio ✅ ❌ NW4C bank: wave table and instrument slot list to YAML
3DS Camera PACK 3DS / Archive ✅ ❌ .pack table of 0x40-byte {name[0x38], offset, size} records; the LZ11 members are extracted as they are
GBIN 3DS / Data ✅ ❌ Camera guide table (GUID records with named parts) to YAML
BCFNT 3DS / Font ✅ ✅ 3DS bitmap font to PNG atlas
BCH 3DS / Model ✅ ✅ CTR H3D model container
BCLAN 3DS / Layout ✅ ✅ 3DS layout animation
BCLIM 3DS / Texture ✅ ✅ CTR image container
BCLYT 3DS / Layout ✅ ✅ 3DS binary layout
BCWSD 3DS / Audio ✅ ❌ NW4C wave sound data: wave table and wave sound list to YAML
BCRES 3DS / Model ✅ ✅ CTR graphics container
BCSAR 3DS / Audio Archive ✅ ✅ CTR Sound Archive (CSAR)
BCWAV 3DS / Audio ✅ ✅ CTR Sound Wave
BCWAR 3DS / Audio Archive ✅ ✅ CTR Sound Wave Archive (CWAR)
BCGRP 3DS / Audio Archive ✅ ✅ CTR Sound Group Archive (CGRP)
BFFNT Wii U / Font ✅ ✅ Wii U bitmap font to PNG atlas
BG4 3DS / Archive ✅ ✅ Mario & Luigi flat archive with BLZ member compression
BIGF Wii / Archive ✅ 🟡 EA BIGF container (encode round-trips losslessly; not a byte-exact retail reproduction — no retail .big sample to derive member ordering/padding from)
BFLAN Wii U / Layout ✅ ✅ Wii U layout animation
BFLIM Wii U / Texture ✅ ✅ Wii U textures (BC1-BC5)
BFLYT Wii U / Layout ✅ ✅ Wii U binary layout
BFRES Wii U / Switch / Model ✅ ✅ GX2/NX model container (passthrough / extraction)
BFSAR Wii U / Switch / Audio Archive ✅ ✅ Sound Archive (FSAR)
BFWAV Wii U / Switch / Audio ✅ ✅ Sound Wave
BFWAR Wii U / Switch / Audio Archive ✅ ✅ Sound Wave Archive (FWAR)
BFGRP Wii U / Switch / Audio Archive ✅ ✅ Sound Group Archive (FGRP)
BERMUDA-MWT Wii / Texture ✅ ❌ Bermuda Triangle - Saving the Coral "GDATAVERSION" resource envelope (.MWT): confirmed 0x40-byte outer header (size/width/height/flags); payload is, in every sample checked, an already-supported Camelot-style GX texture bank (magic 0x0020af30)
BERMUDA-PLANETG Wii / Generic Data 🟡 ❌ Bermuda Triangle - Saving the Coral "PLANETG" tagged-object resource (.MWG/.MSP): length-prefixed root type (PLANETG_SPRITECOLLECTION on all 20 retail .MWG, PLANETG_SPRITE on the retail .MSP) plus version field verified across every retail sample; every length-prefixed ASCII tag/string name decoded via a heuristic walk, backslash paths ending in .MWT flagged as sprite texture references (raw .MWT census: 2 in the smallest sample, 2144 in the largest); exact record tree shape and interleaved numeric-field semantics not reverse-engineered
BERMUDA-PKI Wii / Container ✅ ❌ Bermuda Triangle - Saving the Coral "IMAGE_WII_COMPACT_FILE_VERSION_1" texture-pack container (.PKI): confirmed header + full name/size/offset entry table
BERMUDA-PGF Wii / Font ✅ ❌ Bermuda Triangle - Saving the Coral font resource (.pgf): confirmed header (family name, point size, padding/margins), four 256-word tables for glyph X/Y/W/H (ASCII 0..255), and companion atlas dimensions matching paired .MWT/.TPL sheets; fully decoded
AQUAPANIC-RKET Wii / Scene ✅ ❌ Aqua Panic! "RKET" resource container (.rck/.spa, shared magic between per-level scene data and localized language packs): confirmed fixed 56-byte outer header and payload size formula (file_size == 56 + payload_size on 98/105 retail samples, uncompressed target size on compressed variants)
AQUAPANIC-MAT Wii / Material ✅ ❌ Aqua Panic! "MATF" material chunk table (.mat): confirmed outer header and tag/size chunk table, walked to EOF across 100 real samples; per-chunk ("MAT "/"TEX ") payload contents not reverse-engineered
AQUAPANIC-MB2 Wii / Metadata ✅ ❌ Aqua Panic! "BNAM" bone/node name-string table (.mb2): fully decoded header plus length-prefixed name list, confirmed to consume every one of 100 real samples exactly to EOF
AQUAPANIC-VIS Wii / Visibility ✅ ❌ Aqua Panic! visibility/flag record (.vis, magic-less): fixed 24-byte record, byte-for-byte identical across all 100 real samples; fully decoded
AQUAPANIC-LIT Wii / Lighting ✅ ❌ Aqua Panic! single-light record (.lit, magic-less): fixed 48-byte record with float32 color/position fields, plus a confirmed 12-byte empty variant; fully decoded across all 100 real samples
BLZ DS / Compression ✅ ✅ Nitro backward-LZSS
BPE / GFCP Wii / Compression ✅ ✅ Good-Feel Byte Pair Encoding (GFAC mode 1)
BMD DS / Model ✅ ✅ Early Nitro 3D models
J3DBMD GameCube / Wii / Model ✅ ✅ J3D binary model (J3D2bmd3, legacy bmd2); SuperBMD-compatible GLB round-trip (geometry, skinning, materials, GX textures incl. mipmaps; canonical single-TEV encode, RGBA32/CMPR, triangle lists) + material/texheader JSON sidecars + --profile
J3DBDL GameCube / Wii / Model ✅ ✅ J3D binary display list (J3D2bdl4); same coverage as J3DBMD, MDL3 section written as a parseable stub (prefer BMD for in-game use)
BNTX Switch / Texture ✅ ✅ Switch texture container (Tegra block-linear); native DDS/ASTC block export
BREFT Wii / Texture ✅ ✅ Brawl effect texture
BRFNA / BRFNT Wii / Font ✅ ✅ NW4R font to PNG atlas + XML metrics
BRLAN / BRLYT Wii / Layout ✅ ✅ NW4R layout and animations
BRRES (MDL0, TEX0) Wii / Graphics ✅ ✅ NW4R models, textures, animations
BRSAR Wii / Audio Archive ✅ ✅ NW4R sound archive
BRSTM / BFSTM / BCSTM Wii/Wii U/3DS / Audio Stream ✅ ✅ Multichannel ADPCM/PCM streams
BYAML / BYML Wii U / Switch / Data ✅ ✅ Binary YAML format (versions 1–7, big- and little-endian, string/path/hash tables incl. reloc maps); path tables ride any version, not just v1; Yaz0-wrapped BotW containers (.sbyml, .smubin, …) decode transparently and re-compress on CREATE; encoder honors .be/.vN dest markers and # byml version=N endian=.. headers; wszst BYMLFIND searches keys/values
CA01 / SA01 3DS / Wii U / Archive ✅ ✅ Mii Maker & amiibo settings flat archives
CCF Wii / Switch / Archive ✅ ✅ Virtual Console container
CGFX 3DS / Model ✅ ✅ CTR NW4C model container
CRAM (.arc) 3DS / Archive ✅ ✅ Xenoblade Chronicles 3D archive
CSB Switch/Wii U / Collision ✅ ✅ Paper Mario collision scene (TTYD/Origami King LE, Color Splash BE): triangle meshes with material/collision flags + sphere/box trigger volumes, GLB round-trip with generated .ctb
CS_DCT Wii / Archive + Graphics ✅ ❌ Chicken Shoot (Wii) stage archive (.dct): background planes (LZ-compressed indexed pixels + RGB555 palette) → PNG, animated sprites with per-frame bounding geometry → PNG, object placement metadata → manifest.json and raw binaries
CTB Switch/Wii U / Collision ✅ ❌ Paper Mario collision search table (XZ-quadtree over .csb triangles; regenerated on encode, inspected with wmdlt CAT)
CTPK 3DS / Texture ✅ ✅ CTR texture container
DARC 3DS / Archive ✅ ✅ Differential archive container
DSB (TXTR) DS / Texture ✅ ✅ Animal Crossing: Wild World menu texture (RGB555 palette + A3I5 texels); retail regression covers decode → encode → decode pixels
DSP GameCube / Wii / Audio ✅ ❌ Nintendo GameCube/Wii DSP-ADPCM standalone audio stream (.dsp): mono/stereo ADPCM coefficients, nibble predictor/scale decoding → 16-bit PCM WAV
Retro TXTR Wii / Texture ✅ ✅ Retro Studios texture (Metroid Prime 1-3, DKCR): GX-tiled, indexed + direct
Tropical TXTR Wii U / Texture ✅ ❌ Retro Studios texture (Tropical Freeze): RFRM form, GX2 detile
DAT (Star Fox Zero) Wii U / Archive ✅ 🟡 Big-endian flat archive
Deflate Compression ✅ ✅ Standard Deflate / Zlib streams
DTLS (dt00/ls00) Wii U / 3DS / Archive ✅ ✅ Super Smash Bros. 4 composite resource package & lookup (Wii U of02 16-byte + 3DS of01 12-byte retail variants included)
FSYS GameCube / Archive ✅ ✅ Genius Sonority Pokémon archive
ZIP / TSZIP Multi-platform / Archive ✅ ❌ Stored and DEFLATE members, CRC/length validation before extraction, bounded streaming output; no encryption, ZIP64, or split archives
FZIP Wii U / Compression ✅ ✅ Game & Wario Zlib container
GFA 3DS / Archive ✅ ✅ GFAC archive
GF1MOT 3DS / Animation ✅ ❌ Game Freak XY/ORAS bone-motion pack (SPICA GF1MotionPack): skeleton + per-anim frame/octet listing as text
GFLX Switch / Archive ✅ ❌ Game Freak GFLXPack archive (SPICA GFLXPack): raw-LZ4 members, magic-sniffed extensions
GFMOT 3DS / Animation ✅ ❌ Game Freak skeletal/material/visibility motion (SPICA GFMotion): frames, tracks and constants as text
GFMPACK 3DS / Archive ✅ ❌ Game Freak model/texture/shader pack (SPICA GFModelPack): named members with sniffed extensions
GFMODEL 3DS / Model ✅ ❌ Game Freak GFL2 3D model (SPICA GFModel, Pokémon X/Y/ORAS): skeleton, materials with texture names, PICA200 command-buffer geometry with smooth skinning → GLB
GFPKG 3DS / Archive ✅ ❌ Game Freak Gen6/Gen7 package (SPICA GFPackage): offset-table members with sniffed extensions
GFTEX 3DS / Texture ✅ ❌ Game Freak GFL2 texture (SPICA GFTexture): PICA200 payloads incl. ETC1 → PNG
MBN 3DS / Model ✅ ❌ ModelBinary companion buffers (SPICA MBn): replacement vertex/index buffers applied onto the sibling .bch base scene → GLB; descriptor listing as text standalone
MTMFX 3DS / Shader ✅ ❌ Capcom MT Framework Mobile shader effects (SPICA MTShaderEffects): input-layout table (vertex attribute names/formats/offsets) as text; layouts drive wmdlt MOD decoding
MTMOD 3DS / Model ✅ ❌ Capcom MT Framework Mobile model (SPICA MTModel): skeleton always; vertices via sibling .mfx/.lfx input layouts (else validated float fallback); materials/textures via sibling .mrl → GLB
MTMRL 3DS / Material ✅ ❌ Capcom MT Framework Mobile materials (SPICA MTMaterials): CRC32-keyed texture bindings as text
MTTEX 3DS / Texture ✅ ❌ Capcom MT Framework Mobile texture (SPICA MTTexture): PICA200 payloads incl. ETC1 → PNG
GTX Wii U / Texture ✅ ✅ Wii U GX2 texture container
GSH Wii U / Shader ✅ ✅ Wii U Latte GPU shader container
HSD (.dat) GameCube / Model ✅ ✅ HAL Laboratory sysdolphin object graph; also archive bundles (many archives in one file, scene_data roots, e.g. Doraemon map*_dat.mdl) merged into one GLB
OCN. (.dat) Wii / Model ✅ ❌ Paon "OCN." skinned model (Donkey Kong: Barrel Blast chara/*.dat, LZ10 wrapped): TEXS textures, bones, GX display lists over a per-vertex multi-bone WEIG pool (s16 or f32 layouts), rigid shapes from float ELEM banks; exported as one skinned GLB with PNG textures. *_mp*.dat are FJG tables of HSD motion archives
HSF GameCube / Wii / Model ✅ ✅ Hudson Mario Party 3D model
IPK Wii / Wii U / Switch / Archive ✅ ❌ Ubisoft UbiArt archive (Just Dance, Rayman Origins/Legends): stored + zlib/LZMA members, old/new path-name orders
SEDB (.rps / txb / shd / lyb / PHB) Wii / Archive + Texture ✅ ❌ Square Enix resource container (Dragon Quest X layout/bin/wii/*.rps): RES index with per-member names split into .txb / .shd / .phb / .mtb / nested .rps; txb textures (GX CMPR, linear LA8 / RGBA8, 256-colour palette) decoded to PNG; .shd materials (named float parameters), .lyb layout databases (string pool) and .phb collision blobs (bounds, block count) summarised to <name>.txt. Recognised by wszst FILETYPE as SEDB. Full .lyb object graphs and .phb collision geometry are not decoded
WADH Wii / Archive ✅ ❌ Data Design Interactive DataWII.wad (Ninjabread Man): stored members, directory tree via last-child / previous-sibling links
DC2 DCX / DCT Wii / Archive + Texture ✅ ❌ Jakers! Kart Racing: .dcx directory archives (backslash paths, contiguous members); .dct GX CMPR / RGBA8 textures (top mip) → PNG
DIG Wii / Archive ✅ ❌ Bomberman Land cddata*.dig streaming resource package: magic-less, extension-resolved; flat table fills the first 0x800 bytes (12-byte header, entries start at byte 16), 16-byte big-endian records (offset_sectors, size_sectors, unknown, reserved), sector = 2048 bytes (<< 11); resolved offset/size verified against real samples by confirming embedded Nintendo TPL texture headers (00 20 AF 30) land inside every resolved range across all 10 supported real files. No on-disk filenames (numbered-blob output); 5 of 15 real files use an unsupported nested "type == 2" table and are rejected by ScanDIG() rather than mis-extracted.
NIF (Gamebryo 20.6, Wii) Wii / Model + Texture ✅ ❌ Pocoyo Racing: big-endian .nif scene graph; NiMesh GX display-list / INDEX streams → GLB in world space (skinned meshes in bind pose, hidden collision meshes only when nothing else exists); embedded DXT1/RGBA NiPersistentSrcTextureRendererData → PNG
Grip RES Wii / Archive + Texture ✅ ❌ Sesame Street: Elmo's Musical Monsterpiece: res\n serialised resource packages split into per-section files (strings.txt, index.txt, .fsb sound banks, compiled Lua, raw object sections); surf textures (CMPR / RGB5A3 / I8, bottom-up rows) → PNG. Model object graphs (body/bmsh/gshd) are pointer-linked and stay as raw sections
Goliath GS Package Wii / Archive ✅ ❌ Older dialect / wrapper: The Amazing Spider-Man (Wii) .pkz files start with BA BE B1 B0 (BE: block size, data offset, unknown, block count, file size, uncompressed total, then count cumulative uncompressed end offsets and a per-slice index table); each 0x8000-aligned block from data_offset is an independent raw zlib stream with no final-block bit, inflated to end[i]-end[i-1] bytes. The result is a GS package of the older dialect: 12-byte chunk header (id/version/has_children/size, no size_hi, ids without the high bit, root 0x00000001), name field at 0x18 (not 0x1c), 44-byte texture header, and pixels pooled in 0x26 wrappers whose own 0x138e name record carries the same leading hash as the owning resource, so pairing is by hash (the pool is not in document order). Formats 2/3/4 are the same RGB5A3/CMPR/CMPR+I8 chains. Verified: 234/234 retail packages extract, 12,294 PNGs. Newer dialect: Skylanders: SuperChargers Racing files/Data/*.pkz: a self-checking big-endian chunk tree (uniform 16-byte id/version/has_children/size_hi/size header, 0x80000001 root, every level consumes its parent's payload exactly). Named resources are 0x8000138d wrappers whose first child (0x8000138e) carries a hash + NUL-terminated name; bulk texture (0x80000195) and audio (0x80001134) payloads are pooled elsewhere in the tree and matched to their 0x80000197/0x80001133 descriptions positionally, in document order (exact across all 782 retail files). Textures are GameCube-native mip chains (CMPR, RGB5A3, or CMPR+I8-alpha) re-wrapped as one-image TPLs → PNG; format 5 and mismatched-size RGB5A3 headers are declined rather than guessed. Audio is RIFX WAVE with wFormatTag 2 carrying a Nintendo DSP-ADPCM extension (not MS-ADPCM despite the tag): per-channel coefficient/gain/history state is re-packed as standalone .dsp streams and decoded through the existing DSP-ADPCM path (stereo → two mono .dsp, de-interleaved). Extract-only; geometry/materials/scripts/engine runtime tables are not interpreted. Verified against all 782 retail packages: 782/782 walk cleanly (586496 chunks, 216 distinct (id,version,children) combinations), 760/782 yield extractable content, 7031/7055 textures decode (99.66%, 19 format-5 + 5 size-mismatched RGB5A3 declined), 4994/4994 audio streams decode, 73900 names recovered
CDGaCube CAR Wii / Archive ✅ ❌ Cat Daddy Games birthday.CAR (Birthday Party Bash): 24-byte records, 2048-byte sector offsets, trailing path table; members stored raw or as bare zlib streams (inflated on extract)
Terminal Reality POD Wii / Archive ✅ ❌ POD3 / POD4 / POD5 (Nickelodeon Dance WII*.POD): stored members with backslash paths (converted to /); compressed POD4 members are skipped. Layout after jopadan/termpod
Z-Axis ZSND (GCUB) Wii / Audio bank ✅ ❌ ZSNDGCUB sound banks (.zss/.zsm; Marvel: Ultimate Alliance 2, 306 files; layout after vgmstream): each stream's per-channel DSP headers and 0x8000-byte interleaved data are split into NNNN[_chN].dsp (mono, stereo, four-channel), which xx decodes to WAV. 228 sounds from five banks are sample-exact against vgmstream; only the GCUB platform variant is handled
Tecmo MAD/LAD/EFE/CLF pack Wii / Archive ✅ ❌ Resource packs of Rygar: The Battle of Argus (.mad maps, .lad actors, .efe effects, .clf; 419 files): an 8-byte pack tag, a member count and a table of absolute offsets (unsorted, 0 = empty); members (tgs, XMDF, texa, ORB, COLI, ...) are written as NNNN_tag.bin and cover every file exactly; the members themselves are not parsed. Unrelated to EA's PS2 .mad video
STME .stm Wii / Archive ✅ ❌ Streaming environment packages of Need for Speed: Hot Pursuit (24 files, 580-1,350 records each): STME + WI01, a record count and 0x40-byte records {kind, name, data offset, size, header size}; every record is written as NNNN_name (.mp1 / .tex pairs point at the same bytes), and the extracted .tex textures are decoded to PNG by the existing texture decoders. Models and the other kinds are not interpreted
Exient .bnk Wii / Audio bank ✅ ❌ Sound banks of Need for Speed: Hot Pursuit (u32 count + {offset, size, 0} table of complete WIIADPCM streams): split into NNNN.adpcm, which the WIIADPCM extractor turns into per-channel DSP / WAV. All 7 members of the sampled bank decode sample-exact against vgmstream
Exient .twi Wii / Texture ❌ ✅ TWI\0 textures of Need for Speed: Hot Pursuit (24 files; width/height/mip count/format header, 0x20-byte header): the GX data is decoded to <file>.png with xx for IA8, RGBA8, CMPR and the C4 / C8 paletted variants (RGB5A3 palette stored before the data). Only the base mip level is written; the format ids are inferred from the level sizes and checked visually, there is no reference decoder
Ubisoft SB (.sb7) Wii / Audio bank ✅ ❌ Sound banks of Red Steel (version 0x00180006-8, 1,146 files; layout after vgmstream ubi_sb): the internal hardware DSP-ADPCM sounds (mono and stereo, with loops) of the resource headers are written as NNNN_<id>[_chN].dsp (mini DSP header from the extra section, subblock-adjusted offsets), which xx decodes to WAV. 438 sounds from 191 banks are sample-exact against vgmstream. Streamed Ubisoft IMA sounds (external .ss7 next to the bank, version-5 stream header) are decoded natively to NNNN_<id>.wav; 56 sampled mono/stereo streams are sample-exact against vgmstream. Software PCM sounds, sequences, layers and the .ls7 / localised streams (not checked) are not extracted
Sumo .abc Wii / Audio library ✅ ❌ DSP libraries of Sonic & SEGA All-Stars Racing (116 files, 2,344 streams): complete DSP-ADPCM files back to back, each followed by 1..0x100 padding bytes up to a 0x100 boundary; split into NNNN.dsp, which xx decodes to WAV. Every file chains exactly to its length
Eurocom MUSX (SBNK) Wii / Audio bank ✅ ❌ File_<region>.000 of Dead Space: Extraction (MUSX v10, platform WII_, SBNK form; layout after vgmstream musx): the codec 0x13 sounds (mono and stereo, 250 MB, 71 sounds) have per-channel NGCA DSP headers and are split into NNNN_<id>[_chN].dsp, which xx decodes to WAV; all 71 are sample-exact against vgmstream. The Mummy: Tomb of the Dragon Emperor audiousa.000 uses SBNK version 0x0b (count / table / data base at 0x824 / 0x828 / 0x840, codec byte 0x11 but NGCA data): its 184 mono DSP sounds are extracted the same way (layout worked out by hand, no reference decoder; ps byte and sample counts agree with the NGCA headers). Other codecs (DAT4 IMA, PCM) and the ESPD project file (File_COM.000) are not extracted
Konami .vas (Wii) Wii / Audio bank ✅ ❌ Jikkyou Powerful Pro Yakyuu strbgm.vas (0x800-page container: header page + per-stream header page with one DSP channel header per channel, data interleaved in 0x100-byte blocks): every channel becomes NNN_chN.dsp and decodes to WAV (all 228 streams of the Ketteiban bank and the 91 / 112 streams of Next's strbgm.vas / strbgm_g.vas, where the stored size can be short and the next header page is checked; interleave checked by L/R correlation, no reference decoder for the Wii variant)
Ubisoft Jade BigFile Wii / Archive ✅ ❌ Jade/LyN engine .bf (BIG\0, plus XOR-obfuscated BUG\0; Rayman Raving Rabbids 1/2/TV Party, Prince of Persia (Wii), Petz, TMNT, My Word Coach, Movie Games): fat blocks of {offset, key} refs, file infos and directory infos give the full path tree; members are streamed out as stored (multi-GB safe); stripped names fall back to the key. Layout after Ray1Map, verified on retail 2r3_bin_wii.bf, pop3wii.bf, MP08.bf
THQ Australia pack Wii / Archive ✅ ❌ pack data archives of the Nickelodeon Avatar: The Last Airbender games (*_DATA.PAK): big-endian header, 16-byte {name_offset, offset, size, 0} entries, NUL-terminated data/... names, 0x800-aligned stored payloads (inner .pak / .rad files unpack recursively); streamed from disk. Verified on all nine retail *_DATA.PAK of The Last Airbender
2XL LPAK Wii / Archive ✅ ❌ 2XL Games RIFF LPAK resource packs (SCORE International Baja 1000: ANIMS.PAK, BAJAINF.PAK, PARTICLES.PAK, PERMTEX.PAK): one LIST/LDAT per member with dir , file and str chunks; members are inflated (one zlib stream per 0x4000-byte block, block starts listed in the file header) and the str path components become the directory tree. All 959 members of the four retail files verified (PNG signatures, unpacked sizes)
Ubisoft ABE BigFile Wii / Archive ✅ ❌ Magma-engine .BF (ABE\0, version 4; Rabbids Go Home RGH.BF / RGH.wii.sns.BF / RGH.$hd$.bik.BF, Red Steel 2): chain of 200-byte-record table chunks with a 0x20-byte payload header per member; stored members and LZO1X block members (u32 packed-size table, 256 KiB blocks) are streamed out, <$shadow$> references into sibling BFs are skipped. All 8,568 decodable members of the three retail files verified (BIK/WPF content, no size mismatches)
Wii resource ARC (wii\0) Wii / Archive ✅ ❌ Big-endian wii\0 resource archives (Petanque Master, Petanque Pro, and six more titles; *.ARC): 32-byte {type, size, offset, id} records plus an absolute name-offset table; offsets are relative to the data base in level/menu archives and absolute in the *SOUNDS.ARC banks. Members come out as <name>.t<type>; streamed from disk. All 105 retail files of Petanque Master checked
PACK v2 Wii / Archive ✅ ❌ Little-endian PACK version 2 .pak (Ski and Shoot / RTL Biathlon 2009 packfile.pak, 2,848 members): 0x18-byte {size, size2, offset, name_offset, crc, flags} records with absolute dir/file.ext names. Stored members (flag 0x30) are extracted; flag-0x77 members use a custom byte-aligned LZ/bit coder that is not decoded yet and are written raw as <name>.packed; streamed from disk
Sega ARCB / AVLZ Wii / Archive + Compression ✅ ❌ Amusement Vision ARCB archives (Super Monkey Ball: Banana Blitz, 417 of its 426 .arc): 0x20-byte wrapper, a standard U8 tree whose node offsets/sizes (bit 31 = packed flag) address one AVLZ block; AVLZ is Okumura LZSS (4 KiB zero-filled ring from 0xfee, LSB-first flags, 2-byte matches with length 3-18). All 417 retail archives (8,335 members) unpack; bare AVLZ files are decompressed to <name>.bin
IGA Wii / Archive ✅ ❌ Alchemy/Vicarious Visions archive (.arc, Skylanders Spyro's Adventure/Giants/Trap Team; version-2 .bld/.pak from Madagascar: Escape 2 Africa); members flagged 0x1000000N are chunked LZMA (u16 BE size + 5 props bytes per 0x8000 unpacked, 0x800-aligned, incompressible chunks stored raw): IGA\x1a, hash table, {offset,size,flags} records and a build-path name pool; stored members are extracted with their original paths (.igz/.fsb/.enc payloads stay raw). Swap Force's \x1aAGI .pak is a different format
STRT Wii / Text ✅ ❌ One Piece Unlimited Adventure/Cruise string table (event/msg/*.bin, *.str): STRT, language tag and absolute string offsets; dumped to <name>.txt by wszst xx (strings kept in the game's own encoding). Placeholder 12-byte tables are ignored when empty
MRQZ Wii / Archive ✅ ❌ My Fitness Coach .pak (all 565 retail paks): MRQZ header, 76-byte {name[64], offset, size, 0} records and a raw data block aligned to the header size; members keep their data/... paths
GCT0 Wii / Texture ✅ ❌ Grasshopper Manufacture texture (No More Heroes 1/2 .BIN): GCT0, GX format, width/height and plain pixel data at 0x40 (I4/I8/IA4/IA8/RGB565/RGB5A3/RGBA8/CMPR); decoded to <name>.png by wszst xx, mip levels ignored
FUAX Wii / Text ✅ ❌ Rebel Raiders: Operation Nighthawk string table (text/<lang>/*.bin, 262 files): FUAX, language tag, count, byte offsets and NUL-terminated UTF-16BE strings; dumped to UTF-8 <name>.txt by wszst xx
STGS Wii / Text ✅ ❌ MySims Agents string table (Text/*.str, 396 non-empty files): STGS, version 5, hashed keys with offsets into a UTF-8 pool; dumped to <name>.txt as [hash] blocks by wszst xx
WB-L10n Wii / Text ✅ ❌ So Blonde: Back to the Island string table (Text/*.dat, 425 files): WB-L10n\0, count and little-endian absolute offsets to UTF-8 strings; dumped to <name>.txt by wszst xx
FCAT Wii / Archive ✅ ❌ Winning Post 7 / World track container (.dat, 63 files): FCAT, count and big-endian {offset,size} pairs; members (mostly BRRES) are extracted as NNN.brres/NNN.bin and peeled further
EA SCHl Wii / Audio ✅ ❌ Electronic Arts SCHl stream (.ngc/.str, 144 files over 8 games, e.g. Tiger Woods PGA Tour 12): the EA ADPCM audio is decoded to <name>.wav through the ffmpeg/mobipeg pass-through by wszst xx; the interleaved VP6 (m6PV) video is not extracted
EA SCHl EA-XA Wii / Audio ✅ ❌ Native decoder for EA SCHl streams carrying EA-XA ADPCM (codec 0x0a on the GC/Wii and generic platforms, v1 with history or revised v2 / v3 frames with PCM frames; The Godfather: Blackhand Edition .exa, 10,577 files) to <file>.wav with xx; ffmpeg mistakes these streams for EA R2. 310 sampled streams (one stereo) are sample-exact against vgmstream; other SCHl codecs still go through the ffmpeg route
WII! textures Wii / Texture ✅ ❌ Star Trek: Conquest .WII texture-only bundles (143 of 145 files: Splash, FrontEnd, levels, ...): WII!, version 2, count and a table of 0x18-byte {name, w, h, kind, size, offset} records; RGBA8, RGB565 and (best guess) RGB5A3 textures decoded to <name>.d/NN_<name>.png by wszst xx. The 82 mixed level bundles (nameless {w,h,type,wide,size,offset} records) are decoded at base level for types 4-7: RGBA8, RGB565 (type 6) and, as a best guess, RGB5A3; other types are skipped
PTEX Wii / Texture ✅ ❌ Virtua Tennis 2009 (and Sonic & Sega All-Stars Racing) .dat texture bundle (461 files): PTEX, 0x20-byte records with padded size and offset; CMPR colour plane plus a separate I4 alpha plane (kind 2) or plain CMPR (kind 0), decoded to <name>.d/NN_<hash>.png by wszst xx. Kind 3 records are not decoded
GFMC Wii / Text ✅ ❌ Teolsil Kirby Iyagi (Kirby's Return to Dream Land) message/<lang>/*.bin (140 files): GFMC, label-hash table, offset table and a UTF-16BE string pool with control tags; dumped to UTF-8 <name>.txt as [hash] blocks by wszst xx (control tags dropped, entries without text left empty)
PlatinumGames DAT Wii / Archive ✅ ✅ DAT\0 archives (Star Fox Zero, MadWorld): big-endian offset/ext/name/size/hash tables with fixed-width names, extracted (and rebuilt) through the SFZ DAT scanner in lib-sfzdat.c; the 782 MadWorld .dat files share the same header layout
Ninja NJCM Wii / Model ✅ ❌ Milestone Chaos Field/Karous *Models.dat banks (byte-reversed LTJN/MCJN chunks): NJS_OBJECT tree with vertex lists (0x8023/0x802a) and triangle strips, exported to <name>.glb by wszst xx with NJTL texture names; NMDM motions are not decoded
TPLC / GFX Wii / Texture ✅ ❌ 10 Minute Solution LZSS container (0xff-led flag bytes, 4096-byte zero-filled ring, 4-byte big-endian decoded size): .tplc decodes to a TPL and then <name>.png with wszst xx; other payloads (.gfx Scaleform movies) are saved as <name>.dec. .xpf (magic 0xBADBEEF1, no size) decodes the same way to <name>.dec
HOG Wii / Archive ✅ ❌ .hog archives (Ultimate Band: u16 1, u16 2, u32 0x20, count, then {name_off, data_off, size, hash} entries, backslash paths, uncompressed). EA Tiger Woods PGA Tour .hog and .gcb (CTRL/SHOC chunk streams with zlib Zdat parts) extracts every resource as <type>_<id>.bin; the payload types (Cact, Cnet, txfh, ...) are not decoded
Namco NUB Wii / Audio bank ✅ ❌ Family Ski/Family Jockey .nub sound banks (big-endian, version 0x00020100, table of IDSP stream header blocks plus one shared data region): every mono stream is written as a standard .dsp (decoded to WAV by xx); stereo streams are skipped
SPD / SPT audio bank Wii / Audio bank ✅ ❌ Worms: Battle Islands .spd (raw DSP-ADPCM frames) with its .spt index (big-endian: u32 count, count × 28-byte {0, rate, 0, 0, end_nibble, start_nibble, 0} records, count × 46-byte coefficient/history blocks): each stream is written as a standard .dsp (decoded to WAV by xx). Streams whose last frame is cut short behind the end nibble (Burger Bot) are zero-padded. The Geometry Wars: Galaxies GameAudioDataWii.spd/.spt bank (72 streams, 32 kHz) uses the same record layout and extracts as well
Pipeworks bundle Wii / Archive ✅ ❌ Merv Griffin's Crosswords .bdg ("Pipeworks bundle v1.03 (big endian)"): type-name table plus 12-byte {offset, type<<24 | size, name hash} entries; members are written as <hash>_<type>.txt/.bin (names are not stored; zlib members such as the Ifc XML interfaces are inflated). Entries whose data lives in another bundle are skipped; Texture/Font/PropertyBook payloads are not decoded
DC2 model (.dcm) Wii / Model ✅ ❌ Speed 2 .dcm (same DC2 engine as the Jakers .dcx/.dct): big-endian float vertex blocks {u32 0, u8 stride, u32 count} for positions (12), normals (12) and UVs (8), then triangle-strip records {0x9b, u16 n, n x {pos, normal, uv}} (winding verified against the stored normals); every part (one {position, normal, UV} array triple each, followed by one run of primitive records per part in the same order; 0x93 triangle lists, 0x83 quads and 0xa3 fans are handled next to the 0x9b strips) becomes its own mesh in <name>.glb. 69 of the 70 Speed 2 models export; the last is a 51-byte empty stub. Materials and textures (named after the geometry) are not applied. .dcw worlds use the same blocks per tile but only {position, UV} pairs with a third per-vertex index of unknown meaning and nested, length-prefixed primitive sections that do not chain cleanly, so they are not exported; .dcf font caches are decoded separately
FAST (.fst) Wii / Archive ✅ ❌ Crazy Machines .fst (FAST, LE version 0x30000): an index, then one zlib stream per object whose payload starts with a big-endian u64 object id. Sound objects ({channels, rate, bits, format, size} at +0x10, data at +0x28) are written as <id>.wav (PCM16LE) or <id>.ogg; other objects (UI/theme data) as <id>.bin, undecoded. Names live in an index at the end and are not applied
HVP Wii / Archive ✅ ❌ .hvp file packs (Aladdin Magic Racer, X Factor, Knockout Party, Obscure: The Aftermath): big-endian 0x50000 header, name pool, 28-byte directory-tree records; members stored or LZO1X-compressed; nested packs recurse
Mobiclip (.mo, .moflex, .mods) DS / 3DS / Wii / Video ✅ ✅ Decoded to an MP4 preview (<name>.d/<name>.mp4) by the external mobipeg tool (an ffmpeg build with the Mobiclip codec and muxers); CREATE re-encodes an edited preview back into the same container generation and copies the original audio. Needs mobipeg on PATH; THP is handled the same way
Opoona SL01 / OPKG Wii / Archive ✅ ❌ ArtePiazza Opoona .btl / .bin / .dat / .map members: SL01 + u32le unpacked size + u32le packed size + a plain LZO1X stream. The data is usually an OPKG package (no magic: u32le count, u16le 0x20, u16le 0x20, count × 0x20-byte records {u32le offset, u32le size, char name[24]}; empty "NULL" slots are skipped). .mdl / .tex / .mol and the system/{coating,effect,force}.bin tables are raw (unwrapped) packages: a character model package is {.mdl, .tex (TPL bundle), .tmp}, a .mol holds the .mot clips
Opoona textures (.tpl) Wii / Texture ✅ ❌ Standard Wii TPLs whose magic word was blanked (0-3), optionally in a 0x40-byte TPLE bundle (count 3, stride at 0x14, name at 0x1c); decoded to PNG through the normal TPL path
Opoona model (.mdl) Wii / Model ✅ ❌ DHDM / TMDM / BODM / SMDM / TSDM chunks (reversed FourCCs, big-endian size). Nodes (BODM, 0xc0 bytes: translation, s32 euler where 65536 = 360°, scale, first-child / next-sibling links, name offset into TSDM), materials (TMDM, 0x110 bytes: diffuse at 0xc0, texture index u16 at 0x104), meshes (SMDM → parts with a bone palette and vertex groups: type 0x9b strip / 0x93 list for skinned vertices {pos, normal, u16 uv/4096, weights}, 0x9a / 0x92 for the static 36-byte map vertices). Exported to a textured, skinned GLB (<name>.glb) with every sibling <stem>.mot / *.mol clip as an animation. Layouts come from the game loader (main.dol) and were checked against 4,600+ retail models
Opoona animation (.mot) Wii / Animation ✅ ❌ Header 0x30 (frames, fps, node count, footer = size − 32) then one 0x50-byte record per node {u16 n_trans, n_rot, n_scale; mask; rot_ptr; bind t / trans_ptr; bind q; bind s / scale_ptr}; keys are 8 bytes: rotation s16 × 4 / 4096 (quaternion), translation and scale s16 × 3 × d / 32768 with d the fourth u16. The trailing table is a sorted node-name hash → index list. Clips become glTF animations (30 fps)
Opoona map (.map) Wii / Model ✅ ❌ RDHF-headed chunk stream: LDMF lists SL01-packed model packages, XETF the shared SL01 TPL textures, MANF the names. Textures are written as tex_NN.tpl[.png], models as <name>.glb; the placement / collision chunks are not interpreted
Opoona message bank (msg_*.bin) Wii / Text ✅ ❌ (id, offset) table behind a count word; each string is two tag bytes (speaker / style) plus NUL-terminated UTF-8. Written as strings.txt (id<TAB>tag<TAB>text, control bytes as \xNN)
Opoona collision mesh (.atb) Wii / Model ✅ ❌ Big-endian: header {size, 0x800000, 0x20200000, ntri, tri/vert/normal/grid/list offsets}, inverse cell sizes + minimum corner, float vertices and normals, {v0, v1, v2, normal} u16 triangles, a 32 x 32 u16 grid of offsets into 0xFFFF-terminated triangle lists. Written as <name>.atb.obj; the wall trailer after the lists (u32 {size, count, 12} + 24-byte {f32 x1, z1, x2, z2, s16 y_top, s16 y_bottom, u16 angle, u16 flags} records) is written as <name>.atb.walls.obj: one vertical quad per wall between (x1, z1) and (x2, z2) spanning the two heights, with the facing angle (65536 = 360 degrees) and flags as comments (the actor collision code only tests a wall when the mover is between the heights and heading within 0x5000 of the angle, ignores walls with flags & 0xE000 == 0x8000 and takes the wall type as flags & 0xDFFF); the 32 x 32 grid is a spatial index: cell i is column i % 32, row i / 32 from the minimum corner with sides 1 / inverse cell size, and holds the offset (in u16 units) of its 0xFFFF-terminated triangle list. On 786,382 cell/triangle pairs over 321 files the listed triangle's bounding box overlaps its cell in 99.66% of cases (empty cells hold offsets past the list area). It is not written out. Verified on all 375 map/**/*.atb (indices in range; [system]/all.atb is a different layout and skipped)
Opoona parameter tables (*_param.bin, encounter.bin) Wii / Data ✅ ❌ Members of system/param.bin: char name[6], u16be count, u32 0, then count fixed-size records (size = (file size - 12) / count; 33 of the 37 tables fit, map_link, pc, word and work do not and stay raw). wszst xx writes records.tsv with, per record, the NUL-terminated ASCII / Shift-JIS strings (@offset=text, non-ASCII bytes as \xNN) and the non-zero u16be words (@offset=value); the per-table field meaning is not decoded except for item_param.bin, which also gets items.tsv (id, after-use item, category, name, buy/sell price, flag bytes, tag, two values, description). job, style, personality, shopp, bonbon_rank, condition, license, situation, code, cmn_hkey, catalog, force and enemy tables also get table.tsv (id plus their text slots, multi-line descriptions joined; shopp and bonbon_rank add a u32 value; enemy lists its name, two item names and six attack names, the numeric stats stay in records.tsv)
Spyro: Dawn of the Dragon .KCS Wii / Data ✅ ❌ STREAMS/REVn.KCS animation buffers: big-endian chunks {u32 size, u32 size, u32 type, u32 count} separated by 0xcd / zero padding. Type 0 is a skeleton pose (f32 duration at +0x18, then count records of {u32 bone id, u32 0, f32 quaternion xyzw, f32 position xyz} from +0x24); type 3 (40 byte records) is listed as raw words. wszst xx writes kcs.tsv; the engine use of the pose chunks (cutscene reversal / blending) is not confirmed
Sengoku Basara 3 .lsp / .sdl Wii / Data ✅ ❌ UI layouts (\0PSL, u32be version 33) and animation scripts (\0LDS). The node/keyframe records are not decoded; wszst xx writes strings.txt (offset<TAB>text) with the node and animation names, SDL property names (mFrame, mSeId, ...) and the texture paths an .lsp refers to
RKV (RK33) Wii / Archive ✅ ❌ Krome .rkv archives (Happy Feet Two, Legend of Spyro, Owls of Ga'Hoole): RK33 header with a trailing 0x60-byte-entry table; members raw or LZF (method byte 2); embedded FSB sound banks recurse
MPH SNDFILE archive DS / Archive ✅ ❌ Metroid Prime Hunters .arc (SNDFILE\0, big-endian header): u32 count, u32 total size, 16 reserved bytes, then 64-byte records {char name[32], u32 offset, u32 padded size, u32 size}, payloads 32-byte aligned. Members extract by name and recurse. Layout from NoneGiven's MphRead
MPH Model DS / Model ✅ ❌ Metroid Prime Hunters *_Model.bin (no magic, recognised by validated header, node, material, mesh and display-list bounds, ahead of the magic-less SPICA containers): packed Nitro GX display lists with the header's ScaleBase << ScaleFactor model scale, per-mesh material, and 2/4/8-bit paletted, A5I3, A3I5 and direct-colour textures (from the model or the sibling *_Tex.bin) written as <stem>_t<N>_p<M>.png beside the .glb. Node transforms and skinning are not applied (as in MphRead's COLLADA export). Layout from NoneGiven's MphRead
Scribblenauts index.bin / .p Wii U / Archive ✅ ❌ Scribblenauts Unlimited (big-endian): index.bin = u32 count, count x {u8 pack, u8 zlib level, u32 offset, u32 stored size, u32 size} (pack 0xff = no data), then u32 npacks + length-prefixed .p names. Each .p starts with its file size and 0x40 bytes of header; members are zlib streams (+1 trailer byte counted in the stored size) or raw. The table has no names, so members are written as NNNNN.bin (Gfx2 members as .gtx) and recurse; all 28,923 populated entries of the retail disc extract (2,470 entries have no data). Layout from GMMan's ScribbleUnpacker
Scribblenauts vector mesh Wii U / Model ✅ ❌ Scribblenauts Unlimited object / effect artwork (the NNNNN.bin members of index.bin; no magic, little-endian, recognised only when the layout consumes the file exactly; 8,501 of the retail disc's members): flags (0x40 fixed-point points, 0x80 bounds block), scales, points {x, y, colour} scaled by the stored x / y scale, a triangle index list split into mesh groups, two outline tables and a colour table (4 bytes each, alternate colours use a different channel order) with per-colour z order. Written as <name>.bin.svg, one path per colour in z order. Layout from GMMan's scrib-vecviz
PDA BRA Wii / Archive ✅ ❌ Messiah-engine .bra archives (Gummy Bears: Magical Medallion / MiniGolf): PDA\0 v2, raw-deflate members with a trailing name table; .3df level files have their embedded deflate members recovered as .bin; .spr (2df) sprite sheets decode their GX RGBA8 / RGB5A3 textures to <name>.<NN>.png with xx (version-10 sheets from Pool Hall Pro / Build'n Race, one CMPR or palettised C8 texture each, decode too; CMPR sheets show some 4x4 blocking on hard vertical edges, cause unknown); .prt and the 3DF chunk graphs are left undecoded
Shade BIN / BLN Wii / Archive ✅ ❌ Inazuma Eleven Strikers (Level-5/Shade): grp/scn/scn_sh/ui/dat/strap.bin (count, pad, mult, shift, mask + packed offset/size words) and mcb0.bln + mcb1.bln; members are ShadeLz-decompressed (headered or, for dat.bin, headerless), so BRRES/GF1 payloads recurse
EA SCHl NGC Wii / Audio ✅ ❌ Electronic Arts GameCube/Wii .ngc streams (Tiger Woods PGA Tour movies and music): SCHl/SCDl blocks with EA ADPCM R3, decoded to audio.wav (verified sample-exact against ffmpeg on six files); video blocks are skipped; .fcd speech data files (NBA Live 08) and .ast streams (Madden NFL 10) hold many concatenated SCHl…SCEl streams and are split into 00000.wav, 00001.wav, …
EA PathFinder .mus Wii / Audio bank ✅ ❌ The Godfather: Blackhand Edition audiostreams/*.mus (and other EA music banks): zero-filled header then SCHl…SCEl streams back to back (the sibling .mpf is only the interactive playback graph); every stream is written as NNNN.exa / NNNN.ngc and decodes through the EA decoders (1,738 streams of mx_gf_01.mus, 1,736 decoded, 32 kHz stereo; plausibility-checked, no reference decode). EA Sports Active .mus uses EA Layer3 (0xa0 = 0x17), which is not decodable here
RenderWare ADPCM stream (.rws) Wii / Audio ✅ ❌ The Legend of Spyro: Dawn of the Dragon SPEECH/*.RWS and MUSIC/*/STRA*.RWS (209 files): little-endian 0x80d container with a 0x80e header and a 0x80f data chunk (marker 0x1c020065, the chunk layout of the How to Train Your Dragon .RWS). Big-endian header fields: segment records {.., size, offset} (0x20 bytes at payload + 0x60; contiguous and summing to the data size in all 209 files) and, in front of the text GCN ADPCM Header, interleave, sample rate, channel count, DSP sample / nibble counts and the 16 coefficients (shared by all segments). Mono speech files become NNN.dsp per segment (only the first has an exact length, the others use their frame count), stereo music ch0.dsp / ch1.dsp in 0x4000-byte blocks (the stored interleave 0x8000 is the cycle; left / right correlation 0.58, against about 0 for the other block sizes tried); decoded to WAV by the DSP extractor. Not verified against a reference decoder
SPHC TXF Wii / Text ✅ ❌ Storm City Games locale string tables Locales/*.TXF (Gummy Bears MiniGolf, Pool Hall Pro, Vertigo, ...): u32 count, offsets, UTF-8 strings; exported to strings.txt
NDP Wii / Audio ✅ ❌ Storm City Games .nds music (Pool Hall Pro, Build'n Race): NDP\0 + per-channel DSP headers, 4-byte interleaved ADPCM; written as ch0.dsp/ch1.dsp (decoded to WAV by the DSP extractor)
EA TXG Wii / Texture ✅ ❌ EA TXG texture groups (Tiger Woods PGA Tour course hole.hog members txfh_*.bin): HEAD/TXHE/CLHE/TXDA chunks, 88-byte records with mip offsets, base level of CMPR / RGB5A3 / I4 textures decoded to <file>.<NNN>_<name>.png with xx
EA BNKb Wii / Audio ✅ ❌ EA big-endian BNKb sound banks (Tiger Woods PGA Tour abnk_*.bin, and embedded at +0x20 in FIFA .abk ABKC banks): PT tag headers per slot; GC DSP sounds are written as NNNN.dsp, EALayer3 sounds are rebuilt into plain NNNN.mp3 (PCM-delay blocks dropped), EA-XA v2 and MicroTalk (MT10/MT5, via the vendored UTK decoder lib-utk.c) sounds (Madden NFL 10 .bnk, .abk) are decoded to NNNN.wav. FIFA BIG4 archives are read like BIGF
EA SHPG Wii / Texture ✅ ❌ EA SHPG shape archives (FIFA, .gsh, usually RefPack 10 fb-compressed): directory of {name, offset} records with GX CI8 / C4 / RGBA8 / CMPR / RGB5A3 / I4–IA8 textures (code = 0x10 + GX format) and RGB5A3/565/IA8 palette records; decoded to <file>.<NNN>_<name>.png with xx; any other RefPack file (10 fb) is saved decompressed as <file>.dec with xx
EA DBPF package Wii / Archive ✅ ❌ EA DBPF 2.0 .package resource packages (MySims, MySims Kingdom, MySims Agents): the index (flag-compressed type / group / instance fields) is split into NNNN_<name>.<ext> members, RefPack-decompressed where the size differs from the memory size and named through the 0x0166038c name map; textures (.mstex, GX CMPR / RGBA8, base level) become PNGs with xx
FMOD .fev Wii / Audio metadata ✅ ❌ FMOD Designer event files (FEV1, WALL-E, Kung Fu Panda 2, Marvel Super Hero Squad and many more): the length-prefixed project, bank, category, event group, event and wave bank names are listed in <file>.strings.txt with xx (the version-dependent event records are not interpreted)
BGST3 Wii / Texture ✅ ❌ Good-Feel BGST background tile sets (.bgst3, Kirby's Epic Yarn stage sections): a slot table of {used, layer, x, y, tile ids} records and a run of 512x512 GX CMPR tiles; with xx every non-empty tile becomes <file>.NNN.png and the slot table is written to <file>.txt (how the tiles are composed is not interpreted)
Ubisoft BAO package Wii / Audio ✅ ❌ Ubisoft DARE sound packages (.pk / localised .lpk with their hashed .spk stream files next to them; Rayman Raving Rabbids: TV Party, Just Dance, We Dare, Avatar, Prince of Persia: The Forgotten Sands; layout after vgmstream's ubi_bao): every audio header BAO with DSP-ADPCM, from the package's memory BAOs or the external .spk, is written as a standard <id>.dsp (<id>_chN.dsp for several channels) with the mini-header coefficients, history and loop points. All 1,570 mono tracks of the TV Party disc decode bit-identical to vgmstream; sequences and layers are skipped. Ubisoft IMA streams (codec 3: a version header, 10 PCM frames, then one nibble pair per frame) are decoded to <id>.wav, covering Avatar (0x220015). Just Dance music streams (codec 1: 16 bit little-endian PCM, channels interleaved, in the external .spk) are written as <id>.wav; all 76 PCM and 42 DSP sounds of the retail disc extract. tests/audit_ubibao.py compares every output with vgmstream-cli sample for sample: all 1,997 sounds of the Avatar disc (294 packages) and all 118 of Just Dance are bit-identical
RIFX WAVE Wii / Audio ✅ ❌ Big-endian RIFX PCM (8 / 16 bit) sound effects (.wax, .rifx; 2 in 1 Meine Tierpension and other Tierpension-engine games, all 242 sampled files 16-bit mono 48 kHz) converted to a little-endian <file>.wav with xx
Nintendo JAudio .baa Wii / Audio archive ✅ ❌ Zelda: Twilight Princess Audiores/Z2Sound.baa + Waves/*.aw (AA_< chunk list ending >_AA: bst /bstn/bsc ranges, bfca (an embedded RARC), bnk banks and ws WSYS wave systems): each WSYS (WINF groups naming the .aw files, 0x2c-byte wave records with format, rate, offset, size, loop and sample count) is decoded to wsys<id>/<aw>/<nnnn>.wav; AFC 4 bit (9 byte frames) and 2 bit (5 byte frames), PCM8 and big-endian PCM16. All 15,601 waves of the retail disc extract; the AFC predictor matches vgmstream sample for sample on a random 36 of them. Banks and sequence collections are written raw
Alfa System .sts Wii / Audio ✅ ❌ Castle of Shikigami III Data/Bgm and Data/voice files (a big-endian size word that is the file size minus 4, channel count, rate, bytes per channel and a DSP coefficient block at 0x1e; data at 0x70 mono or 0x50 stereo, each further channel a 0x2e-byte block plus its data; layout after vgmstream's sts): each channel is written as chN.dsp and decoded to chN.wav. All 4,747 files with audio data on the disc match vgmstream-cli sample for sample (the 85 88-byte stubs hold no ADPCM and are left alone)
Krome RKV2 Wii / Archive ✅ ❌ Star Wars: The Force Unleashed media_WI.rkv, data_WI.rkv, Lng*_WI.rkv, Bpkdata_WI.rkv (RKV2, little-endian; not the big-endian RK33 of Happy Feet Two): two identical 0x40-byte headers, then members stored plain from 0x80; the table at the offset in header word 5 (size in word 6) holds 20-byte records {name offset, 0, size, data offset, name hash} followed by the NUL separated names. Members are streamed to <archive>.d/; all 270 media_WI members extract (252 .mus); the data_WI models / textures (.mdl, .mdg, .tex) are Krome-specific formats that are not decoded
Krome .mus Wii / Audio ✅ ❌ Star Wars: The Force Unleashed .mus streams (layout after vgmstream's mus_krome): big-endian samples @0, interleave 0x8000 @4, data start 0x80 @8, data size @0xc, a DSP coefficient / history block per channel at 0x10 (+0x2e), rate u16 @0x6c; stereo DSP-ADPCM written as ch0.dsp / ch1.dsp and decoded to WAV. All 252 streams of the disc match vgmstream-cli sample for sample
Madagascar .snds Wii / Audio ✅ ❌ Madagascar: Escape 2 Africa voice / music clips (inside the level .arc / .bld IGA archives): a plain 0x60-byte DSP header followed by the ADPCM data, decoded to <name>.wav by the DSP extractor (all 498 clips of the retail disc; not supported by vgmstream)
Alchemy IGZ (Madagascar 2) Wii / Model + Texture ✅ ❌ Madagascar: Escape 2 Africa level.bld / *.pak members of the IGA archives (IGZ\x01, big endian): nibble-varint fixup tables (type names / sizes, object offsets, pooled memory blocks) are resolved and each igImage2 (CMPR / RGB565 / I8 with mips, base level) is written as texNNNN.png; every igGeometryAttr (igVertexBuffer position f32x3, color rgba8, texcoords s16/16384 + igIndexBuffer GX-style indexed strips) goes into model.glb, textured through the following igTextureBindAttr2. Scene transforms, skinning (vertex strides 34/38), the 16-bit format (565 vs 5A3) and language-pak strings are not decoded
Krome .tex Wii / Texture ✅ ❌ Star Wars: The Force Unleashed data_WI.rkv textures: big-endian header {format 0x4c CMPR / 0x4b IA8 / 0 RGBA8, width, height, data size, .., mip levels - 1 in the high half of word 5} + GX data with the full mip chain at 0x20; the base level is written as PNG (all 4,716 textures of the retail disc)
Krome .mdl / .mdg Wii / Model ✅ ❌ Star Wars: The Force Unleashed data_WI.rkv models (MDL3 names / bounds + MDG3 geometry; 2,216 of 2,347 models (the other 131 have no geometry), in xx mode): chunks of {0x20 byte field block, GX strips (op 0x98; 0x90 lists and 0xa0 fans handled) of 9 byte records {u16 position, s8x3 normal, u16 colour, u16 UV} - op 0x9a (skinned characters / costumes) uses 15 byte records with 6 extra tangent bytes and, depending on the model, a 12 or 16 byte position stride -, rgba8 colour table, f32 position array, s16x2 UV array (/ 4096)}, one mesh per chunk in <name>.glb (bind pose, no skin weights), textured with the first .mdl strings that name extracted .tex files (PNG).
Spyro DotD .KRV (language) Wii / Text ✅ ❌ The Legend of Spyro: Dawn of the Dragon NNGLC.KRV string tables (little endian, {5, 12, ..}): runs of {u32 length, UTF-16LE text} (optionally separated by u32 ids) are found by scanning and written to strings.txt. GAME.KRV is high-entropy (compressed / encrypted) and left alone
Shin'en OGL Wii / Audio ✅ ❌ Jett Rocket .ogl (layout after vgmstream's ogl): a 0x14-byte header (loop offset, loop start, loop block, sample count, size) and Vorbis packets with u16 size << 2 | flags prefixes (identification, comment, setup, audio). The packets are re-wrapped unchanged into a standard <name>.ogg (granule position only on the last page); not tested against a retail file (no disc), only a synthetic libvorbis stream
DC2 world (.dcw) Wii / Model ✅ ❌ Speed 2 Maps/*.dcw (DC2\0): per mesh set a position array {u32 0, u8 12, u32 n} directly followed by a UV array {u32 0, u8 8, u32 n} (the second copy of a pair is the z-mirrored track half); later the primitive runs {u8 op, u16 n, n x {u16 position, u16 normal, u16 UV}} (0x92 lists, 0x9a strips, 0x82 quads, 0xa2 fans), assigned to the sets in order until a run group reaches the last UV index. One mesh per closed set goes to <name>.glb (geometry only; a set is closed once its runs reach the last UV and at least 80% of the positions: all 25 sets of F1_Track1, all 18 of F1_Track6, 70 in F1_Track8); materials, textures, normals and instance transforms are not decoded
DC2 font cache (.dcf) Wii / Font ✅ ❌ Speed 2 Fonts/Cache/*.dcf (DC2\0): 0x1c-byte header (atlas bytes / 4 at 0x14), a 1024-pixel-wide GX IA4 atlas at 0x1c, 3 bytes, then {u16 code, f32 x0, y0, x1, y1, advance} glyph records to the end of the file. The atlas goes to PNG, the glyph rectangles to <name>.txt (all 9 retail caches)
Petz DPGZ track Wii / Animation ✅ ❌ Petz Sports 3d/displacementtrack/* (DPGZ, no extension): header (0xf or 0x1e words, start position and scale), frame count and length @0x40, then {u32 n, n x vec3} position and scale paths plus an optional {u32 n, n x f32} channel; all 147 retail tracks parse to the end of file. Written as <name>.txt (channel meanings beyond position/scale unconfirmed)
Petz MACT table Wii / Animation ✅ ❌ Petz Sports 3d/animation/*_mact (MACT, no extension): name string, N id hashes, 3N + 1 link records {u8 kind, u8 flags, u32 hash}, a 16-byte block, N {u16 flags, s16 a, s16 b} entries and a 16-byte block; all 2,314 retail files have exactly 12 + name length + 28 N + 38 bytes. Written as <name>.txt; the id hashes are the bone ids of the sibling _skin node table, so <name>.txt adds node N to each when that skin is next to the file (47 of 47 on the chocolat dog); the hash function and the link hashes (shared between dogs, not bone ids) are not resolved and the field meanings are unknown
DSP .asf container Wii / Audio archive ✅ ❌ Little-endian multi-stream wrapper (Brunswick Pro Bowling BOWLSTR.ASF, MUSIC.ASF, likely Celebrity Sports Showdown): {count, data start, first size} and 0x70-byte records holding a standard big-endian DSP header plus the offset / size of the next stream; every stream becomes NNN.dsp and decodes to WAV (audio checked for smoothness, not against a reference decoder); the stereo MUSIC.ASF variant (record flag 0x0202, one shared header, 0x4000-byte interleave) becomes NNN_ch0.dsp / NNN_ch1.dsp (interleave inferred from channel correlation)
EA LOCH Wii / Text ✅ ❌ EA LOCH/LOCL locale tables (Madden NFL .loc): u32 offset list followed by NUL-terminated UTF-16LE strings; exported as strings.txt (<index>\t<text>)
Wrapped interleaved DSP Wii / Audio ✅ ❌ Small game-specific headers around per-channel DSP headers + chunk-interleaved ADPCM, split into chN.dsp: Traveller's Tales IDSP (.gcm/.idsp, LEGO games, Transformers), Next Level IDSP (Mario Strikers Charged), Procyon sadb (.sad, Disaster: Day of Crisis), Capcom DSPW (Sengoku Basara 3). DSP→WAV conversion is hardware-exact (+1024 rounding; verified bit-exact against vgmstream on 12 LEGO Batman streams)
Next Level .zlib / NLOC Wii / Compression, Text ✅ ❌ Mario Strikers Charged: .zlib = u32 BE size + zlib stream (*.sanim.zlib skeletal animations), written as <file>.d/<name>; NLOC .loc string tables ({id, offset} table + UTF-16BE pool) exported as strings.txt
Next Level texture banks (.rlt / .res / .dmn) Wii / Texture ✅ ❌ Mario Strikers Charged PTLG .rlt banks (u32 count @4, {name hash, offset, size, 0} records from 0x10, offsets relative to the end of the table) and the .res / .dmn resource files (u32 0x20 @0, count @4, {name hash, offset / 0x20, size} records from 0x20). A texture is a 0x20-byte big-endian header {mip levels, kind, 4 colour-depth bytes, width @0xe, height @0x10} followed by GX-tiled levels, largest first: kind 1 RGB5A3, kind 2 CMPR, kind 3 RGBA8. wszst xx writes the base level of each as <file>.<hash>.png (2,037 textures from 356 of the 390 files on the disc, character portraits and UI art checked by eye). The remaining 34 files are empty stubs or fonts with a different header; the non-texture entries of .res / .dmn and the rest of the Next Level formats (.shier, .cph, .cam, .trg, .fen, .nis, .resbun) are not decoded
Next Level wave bank (.resbun + .nlxwb) Wii / Audio ✅ ❌ Mario Strikers Charged sound-effect banks: the .resbun is a tree of big-endian {tag, size} chunks (tag bit 31 = container) whose wave table chunk 0x03023703 holds the sound count, one 0x1c-byte entry per sound {0, rate, 0, 0, end nibble address, start nibble address, 0} and one 0x2e-byte block of DSP coefficients and history per sound; the sibling headerless .nlxwb holds the raw DSP-ADPCM frames the nibble addresses point into (the last frame of the last sound may be cut short). Each sound is written as <NN>.dsp and converted to WAV by wszst xx: 944 sounds from 48 of the 54 banks, bit-exact against an independent reference decoder on one bank. Stream banks (FE_GEN_Music, STREAM_GEN_Music, STREAM_GEN_Crowd, STREAM_GEN_NIS: no wave table, chunk 0x23202 lists {index, offset, size, hash, channels, 0, 0} entries) hold one complete Next Level IDSP per entry, written as <NN>.idsp and then split into chN.dsp / WAV by the IDSP extractor (bit-exact against vgmstream on three tracks of FE_GEN_Music); the empty HUD_*_Music banks have no data. Loop points of the sound-effect banks are not exposed
Capcom MT Framework ARC Wii / Archive ✅ ❌ Sengoku Basara 3 .arc (\0CRA, big-endian, version 7): 0x50-byte records {name[0x40], type hash, compressed size, size<<3|flags, offset}, zlib members; extensions are derived from the member magic (\0XET = .tex, \0TLP = .plt, ...) with the type hash as fallback; 120/120 sampled archives extract every record. .tex / .plt (\0XET / \0TLP, 0x20-byte header + BRRES with TEX0 / PLT0) are unwrapped to <name>.brres and decoded to PNG with xx; C4/C8 .tex pull their palette from the sibling .plt and are decoded to <file>.png. CAPS sound packs (type hash 7e33a16c; 0x20-byte DSPW descriptors + back-to-back DSP wave blocks) are rebuilt into per-sound .dspw files, which split into chN.dsp/WAV (bit-exact vs vgmstream)
Asura SFX / RedSpark Wii / Audio ✅ ❌ Rebellion (Sniper Elite) .sfx stereo DSP ({0,2,2,nibbles,rate,ch0 offset,ch1 offset}, per-channel coefs + data at +0x30) and RedSpark (MadWorld) .rsd (rolling-XOR encrypted header, 8-byte interleaved DSP; banks list mono sounds); both written as chN.dsp/WAV and verified bit-exact against vgmstream (46 .rsd, 6 .sfx)
Exient WIIADPCM Wii / Audio ✅ ❌ Exient (Need for Speed: Hot Pursuit and others) .adpcm streams (WIIADPCM\0, v1 header at 0x10 / v2 at 0x20, channel blocks file-aligned to the interleave); split into chN.dsp/WAV, verified bit-exact against vgmstream on 18 files
Paon KNON Wii / Audio ✅ ❌ Paon (Donkey Kong: Barrel Blast) .str (KNON/KPST, stereo 16-bit big-endian PCM, 0x10 interleave) to stereo.wav and .asr (KAST, headers at 0x70, interleave 0x10) split into chN.dsp with the missing current-address/predictor fields filled in; verified bit-exact against vgmstream
Paon KNON wave bank Wii / Audio ✅ ❌ Paon (Donkey Kong: Barrel Blast) .WVD sound-effect banks (KNON/KWBK/WINF/WAVE): the WINF entry table gives each wave's size, the waves are standard mono DSP headers plus ADPCM; written as NNNN.dsp/WAV (all 1015 waves of the 40 retail banks parse; looped waves keep the loop end in the nibble count, so the length is taken from the sample count)
Punchers Impact MYSPD Wii / Audio ✅ ❌ .myspd (U-Sing): u32 channel size, u32 rate, 0x20 header, then two consecutive channels of plain IMA ADPCM (low nibble first); decoded to stereo.wav, verified bit-exact against vgmstream on 31 files
Reflections 04SW Wii / Audio ✅ ❌ Reflections (Driver: Parallel Lines, Emergency Heroes) .XA (04SW, two DSP headers at 0x04 with junk history fields, data offset @0xc4, 0x8000 interleave with a tight final block); split into chN.dsp/WAV, verified bit-exact against vgmstream on stereo and mono streams
Ubisoft GWB+GWD Wii / Audio ✅ ❌ Ubisoft (Monster 4x4: World Circuit) sound banks: the small .gwb lists the subsongs (v6 and v7 layouts, 0x4a-byte per-channel records holding the DSP coefficients), the sibling .gwd holds the headerless DSP data; every channel is rebuilt as a standard NNNN[_chN].dsp with its header, verified bit-exact against vgmstream on 943 streams from 64 banks
Plain DSP as .wav/.adp/.ddsp Wii / Audio ✅ ❌ Mono GameCube DSP-ADPCM files with a valid 0x60 header behind a misleading extension (Wacky Races: Crash & Dash ships all its audio this way); non-RIFF content is detected from the header and exposed as audio.dsp, verified bit-exact against vgmstream on 80 files
Rebellion Asura Wii ARC Wii / Archive ✅ ❌ wii\0 resource archives (PDC World Championship Darts): 0xd4-byte header, then 0x5c-byte entries {name, type, size, offset, ...}; type 0x15 members are standard DSP files (decoded to WAV), type 0x14 nested U8 archives, other types are written as .tNN. Type 1 members (.t1: 0x20-byte header with width / height and GX format / palette format bytes, tiled pixels, palette words at the end) are decoded to PNG by wszst xx (base level only; I4/IA8 .. RGBA8, C4, C8, CMPR; checked on the 579 textures of MENU.ARC and SHIRT09.ARC). Vertex, normal, display-list, skin and animation types are still written raw. All 1529 retail archives parse
PlatinumGames IDD / EFF Wii / Texture ✅ ❌ IDD\0 / EFF\0 section containers (MadWorld .idd, .eff): {id, offset} section table; the TEX section lists textures (u16 width / height, GX format, tiled data) with optional TLUT headers (IA8 / RGB565 / RGB5A3). Decoded to <file>.NN.png by wszst xx (C4, C8, CMPR and the other GX formats; 124 textures from the 84 retail files that carry any, the other sections are models / effects and stay unparsed)
PlatinumGames RSP sound pack Wii / Audio archive ✅ ❌ PACK sound packs (MadWorld .rsp, se/scene_mix*): {offset, size} table, members may be nested packs; every leaf is a RedSpark .rsd (written as NN.rsd / NN-MM.rsd, then split to DSP / WAV by the RedSpark handler). All 103 retail packs split; the announcer voice files (announce/*/an_c*_pack_*.bin, 85 of them) are RedSpark too and decode the same way
Capcom @LPK / @FPK / ANA@ Wii / Archive ✅ ❌ Capcom resource archives (Dead Rising: Chop Till You Drop): @LPK (0x30-byte {name, size, offset} entries), @FPK (groups of {index, offset} records, sizes from the next offset; bres members are named .brres) and ANA@ (0x10-byte {offset, size, 8-byte name} entries). Members are BRRES / BCMDL / raw data and are split recursively; .bcmdl, .bsrt, .csl, .epa, .brarg, .bsp and .brlgc data tables stay unparsed
CRI ADX Wii / Audio ✅ ❌ .adx standard (type 3) 4-bit ADPCM, 1-8 channels, decoded to audio.wav by wszst xx (loops are not expanded; the exponential type 4 and encrypted files are skipped). Bit-exact against vgmstream on a 2.6 M-sample Ghost Squad stereo track
CRI AIX Wii / Audio archive ✅ ❌ CRI AIXF containers (.aix; Sonic Unleashed, Metroid: Other M; layout after vgmstream): the AIXP chunks of every segment are de-interleaved into one ADX stream per layer, sNN_lNN.adx (audio.adx for a single stream), which xx decodes to WAV. for bgm_boss_day.aix two of three layers decode identically to vgmstream's ADX decoder, the third differs in its first ~75 frames (the ADX decode itself is the ffmpeg pass-through, not the container split)
Major Minor .waf Wii / Audio stream ✅ ❌ Chains of 0x20-aligned chunks {u16 1, u16 2, u32 size, u32 samples, u32 rate, DSP header + data} (Major Minor's Majestic March, ~3,000 chunks per stage file); each chunk carries its own coefficients and becomes a standalone NNNN.dsp, which xx decodes to WAV. All 400+ shipped files chain to exactly their length; vgmstream cannot open the format, so decoded output is not cross-checked
Stormfront .seg Wii / Audio ✅ ❌ seg\0wii\0 sounds (The Spiderwick Chronicles, 2,513 files; layout after vgmstream): 0x2000-byte blocks interleaved per channel from 0x4000, each channel opening with its own DSP header; split into NN.dsp per channel, which xx decodes to WAV
KWA Wii / Audio ✅ ❌ Interleaved DSP sounds (.kwa; The Lord of the Rings: Aragorn's Quest, 4,677 files, 1-4 channels; layout after vgmstream): u32 3, channels @4, interleave @0xc, blocks from 0x20 each opening with a DSP header; split into NN.dsp per channel, which xx decodes to WAV. Mono and 4-channel files are sample-exact against vgmstream
Treyarch NSLB .wbk Wii / Audio bank ✅ ❌ Sound banks of Kung Fu Panda / Call of Duty 3 (layout after vgmstream): every DSP sound (codec 0x22) becomes NNNN_name[_chN].dsp with a synthesized header (coefficients from the info section, zero history), which xx decodes to WAV. 31 sounds, mono and stereo, sample-exact against vgmstream; other codecs and the older WAVE BK11 banks are not extracted
Tornado Outbreak .bgw Wii / Compression ✅ ❌ ZLIB + big-endian size + zlib stream level packages (20 files, 13-15 MB packed, 43-49 MB unpacked); the payload is written to <name>.bgw.d/<name>.bin. Its inner tagged LCTX resource container (textures, ...) is not parsed; unrelated to the Final Fantasy XI BGMStream .bgw
Terminal Reality .smp Wii / Audio ✅ ❌ Infernal Engine samples, small-header DSP variant (Guilty Party, 5,954 files; layout after vgmstream): converted to <name>.smp.d/<name>.dsp (coefficients from 0x2c, zero history), which xx decodes to WAV. 9 sampled files are sample-exact against vgmstream; other codecs/headers of the format are not handled
Sega GTS texture set Wii / Texture archive ✅ ❌ gts1 sets (Ghost Squad tex/*.gts): offset table at 0xc, each entry {u32 size, name[0x3c], GVR file}; split to <name>.gvr and decoded to PNG by the GVR handler (checked on texset_chr_arm_frc_rambo.gts)
Avalanche DICT Wii / Text ✅ ❌ DICT localisation dictionaries (Disney's Bolt data/Lang/*_RVL.dct): the trailing NUL-separated UTF-8 string pool (text followed by its voice id) is listed to <name>.txt; the hash tables are not decoded
Avalanche DBL Wii / Texture ✅ ❌ .dbl / .mdb resource databases (Disney's Bolt): big-endian chunk list; the DB_TEXTURE_SET chunk (0x82) with 0x48-byte records (.tga name, GX format, offsets, C4 / C8 palettes as RGB565) is decoded to <file>.NN.<name>.png (base level; 3,440 textures from the 61 of 465 retail files that carry a texture set; the other chunks - geometry, scene trees, particles - are not parsed)
Capcom SRT + SSD Wii / Audio ✅ ❌ Monster Hunter Tri sound tables (.srt, chunk offset table + DSP chunk with rate and per-channel coefficients) paired with the headerless .ssd ADPCM stream (found beside it or in stream/ by comparing name tokens, e.g. MH3_DEMO_BGM_01.srt / demo_01_bgm.ssd); single-sound tables only (61 of the 81 retail tables decode). The stream is split into two block-interleaved (0x10000) DSP channels, trailing zero padding trimmed. Layout inferred from smoothness of the decoded signal; there is no reference decoder, so channel alignment is unverified
DDS Multi / Texture ✅ ✅ DirectDraw Surface textures (Epic Mickey ships 229): wszst xx writes the base level to <file>.png (DXT1 / 3 / 5 and plain layouts via DecodeDDS_RGBA); wimgt already read and wrote DDS
Wwise BNK Wii / Audio archive ✅ ❌ Audiokinetic BKHD / DIDX / DATA banks (Epic Mickey, big endian): mono RIFX DSP media (WiiH coefficients) become <id>.dsp (then WAV; bit-exact against vgmstream), other media stay <id>.wem. 172 of the 189 retail banks yield media (4,153 DSP sounds, 325 other .wem); the HIRC event graph is not parsed
Junction Point PAK Wii / Archive ✅ ❌ Gamebryo-based Epic Mickey .pak packs (big endian, magic 20 4b 41 50): 24-byte entries {file name offset, size, compressed size, padded size, directory offset}, a name pool and 0x20-aligned members (zlib when the sizes differ); members are written as <directory>/<file>. 379 of the 381 retail packs unpack (69,105 files: .nif_wii, .hkx_wii, .bin, ...)
Scaleform GFx / Flash CWS Multi / UI movie ✅ ❌ CFX (Scaleform, written back as GFX) and CWS (Flash, written as FWS) zlib-compressed movies (Epic Mickey .gfx): decompressed to an ordinary tag stream beside <file>.d/; the tags themselves are not parsed
Capcom CSVT tables Wii / data ✅ ❌ CSVT tables (Resident Evil Umbrella / Darkside Chronicles .aitbl .atk .vop .csvtbl): each table (name, columns, rows, 8-byte typed cells: int / float / string) written as <name>.csv in <file>.d/ (decode mode)
Capcom TRES text Wii / text ✅ ❌ TRES string tables (Resident Evil Umbrella / Darkside Chronicles mes_*.txtres): records of id, optional label and one or more UTF-8 strings written as tab-separated text.txt in <file>.d/ (decode mode)
Sonic Team .one Wii / archive ✅ ❌ Sonic and the Black Knight .one archives: 0x30-byte directory entries, members Sega-PRS compressed (control bits LSB first); all 394 non-empty retail archives unpack to their recorded sizes, members (.GVR .GNM .TXD .FCO …) are then handled by their own decoders
Sonic TXAG .txd Wii / texture archive ✅ ❌ TXAG GVR bundles (Sonic and the Black Knight); members written as <name>.gvr. The GVR decoder now also reads CI4 / CI8 textures with an inline palette (IA8 / RGB565 / RGB5A3)
Climax .arc Wii / archive ✅ ❌ Silent Hill: Shattered Memories data.arc / igc.arc (little-endian, hashed names, zlib or stored members; streamed, 1.5 GB). Members are written as <hash>.jpg/.afx/.bin; the bulk of them are a Climax-packed RenderWare stream that is not decoded
Marvelous pBin / FIPAFTEX Wii / archive + texture ✅ ❌ Harvest Moon: Animal Parade .pBin .cmp .tak .motma containers (main body plus typed members FMS/TEX/MOT/TPL/..., written main.<tag> and NN.<tag>) and the FIPAFTEX texture sets inside them (GX formats, decode mode → <file>.NN.png); the models (FIPAFMS) and motions are left as is
fpack .fpk (CyberConnect2) Wii / archive + compression ✅ ❌ Naruto Shippuden: Clash of Ninja Revolution III (and the same layout in Tatsunoko vs. Capcom) fpack/**/*.fpk: 0x30-byte entries with relative paths; members stored or Sega PRS with MSB-first control bits (the loader was found in the game binary; 63 of 315 retail archives sampled all extract, members .brtex .brplt etc. decode further). Not the Traveller's Tales .fpk
EA Montreal .loc / .sub Wii / text ✅ ❌ Boogie SuperStar LOCH/LOCI/LOCL string tables (strings.txt, id + UTF-16 text) and ST00 subtitle tracks (subtitles.txt, start / end + caption), decode mode
Okami .dat / .t Wii / archive + texture ✅ ❌ Okami offset-table containers (.dat, .bin, .i inside the _data*.afs archives; 0x20-aligned member offsets) split into NNN.brres/.t/.mtb/.scr/.bin; the BRRES members decode to models + textures, and the .t textures (an IDD-style TEX body, CI4/CI8 + RGB5A3 palette; the record stores height before width) to PNG. The other .dat flavours (ev*.dat) and .mtb/.scr/.ses are left as is
Sakura Wars .htx Wii / texture ✅ ❌ Sakura Wars: So Long, My Love HTEX/HTSF/PVRT textures: 256-entry RGBA palette (PS2 CLUT order, alpha 0x80 = opaque) and 8-bit indices in PS2 GS PSMT8 block-swizzled order → PNG (decode mode; 112 of 123 retail files, the GBIX wipe masks are skipped)
Ganbarion ALAR (BE) Wii / archive ✅ ❌ Pandora's Tower .aar archives (ALAR v2: 16-byte {kind, id, offset, size, flags} records); members are tagged blocks written as NNN_<kind><id>.<tag> (alig, alod, almt, alms, ...), whose contents are not decoded. Version 2 archives only (about 99% of a 500-file sample split); the version 3 cutscene archives (event/*.aar, header ALAR 03c1) use a different table and are left alone
Arc Rise Fantasia .wtm Wii / texture ✅ ❌ WTMD textures (header with size, GX format and palette format, palette at 0x20): RGB565 / RGBA8 / CI4 / CI8 / CMPR → PNG in decode mode (all 51 retail files)
Dokapon Kingdom .PAH/.PAC, .PIM Wii / archive, texture ✅ ❌ GAME.PAH index (2,643 named members) splits the 420 MB GAME.PAC by streaming; .PIM PS2-style 4/8/32-bit palettised textures (alpha 0..0x80) → PNG in decode mode (all 587 retail files)
Muramasa: The Demon Blade .ftx, .nms Wii / texture set ✅ ❌ FCMP LZSS container around FTEX: the embedded TPLs are written out and decode to PNG (all 722 retail files); .nms message sheets (Shift-JIS or Latin-1 strings) → <file>.txt (all 40 sampled); the other FCMP types (.mbs, .nsb, .esb, .abf) are decompressed to <file>.dec, and the MLIB name lists (.abf), EMBP record tables (.esb), and NSBD scripts (.nsb) also give <file>.strings.txt (offset and string; the record layouts are not interpreted)
Trauma Team .tpx, .bf, .bm2 Wii / texture pack, script ✅ ❌ .tpx records (flags, offset, size, name) point at standard TPLs, written out and decoded to PNG (all 310 sampled files, 387 textures); .bm2 bare MSG2 message files (all 38 sampled) and .bf Atlus FLW0 flow scripts → text with the proc/jump labels and every Shift-JIS message string of the embedded MSG2 block (instruction stream and message control codes not interpreted)
pop'n music .sen, .aept/.aepc Wii / text table, sprite sheet ✅ ❌ SEN UTF-16BE sentence tables → <file>.txt (all 24 sampled files); AEPT layout+texture files (.aepc is LZ11-wrapped): the embedded TPL is written out and decodes to PNG, the sprite-layout tables are not interpreted
Cursed Mountain .dat, .timg Wii / archive, texture ✅ ❌ d2 f1 7e 00 asset bundles (hashed entries with directory strings, zlib or stored, streamed; the 100 MB KTM_wii.dat included) split into <file>.d/<dir>/<name>; .timg RGB5A3 / RGBA8 / CMPR / I8 / IA8 base level → PNG in decode mode (all 1,219 members of the sampled bundles); .gr2 Granny models, .grz, .gimg, .bns members not decoded
Lost in Blue: Shipwrecked .bin, .zms Wii / archive, text ✅ ❌ WII scene archives (NNNNModel.bin, NNNNSnd.bin, ...; members unpack recursively, models and textures through the existing decoders) split by name, and the unnamed variant (Effect, Text, ...: {offset, size} pairs only) split into NNN.zmb/.teb/.zms/.bin; ZMS message tables (per-slot Shift-JIS strings, #c.. colour codes kept) → <file>.txt; .TSB scene scripts not decoded
Rebellion Asura .wii, .asrBE, .guiBE Wii / resource archive ✅ ❌ AsuraZlb (zlib) and plain Asura resource files (PDC Darts, Sniper Elite, The Simpsons Game, Rogue Trooper): the files embedded in RSCF chunks are written under their paths (TPL textures decode to PNG); models, entities and the other chunk types are not decoded
Rebellion Asura string table (.str) Wii / Text ✅ ❌ PDC World Championship Darts .str (little-endian): u32 count, count u32 offsets from the end of the offset table, each pointing at {u16 byte length, u16 character count, UTF-8 text, 0xff padding}; wszst xx writes <name>.txt with one <index>: <text> line per string. All 90 non-empty retail files parse (the 21 196_*-198_* files are empty placeholders and are declined)
Nippon Ichi IMY (.imy) Wii / Texture ✅ ❌ Phantom Brave: We Meet Again IMY\0 textures (little-endian 0x20-byte header: decoded size, row bytes, flags, 4 / 8 / 32 bits per pixel, height, palette entries; RGB565 or RGB5A3 palette words, then a control-byte stream of literal runs, literal back-references and left / above / above-left / above-right copies over 2- or 4-byte units; the result is GX C4 / C8 / RGBA8 tile order padded to whole tiles). wszst xx writes <name>.imy.png. The mp*.dat map-tile and anm*.dat sprite-sheet data files carry IMY textures back to back; every one found on a 4-byte boundary is written as <file>.<offset>.png (8,687 images from 303 files, sprite sheets and map tiles checked by eye). Layout read from the game's own decoder; all 186 standalone .imy files decode too. The rest of those .dat files and the .mpd map data are not decoded
Nippon Ichi WIIIDARC (.dat) Wii / Audio, Archive ✅ ❌ Phantom Brave: We Meet Again se.dat, voice.dat, voice_jp.dat (WIIIDARC, big-endian): u32 count @8, u16 sound ids from 0x20, then 0x30-byte entries {name[0x20], 0, size, offset} aligned to 0x20. Each member is a mono .wsd (u32 0x20, two size words, standard 0x60-byte DSP header at +0x20, ADPCM at +0x80, the last frame may be cut short); members are written as <name>.dsp and converted to WAV by wszst xx. All 972 members of the three archives convert; the DSP decoder is the hardware-exact one used elsewhere. The stereo .wsd form that vgmstream describes does not occur on this disc. The non-image parts of the other .dat files on the disc (anm*, mp*) are game-specific tables and are not decoded
Phantom Brave battle map (.mpd) Wii / Data ✅ ❌ Phantom Brave: We Meet Again mp*.mpd (big-endian, layout from the game's own map loader): 0x40-byte header (u16 count A @0, u16 count B @4, u32 byte size of a trailing u16 table @0x30), a 64x64 grid of 4-byte cells stored column by column, A records of 0x40 bytes, B records of 0x24 bytes, the u16 table, then up to 4 KiB of further 16-byte records. wszst xx writes <name>.txt with the header, the four grid byte planes and every record as hex. All 300 retail maps parse; the meaning of the individual fields is not decoded
Infernal ITL Wii / Audio ✅ ❌ .itl stereo DSP music (MX vs. ATV Untamed): each channel's blocks start with its own 0x60 header, 0x10000 interleave, final blocks only as long as the remaining data; split into chN.dsp/WAV, verified bit-exact against vgmstream on 22 files. Rebellion .ds2 (0x8000 interleave) uses the same code, untested
tri-Crescendo CAF Wii / Audio ✅ ❌ CAF block-chained stereo music (Fragile Dreams, extensionless files / .caf / .cfn): every 0x80000-byte block carries its own channel chunks and DSP coefficients; the chunks are concatenated into 32 kHz ch0.dsp/ch1.dsp with the loop block turned into loop points; verified bit-exact against vgmstream on 9 files, all 47 retail files parse
Capcom MT Framework Wii model (.rmd) Wii / Model ✅ ❌ Sengoku Basara 3 .rmd (\0DMR): a big-endian skeleton / bone-remap / section table around an ordinary BRRES (offset @0x154, size @0x15c); the BRRES is written out as <name>.brres and its MDL0 then exports to GLB through the normal BRRES path (checked on the 55 models of one enemy archive, the player model is a recognisable humanoid with 19,944 vertices). Bone and material tables outside the BRRES are not decoded
Capcom MT Framework Wii motion bank (.lmt) Wii / Animation ✅ ❌ Sengoku Basara 3 .lmt (\0TML, version 0x38): big-endian slot table of 0x150-byte motions, each pointing at 0x24-byte track records; wszst xx writes <name>.txt listing every motion's tracks (bone, usage, joint, buffer type, reference) and the decoded keyframes of buffer types 1, 2, 4, 5, 6 and 7 (constant / 16 bit / 8 bit translation, 14 bit and 7 bit rotation; verified on all 30 motions of an enemy bank: key spacing sums to the motion length and rotations are unit length)
Capcom MT Framework Wii serialized object (.xfs) Wii / Data ✅ ❌ Sengoku Basara 3 .xfs (\0SFX, version 8): class table at 0x10 + u32@0x10, each class a {crc, info} pair with info >> 17 0x38-byte members {name offset (from 0x10), type, flags, size, defaults}; wszst xx writes <name>.txt listing every class and member (type / flags / size), e.g. mQuality, mpAttributeSeData. All 21 retail files of one enemy archive parse, member counts agree with the headers. The object data after the string table is not decoded
Capcom MT Framework Wii attack table (.atk) Wii / Combat Data ✅ ❌ Sengoku Basara 3 .atk (\0KTA, version 0x1021): 8-byte header then count 176-byte attack records {name[8], flags[4], attr[4], damage f32 @0x10, ...}; wszst xx writes <name>.txt listing each attack name, damage, flags, and attributes. All 14 retail files in the enemy/player archive parse with exact size matching 8 + count * 176
Capcom MT Framework Wii weapon parameters (.wpd) Wii / Combat Data ✅ ❌ Sengoku Basara 3 .wpd (\0DPW, 20 bytes): a u32 (0, 0x205 or 0x20a) and six big-endian u16 values; wszst xx writes <name>.txt. Field meanings unknown (all seven weapons of the first character have the same size and layout)
Capcom MT Framework Wii sound tables (.qrts / .qers) Wii / Audio Data ✅ ❌ Sengoku Basara 3 stream tables (QRTS, version 0x1a; 10 files: bgm.qrts names its 202 BGM streams, matching the count word @8) and sound-effect tables (QERS, version 0x13; 1,308 files, each naming its .dspw bank): fixed-size records (not decoded) followed by NUL-terminated sound\... path strings. wszst xx writes <name>.txt with the header words and every path in order (the first 300 .qers all yield their path)
Capcom MT Framework Wii effect sprite animation (.ean) Wii / Animation ✅ ❌ Sengoku Basara 3 .ean (\0NAE, date 0x20060501): u32 body size @8 (= file size - 16), u32 animation count @0xc, 0x20-byte records at 0x10 {u32 rect list offset (from 0x10), u16 frame count, u16 kind, 6 words} and then the 8-byte {x, y, w, h} rect lists back to back to the end of the file (all 27 retail files tile exactly; cells such as 96 x 96, 5 per row). wszst xx writes <name>.txt; the meaning of the record words is inferred, not confirmed
Capcom MT Framework Wii actor index (.idx) Wii / Data ✅ ❌ Sengoku Basara 3 .idx (\0XDI): u32 count @4, followed by count u32 mapping IDs and count 20-byte record descriptors (u32[5]); wszst xx writes <name>.txt listing each entry. All 14 retail files parse with exact size matching 8 + count * 24
Capcom MT Framework Wii effect link (.eco) Wii / Effects ✅ ❌ Sengoku Basara 3 .eco (\0OCE): u16 version @4, u16 count @6, u32 table offset @0x10, pointing to count 8-byte descriptors {u32 id, u32 str_offset} resolving NUL-terminated .efl path strings; wszst xx writes <name>.txt listing linked effect paths. All 6 retail files parse
Capcom MT Framework Wii effect bank (.efl) Wii / Effects ✅ ❌ Sengoku Basara 3 .efl (\0LFE): u32 date @4 (0x20090914), u32 payload size @8, u32 count @0x0c, followed by 16-byte parameter/bounding header and count 16-byte chunk descriptors {u32 d0, u32 d1, u32 d2, u32 d3}; wszst xx writes <name>.txt listing chunk types, offsets, and references. All 7 retail files parse
Capcom MT Framework Wii scripted resource (.scra) Wii / Scripting ✅ ❌ Sengoku Basara 3 .scra (SCRA): u16 version @4 (7), u16 count @6, followed by count 8-byte resource descriptors {u32 type_hash, u32 resource_hash}; wszst xx writes <name>.txt listing referenced resource hashes. All 18 retail files parse with exact size matching 8 + count * 8
Capcom MT Framework Wii surround sound (.srnd) Wii / Audio ✅ ❌ Sengoku Basara 3 .srnd (SRND): u32 version @4 (2), u32 count @8, followed by count 140-byte sound records {u32 sound_id, u32 flags, ...}; wszst xx writes <name>.txt listing surround sound parameter definitions. All 7 retail files parse with exact size matching 16 + count * 140
Capcom MT Framework Wii sound event request (.qers) Wii / Audio ✅ ❌ Sengoku Basara 3 .qers (QERS): u32 version @4 (19), u32 count @8, followed by count 144-byte sound event records and a trailing string table containing sound bank paths; wszst xx writes <name>.txt listing sound events and bank paths. All 17 retail files parse
Capcom MT Framework Wii collision table (.col) Wii / Physics & Collision ✅ ❌ Sengoku Basara 3 .col (\0LOC, version 2): u16 version @4, u16 count @6, followed by count collision group headers and 64-byte shape chunks; wszst xx writes <name>.txt listing collision groups and shape sub-chunks. All 14 retail files parse
Capcom MT Framework Wii AI decision trees (.thk) Wii / AI & Logic ✅ ❌ Sengoku Basara 3 .thk (\0KHT): u32 version @4, u32 count @8, followed by count tree headers and 176-byte behavior node records; wszst xx writes <name>.txt listing decision trees and node counts. All 27 retail files parse
Capcom MT Framework Wii animation SRT table (.astl) Wii / Animation ✅ ❌ Sengoku Basara 3 .astl (ASTL): wraps NW4R BRRES (holding AnmTexSrt / SRT0) at offset 0x144 (size 0x140); unwrapped to <name>.brres
Havok-style HVT texture Wii / Texture ✅ ❌ Aladdin Magic Racer texWii/*.hvt: 0x18-byte big-endian header {" IVH", version 2 or 6, format tag, width, height, bits per pixel} then a plain Wii GX pixel chain without mips: S3TW = CMPR, ARGB = RGBA8, G8A8 = IA8, GRY8 = I8; wszst xx writes <name>.hvt.png (all 507 textures of the retail data.hvp decode; one of each variant checked by eye). The .hvp packs themselves are handled by the HVP extractor; Octomania .wt/.pcm banks are not decoded
Retro PAK / CSMP Wii / Archive ✅ ❌ Retro Studios PAK v2 (Metroid Prime 3, Donkey Kong Country Returns with zlib blocks): STRG names + RSHD table + DATA, CMPD blocks of LZO1X pieces unpacked (all 14 retail paks decode), TXTR decoded to PNG in decode mode (I4–RGBA8, CI4/CI8, CMPR); .csmp samples become .dsp/WAV (150 of 203 checked bit-exact against vgmstream, the rest differ only by its looping); .strm is FSB3; .ras (RAS_, DKCR music, interleaved DSP with block+sample loop points) split into chN.dsp/WAV, exact up to the loop end against vgmstream; .strg string tables (v3) become one <LANG>.txt each
Petz TTPL Wii / Texture ✅ ❌ Petz-engine texture (Petz Sports, Petz Dogz/Horsez/Catz family; extension-less files under 3d/texture/): an 8-byte {"TTPL", size} wrapper around a standard Wii TPL, decoded to <name>.png by wszst xx. Level containers .ozzy (u32 0, zlib chunks {u32 raw, u32 comp, data}, 4 byte trailer) are inflated to level.bin; the embedded TTPL textures (named by the preceding TEXT record) and every GEOM (version 3/4: attribute blocks {count, 0, stride, desc, size} for f32 / s16 / s8 positions, s8 normals, u8 colours and u8 / s16 texcoords with fixed point fraction bits, then the GX triangle display list and the diffuse texture path) are written as <name>.ttpl / PNG and models.glb (all 42 Petz Sports levels; triangle winding verified against the stored normals). Standalone 3d/mesh/** MESH records (geometry path, texture path) and bare GEOM files become model.glb plus the referenced ...txl TTPL. Skinned meshes SMSH / FSMH (19-byte attribute records, then one GX display list per bone batch of {u8 matrix index, f32 position, [f32 normal], f32 texcoord}) are exported as a skinned .glb (47 / 67 joints from the node table in its second, bind pose, weight palettes as joint weights; the trailing block {u32 count, count x {u32 n, n x u16 palette index}} has one list per display list, and a vertex's GX matrix index / 3 picks the palette; it ends exactly at the end of the file on three dogs; the mirrored left / right legs of that pose are symmetric, the first pose is not); wszst xx also writes <name>.skeleton.txt with the node table (88-byte records {id hash, scale, translation, rotation xyzw, a second scale / translation / rotation, child count} in depth first order, so the child counts give the parent links; they sum to N - 1 and the hash set equals the one of the sibling _mact, checked on a 47 and a 67 node dog, bone names are not stored), followed by the skin weight palettes {u32 count} then {u32 n, n x id hash, n x f32 weight} (weights sum to 1 and every hash is a node, checked on three dogs: 200, 481 and 389 palettes), listed in the same file MACT animations (bit-packed per-bone tracks) and DPGZ displacement tracks are not decoded
Petz TEXL Wii / Texture ✅ ❌ Petz-engine texture (Cranium Kabookii; extension-less files under 3d/texture/): TEXL header then raw GX pixels, decoded to <name>.png by wszst xx. CMPR, RGBA8 and CMPR with a separate I4 alpha plane (_atxl) variants; other variants are left untouched
Heavy Iron HO Wii / Archive ✅ ❌ Good Engine .ho packages (WALL-E, Up, also Ratatouille on other platforms): big-endian MAST / SECT / PSL / PSLD tables; assets written as name.<type hash> with debug names from PSLD; GX texture blobs (RGB5A3 / RGBA8 / CMPR) → PNG. The .lo text log beside each package lists asset type names
Asobo BigFile Wii / Archive ✅ ❌ Asobo Studio "Internal Cross Technology" .DRV volumes (Ratatouille): big-endian v1.06.63 blocks, stored or LZRS members, hashed names (Asobo CRC) with class names (Bitmap_Z, Mesh_Z, ...); Bitmap_Z (RGB565 / RGBA8 / CMPR) → PNG; Sound_Z (Nintendo DSP-ADPCM with a standard DSP header) → WAV; Mesh_Z (Wii GX display lists over s16 positions / s16 UVs / s8 normals) → GLB with one primitive per material and the material's first bitmap as texture (static bind pose; Skin_Z skinning and Node_Z transforms are not applied). Other classes stay raw. Format after widberg/bff
Bj engine Wii / Assets ✅ ❌ Super Karts (Pro Kart): little-endian .tx1 headers + .tx2 8-bit paletted pixels (2 KiB-unit chunks, square mip chains) to PNG; .mtm mesh trees (node hierarchy, 4x4 matrices, indexed list/strip/fan primitives, UVs) to textured GLB; .bsi big-endian sound banks (mono PCM8) and .bsm planar-stereo PCM8 music at 32 kHz to WAV. Layout recovered from the disc's symbolised ELF.
Torus Games hunkfile Wii / Assets ✅ ❌ Barbie & Her Sisters: Puppy Rescue .hnk: little-endian chunks {u32 size, u16 kind, u16 0} (low 12 bits of kind = record type, upper bits = memory pool) ending exactly at EOF; 0x71 names each asset (class + name), 0x150/0x151 = TSETexture header (big-endian width/height/mips) + GX mip chain (CMPR / RGBA8 / I8, told apart by chain size) to PNG; 0x92/0x93 = SqueakStream (IWAR header, big-endian samples/rate, DSP coefficients at +64 / +112) naming a raw DSP-ADPCM file in ../SOUND to WAV (stereo assumed split in file halves). RenderModelTemplate, Animation, Clank*, .files manifests and .mo movies are not decoded
Atomic Planet PUB Wii / Assets ✅ ❌ AMF Bowling: Pinbusters! *WII.PUB: big-endian nested section headers, objects from 0x40 plus a trailing table of 28-byte {hash, offset, class, size} entries; class 1 textures carry a palette offset/count, mip count, GX format and {offset, size, height, width} per mip level (height first); C8 (IA8 / RGB565 / RGB5A3 palettes), RGBA8 and I8 to PNG. Class 8 meshes: a root at +0x74 lists per-part display lists (GX strips / lists / quads with u16 indices per attribute), texture name hashes and attribute slot records (position f32x3, colour RGBA8, UV s16x2 / 1024, normal s16x3 / 16384); exported as GLB with the diffuse PNG by hash. effects, strap and SFX packages use a different header and are left as-is.
Humongous Resource.rez Wii / Archive ✅ ❌ Backyard Football '10 Resource.rez: big-endian 24-byte slots {offset, size, unpacked size, type, flags}; a footer sector gives the slot count and the slot table sits before it. Group slots (flags = table size) end in a resource table; resources are byte-LZ compressed (flag bit 0; u32 size, then `0x80
BombShell data pack Wii, PC / Archive ✅ ❌ Bee Movie Game .xwi (Wii, big-endian, 32-byte aligned) and .xdx9 (PC, little-endian): one memory image 0x020100a0, 0x040100af, 0x138, n with 24-byte directories {-, type (1 interface, 3 link, 4 world), -, -, size, datapack offset}; each datapack has a 192 (Wii) / 188 (PC) byte header (+4 sound bytes, +8 sound table words, +20 textures, +32 sounds, +108 word list). Sounds are {data offset, size, rate, flags} records whose data is a whole FSB3 bank (Wii) or RIFF WAVE (PC) with its source path right behind it. Textures are 32-byte records in an offset list (format byte 0x45 / 0xc5 / 0xc6 = CMPR on Wii where 0xc5 / 0xc6 keep alpha as a second CMPR image; 0x45 DXT1, 0xca DXT5, 0xa0 BGRA8, 0x18 BGR8 on PC; log2 width / height; pixel, aux, name and alpha offsets). Base level only. Layout from the Pac-Kart project. Wii models are found through the datapack's model patch list (+56 entries {u32 pointer, u16, u16} at datapack + u32(+0) + m, where m is the patch list offset minus u32(+0); all pointers add m): a model record {u16, u16, u32 name pointer (Content\\shapes\\...), +16 list count, +20 list of {count, pointer array}} whose sub-mesh records (224 bytes; type 0 static, 1 skinned-part, 2 and 3 not decoded) point at raw buffers: +0xb0 vertex flags (bit 0 position, 1 normal, 2 colour, 3 UV: one big-endian u16 index each per vertex, in that order), +180 float positions, +188 (type 0) / +184 (type 1) colours, +192 float normals, +196 s16 8.8 UVs and +200 {0, byte count, pointer} to a GX display list {command (0x90 triangles, 0x98 strip, 0xa0 fan, 0x80 quads), BE u16 count, vertices}. A sub-mesh's texture is the patch list entry (datapack + u32(+0) ...: texture entries {u32 pointer, u16, u16} start at m - 8 * (u32(+16) + u32(+52) + u32(+28) + u32(+84))) whose pointer equals the field at sub-mesh +48 (or +56); its second u16 is the texture index within the directory. Exported as one GLB per model in DIR/models (LOD 0, positions, normals, UV0, the PNG embedded per sub-mesh; no skeleton; degenerate strip joins dropped, some stray triangles remain). Not decoded: skinned weights and skeletons, types 2 / 3, PC models and world data.
Blue Tongue TRB Wii / Archive ✅ ❌ de Blob 2 .trb (TRB\0, version 0x7d1, big-endian; not the TSFB layout of Barnyard): 0x30-byte section descriptors at 0x80 {0, name offset, 0, flags, size, size, file offset} (section 0 is the string table; .data, __s00000 pixel pool, gpu_data, model_collision, XUR), then 16-byte symbols {tag, offset, section << 16, name offset}. A ttex symbol is a texture object: 0x0df00bb0 fill, then GX format (0 I4, 1 I8, 2 IA4, 3 IA8, 5 RGB5A3, 6 RGBA8, 8 C4, 9 C8, 14 CMPR), pixel offset in the pool at +0xc, palette offset +0x14 and format +0x18, stored size +0x1c, width / height pairs at +0x40 (+0x44 in UI files; first pair is the stored size) and the .tga name; only the base level is decoded. The XUR section is written as a .xur file. tcmd symbols are models: +0x10 batch count, +0x14 offset of a batch offset array; a 0x68-byte batch record holds the display list (size +0x40, offset +0x44 in gpu_data) and {array offset, attribute << 24 | element size << 16 | count} pairs for positions (s16x3, fraction bits from the batch's format table), normals (s8x3), TEX0 and TEX1 (s16x2); GX triangle / strip / fan / quad primitives with one u8 (u16 above 256 entries) index per attribute. Exported as one GLB per model (positions, normals, UVs, diffuse material). The format table {n, n x {b0, b1, fraction bits, attribute}} (from the record's +4 offset) lists every vertex attribute; entries below 9 are inline index bytes with no array, and the {array offset, descriptor} pairs (record +0x14; display list size and offset are the two words before them) exist only for the attributes a batch owns or shares (colour arrays are indexed but not exported). A count with bit 15 set means the array is not stored with the batch: the extractor loads every model package next to the .trb (first LevelAssets.trb) and takes the arrays of the same-named model, trying that model's batches with the same index first and then the others until every index of the display list fits (an instance in a cell may order its batches differently); a batch without a descriptor for an attribute continues with the array of the closest earlier batch of the model (terrain pieces share their position pool this way). About 98% of the batches of the Ink Point level cells export. Materials: the CoreMaterialSets_Mem entry named like the model lists CoreMaterials_Mem records (28 bytes, name first); word 2 (low 12 bits) indexes GXSET_TexObj_Mem (52-byte entries 0x06nnkk00, then nn {0, texture << 16} pairs) and the texture number indexes the ttlt name table; entry 0 is the cell lightmap and the diffuse map is the first name that is not a spec / envmap / bump helper. TEX0 holds the lightmap coordinates (12 fraction bits), TEX1 the diffuse ones (8 fraction bits, v from -1 to 0, wrapping); the diffuse PNGs are written next to the GLBs. Not decoded: terrain cell models (cellN_gM, no material set), collision data, the lightmap as a second UV layer and the CETB compressed level.
Toshi TSFB (TRB/TTL) Wii / Assets ✅ ❌ Blue Tongue Nickelodeon Barnyard (layouts after the OpenBarnyard decompilation): TSFB big-endian hunks XRDH header, TCES/CCES section (CCES = BTEC CETB LZ77 with 6/14-bit lengths and 7/15-bit offsets, optional XOR), CLER relocations, BMYS symbols {u16 section, u16 name offset, u32 hash, u32 data offset}. .ttl (symbol TTL): 13-word texture entries (format 0x300 + I4..CI8_IA8, name, size, data/palette pointers, mip count) decoded to PNG (first level). .tkl (symbol keylib, TKeyframeLibrary::TRBHeader): quantized bone-animation keyframe pools (packed-s16 translations scaled per-axis, packed-s16 unit quaternions, float scales) decoded to YAML; verified against the OpenBarnyard decompilation and cross-checked on ~250 disc samples, except scale keyframes (no disc sample has any). .trb models (Skeleton/Materials/Header/LOD0_Mesh_n symbols) convert to skinned GLB with wmdlt: bones (local quaternion + position, world/inverse bind matrices), LOD0 meshes as GX display lists of separately indexed s16 positions (fixed-point, frac bits in the mesh header), s8 normals and s16 texcoords, skin-blend table (up to 3 bones per entry) selected through the per-submesh matrix-slot table, material textures resolved from Data/Matlibs/<model>.ttl (verified on the disc: 892 of 895 model files convert, samples checked in Blender); the direct-UV variant (3 tiny UI props), LOD1+, collision and animation sequences are not decoded. .trz and TSFL little-endian files are not decoded
h.a.n.d. FBC bundle Wii / Archive ✅ ❌ Miffy no Omochabako .fbc: big-endian 00 14 00 06, u32 n, six table offsets, then n member offsets at 0x40 (relative to 0x40); the last 2n 32-byte slots of the file hold the member sizes (u32, 0-padded) then NUL-terminated names. Members back to back; nested bundles share the layout. Leaves are .brres, .tpl, .brasd, .ssb scripts and csvbin/txtbin message tables (last two not decoded)
Vblank BFP / BAP Wii / Archive ✅ ❌ gamedata_wii.bfp (BFP2, little-endian): 16-byte {hash, offset, size, stored} members plus 256 numbered {offset, size, stored} slots; stored raw when size == stored, else zlib. Names are h = (h << 1) ^ T[(h & 255) ^ upper(c)] hashes (table in lib-vblank.c); the ~145 recovered names come from the game DOLs and package contents, others keep <hash>.<ext> with content-sniffed extensions. audio_*_Wii.bap: BPP3 (Shakedown) sounds hold 1..n streams (kind 0x100 Ogg Vorbis → .ogg, kind 0x20 mono DSP-ADPCM with a big-endian DSP header → .wav) named after their title metadata; BAP1 (Retro City Rampage) holds zlib-compressed BTRK tracker modules plus a raw 8-bit sample pool (samples.raw); the tracker/sample binding and the .rec/.map/.til game-data formats are not decoded. Layouts reversed from main.dol
FMOD FSB Wii / Audio bank ✅ ❌ FSB3 (Nickelodeon Barnyard; 0x18-byte header, same sample headers, 4-channel music) and FSB4 (Up, WALL-E, Cars 2, Birthday Party Bash; incl. basic-header banks) and FSB5 (Brave): DSP-ADPCM (mono / stereo, 2-byte interleave) and PCM16 samples → WAV; other codecs copied out as .bin. FSB3 not handled
kRAW music Wii / Audio ✅ ❌ Geometry Wars: Galaxies: "kRAW", u32 size, then big-endian s16 mono samples from +8 (separate _Left / _Right files per stereo pair; 32 kHz inferred from the 64.08 s loop lengths, not stored in the file). Written as audio.wav. Level/*.bin is not decoded (the GameAudioDataWii.spd/.spt bank is covered by the SPD/SPT row)
Avalanche THB/TBB Wii / Texture ✅ ❌ Avalanche Software engine textures (Cars 2, inside the game's .zip / .tszip archives): big-endian .thb header (one or many textures: offset table + 32-byte records) + tiled GX .tbb pixels (I8 / RGB5A3 / RGBA8 / CMPR) → PNG; atlases write name_0.png, name_1.png, ...
Battle of the Bands BAG Wii / Archive ✅ ❌ Battle of the Bands (Backbone Entertainment, Wii) .bag asset container. No public documentation found (checked Xentax/ZenHax archive mirrors, GitHub, Wii modding wikis). Reverse-engineered against all 215 .bag samples on the retail disc: fixed 32-byte ASCII header "1.00 <N>\n" (zero-padded; N's exact meaning wasn't pinned down — it only equals the payload length for 5/215 samples) followed by a payload of concatenated sub-resources. Confirmed present in 215/215 samples: a plain-text manifest of name,size,offset\n CSV records (absolute file offsets; the first entry always starts at 32, right after the header) bracketed by runs of *, naming the embedded sub-resources — many of which (e.g. buildall.bag, hudsceneobjects.bag) are themselves raw zlib streams that were confirmed to inflate at their declared offsets. lib-botbbag.c/.h decode the header and every manifest record, and verify+size each zlib blob found at a record's offset; individual sub-resource payloads (GX/GFX texture data, level-geometry blobs of raw big-endian floats) were not further decoded, and this is detection-only — no wszst EXTRACT wiring yet.
Havok HKX (classic packfile) Wii / Physics-Animation ✅ ❌ Tenchu: Shadow Assassins (Acquire, Wii, 2009) ships Havok 4.6.1 skeleton/animation/ragdoll data under Common/Motion/{Skeleton,Face}/*.HKX. This is licensed Havok middleware, not a proprietary format, but the pre-2011 "classic packfile" binary layout (magic 0x57E0E057 0x10C0C010) is undocumented by Havok itself, and every open-source Havok reimplementation checked (HavokLib, hkxparse, hkxcmd) targets Havok 5.0+ or the 2010+ tagfile variant — none cover Havok 4.6.1. Reverse-engineered directly against retail samples (verified byte-for-byte, e.g. skeleton_main.HKX, Face/face_ayame.HKX): a fixed hkPackfileHeader (userTag, fileVersion, layoutRules[4] — observed {4,0,1,1}, i.e. 32-bit pointers, big-endian, matching the Wii target — numSections, contents-section indices, and a 16-byte contentsVersion string, e.g. "Havok-4.6.1-r1") followed by numSections fixed 48-byte hkPackfileSectionHeader entries (20-byte NUL-padded tag name, absoluteDataStart, then five offsets relative to it — localFixups/globalFixups/virtualFixups/exports/imports/endOffset — all equal when a section has no fixups, as in every section observed). Confirmed exactly: each section's absoluteDataStart/endOffset bounds the very next section's header, chained correctly end to end in every real sample checked. This packfile format is self-describing — the __types__ section carries full hkClass/hkClassMember reflection metadata for every type in the file — so lib-hkx.c/.h decode the header, the complete section table (name/offset/size, for however many sections exist), and every embedded Havok class name from __classnames__ (extracted by scanning for NUL-terminated ASCII runs starting hk/hcl, since the exact per-entry classnames record format wasn't pinned down — the class list alone identifies a file's content, e.g. face_ayame.HKX's classes include hkSkeleton, hkWaveletSkeletalAnimation, and hkBoneAttachment, confirming it as compressed facial skeletal animation). The __data__ section's binary content is not deserialized. Little-endian packfiles (layoutRules[1] != 0) are detected but not walked. Wired into GetByMagicFF() (exact two-word magic, no extension ambiguity) — detection-only, no wszst EXTRACT wiring.
T4-RES (Tenchu: Shadow Assassins) Wii / Tagged Resource ✅ ❌ Tenchu: Shadow Assassins reuses the generic .b extension for at least four unrelated internal layouts; this entry covers only the one carrying a real, self-identifying "T4-" ASCII tag (Common/Camera/CameraSetDB.b, Common/Camera/{ayame,rikimaru}_camset.b, Common/AI/{AIVoiceCommon,AIStatusData,CMN_AI_scr}.b — the only 6 real .b files on the disc carrying it). No public documentation exists. Confirmed structure: a 12-byte NUL-padded tag field (e.g. "T4-CamSetDB", "T4-AIVoice", "T4-AIScript", "T4-AIStatus", "T4-CamSet"), then 4 bytes of packed BCD that decode as a plausible authoring-tool export date ({0x20,0x08,0x03,0x14} → 2008-03-14) — the same era as the Havok 4.6.1 middleware embedded elsewhere on this disc. The record table following the header is type-specific (e.g. CamSetDB's records are 12 bytes and open with an ASCII bone/character name like "RIKIMARU"; AIVoice's differ) and was not reverse-engineered per type. lib-t4res.c/.h decode only the shared tag+date header. The disc's other .b layouts are explicitly out of scope for this entry: */Movie/*.b movie-subtitle-cue tables (magic-less, a u32 count header equal to 2× the following 16-byte record count, each record's last u32 always 0xFFFFFFFF, checked across all 108 real samples) and Common/Event/*EventData.b plain-count tables (u32 count immediately followed by that many 16-byte records) were identified but are not decoded by any module, since both collide by extension with this format and with each other closely enough that magic-less detection would be unsafe.
HDVOICE (Tenchu: Shadow Assassins) Wii / Audio Manifest ✅ ❌ Tenchu: Shadow Assassins per-character voice-line manifest, {FR,SP,US}/files/Sound/<CHARACTER>.hd (102 real samples: AYAME.hd, RIKIMARU.hd, COMMON.hd, MENU.hd, TUTORIAL.hd, etc.). No public documentation exists. Magic-less, but structurally unique on this disc: all 102 real .hd files match the layout below with zero leftover bytes, the strongest confirmation available without an in-game reference to check field semantics against. Layout: an 8-byte header (u32 total_slots, u32 group — 0-3 observed, constant per file, meaning unconfirmed, candidate voice bus/mixer group) followed by total_slots 8-byte slots (u16 category, u16 variant, s32 index) — one per possible voice-line ID in this character's fixed address space; index is either that line's sequential position (0..n_real-1, strictly increasing in slot order — confirmed identical to slot order in every sample, i.e. it is redundant with position rather than an independent lookup) in the parameter table below, or the sentinel -1 (0xFFFFFFFF) marking an ID not recorded in this localization (real/total ratios vary per character and per language, e.g. AYAME.hd: 200/542 real; consistent with per-language voice-line coverage gaps). Only categories 0/1/3 appear on real (non-sentinel) slots across the checked samples; 2/4 appear only on sentinel-only slots. Immediately after the slot table: n_real 44-byte parameter records, one per real slot in slot order (self_index — redundant, equals position; volume 0-127 MIDI-style, 127 dominant; two always-zero u32s; pitch f32, always exactly 1.0 in every sample checked; group2 — constant 77 in nearly every file, 117 in SEKISHO.hd, 127 in TUTORIAL.hd, meaning unconfirmed; priority — 5/10/50 observed; two varying fields (0-100 range) whose meaning wasn't pinned down, candidates: delay/pan; flag9 — always 1; flag10 — 0 or 1). lib-hdvoice.c/.h decode the complete structure (header, every slot, every parameter record); several individual field meanings above are inferred from value ranges/constancy rather than proven. Wired into wszst's detection (both GetFileTypeByMagic() and the separate cmd_filetype/FT command path, which had its own independent, magic-heavy dispatch that this format's real samples could coincidentally collide with, e.g. MENU.hd/COMMON.hd matching a loose DSP-ADPCM heuristic before the explicit .hd structural check was added there too) — detection-only, no wszst EXTRACT wiring.
Blitz REV Wii / GameCube / Archive ✅ ❌ Blitz Games "Babel" .rev (Wii) and .gcp (GameCube) packages (SpongeBob SquarePants: Creature from the Krusty Krab, Packages_Rev/ + AudioRev/): CRC-keyed index with names matched by CRC; textures (RGBA8 / RGB5A3 / RGB565 / CI4 / CI8 / CMPR / I4 / I8) → PNG; static and soft-skinned actors → GLB (bind pose, no bones). The House of the Dead: Overkill .rev packages use the same container with a 0x60-byte texture header (RGBA8 / RGB5A3 / CI8 / CMPR, mip chain ignored), also decoded to PNG
Cars GCT / GCG GameCube / Wii / Texture + Model ✅ ❌ Rainbow Studios engine (Disney-Pixar Cars; assets ship loose on GameCube, inside U8 .arc on Wii): .gct CMPR / CI8 textures → PNG; .gcg indexed-strip geometry → GLB with the texture named by the material's .gcm. Multi-object animation .gcg files are recognised but not converted
Konami ZMB Wii / Model ✅ ⛔ Konami Bemani engine skinned character model (Dance Dance Revolution: Winx Club, DATA/files/character/CHR*.bin and DATA/files/accessory/*.bin, big-endian). The whole layout below is ground truth from decompiling the loader in the disc's sys/main.dol (function FUN_800cbab4, found via its "ZDRAW"/"trans"/bone-name string references), not guessed from data, and independently cross-checked byte-for-byte on retail samples. The file is a single "WII\0" wrapper around one or two "ZMB GC\0\0" chunks placed back to back (character files: body + head/hair, attached at the body's mii_head bone; the second chunk has no wrapper of its own). Chunk header offsets +0x18/+0x1c/+0x20 point to a texture-name table (0x20-byte NUL-padded .tga names), a material table (count-only decoded so far; records are not fixed-size — the loader picks a 0x38 or 0x50 byte stride per whole table from an LOD-switch float) and a bone table. Bone records are a fixed 0xa0 bytes: name at +0x00 (matched by the engine against literal bone names, e.g. "trans", "ZDRAW", and a 22-entry known-biped-name table, to find special bones by name rather than index), +0x2c a type field (2 = placeholder/no geometry; 4 = a single named anchor point at +0x70/+0x74/+0x78; otherwise a 3-row bind-pose transform at +0x30..+0x6c and a mesh), submesh count at +0x9a and a submesh-array offset at +0x9c. Submesh records are a fixed 0x40 bytes and own four parallel attribute pools (all chunk-relative offsets, present only if non-null): position f32[3]/12-byte stride at +0x24 (count +0xc), normal f32[3]/12-byte at +0x2c (count +0x14), UV f32[2]/8-byte at +0x30 (the stored "count" at +0x18 is unreliable — size from the highest index actually used instead), colour RGBA8/4-byte at +0x34; +0x0a is the vertex-block count and +0x20 the vertex-block array offset. Vertex-block records are a fixed 0x14 bytes (0x20 with a per-submesh LOD flag at +0x04, adding 3 more optional index arrays not yet decoded): +0x02 a u16 corner count N (observed 3–7, arbitrary N-gons), then four u32 offsets to parallel u32[N] index arrays into the position/normal/UV/colour pools (+0x04/+0x08/+0x0c/+0x10; 0 = attribute absent for this face). Verified end to end: mii_head_acc08.bin's 2 quads decode to two mirrored coplanar quads at ear height with an exact unit-square UV set; mii_head_acc07.bin's 14 N-gon faces (3/4/5/7 corners) reproduce the same geometry found by hand in an earlier pass; CHR040.bin's full 54-bone body exports 2119 vertices / 2901 triangles across both chunks. Bone record +0x94 (previously read only as a -1 "no mesh" sentinel) is a complete parent-bone index array (-1 = root; verified against all 54 bones of CHR040.bin's rig by name, e.g. RightLeg's parent is RightUpLeg), and the local transform's rotation block at +0x30..+0x5c is stored column-major (read as rows, a leg chain composes upward off the hip; transposed, it descends correctly to a foot near y=0). Composing local rotation + translation (+0x60/+0x64/+0x68) up the parent chain gives each bone a world transform, through which the exported .obj now poses every submesh — CHR040.bin's main body mesh (parented near the root) comes out as one coherent, correctly proportioned figure instead of a scattered point cloud. Per-vertex skin weights are decoded but deliberately not applied: submesh+0x10 is a count equal to that submesh's own position-pool count (one entry per vertex) and +0x28 a pointer to that many {influence_count, influence_array} pairs, each influence a NUL-terminated bone name (FUN_800b598c, initially misread as a "closest-bone" match, is a plain strcmp resolving the name against every bone) plus an f32 blend weight at +0x3c — verified real normalized skin data on wb_04_body's submesh 0, where multi-influence vertices' weights sum to 1.0 (e.g. 0.333/Head + 0.667/Spine1). It's a no-op for this decoder's output, though: ZMB carries no animation, so every influence bone's world transform equals its bind transform at the only pose exported, collapsing the skin formula to the same point rigid per-bone attachment already produces — it would only matter for animating the model away from bind pose. Which texture a material binds is now resolved too: one more Gekko-aware decompile (FUN_800cee48, the actual texture-bind path, reached from a second render dispatcher FUN_800ce120) shows material +0x18 is a chunk-relative pointer to a small u32[] of texture indices — one per customization variant (hair/eye colour swaps pick among them via a per-bone override at model+0x34) — with element [0] as the model's authored default. Verified against CHR040.bin before writing any code: material 2's default slot resolves to texture 2 (wb_04_body.tga), material 4's to texture 3 (wb_04_body_a.tga) — exactly the assignment implied by the material-index work below. Submesh +0x00 is confirmed as a material index — verified on CHR040.bin's wb_04_body bone, whose 3 submeshes use materials 2/3/4 of that chunk's 5, no repeats or gaps — so the exported .obj's usemtl groups now reference a generated .mtl with a real map_Kd per resolvable material (the referenced PNG is named after the on-disk .tga stem; ZMB itself doesn't decode texture pixels, so extracting the sibling texture-pack file to match is left to the caller). A character's second (head/hair) chunk is now re-rooted under the body chunk's mii_head bone before posing, so both chunks assemble as one figure — verified on CHR040.bin: the head mesh lands right on top of the body mesh's peak instead of floating in its own disconnected local space. lib-zmb.c/.h implement IsZMB()/DecodeZMB(), wired into GetByMagicFF() (structural detection, since .bin is shared with MPBIN/ATB/etc.) and wszst EXTRACT: writes a sibling .zmb.yaml (textures, material count, full bone table) and a sibling .obj (real fan-triangulated geometry with position/normal/UV, one group per bone/submesh, in each submesh's own local-pool space). Ghidra repro: main.dol's 18 DOL segments flattened to one image at base 0x80004000, language PowerPC:BE:32:default, loader function is the one function (of the 3 total) that cross-references the literal bone-name strings "trans", "ZDRAW" and the 22-entry known-bone-name table
Hyrule Warriors Legends 3DS / Archive ✅ ✅ Split .idx / .bin archive pair
BFSHA Wii U / Switch / Shader Archive ✅ ❌ NintendoWare shader archive (FSHA): per-model option choice values, sampler extras, uniform-block type names; embedded .bnsh sidecars
BNSH Switch / Shader ✅ ❌ NintendoWare binary shader: dual source/binary programs per variation, zlib-compressed stages, per-program MemoryData; stage blobs extract as .bin / .glsl / .zlib.bin sidecars
MPR CMDL / SMDL / WMDL Switch / Model ✅ ❌ Retro Studios static CMDL, skinned SMDL, and world WMDL models (Metroid Prime Remastered, DKCTF)
MPR SKEL Switch / Skeleton ✅ ❌ Retro Studios skeletal hierarchy (Metroid Prime Remastered, DKCTF)
MPR PACK Switch / Archive ✅ ❌ Retro Studios asset container (Metroid Prime Remastered): LE RFRM PACK v1 + TOCC v3, LZSS members
MPR TXTR Switch / Texture ✅ ✅ Retro Studios texture (Metroid Prime Remastered): LE RFRM TXTR v47/51, Tegra detile, BC1-7/ASTC; wimgt ENCODE writes single-mip RGBA8 with a .mpr.txtr destination
MERCURY-ZEN Wii / Scene ✅ ❌ Mercury Meltdown Revolution scene file (.zen): "DAED" magic + fixed header + NUL-terminated authoring source-path string; fields after the path not reverse-engineered
MERCURY-COL Wii / Collision ✅ ❌ Mercury Meltdown Revolution "COL0" collision/camera table (.col/.cam, shared magic+shape); magic/count and each record's leading name decoded, per-record tagged property data not reverse-engineered
MERCURY-PST Wii / Texture ✅ ❌ Mercury Meltdown Revolution texture sheet container (.pst): "TSPA" magic, version 2, CGN platform, entries offset, and 16-byte subtexture records with packed dimensions, format, mipmaps, and offsets; fully verified across all retail samples
MERCURY-MAT Wii / Material ✅ ❌ Mercury Meltdown Revolution material float-record table (.mat): confirmed 16-byte header and fixed 128-byte material parameter records (file_size == 16 + record_count * 128 holds on 100% of samples); fully decoded
MERCURY-NAV Wii / Navigation ✅ ❌ Mercury Meltdown Revolution navigation-mesh table (.nav): confirmed node and edge counts, coordinate vertices, and 16-bit neighbor adjacency records with 0xFFFF sentinels; fully decoded
OCTOMANIA-SEC Wii / Scene ✅ ❌ Octomania "secB" scene/demo container (.sec): confirmed header + 32-byte chunk table with resolved names via a shared string table; per-chunk binary payload data not reverse-engineered
OCTOMANIA-WT Wii / Audio ✅ ❌ Octomania wavetable sample-offset index (.wt): confirmed leading table of big-endian sample byte-offsets into the companion .pcm file; trailing MIDI-program index map not reverse-engineered
SPOOKY-EID Wii / Audio ✅ ❌ I Spy Spooky Mansion sound-event/effect table (.eid): confirmed header, effect table and "VARS" field-record table, decoded byte-for-byte identically across 160 of 161 real samples (one sample is byte-order-swapped and left unrecognized)
SPOOKY-AST Wii / Container ✅ ❌ I Spy Spooky Mansion "SDASSETF" asset-bundle container (.ast): confirmed outer header and top-level chunk table (tag/version/size), walked to EOF for flat sibling-chunk files; nested sub-chunk payloads (models/animations/textures) not reverse-engineered
SPOOKY-SDF Wii / Metadata ✅ ❌ I Spy Spooky Mansion asset-type registry table (.sdf): confirmed "TYPE"-tag record table and its embedded "VARS" field-record tables (only 1 real sample)
SPOOKY-GES Wii / Input ✅ ❌ I Spy Spooky Mansion Wiimote gesture recording (.ges, magic-less): confirmed fixed 10-point x/y/z float32 layout, identical across all 28 real samples
RFF-HXTB Wii / Table ✅ ❌ Rune Factory: Frontier "HX Table" entry directory (.hvt/.Hvt, magic HXTB0001): confirmed header and fully decoded 32-byte-stride entry table (name, hash, data byte-range); per-entity data-blob payload not reverse-engineered
RFF-HXCB Wii / Physics ✅ ❌ Rune Factory: Frontier "HX" collision-box family (.Hvc, magic HXCB0002): confirmed shared 32-byte HX-family header only; post-header record layout not reverse-engineered
RFF-HXAA Wii / Animation ✅ ❌ Rune Factory: Frontier "HX" animation family (.Hvb, magic HXAA0001 or HXAB0001): confirmed shared 32-byte HX-family header only; post-header record layout not reverse-engineered
RFF-HXMB Wii / Map ✅ ❌ Rune Factory: Frontier "HX" map/motion family (.Hvm, magic HXMB0001): confirmed shared 32-byte HX-family header only; post-header record layout not reverse-engineered
RFF-HXHB Wii / Physics ✅ ❌ Rune Factory: Frontier "HX" hull/height family (.Hvh, magic HXHB0001): confirmed shared 32-byte HX-family header only; post-header record layout not reverse-engineered
RFF-HXGB Wii / Geometry ✅ ❌ Rune Factory: Frontier "HX" geometry family (.Hvg, magic HXGB0001): confirmed shared 32-byte HX-family header only, also seen embedded as a leading sub-resource inside RFF-FBTI .Mod sections; post-header record layout not reverse-engineered
RFF-HXTP Wii / Collision ✅ ❌ Rune Factory: Frontier "HX" triangle/points index (.Hmt, magic HXTP0001): confirmed shared 32-byte HX-family header only; post-header record layout not reverse-engineered
RFF-FBTI Wii / Model ✅ ❌ Rune Factory: Frontier "FBTI" model/motion section container (.Mod/.Mot, magic FBTI0001): confirmed header and fully decoded offset/size section table, verified contiguous across all sections and against total file size; per-section payload content (beyond an embedded HX-family header, when present) not reverse-engineered
HTTYD-RWS / HTTYD-MTD Wii / Audio ✅ ❌ DreamWorks How to Train Your Dragon chunk-tree container (.RWS/.mtd): confirmed recursive 12-byte chunk headers (u32 type, u32 size, u32 marker=0x1c020065, all little-endian) walked exactly to EOF across all 118 real .RWS samples plus the single .mtd sample; leaf audio-sample payload contents not reverse-engineered
HTTYD-KRV Wii / Text ✅ ❌ DreamWorks How to Train Your Dragon gzip-wrapped localization string table (.KRV): outer gzip wrapper decoded directly; decompressed payload's leading integer header fields not fully pinned down, but the UTF-16LE NUL-terminated string run that follows is enumerated in full (confirmed readable English/French game text across multiple samples)
MSH (PMsh) Wii / Model ✅ ✅ Monster Games collision mesh
MSBF / MSBP / MSBT Wii/3DS/Wii U/Switch / Text ✅ ✅ Message Studio Binary Text and Flow
MSR 3DS / Archive 🟡 ⛔ Metroid: Samus Returns archive
MVDK DS / Compression ✅ ✅ Mario vs. Donkey Kong Deflate/LZSS
NDS / SRL / DSI DS / ROM Archive ✅ ✅ Nitro ROM pass-through & unpacking
Radical RCF (ATG) Wii / Archive ✅ ❌ 32-byte "ATG CORE CEMENT LIBRARY", version 02 01 01 01, then big-endian table_off (0x3c), table_end_first_part, names_off, names_len, 0, count. Table at 0x3c: count * {u32 name_hash, u32 offset, u32 size} sorted by hash, offsets multiples of 0x800. Names block at names_off: {LE 0x800, LE 0} then, in ascending file-offset order and little-endian, {u32 mtime, u32 0x800, u32 0, u32 name_len, name (backslash paths, NUL included), 3 zero bytes}; the i-th name belongs to the i-th smallest offset (checked: .p3d -> P3D\xff, .blua -> \x1bLua, .rsd -> RSD6, .bik -> BIKi, .bfig -> fig0, in 100% of members). The name-hash function is not identified and is not needed. Some sound.rcf P3D chunks are byte-swapped (\xffD3P). Verified on Crash of the Titans: 7/7 archives tile to the exact file length; default.rcf 1851/1851 members byte-identical after extraction.
NIBM (.aud) Wii / Audio ✅ ❌ NIBM, u32 2, u32 15, length-prefixed type names class AudioData / struct AudioData::Streamed, then a few fields (44100 or 22050 Hz appear) and a complete Ogg Vorbis stream to end of file. Detection: magic + first OggS within 4 KiB + Ogg page walk that must tile the file exactly with at least 3 pages. Verified: 311/311 files of CSI: Hard Evidence (Ogg at offset 126 in each; 22050 Hz mono SFX up to 3 min 44.1 kHz stereo music decode cleanly). Other games using the .aud extension (FIFA, Big Beach Sports 2, Destroy All Humans) are different formats and are declined by the magic check.
Harmonix Ark Wii/PS2/360 / Archive ✅ ❌ main.hdr + main_0.ark, main_1.ark, ... . Header: if the first u32 is not a known version (2-7, 9, 10) it is a key and every following byte is XORed with the low byte of a Park-Miller generator stepped once per byte (k = (k - (k/127773)*127773)*16807 - (k/127773)*2836, +0x7fffffff if <= 0); a second failure means the version is stored complemented and the rest needs another ^0xff. Decrypted (little-endian even on Wii): version, [v>=6: n + 16-byte hashes], part_count, size_count, part sizes (u32; u64 in v4, with a "broken v4" fallback when the last one exceeds 32 bits), [v>=5: part path strings], [6..9: 4-byte hashes], [v>=7: file collections], then for v<=7 a NUL-string blob + index table + entries {offset (i64 for v>=4), file idx, dir idx, size, inflated size}; v>=9 stores full path strings. Offsets are global across the parts. Member paths like ../../system/run/... are folded to system/run/... (82 of 3418 on the AC/DC disc). Verified on real data: v4 AC/DC Live Track Pack (all 3418 members byte-identical to the ark, sizes sum to the ark length exactly) and v5 Beatles Rock Band (7577 members, sizes sum to the ten listed parts exactly; parts not extracted); v6+ and inflated members are ported from Mackiloha but untested here.
XPK Wii / Archive ✅ ❌ Exient .pak (Angry Birds Star Wars), all big-endian: u32 0x58504b01, u32 version (2/3/4/9 seen, same layout), u32 files (file entries only), u32 names_size; 32-byte entries from 0x50: {0, name_off, size, offset, flags, mtime, csize, 0}. flags 1 = zlib (csize bytes at offset), 0 = stored (size bytes, csize 0). Directory records (size 0) come first and give {offset = first child entry index, csize = child count}; entries outside any range are root files. The entry count is not stored: the first file's data begins exactly where the name table ends, so entries = (min file offset - names_size - 0x50) / 32, which is also the geometry check. Verified: 29/322/409/30 entries in the scripts/levels/images/extras packs, all zlib members inflate to their exact size, entry counts equal the header counts once directory rows are added. Members are Lua scripts, .xgt textures and .dat sprite sheets (not decoded here).
Artefacts MAP / GAM Wii / Level database 🟡 ❌ Same FAAFFAAF stream as the .cfg/.gam/.loc files of Diabolik (see lib-diabolik.h), big-endian: u32 0xFAAFFAAF, u32 8, then one outermost section: u32 0xBBBBBBBB, u32 end (file offset of the matching 0xBEBEBEBE closing tag), u32 version, payload (raw fields plus nested sections, sections 4-aligned), closing tag; file ends 0xFEEFFEEF. Recovered from the game's own reader in main.dol (0xFBBFFBBF is the byte-swapped twin). Objects are polymorphic (class id plus a section written by that class' serializer), so field meaning depends on the class. Textures: name section (u32 20 + 20 ASCII bytes), an 8-byte record fmt, 0, 1, u16 width, u16 height, 0, then a leaf section u8 1, u32 mips, u32 size, u32 0 + GX CMPR mip chain (largest first, min one 8x8 tile per level) + 3 pad bytes; chain sizes matched on all 304 textures of the 25 Boot Camp Academy maps. Skinned meshes (FUN_800f90a8/FUN_800f8a3c in the game): leaf u8 1, u32 V + V x 16-byte vertices (s16 x,y,z /4096, Z up, model space; u8 bone0, bone1; s8 nx,ny,nz /64; 5 skin bytes), u32 T + T x u16 u,v /1024, u32 P + P x 6-byte positions and u32 C + C x 4 bytes (the shadow/outline pass), then 32 slots of u8 n x {u16 first, u16 count, u32 tris, u16, u32 dlsize, display list, 8 bytes bone palette}, u8 n x {same without the palette}, u8 n x {u32 k, u32, k x 8 bytes}. The first kind's display lists are 0x98 strips (0x00 NOPs) of {u16 pos, u16 nrm, u16 tex} vertices, position/normal relative to first; first/count tile V exactly and the triangle counts match (drill sergeant: 1883 vertices, 3479 strip triangles, 5 slots). Objects and references: the game keeps a class table (FUN_80006960(…, id, parent, factory, …) registers ~430 classes; named groups include Textures 0xa, Meshes 0xe, Materials 0x10, MaterialSets 0x23, Animations 0x2e, Skins 0x45, Maps 0x65); an object reference in the stream is s16 class, s16 n, u64 uid, [u32 size if n>0], u8 flag, flag 1 meaning the object's body section follows immediately (otherwise it names an object defined earlier, possibly in the shared .gam). A model object holds a material set (class 0x25: u32 count + count references, in slot order); slot i of the mesh uses entry i. A material (classes 0x49/0x1b) holds its textures as class-12 references, the first being the diffuse map; a texture body is the object described above. .gam (class 0x64, 7 MB in Boot Camp Academy) is the same stream. Skeleton: the mesh object (class 0x1c, FUN_800bf004, version 6-8) holds, after its base section, five u16, then u32 n + n x 80-byte bones {s32 parent, f32 pos[3], f32 rot[3][3], name28} (parents first; local rotation is the transpose of the stored matrix, world = parent * [R^T
Blue Castle BIG Wii / Archive ✅ ❌ The Bigs / The Bigs 2 .big, all little-endian: u32 0x01020304, u32 data_start, u32 file_size (== real size), u32 count, u32 table (0x18), u32 names; 20-byte entries {name_off, size, offset, kind, 0} (kind 4/256 nested archive, 32 model blob, 2048 aligned audio; never compressed); NUL-separated names at names. Audio members .dspi hold N identical-shaped 0x60-byte DSP headers followed by the N channel bodies, each padded to 8 bytes (last unpadded); the total size rule 0x60*N + N*pad8(ceil(nibbles/2)) matched all 4264 members (3708 stereo, 556 mono). Announcer .pcm and .sfx/.bcd members are not decoded.
Natsume BIN Wii / Archive ✅ ❌ Harvest Moon .bin, little-endian: "BIN\0", u16 1, u16 1, u32 count, u32 0, then count x {u32 offset, u32 size, u32 0, u32 0} from 0x10. Members plain.
Town Factory PCKG Wii / Archive ✅ ❌ Little King's Story, big-endian: "PCKG" + 28 zero bytes, then from 0x20 entries {u32 next (0 = last), u32 size, u32 data_offset (0x20), char[20] name, payload}; entries padded to 0x20.
Neversoft GH PAK / IMG Wii / Archive ✅ ❌ Guitar Hero (Wii) .pak.ngc, big-endian: 0x20-byte headers {u32 type crc, u32 offset, u32 size, u32 crc, 0, u32 name crc, 0, u32 flags} (flag 0x20 = 160-byte path follows), ended by an all-zero type/offset/size header. .img.ngc: 04 20, log2 w/h at 0x0a/0x0b, GX format at 0x0d (14 = CMPR), size at 0x10, data at 0x20.
WSI Wii / Audio ✅ ❌ u32 start (0x20), u32 channels (2), then block sets of one block per channel (channel 1 first): u32 size, u32 1, u32 channel (1-based), u32 0 + payload. The first block of each channel starts its payload with a standard 0x60-byte DSP header (nsamples, nibbles, rate, loop, coefficients, history); the rest is ADPCM frames. Concatenating each channel's payloads gives a plain .dsp. A chain-walk probe (equal block sizes per set, alternating channel numbers, blocks tiling the file exactly) gates the claim. Verified on the Aladdin Magic Racer streams (decoded sample count equals the header's, audio smooth: mean|dx|/mean|x| ≈ 0.24).
DSi TAD (.tad) DSi / Title package ✅ ❌ Wii-WAD-style container: 0x20 header (u32 0x20, type "Is", u16 ver, then BE sizes of cert chain, CRL, ticket, TMD, data, footer), each section padded to 0x40. Ticket body follows a 0x140-byte RSA-2048 signature block: wrapped title key at body+0x7f, title ID at +0x9c. TMD body: title ID +0x4c, content count +0x9e, boot index +0xa0, 0x24-byte content records {u32 id, u16 index, u16 type, u64 size, sha1[20]} from +0xa4. Title key = AES-128-CBC-decrypt(wrapped, DSi common key, IV = title ID + 8 zeros); content = AES-128-CBC(title key, IV = {index BE u16, 14 zeros}) rounded up to 16. The right common key (retail AF1BF516…, debug A2FDDDF2…, Wii debug A1604A6A…) is found by matching the decrypted content's SHA-1 to the TMD, so a wrong guess is never emitted. Verified end to end on a real DSiWare title (real TMD/content/title key from the No-Intro CDN set; the ticket was forged since none is distributed). Signatures unchecked; encrypt/repack not implemented.
DSiWare export (.bin) DSi / Title package ✅ ❌ SD-card export per GBATEK/DSiBrew, every part an ES block (data + 0x20 metablock: 16-byte CCM MAC + 16 bytes holding marker 0x3a, size and the nonce): banner 0x0000+0x4000, header 0x4020+0xb4 ("4ANT", sizes at 0x28: tmd, app, 7 unused, public.sav, banner.sav), footer 0x40f4+0x440 (SHA-1s at 0x00/0x14/0x28/0x3c…0xdc/0xf0, AP cert 0x140, TW cert 0x2c0 whose key name ends in the 16-hex-digit ConsoleID), then the parts back to back at 0x4554. Fixed key 3DA3EA33…; console key = F_XY(keyX = 4E00004A 4A00004E (id_lo ^ C80C4B72) id_hi, keyY = CCFCA703…) with F_XY(x,y) = ((C + (x^y)) <<< 42), C = 1A4F3E79 2A680F5F 29590258 FFFEFB4E, all little-endian; each part is tried under both keys and the MAC decides. Crypto cross-checked against a build of WinterMute/twltool (fixed and console-key blocks decrypt identically); no retail SD dump was available.
DSi modcrypt DSi / ROM layer ✅ ❌ AES-CTR over up to two SRL regions (0x220/0x224, 0x228/0x22c), active when header 0x1c bit 1 is set, IVs at 0x300 and 0x314. Retail key = F_XY("Nintendo" + gamecode + gamecode reversed, header[0x350..]), debug (0x1c bit 2 or 0x1bf bit 7) = header[0..16]. The counter and keystream are byte-reversed relative to standard CTR. Output clears the flag and rewrites the CRC16 at 0x15e when it was valid before, since twltool's flag-preserving output would re-encrypt on a second pass. Verified on a real title: both regions go from ~7.99 to ~5.9 bits/byte entropy, header CRC valid before and after.
NANR / NCER / NCGR / NCLR DS / 2D Graphics ✅ ✅ Nitro 2D cell, sprites, palettes
NCCARC DS / Archive ✅ ✅ WarioWare: Touched! container
NLG DICT 3DS / Switch / Archive ✅ ❌ Next Level Games dictionary archive (Metroid Prime: Federation Force, Luigi's Mansion 2 HD, Luigi's Mansion 3, Mario Strikers: Battle League Football). Typed chunk pass: LM2/LM3/Federation Force models, textures, skeletons, animations, scripts, NLOC/font/config
FEDMODEL / FEDSKEL Multi / Model ✅ ❌ Next Level Games model/skeleton containers (extractor intermediates, versions 1..3) → GLB
FEDTEX Multi / Texture ✅ ❌ Next Level Games texture container (extractor intermediate: PICA / Switch RGBA8/BCn/ASTC) → PNG
SANIM Wii / Animation ✅ ❌ Mario Strikers skeleton animation stream → text dump
NSBMD / NSBTX DS / 3D Graphics ✅ ✅ Nitro 3D models and textures
NUD Wii U / 3DS / Model ✅ ✅ Bandai Namco 3D model container (Smash 4 NDP3/NDWU and Pokkén NDWD multi-mesh)
NUMATB Switch / Material ✅ ❌ Bandai Namco SSBH material container (Smash Ultimate): text manifest plus MatLab-dialect MaterialLibrary XML
NUANMB Switch / Animation ✅ ❌ Bandai Namco SSBH skeletal/material animation (Smash Ultimate): group/node/track structure plus decoded Direct/Constant/Compressed keyframe payloads
NUMSHB Switch / Model ✅ ❌ Bandai Namco SSBH 3D mesh model (Smash Ultimate)
TTMODEL Multi / Model ✅ ❌ TT Games NTT engine model (LEGO Star Wars: The Skywalker Saga, .model → GLB)
SHARC / SHARCFB Wii U / Switch / Shader Archive ✅ ✅ NintendoWare shader source and binary archive (SHARC v10-12 round-trips; Wii U SHARCFB is compiled from GSH)
VFXB Wii U / Switch / Effect Archive ✅ ❌ NintendoWare particle effect binary archive
NUT Wii U / 3DS / Texture ✅ ❌ Bandai Namco texture package (Smash 4)
NUTEXB Switch / Texture ✅ ✅ Super Smash Bros. Ultimate texture container
PAC Wii / Archive ✅ ✅ Super Smash Bros. Brawl archive
PKG (Barking Lizards) Wii / Archive ✅ ❌ Nickelodeon: The Naked Brothers Band - The Video Game script/data archive (pkg\0): 16-byte header + 32-byte stats block, then a name(32)+fields(20) table (packed index/type word, decompressed size, compressed size, absolute offset, reserved); type 0 members are stored raw, type 1 are full standard gzip streams; content-sniffed by magic (not extension) since it shares the plain .pkg extension with an unrelated existing format; decode-only, verified against all 256 retail .pkg files byte-for-byte
PLT0 Wii / Animation ✅ ✅ NW4R palette animation
PRC Switch / Param ✅ ❌ Smash Ultimate "paracobn" parameter binary to ParamXML-dialect XML (bool/sbyte/byte/short/ushort/int/uint/float/hash40/string/list/struct); Smash 4 era variants recognised
PSDK Wii / Compression ✅ ✅ Prosonic SDK LZSS container
QuickLZ Compression ✅ ✅ QLZ 1.20 and 1.4.0 streams
RARC GameCube / Wii / Archive ✅ ✅ Nintendo standard resource archive
RFL_Res.dat Wii/3DS/Wii U / Mii Database ✅ ✅ Revolution Face Library resource container
RNC1 / RNC2 Compression ✅ ✅ ProPack compression
RSO Wii / Code Module ✅ ❌ Nintendo relocatable PowerPC module (gamelogic.rso, Skylanders: SuperChargers Racing): no magic, detected structurally (zero module-list pointers, bounds-checked section table); raw code/data sections extracted, BSS section (zero on-disk offset) skipped; extract-only, relocation/linking out of scope
RSEQ / CSEQ / FSEQ / SSEQ Wii/3DS/Wii U/DS / Sequence ✅ ✅ Music sequence MML / MIDI
SDAT DS / Sound Archive ✅ ✅ Nitro Sound Archive
SMDH 3DS / Metadata ✅ ✅ Application icon & title metadata
SSZL / VCRA Wii / Compression & Archive ✅ ✅ Namco Museum Remix container
TEX Wii / Texture ✅ ✅ Monster Games GX texture
TMPK Wii U / Archive ✅ ✅ The Legend of Zelda: Twilight Princess HD flat archive. Verified against the retail content/Shaders.pack.gz: a plain gzip stream wraps a 10,402,512-byte TMPK archive that extracts to exactly 1568 non-empty members
WARC Wii U / Archive ✅ ✅ Game & Wario flat archive
WUD / WUX Wii U / Disc Image ✅ ✅ Wii U disc extraction & compression
XTX Switch / Texture ✅ ❌ Nintendo Switch intermediate texture container (DFvN/HBvN, Tegra block-linear RGBA8/BC1-BC7/ASTC; synthetic fixture, no retail sample)
XMB Switch / Metadata ✅ ❌ Smash XMB material/LOD metadata: node/property tables to XMBDec-mapping XML
BMG / CBMG GameCube / Wii / DS / Message Binary ✅ ✅ Nintendo Binary Message format (MESGbmg1 big-endian on GC/Wii, GSEM1gmb little-endian on DS such as Custom Robo Arena .cbmg / .mlz). Decodes text messages, Shift-JIS / UTF-8 / UTF-16 strings, and attributes cleanly via wbmgt decode / wszst extract --decode, with 100% byte-for-byte round-trip re-encoding via wbmgt encode.
PROCYON-SWD DS / Sound Wave Data ✅ ❌ Procyon Studio Sound Wave Data (swdl / .swd, Professor Layton and the Diabolical Box, Inazuma Eleven, Pokémon Mystery Dungeon: Explorers of Sky); contains wavi, prgi, kgrp, pcmd chunks with Procyon ADPCM and PCM sample banks. Detected and classified natively via wszst filetype.
PROCYON-SMD DS / MIDI Song Data ✅ ❌ Procyon Studio Standard MIDI Song Data (smdl / .smd, Professor Layton and the Diabolical Box, Pokémon Mystery Dungeon: Explorers of Sky); contains song parameters and 4-byte-aligned track sequences (trk ). Detected and classified natively via wszst filetype.
CAMELOT-MDLR DS / Model Definition ✅ ❌ Camelot Software Planning Model/Map Object Definition (MDLR / .mdlr, Golden Sun: Dark Dawn); specifies actor model names, animation sequences (ANMC), collision bindings (COLL pointing to .col), light controls (LCTR), and render triggers (REND). Detected and classified natively via wszst filetype.
TREASURE-MRG DS / Multi-Resource Archive ✅ ✅ Treasure Co., Ltd. Nintendo DS Multi-Resource Archive (.mrg, Bleach: Dark Souls, Bleach: The Blade of Fate, Bangai-O Spirits); contains consecutive resources (Treasure 2D graphics .bg4/.bg8, palettes, hitboxes, scripts). Detected and extracted natively via wszst extract.
CAPCOM-MODS DS / Animation Stream ✅ ❌ Capcom animation stream container (.mods / MODSN3, Ghost Trick: Phantom Detective); contains frame metadata, block stride, and trailer keyframe index table. Detected and classified natively via wszst filetype.
CAPCOM-GML1 DS / Message Script Binary ✅ ❌ Capcom localized Game Message / Script Binary (.xml.bin / 1LMG, Ghost Trick: Phantom Detective); contains bytecode instructions, localized text blocks, and key-to-offset dictionary tables. Detected and classified natively via wszst filetype.
ATLUS-NDX DS/3DS / Directory Index Archive ✅ ✅ Atlus Nintendo DS / 3DS Archive System (.ndx, companion .idx and .bin, Radiant Historia, Shin Megami Tensei: Strange Journey, Devil Survivor, Etrian Odyssey); hierarchical directory index with companion hash lookup table and packed binary payload. Fully detected and extracted natively via wszst extract.
ARTE-TEX DS / Texture Container ✅ ✅ ArtePiazza Nintendo DS Texture Container (.tex, TextureObject\0, TextureData\0, Texture Data\0, Dragon Quest IV: Chapters of the Chosen, Dragon Quest V: Hand of the Heavenly Bride, Dragon Quest VI: Realms of Revelation); stores 4-bpp (fmt 3), 8-bpp (fmt 4), A3I5 (fmt 1), and A5I3 (fmt 6) raster textures with RGB555 palettes. Fully detected and decoded natively to .png via wszst extract.
Yay0 / Yaz0 Compression ✅ ✅ Nintendo standard LZ77 compression