At a glance

FeatureFlagWhat the player gets
Delilas Challenge--delilas-challengea fourth Muscle Dome enrollment option: a two-round arena course (Che and Lu together, then Gi) paying 5000 coins and a reward item
Custom items--custom-itemsthree new items in cut item slots; standalone, and the course's reward when both are set
Delilas party swap--delilas-party V,N,Gplay as the siblings: the party wears their battle models, names, voices and elements, and the story duels field Vahn, Noa and Gala instead
legaia-patcher randomize --input DISC.bin --delilas-challenge --custom-items
legaia-patcher randomize --input DISC.bin --delilas-party gi,lu,che --delilas-moves delilas

Sub-options of the swap are --delilas-moves hybrid|delilas, --delilas-arts-voice original|adjusted|removed and --delilas-che-hammer. Two read-only checkers ship with them: legaia-patcher delilas-verify and delilas-audit. The shared write path and the injected-code arenas are on Randomizer: internals; all three features also run in the in-browser ROM patcher.

PROT
the disc archive PROT.DAT, addressed by entry number; 0898 is the battle overlay, 0977 the Muscle Dome arena overlay
SCUS
the executable SCUS_942.54
Cave
injected code hosted in bytes nothing references
koin1
the Sol casino scene that holds the dome clerk
MAN
a scene's script-and-placement file

Delilas Challenge

--delilas-challenge adds a new dome course of two rounds - Che and Lu together (1v2), then Gi (1v1) - paying 5000 coins into the dome winnings counter on a full clear, plus a reward item. Retail has no such fight: the Nivora Ravine duels are solo, and no retail formation fields two distinct Delilas.

It is a dome course rather than a scripted battle because a normal battle staged from koin1 freezes on any spell: that scene never installs battle-effect, summon or player-magic asset residency - the same reason the Muscle Dome disables magic. The feature is two halves that always ship together: a koin1 script edit and an arena code injection. It is seedless, re-applying it is a no-op, and it is on in the web patcher's Balanced and Full Chaos presets.

koin1 clerk4th who-menu option Confirm pickerarms the course flags Arena warpretail op 3E 69 Seed hookcourse 3, word 0x131 flag 0x378 set Round 0Che + Lu, slim clones Round 1Gi, word 0x132 Settlecleared latch 0x801D1ADC Payout5000 coins + reward, 0x50A win win Dome loss sceneswinnings halved, back to Sol loss loss koin1 award ceremonynames the reward
Until the Koru death event latches flag 0x378 the clerk brushes the player off. Losing a round returns to the Sol venue by the dome's own design - there is no game over.

The koin1 menu and warp

This half is script and data only.

  • Picker. The 3-option 0x28 who-enrolls picker grows to the 4-option 0x29 form - the picker arity ceiling - with the new arm appended at the record's end.
  • Quick-path skip. Retail hides the who-menu for good once Noa or Gala has refused enrollment (flags 0x559 / 0x558), which would strand the new option on most saves. The skip tests are retargeted at never-set flags, never NOPed: 0x21 is the field VM's frame-yield opcode (script VM), not a no-op, so filling with it breaks the clerk dialog mid-interaction.
  • The new arm mirrors a retail difficulty arm exactly: gate on 0x378, set the dome-active flag, clear the three course-unlock flags, set the course-3 request flag, then the verbatim BGM, wait and arena-warp ops.
  • Fit. The koin1 MAN is sector-aligned with zero compressed slack, so the grown script fits only through the optimal LZS packer. If another edit (a grown language pack, say) has taken the headroom, this half skips with a note instead of failing the run.

The dome fields whichever fighter the arena normally seats; routing a chosen party member into the arena's fighter slot is an open RE thread.

The arena course

The arena overlay (PROT 0977) has no course beyond Master, so course 3 is added by same-size edits there plus caves in SCUS.

