Used by both .ofs (raw) and .lzs (post-LZ11)
files. Reference parser: src/archive/reso.py.
Header (16 bytes)
| Offset | Size | Type | Field | Value |
|---|---|---|---|---|
0x00 | 4 | char[4] | magic | "RESO" = 52 45 53 4F |
0x04 | 4 | u32 LE | file_count | Number of TOC entries |
0x08 | 4 | char[4] | version | Typically "1.21" = 31 2E 32 31 |
0x0C | 4 | u32 LE | variant | 0 (type-tagged, 16-B stride) or 1 (simple, 8-B stride) |
TOC entry β variant 0 (16 bytes)
Used by configuration-style containers like global.lzs, title_pack.ofs, sprite atlases.
| Offset | Size | Type | Field |
|---|---|---|---|
+0x00 | 4 | u32 LE | unk (often 0; in tad entries holds metadata) |
+0x04 | 4 | char[4] | type_tag (reversed ASCII β see below) |
+0x08 | 4 | u32 LE | length (payload bytes; 0 = empty slot) |
+0x0C | 4 | u32 LE | data_offset (absolute offset within the RESO file) |
TOC entry β variant 1 (8 bytes)
Used by message files (data/message/**/*.ofs), talkstart/*.ofs, and most plain data containers.
| Offset | Size | Type | Field |
|---|---|---|---|
+0x00 | 4 | u32 LE | length |
+0x04 | 4 | u32 LE | data_offset |
Type tag values (variant 0)
The 4-byte type_tag is reversed ASCII. Reverse to recover the
Nitro / Konami magic identifier.
| Stored bytes | Reversed | Magic | Description | Count in corpus |
|---|---|---|---|---|
rgcn | NCGR | RGCN | Tile graphics | 4,337 |
rlcn | NCLR | RLCN | Palette | 2,600 |
recn | NCER | RECN | Cell / OAM definition | 1,553 |
rcsn | NSCR | RCSN | BG screen / tilemap | 1,128 |
rnan | NANR | RNAN | Animation | 225 |
rtfn | NFTR | RTFN | Bitmap font | 1 |
ncbr | NCBR | RBCN | Linear/bitmap NCGR variant | 1 |
szl | lzs | β | Nested LZ11-compressed sub-RESO | 34,464 |
sfo | ofs | β | Nested RESO (uncompressed) | 333 |
tad | dat | β | Konami widget table (see Konami extensions) | 694 |
nib | bin | β | Per-container binary blob (variable schema) | 251 |
tbsn | nsbt | BTX0 | 3D texture pack (NSBTX) | 8,773 |
mbsn | nsbm | BMD0 | 3D model (NSBMD) | 297 |
cbsn | nsbc | BCA0 | 3D animation (NSBCA) | 35 |
ymd | dmy | β | Dummy / placeholder script blob | 15,712 |
Payload region
- Payloads start at
0x10 + file_count Γ stride(no special separator). - Re-emit aligns each payload to a 16-byte boundary
(
pad = (16 β len % 16) % 16; pad bytes are0x00). - Empty TOC slots have
length=0anddata_offset=0. - Multiple TOC entries may share one
(length, data_offset)β see shared payloads.
Annotated hex dump β header + first 4 TOC entries
data/message/msg00/00/msg00000.ofs (variant 1, 100 entries):
offs bytes meaning
---- -------------------------------------------------- --------------------------------
0000 52 45 53 4F magic = "RESO"
0004 64 00 00 00 file_count = 100
0008 31 2E 32 31 version = "1.21"
000C 01 00 00 00 variant = 1 (8-B stride TOC)
0010 08 00 00 00 30 03 00 00 entry[0]: len=8, off=0x0330
0018 40 01 00 00 38 03 00 00 entry[1]: len=320, off=0x0338
0020 EA 00 00 00 78 04 00 00 entry[2]: len=234, off=0x0478
0028 20 01 00 00 62 05 00 00 entry[3]: len=288, off=0x0562
... TOC continues for 96 more entries (100*8 = 800 bytes)
0330 ... payload region begins Variant-0 example: title_pack.ofs
0000 52 45 53 4F 05 00 00 00 31 2E 32 31 00 00 00 00 header, file_count=5, variant=0
0010 00 00 00 00 6C 7A 73 00 00 F4 00 00 60 00 00 00 entry[0]: unk=0, tag="szl",
len=0xF400 (62464), off=0x60
0020 00 00 00 00 6C 7A 73 00 C0 5E 01 00 60 F4 00 00 entry[1]: tag="szl", len=89792
0030 ... 3 more 16-B entries ...
0060 11 10 27 00 ... LZ11 stream of inner RESO ... payload[0] starts at 0x60 Decoder reference
# src/archive/reso.py
def parse(data: bytes) -> list[ResoEntry]:
h = parse_header(data)
stride = 0x10 if h.variant == 0 else 0x08
entries = []
for i in range(h.file_count):
off = 0x10 + i * stride
if h.variant == 0:
unk = u32(data, off + 0)
type_tag = data[off+4:off+8].decode("ascii") # reversed
length = u32(data, off + 8)
data_offset = u32(data, off + 12)
else:
length = u32(data, off + 0)
data_offset = u32(data, off + 4)
type_tag = ""
entries.append(ResoEntry(i, type_tag, length, data_offset, unk))
return entries Cross-references
- LZ11 β outer compression wrapper for
.lzsfiles - Nitro graphics β formats for
rgcn/rlcn/recn/rcsn/rnan - Konami extensions β
tad/nib/sfo