summon.dat / readef.DAT streaming slots Confirmed
When a character summons a Seru or performs an Art, the assets are not in memory - the game streams them off the CD while the cast animation plays. Two files feed that side-band stream: per-attack texture pages and palettes bound for video memory, the summon creature's mesh and animation, and the player art-animation archives, all in fixed 33-sector slots so any slot can be seeked directly.
At a glance
- In the game
- Every Seru summon and every Art's mid-cast textures; the seven big summons' bespoke creatures
- Where
summon.dat= extraction PROT 893 (raw TOC0x37F);readef.DAT= extraction PROT 894 (raw TOC0x380); CDNAME blockbat_back_dat- Size / stride
- Fixed
0x10800-byte slots: 103 in summon.dat, 78 in readef.DAT, both tiling their entry exactly. No magic; texture slots start with au32 mode, art archives with'M' 'E' - Parser
legaia_asset::summon_readef(+summon_creatures,me_archive); CLIasset summon-readef- Confidence
- Confirmed - slot math read from the battle-action state machine; a mid-cast save state's stream buffer and VRAM byte-match the disc (how we know)
- Used by
- battle action SM, Seru magic & summons, Arts
How a cast reaches the disc
slot × 0x10800, reads one slot into the stream buffer.Both files live inside PROT.DAT like everything else. The dev path strings are ignored - the retail file-open shim is a stub, and the fourth argument goes straight to the PROT reader as a raw TOC index. The in-RAM TOC keeps PROT.DAT's 8-byte header while the extraction strips it, so raw index = extraction entry + 2 (CDNAME numbering).
Action id to slot
The cast sequence computes a base slot byte from the actor's action id. Bit 7 selects the file (set = summon.dat, clear = readef.DAT); base & 0x7F is the first slot of the group.
id < 0x9A: base = 3 * (id - 1) (mod 256)
id >= 0x9A: base = 4 * id + 0x63 (mod 256)
| Action ids | File | Group shape | Slots |
|---|---|---|---|
0x01..=0x1A | readef.DAT | 3 slots [texture, aux, aux] | 26 × 3 = 78 |
0x81..=0x99 | summon.dat | 3 slots [texture, texture, actor record] | 25 × 3 = 75 |
0x9A..=0xA0 | summon.dat | 4 slots [texture, texture, raw pool, actor record] | 7 × 4 = 28 |
The bands tile both files exactly. Group 0 of summon.dat (spell id 0x81, Gimard) carries the "Burning Attack" record, matching the spell table's player Seru-magic block.
Slot formats
Texture slot
| Offset | Size | Field | Meaning |
|---|---|---|---|
+0x000 | u32 | mode | 0, 1 or 2 - selects CLUT row count and page width |
+0x004 | 256 × u16 per row | CLUT rows | BGR555; mode 1 carries 2 rows, modes 0 / 2 one |
+0x204 / +0x404 | 0x8000 / 0x10000 | texture page | 4bpp, 256 rows; mode 0 is 64 halfwords wide, modes 1 / 2 are 128 |
Actor-record slot
Consumed in place, slot-relative offsets. The TMD and texture pool route through the same installer the monster archive uses, and the creature is staged as a battle actor.
| Offset | Size | Field | Meaning |
|---|---|---|---|
+0x00 | u32 | name offset | NUL-terminated attack-name string |
+0x04 | u32 | TMD offset | Legaia TMD |
+0x08 | u32 | texture-pool offset | Monster-style CLUT region + page |
+0x1D | u8 | element | The summon's element |
+0x4A | u8 | part count | |
+0x4C | u32[parts] | per-part offsets | Animation entries; base differs by band (below) |
Big-summon raw slot
The third slot of the four-slot groups is headerless; three regions tile it exactly (0x1E0 + 0x8000 + 0x8620): a 240-entry CLUT to VRAM (0, 486), a 64×256-halfword page to (448, 256), and a part pool for the creature's animation. Those targets are monster battle slot 2's, so a big summon installs over slot 2 and the ordinary relocation reproduces its placement.
Creature meshes and animation
- Ordinary summons (
0x81..=0x99) reuse an enemy: the actor-record TMD is byte-identical to a record in the monster archive (extraction 867). Map inlegaia_asset::summon_creatures. - Big summons (
0x9A..=0xA0) carry a bespoke mesh matching no archive record; their texture pool and animation entries live in the group's raw slot. - Each per-part entry is a monster-animation record: a packed keyframe stream at entry
+0x8C,[u8 parts][u8 frames]then nine-byte TRS records, playback rate at+0x78. No decoder of its own is needed. - Offsets are relative to the actor-record slot for three-slot groups and to the raw slot's part pool (
+0x81E0) for four-slot groups; in both cases the streams tile contiguously.
The seven big summons
Each id is pinned by two independent reads of its own record - the inline attack-name string and the element byte - both agreeing with the curated summon table.
| Spell id | Summon | Attack name | Element byte |
|---|---|---|---|
0x9A | Palma | Meteor Cluster | 0 earth |
0x9B | Mule | Deep Avalanche | 1 water |
0x9C | Horn | Resurrector | 5 light |
0x9D | Jedo | Deadly Promise | 6 dark |
0x9E | Meta | Inferno | 2 fire |
0x9F | Terra | Queen Twister | 3 wind |
0xA0 | Ozma | Voltagor | 4 thunder |
All seven play in the browser on the Seru magic & summons page, decoded from your own disc.
Art "ME" archives
The aux slots of readef.DAT groups 0..3 (slots 3×char + 1 / + 2 for Vahn / Noa / Gala / Terra) hold the player art-animation archives: magic 'M' 'E', u8 count, u16 entry_sizes[count] (bit 15 = compressed), then concatenated bodies. Each decompresses through the channel-delta codec into the same packed TRS stream (see player battle files). Parser legaia_asset::me_archive.
Which slot is resident when
- The initiative scheduler seeds the acting entity's group base per turn: party
3 × (char - 1); enemy3 × monster_record[+0x1C]. The character's main ME archive stays resident for the turn. - Battle-end win-pose staging requests slot
3 × char + 2(the base archive) directly. The win-pose pick is re-rolled onto a living party member only when the acting actor is dead - the hole behind the enemy-ally charm softlock. - readef groups stop after
base + 1unless bit 7 is set orbase == 0x36, the one readef id with a four-slot group; the second texture upload is skipped forbase < 0x0Cand0x37..=0x41. - The aux slots of the higher readef groups (enemy-special bands) are unattributed as content; their selection is pinned to the monster record's group byte.
How we know
| Function | Address | What it proves | Dump |
|---|---|---|---|
Battle-action SM, case 0x32 | FUN_801E295C | Action id → base slot byte; bit 7 file select | funcs/overlay_battle_801e295c.txt |
| Transfer SM | FUN_801F17F8 | Opens by raw TOC index via FUN_800558FC / FUN_8003E8A8; seeks slot × 0x10800; reads into *0x8007BD74 | funcs/overlay_battle_801f17f8.txt |
| Applier SM | FUN_801F12D0, record consumer FUN_801F19EC | Slot classes, VRAM targets, actor-record offsets, readef stop rule | funcs/overlay_muscle_dome_801f12d0.txt, _801f19ec.txt |
| Initiative scheduler | FUN_801DABA4 | Per-turn group base; win-pose re-pick at 0x801E6690 | funcs/overlay_battle_action_801daba4.txt |
| Mesh / texture installer | FUN_80055468 | Shared with the monster archive | funcs/80055468.txt |
| Mid-cast save state | stream buffer + VRAM | 67 584-byte buffer equals extraction 894 at 1 × 0x10800; slot 0's CLUT row and page match VRAM | summon_readef_real, summon_creature_tmd_map_real |
CLI: asset summon-readef <entry.BIN> lists every slot's class and attack name; --texture-png-dir decodes pages to PNG; --action-id resolves an id to its stream target. Source of record: docs/formats/summon-readef.md.