EditSiteEffect
Seed detourFUN_801CEA6C @ 0x801CEBCCdecodes flag 0x539 into the packed course / round word as course 3, then clears it
Course descriptor0x801D1A08 + 3*8{round_count, roster_ptr}; all four readers compute base + course*8, so one write serves all
Hub actor templaterelocated into a SCUS caveit occupied the course-3 slot; its one lui / addiu reference is repointed
RosterSCUS caveGi / Che / Lu, with the dome's own name strings
Payout detourFUN_801D0F60 @ 0x801D1118returns 5000 for course 3
Display detourFUN_801D1184 @ 0x801D125Cshows the same 5000 on the results screen
Reward detour0x801D114Cgrants the reward item(s) through a routine at 0x800352EC
  • Seed guard. The seed fires only when the retail flag seed has left the course word at its no-course default 1, which only the Delilas arm produces. The request flag is cleared whether or not it seeded, so a stale one cannot hijack a later Beginner / Expert / Master enrollment.
  • The seed word carries bit 0x100 (0x131). The battle-exit selector FUN_80046A20 tests it to route a leg's end back to arena mode 0x18; without it a lost leg falls into the ordinary game-over gate. Every retail seed carries it.
  • Payout. Courses 0-2 pay from a table that course 3 indexes past into zeros. The payout load sits behind the settlement's cleared latch, raised only on course exhausted and survived, so a loss pays nothing and retail's halve-on-loss is untouched. The results screen re-reads the table on its own, hence the separate display detour.
  • The quit residue. The hub's round-end routing reads the koin1 menu-selection residue at 0x80084448 and treats 4 as "the player chose quit". The Delilas enrollment rides the who-menu's fourth slot, so its residue is exactly 4; the seat routine clears the cell at round-0 install. Leaving mid-course settles as a loss (halve), not a quit (zero).

The 1v2 round: slim clones

Two full Delilas monster blocks overshoot the battle heap's distinct-monster budget. The failing allocation returns NULL, which the loader uses unchecked, so a naive 1v2 freezes at the round load (the arithmetic is on the battle page). The fix streams slim clones without touching the originals.

What a clone drops
most castable spell entries; mesh, stats, name and reactions stay byte-identical. The entry count and index space are preserved: a dropped slot aliases the basic-attack entry.
Constraint 1
exactly one rollable castable survives per sibling. The AI's cast pick is rand % castable_count, and an empty menu executes the divide guard the BIOS parks on.
Constraint 2
the signature special's staged entries survive verbatim. Each sibling's cast module stages block entries by raw index (Lu: 14 → 12 → 13, Che: 10 → 11), and an aliased stand-in never satisfies the module's completion wait.
Where they live
archive slots 190 / 191, ids nothing on the disc references. The real slots 163 / 164 are never modified, so the ravine duels and the Master course keep every move.
How they are reached
the formation seats the real ids, so AI, names and id-keyed tables stay genuine. Two small caves hook the loader's id-to-slot sites and add 27 to the id for the archive fetch only, and only while the course word reads 0x131.

Battle-rule edits the course needs

EditSiteWhy
Magic lockouttwo mask words in PROT 0898widen & 0x200 to & 0x300 so every dome contest locks magic
Special cadenceAI arm reload → cave over FUN_80035274stagger the two siblings' specials
Gi's borrowed castssecond cave armDivide and Spore Gas, one-shot each
PRG ERR%d paintreporter 0x80016444hide a benign malloc-failure counter
  • Magic lockout. Retail rejects the Magic command only on the Master course's bit. The arena never installs summon / player-magic sound and art residency, so a Meta cast in the course corrupts audio state; widening the mask to the contest marker every dome seed carries closes it. Retail Beginner / Expert legs lose their latent magic access too - the same corruption waits there.
  • Special cadence. The bespoke Delilas AI arm queues the signature special on the shared turn counter % 3 == 2, which would synchronize both siblings. In the Che and Lu round the course-gated block fires a special every four turns with the two siblings two turns apart; every other context resumes the stock arm register-exactly. The block lives over FUN_80035274, a SCUS function with zero references in any image - the only always-resident home left.
  • Gi's round. The second arm queues Divide on Gi's first pick below half HP and Spore Gas on his first pick once the counter reaches 3, through the actor's cast queue - the mechanism the signature specials ride. Both stream their capture-class cast modules at cast time. Gi's monster block is byte-untouched.
  • PRG ERR%d. The 1v2's tight heap fails transient effect allocations in bursts, which retail tolerates, but every failure bumps the counter the on-screen dev reporter prints. One branch becomes unconditional; the other error arms stay.

