Layout

u32 count
u32 (header word, purpose unknown)
u32 type_size_0   u32 data_offset_0
u32 type_size_1   u32 data_offset_1
...

Each descriptor pair is (type_size, data_offset) where data_offset is byte-relative to the buffer start, and type_size packs the asset-type byte (the 8-bit tag saying TIM / TMD / MES / …) in the high byte.

How FUN_80020224 is reached

Static analysis of SCUS_942.54 (the game's main executable) finds zero cross-references to the walker - which looks like dead code until you follow the overlays. FUN_801D6704 (the town overlay's MAIN_INIT) calls FUN_80020224 at 0x801D6B0C with a0 = 0. The result is stored at 0x80087AF8. So the format IS exercised by retail gameplay - through a runtime overlay rather than the executable's static call graph. (This "zero static callers but alive via overlay" pattern recurs across the whole codebase.)

Strict-scan against the disc

Strictly scanning all 1233 PROT entries (the numbered slots of PROT.DAT, the disc's main asset archive) against this format finds zero hits. That's consistent with both "format isn't on disc as a top-level entry" and "format is on disc but indexed differently" (e.g., embedded inside a scene asset table or a compressed payload). The parser is left in place for when a real on-disc consumer surfaces.

Note on naming

The Rust function is named parse_player_lzs for historical reasons - the format was first encountered while investigating player.lzs chains. The format itself isn't player-specific.

See also