Randomizer: the Delilas features
Three patcher features are built around the Delilas siblings - Gi, Lu and Che, the recurring boss duellists. They are the largest mods the patcher ships: unlike the table randomizers they combine script edits, model and animation rebuilds, audio re-voicing and injected MIPS code. This page is their design reference for modders - what each pass edits, where, and why. The flags themselves are listed on the randomizer page.
At a glance
| Feature | Flag | What the player gets |
|---|---|---|
| Delilas Challenge | --delilas-challenge | a 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-items | three new items in cut item slots; standalone, and the course's reward when both are set |
| Delilas party swap | --delilas-party V,N,G | play 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-itemslegaia-patcher randomize --input DISC.bin --delilas-party gi,lu,che --delilas-moves delilasSub-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.
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 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.
| Edit | Site | Effect |
|---|---|---|
| Seed detour | FUN_801CEA6C @ 0x801CEBCC | decodes flag 0x539 into the packed course / round word as course 3, then clears it |
| Course descriptor | 0x801D1A08 + 3*8 | {round_count, roster_ptr}; all four readers compute base + course*8, so one write serves all |
| Hub actor template | relocated into a SCUS cave | it occupied the course-3 slot; its one lui / addiu reference is repointed |
| Roster | SCUS cave | Gi / Che / Lu, with the dome's own name strings |
| Payout detour | FUN_801D0F60 @ 0x801D1118 | returns 5000 for course 3 |
| Display detour | FUN_801D1184 @ 0x801D125C | shows the same 5000 on the results screen |
| Reward detour | 0x801D114C | grants 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 selectorFUN_80046A20tests it to route a leg's end back to arena mode0x18; 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
koin1menu-selection residue at0x80084448and 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
| Edit | Site | Why |
|---|---|---|
| Magic lockout | two mask words in PROT 0898 | widen & 0x200 to & 0x300 so every dome contest locks magic |
| Special cadence | AI arm reload → cave over FUN_80035274 | stagger the two siblings' specials |
| Gi's borrowed casts | second cave arm | Divide and Spore Gas, one-shot each |
PRG ERR%d paint | reporter 0x80016444 | hide 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 overFUN_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_realanddelilas_dome_compose_realcheck 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-items | Reward |
|---|---|
| off (default) | one retail Honey (the permanent all-stats-+4 consumable) |
| on | Nature'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.
| Item | Usable | Effect | Mechanism |
|---|---|---|---|
| Nature's Elixir | field and battle | full HP and MP for one ally | a new applier arm fills MP, then tail-jumps into the retail HP-restore arm so the popup accounting is retail's |
| Ra-Seru Tear | battle | a free cast of the user's own Ra-Seru summon | hooks the action-seed dispatch; a one-shot flag turns the summon leg's MP deduct into a zero-cost write |
| Fury Bloom | battle | Fury Boost on every living party member | a 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.
| Pass | What it rewrites | Disc oracle |
|---|---|---|
| Battle models, both directions | every equipment-section record of PLAYER1..3; monster blocks 162-164 | party_swap_real, delilas_party_real |
| Field form | PROT 0874 field mesh and atlas window | delilas_party_real |
| Victory poses and battle idle | readef.DAT base "ME" archives; the inline idle | party_swap_idle_continuity_real |
| Voices | battle bank programs, XA banks, monster.snd clip bands | delilas_party_real |
| Signature art | one 50-AP Hyper per slot | delilas_party_real |
| Element | the per-character element table | delilas_party_real |
| Move set | the whole art archive and bank | delilas_party_real |
| Retail cast route | cast modules 958 / 959 / 960, queue hook, staged rows | delilas_cast_stage_real, delilas_cast_remap_real |
| Enemy side and story scenes | hero clips in the swapped blocks; sibling NPC rigs in four scenes | enemy_anim_mirror_real, nivora_field_real |
| Saves and dialog | portrait tiles, new-game names, speaker lines | delilas_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
- Anatomy permutation. Players order bones
torso, pelvis, head, arms, legs; every Delilas mesh orders partshead, 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 path | Retail source | What the swap does |
|---|---|---|
| Reaction grunts | SPU one-shots in the battle bank | the siblings' samples spliced over them in place; cue tracks and routing stay retail |
| Arts shouts | XA2 / XA4 / XA6 | per --delilas-arts-voice |
| Swing vocalizations | XA30.XA channel groups | muted, then re-voiced |
| Victory barks | XA21.XA, one channel each of XA20 / XA22 | muted, then re-voiced |
| Staged-event lines | XA1 / XA3 / XA5 and XA27..29 | muted, then re-voiced; fanfare beds per --delilas-arts-voice |
| Victory-pose voice | SPU clips in monster.snd | overwritten 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-voice | Shout and fanfare banks |
|---|---|
original (default) | left retail: Vahn, Noa and Gala call their own arts out of the siblings' bodies |
adjusted | the retail hero shouts are re-voiced toward each mapped sibling |
removed | silent; 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.
| Edit | Where | Rule |
|---|---|---|
| Name | the arts-table record's own name pointer | never by searching for the old text: names nest |
| Combo | both copies retail keeps in sync (display glyphs and the matcher) | after a collision check against every art of that character |
| Animation | the host art's "ME" stream | the sibling's choreography, by archive entry index |
| Hit timing | entry +0x10..0x13 | re-scheduled on the measured connect frames |
| Effects | the entry's 8-record effect script | the sibling's burst; the host's element cues removed |
| Camera | one arm of the swing-camera dispatcher | thresholds 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-moves | Behaviour |
|---|---|
hybrid (default) | every art keeps the animation retail authored for it; only the reskinned Hyper plays a Delilas motion |
delilas | the 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.
| Scene | Bundle | Rebuilt |
|---|---|---|
stone (map-stone confrontation) | 0175 | three sibling members |
taiku2 (Zora's floating castle) | 0426 | four per-beat shading copies per sibling, one bake |
conc2 (past Conkram) | 0624 | court-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| Check | Passes when |
|---|---|
| Stream census | every base-archive lead-in frame reachable mid-fight is byte-retail |
| Pose battery | arm-closure and extent metrics over every battle and art clip sit inside bands taken from the baseline |
| Hand radius | no textured hand exceeds twice the baseline radius (the welded-weapon class) |
| Equip invariance | every 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.
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
| Class | Modules | Defect on a player cast | Fix |
|---|---|---|---|
| Seat-0 damage / HP sites | all | damage and HP writes hardcoded to party seat 0 | retargeted to the derived victim |
| Dead-victim wipe arm | all | a boss cast's victim is a hero, so a dead victim meant game over | taken out of the player path; its dead body hosts caves |
| Finale teardown | per module (959 and 960 share one pattern) | a model-less effect entity stays in a draw table and hard-freezes the frame the choreography ends | its stream words are neutralised at the settle tail |
| Finale reaction wait | 958 | a monster corpse never leaves the reaction row, so a kill at the finale deadlocks | wait gated on the victim being alive |
| Cast-bed audio | 960 | the cue is dropped when XA is busy; the walk reaches damage early | preempt cave and a deterministic tick counter |
| Seat-3 record toggles | 960 | two stores through an arbitrary victim's record | nop'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.