Arena sharing and verification

The course's seed routine and template cave live in the verified-dead SCUS region at 0x8007AE00, which shiny Seru and the arts AP override also use (the arena budget). Requested with --shiny-seru, the challenge installs and shiny Seru yields with a note; the AP override, Super Arts list and pack, and oscillating AP are refused up front.

  • Disc oracles delilas_challenge_real, delilas_dome_real and delilas_dome_compose_real check the patched picker and branch at decode level, the seed hook, descriptor and roster, determinism, idempotence and EDC/ECC validity of every touched sector.
  • Played: the clerk reaches the option, the warp lands in the arena, the course runs its roster round by round, a lost leg routes back through the dome's loss scenes.
  • Static and disc-oracle only: the 5000-coin payout hook and the custom-item prize.

Completion reward and the custom items

A winning settle grants a reward alongside the coins, riding the same latch-gated arm that pays the Master course's retail prize: a two-word detour into a routine that gives one item per reward when the settling course is 3.

--custom-itemsReward
off (default)one retail Honey (the permanent all-stats-+4 consumable)
onNature's Elixir, Ra-Seru Tear and Fury Bloom

--custom-items is a standalone feature. It installs records, descriptors, jump-table arms, item-machinery caves and battle-overlay hooks, and no arena writes; a random drop / chest / steal mode adds the three ids to its fill pool. With neither that nor the challenge, the items exist but nothing hands them out. The items claim the item table's only free slots - three empty-name records left by cut content - after a census shows every other named id is reachable in retail.

ItemUsableEffectMechanism
Nature's Elixirfield and battlefull HP and MP for one allya new applier arm fills MP, then tail-jumps into the retail HP-restore arm so the popup accounting is retail's
Ra-Seru Tearbattlea free cast of the user's own Ra-Seru summonhooks the action-seed dispatch; a one-shot flag turns the summon leg's MP deduct into a zero-cost write
Fury BloombattleFury Boost on every living party membera custom arm writes the action-gauge extension per member, since group targeting lives inside each retail class arm

The Tear is caster-matched by necessity: the big summons stream the caster's own choreography, and a mismatched pair parks the battle in the summon driver's completion poll. All three play the heal chime from their own arms, because the cast-audio dispatcher maps item classes through a fixed table and a new class would be silent.

A cave must survive a cold boot

A zero-reference libapi slot passes every static scan and every save-state probe, yet the kernel calls it during boot init, and a disc that overwrites it parks at the PS1 logo. A cold-boot watcher is part of the cave verification standard; the falsified candidate is recorded on Do not re-walk.

The award ceremony names the reward. The course sits outside the token table retail's ceremony substitutes from, so an unedited script would award "0 tokens" and never mention the items. Four flag tests spliced at the narration record's own branch point - before the message run, since control ops inside it cut the ceremony short - keep the retail flow whenever a course-unlock flag is set, and otherwise route a won Delilas course to a parallel flow that names the items. A Delilas loss falls through into the retail box. Oracle: custom_items_real.

Delilas party swap

--delilas-party gi,lu,che (any permutation, in Vahn, Noa, Gala order) swaps the playable party's battle identity with the siblings. Each character keeps their own stats, magic and story but wears the mapped sibling's battle model, name, voice and element. In exchange each sibling's monster block is rebuilt around the mapped hero's model, so the three Nivora Ravine duels and the Muscle Dome Master legs field Vahn, Noa and Gala. It is in no preset and ignores the seed.

