Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ROB File Format

Binary container format. Holds multiple 3D model segments — either embedded inline or as references to external .3DC files.

ROB stores model geometry buckets, not per-instance scene placement transforms. World/object placement comes from scene files (RGM), which reference these models.

Overall Structure

[Header — 20 bytes]
[Segment 0 — 80-byte header + data]
[Segment 1 — 80-byte header + data]
...
[Segment N-1]
[Footer — 4 bytes: "END "]

Some fields use big-endian encoding (a remnant of the original Sega Saturn development), while most use little-endian. Endianness is noted per field.

Header (20 bytes)

OffsetSizeTypeEndianNameDescription
0x004[u8; 4]—magic"OARC"; exact expansion unknown.
0x044u32BEunused_04Always 4. Unused at runtime; the engine reads the file but never dereferences or tests this field.
0x084u32LEnum_segmentsNumber of segments.
0x0C4[u8; 4]—magic2"OARD"; exact expansion unknown.
0x104u32BEpayload_sizeFile size minus 24 (= file size - 20-byte header - 4-byte footer).

Segment Header (80 bytes)

Each segment has a fixed 80-byte header followed by data_size bytes of payload.

OffsetSizeTypeEndianNameDescription
0x004u32LEtotal_sizeData size + 80 (total segment size including header).
0x048[u8; 8]—nameSegment name, ASCII null-padded. Model name or external .3DC filename stem.
0x0C2u16LEsegment_type0 = embedded 3D data, 512 = external .3DC reference. See below.
0x0E2u16LEsegment_flagsRender mode flags. Only the high byte (at file offset 0x0F) is used at runtime — it becomes a render mode selector. A value of 0 defaults to 0xFF (normal rendering). See Segment Flags below.
0x101u8—segment_attribsPer-segment attribute flags. Only this single byte is read at runtime. Bit 1 (0x02) triggers texture pre-loading. Value 0x40 marks special objects (inventory items, shop objects). See Segment Attributes below.
0x111u8—collision_flagsCopied into static-object runtime collision flags. See Collision flags.
0x121u8—reserved_12Zero in all 4,761 installed segments.
0x131u8—face_count_lowBuild tool artifact: face_count mod 256.
0x144u32BEunused_14Unused — never read at runtime. Most commonly 1 (3,690 segments), but other values exist.
0x184u32—reserved_18Always 0.
0x1C4u32LEbbox_extent_xBounding box total X extent.
0x204u32LEbbox_extent_yBounding box total Y extent.
0x244u32LEbbox_extent_zBounding box total Z extent.
0x284u32—reserved_28Always 0.
0x2C4u32—reserved_2CAlways 0.
0x304u32—reserved_30Always 0.
0x344u32LEbbox_positive_xPositive X extent from center.
0x384u32LEbbox_positive_yPositive Y extent from center.
0x3C4u32LEbbox_positive_zPositive Z extent from center.
0x404u32LEbbox_negative_xNegative X extent from center.
0x444u32LEbbox_negative_yNegative Y extent from center.
0x484u32LEbbox_negative_zNegative Z extent from center.
0x4C4u32LEdata_sizeByte count of the data payload that follows. 0 for external references.

Bounding Box Invariant

bbox_extent == bbox_positive + bbox_negative for all three axes.

For symmetric models: bbox_positive == bbox_negative (center at origin). For asymmetric models, the difference encodes the center offset.

Segment Types

TypeDescription
0Embedded 3D model data. Payload is a complete 3D file (v5.0 format).
256Embedded 3D model data (menu-specific). Only in MENU.ROB. Structurally identical to type 0 — payload is a complete 3D file. Uses version v4.0.
512External reference. name is the .3DC filename stem (e.g. "CYRSA001" → CYRSA001.3DC). data_size is 0.

Segment Flags (0x0E)

