When an outer .ofs container
(RESO) has an entry
with type_tag == 'szl' (stored reversed as 'lzs'
in the RESO TOC), the payload is an SZL container. SZL is Konami's
proprietary compression wrapper: a fixed 16-byte header followed by a
standard NDS LZ11
bitstream. Decompressing the LZ11 layer yields standard Nitro graphics
resources (NCGR, NCLR, NCER, NANR, NSCR) β typically a complete sprite set
packed as a RESO variant=0 sub-container.
The name "SZL" appears to be internal Konami tooling nomenclature. The
"1.00" version string in the header and the 'sfo'
tag in the outer LZS wrapper both suggest a versioned asset pipeline format
that Konami used across multiple DS titles.
Header layout
| Offset | Size | Field | Value |
|---|---|---|---|
+0x00 | 4 | version magic | "1.00" (ASCII) |
+0x04 | 12 | padding | null bytes |
+0x10 | 1 | LZ11 marker | 0x11 (standard NDS LZ11) |
+0x11 | 3 | decompressed size | uint24 LE |
+0x14 | varies | LZ11 bitstream | standard NDS LZ11 encoding |
Total header overhead: 16 bytes before the LZ11 data begins.
Decompressed contents
The decompressed payload is always a standard Nitro RESO variant=0 container holding some combination of:
- NCGR β tile graphics
- NCLR β palette
- NCER β cell/sprite layout
- NANR β animation sequences
- NSCR β background screen maps
These are standard NDS SDK resources that any Nitro-format tool can edit once decompressed.
Where SZL appears in the game
SZL entries are widespread β they appear in OFS containers across many different game systems:
| Container | SZL entries | Content |
|---|---|---|
coordinate/crditype.ofs | 20 | Clothing type sprites |
npc/NpcDataOfs.ofs | 252 | Per-NPC personality data (not just sprites β contains mixed data) |
npcstamp/npcstamp.ofs | 140 | Personality stamp icons for rumor board |
ucc/uccact_txt.ofs | 17 | UCC crafting text sprites |
ucc/uccact_gra.ofs | 16 | UCC crafting graphic sprites |
ucc/brush/brush_2d.ofs | 1 | Paint brush UI sprite |
ucc/dishup/dishup_2d.ofs | 2 | Dish-up cooking UI sprites |
2d/neticon.ofs | 2 | Network/wireless icons |
charmake/chmk_mod.ofs | 2 | Character maker model UI |
charmake/chmk_mot.ofs | 2 | Character maker motion UI |
magazine/Trophy.ofs | several | Trophy display sprites |
ucc/act/*.ofs | various | Per-action crafting sprites |
Total: 161 SZL entries successfully decompressed and rendered across the game.
Special case: npcstamp.ofs
The 140 SZL-packed entries in npcstamp.ofs decompress to bare
NCGR (tile graphic only, no palette or cell layout). The palette and NCER
come from a sibling file β npcstpcmn.lzs (an
RESC container with
NCER at offset 0xa0 and NCLR at offset 0x110).
This is the only known case where SZL entries don't contain a
self-sufficient sprite set.
Relationship to the LZS outer wrapper
Don't confuse SZL with LZS. They are different layers:
- LZS (
.lzsfiles) β Konami's outer file-level compression wrapper (16-byte header with"1.00"magic and'sfo'tag, followed by LZ11). Used on standalone compressed files. - SZL β appears as RESO entries inside
.ofscontainers. Same concept (version header + LZ11) but used at the per-entry level within a container rather than at the file level.
Both use the "1.00" version string and LZ11 compression,
suggesting they come from the same Konami asset pipeline. The distinction is
purely about where they appear: SZL is entry-level (inside a RESO), LZS is
file-level (the .lzs extension on disk).
Decoding
Python pseudocode for SZL decompression:
def decode_szl(entry_data):
assert entry_data[0:4] == b"1.00" # version check
# Skip 16-byte header, decompress LZ11 starting at offset 0x10
assert entry_data[0x10] == 0x11 # LZ11 marker
decompressed_size = int.from_bytes(entry_data[0x11:0x14], 'little')
return lz11_decompress(entry_data[0x10:], decompressed_size)
The lz11_decompress function is the same standard NDS LZ11
decoder documented on the
LZ11 page. The only
SZL-specific work is skipping the 16-byte version header before handing the
stream to the LZ11 decoder.