The swap is possible because both pose systems use flat per-part rigid transforms addressed by part index, and both texture systems are 4bpp indices with 16-colour palettes. A same-part-count model therefore inherits every clip.

PassWhat it rewritesDisc oracle
Battle models, both directionsevery equipment-section record of PLAYER1..3; monster blocks 162-164party_swap_real, delilas_party_real
Field formPROT 0874 field mesh and atlas windowdelilas_party_real
Victory poses and battle idlereadef.DAT base "ME" archives; the inline idleparty_swap_idle_continuity_real
Voicesbattle bank programs, XA banks, monster.snd clip bandsdelilas_party_real
Signature artone 50-AP Hyper per slotdelilas_party_real
Elementthe per-character element tabledelilas_party_real
Move setthe whole art archive and bankdelilas_party_real
Retail cast routecast modules 958 / 959 / 960, queue hook, staged rowsdelilas_cast_stage_real, delilas_cast_remap_real
Enemy side and story sceneshero clips in the swapped blocks; sibling NPC rigs in four scenesenemy_anim_mirror_real, nivora_field_real
Saves and dialogportrait tiles, new-game names, speaker linesdelilas_party_real

Exclusive with the Challenge

Both features edit the AI picker's Delilas arm: the Challenge detours one word of it, and the swap's enemy-side conversion rewrites the body and refuses an arm that is neither retail nor its own. The CLI and the site patcher reject the pair before writing anything. Menu portraits and battle HUD faces stay retail.

Battle model: permutation, bake and relayout

Sibling meshmonster blocks 162-164 Anatomy permutationhead-first → torso-first Whole-rig R_alignhost facing, then per part Pivot-anchored bakeaxial span, radial height Weapon fusefist out, host weapon in Texel relayoutface window kept clear Record rewriteevery equip-section record Disc writeinside the entry footprint
The same bake drives the opposite direction (hero meshes into the sibling monster blocks), the field form and the story-scene NPC rigs.
  • Anatomy permutation. Players order bones torso, pelvis, head, arms, legs; every Delilas mesh orders parts head, torso, pelvis, arms, legs. Noa's extra hair bone merges into the head part.
  • Pivot-anchored bake, per part: v' = R_tT S(R_align (R_s v)). Each part anchors at the joint the engine rotates it about, scales axially onto the target's joint-to-joint span and radially by the height ratio, so chains stay closed under every clip while the sibling's shapes survive.
  • Texel re-layout, bit-exact: islands shelf-pack between the monster page and the party band's section tiles; palettes are union-merged into the palette columns the character's base record does not claim.
  • Every equipment-section record is rewritten, so the swap survives any equipment; the swing records and the character's own animation source are kept. New-game names follow the mapping; existing saves keep their stored names.

R_align reads the rig as a whole, not joint by joint. It turns the whole rig onto the host's facing (up = pelvis to head, lateral = the two shoulders) and then swings each part minimally onto its own host bone. A per-joint bend-plane reference fails because the two sides do not always find the same kind of reference: Che's torso rolled almost half a turn about his own spine that way, and Gi's upper arm likewise. It shows only in a per-part affine fit against the sibling's own mesh - no joint gap ever opens, so gap-based probes are blind to it.

Welded weapons and the host's weapon

Che's hammer-fist and Gi's blade-fist are welded weapons, several times the radius of a hand; a host clip that assumes a hand-sized part sweeps them across the body. Each is replaced with the sibling's other fist, mirrored, and the host's own equipped weapon goes in the hand: the curated item-alone cut the equipment viewer uses recovers that record's weapon prims verbatim and merges them into the baked hand.

The weapon keeps its real texture on three measured invariants (UVs inside its own section tile, at most two palette columns, a fixed-size tile upload), so only the prims' palette column is remapped. Ra-Seru weapon records keep a bare arm. --delilas-che-hammer is a comparison option that keeps Che's hammer and skips the fusion for his file.