The engine reads only the high byte (file offset 0x0F) of this u16 field. The low byte is always 0x00 and is ignored. The high byte is stored as a render mode selector in the model’s internal data — a value of 0 defaults to 0xFF (standard rendering).

ValueHigh byteNamesRender mode
0x00000x00 → 0xFF(all normal)Standard (default)
0x8C000x8CDR_WA01, DR_WA02, LH_MIRRTransparency / mirror
0xC8000xC8WATERWATWater
0x80000x80VR_OHTStored as render-mode metadata
0x5A000x5ABEAMA001Beam / light effect

Segment Attributes (0x10)

A single byte of per-segment attribute flags.

ValueSegmentsMeaning
0x00(all normal)No special attributes
0x02PALMTR01–04 (CAVERNS, EXTPALAC, ISLAND)Texture pre-load trigger (bit 1). Engine calls a texture pre-caching function for all face textures in this segment.
0x40SS_OBJ01–06, IGRING, IWATER1 (shop items, inventory)Special object flag (bit 6). Stored as model metadata.

In the Glide renderer, bit 0 (0x01) selects point minification and magnification for queued model draws. When clear, both use bilinear filtering. Archive loading copies the segment attribute byte into model metadata, and ordinary model submission copies it into the instance draw flags. The queued draw pass restores bilinear filtering when it finishes.

Bit 1 (0x02) also enables chroma-key rejection when binding a model face’s texture. With this bit clear, that binding disables chroma keying. The key comes from the texture’s stored key color. This is separate from the archive loader’s texture pre-loading use of the same bit.

Runtime archive selection

Model lookup searches the active primary archive first, then the active world archive. Within each archive it follows stored segment order and returns the first matching name. It does not search every installed ROB archive. Loading a world archive replaces the previous world archive registry. The world loader takes the configured map filename and replaces its extension with ROB in the configured art directory.

The ISLAND world uses FXART\ISLAND.ROB. Its ordinary in-world registry has no primary archive. The names BARREL, BASKET02, LANTERN4, LANTHOL1, MKCARP1 and MKCRATE1 resolve to this world archive even though other installed archives contain different payloads under the same names.

Collision flags (0x11)

Static object loading copies this byte from the named ROB segment into the instance’s runtime collision flags. In collision candidate selection, bit 0x02 excludes the static instance. Otherwise, bit 0x01 routes it to the separate actor-style candidate list; a clear bit selects the model-face list.

Across 4,761 segments in 31 installed ROB archives, the byte values are:

ValueCount
0x004,726
0x0128
0x025
0x041
0x081

In ISLAND, PLANT000, PLANT001, and PLANT002 use 0x02; BARREL, BASKET01, and BASKET02 use 0x01. See player collision.

Segment Data

For segment_type == 0 (embedded): the data payload is a complete 3D model file starting with its own 64-byte header. Parse with the standard 3D parser.

For segment_type == 256 (menu-specific embedded): same as type 0 — payload is a complete 3D model file. Parse identically. See MENU.ROB Segments below.

For segment_type == 512 (external reference): no data payload. Load the referenced .3DC file from the asset directory using name as the filename stem. External references are exclusively .3DC (animated models) — static .3D geometry is always embedded inline as type 0 segments, never referenced externally.

MENU.ROB is the only ROB file containing type 256 segments. It holds 3D models used for the game’s menu screens.

#NameTypeSizeVersionNotes
0MENUA00125679,328v4.0Menu character model (also exists as standalone MENUA001.3DC in /fxart)
1MB_TABLE0886v5.0Small prop
2MB_PG0125642,208v4.0Menu page model
3MB_PG0225642,208v4.0Menu page model (same size as PG01)
4MB_PG0325642,208v4.0Menu page model (same size as PG01)
5SCROLL08,136v5.0Scroll decoration prop

The three MB_PG segments have the four-byte version v4.0; the following byte belongs to the vertex count, not the version.

4-byte ASCII marker: "END " (with trailing space). Always present.

External References