At a glance

Magic
none - static data in SCUS_942.54 (the game's main executable)
Where
Name / description / scope table at 0x8007625C (file 0x66A5C), 64 × 12 bytes; the index bytes ride the item-effect descriptors (+3) and equip rows (+5)
Index space
0x00..=0x3F; index = bit position in the character's ability bitfield at record +0xF4
Sentinels
0x40 (equipment rows) / 0x41 (consumable rows) = no passive
Parser / engine
legaia_game_tables::accessory_passive; engine-battle::accessory_passives
Confidence
Confirmed - all appliers traced (how we know); assignments byte-verified against the curated accessory table
Used by
Battle formulas, Pause menu (Goods panel), Shops page

How an accessory grants its effect

  1. Equipped itemeight slot bytes per character, record +0x196
  2. Index bytedescriptor +3 (Goods) or equip row +5
  3. Ability bitset bit index in char +0xF4; >= 0x40 sets nothing
  4. Global maskall three character records OR'd together, joined or not
  5. Point of useeach mechanic tests its own bit

The stat aggregator rebuilds this chain on every equipment change (it is event-driven, not per-frame), so un-equipping takes effect immediately.

The stat aggregator walks the eight equipment-slot bytes of each of the three character records, with no test for who is in the party (record +0x196) and resolves each item to an index:

kind = item_table[id].byte(+0)
if kind == 1: index = equip_bonus[sub].byte(+5)
if kind == 2: index = descriptor[sub].byte(+3)
if index < 0x40:
    char[+0xF4 + (index>>5)*4] |= 1 << (index & 0x1F)
  • char +0xF4..+0x103 is the per-character 4×u32 ability bitfield - the home of the MP-cost bits (indices 0x04/0x05).
  • All three records' bitfields are then OR'd into a global 4×u32 mask - how party-wide passives are consumed. A member who has left the party still contributes: their accessory's party-wide passive stays in force.
  • An index of 0x40 or above grants nothing. In retail every equipment row carries the 0x40 sentinel (no equipment grants a passive) and every consumable carries 0x41; only accessory and quest-item rows carry live indices.

The same gate is read by the pause menu's Goods detail panel and the description resolver to fetch the display text. The battle damage path reads the first two bitfield words directly as the defender's elemental-resist / spirit words (details under how we know).

Passive name/description table

A static 64-record table at 0x8007625C (stride 0xC) gives each index its menu name, effect description, and scope:

OffsetTypeField
+0u32scope: 1 = party-wide (one wearer benefits the whole party), 0 = wearer-only
+4u32pointer to the effect name string (e.g. "HP Boost 1")
+8u32pointer to the effect description string (0x7C '|' is the line break)

Party-wide scope is set on exactly indices 0x30..=0x37 and 0x3B..=0x3F - the battle-end, encounter and escape modifiers.

The 64-index space

The bands, with example items (full per-index list in the source doc):

IndicesBandExamples
0x00..=0x0Cpercent stat boosts (HP/MP 10%/25%, ATK/DEF/SPD/INT/AGL 20%)Life Ring, Magic Armband, Power Ring
0x0D..=0x15combat behaviours (Attack ×2, Guard/Steal/Counter Attack, turn-order chains)War God Icon, Evil God Icon, Speed Chain
0x16..=0x1Cstatus-nullify guardsCure Amulet, Wonder Amulet
0x1D..=0x24elemental guards (Earth/Water/Fire/Wind/Thunder/Light/Dark + All)Earth Jewel, Rainbow Jewel
0x25..=0x2Fper-turn regen, AP modifiers, arts/magic/EXP boostsLife Grail, Mettle Ring, Crimson Book
0x30..=0x37party-wide battle-end / initiative / escape modifiersGolden Book, Chicken King
0x38..=0x3Awalk regen (HP/MP/AP)Life Source
0x3B..=0x3Fencounter modifiers + two display-text-only card slotsGood Luck Bell; Point/Platinum Card special-cased by id

Quest items share indices with their purchasable twins (Mei's Pendant = Life Ring, each Egg / Talisman = the matching Jewel) - which is what first exposed the index space. Indices 0x3E/0x3F have populated description records, but the Point / Platinum Card rows carry the 0x41 sentinel; the cards are special-cased by item id in the Goods panel.

Status-guard clear masks

Seven indices are status guards - the amulets that stop poison, curse, stone and the rest from sticking. The guard applier ANDs a fixed mask into the battle actor's status word per set bit, and the mask table is what pins the battle status-flag bit map:

IndexNameAND maskBits clearedAilment
0x16Poison Guard 10xFFFE0x0001Venom
0x17Poison Guard 20xFFFC0x0003Venom + Toxic
0x18Rot Guard0xFF870x0078Rot (three limb bits + one unused)
0x19Curse Guard0xEFFF0x1000Curse
0x1AStone Guard0xFFFB0x0004Stone
0x1BNumb Guard0xFBFF0x0400Numb
0x1CMaster Guard0xE3800x1C7Fevery ailment

Master Guard's mask is the definition of "ailment": 0x1C7F is the union of the six above plus 0x0800, the one condition with no guard of its own. It does not clear the AI-delegation group Rage sets - a passive, not an ailment, so a full cure leaves it standing. Bit assignments and the HUD elements are on save-record; engine mirror engine-battle-vm::status_effects::display_flags.

Magnitudes and the Talisman arm

The percent boosts (0x00..=0x0C) are applied inline by the aggregator - no magnitude table exists. Per index: +10% = base/10, +25% = base>>2, +20% = base/5, added to the copied base and capped (HP 9999, AGL 280, others 999). Every other index is a point-of-use flag: each consumer tests the bit where the mechanic lives - MP cost at cast time, the steal table for Steal Attack, the guards in the damage path, encounter rate in the field step roll, loot in the battle-end reward resolver.

A separate arm of the same aggregator watches equip slots for specific item ids (not passive indices) and grants or revokes battle spells: the five Talismans grant summon spells, and the top-tier Ra-Seru weapons grant their own. A Talisman is therefore "guard passive by index + summon by id".

Escape bits, catch-rate bit, and the spell-grant ids
  • Escape. Pinned in the run roll FUN_801E791C: 0x34 Escape Boost (Chicken Heart) scales the party's escape roll ×1.5; 0x37 Great Escape (Chicken King) forces the roll compare to a tie - assured escape, still blocked by the scripted no-escape flag, hence "non-boss". Both fold only from living wearers (battle-action).
  • Magic Boost (0x2E, Ivory Book). The killing-blow Seru-absorb roll reads ability word +0xF8 bit 0x4000 and adds a flat 30 percentage points to the monster's catch byte before the d100.
  • Maximum AP (0x2A). The guard applier's second word (+0xF8 bit 0x400) writes 0x64 to the actor's +0x170 gauge - how that offset is pinned as the 0..100 AP gauge.
  • Spell grants. Talismans 0x72..=0x76 grant summon spells 0x9A/0x9B/0x9C/0x9D/0x99 (Palma / Mule / Horn / Jedo / Juggernaut); Ra-Seru weapons 0x09/0x11/0x19 grant 0x9E/0x9F/0xA0. The spell-slot list is maintained at char +0x13D.

How we know

Provenance: the aggregator, the guard applier and every consumer
FunctionAddressWhat it provesDump
Stat aggregator (event-driven)FUN_80042558index resolution, bitfield write, inline percent-boost arithmetic, Talisman spell-grant armfuncs/80042558.txt
Global-mask testerFUN_800431D0party-wide consumption of the OR'd mask at DAT_80074358funcs/800431d0.txt
Status-guard applierFUN_8004CE2C (body 0x8004CEF4..0x8004CFF8)the seven AND masks; the Maximum-AP +0x170 writefuncs/8004ce2c.txt
Battle damage finisherFUN_801DDB30words +0xF4/+0xF8 as elemental-resist ladder (bit 0x1D + element), All-Guard 3/4-scale, AP Boost spirit-fill bitsfuncs/overlay_battle_action_801ddb30.txt
Goods detail panelFUN_801D0F1C (menu overlay)display-text gate on descriptor +3 < 0x40; Point Card special casefuncs/overlay_menu_801d0f1c.txt
Description resolverFUN_80034250same gate, static sidefuncs/80034250.txt
Escape rollFUN_801E791Cbits 0x34/0x37 consumer semanticsfuncs/overlay_*_801e791c.txt

In the port: parser legaia_game_tables::accessory_passive (CLI asset accessory-passive); engine engine-battle::accessory_passives - item id → index + scope, the bitfield rebuild on every aggregator pass (battle entry, equip commit, load), the party mask test, and the percent boosts under the retail clamp block. Source of record: docs/formats/accessory-passive-table.md.

See also