Two runtime readers the layout must respect

  • The face animator writes. Every battle frame it copies the host's eye and mouth frames onto fixed rows of section 1's tile. Sibling texels parked there would be overwritten the moment a battle starts - clean on disc, a palette-mismatched patch live - so the relayout leaves that window empty.
  • The Spirit streamer samples vertex indices of specific objects. A slot whose geometry is deliberately dropped would answer with bytes past its empty pool and stretch the trail to a garbage point, so the rewrite never emits an empty object where retail had geometry: such slots get a prim-less stub with the retail vertex count, pinned at the part's socket.

Field form

Each character's field mesh and atlas window (PROT 0874, see character mesh) rebuild from the sibling's own field NPC mesh in the ravine duel scene's pack - retail-authored chibi geometry that fits the budget at full detail - through the same pivot-anchored bake, so the walking chains and the neck stay closed.

  • NPC meshes are authored for fixed-camera scenes and are not watertight from free angles, so the rebuilt head and torso carry a winding-reversed twin per prim, narrowed by a size ladder until the container fits; the hair shell's genuine openings are sealed with flat fills.
  • The head re-lays into the character's atlas window; bodies stay flat vertex colours, the retail field style. The battle-model conversion is the fallback when the NPC source is unavailable.

Victory poses, battle idle and hands

Each character's eight win-pose streams (the base "ME" archive in readef.DAT; see battle data pack) are rebuilt from the sibling's own victory clip, retargeted per part from the bake's own frames and re-encoded with the retail channel-delta codec, round-trip checked through the retail decoder on every apply.

  • A win pose loops. Every retail record carries a loop window the tick replays up to 255 times before the results sequencer moves on, authored as a seamless cycle. A one-shot flourish resampled into that shape snaps on every wrap.
  • So the lead-in stays retail, verbatim. The base streams are not victory-only: entry 0 is the Spirit power-up flourish the battle plays after every charge. Only the loop window carries the sibling's post-win cycle, phase-picked against the retail lead-in's last frame. The window bytes themselves are never written.

Battle idle. The player idle is raw packed inline in the character's base record, so it is rewritten at its exact retail length; the sibling's cycle is resampled to the host's frame count and plays faster than authored. Its re-anchor is one rigid whole-body translation - battle poses are flat absolute transforms, so moving one channel alone shears the torso off the body - with x / z from the torso and y from the deepest ankle pivot over the cycle. The idle rides the same single re-compressed write as the signature-art edits, and an overflow is a hard error rather than a silent drop. The run-in stays the host's.

Hands follow a wrist-attitude law. Mapping each part's orientation independently preserves neither rig's hand-to-forearm relation, which points a fused weapon across the torso, so each hand is slaved to its forearm at the host's rest wrist attitude. Hand rotations feed no translation term, so only orientation changes. The head's bob is carried across.

Voices

Voice pathRetail sourceWhat the swap does
Reaction gruntsSPU one-shots in the battle bankthe siblings' samples spliced over them in place; cue tracks and routing stay retail
Arts shoutsXA2 / XA4 / XA6per --delilas-arts-voice
Swing vocalizationsXA30.XA channel groupsmuted, then re-voiced
Victory barksXA21.XA, one channel each of XA20 / XA22muted, then re-voiced
Staged-event linesXA1 / XA3 / XA5 and XA27..29muted, then re-voiced; fanfare beds per --delilas-arts-voice
Victory-pose voiceSPU clips in monster.sndoverwritten with the siblings' grunt bodies

Re-voicing decodes each sibling's SPU samples to PCM, normalizes, resamples to the channel's CD-XA rate and re-encodes through the project's own XA-ADPCM encoder at each channel head; subheaders, routing and other speakers' channels stay byte-identical. The routing that pins which channel is which is traced on the audio page.

--delilas-arts-voiceShout and fanfare banks
original (default)left retail: Vahn, Noa and Gala call their own arts out of the siblings' bodies
adjustedthe retail hero shouts are re-voiced toward each mapped sibling
removedsilent; the spliced grunts remain the audible attack voice

