Expansion packs: Tactical Arts and Seru magic
arts.toml adds new Tactical Arts to an expansion pack, and chains that end a turn's arts in a pack finisher; spells.toml adds new Seru magic. Every hook is the identity with no pack active: the arts input walks retail's bank alone, the art bank gets no extra clip, the spell catalog no extra id, and a save carries no arts record.
At a glance
- Files
arts.toml,spells.tomlat the pack root; both optional. Declareart,art_chainandspellids.- Parser
legaia_expansion_format::{arts, spells}.- Runtime
legaia_engine_expansion::{arts, spells};engine-core'sworld::expansion_artswires them to theWorld.- Animation
- The hero's own retail art clips, by action constant or name. No animation data is carried.
- Shown in
- The battle arts list (Triangle), the battle label, the battle and field Magic lists, the Journal's Arts page.
- Save
- Tail record
5of the pack'sLXP1expansion block.
How a pack art runs
Retail's arts queue holds direction swings 0x0C..0x0F, the starters 0x19 / 0x1A and the character's art constants 0x1B..0x32, and the anim commit turns any byte >= 0x10 into art-bank record byte - 0x10. Noa uses all 24 constants, so a pack art cannot take one. Each segment of a pack art takes a byte from 0x33 up instead (77 per character), and at battle entry the hero's art bank gains, at that record, a copy of the segment's retail clip with the pack's power bytes and beats over the clip's own entry head.
The commit latches the retail constant the segment borrows, so the per-art attack camera, the art record's side data and the slow-motion arms all treat the segment as the retail art whose clip it plays.
Matching
A known pack art is a normal record of a second bank walk (FUN_801EED1C's walk, run again over the queue the retail walk left, with the retail rows blank), so only arrows no retail art took can match it and a retail art matches exactly as without the pack. A second pass and not one longer walk because every Super Art record carries a one-arrow stub combo, and a one-arrow match ends the walk at that start. Its further segments are inserted after the retail finish. Vahn's Ember Cascade, R U R D U:
swings 0D 0F 0D 0E 0F
bank walk 0D 0F 0D 0E 19 33 starter over the last arrow, first byte
segments 0D 0F 0D 0E 19 33 34 00 the second segment
A pack combo equal to a retail one never fires, and one that contains a retail combo loses those arrows to it. The workbench's Arts tab checks both against the disc's arts table.
Chains
A chain is the pack's Super Art: when the arts a turn performs end with its links, the queue gets 0x1A (carrying the Super starter mark, so the SUPER banner and freeze play) and the finisher's bytes. It runs after the retail Super tail-replace.
0D 0F 0D 0E 19 33 34 0C 0D 19 29 1A 35 00
Ember Cascade Hyper Elbow Knell Blaze
Cost and damage
Retail computes an art's Spirit cost; a pack art states it (ap), halved under AP Used Down. Its hits use the retail power-byte encoding (U12..U28 upper, L12..L28 lower, art data) through the retail damage kernel, then the pack's damage_pct, its element through the affinity matrix, and a status rider rolled per damaging hit.
arts.toml
[arts.ember_cascade]
character = "vahn"
name = "Ember Cascade"
commands = "RURDU"
ap = 30
segments = [
{ art = "Pyro Pummel", power = ["U22", "L22"] },
{ art = "Somersault", power = ["L28"] },
]
element = 2
learn = { level = 55, requires = { bosses = ["cinder_warden"] } }
[chains.knell_blaze]
character = "vahn"
arts = ["ember_cascade", 0x29]
finisher = "knell_blaze"
| Key | Meaning |
|---|---|
character | vahn, noa or gala |
name, description | Label and list name (20 characters); the Journal line |
commands | 2-9 arrows L R U D; empty for a chain-only finisher |
ap | Spirit cost, 0-100 |
segments | 1-8 retail clips: { art, power, beats } |
damage_pct, element, rider | Hit percent (1-400), element 0-6, { status, chance } |
learn | Level, pack gate, item held |
A chain lists character, one to six arts (a retail constant or a pack art key) and a finisher pack art.
spells.toml
[spells.hearthfire]
name = "Hearthfire"
base = 0x8C
mp = 96
power = 210
growth = 8
element = 2
learn = { capture = "hearth_gola", requires = { bosses = ["cinder_warden"] } }
A pack spell is cast as its base retail Seru (0x81..0xA0): the Magic band, the summon module, its creature, camera and effects run unchanged. The pack's numbers enter where the cast takes a number: the MP debit, the magic level the roll scales by (the pack spell's own), the summon element, the magnitude (power + growth x (level - 1) percent of the roll), a status rider, the spell XP (the pack spell's level, on the base's thresholds) and the label.
The Magic lists list spells by id, so each pack spell has a menu id from 0xC0 up (above the spell table's last record), with a catalog entry cloned from its base. Capturing a pack monster a spell's learn.capture names teaches it to every present member who may learn it, and takes the capture out of the retail registry's list.
Learning
learn takes the hero's own level, the pack's requires gate and an item held; every set condition must hold, and an empty learn is known from the start. The engine re-checks after every quest step and battle and at activation and load, with a toast for each newly learned art or spell. A pack art matches the arts input only once known; the battle arts list shows the known ones after the hero's retail arts.
Saves
5 tag
u16 learned art count, then str key each
u16 known spell count, then u8 roster slot + str key + u8 level + u32 XP each
Written only once an art or spell is known. A New Game starts them over; a New Game+ carries them through World::expansion_learned and World::expansion_carry_learned.
Validation
Errors: a bad name, commands outside L R U D or of the wrong length, two arts with one combo, AP over 100, a segment that is not the hero's retail art, a bad power byte or beat list, a damage percent out of range, a chain whose links or finisher are another hero's or undefined, a spell base outside the player Seru ids, power outside 1-500, a capture naming no pack monster. Warnings: an unreachable finisher, a spell known from the start.
Limits
- A pack art plays retail clips only.
- The validator cannot see retail combos; the disc-backed workbench can.
- A pack spell keeps its base's presentation, its module's aim included.
- The Status page's arts screen (Triangle) lists a hero's known pack arts under the saved chains; the Journal's Arts page lists arts and spells.
The sample pack's arts and Seru
| Hero | Art (level 55, after the Cinder Warden) | Finisher (level 80, after the Azure Seraph) |
|---|---|---|
| Vahn | Ember Cascade R U R D U: Pyro Pummel, Somersault | Knell Blaze, after Hyper Elbow |
| Noa | Gale Waltz L U L D U: Mirage Lancer, Swan Driver | Knell Tempest, after Sonic Javelin |
| Gala | Iron Avalanche R U R D D: Battering Ram, Super Ironhead | Knell Thunder, after Ironhead |
| Seru | Base | MP, power | Capture |
|---|---|---|---|
| Hearthfire | Gola Gola (40 MP) | 96, 210% | Hearth Gola, after the Cinder Warden |
| Verdant Bloom | Iota (90 MP) | 140, 180% | Verdant Iota, after the Verdant Colossus |
| Grove Fang | Kemaro (72 MP) | 100, 240% | Grove Kemaro, after the Verdant Colossus |
| Tempest Dive | Barra (85 MP) | 125, 260% | Storm Barra, after the Iron Regent |
Retail regular arts cost 24-30 AP and Super Arts 54-66; the finishers cost 60 across their two arts for five beats at x28 and 140%. The strongest retail capturable Seru is Gilium (160 MP); the Ra-Seru evolutions cost 240. The tower Seru roll about twice their base for two to three times its MP.