The fanfares follow the same contract because a Hyper Art fires no shout - its fanfare is its only audio. adjusted runs a deterministic DSP chain (time-stretch, resample, a cepstral formant and timbre pass, pitch bend, tone filters) per clip, laid back at its original start so cue timing holds. Two properties matter to anyone retuning it: pitch is a resample and drags the formants with it, so the audible formant shift is pitch + formant_st; and the browser tuning dashboard applies its spectral pass before the resample, so a bake must order the passes the same way to honour the values tuned there.

The signature art

Each hero slot gives up one Hyper art to carry the mapped sibling's signature special - Gi's Blazing Slash, Che's Megaton Press, Lu's Plasma Strike. The host is that character's 50-AP Hyper (Vahn's Burning Flare, Noa's Vulture Blade, Gala's Explosive Fist): the only three that clear every gate, since the new combo L R L R D must match the replaced combo's length and must not collide with a combo string shared across characters.

EditWhereRule
Namethe arts-table record's own name pointernever by searching for the old text: names nest
Comboboth copies retail keeps in sync (display glyphs and the matcher)after a collision check against every art of that character
Animationthe host art's "ME" streamthe sibling's choreography, by archive entry index
Hit timingentry +0x10..0x13re-scheduled on the measured connect frames
Effectsthe entry's 8-record effect scriptthe sibling's burst; the host's element cues removed
Cameraone arm of the swing-camera dispatcherthresholds re-timed to the longer clip
  • A chain of stages. The enemy-side modules stage several entries in sequence, so the final stage alone would show the payoff with no wind-up. Stages are retargeted individually, concatenated, and each resampled to hold its authored duration at the chain's fastest rate. When the slot cannot hold the chain, a fit ladder halves keyframe density (wall time unchanged), then drops stages from the front - a move that loses its wind-up still reads; one that loses its strike does not.
  • Hit timing anchors on the connect. A proportional rescale lands most hits in the wind-up, and anchoring on the payoff stage's start lands them seconds late, because the stage opens with its own approach. Authored contact beats are used where retail has them; elsewhere the connect is measured as the frame the whole body arrests hardest. The slot count stays the host's: power and frame are parallel arrays walked by one cursor, and a zero slot ends the walk.
  • Effects. As an enemy, a signature draws its visuals from a per-spell code module a one-byte art id cannot name, so the burst is borrowed from the sibling's ordinary casts, or - for the first hero slot - from an effect transplant: a cast module's part prototype copied into one of the few unreferenced effect-prototype slots, an 88-byte cave that holds exactly one.

The swing camera

The attack camera (FUN_801D71B8, see the attack-camera table) dispatches per character and art through three per-character jump tables; no live arm is shared across characters. An arm is a cascade of tests on the animation cursor whose highest threshold is keyframe 17, while a signature chain runs 46 to 100 frames, so an unedited camera finishes inside the wind-up. Each threshold is scaled so the last shot change lands where the payoff stage begins. Vahn's host arm reads no cursor at all, so its slot swaps with Tornado Flame's arm - a swap rather than a retarget, since every arm is live somewhere and a retarget would alias it.

Elements and the bank the runtime walks

Each slot fights in its sibling's element. The battle overlay's per-character element table is the only per-character element on the disc, and both affinity readers index the matrix with it, so the byte decides what every attack from that slot deals and what it takes. The siblings' own elements come off their monster records - Gi fire, Che earth, Lu thunder - read from an archive image captured before the model loop, so a re-skinned block cannot feed itself back. Effect scripts and the hit-flash byte are cosmetic, not the element.

The art-record edits reach the runtime through one pointer chain, from the per-character base record to its art bank and on to the action entry. Against a live battle capture, two characters' banks are byte-identical to the patcher's decode of the disc and the third differs only in a field the tick writes - so a same-size edit inside a bank record is an edit the runtime sees.

The Delilas move set

--delilas-movesBehaviour
hybrid (default)every art keeps the animation retail authored for it; only the reskinned Hyper plays a Delilas motion
delilasthe rest of the kit is re-authored around the sibling's swings

The archive is rebuilt, not extended. A character's art streams share one fixed readef.DAT slot that retail mostly fills, and several art records already point at one stream, so the archive is re-emitted with the signature stream, the sibling's locomotion clip and one entry per distinct sibling swing, and every record that reads it is repointed round-robin and re-timed in the same pass. Each record's name becomes the label of the clip it now plays - repeated strings compress far better, which keeps the rewritten base record inside its LZS footprint.

What survives. An art is listed only after it has been performed once, so an art whose combo is blanked is simply never listed - retail's own mechanism for the Super and Miracle finisher rows. Four groups keep a working combo: the signature host; bank row 11, the Miracle Art, whose combo is the only route to the wholesale queue overwrite; every art a Super Art trigger names, since a Super is matched against the finished action queue; and every art at or below the innate cap, which arrives through a script grant and would otherwise be a listed art that can never fire.

The enemy side and the story scenes

  • Enemy-side clips. Each swapped block's archive entries are rewritten with the hero's own idle, walk, reactions and swings, the hero's 50-AP Hyper split across the entries the signature stages by raw index, and the hero's victory flourish. Per-entry frame floors respect the one measured module gate: PROT 0960's damage tick waits for keyframe 22, so Lu's payoff entry holds at least 23 frames. All six mapping permutations fit without the budget ladder.
  • The signature becomes a physical attack. Retail decides the boss cast in the AI picker, not the monster block: the Delilas arms write a capture-class spell id derived from the monster id, which pages PROT 958 / 959 / 960. The 24-word case body is rewritten in place to queue an Attack whose strike bytes are the staged chain entries the mirror filled. Those entries carry empty hit lists on the retail disc, so each takes the head shape of the block's strongest ordinary attack.
  • Field forms in the ravine. The Delilas field forms are scene-resident pack members; the scene mirror rebuilds them as the heroes' field rigs, pivot-baked onto the siblings' scene-idle rest frames, and repaints the sibling head TIMs with the heroes' faces. The hero source is a capture of PROT 0874 taken before the field-form pass rewrites it.
SceneBundleRebuilt
stone (map-stone confrontation)0175three sibling members
taiku2 (Zora's floating castle)0426four per-beat shading copies per sibling, one bake
conc2 (past Conkram)0624court-outfit meshes; head TIMs in entry 0625

These scenes keep their NPC meshes inside the bundle's compressed TMD section, so the rebuild reflows the member pack and recompresses, in place when it fits and otherwise as a whole-bundle section re-lay inside the entry footprint. taiku2's kneeling stances fool the limb splitter into a wrong role pairing, so its slots reuse the assignment measured on the byte-identical rigs in stone.

Saves, dialog and the audit tools

  • Save metadata follows the mapping. The save-select face, the memory-card block icon and the boot load screen's copies come off the save-slot portrait sheet; each hero tile is exchanged byte-exact with the mapped sibling's tile. Existing card saves keep the icon they were written with.
  • Dialog follows the swap. Every line that names a sibling is rewritten through the translation machinery to name the hero who took that place, keeping the "Delilas" surname. A line that overflows its segment budget drops the surname one occurrence at a time, then contracts "I am" to "I'm".

delilas-audit classifies any produced disc against a retail baseline with a static battery and no emulator; delilas-verify is the faster single-disc check for a stale patcher build.

legaia-patcher delilas-audit --input patched.bin --baseline retail.bin
CheckPasses when
Stream censusevery base-archive lead-in frame reachable mid-fight is byte-retail
Pose batteryarm-closure and extent metrics over every battle and art clip sit inside bands taken from the baseline
Hand radiusno textured hand exceeds twice the baseline radius (the welded-weapon class)
Equip invarianceevery record of an equipment section carries the section default's texture pool, so equipping any item is a VRAM no-op

The retail cast route

In retail a Delilas signature is a capture-class spell whose cast pages a per-spell cast module (PROT 958 / 959 / 960) and runs the whole boss choreography from data. For a slot whose module has passed the player-caster audit - all three have, and all three are probe-verified - performing the signature art routes the finished arts queue into that real cast instead of the art-side reskin.

Why the unedited module cannot be used

A party actor has a first-class equivalent of a monster's anim table, so "no monster block" is not the blocker. These are, in order of severity:

  • Kernel-RAM corruption on every cast. The module's one monster-block access reads past the loader's fixed-up words when the seat-0 monster carries few castables, and the following store lands in PSX kernel RAM. Retail never trips it because only Lu, with enough entries, reaches the module.
  • A softlock with no escape. The battle re-enters the module every frame and advances only when it returns 0, with no timer; one phase gate needs a clip length most of Gala's equippable weapons do not provide.
  • Friendly fire. The damage call and both HP writes are hardcoded to actor slot 0.
Signature comboL R L R D Matcheremits starter + marker Queue hookARENA1 queue edit Starter at base?first byte of the queue Immediate castno approach run yes Deferearlier arts play out no Strike-loop fetch0x801E374C morphs mid-chain State 0x28 → 0x6Ecast module 958 / 959 / 960 runs
Base-or-defer is exhaustive because it follows the matcher's own emission shapes: the only queues with raw inputs before the starter are chains whose leading art the AP admission gate dropped, and those are basic strikes the player entered. A missed morph fails soft - the marker plays as an ordinary art row.

The route halves the Hyper admission tier so an art-then-special chain clears admission at realistic mid-battle AP. The per-slot markers double as the replaced host art's own constant, so performing that host art alone still casts. Retail raises the spell-name banner for monster casters only; a two-word in-place gate change makes every Magic cast run the retail label block, so player Seru casts gain the banner enemy casts always had. The route shares its caves with shiny Seru and the arts AP features; on a conflict the patch keeps the art-side signature and says so.

Module edits by defect class

ClassModulesDefect on a player castFix
Seat-0 damage / HP sitesalldamage and HP writes hardcoded to party seat 0retargeted to the derived victim
Dead-victim wipe armalla boss cast's victim is a hero, so a dead victim meant game overtaken out of the player path; its dead body hosts caves
Finale teardownper module (959 and 960 share one pattern)a model-less effect entity stays in a draw table and hard-freezes the frame the choreography endsits stream words are neutralised at the settle tail
Finale reaction wait958a monster corpse never leaves the reaction row, so a kill at the finale deadlockswait gated on the victim being alive
Cast-bed audio960the cue is dropped when XA is busy; the walk reaches damage earlypreempt cave and a deterministic tick counter
Seat-3 record toggles960two stores through an arbitrary victim's recordnop'd

The cast bed. Plasma Strike's 16.9-second cast bed is fired through a jingle wrapper that drops the cue whenever XA is busy, so a preempt cave calls the guard-free player directly; and the walk to the damage stage is held on a tick counter kept in a dead word of the module image itself, so the bed's blast lands on the damage whiteout. The bed's own slow intro is front-shifted in place with a short linear dissolve chosen by local waveform correlation, converging back onto the retail bytes within the written span. The signature's fanfare channels are silenced, since they would pre-play the bed's head at commit.

Staged caster rows. The module stages the caster's clips by raw index; on a party caster retail row 0x0A is empty and 0x0B is the Block clip. The swap authors real rows from the sibling's wind-up and smash, inserted below the palette offsets of the base record - everything above is battle-load scratch, and rows parked there pass every post-load RAM probe yet are destroyed before the first turn. Block moves byte-unchanged to a placeholder row and the one party-init literal that seeds it follows.

The punch sounds ride each action entry's cue track, re-authored so a player volley produces byte-identical sound-ring traffic to a retail one. Where the file's budget allows, the stage walks are un-folded to the full retail chains through small staging caves, and Lu's strike is hosted as an identity copy because module 0960 tests its cursor against absolute thresholds.

See also