Files
OpenMaidEngine/vm-map/globals.toml
2026-07-24 10:13:43 -04:00

4766 lines
217 KiB
TOML

# vm-map/globals.toml -- CANONICAL living global-variable registry (hand-edited).
# Generated artifacts (build/globals.json, docs/global-reference.md) come from this file via
# tools/globals_build.py --build. Do not edit those. Skeletons are appended by
# tools/story_flags.py --bootstrap; enrich each entry as we investigate.
# See docs/superpowers/specs/2026-07-07-globals-registry-and-story-flags-design.md.
[meta]
note = "Curated global addresses override the auto shape-inference map (build/global-var-map.json)."
[[global]]
address = "0x8c877"
name = "current_item_id"
category = "index-pointer"
type = "int"
value_domain = "ITINIT item id; 0 means none"
usage = "Shared item-id argument/selection slot. Item menus and gameplay scripts write a chosen item id, use it to index ITINIT arrays, and dispatch through item_handler_script_id; ITMES compares it against all 287 item ids to select the matching player-facing title and description."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8c879"
name = "item_sort_key"
category = "data-table"
type = "int[1000]"
value_domain = "mostly unique multiples of 10; 10..6390"
usage = "ITINIT field for all 287 populated item ids. CHMENU, IMPROVE, and INFOIT pass this array as the primary key to op 0x12f's stable index sort, establishing it as the catalog/display ordering key. The runtime lookup base is one cell before ITINIT's first write because item ids are one-based."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8cc61"
name = "item_random_tier"
category = "data-table"
type = "int[1000]"
value_domain = "0..6"
usage = "ITINIT field for all 287 items. ADDRANDOMITEM and LOSTRANDOMITEM bucket eligible item ids by this value before choosing a random gain/loss; IMPROVE compares it with the current progression rank. This is the random-item availability/rarity tier, distinct from item_category."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8d049"
name = "item_category"
category = "data-table"
type = "int[1000]"
value_domain = "{0,1,2,4,8,9,10..17,19..23}"
usage = "ITINIT field for all 287 items and ITMES's top-level behavior dispatch. Observed groups: 0 innate attacks, 1 key/story items, 2 consumables, 4 stat stones, 8 synthesis materials, 9 coins, 10..17 weapon families, 19 boots, 20 armor, 21 shields, 22 accessories, and 23 capture ropes."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8dc01"
name = "item_icon_id"
category = "data-table"
type = "int[1000]"
value_domain = "1..360"
usage = "ITINIT field for all 287 items. READICON sorts and indexes this array to select icon atlas entries; ALCHEMY, CHMENU, IMPROVE, and INFOIT use the same value for item-row presentation."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa6a71"
name = "item_handler_script_id"
category = "data-table"
type = "int[1000]"
value_domain = "12699 (0x319b, ITMES.BIN) in the shipped table"
usage = "ITINIT field for all 287 items. Item menus look up this value and feed it directly to call-script; the packed id 0x319b resolves to ITMES.BIN, the shared per-item behavior/description dispatcher."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8dfe9"
name = "item_attack_element"
category = "data-table"
type = "int[1000]"
value_domain = "1..8 (physical, universal, fire, ice, lightning, earth, holy, dark)"
usage = "Populated for 107 weapons/attacks. Values exactly match the AFINIT attack-attribute string table at GStr[0x2690 + value] and the Japanese item descriptions; combat scope/parameter code consumes the same array."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8e3d1"
name = "item_defense_element"
category = "data-table"
type = "int[1000]"
value_domain = "1..12 (AFINIT defense-attribute enum)"
usage = "Populated for the 13 shields. Values match descriptions such as physical, universal, holy, dark, spirit, and divinity defense; DRAWTIP renders them through AFINIT's defense string table at GStr[0x26a4 + value]."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa6689"
name = "item_weapon_class"
category = "data-table"
type = "int[1000]"
value_domain = "1..21"
usage = "Populated for 104 weapons/innate attacks. Stable values identify weapon families (1 unarmed, 2 staff, 3 claw, 4 dagger, 5 sword, 6 chain blade, 7 spear, 8 axe, 9 bow, 11 blade boots; later values are monster/natural attack classes). CALCDMG consumes it."
source = "investigation"
confidence = "high"
[[global]]
address = "0x9f159"
name = "item_granted_skill_id"
category = "data-table"
type = "int[1000]"
value_domain = "SKINIT skill id 1..227"
usage = "Populated for 85 equipment items. Values cross-resolve to SKINIT (for example flying bracelet=1 Flying, transfer bracelet=21 Transfer, thief key=22 Lockpick, ropes=156 Capture Attack); CALCREVISE applies the linked skill and UI scripts display it."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8d431"
name = "item_min_range"
category = "data-table"
type = "int[1000]"
value_domain = "1 when populated"
usage = "Populated for the 12 bows/ranged innate attacks whose descriptions say range 2. CALCSCOPE reads it as the first range bound; the paired maximum is item_max_range."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8d819"
name = "item_max_range"
category = "data-table"
type = "int[1000]"
value_domain = "2 when populated"
usage = "Populated for the same 12 ranged items as item_min_range. CALCSCOPE reads it as the second range bound, matching every description's range-2 annotation."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8e7b9"
name = "item_character_whitelist"
category = "data-table"
type = "int[1000][5]"
columns = { "0" = "allowed_character_id_1", "1" = "allowed_character_id_2", "2" = "allowed_character_id_3", "3" = "allowed_character_id_4", "4" = "allowed_character_id_5" }
value_domain = "EBINIT character ids; up to five per item"
usage = "Sparse ITINIT row-major table with stride 5. CHMENU rejects an item when column 0 is populated and the selected party slot's character id is absent from the row. Unique accessories 471/472 allow one character each, while crossover accessories 480..485 allow character ids 2, 3, and 4. Unused trailing columns remain zero."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8ff29"
name = "item_sex_restriction_mask"
category = "data-table"
type = "int[1000]"
value_domain = "bit mask; shipped ITINIT populates value 4 on two items"
usage = "Sparse ITINIT equipment restriction. CHMENU uses unit_sex_category as a bit index and rejects an item when that bit is absent from this mask. Both populated items carry only bit 2; EBINIT value 2 is female, and ITMES explicitly describes item 419 as female-only."
source = "investigation"
confidence = "high"
[[global]]
address = "0x906f9"
name = "item_status_delta_levels"
category = "data-table"
type = "int[1000][30]"
columns = { "2" = "hp_drain", "3" = "sp_drain", "4" = "fs_drain", "5" = "curse", "6" = "charm", "7" = "confusion", "8" = "paralysis", "9" = "poison", "10" = "water_flow", "11" = "fear" }
value_domain = "condition delta -5..5; zero means absent"
usage = "Sparse ITINIT row-major table consumed by USEITEM and CALCILL when applying an item's effects. Positive values inflict or drain; -5 removes a condition (for example paralysis-removal item 108 stores -5 in column 8). Confirmed columns are 2 HP drain, 3 SP drain, 4 FS drain, 5 curse, 6 charm, 7 confusion, 8 paralysis, 9 poison, 10 water-flow, and 11 fear."
source = "investigation"
confidence = "high"
[[global]]
address = "0x97c29"
name = "item_equipped_status_levels"
category = "data-table"
type = "int[1000][30]"
columns = { "9" = "poison", "11" = "fear", "13" = "regeneration", "14" = "exaltation" }
value_domain = "condition strength 1..5; zero means absent"
usage = "Sparse ITINIT row-major table added to a unit's 30-column condition state by CALCREVISE. Item descriptions identify populated columns 9 poison, 11 fear, 13 regeneration, and 14 exaltation; these are passive equipped effects, distinct from item_status_delta_levels."
source = "investigation"
confidence = "high"
[[global]]
address = "0x9f541"
name = "item_stat_modifiers"
category = "data-table"
type = "int[1000][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "signed additive stat values; observed -15..200"
usage = "ITINIT row-major equipment modifiers added directly to the unit's 14-column stat record by CALCREVISE. Descriptions and consumers establish columns 0 accuracy, 1 evasion, 2 physical attack, 3 physical defense, 4 magic attack, 5 magic defense, 6 speed, 7 luck, 8 critical chance, 9 capture power, 10 movement, 11 max HP, 12 max SP, and 13 max FS. CALCBTPARAM adds columns 7 and 8 into the action's critical percentage, and CALCDMG compares the clamped result with a random-modulo-100 roll."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa2bf1"
name = "item_tuning_curve_ids"
category = "data-table"
type = "int[1000][10]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power" }
value_domain = "curve ids 1..18; zero means the field cannot be tuned"
usage = "ITINIT row-major table selecting an equipment-growth curve for each of the ten tunable fields. TUNE, IMPROVE, DRAWTIP, and CALCREVISE combine each nonzero curve id with the item's corresponding tuning level and index the shared curve-value table at 0xab6fa. Columns align with item_stat_modifiers columns 0..9."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa5301"
name = "item_resource_recovery_amounts"
category = "data-table"
type = "int[1000][3]"
columns = { "0" = "hp", "1" = "sp", "2" = "fs" }
value_domain = "recovery amount; zero means absent"
usage = "Sparse ITINIT row-major consumable table. USEITEM applies columns 0, 1, and 2 to the matching three-column unit resource record; descriptions prove these are HP, SP, and FS respectively (for example item 101 stores HP 30, and item 107 stores 999/99/99 for full recovery)."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa62a1"
name = "item_essence_recovery_amount"
category = "data-table"
type = "int[1000]"
value_domain = "50 in the shipped table"
usage = "Sparse ITINIT consumable field. Item 106, Blood Price Healing Hand, describes essence recovery 50 and stores 50 here; USEITEM follows the dedicated essence-recovery path and scales the value before updating the selected unit."
source = "investigation"
confidence = "high"
[[global]]
address = "0x65ce"
name = "skill_acquired_flags"
category = "data-table"
type = "int[300]"
value_domain = "0/1 by SKINIT skill id"
usage = "Persistent acquired-skill flags. ADDSKILL sets the selected skill after resolving the unit's equipped-skill slots; FORT checks the flag before granting a skill; CHMENU combines it with skill_change_catalog_eligible to build the available skill-change catalog."
source = "investigation"
confidence = "high"
[[global]]
address = "0x5660b"
name = "skill_info_revealed_flags"
category = "data-table"
type = "int[300]"
value_domain = "0/1 by SKINIT skill id"
usage = "Persistent skill-information visibility flags. ADDSKILL sets the selected skill, BTL marks every equipped skill when it is observed in combat, and INFOIT suppresses a skill's icon/handler-driven details until this flag is nonzero. This is broader than skill_acquired_flags."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa6e59"
name = "current_skill_id"
category = "index-pointer"
type = "int"
value_domain = "SKINIT skill id; 0 means none"
usage = "Shared skill-id argument/selection slot. Skill menus and combat scripts write the chosen skill id and use it to index SKINIT arrays; SKMES compares it against all 131 skill ids to select the matching player-facing title and description."
source = "investigation"
confidence = "high"
[[global]]
address = "0x45d7"
name = "character_profile_names"
category = "string-table"
type = "string[100]"
value_domain = "CIINIT display name indexed by character profile id; 24 populated shipped ids"
usage = "CIINIT writes the character-information screen's 24 display names. INFOCH lists them by profile id, masks unrevealed rows, and uses the same id to select the backing unit metadata and CIMES biography."
source = "investigation"
confidence = "high"
depends_on = ["0x15a117", "0x15a118"]
[[global]]
address = "0x15a117"
name = "current_character_profile_id"
category = "index-pointer"
type = "int"
value_domain = "CIINIT character profile id in 1..24"
usage = "INFOCH's selected character-information row. It indexes CIINIT's name, unit, portrait, and placement arrays; CIMES compares the same id against all 24 profiles to dispatch the character biography."
source = "investigation"
confidence = "high"
depends_on = ["0x45d7", "0x15a118", "0x15a17c"]
[[global]]
address = "0x15a118"
name = "character_profile_unit_ids"
category = "data-table"
type = "int[100]"
value_domain = "EBINIT unit definition id indexed by CIINIT character profile id"
usage = "CIINIT's profile-to-unit join. INFOCH uses the selected unit id for reveal state, map sprite, short unit descriptions, species, and sex while CIMES remains keyed by the enclosing profile id."
source = "investigation"
confidence = "high"
depends_on = ["0x15a117", "0x66715"]
[[global]]
address = "0x15a17c"
name = "character_profile_portrait_asset_ids"
category = "data-table"
type = "int[100]"
value_domain = "SYS4 graphics resource id; zero means use the unit map sprite fallback"
usage = "Optional CIINIT portrait resource indexed by character profile id. INFOCH draws it when nonzero and otherwise falls back to the backing unit's map-sprite asset."
source = "investigation"
confidence = "high"
depends_on = ["0x15a117", "0x15a118", "0x15a1e0", "0x15a244"]
[[global]]
address = "0x15a1e0"
name = "character_profile_portrait_x_offsets"
category = "data-table"
type = "int[100]"
value_domain = "signed horizontal draw offset in pixels; shipped CIINIT leaves all cells at zero"
usage = "INFOCH adds the selected cell to the centered portrait x coordinate. The 100-cell spacing to the adjacent CIINIT arrays and the direct indexed reader establish the reserved per-profile placement column."
source = "investigation"
confidence = "high"
depends_on = ["0x15a117", "0x15a17c"]
[[global]]
address = "0x15a244"
name = "character_profile_portrait_y_offsets"
category = "data-table"
type = "int[100]"
value_domain = "signed vertical draw offset in pixels; shipped CIINIT leaves all cells at zero"
usage = "INFOCH adds the selected cell to the bottom-aligned portrait y coordinate. The 100-cell spacing to the adjacent CIINIT arrays and the direct indexed reader establish the reserved per-profile placement column."
source = "investigation"
confidence = "high"
depends_on = ["0x15a117", "0x15a17c"]
[[global]]
address = "0x463b"
name = "glossary_topic_titles"
category = "string-table"
type = "string[200]"
value_domain = "VIINIT player-facing glossary title indexed by topic id; 65 populated shipped ids"
usage = "VIINIT writes the sparse glossary title table. INFOVO renders the selected title, and extract_init joins all 65 populated ids to VIMES's full help text."
source = "investigation"
confidence = "high"
depends_on = ["0x15a2a8", "0x15a2a9"]
[[global]]
address = "0x15a2a8"
name = "current_glossary_topic_id"
category = "index-pointer"
type = "int"
value_domain = "VIINIT glossary topic id in 1..199; shipped populated ids end at 120"
usage = "INFOVO's selected glossary/help topic. It indexes the VIINIT title and presentation arrays, then VIMES compares it against all 65 shipped topic ids to dispatch the full player-facing explanation."
source = "investigation"
confidence = "high"
depends_on = ["0x463b", "0x15a2a9"]
[[global]]
address = "0x15a2a9"
name = "glossary_topic_unlock_seen_decision_ids"
category = "data-table"
type = "int[200][3]"
columns = { "0" = "unlock_seen_decision_1", "1" = "unlock_seen_decision_2", "2" = "unlock_seen_decision_3" }
value_domain = "one-based scene decision id; zero means no prerequisite in that slot"
usage = "VIINIT's three unlock prerequisites per glossary topic. INFOVO subtracts one from each positive value and exposes the topic when any referenced scene_decision_seen_flags cell is set; debug modes expose the same populated topics unconditionally."
source = "investigation"
confidence = "high"
depends_on = ["0x5f0ed", "0x15a2a8"]
[[global]]
address = "0x5f0ed"
name = "scene_decision_seen_flags"
category = "data-table"
type = "int[10000]"
value_domain = "mostly {0,1}, indexed by SCJUMP decision id"
usage = "Persistent seen-state for progression decisions. Numbered scene scripts set the current scjump_decision_out cell after playback and synchronize it through the persistence opcode; INFOVO uses VIINIT's one-based prerequisites to unlock glossary topics."
source = "investigation"
confidence = "high"
depends_on = ["0x62ccf", "0x15a2a9"]
[[global]]
address = "0x56b85"
name = "enemy_encyclopedia_revealed_flags"
category = "data-table"
type = "int[1000]"
value_domain = "0 hidden; nonzero encountered/revealed, indexed by EBINIT unit id"
usage = "Persistent enemy-information reveal state. BTL marks both participating unit definitions as revealed and synchronizes their cells; INFOEN masks unrevealed unit names and details while still listing EBINIT rows enabled by unit_enemy_info_listed."
source = "investigation"
confidence = "high"
depends_on = ["0x712f6", "0x15a759"]
[[global]]
address = "0x15a759"
name = "current_enemy_encyclopedia_unit_id"
category = "index-pointer"
type = "int"
value_domain = "EBINIT unit definition id"
usage = "INFOEN's selected enemy-encyclopedia unit id. It indexes EBINIT presentation and reveal arrays, seeds a temporary runtime entity for stat display, and EIMES compares it against 192 sparse unit ids to dispatch summary and strategy lines."
source = "investigation"
confidence = "high"
depends_on = ["0x56b85", "0x712f6"]
[[global]]
address = "0xa6e5a"
name = "skill_sort_key"
category = "data-table"
type = "int[300]"
value_domain = "mostly unique values 10..2002"
usage = "SKINIT field populated for 129 of 131 skills. ADDEXP, ADDSKILL, CHMENU, INFOIT, and SETCH combine it with skill_category to construct deterministic skill-list ordering keys; higher-level sort operations consume the resulting indices."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa6f86"
name = "skill_category"
category = "data-table"
type = "int[300]"
value_domain = "1..7"
usage = "SKINIT category for all 131 skills. The records establish 1 movement/exploration, 2 defense/special attack, 3 utility/passive, 4 combat passive, 5 physical special, 6 offensive magic, and 7 healing magic. Combat and menu scripts dispatch directly on these values."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa70b2"
name = "skill_change_catalog_eligible"
category = "data-table"
type = "int[300]"
value_domain = "0/1; 11 eligible skills in shipped SKINIT"
usage = "SKINIT inclusion flag for CHMENU's fourth (skill-change) catalog. CHMENU scans all 300 ids, keeps only nonzero rows, sorts acquired rows ahead of unavailable rows using skill_category and skill_sort_key, and copies the acquired prefix into catalog row 3. Eligible ids are 1, 2, 112, 130..133, 210, 228, 230, and 231."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa71de"
name = "skill_min_range_encoded"
category = "data-table"
type = "int[300]"
value_domain = "1..2; stored minimum range plus one"
usage = "Populated for the 94 active skills. CALCSCOPE and CALCREVISE subtract one before using it as the lower range bound; SELACT and DRAWTIP use the same encoded bound."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa730a"
name = "skill_max_range_encoded"
category = "data-table"
type = "int[300]"
value_domain = "1..10; stored maximum range plus one"
usage = "Populated for the same 94 active skills as skill_min_range_encoded. CALCSCOPE subtracts one to obtain the upper bound, exactly matching descriptions such as range 3 -> stored 4 and range 9 -> stored 10."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa7436"
name = "skill_attack_element"
category = "data-table"
type = "int[300]"
value_domain = "1..8 (physical, universal, fire, ice, lightning, earth, holy, dark)"
usage = "Populated for 60 elemental attacks and spells. Values match the Japanese descriptions and the same eight-value attack-element enum used by item_attack_element; CALCSCOPE, CALCBTPARAM, and SELACT consume it."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa7562"
name = "skill_status_levels"
category = "data-table"
type = "int[300][30]"
columns = { "1" = "instant_death", "6" = "charm", "7" = "confusion", "8" = "paralysis", "9" = "poison", "10" = "water_flow", "11" = "fear" }
value_domain = "condition strength 1..4; zero means absent"
usage = "Sparse SKINIT row-major condition table consumed by CALCILL when applying a skill's effects to the target unit. Skill names and descriptions identify columns 1 instant death, 6 charm, 7 confusion, 8 paralysis, 9 poison, 10 water-flow, and 11 fear; the column layout matches item_status_delta_levels."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa988a"
name = "skill_icon_id"
category = "data-table"
type = "int[300]"
value_domain = "51..56"
usage = "SKINIT icon id for all 131 skills. CHMENU and INFOIT translate it into the shared icon atlas; the six ids group movement, defense, utility, passive, physical-special, and magic icons."
source = "investigation"
confidence = "high"
[[global]]
address = "0xa99b6"
name = "skill_combat_stat_deltas"
category = "data-table"
type = "int[300][10]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power" }
value_domain = "signed combat parameter deltas; observed -99..999"
usage = "Sparse SKINIT row-major table applied by CALCBTPARAM for the selected action. Descriptions and combat consumers establish columns 0 accuracy, 1 evasion, 2 physical attack, 3 physical defense, 4 magic attack, 5 magic defense, 6 speed, 7 luck, 8 critical chance, and 9 capture power. Column 7 is unpopulated in shipped SKINIT; CALCBTPARAM adds any luck and critical modifiers into the critical percentage that CALCDMG rolls after the hit check."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaa56e"
name = "skill_resource_deltas"
category = "data-table"
type = "int[300][3]"
columns = { "0" = "hp_recovery", "1" = "sp_cost" }
value_domain = "column 0 recovery 20..50; column 1 cost -20..-2"
usage = "Sparse SKINIT resource table used throughout skill selection and resolution. Column 0 is HP recovery for the three healing spells; column 1 is the negative SP cost for all 95 active skills, exactly matching each description. Column 2 is unpopulated in the shipped table."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaa8f2"
name = "skill_proc_chance_percent"
category = "data-table"
type = "int[300]"
value_domain = "10..100 percent"
usage = "Probability for 14 passive skills. CALCDMG compares random-modulo 100 against this value; examples include Re-action 20, Double Action 100, Counter 10, and Resurrection 50."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaaa1e"
name = "skill_battle_animation_id"
category = "data-table"
type = "int[300]"
value_domain = "BTANINIT animation ids 9..808"
usage = "Populated for 101 combat skills. BTL and CALCDMG place this value in the battle-animation selector before calling BTANINIT; most skills reuse their own id, while related skills deliberately share an animation and passive reactions use ids 801..808."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaab4a"
name = "skill_handler_script_id"
category = "data-table"
type = "int[300]"
value_domain = "12746 (0x31ca, SKMES.BIN) in the shipped table"
usage = "SKINIT field for all 131 skills. CHMENU and INFOIT look it up and pass it directly to call-script; packed id 0x31ca resolves to SKMES.BIN, the shared per-skill text/behavior dispatcher."
source = "investigation"
confidence = "high"
[[global]]
address = "0x66716"
name = "unit_voice_asset_ids"
category = "data-table"
type = "int[1000][30]"
columns = { "0" = "warp", "1" = "treasure_capture", "3" = "objective_interaction", "4" = "unused_slot_4", "5" = "unused_slot_5", "6" = "unused_slot_6", "7" = "normal_attack_1", "8" = "normal_attack_2", "9" = "normal_attack_3", "10" = "critical_normal_attack", "11" = "skill_use_1", "12" = "critical_skill_1", "13" = "skill_use_2", "14" = "critical_skill_2", "15" = "skill_use_3", "16" = "critical_skill_3", "17" = "unused_slot_17", "18" = "unused_slot_18", "19" = "damage_reaction_1", "20" = "damage_reaction_2", "21" = "damage_reaction_3", "22" = "defeated", "23" = "finishing_blow", "24" = "level_up" }
value_domain = "SYS4INI OGG asset ids; populated columns 0, 1, and 3..24"
usage = "EBINIT per-unit voice bank for 116 voiced characters and variants. FIELD directly selects column 0 before WARPD, column 1 when an acting unit takes chest/treasure contents, and column 3 after occupying, losing, or sealing a stage objective. BTL selects the acting unit's columns 7..9 for ordinary attacks, 10 for an ordinary critical, odd columns 11/13/15 for skill uses, and even columns 12/14/16 for critical skills; the three variants follow its six-step exchange selector. If the target survives positive damage, BTL selects target columns 19/20/21 with 60/30/10 percent weights; column 22 belongs to a target reduced to zero HP, while actor column 23 is selected for a finishing blow. SHOWGROW selects column 24 after level gain. Populated columns 4..6 and 17..18 have no reachable selector in the shipped script corpus and are retained as explicit unused authoring slots; columns 17 and 18 duplicate columns 15 and 16 in all 116 populated rows."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6dc46"
name = "unit_status_art_asset_ids"
category = "data-table"
type = "int[1000][3]"
columns = { "0" = "healthy", "1" = "wounded", "2" = "critical" }
value_domain = "SYS4INI CS*.AGF asset ids"
usage = "Three-variant status/menu illustration table for 25 principal characters. The ids resolve to 456x420 CS character art; DRAWCHP selects column 0 above 50% HP, column 1 at 26..50%, and column 2 at 25% or below, then loads the art into the status-panel texture slot."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6e7fe"
name = "unit_map_sprite_asset_ids"
category = "data-table"
type = "int[1000][5]"
columns = { "0" = "normal_compact", "1" = "normal_directional", "2" = "alternate_compact", "3" = "alternate_directional", "4" = "special_compact" }
value_domain = "SYS4INI CP*.AGF asset ids"
usage = "Five-context unit sprite-sheet table for 251 units. Even columns 0/2/4 are compact CP*AA-style presentations for normal, alternate-condition, and special-condition states; columns 1/3 are the matching normal/alternate full directional CP*AB sheets used by FIELD. INFOCH/INFOEN and DRAWENP reuse the compact representation."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6fb86"
name = "unit_battle_sprite_asset_id"
category = "data-table"
type = "int[1000]"
value_domain = "SYS4INI CB*.AGF asset ids"
usage = "Battle figure for 248 units. Values resolve to transparent full-body CB character/monster art; BTL loads the selected combatant's figure and INFOEN uses the same asset for the enemy detail view."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6ff6e"
name = "unit_battle_portrait_asset_ids"
category = "data-table"
type = "int[1000][2]"
columns = { "0" = "large_bust", "1" = "compact_face" }
value_domain = "SYS4INI CA*.AGF asset ids"
usage = "Paired battle portrait assets: column 0 is the larger CA*A bust where available, and column 1 is the compact CA*D face portrait. BTL, DRAWENP, and EVOLVE select these assets for combat and unit-growth presentation."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7073e"
name = "unit_battle_cutin_asset_ids"
category = "data-table"
type = "int[1000][2]"
columns = { "0" = "cropped_action", "1" = "full_frame" }
value_domain = "SYS4INI CIC*/CIN*.AGF asset ids"
usage = "Paired 800-pixel-wide battle cut-ins for 64 named characters. The values resolve to CIC cropped/action and CIN full-frame illustrations; BTL is the sole consumer."
source = "investigation"
confidence = "high"
[[global]]
address = "0x712f6"
name = "unit_enemy_info_listed"
category = "data-table"
type = "int[1000]"
value_domain = "0/1"
usage = "EBINIT eligibility flag for 183 enemy-information entries. INFOEN stable-sorts all unit ids, retains only rows whose value is nonzero, and then gates each retained entry's revealed state through the encounter/profile table."
source = "investigation"
confidence = "high"
[[global]]
address = "0x72296"
name = "unit_boss_class"
category = "data-table"
type = "int[1000]"
value_domain = "0=ordinary; signed boss class ±1..±4: 1=named/story character, 2=monster/special encounter, 3=demon-lord class, 4=final boss; positive values are defeat-boss victory targets and negative values are exempt"
usage = "Nonzero for 112 bosses, special encounters, summoned adds, and map hazards. CALCDMG grants every nonzero class the boss adjustment, CALCILL grants condition immunity, and FIELD/MAGIC/USEMAGIC exclude nonzero classes from ordinary-unit rules. On stages whose clear rule is defeat-boss targets, FIELD blocks victory only while a positive-class enemy remains; negative peers keep boss treatment but are ignored, as with Octavia beside Bridget, Deirdre's shadows, EX-8 adds beside Tiamat, and the final boss's three organs. Classes 1..3 are otherwise authoring categories with no distinct shipped-script branch. Either sign of class 4 selects the final-boss battle BGM and special tactical-map presentation."
source = "investigation"
confidence = "med"
[[global]]
address = "0x7267e"
name = "unit_canonical_id"
category = "data-table"
type = "int[1000]"
value_domain = "EBINIT canonical unit id 2..80"
usage = "Maps 106 alternate, boss, brainwashed, EX, and enemy variants back to their canonical character or recruitable archetype. For example all Estelle bosses map to 12, brainwashed Sylphine maps to 5, and ordinary/EX orcs map to recruitable orc 52. Setup, menus, inventory, dismissal, and combat normalize through this id."
source = "investigation"
confidence = "high"
[[global]]
address = "0x72a66"
name = "unit_capturable"
category = "data-table"
type = "int[1000]"
value_domain = "0/1"
usage = "Capture eligibility for 74 ordinary enemy archetypes. SELACT and FIELD allow the capture skill only when this flag is nonzero and the acting unit's capture power meets the target-level check; successful resolution displays the explicit 'Captured the enemy' message."
source = "investigation"
confidence = "high"
[[global]]
address = "0x72e4e"
name = "unit_roster_state_flag_base_index"
category = "data-table"
type = "int[1000]"
value_domain = "relative index 921..951 into the persistent flag bank at 0x6d3; four consecutive flags per mapped unit"
usage = "Persistent roster-state block for seven recruitable heroines. SALLY's first three unit actions mark offsets 1, 2, and 0 respectively; UNITECH marks the offset selected by its recruitment mode; DELCH, REMOVECH, SALLY, and EXILE mark offset 3 when the unit is removed or released. The values are relative indices into the shared flag bank, not absolute global addresses."
source = "investigation"
confidence = "high"
[[global]]
address = "0x73236"
name = "unit_sally_action_unlock_requirements"
category = "data-table"
type = "int[1000][4]"
columns = { "0" = "contract", "1" = "brainwash", "2" = "reserved_action", "3" = "sex_magic" }
value_domain = "-1 means unconditional, 0 means unavailable, positive values 1744..1915 are one-based indices into the flag bank at 0x6d3"
usage = "Availability requirements for SALLY's contract, brainwash, reserved, and sex-magic action slots. The SO012 button atlas and selection dispatch prove that UI choices 1, 2, and 3 select columns 0, 1, and 3; column 2 has a switch case but is deliberately skipped by both drawing and input, so it is reserved/unreachable in the shipped UI. While constructing the action mask, SALLY keeps a positive entry only when flag_bank[value - 1] equals 1, keeps -1 as unconditional, and clears an action whose entry is zero. Deploy, sacrifice, and release use separate eligibility logic."
source = "investigation"
confidence = "high"
[[global]]
address = "0x741d6"
name = "unit_sally_event_ids"
category = "data-table"
type = "int[1000][8]"
columns = { "0" = "contract", "1" = "brainwash", "2" = "reserved_action", "3" = "sex_magic_lily_child", "4" = "sex_magic_lily_girl", "5" = "sex_magic_lily_adult", "6" = "sacrifice", "7" = "release" }
value_domain = "SCJUMP event/decision ids 1200..1366; zero means no scripted event for that action"
usage = "SALLY event ids for contract, brainwash, the unreachable reserved action, Lily's child/girl/adult sex-magic forms, sacrifice, and release. The action switch selects columns 0, 1, 6, and 7 directly; sex magic selects the current Lily unit id plus one, yielding columns 3..5 for Lily unit ids 2..4. A populated reachable slot is copied to scjump_decision_out and translated through the SCJUMP resource table at 0x87a57 into next_script_resource_id. Column 2 is paired with the UI-skipped reserved action and its shipped ids 1300..1306 have no SCJUMP resource mapping. EXILE also tests column 7 when deciding whether a unit can be released."
source = "investigation"
confidence = "high"
[[global]]
address = "0x76116"
name = "unit_roster_variant_ids"
category = "data-table"
type = "int[1000][2]"
columns = { "0" = "normal", "1" = "brainwashed" }
value_domain = "EBINIT unit ids; column 0 normal/recruitable form, column 1 brainwashed heroine form"
usage = "Roster-form mapping for 36 recruitable units. Column 0 maps the summonable archetypes and principal heroines to their normal unit id; column 1 maps seven heroines to EBINIT ids 21..27, whose names explicitly identify their brainwashed states. SALLY replaces the selected party unit with the action-selected form, and UNITECH recruitment modes 3/4 select the same two columns."
source = "investigation"
confidence = "high"
[[global]]
address = "0x768e6"
name = "unit_sex_magic_bonus_item_id"
category = "data-table"
type = "int[1000]"
value_domain = "ITINIT item ids 101..710"
usage = "Item awarded by SALLY after the three form-dependent intimate-event actions for 22 eligible units. SALLY passes the value directly to USEITEM and then displays the selected character name followed by the literal message 'sex magic bonus' and the resolved item description. Principal heroines yield planetary stones; the remaining rows resolve to recovery items and rare materials."
source = "investigation"
confidence = "high"
[[global]]
address = "0x76cce"
name = "unit_essence_yield"
category = "data-table"
type = "int[1000]"
value_domain = "5..99"
usage = "Essence returned by SALLY's unit-conversion/release actions for 187 units. The normal path adds this value to current essence and the special path adds five times it, clamps to the essence cap, then applies the corresponding alignment adjustment; it is distinct from unit_deployment_cost_base."
source = "investigation"
confidence = "high"
[[global]]
address = "0x770b6"
name = "unit_summon_unlock_flag_index"
category = "data-table"
type = "int[1000]"
value_domain = "global unlock indices 1952..1981"
usage = "Summoning-stone/unlock flag index for the 29 recruitable monster archetypes. SUMMON and SALLY subtract one and test the corresponding cell in the shared flag bank at 0x6d3 before listing or advancing the unit; GAMESTART uses presence of this mapping when restoring party slots."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7749e"
name = "unit_summon_knowledge_threshold"
category = "data-table"
type = "int[1000]"
value_domain = "3..10; zero means no repeatable summon progression"
usage = "Per-archetype familiarity threshold for 19 summonable units. SUMMON divides accumulated progress by it for the displayed percentage and treats zero-threshold units as limited to one copy; SALLY awards the corresponding summoning item and 'deepened understanding' message when accumulated progress reaches the threshold."
source = "investigation"
confidence = "high"
[[global]]
address = "0x77886"
name = "unit_summon_point_cost"
category = "data-table"
type = "int[1000]"
value_domain = "6..999 points"
usage = "Point cost for the 29 summonable unit archetypes. SUMMON compares it with the current point pool, emits 'Insufficient points' on failure, subtracts it on success, and displays the same number in each catalog row."
source = "investigation"
confidence = "high"
[[global]]
address = "0x78c0e"
name = "unit_starting_equipment_item_id"
category = "data-table"
type = "int[1000]"
value_domain = "ITINIT item ids 203..451"
usage = "Fixed equipment for 22 named/boss unit records. Values cross-resolve to weapons, shields, armor, and accessories in ITINIT. SETEN equips the item instead of unit_default_attack_item_id, UNITECH grants it on first recruitment, and INFOEN derives the displayed defense element from it when applicable."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7ab4e"
name = "unit_auto_level_scale_divisor"
category = "data-table"
type = "int[1000]"
value_domain = "1 in the shipped table; zero disables automatic scaling"
usage = "Default level-scaling divisor for 192 enemy definitions. SETEN uses a scenario override when supplied, otherwise divides the difference between scenario level and unit_starting_level by this value, adds the result to the runtime level, and clamps it to unit_level_cap."
source = "investigation"
confidence = "high"
[[global]]
address = "0x83406"
name = "unit_experience_reward"
category = "data-table"
type = "int[1000]"
value_domain = "0 implicit/no award; populated values 10..100"
usage = "Per-opponent base experience progress. After each battle exchange, BTL awards a surviving faction-1 participant against the opposing unit definition. If the opponent survives, enemy-minus-player level differences >=3/2/1/<=0 select 40/30/20/10 percent. If the opponent is defeated, differences >=3/2/1/0/-1/-2/<=-3 select 250/200/150/100/75/40/20 percent. Integer division truncates. The result enters ADDEXP, whose normally cleared modifier bits can suppress, double, or multiply it by ten. A cell with no writer in the ordered INIT sequence remains zero; append unit 900 is such a cell and therefore awards zero at every bracket."
source = "investigation"
confidence = "high"
[[global]]
address = "0x837ee"
name = "unit_drop_item_ids"
category = "data-table"
type = "int[1000][8]"
columns = { "0" = "drop_1_item_id", "1" = "drop_2_item_id", "2" = "drop_3_item_id", "3" = "drop_4_item_id", "4" = "drop_5_item_id", "5" = "drop_6_item_id", "6" = "drop_7_item_id", "7" = "drop_8_item_id" }
value_domain = "ITINIT item ids 1..711; shipped rows populate columns 0..4"
usage = "Enemy drop table. Values cross-resolve to ITINIT items (for example treasure puttetto drops bronze/silver/gold coins and planet stones); BTL rolls and awards the rows, while INFOEN displays the possible drops."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8572e"
name = "unit_drop_chance_percent"
category = "data-table"
type = "int[1000][8]"
columns = { "0" = "drop_1_percent", "1" = "drop_2_percent", "2" = "drop_3_percent", "3" = "drop_4_percent", "4" = "drop_5_percent", "5" = "drop_6_percent", "6" = "drop_7_percent", "7" = "drop_8_percent" }
value_domain = "1..100 percent; columns align with unit_drop_item_ids"
usage = "Per-slot drop chance paired with unit_drop_item_ids. BTL draws random-modulo 100 for each populated slot and awards the item when the result is below this value; only columns 0..4 are populated in shipped EBINIT."
source = "investigation"
confidence = "high"
[[global]]
address = "0x8766e"
name = "unit_large_battle_sprite"
category = "data-table"
type = "int[1000]"
value_domain = "0/1"
usage = "Presentation flag for 33 large demons, dragons, gods, and their variants. BTL and INFOEN use it to anchor the CB battle figure at the lower screen edge and omit the ordinary-unit framing treatment required by smaller sprites."
source = "investigation"
confidence = "high"
[[global]]
address = "0x70f0e"
name = "unit_sort_key"
category = "data-table"
type = "int[1000]"
value_domain = "mostly unique values 10..2070"
usage = "EBINIT ordering key populated for 248 units. CHMENU, EXILE, SALLY, INFOEN, and SUMMON pass this array to op 0x12f's stable index sort or combine it with a unit id to build menu ordering keys, mirroring item_sort_key and skill_sort_key."
source = "investigation"
confidence = "high"
[[global]]
address = "0x716de"
name = "unit_icon_id"
category = "data-table"
type = "int[1000]"
value_domain = "1..103"
usage = "EBINIT icon selector populated for all 277 units. READICON returns it for unit ids; CHMENU, DRAWCHP, EXILE, SALLY, and SUMMON convert the value into icon-atlas page and cell coordinates."
source = "investigation"
confidence = "high"
[[global]]
address = "0x71ac6"
name = "unit_species_category"
category = "data-table"
type = "int[1000]"
value_domain = "1..3"
usage = "Broad EBINIT species/allegiance category for 198 units: value 1 covers humans and allied heroines, 2 covers demons including Emilio and Lily as well as many demonic monsters, and 3 covers other monsters, dragons, and elementals. CHMENU uses it for equipment restrictions, CALCDMG for category-sensitive effects, and INFOCH/INFOEN for display."
source = "investigation"
confidence = "med"
[[global]]
address = "0x71eae"
name = "unit_sex_category"
category = "data-table"
type = "int[1000]"
value_domain = "1 male, 2 female, 3 sexless"
usage = "EBINIT sex category for 251 units. Named character records establish the three values; CHMENU tests it against item_sex_restriction_mask, while INFOCH and INFOEN use the same category in unit presentation."
source = "investigation"
confidence = "high"
[[global]]
address = "0x77c6e"
name = "unit_defense_element"
category = "data-table"
type = "int[1000]"
value_domain = "1..12 (AFINIT defense-attribute enum)"
usage = "EBINIT defensive affinity for 250 units. DRAWENP renders it through the same twelve-value defense-attribute vocabulary as item_defense_element; CALCBTPARAM, BTRTN, and route scripts consume it during battle resolution."
source = "investigation"
confidence = "high"
[[global]]
address = "0x78056"
name = "unit_default_attack_item_id"
category = "data-table"
type = "int[1000]"
value_domain = "ITINIT innate-attack item ids 901..943"
usage = "EBINIT default attack for 250 units. Every populated value cross-resolves to ITINIT's innate-attack records; SELACT, BTL, CALCBTPARAM, CALCDMG, and CHMENU use it when no equipped weapon overrides the unit's natural attack."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7843e"
name = "unit_power_tier"
category = "data-table"
type = "int[1000]"
value_domain = "authoring tier 0..6"
usage = "Authoring-only EBINIT power/progression tier populated for 243 units. It is independent of species, sex, defense element, and boss class, but rises strongly with deployment cost, essence yield, level cap, and base stats. Lily's child/girl/adult forms are tiers 2/4/6, and recurring heroine boss definitions generally rise as their story appearances become stronger. No shipped script reads the array, and the /v2 native image contains no literal reference to its global index, so the descriptive name is correlation-based rather than a runtime behavior claim."
source = "inference"
confidence = "med"
[[global]]
address = "0x78826"
name = "unit_weapon_item_category"
category = "data-table"
type = "int[1000]"
value_domain = "-1 unrestricted, otherwise item categories 10..19"
usage = "EBINIT weapon/equipment-family restriction for 179 units. CHMENU compares an item's item_category directly with this value when deciding whether the selected unit can equip it; Lily's forms store -1 for unrestricted handling."
source = "investigation"
confidence = "high"
[[global]]
address = "0x78ff6"
name = "unit_starting_skill_ids"
category = "data-table"
type = "int[1000][4]"
columns = { "0" = "skill_slot_1", "1" = "skill_slot_2", "2" = "skill_slot_3", "3" = "skill_slot_4" }
value_domain = "SKINIT skill ids 1..249; zero means empty"
usage = "EBINIT four-slot starting skill record. The shipped table populates the first three columns. SETEN, UNITECH, and SALLY copy the row into each runtime unit's skill list; GAMESTART, FORT, FIELD, and DRAWENP inspect the same ids, all of which cross-resolve to SKINIT."
source = "investigation"
confidence = "high"
[[global]]
address = "0x79f96"
name = "unit_deployment_cost_base"
category = "data-table"
type = "int[1000]"
value_domain = "5..99"
usage = "Base deployment/command cost for 204 units. SETCH, SETEN, and ADDEXP copy it plus the per-unit adjustment at 0x57357 into runtime cost 0x5f0bb; SALLY checks the prospective total against party capacity, while FIELD/READY add it to and REMOVECH subtracts it from the deployed-cost aggregate."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7a37e"
name = "unit_starting_level"
category = "data-table"
type = "int[1000]"
value_domain = "1..99"
usage = "EBINIT initial level for 242 units. Lily's three forms store levels 1, 20, and 40. SETEN and SALLY copy or compare it while constructing a runtime unit, and UNITECH uses it when synchronizing form and character state."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7a766"
name = "unit_level_cap"
category = "data-table"
type = "int[1000]"
value_domain = "1..99"
usage = "EBINIT maximum level for 243 units. ADDEXP permits level growth only while the runtime level is below this field, and SETEN uses it as the default upper bound when no scenario-specific enemy cap is supplied."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7af36"
name = "unit_base_stats"
category = "data-table"
type = "int[1000][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "nonnegative base stat values; populated columns 2..7 and 10..13"
usage = "EBINIT fourteen-column base-stat record copied wholesale into each runtime unit by SETEN, UNITECH, and SALLY. Its layout matches item_stat_modifiers: columns 2 physical attack, 3 physical defense, 4 magic attack, 5 magic defense, 6 speed, 7 luck, 10 movement, 11 max HP, 12 max SP, and 13 max FS; accuracy/evasion and other unpopulated columns begin at zero."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7e5e6"
name = "unit_stat_growth_rates"
category = "data-table"
type = "int[1000][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "per-level hundredths; populated columns 2..7 and 11..13"
usage = "EBINIT per-level growth record with the same fourteen-column layout as unit_base_stats. ADDEXP adds each rate to a fractional accumulator, divides by 100 to award whole stat points, and retains the remainder; SETEN and UNITECH apply the same rates when materializing units above their starting level."
source = "investigation"
confidence = "high"
[[global]]
address = "0x0"
name = "system_flow_request"
category = "choice-output"
type = "int"
value_domain = "0..5"
usage = "Return-mode request shared by TITLE/GAMESTART and SYSTEM4. The natural New Game path writes 1 immediately after GAMESTART's TUNE call; TITLE returns and SYSTEM4 routes value 1 into its ADV scene loop. Values 2/3/5 route to FORT/FIELD/CAMP; other writers use the same system-level request channel."
source = "investigation"
confidence = "high"
depends_on = ["0x699", "0x62ccf"]
[[global]]
address = "0x699"
name = "next_script_resource_id"
category = "choice-output"
type = "int"
value_domain = "raw SYS4INI id or 0"
usage = "SYSTEM4's computed child-script resource id. On the normal ADV path SYSTEM4 copies G[0x87a57][scjump_decision_out] here, substitutes raw id 0x22 (SC0000.BIN) when zero, executes call-script through this cell at offset 0x477, then clears it after the child returns."
source = "investigation"
confidence = "high"
depends_on = ["0x62ccf"]
[[global]]
address = "0x87a57"
name = "scjump_scene_script_resource_ids"
category = "data-table"
type = "int[10000]"
value_domain = "packed SYS4INI script resource id; shipped SCINIT values resolve to SCxxxx.BIN"
usage = "SCINIT's sparse decision-to-script registry. SYSTEM4, FIELD, SALLY, and TRAIN index it by scjump_decision_out, then either call the returned packed resource id or copy it to next_script_resource_id. SCINIT contains 1,209 final decision rows backed by 2,179 source assignments; all 135 distinct packed ids resolve to numbered SC scene scripts."
source = "investigation"
confidence = "high"
depends_on = ["0x62ccf", "0x699", "0x8a167"]
[[global]]
address = "0x8a167"
name = "scjump_authored_chapters"
category = "data-table"
type = "int[10000]"
value_domain = "-1 or chapter 1..9"
usage = "SCINIT's parallel authored chapter metadata for each scjump_scene_script_resource_ids entry. Source assignments form contiguous chapter 1..9 runs followed by an unassigned -1 run. Of the 847 decision ids currently emitted by SCJUMP, 844 final tags agree with SCJUMP's independently decoded chapter paths; three retained mismatches are legacy/stale metadata. No shipped script reads this array directly."
source = "investigation"
confidence = "high"
depends_on = ["0x87a57", "0x3234", "0x62ccf"]
[[global]]
address = "0xeff78"
name = "movement_routine_provider_selectors"
category = "data-table"
type = "int[1000][20]"
value_domain = "RTN_M provider selector: 1..18, 51..53, or 61; 0 terminates a row"
usage = "RTINIT movement bank 0. MVRTN indexes it by current_routine_set_id and routine_step_index, resolves the selector through its RTN_M001..018/051..053/061 provider table, and call-scripts the selected movement routine."
source = "investigation"
confidence = "high"
depends_on = ["0xeff75", "0xeff76"]
[[global]]
address = "0xf4d98"
name = "movement_routine_activation_percents"
category = "data-table"
type = "int[1000][20]"
value_domain = "10..100 percent"
usage = "RTINIT movement bank 1. After all other step gates pass, MVRTN executes the provider only when random-modulo-100 is below this value."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78"]
[[global]]
address = "0xf9bb8"
name = "movement_routine_parameter_1"
category = "data-table"
type = "int[1000][20]"
value_domain = "provider-specific integer"
usage = "RTINIT movement bank 2. Its meaning is tagged by movement_routine_provider_selectors: RTN_M004 uses a stage_object_slot_index; RTN_M005/011/012 use destination_tile_x; RTN_M006/007/015 use maximum_target_route_steps; RTN_M010 uses resource_index (0=HP, 1=SP, 2=FS; shipped cells are unwritten/default zero); RTN_M013 uses target_faction_filter; and RTN_M014 uses maximum_threat_route_steps. The one RTN_M001 and one RTN_M008 authored cells are never read by those providers."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78"]
[[global]]
address = "0xfe9d8"
name = "movement_routine_parameter_2"
category = "data-table"
type = "int[1000][20]"
value_domain = "provider-specific integer"
usage = "RTINIT movement bank 3. Its meaning is tagged by movement_routine_provider_selectors: RTN_M005/011/012 use destination_tile_y, RTN_M007 uses maximum_target_hp_percent, and RTN_M010 uses maximum_resource_percent. The lone RTN_M001-authored value is never read by that provider."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78"]
[[global]]
address = "0x1037f8"
name = "movement_routine_parameter_3"
category = "data-table"
type = "int[1000][20]"
value_domain = "provider-specific integer"
usage = "RTINIT movement bank 4. RTN_M011 uses it as a one-based waypoint_ordinal, executing only the step whose ordinal matches the entity's current zero-based waypoint index."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78"]
[[global]]
address = "0x108618"
name = "movement_routine_parameter_4"
category = "data-table"
type = "int[1000][20]"
value_domain = "{1,2}"
usage = "RTINIT movement bank 5. RTN_M011 uses a nonzero value as path_cost_limit_override; zero or an unwritten cell falls back to the entity's current FS."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78"]
[[global]]
address = "0x112258"
name = "movement_routine_minimum_progress_counts"
category = "data-table"
type = "int[1000][20]"
value_domain = "positive step-progress threshold; shipped RTINIT writes 1"
usage = "RTINIT movement bank 7. MVRTN requires the current entity's matching movement-step progress counter to reach this value; movement providers increment those counters as their steps execute."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78", "0x53643"]
[[global]]
address = "0x117078"
name = "movement_routine_required_story_flag_ids"
category = "data-table"
type = "int[1000][20]"
value_domain = "one-based story_event_flags id"
usage = "RTINIT movement bank 8. MVRTN subtracts one and rejects the step when the referenced story flag is not set."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78", "0x6d3"]
[[global]]
address = "0x11be98"
name = "movement_routine_forbidden_story_flag_ids"
category = "data-table"
type = "int[1000][20]"
value_domain = "one-based story_event_flags id"
usage = "RTINIT movement bank 9. MVRTN subtracts one and rejects the step when the referenced story flag is set."
source = "investigation"
confidence = "high"
depends_on = ["0xeff78", "0x6d3"]
[[global]]
address = "0x120cb8"
name = "battle_routine_provider_selectors"
category = "data-table"
type = "int[1000][20]"
value_domain = "RTN_B provider selector 1..4; 0 terminates a row"
usage = "RTINIT battle bank 10. BTRTN indexes it by current_routine_set_id and routine_step_index, resolves the selector through RTN_B001..004, and call-scripts the selected battle routine."
source = "investigation"
confidence = "high"
depends_on = ["0xeff75", "0xeff76"]
[[global]]
address = "0x125ad8"
name = "battle_routine_activation_percents"
category = "data-table"
type = "int[1000][20]"
value_domain = "70 or 100 percent in shipped RTINIT"
usage = "RTINIT battle bank 11. BTRTN executes a candidate step only when the current entity's matching random-modulo-100 battle-step roll is below this value."
source = "investigation"
confidence = "high"
depends_on = ["0x120cb8", "0x56738"]
[[global]]
address = "0x12a8f8"
name = "battle_routine_parameter_1"
category = "data-table"
type = "int[1000][20]"
value_domain = "provider-specific integer"
usage = "RTINIT battle bank 12. RTN_B004 uses it to choose an entry from the prepared battle-action candidate table."
source = "investigation"
confidence = "high"
depends_on = ["0x120cb8"]
[[global]]
address = "0x147db8"
name = "battle_routine_required_story_flag_ids"
category = "data-table"
type = "int[1000][20]"
value_domain = "one-based story_event_flags id"
usage = "RTINIT battle bank 18. BTRTN subtracts one and rejects the step when the referenced story flag is not set."
source = "investigation"
confidence = "high"
depends_on = ["0x120cb8", "0x6d3"]
[[global]]
address = "0x14cbd8"
name = "battle_routine_forbidden_story_flag_ids"
category = "data-table"
type = "int[1000][20]"
value_domain = "one-based story_event_flags id"
usage = "RTINIT battle bank 19. BTRTN subtracts one and rejects the step when the referenced story flag is set."
source = "investigation"
confidence = "high"
depends_on = ["0x120cb8", "0x6d3"]
[[global]]
address = "0x3234"
name = "chapter_mode"
category = "story-flag"
type = "int"
value_domain = "1..9"
usage = "Progression chapter/mode selector. SCJUMP's top-level switch keys on it; branch-read by progression scripts (FIELD etc.), not directly by SC/SP scenes."
source = "investigation"
confidence = "high"
depends_on = ["0x62ccf"]
[[global]]
address = "0xa57"
name = "lily_form_a"
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "Lily current-form flag A. Exactly one of form A/B/C is 1; gates form-specific voiced dialogue (seeding 0xa57=1 -> SC0000 186->229 lines). Set externally (menu/save), no static writer."
source = "investigation"
confidence = "high"
depends_on = ["0xa58", "0xa59"]
[[global]]
address = "0xa58"
name = "lily_form_b"
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "Lily current-form flag B. See lily_form_a."
source = "investigation"
confidence = "high"
depends_on = ["0xa57", "0xa59"]
[[global]]
address = "0xa59"
name = "lily_form_c"
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "Lily current-form flag C. See lily_form_a."
source = "investigation"
confidence = "high"
depends_on = ["0xa57", "0xa58"]
[[global]]
address = "0x6c1"
name = "adv_chrome_enabled"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Inherited SYSTEM4 UI-boot flag. Standard ADV scripts register the five visible SO001 control-strip pointer rectangles only while nonzero; zero skips directly to the three off-screen keyboard/pad records. The Phase-A single-scene Godot bootstrap seeds the native observed value 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6c9", "0x6ca", "0x6cb", "0x6cc", "0x6cd"]
[[global]]
address = "0x62425"
name = "adv_hide_window_enabled"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Native ADV-scheduler permission for the standard Hide Window action. After op 0x199 enters the registered yield-A handler, every standard ADV scene calls HIDEWIN.BIN only while this value is nonzero. No script writes it and the complete boot-to-SC0000 VM-write capture does not contain it, so it is native-owned inherited state rather than saved-game or script boot data. The Godot scene bootstrap mirrors the original enabled value 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6c1"]
[[global]]
address = "0x3239"
name = "adv_layer_surface_slots"
category = "data-table"
type = "int[8][3]"
columns = { "0" = "primary_surface_slot", "1" = "alternate_surface_slot", "2" = "transition_surface_slot" }
value_domain = "eight rows initialized to primary slots 4..11, alternate slots 43..50, and transition slots 51..58"
usage = "Shared ADV graphics-layer surface-slot registry. Scene setup initializes the three banks. The CG loader uses the primary slot for a fresh retained object, alternates between columns zero and one when replacing an already-bound layer, and uses column two for the transition/crossfade surface and cleanup. The corpus has 2,657 table-base accesses across 309 scripts."
source = "investigation"
confidence = "high"
depends_on = ["0x62450", "0x62452", "0x62455"]
[[global]]
address = "0x62424"
name = "adv_gfx_resource_id"
category = "index-pointer"
type = "int"
value_domain = "SYS4INI file/resource id"
usage = "Transient ADV graphics-load input. Scene scripts set this immediately before their common layer loader, which passes it to set-texture together with adv_gfx_surface_slot_work."
source = "investigation"
confidence = "high"
depends_on = ["0x62452"]
[[global]]
address = "0x62450"
name = "adv_gfx_layer_index"
category = "index-pointer"
type = "int"
value_domain = "0..7"
usage = "Current ADV graphics-layer row. All immediate assignments across the corpus are 0..7; common scene loaders use it to index adv_gfx_object_handles, per-layer geometry arrays, and adv_layer_surface_slots."
source = "investigation"
confidence = "high"
depends_on = ["0x3239", "0x62455"]
[[global]]
address = "0x62452"
name = "adv_gfx_surface_slot_work"
category = "index-pointer"
type = "int"
value_domain = "-1 for no retained-object binding, otherwise a graphics surface slot"
usage = "Working surface slot for the current ADV layer. Opcode 0x215 writes the retained object's existing source slot or -1; the common loader falls back to adv_layer_surface_slots, then passes the selected slot through set-texture, size queries, draw binding, and release."
source = "investigation"
confidence = "high"
depends_on = ["0x3239", "0x62455"]
[[global]]
address = "0x62455"
name = "adv_gfx_object_handles"
category = "data-table"
type = "int[20]"
value_domain = "retained graphics-object handles; INIT2 populates the first nine cells"
usage = "ADV retained-object handles indexed by adv_gfx_layer_index. INIT2 seeds handles 0xcb20, 0xcb2a, and 0xcb8e..0xcbc0 for the first nine cells; scene loaders query, bind, animate, and erase those objects while the eight-row surface-slot registry governs layers zero through seven."
source = "investigation"
confidence = "high"
depends_on = ["0x62450", "0x62452"]
[[global]]
address = "0x2e49"
name = "character_voice_suppressed"
category = "data-table"
type = "int[13]"
value_domain = "13 cells of {0,1}; 0 enables that character's voice, 1 suppresses it"
usage = "Base of the per-character voice enable/suppress settings. INITCONFIG zero-fills all 13 cells and registers each with the shared profile service; LOADCONFIG restores them. CONFIG indexes the table to preview a character voice and write 0/1. ROOM reads cell 0 before assigning its selected greeter's greeting/farewell voice ids, so the port's former scalar interpretation of zero-int-range (writing 13 into the base cell) suppressed those voices on every natural boot. This names the script-visible setting array without choosing a persistence backend for op 0x1a2/0x1a3."
source = "investigation"
confidence = "high"
depends_on = []
[[global]]
address = "0x6c9"
name = "adv_hover_history"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Pointer-hover flag for the standard ADV History button at (684,572). Its op 0x90 enter/leave callbacks set 1/0; the shared SO001 redraw shows the History tooltip plus generic hover overlay while set."
source = "investigation"
confidence = "high"
depends_on = ["0x6ca", "0x6cb", "0x6cc", "0x6cd"]
[[global]]
address = "0x6ca"
name = "adv_hover_auto_message"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Pointer-hover flag for the standard ADV Auto-message button at (706,572). See adv_hover_history."
source = "investigation"
confidence = "high"
depends_on = ["0x6c9"]
[[global]]
address = "0x6cb"
name = "adv_hover_message_skip"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Pointer-hover flag for the standard ADV all-message Skip button at (728,572). See adv_hover_history."
source = "investigation"
confidence = "high"
depends_on = ["0x6c9"]
[[global]]
address = "0x6cc"
name = "adv_hover_read_message_skip"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Pointer-hover flag for the standard ADV read-message-only Skip button at (750,572). See adv_hover_history."
source = "investigation"
confidence = "high"
depends_on = ["0x6c9"]
[[global]]
address = "0x6cd"
name = "adv_hover_hide_window"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "Pointer-hover flag for the standard ADV Hide-window button at (772,572). See adv_hover_history."
source = "investigation"
confidence = "high"
depends_on = ["0x6c9"]
[[global]]
address = "0x62ccf"
name = "scjump_decision_out"
category = "choice-output"
type = "int"
value_domain = "0..1693 in shipped SCJUMP"
usage = "SCJUMP's selected progression decision id. Its chapter/flag decision tree writes one of 847 distinct values across 1,755 sites; SYSTEM4, FIELD, SALLY, and TRAIN use it to index scjump_scene_script_resource_ids and dispatch the corresponding SCxxxx scene script."
source = "investigation"
confidence = "high"
depends_on = ["0x3234", "0x87a57"]
[[global]]
address = "0xeff75"
name = "current_routine_set_id"
category = "index-pointer"
type = "int"
value_domain = "RTINIT row id 1..176"
usage = "Shared RTINIT row selector. MVRTN loads the current entity's difficulty-selected movement routine set; BTRTN loads its battle routine set. Both then iterate routine_step_index across the selected twenty-slot row."
source = "investigation"
confidence = "high"
depends_on = ["0x53517", "0x535ad", "0xeff76"]
[[global]]
address = "0xeff76"
name = "routine_step_index"
category = "index-pointer"
type = "int"
value_domain = "0..19"
usage = "Shared RTINIT step selector. MVRTN and BTRTN iterate it from zero through nineteen and use it as the column index in every routine bank and matching per-entity runtime row."
source = "investigation"
confidence = "high"
depends_on = ["0xeff75"]
[[global]]
address = "0xeff77"
name = "routine_execution_state"
category = "choice-output"
type = "int"
value_domain = "0..3"
usage = "Shared movement/battle routine result state. MVRTN and BTRTN clear it before scanning steps; a nonzero provider result stops the scan. Movement providers use state 1 for ordinary field movement/progress, state 2 for an immediate offensive battle action, and state 3 for an immediate healing/support action; MVRTN supplies state 1 when no provider produced another result."
source = "investigation"
confidence = "high"
depends_on = ["0xeff75", "0xeff76"]
[[global]]
address = "0x4e11b"
name = "entity_effective_stats"
category = "data-table"
type = "int[50][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "calculated runtime stat values"
usage = "Per-runtime-entity effective fourteen-stat row after CALCREVISE applies base data, equipment, skills, and conditions. Combat/UI consumers use columns 0..10 directly; columns 11..13 are the maxima paired with entity_current_resources HP/SP/FS."
source = "investigation"
confidence = "high"
depends_on = ["0x4e085"]
[[global]]
address = "0x4e021"
name = "entity_runtime_flags"
category = "data-table"
type = "int[50]"
value_domain = "runtime entity bitfield; bit 0 marks an active entity"
usage = "Per-runtime-entity state flags. RTN_M007 requires bit 0 when selecting an injured ally, and MVSEEK mode 2 requires it before masking a foreign entity's occupied terrain cell."
source = "investigation"
confidence = "high"
depends_on = ["0x522ed", "0x5231f", "0x52351"]
[[global]]
address = "0x4dfbd"
name = "entity_unit_definition_ids"
category = "data-table"
type = "int[50]"
value_domain = "EBINIT unit definition id"
usage = "Definition id backing each runtime map entity. SETEN writes current_unit_id when materializing an enemy; BTL uses the opposing entity's value to read unit_experience_reward and drop tables, while ADDEXP uses the faction-1 participant's value to select persistent playable-unit state."
source = "investigation"
confidence = "high"
depends_on = ["0x66715", "0x83406"]
[[global]]
address = "0x4e053"
name = "entity_levels"
category = "data-table"
type = "int[50]"
value_domain = "runtime unit level 1..99"
usage = "Displayed/runtime level for each map entity. SETEN begins enemies at unit_starting_level, applies party-reference auto-scaling and stage minimum/maximum clamps, and BTL subtracts the surviving faction-1 participant's level from the opponent's level to choose the experience multiplier bracket."
source = "investigation"
confidence = "high"
depends_on = ["0x7a37e", "0xe782f", "0xe784d", "0x204f8"]
[[global]]
address = "0x4e085"
name = "entity_current_resources"
category = "data-table"
type = "int[50][3]"
columns = { "0" = "current_hp", "1" = "current_sp", "2" = "current_fs" }
value_domain = "nonnegative current HP/SP/FS values"
usage = "Per-runtime-entity current resources. DRAWCHP/DRAWENP render columns 0..2 against max-stat columns 11..13, skill/item resource deltas modify the same three columns, and movement search compares path cost with current_fs."
source = "investigation"
confidence = "high"
depends_on = ["0x4e11b"]
[[global]]
address = "0x4e693"
name = "entity_skill_flags"
category = "data-table"
type = "int[50][300]"
value_domain = "zero absent; nonzero skill state indexed by SKINIT skill id"
usage = "Per-runtime-entity skill-state row. CALCREVISE and CALCSCOPE mark equipped skills, combat/field consumers test specific skill ids, and RTN_M009 requires skill 22 (Unlock) before treating an unopened type-7 chest as a treasure target."
source = "investigation"
confidence = "high"
depends_on = ["0x5212b", "0xa6f86"]
[[global]]
address = "0x522ed"
name = "entity_faction_ids"
category = "data-table"
type = "int[50]"
value_domain = "runtime faction/side id"
usage = "Per-runtime-entity faction id. RTN_M007 restricts its injured-unit target to the acting entity's faction; MVSEEK mode 2 compares this value while masking active foreign-entity cells, and ordinary movement checks the acting faction's bit in tile passability masks."
source = "investigation"
confidence = "high"
depends_on = ["0x4e021"]
[[global]]
address = "0x5231f"
name = "entity_tile_x"
category = "data-table"
type = "int[50]"
value_domain = "current map X coordinate"
usage = "Per-runtime-entity map X coordinate. FIELD movement and occupancy logic maintain it; movement providers pair it with entity_tile_y and compare or route from the current tile."
source = "investigation"
confidence = "high"
depends_on = ["0x52351"]
[[global]]
address = "0x52351"
name = "entity_tile_y"
category = "data-table"
type = "int[50]"
value_domain = "current map Y cell key"
usage = "Per-runtime-entity map Y coordinate paired with entity_tile_x. Values use the same stage map-space cell keys as STINIT object and enemy coordinates."
source = "investigation"
confidence = "high"
depends_on = ["0x5231f"]
[[global]]
address = "0x25fa"
name = "condition_level_names"
category = "string-table"
type = "string[30][5]"
columns = { "0" = "level_1", "1" = "level_2", "2" = "level_3", "3" = "level_4", "4" = "level_5" }
value_domain = "ILINIT-authored display strings for condition ids 1..11, 13, and 14"
usage = "ILINIT's row-major five-name matrix. Runtime condition UI selects the row by condition id and the column by current level minus one; id 1 has only the unnumbered instant-death label, id 12 and ids 15..29 are reserved."
source = "investigation"
confidence = "high"
depends_on = ["0x52383"]
[[global]]
address = "0x315"
name = "unit_story_display_names"
category = "string-table"
type = "string[1000]"
value_domain = "CNINIT-authored speaker/display name indexed by EBINIT unit id"
usage = "CNINIT's sparse unit-id keyed story-name table. Scene scripts and HISTORY draw the selected speaker's value, DEBUGADV uses it for its scripted speaker previews, and INPUTNAME rejects a player-entered familiar name that collides with any populated row. The table intentionally leaves Lily's form ids 2..4 empty."
source = "investigation"
confidence = "high"
depends_on = ["0x624bf"]
[[global]]
address = "0x624bf"
name = "unit_voice_family_unit_ids"
category = "data-table"
type = "int[1000]"
value_domain = "EBINIT unit id"
usage = "CNINIT's sparse unit-id keyed voice-family normalization map. Story, history, field, and battle voice paths map the current unit variant through this table before selecting the family-level voice-suppression state; 175 of 277 authored rows alias a variant to another representative unit id."
source = "investigation"
confidence = "high"
depends_on = ["0x628a7", "0x2e49"]
[[global]]
address = "0x628a7"
name = "unit_voice_suppression_flag_ids"
category = "data-table"
type = "int[1000]"
value_domain = "0 for no mapped setting; 1..12 index character_voice_suppressed"
usage = "CVINIT's unit-to-setting inverse map for the twelve named character voice controls. Story, history, field, and battle paths normalize the current unit through unit_voice_family_unit_ids, index this table by that representative unit id, and suppress voice playback when the selected character_voice_suppressed cell is nonzero."
source = "investigation"
confidence = "high"
depends_on = ["0x2e49", "0x62c8f"]
[[global]]
address = "0x56223"
name = "unit_story_speaker_seen_flags"
category = "data-table"
type = "int[1000]"
value_domain = "per-EBINIT-unit {0,1}; 1 after that unit has appeared as a story speaker"
usage = "Scene scripts set and persist a unit's cell when drawing that speaker's name. CONFIG reloads the twelve CVINIT-mapped unit cells and enables each named character-voice control only after its speaker has been encountered."
source = "investigation"
confidence = "high"
depends_on = ["0x315", "0x62c8f"]
[[global]]
address = "0x62c8f"
name = "character_voice_setting_unit_ids"
category = "data-table"
type = "int[13]"
columns = { "0" = "system_or_reserved", "1" = "lily", "2" = "sylphine", "3" = "sasune", "4" = "vidal", "5" = "estelle", "6" = "nelly", "7" = "tiofania", "8" = "colette", "9" = "bridget", "10" = "octavia", "11" = "fam", "12" = "deirdre" }
value_domain = "slot 0 unwritten; slots 1..12 contain EBINIT unit ids"
usage = "CVINIT's CONFIG-row join. CONFIG iterates setting slots 1..12, resolves each unit id through unit_story_display_names for its label, and tests the same unit's unit_story_speaker_seen_flags cell before exposing the row. CVINIT also writes the exact inverse mapping to unit_voice_suppression_flag_ids."
source = "investigation"
confidence = "high"
depends_on = ["0x315", "0x56223", "0x628a7"]
[[global]]
address = "0x62cad"
name = "character_voice_preview_asset_ids"
category = "data-table"
type = "int[13]"
columns = { "0" = "system_voice", "1" = "lily", "2" = "sylphine", "3" = "sasune", "4" = "vidal", "5" = "estelle", "6" = "nelly", "7" = "tiofania", "8" = "colette", "9" = "bridget", "10" = "octavia", "11" = "fam", "12" = "deirdre" }
value_domain = "packed OGG asset resource id"
usage = "CVINIT's thirteen voice-setting preview clips. CONFIG indexes this array by setting slot and plays the selected clip; slot 0 is the non-unit system voice, while slots 1..12 join to character_voice_setting_unit_ids."
source = "investigation"
confidence = "high"
depends_on = ["0x2e49", "0x62c8f"]
[[global]]
address = "0x62cd1"
name = "gallery_image_assets"
category = "data-table"
type = "int[2000][2]"
columns = { "0" = "gallery_image_asset_id", "1" = "save_stage_preview_asset_id" }
value_domain = "packed asset resource ids; preview zero/unwritten means capture the current screen"
usage = "CGINIT's sparse gallery asset rows. CGMODE tests and displays column 0 as the full-size gallery image. SAVE and SELSTAGE scan column 0 for the current image and, when column 1 is populated, load that 112x84 preview instead of capturing the current screen."
source = "investigation"
confidence = "high"
depends_on = ["0x63c71", "0x64441", "0x64c11"]
[[global]]
address = "0x63c71"
name = "gallery_thumbnail_sheet_ids"
category = "data-table"
type = "int[2000]"
value_domain = "one-based thumbnail-sheet id 1..4"
usage = "CGINIT's gallery thumbnail-atlas selector. CGMODE subtracts one, remaps the configured sheet through gallery_thumbnail_sheet_asset_ids, and groups every populated gallery record under that sheet."
source = "investigation"
confidence = "high"
depends_on = ["0x66381", "0x64441"]
[[global]]
address = "0x64441"
name = "gallery_thumbnail_slot_ids"
category = "data-table"
type = "int[2000]"
value_domain = "one-based thumbnail-atlas slot 1..30"
usage = "CGINIT's slot within the selected 6x5 thumbnail atlas. CGMODE subtracts one, draws that one of thirty 126x95 cells, and reports the unlocked/total variant counts associated with the slot."
source = "investigation"
confidence = "high"
depends_on = ["0x63c71", "0x64c11"]
[[global]]
address = "0x64c11"
name = "gallery_variant_ordinals"
category = "data-table"
type = "int[2000]"
value_domain = "one-based variant ordinal 1..23; zero/unwritten means no gallery record"
usage = "CGINIT's ordering key for multiple full-size images behind one thumbnail slot. CGMODE subtracts one and stores the gallery record id at sheet[slot*100 + ordinal], then walks that ordered variant list in the image viewer."
source = "investigation"
confidence = "high"
depends_on = ["0x62cd1", "0x63c71", "0x64441"]
[[global]]
address = "0x66381"
name = "gallery_thumbnail_sheet_asset_ids"
category = "data-table"
type = "int[10]"
value_domain = "packed thumbnail-atlas asset resource id; zero disables a sheet"
usage = "CGMODE's configured thumbnail-sheet resources. INIT2 populates the first four cells with SO026A.AGF through SO026D.AGF and leaves the remaining six reserved; CGMODE compacts nonzero cells into its visible sheet list before applying gallery_thumbnail_sheet_ids."
source = "investigation"
confidence = "high"
depends_on = ["0x63c71"]
[[global]]
address = "0x52383"
name = "entity_condition_levels"
category = "data-table"
type = "int[50][30]"
columns = { "1" = "instant_death", "2" = "hp_drain", "3" = "sp_drain", "4" = "fs_drain", "5" = "curse", "6" = "charm", "7" = "confusion", "8" = "paralysis", "9" = "poison", "10" = "water_flow", "11" = "fear", "12" = "reserved", "13" = "regeneration", "14" = "exaltation" }
value_domain = "condition level 0..5; zero means inactive"
usage = "Per-runtime-entity current condition levels. ADDILLSUB applies signed level deltas, clamps the minimum to entity_condition_baseline_levels and the maximum to 5, and assigns condition duration. CALCREVISE, FIELD, combat, and UI consumers index the same ILINIT-defined 30-column condition id space."
source = "investigation"
confidence = "high"
depends_on = ["0x52f3b", "0x5295f", "0xaacf0"]
[[global]]
address = "0x5295f"
name = "entity_condition_remaining_turns"
category = "data-table"
type = "int[50][30]"
columns = { "1" = "instant_death", "2" = "hp_drain", "3" = "sp_drain", "4" = "fs_drain", "5" = "curse", "6" = "charm", "7" = "confusion", "8" = "paralysis", "9" = "poison", "10" = "water_flow", "11" = "fear", "12" = "reserved", "13" = "regeneration", "14" = "exaltation" }
value_domain = "-1 permanent/baseline, 0 inactive, positive remaining turns"
usage = "Per-runtime-entity duration counters paired with entity_condition_levels. FIELD decrements positive counters and removes the condition when a counter reaches zero; DRAWENP displays negative values as infinity. RECOVER writes -1 when a recoverable condition retains an equipment/passive baseline and zero when it clears completely."
source = "investigation"
confidence = "high"
depends_on = ["0x52383", "0x52f3b"]
[[global]]
address = "0x52f3b"
name = "entity_condition_baseline_levels"
category = "data-table"
type = "int[50][30]"
columns = { "1" = "instant_death", "2" = "hp_drain", "3" = "sp_drain", "4" = "fs_drain", "5" = "curse", "6" = "charm", "7" = "confusion", "8" = "paralysis", "9" = "poison", "10" = "water_flow", "11" = "fear", "12" = "reserved", "13" = "regeneration", "14" = "exaltation" }
value_domain = "equipment/passive condition level 0..5"
usage = "Per-runtime-entity minimum condition levels supplied by equipment and passive effects. SETCH/SETEN populate the row from item_equipped_status_levels, ADDILLSUB cannot reduce current levels below it, CALCREVISE separates transient current levels from this baseline, and RECOVER restores eligible conditions to it."
source = "investigation"
confidence = "high"
depends_on = ["0x52383", "0x97c29"]
[[global]]
address = "0xaac76"
name = "current_condition_id"
category = "index-pointer"
type = "int"
value_domain = "condition id 1..14 in shipped scripts"
usage = "Shared condition selector consumed by CALCILL, ADDILL, ADDILLSUB, DISARM, FIELD, and related condition handlers. It indexes the 30-column runtime condition rows and ILINIT definition arrays."
source = "investigation"
confidence = "high"
depends_on = ["0x52383"]
[[global]]
address = "0xaac77"
name = "current_condition_delta_levels"
category = "counter"
type = "int"
value_domain = "signed condition-level adjustment, commonly -5..5"
usage = "Shared signed level delta passed to ADDILL/ADDILLSUB for current_condition_id. Positive values apply or strengthen a condition; negative values weaken/remove it subject to the equipment/passive baseline floor."
source = "investigation"
confidence = "high"
depends_on = ["0xaac76", "0x52383", "0x52f3b"]
[[global]]
address = "0xaac78"
name = "condition_effectiveness_element_ids"
category = "data-table"
type = "int[30]"
value_domain = "element id 11..17 for shipped condition definitions"
usage = "ILINIT condition metadata. CALCILL uses the selected condition's value as the element-table column for its application-chance effectiveness calculation."
source = "investigation"
confidence = "high"
depends_on = ["0xaac76"]
[[global]]
address = "0xaac96"
name = "condition_can_affect_bosses"
category = "data-table"
type = "int[30]"
value_domain = "boolean; nonzero for HP/SP/FS drain, regeneration, and exaltation"
usage = "ILINIT policy vector. CALCILL rejects a condition against a boss-class target when this cell is zero; nonzero cells bypass that boss immunity gate."
source = "investigation"
confidence = "high"
depends_on = ["0xaac76"]
[[global]]
address = "0xaacb4"
name = "condition_cleared_by_recover"
category = "data-table"
type = "int[30]"
value_domain = "boolean; shipped nonzero ids are 6..11"
usage = "ILINIT recovery-policy vector. RECOVER and DISARM use it to identify charm, confusion, paralysis, poison, water-flow, and fear as removable conditions; RECOVER resets each eligible current level to its equipment/passive baseline."
source = "investigation"
confidence = "high"
depends_on = ["0x52383", "0x52f3b", "0x5295f"]
[[global]]
address = "0xaacd2"
name = "condition_icon_ids"
category = "data-table"
type = "int[30]"
value_domain = "condition icon id 1..10; zero means no icon"
usage = "ILINIT display metadata. DRAWENP and FIELD use these ids to deduplicate active-condition indicators and select the corresponding status-icon atlas entry."
source = "investigation"
confidence = "high"
depends_on = ["0x52383"]
[[global]]
address = "0xaacf0"
name = "condition_duration_turns_by_level"
category = "data-table"
type = "int[30][5]"
columns = { "0" = "level_1_turns", "1" = "level_2_turns", "2" = "level_3_turns", "3" = "level_4_turns", "4" = "level_5_turns" }
value_domain = "-1 permanent or a positive turn count"
usage = "ILINIT's five-column duration row for each condition. ADDILLSUB indexes it by the resulting condition level minus one and stores the value in entity_condition_remaining_turns."
source = "investigation"
confidence = "high"
depends_on = ["0x5295f", "0x52383"]
[[global]]
address = "0xaad86"
name = "condition_stat_deltas"
category = "data-table"
type = "int[30][55]"
columns = { "0" = "level_1_accuracy", "1" = "level_1_evasion", "2" = "level_1_physical_attack", "3" = "level_1_physical_defense", "4" = "level_1_magic_attack", "5" = "level_1_magic_defense", "6" = "level_1_speed", "7" = "level_1_luck", "8" = "level_1_critical_chance", "9" = "level_1_capture_power", "10" = "level_1_movement", "11" = "level_2_accuracy", "12" = "level_2_evasion", "13" = "level_2_physical_attack", "14" = "level_2_physical_defense", "15" = "level_2_magic_attack", "16" = "level_2_magic_defense", "17" = "level_2_speed", "18" = "level_2_luck", "19" = "level_2_critical_chance", "20" = "level_2_capture_power", "21" = "level_2_movement", "22" = "level_3_accuracy", "23" = "level_3_evasion", "24" = "level_3_physical_attack", "25" = "level_3_physical_defense", "26" = "level_3_magic_attack", "27" = "level_3_magic_defense", "28" = "level_3_speed", "29" = "level_3_luck", "30" = "level_3_critical_chance", "31" = "level_3_capture_power", "32" = "level_3_movement", "33" = "level_4_accuracy", "34" = "level_4_evasion", "35" = "level_4_physical_attack", "36" = "level_4_physical_defense", "37" = "level_4_magic_attack", "38" = "level_4_magic_defense", "39" = "level_4_speed", "40" = "level_4_luck", "41" = "level_4_critical_chance", "42" = "level_4_capture_power", "43" = "level_4_movement", "44" = "level_5_accuracy", "45" = "level_5_evasion", "46" = "level_5_physical_attack", "47" = "level_5_physical_defense", "48" = "level_5_magic_attack", "49" = "level_5_magic_defense", "50" = "level_5_speed", "51" = "level_5_luck", "52" = "level_5_critical_chance", "53" = "level_5_capture_power", "54" = "level_5_movement" }
value_domain = "signed additive deltas"
usage = "ILINIT's five-level by eleven-stat matrix for each condition. CALCREVISE indexes (condition level - 1) * 11 + stat column and adds the result to entity_effective_stats columns 0..10. Shipped rows populate curse, confusion, paralysis, and exaltation."
source = "investigation"
confidence = "high"
depends_on = ["0x52383", "0x4e11b"]
[[global]]
address = "0xab3f8"
name = "condition_resource_deltas"
category = "data-table"
type = "int[30][15]"
columns = { "0" = "level_1_hp", "1" = "level_1_sp", "2" = "level_1_fs", "3" = "level_2_hp", "4" = "level_2_sp", "5" = "level_2_fs", "6" = "level_3_hp", "7" = "level_3_sp", "8" = "level_3_fs", "9" = "level_4_hp", "10" = "level_4_sp", "11" = "level_4_fs", "12" = "level_5_hp", "13" = "level_5_sp", "14" = "level_5_fs" }
value_domain = "signed per-turn HP/SP/FS deltas"
usage = "ILINIT's five-level by three-resource matrix for each condition. FIELD applies the active row each turn; CALCDMG also consumes the HP/SP/FS drain condition rows during battle. Positive values restore/drain to the acting side as defined by the caller, while negative values are periodic damage or loss."
source = "investigation"
confidence = "high"
depends_on = ["0x52383", "0x4e085"]
[[global]]
address = "0x53e13"
name = "entity_carried_item_ids"
category = "data-table"
type = "int[50][2]"
columns = { "0" = "slot_0", "1" = "slot_1" }
value_domain = "zero for empty; otherwise ITINIT item id"
usage = "Two carried/drop-item slots per runtime entity. SETEN initializes slot 0 from the unit's starting equipment item, FIELD fills an empty or matching slot when treasure is collected, and RTN_M009 requires an empty slot or an item-id match before approaching a chest/treasure object."
source = "investigation"
confidence = "high"
depends_on = ["0x53e77", "0x78c0e"]
[[global]]
address = "0x53e77"
name = "entity_carried_item_counts"
category = "data-table"
type = "int[50][2]"
columns = { "0" = "slot_0", "1" = "slot_1" }
value_domain = "0..999 quantity paired with entity_carried_item_ids"
usage = "Quantities for the two per-entity carried/drop-item slots. SETEN seeds a starting item with quantity one; FIELD adds treasure quantities to the matching slot and caps the result at 999."
source = "investigation"
confidence = "high"
depends_on = ["0x53e13"]
[[global]]
address = "0x53517"
name = "entity_movement_routine_set_ids"
category = "data-table"
type = "int[50][3]"
value_domain = "RTINIT row id by difficulty"
usage = "Per-runtime-entity movement routine set for easy/normal/hard. SETEN copies a stage-specific override or the EBINIT default into this row; MVRTN selects the current difficulty column and stores it in current_routine_set_id."
source = "investigation"
confidence = "high"
depends_on = ["0xe7889", "0xeff75"]
[[global]]
address = "0x535ad"
name = "entity_battle_routine_set_ids"
category = "data-table"
type = "int[50][3]"
value_domain = "RTINIT row id by difficulty"
usage = "Per-runtime-entity battle routine set for easy/normal/hard. SETEN copies a stage-specific override or the EBINIT default into this row; BTRTN selects the current difficulty column and stores it in current_routine_set_id."
source = "investigation"
confidence = "high"
depends_on = ["0xe78e3", "0xeff75"]
[[global]]
address = "0x53643"
name = "entity_movement_routine_progress"
category = "data-table"
type = "int[50][20]"
value_domain = "nonnegative per-step counter"
usage = "Per-runtime-entity movement-routine progress counters. FIELD clears all fifty rows, movement providers increment the current step, and MVRTN compares it with movement_routine_minimum_progress_counts before enabling a step."
source = "investigation"
confidence = "high"
depends_on = ["0x112258", "0xeff76"]
[[global]]
address = "0x56738"
name = "entity_battle_routine_random_rolls"
category = "data-table"
type = "int[50][20]"
value_domain = "0..99"
usage = "Per-runtime-entity battle-step random rolls. FIELD and BTL fill every active entity's twenty cells with random-modulo-100; BTRTN executes a step when the matching roll is below battle_routine_activation_percents."
source = "investigation"
confidence = "high"
depends_on = ["0x125ad8", "0xeff76"]
[[global]]
address = "0x56b20"
name = "entity_patrol_waypoint_indices"
category = "data-table"
type = "int[50]"
value_domain = "zero-based waypoint index; observed RTINIT waypoint ordinals imply 0..7"
usage = "RTN_M011 compares each step's one-based waypoint_ordinal minus one with the current entity's value. Reaching the selected destination advances this value modulo the largest RTN_M011 waypoint ordinal in the routine set."
source = "investigation"
confidence = "high"
depends_on = ["0x1037f8", "0xeff78"]
[[global]]
address = "0xb240e"
name = "pathfinding_movement_costs"
category = "data-table"
type = "int[][27]"
value_domain = "nonnegative accumulated movement cost for reachable tiles"
usage = "MVSEEK's row-major movement-cost work grid, indexed as [tile_y][tile_x] with stride 27. FIELD and RTN_M providers accept candidate destinations only when this cost is within the acting entity's current FS or a provider-specific override."
source = "investigation"
confidence = "high"
depends_on = ["0x4e085"]
[[global]]
address = "0xb8d86"
name = "action_range_distance_grid"
category = "data-table"
type = "int[][27]"
value_domain = "0 outside attack range; otherwise one-based encoded range band"
usage = "ATSEEK's row-major action-range flood-fill grid. It starts from the acting entity, expands through map-valid doubled-coordinate neighbors up to usable_action_max_range, and stores 1 for the first range band, 2 for the next, and so on. RTN_M051/052 select offensive targets from it; RTN_M061 selects in-range healing targets."
source = "investigation"
confidence = "high"
depends_on = ["0x5231f", "0x52351", "0xcc9f3", "0xcc9f4", "0xcc9fe"]
[[global]]
address = "0x20543"
name = "tile_faction_traversal_masks"
category = "data-table"
type = "int[][27]"
value_domain = "faction bitmask indexed by map tile"
usage = "Row-major tile traversal permissions. Movement checks the acting entity's faction bit before enqueuing a tile in movement-limited MVSEEK searches. RTN_M013 builds either one selected faction bit or all bits except the actor's, requires the current tile not to match that set, and approaches the nearest reachable tile whose mask does."
source = "investigation"
confidence = "high"
depends_on = ["0x522ed", "0xaba96"]
[[global]]
address = "0xaba96"
name = "pathfinding_remaining_route_steps"
category = "data-table"
type = "int[][27]"
value_domain = "0 for unreachable; positive remaining flood-fill steps"
usage = "MVSEEK's row-major reachability grid. Mode 0 searches from the current entity with movement+1 at the origin; modes 1/2 search from the caller-supplied coordinate with 9999 at the origin. Each traversed edge decrements the value, so a larger positive value is nearer to the origin. RTN_M006/007/015 use origin-minus-target values as route-step radii; RTN_M010 ranks Healing Feathers by the negated value."
source = "investigation"
confidence = "high"
depends_on = ["0x4e11b", "0x5231f", "0x52351", "0xcc9f1"]
[[global]]
address = "0xc6077"
name = "selected_movement_route_steps"
category = "data-table"
type = "int[1000][27]"
value_domain = "0 outside the selected route; positive remaining flood-fill score on route tiles"
usage = "Selected movement-route work grid indexed as [tile_y][tile_x]. MVRTN, FIELD, and SETROUTE clear all 27,000 cells. SETROUTE starts at map_target_tile_x/y, copies pathfinding_remaining_route_steps into the route, and follows the cardinal neighbor whose score is one greater until it reaches the acting entity. FIELD uses the monotone values to draw directional route markers and drive movement; SELACT tests whether an action target follows movement; seventeen RTN_M providers reject candidate endpoints whose route cell is zero."
source = "investigation"
confidence = "high"
depends_on = ["0x5231f", "0x52351", "0xaba96", "0xccbcf", "0xccbd4", "0xccc0a", "0xccc0b"]
[[global]]
address = "0xccbcf"
name = "cardinal_tile_delta_x"
category = "data-table"
type = "int[5]"
value_domain = "[0, 0, -1, 0, 1]"
usage = "INIT2's shared no-move-plus-four-cardinal-neighbor X offsets. SETROUTE uses indices 1..4 while tracing a selected route toward the acting entity; MVSEEK, ATSEEK, FIELD, SALLY, and DRAWMAP use the same neighbor order."
source = "investigation"
confidence = "high"
depends_on = ["0xccbd4"]
[[global]]
address = "0xccbd4"
name = "cardinal_tile_delta_y"
category = "data-table"
type = "int[5]"
value_domain = "[0, 1, 0, -1, 0]"
usage = "INIT2's Y offsets paired with cardinal_tile_delta_x. Indices 1..4 enumerate positive Y, negative X, negative Y, and positive X neighbors; index zero leaves the coordinate unchanged."
source = "investigation"
confidence = "high"
depends_on = ["0xccbcf"]
[[global]]
address = "0xccc0a"
name = "map_target_tile_x"
category = "index-pointer"
type = "int"
value_domain = "map tile X coordinate; shipped immediate assignments are 2..24"
usage = "Shared map target/focus X coordinate. Seventeen RTN_M providers unpack candidate coordinates here before testing selected_movement_route_steps, FIELD and SETROUTE use it as the selected destination, and LOOK converts it to the centered world X coordinate when no enemy spawn slot is selected. Fifty-five scripts reference the paired target coordinates."
source = "investigation"
confidence = "high"
depends_on = ["0xc6077", "0xccc0b"]
[[global]]
address = "0xccc0b"
name = "map_target_tile_y"
category = "index-pointer"
type = "int"
value_domain = "map tile Y coordinate; shipped immediate assignments are 77..663"
usage = "Shared map target/focus Y coordinate paired with map_target_tile_x. Movement providers unpack the low sixteen bits of candidate coordinates here; FIELD and SETROUTE select the route endpoint, while story scripts and LOOK use the same pair to center the battlefield camera on scripted map locations."
source = "investigation"
confidence = "high"
depends_on = ["0xc6077", "0xccc0a"]
[[global]]
address = "0xbf6fe"
name = "pathfinding_filtered_route_scores"
category = "data-table"
type = "int[][27]"
value_domain = "0 for excluded/unreachable; positive remaining route score"
usage = "SETMVWORK begins by copying pathfinding_remaining_route_steps, then filters occupied entity cells according to faction and the acting entity's usable offensive-action mask/effectiveness. RTN_M providers combine this target-proximity score with a movement-limited MVSEEK grid to select a reachable tile nearest an entity or stage object."
source = "investigation"
confidence = "high"
depends_on = ["0x4e021", "0x522ed", "0xaba96", "0xcc9f4"]
[[global]]
address = "0xcc9f1"
name = "movement_search_mode"
category = "choice-output"
type = "int"
value_domain = "0..2"
usage = "Transient MVSEEK mode. Zero replaces the caller-supplied origin with the current entity tile and uses movement+1 as the search allowance; nonzero modes retain the caller coordinate and use a broad allowance of 9999. Mode 2 additionally masks the doubled-coordinate terrain cells occupied by active entities of another faction before the flood fill. MVSEEK resets the mode to zero on exit."
source = "investigation"
confidence = "high"
depends_on = ["0x4e021", "0x4e11b", "0x522ed", "0x5231f", "0x52351"]
[[global]]
address = "0x5212b"
name = "entity_equipped_active_skill_ids"
category = "data-table"
type = "int[50][4]"
value_domain = "0 for an empty slot; otherwise SKINIT skill id"
usage = "Four equipped active-skill slots per runtime entity. CALCSCOPE maps each usable offensive or healing skill into the corresponding action bit and range band; RTN_M051/052 select offensive skills and RTN_M061 selects a healing skill from these slots."
source = "investigation"
confidence = "high"
depends_on = ["0xa6f86", "0xa71de", "0xa730a", "0xa7436"]
[[global]]
address = "0x52289"
name = "entity_selected_action_ids"
category = "data-table"
type = "int[50]"
value_domain = "0 for normal attack; otherwise selected skill id"
usage = "Per-entity selected action. RTN_M051/052 write either zero for the normal attack or an offensive equipped skill and return routine execution state 2; RTN_M061 writes a healing skill and returns state 3. BTRTN may replace the value through a battle-provider decision."
source = "investigation"
confidence = "high"
depends_on = ["0x5212b", "0x66713", "0x66714", "0xeff77"]
[[global]]
address = "0xcc9f2"
name = "usable_action_min_range"
category = "counter"
type = "int"
value_domain = "encoded action-range band 0..9"
usage = "CALCSCOPE initializes this from the equipped/default attack's minimum range and widens it for usable offensive and healing skills. It is the lower bound shared by the offensive and healing action-scope tables."
source = "investigation"
confidence = "high"
depends_on = ["0x8d431", "0xa71de"]
[[global]]
address = "0xcca08"
name = "offensive_action_attack_elements"
category = "data-table"
type = "int[10][5]"
value_domain = "attack element id indexed by encoded range and action bit"
usage = "CALCSCOPE stores the normal attack element in action column 0 and each usable equipped skill's attack element in columns 1..4 for every applicable range band. SETMVWORK and RTN_M051/052 test these elements against attack_element_effectiveness_percent."
source = "investigation"
confidence = "high"
depends_on = ["0x8dfe9", "0xa7436", "0xcc9f4"]
[[global]]
address = "0xab5ba"
name = "attack_element_effectiveness_percent"
category = "data-table"
type = "int[20][20]"
value_domain = "signed effectiveness percentage indexed by defense element then attack element"
usage = "AFINIT-authored element matchup table with thirteen authored defense rows and eighteen authored cells per row inside the reserved 20-by-20 layout. Positive values make an action eligible in SETMVWORK and RTN_M051/052; CALCBTPARAM multiplies battle parameters by the selected percentage and handles negative values as special/immunity cases. INFOAF displays eight attack columns for its selected defense rows."
source = "investigation"
confidence = "high"
depends_on = ["0x2690", "0x26a4", "0x77c6e", "0x8e3d1", "0x8dfe9", "0xa7436"]
[[global]]
address = "0xcc9f4"
name = "offensive_action_scope_masks"
category = "data-table"
type = "int[10]"
columns = { "0" = "range_0", "1" = "range_1", "2" = "range_2", "3" = "range_3", "4" = "range_4", "5" = "range_5", "6" = "range_6", "7" = "range_7", "8" = "range_8", "9" = "range_9" }
value_domain = "action-availability bitmask: bit 0 normal attack, bits 1..4 equipped active skills"
usage = "CALCSCOPE clears ten encoded-range cells, sets bit 0 over the equipped/default attack's range, and sets bits 1..4 over each usable offensive skill's range. SETMVWORK uses the range-0 mask and paired attack elements when filtering target cells; RTN_M003/006/016/017/018 require its normal-attack bit."
source = "investigation"
confidence = "high"
depends_on = ["0x8d431", "0x8d819", "0xa71de", "0xa730a", "0xcc9f2", "0xcc9f3", "0xcca08"]
[[global]]
address = "0xcc9fe"
name = "healing_action_scope_masks"
category = "data-table"
type = "int[10]"
columns = { "0" = "range_0", "1" = "range_1", "2" = "range_2", "3" = "range_3", "4" = "range_4", "5" = "range_5", "6" = "range_6", "7" = "range_7", "8" = "range_8", "9" = "range_9" }
value_domain = "action-availability bitmask: bits 1..4 are equipped healing skills"
usage = "CALCSCOPE clears ten encoded-range cells and sets the equipped-slot bit for each usable category-7 healing skill over its applicable range. RTN_M061 uses the masks to restrict ally targets and to select the range-enabled healing skill."
source = "investigation"
confidence = "high"
depends_on = ["0x5212b", "0xa6f86", "0xa71de", "0xa730a", "0xcc9f2", "0xcc9f3"]
[[global]]
address = "0x152616"
name = "current_entity_index"
category = "index-pointer"
type = "int"
value_domain = "row index"
usage = "Primary current-entity row index (RECOVER-confirmed; purity 0.51, 363 row-index uses)."
source = "investigation"
confidence = "med"
depends_on = []
[[global]]
address = "0x152619"
name = "battle_exchange_step"
category = "counter"
type = "int"
value_domain = "0..5"
usage = "BTL's six-step alternating exchange counter. Dividing it by two selects the first, second, or third ordinary-attack/skill voice variant and related animation slots."
source = "investigation"
confidence = "high"
[[global]]
address = "0x15261a"
name = "battle_actor_side_index"
category = "index-pointer"
type = "int"
value_domain = "{0,1}"
usage = "Index of the acting side in BTL's two-entry battle arrays. CALCDMG derives battle_target_side_index as 1 minus this value; BTL uses the actor's unit-definition row for attack, skill, critical, and finishing-blow voices."
source = "investigation"
confidence = "high"
depends_on = ["0x152877"]
[[global]]
address = "0x15261b"
name = "battle_target_side_index"
category = "index-pointer"
type = "int"
value_domain = "{0,1}"
usage = "Index of the target side in BTL's two-entry battle arrays. CALCDMG sets it to 1 - battle_actor_side_index; BTL applies battle_hp_delta to this side and uses its unit-definition row for damage and defeated voices."
source = "investigation"
confidence = "high"
depends_on = ["0x152877"]
[[global]]
address = "0x15261c"
name = "battle_hit_result"
category = "unknown"
type = "int"
value_domain = "-1 synthetic battle setup, 0 miss, 1 hit, 2 critical"
usage = "CALCDMG initializes this to miss, changes it to hit after the accuracy gate, and then to critical after the critical-chance gate. BTL uses the same result to choose presentation, cut-ins, and critical voice columns; -1 is written only by a synthetic pre-battle path."
source = "investigation"
confidence = "high"
[[global]]
address = "0x15261d"
name = "battle_hp_delta"
category = "unknown"
type = "int"
value_domain = "signed HP delta; positive damage, negative healing"
usage = "CALCDMG's signed HP result. BTL subtracts it from the target's current HP, so positive values deal damage and negative values heal; zero and result state gate damage reactions and defeat handling."
source = "investigation"
confidence = "high"
[[global]]
address = "0x15261e"
name = "battle_actor_hp_recovery"
category = "unknown"
type = "int"
value_domain = "nonnegative HP restored to the acting side"
usage = "CALCDMG's actor-side HP recovery output. Absorb (SKINIT skill 40) contributes half of positive battle_hp_delta with a minimum of one, and the target's HP-absorption condition can add its level-scaled amount capped at the damage dealt. BTL adds the result to the actor's current HP, renders the green recovery number, and clamps the resource through the ordinary post-battle path."
source = "investigation"
confidence = "high"
depends_on = ["0x4e085", "0x52383", "0x15261d"]
[[global]]
address = "0x15261f"
name = "battle_triggered_passive_skill_flags"
category = "data-table"
type = "int[2][300]"
value_domain = "{0,1}; rows are battle side, columns are SKINIT skill ids"
usage = "Per-exchange passive-skill activation matrix. CALCDMG clears both 300-cell side rows, considers the four equipped skills on each battle entity, retains category-4 passives allowed for that actor/target role, rolls skill_proc_chance_percent, and applies species, boss, movement-skill, action-category, and mutual-exclusion filters. BTL consumes the surviving flags to draw triggered-passive icons, play each passive's battle animation, and execute Roar, Counter, Reflect, Absorb, Pierce, Shield, Parry, and Revive behavior."
source = "investigation"
confidence = "high"
depends_on = ["0x4e693", "0x5212b", "0xa6f86", "0xaa8f2", "0xaaa1e", "0x15261a", "0x15261b", "0x152877"]
[[global]]
address = "0x152877"
name = "battle_entity_indices"
category = "data-table"
type = "int[2]"
columns = { "0" = "side_0", "1" = "side_1" }
value_domain = "runtime entity row indices"
usage = "The two runtime entity rows participating in BTL. battle_actor_side_index and battle_target_side_index select these cells before BTL and CALCDMG access HP, unit definitions, skills, animation state, and voice banks."
source = "investigation"
confidence = "high"
[[global]]
address = "0x152879"
name = "battle_selected_skill_ids"
category = "data-table"
type = "int[2]"
columns = { "0" = "side_0", "1" = "side_1" }
value_domain = "0 for an ordinary attack, otherwise SKINIT skill id"
usage = "Selected skill for each battle side. BTL displays a positive entry through the skill-name table and selects skill-use voice columns; CALCDMG uses the same id for skill parameters. A zero entry follows the equipped/default ordinary-attack path."
source = "investigation"
confidence = "high"
[[global]]
address = "0x26b4"
name = "class_change_title_output"
category = "string-table"
type = "string"
value_domain = "CCINIT-awarded Japanese title; empty for Lily form-transition rules"
usage = "CCINIT writes the title selected by each eligible class-change rule. CALCCC copies it to unit_class_titles for a successful promotion, and ADDEXP includes the same string in the level-up notification."
source = "investigation"
confidence = "high"
[[global]]
address = "0x27e"
name = "unit_class_titles"
category = "string-table"
type = "string[100]"
value_domain = "CCINIT class title by playable-unit id"
usage = "Persistent per-unit class/title string table. CALCCC writes the selected class_change_title_output into the current unit's cell; character and status presentation scripts read the resulting title."
source = "investigation"
confidence = "high"
[[global]]
address = "0x57357"
name = "unit_deployment_cost_adjustments"
category = "data-table"
type = "int[100]"
value_domain = "signed cumulative class-change cost adjustment"
usage = "Persistent per-unit delta added to unit_deployment_cost_base. CALCCC increments it by class_change_deployment_cost_delta, while SETCH, SETEN, ADDEXP, and deployment scripts include it when constructing or updating runtime command cost."
source = "investigation"
confidence = "high"
[[global]]
address = "0x573bb"
name = "unit_class_change_state"
category = "data-table"
type = "int[100][10]"
columns = { "0" = "promotion_slot_1", "1" = "promotion_slot_2", "2" = "promotion_slot_3", "3" = "promotion_slot_4", "4" = "promotion_slot_5", "5" = "promotion_slot_6", "6" = "promotion_slot_7", "7" = "promotion_slot_8", "8" = "promotion_slot_9", "9" = "promotion_slot_10" }
value_domain = "0 unapplied, 1 applied"
usage = "Persistent ten-slot class-change state for each playable unit. CALCCC copies the current unit's row to class_change_state_work before invoking the rule scripts and persists the updated row; CCINIT requires the rule's slot to be zero so each promotion is applied once."
source = "investigation"
confidence = "high"
[[global]]
address = "0x66715"
name = "current_unit_id"
category = "index-pointer"
type = "int"
value_domain = "EBINIT unit definition id / playable-unit row id"
usage = "Shared current-unit selector used by character growth and setup scripts. CCINIT keys every class-change rule on this value; CALCCC, ADDEXP, SETEN, SALLY, and related scripts use it to index unit definitions and persistent per-unit state."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6930"
name = "unit_current_levels"
category = "data-table"
type = "int[100]"
value_domain = "current playable-unit level"
usage = "Persistent current level by playable-unit id. CCINIT compares current_unit_id's row with each promotion threshold; ADDEXP increments and reports the same value."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6994"
name = "unit_experience_progress"
category = "data-table"
type = "int[100]"
value_domain = "0..99 progress toward the next level; 100 is the transient level-up boundary"
usage = "Persistent experience progress by playable-unit id. ADDEXP adds the current award, animates the increase to 100, raises unit_current_levels, resets this cell to zero, and repeats while award remains and the unit is below unit_level_cap."
source = "investigation"
confidence = "high"
depends_on = ["0x6930", "0x7a766", "0x83406"]
[[global]]
address = "0x69f8"
name = "unit_current_stats"
category = "data-table"
type = "int[100][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "nonnegative current stat values"
usage = "Persistent fourteen-stat row for each playable unit, using the same column order as unit_base_stats. CALCCC adds class_change_stat_bonuses to the current unit's row and clamps each result to the shared stat caps."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6f70"
name = "unit_stat_growth_fractions"
category = "data-table"
type = "int[100][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "signed fractional hundredths carried between stat changes; normalized remainder magnitude below 100"
usage = "Persistent fractional-growth row paired with each playable unit's unit_current_stats. ADDEXP adds unit_stat_growth_rates, TRAIN adds training_action_stat_growth_hundredths, and UNITECH applies level catch-up growth; each path awards the quotient divided by 100 to the current stat and retains the remainder modulo 100. GAMESTART serializes the rows, while GAMECLEAR and EVOLVE copy them with the rest of the persistent unit record."
source = "investigation"
confidence = "high"
depends_on = ["0x69f8", "0x7e5e6", "0x155e9b"]
[[global]]
address = "0x74e8"
name = "unit_skill_ids"
category = "data-table"
type = "int[100][4]"
columns = { "0" = "skill_slot_1", "1" = "skill_slot_2", "2" = "skill_slot_3", "3" = "skill_slot_4" }
value_domain = "SKINIT skill id; zero means empty"
usage = "Persistent four-skill row for each playable unit. CALCCC copies positive class_change_skill_awards into the first three slots after a promotion; ADDEXP compares the before/after row to report learned or replaced skills."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab8c7"
name = "class_change_rule_script_ids"
category = "data-table"
type = "int[32]"
value_domain = "packed SYS4 script ids; zero means unused"
usage = "CALCCC iterates these 32 cells and call-scripts every positive entry to evaluate class-change providers. CCINIT is the shipped rule program decoded into build/data/CCINIT.json."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6be"
name = ""
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "ADV message-window / text-render state in the 0x6bx-0x6cx chrome cluster (passed to render helpers u0041F9C0/u00415F70 alongside 0x6c3). NOT a story flag — high scene-reach is from the shared render chrome. Branch-read in 146 scenes."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x6c3"
name = ""
category = "ui-toggle"
type = "int"
value_domain = "?"
usage = "ADV message-window / text-render state in the 0x6bx-0x6cx chrome cluster (`mov 0x6c3,<val>` then `u00415F70(0x6c3)` right after draw-texture; paired with 0x6be). NOT a story flag. Branch-read in 136 scenes."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0xa68"
name = ""
category = "choice-output"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 11 scenes / 12 scripts; compared against [0, 1]; writers=['SC0740.BIN', 'SC1580.BIN', 'SC1590.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0xa99"
name = "game_started"
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "New-game/playthrough gate: set to 1 by GAMESTART.BIN, then tested `==1` in story scenes (SC0200/SC0490, e.g. `0xa99==1 AND stat>3`). Marks that the game proper has begun. INFERENCE from the GAMESTART writer — confirm exact semantics before relying on it."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0xd92"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 29 scenes / 29 scripts; compared against [1]; writers=none (external/native?)."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x3231"
name = "game_mode"
category = "story-flag"
type = "int"
value_domain = "1..9"
usage = "Game-mode/phase selector in the 0x3231-0x3234 progression-state cluster (chapter_mode is 0x3234). Enum 1..9, written by the gameplay scripts (AIM/ALCHEMY/BTL/BUNKI), branch-read in 136 scenes. Distinct from chapter; likely current sub-mode/screen. INFERENCE — confirm with a listing/sweep before relying on the exact meaning."
source = "inference"
confidence = "med"
depends_on = ["0x3234"]
[[global]]
address = "0x3238"
name = ""
category = "unknown"
type = "int"
value_domain = "{0,1}"
usage = "Config/settings global (CONFIG.BIN/INITCONFIG.BIN writer, scene-reach 0) — NOT a scene story flag; miner over-tagged it. Branch-read in 5 scripts; compared against [1]."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x3275"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 136 scenes / 143 scripts; compared against [0]; writers=['CAMP.BIN', 'DEBUGADV.BIN', 'DEBUGADV2.BIN', 'FIELD.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x3301"
name = ""
category = "unknown"
type = "int"
value_domain = "one of {1, 2}"
usage = "Config/settings global (INITCONFIG.BIN writer, scene-reach 0) — NOT a scene story flag; miner over-tagged it. Branch-read in 6 scripts; compared against [1, 2]."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x3303"
name = ""
category = "unknown"
type = "int"
value_domain = "{0,1}"
usage = "Config/settings global (CONFIG.BIN/INITCONFIG.BIN writer, scene-reach 0) — NOT a scene story flag; miner over-tagged it. Branch-read in 8 scripts; compared against [1]."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x3304"
name = ""
category = "unknown"
type = "int"
value_domain = "{0,1}"
usage = "Config/settings global (CONFIG.BIN/INITCONFIG.BIN writer, scene-reach 0) — NOT a scene story flag; miner over-tagged it. Branch-read in 13 scripts; compared against [1]."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x6718"
name = "selected_party_slot"
category = "index-pointer"
type = "int"
value_domain = "0..99"
usage = "Current/selected slot in the 100-entry party-unit arrays. UNITECH chooses a free slot here before populating it; CHMENU replaces it with the selected sorted roster slot, then uses it to index party_slot_flags, party_slot_character_id, and companion per-slot tables. A natural New Game enters SC0000 with slot 2 selected."
source = "investigation"
confidence = "high"
depends_on = ["0x673c", "0x67a0"]
[[global]]
address = "0x673c"
name = "party_slot_flags"
category = "data-table"
type = "int[100]"
value_domain = "bitfield"
usage = "Per-party-slot state flags for slots 0..99. UNITECH creates the initial unit by setting slot 2 to 0x13; CALCARR counts slots whose flags intersect 0x6, and CHMENU includes slots with bit 1 set. Exact meanings of the remaining bits are not yet classified."
source = "investigation"
confidence = "high"
depends_on = ["0x6718", "0x67a0"]
[[global]]
address = "0x67a0"
name = "party_slot_character_id"
category = "data-table"
type = "int[100]"
value_domain = "character/unit definition id or 0"
usage = "Character/unit definition id stored for each party slot. UNITECH writes character id 2 into initial slot 2 on a natural New Game; CHMENU reads this table for every active party_slot_flags entry when constructing its roster."
source = "investigation"
confidence = "high"
depends_on = ["0x6718", "0x673c"]
[[global]]
address = "0x671b"
name = "shared_spendable_points"
category = "counter"
type = "int"
value_domain = "0..999"
usage = "Shared spendable point balance used by the alchemy, study, evolution, and summoning systems. ALCHEMY requires and deducts each recipe's alchemy_recipe_point_costs value; STAGECLEAR awards points to this balance and caps it at 999. The exact player-facing Japanese resource label remains unresolved."
source = "investigation"
confidence = "high"
depends_on = ["0x157d6c"]
[[global]]
address = "0x671d"
name = "alchemy_level"
category = "counter"
type = "int"
value_domain = "0..6"
usage = "Current alchemy level. ALCHEMY hides recipes whose alchemy_recipe_minimum_levels value exceeds this level and raises it, up to 6, when alchemy_level_progress reaches the current threshold."
source = "investigation"
confidence = "high"
depends_on = ["0x1565fc", "0x6720"]
[[global]]
address = "0x6720"
name = "alchemy_level_progress"
category = "counter"
type = "int"
value_domain = "non-negative synthesis progress"
usage = "Progress toward the next alchemy level. Each successful ALCHEMY synthesis increments it; reaching the current threshold raises alchemy_level and resets this counter."
source = "investigation"
confidence = "high"
depends_on = ["0x671d"]
[[global]]
address = "0x671e"
name = "magic_facility_level"
category = "counter"
type = "int"
value_domain = "0..6"
usage = "Current magic/research facility level. MAGIC and USEMAGIC index facility_level_progress_thresholds row 2 with this level; USEMAGIC raises it up to 6 when magic_facility_progress reaches the current threshold."
source = "investigation"
confidence = "high"
depends_on = ["0xab8b2", "0x6721"]
[[global]]
address = "0x671c"
name = "item_tuning_facility_level"
category = "counter"
type = "int"
value_domain = "0..6"
usage = "Current equipment-tuning facility level. IMPROVE indexes facility_level_progress_thresholds row 0 with this value and raises it, up to 6, as item_tuning_facility_progress accumulates."
source = "investigation"
confidence = "high"
depends_on = ["0xab8b2", "0x671f"]
[[global]]
address = "0x671f"
name = "item_tuning_facility_progress"
category = "counter"
type = "int"
value_domain = "non-negative tuning progress"
usage = "Progress toward the next equipment-tuning facility level. IMPROVE adds the selected item's tuning-level increases, applies row 0 of facility_level_progress_thresholds, and carries or clamps progress when the level rises."
source = "investigation"
confidence = "high"
depends_on = ["0x671c", "0xab8b2"]
[[global]]
address = "0x6721"
name = "magic_facility_progress"
category = "counter"
type = "int"
value_domain = "non-negative magic/research progress"
usage = "Progress toward the next magic/research facility level. USEMAGIC adds the selected action's progress award and applies row 2 of facility_level_progress_thresholds; MAGIC renders the same current/threshold pair."
source = "investigation"
confidence = "high"
depends_on = ["0x671e", "0xab8b2"]
[[global]]
address = "0x6722"
name = "familiar_alignment"
category = "counter"
type = "int"
value_domain = "-99..99; negative is evil/chaotic, positive is kind/lawful"
usage = "The familiar's alignment/personality axis. TRAIN decodes TRINIT minimum and maximum gates by subtracting 100 from the stored threshold, matching the locked hints' kind-versus-evil wording, and applies training_action_alignment_delta_hundredths through the paired fractional accumulator. DRAWCHP renders the signed value and EVOLVE/scene scripts use the same axis."
source = "investigation"
confidence = "high"
depends_on = ["0x6723", "0x155c64", "0x155c79", "0x155fc1"]
[[global]]
address = "0x6724"
name = "familiar_training_progress"
category = "counter"
type = "int"
value_domain = "0..99"
usage = "Cumulative familiar training/sexual-magic progress. TRAIN tests it against TRINIT's minimum/maximum progress gates, then applies training_action_training_progress_delta_hundredths through the paired fractional accumulator and clamps the result to 99. DRAWCHP and EVOLVE display or compare the same value."
source = "investigation"
confidence = "high"
depends_on = ["0x6725", "0x155c8e", "0x155ca3", "0x155fd6"]
[[global]]
address = "0x7679"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 1, 4, 8, 16, 256, 512, 1024}"
usage = "TODO: confirm. Branch-read in 0 scenes / 4 scripts; compared against [0, 1, 4, 8, 16, 256, 512, 1024]; writers=['FIELD.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x767a"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 4 scripts; compared against [0]; writers=['DEBUGMAP.BIN', 'DEBUGMAP2.BIN', 'DEBUGMAP3.BIN', 'FIELD.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x767b"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 136 scenes / 150 scripts; compared against [0, 1]; writers=['DEBUGADV2.BIN', 'DEBUGMAP.BIN', 'DEBUGMAP2.BIN', 'DEBUGMAP3.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x767d"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 1, 2, 3}"
usage = "TODO: confirm. Branch-read in 0 scenes / 9 scripts; compared against [0, 1, 2, 3]; writers=['CAMP.BIN', 'DEBUGADV2.BIN', 'DEBUGMAP.BIN', 'DEBUGMAP2.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x204f4"
name = "current_stage_turn"
category = "counter"
type = "int"
value_domain = "positive one-based turn number while a stage is active"
usage = "FIELD initializes this to 1, increments it after end-of-turn processing, compares it with STINIT's stage turn limit and timed object schedules, and displays it through DRAWCHP. Card generation divides it by each CDINIT growth interval to increase that card's weighted-selection share."
source = "investigation"
confidence = "high"
depends_on = []
[[global]]
address = "0x204f5"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {1, 2, 4, 8, 16, 32, 64}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [1, 2, 4, 8, 16, 32, 64]; writers=['FIELD.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x204f7"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {1, 2, 4, 6}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [1, 2, 4, 6]; writers=['DEBUGMAP.BIN', 'DEBUGMAP2.BIN', 'DEBUGMAP3.BIN', 'GAMESTART.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x2052e"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 1, 2, 3}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [0, 1, 2, 3]; writers=['FIELD.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x20530"
name = "current_spirit"
category = "counter"
type = "int"
value_domain = "0..maximum_spirit"
usage = "Current 精気 (spirit/essence) resource. TRAIN rejects a selected action when adding its negative TRINIT spirit delta would fall below zero, deducts the cost on execution, and passes the updated value to DRAWCHP. Field and scene reward paths update the same resource and clamp it to maximum_spirit."
source = "investigation"
confidence = "high"
depends_on = ["0x20534", "0x155e86"]
[[global]]
address = "0x20534"
name = "maximum_spirit"
category = "counter"
type = "int"
value_domain = "nonnegative spirit capacity; debug clamp 0..999"
usage = "Maximum 精気 capacity paired with current_spirit. TRAIN clamps the post-cost current value against it, DRAWCHP renders the current/maximum gauge, and field/scene reward paths raise or restore the same capacity."
source = "investigation"
confidence = "high"
depends_on = ["0x20530"]
[[global]]
address = "0x53ef4"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [0]; writers=['CAMP.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x55e37"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [0]; writers=['EVOLVE.BIN', 'STUDY.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x55e38"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 1, 2}"
usage = "TODO: confirm. Branch-read in 0 scenes / 9 scripts; compared against [0, 1, 2]; writers=['CHMENU.BIN', 'INFO.BIN', 'INFOAF.BIN', 'INFOCH.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x55e39"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 1, 4}"
usage = "TODO: confirm. Branch-read in 0 scenes / 8 scripts; compared against [0, 1, 4]; writers=['ALCHEMY.BIN', 'EVOLVE.BIN', 'MAGIC2.BIN', 'SELSTAGE.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x55e3a"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 136 scenes / 143 scripts; compared against [0]; writers=['FORT.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x617fd"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {0, 25, 50}"
usage = "TODO: confirm. Branch-read in 0 scenes / 6 scripts; compared against [0, 25, 50]; writers=['GAMESTART.BIN', 'TUNE.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x62428"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 3 scripts; compared against [0]; writers=['CALLBACK_WINDOW.BIN', 'DEBUG.BIN', 'DEBUGADV.BIN', 'DEBUGADV2.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x62439"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 6 scripts; compared against [0]; writers=['CHMENU.BIN', 'INFOAF.BIN', 'INFOCH.BIN', 'INFOEN.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x6249e"
name = ""
category = "unknown"
type = "int"
value_domain = "0..7"
usage = "Graphics-subsystem state in the 0x624xx gfx-object range (set via `mov 0x6249e,<n>` alongside `mov 0x62450,<slot>`). Likely a draw/slot parameter, NOT a story flag. Branch-read in 78 scenes."
source = "inference"
confidence = "low"
depends_on = []
[[global]]
address = "0x624be"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 8 scripts; compared against [0]; writers=['MENU.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x62ccc"
name = "scjump_decision_out2"
category = "choice-output"
type = "int"
value_domain = "small enum"
usage = "Adjacent to scjump_decision_out (0x62ccf) in the 0x62ccc-0x62ccf progression decision-output cluster; same 136-scene reach, written by CAMP/CLOSE/DEBUGADV. INFERENCE from adjacency — confirm meaning before relying on it."
source = "inference"
confidence = "low"
depends_on = ["0x62ccf"]
[[global]]
address = "0x6642c"
name = "route_branch"
category = "story-flag"
type = "int"
value_domain = "0..7"
usage = "Route/branch selector: sole writer is BUNKI.BIN (分岐 = branching), enum 0..7, branch-read in 36 scenes. Selects a story branch/route. INFERENCE from the BUNKI writer + enum — confirm exact routes via a listing/sweep."
source = "inference"
confidence = "med"
depends_on = []
[[global]]
address = "0x665d3"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {1, 2, 4, 8, 32, 64, 128, 65536}"
usage = "TODO: confirm. Branch-read in 0 scenes / 4 scripts; compared against [1, 2, 4, 8, 32, 64, 128, 65536]; writers=['ALCHEMY.BIN', 'BUNKI.BIN', 'DEBUGADV.BIN', 'EVOLVE.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x665d6"
name = "modal_message_line_count"
category = "counter"
type = "int"
value_domain = "0..10"
usage = "Number of populated strings in modal_message_lines. Dozens of menu/gameplay producers append at lines[count] and increment this value; MES renders the resulting non-selecting modal and clears the count, while SBUNKI consumes the same buffer as selectable options."
source = "investigation"
confidence = "high"
depends_on = ["0x7db"]
[[global]]
address = "0x7db"
name = "modal_message_lines"
category = "string-table"
type = "string[10]"
value_domain = "runtime UI text"
usage = "Shared ten-string modal buffer. Producers append messages or menu options at modal_message_line_count; MES measures and draws each string, and SBUNKI reuses the same entries for an interactive selection list."
source = "investigation"
confidence = "high"
depends_on = ["0x665d6"]
[[global]]
address = "0x7e5"
name = "modal_annotation_texts"
category = "string-table"
type = "string[100]"
value_domain = "optional runtime UI annotations"
usage = "Optional small-font annotations rendered by MES and SBUNKI after the primary modal lines. No direct shipped producer was found; the paired count and placement arrays expose a reserved/extensible annotation ABI."
source = "investigation"
confidence = "high"
depends_on = ["0x665e2", "0x665e3", "0x66647"]
[[global]]
address = "0x665e2"
name = "modal_annotation_count"
category = "counter"
type = "int"
value_domain = "0..100"
usage = "Number of populated modal_annotation_texts entries. MES and SBUNKI iterate this many annotations and clear it on dismissal; no direct shipped producer was found."
source = "investigation"
confidence = "high"
depends_on = ["0x7e5"]
[[global]]
address = "0x665e3"
name = "modal_annotation_horizontal_cells"
category = "data-table"
type = "int[100]"
value_domain = "horizontal anchor cells"
usage = "Per-annotation horizontal anchor input shared by MES and SBUNKI. Each renderer multiplies the cell by 21 pixels and offsets it by half the annotation's rendered width."
source = "investigation"
confidence = "high"
depends_on = ["0x7e5", "0x665e2"]
[[global]]
address = "0x66647"
name = "modal_annotation_row_offsets"
category = "data-table"
type = "int[100]"
value_domain = "signed row offset"
usage = "Per-annotation vertical row offset shared by MES and SBUNKI. Renderers multiply it by 30 pixels; a negative value additionally shifts the annotation left by one 21-pixel cell."
source = "investigation"
confidence = "high"
depends_on = ["0x7e5", "0x665e2"]
[[global]]
address = "0x665d7"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {1, 3}"
usage = "TODO: confirm. Branch-read in 0 scenes / 5 scripts; compared against [1, 3]; writers=['ADDSKILL.BIN', 'SBUNKI.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x66713"
name = "acting_entity_index"
category = "index-pointer"
type = "int"
value_domain = "runtime entity row index 0..49"
usage = "Entity whose movement or battle turn is being resolved. FIELD sets it before MVRTN; RTN_M providers use it for faction, position, resources, selected action, and routine progress. Together with target_entity_index it forms the attacker/target pair passed into battle."
source = "investigation"
confidence = "high"
depends_on = ["0x4e021", "0x522ed", "0x5231f", "0x52351"]
[[global]]
address = "0x66714"
name = "target_entity_index"
category = "index-pointer"
type = "int"
value_domain = "runtime entity row index 0..49"
usage = "Selected target/opponent entity. RTN_M051/052 choose and write an active foreign-faction target; FIELD pairs it with acting_entity_index for movement presentation and battle setup."
source = "investigation"
confidence = "high"
depends_on = ["0x4e021", "0x522ed", "0x5231f", "0x52351", "0xb8d86"]
[[global]]
address = "0xab8e7"
name = "class_change_selected_level"
category = "unknown"
type = "int"
value_domain = "-1 Lily form transition, 0 no promotion, otherwise selected threshold 10..90"
usage = "CALCCC clears this accumulator before invoking the class-change rule scripts. Each eligible CCINIT rule replaces it only when its threshold is higher than the current selection; nonzero then signals CALCCC and ADDEXP to apply and report the chosen promotion."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab8e8"
name = "class_change_deployment_cost_delta"
category = "unknown"
type = "int"
value_domain = "nonnegative deployment-cost increment"
usage = "Shared class-change output initialized by CALCCC and incremented by the selected CCINIT rule. CALCCC adds it to unit_deployment_cost_adjustments and ADDEXP reports the signed cost change."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab8e9"
name = "class_change_stat_bonuses"
category = "unknown"
type = "int[14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "nonnegative promotion deltas"
usage = "Fourteen-cell class-change accumulator using the unit stat column order. CALCCC zeroes it, CCINIT adds the selected rule's bonuses, and CALCCC adds the result to unit_current_stats with per-column caps. EVOLVE separately clears it and calls CCINIT to preview the next Lily form's movement bonus."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab8f7"
name = "class_change_skill_awards"
category = "unknown"
type = "int[4]"
columns = { "0" = "skill_slot_1", "1" = "skill_slot_2", "2" = "skill_slot_3", "3" = "skill_slot_4" }
value_domain = "SKINIT skill id; zero means no award"
usage = "Four-cell class-change skill output. CALCCC zeroes the buffer, CCINIT writes awarded skill ids, and CALCCC copies positive values from the first three cells into unit_skill_ids before ADDEXP reports the changes."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab8fb"
name = "class_change_state_work"
category = "unknown"
type = "int[10]"
columns = { "0" = "promotion_slot_1", "1" = "promotion_slot_2", "2" = "promotion_slot_3", "3" = "promotion_slot_4", "4" = "promotion_slot_5", "5" = "promotion_slot_6", "6" = "promotion_slot_7", "7" = "promotion_slot_8", "8" = "promotion_slot_9", "9" = "promotion_slot_10" }
value_domain = "0 unapplied, 1 applied"
usage = "Ten-cell working copy of the current unit's unit_class_change_state row. CCINIT sets the slot belonging to an awarded rule; CALCCC manages the block copy between this buffer and persistent per-unit state."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaba5c"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 136 scenes / 149 scripts; compared against [0, 1]; writers=['DEBUGADV.BIN', 'DEBUGADV2.BIN', 'SC0000.BIN', 'SC0010.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0xaba5e"
name = ""
category = "story-flag"
type = "int"
value_domain = "one of {2}"
usage = "TODO: confirm. Branch-read in 0 scenes / 5 scripts; compared against [2]; writers=['DEBUGMAP.BIN', 'DEBUGMAP2.BIN', 'DEBUGMAP3.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0xcc9f3"
name = "usable_action_max_range"
category = "counter"
type = "int"
value_domain = "encoded action-range band 0..9"
usage = "CALCSCOPE initializes this from the equipped/default attack's maximum range and widens it for usable offensive and healing skills. ATSEEK bounds its action-range flood fill with this value; RTN_M051/052 and RTN_M061 use it as their upper scan bound."
source = "investigation"
confidence = "high"
depends_on = ["0x8d819", "0xa730a"]
[[global]]
address = "0xccc21"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 4 scripts; compared against [0]; writers=['CHMENU.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x1560e7"
name = "current_magic_action_id"
category = "index-pointer"
type = "int"
value_domain = "MAINIT action id 0..11; 0 means none"
usage = "Shared selected magic/research/growth action id. MAGIC and STUDY index MAINIT's parallel columns with it, FIELD and USEMAGIC consume the selected action, and MAMES dispatches ids 1..9 to their untitled help descriptions."
source = "investigation"
confidence = "high"
depends_on = ["0x45b9", "0x1561f6"]
[[global]]
address = "0x45b9"
name = "magic_action_names"
category = "string-table"
type = "string[30]"
value_domain = "MAINIT magic, research, and growth-ritual names"
usage = "MAINIT's one-based action-name array: eleven shipped records occupy ids 1..11 in a reserved 30-cell span. MAGIC, STUDY, and EVOLVE render the selected entry."
source = "investigation"
confidence = "high"
depends_on = ["0x1560e7"]
[[global]]
address = "0x1561f6"
name = "magic_action_information_handler_script_ids"
category = "data-table"
type = "int[30]"
value_domain = "packed script id; shipped ids 1..11 all equal 0x31a6 (MAMES.BIN)"
usage = "MAINIT handler column indexed by current_magic_action_id. MAGIC and STUDY call the selected packed script id; every shipped action routes to MAMES, whose text dispatcher has authored descriptions for ids 1..9 only."
source = "investigation"
confidence = "high"
depends_on = ["0x1560e7", "0x45b9"]
[[global]]
address = "0x15a094"
name = ""
category = "story-flag"
type = "int"
value_domain = "{0,1}"
usage = "TODO: confirm. Branch-read in 0 scenes / 6 scripts; compared against [0]; writers=['ALCHEMY.BIN', 'EVOLVE.BIN', 'SELSTAGE.BIN', 'STUDY.BIN']."
source = "auto-shape"
confidence = "med"
depends_on = []
[[global]]
address = "0x15a095"
name = "information_tab_index"
category = "index-pointer"
type = "int"
value_domain = "-1 or 0..4; 0 characters, 1 enemies, 2 glossary, 3 affinity, 4 items"
usage = "Selected INFO screen tab. INFO dispatches the five tab scripts with it; INFOMES uses values 0..2 as the column of information_message_handler_script_ids for INFOCH, INFOEN, and INFOVO."
source = "investigation"
confidence = "high"
depends_on = ["0x15a097"]
[[global]]
address = "0x15a096"
name = "information_message_handled"
category = "ui-toggle"
type = "int"
value_domain = "{0,1}"
usage = "INFOMES clears this before walking handler rows and stops when it becomes one. CIMES, EIMES, and VIMES set it after rendering a matching character, enemy, or glossary message, implementing a first-handler-wins extension chain."
source = "investigation"
confidence = "high"
depends_on = ["0x15a097"]
[[global]]
address = "0x15a097"
name = "information_message_handler_script_ids"
category = "data-table"
type = "int[32][4]"
columns = { "0" = "character_handler", "1" = "enemy_handler", "2" = "glossary_handler", "3" = "reserved_handler" }
value_domain = "packed script id; zero means no handler"
usage = "INFOMES's 32-row, four-column handler registry. INIT2 populates row zero with CIMES (0x334a), EIMES (0x334b), and VIMES (0x334c); INFOMES scans rows in order for the current tab, calls nonzero handlers, and stops after information_message_handled is set."
source = "investigation"
confidence = "high"
depends_on = ["0x15a095", "0x15a096"]
[[global]]
address = "0x4dfbc"
name = "scjump_progress_a"
category = "counter"
type = "int"
value_domain = "progress index"
usage = "Dominant SCJUMP switch input (1609 comparison reads) — a per-chapter story-progress counter/position the progression machine branches on. INFERENCE from SCJUMP usage; confirm exact meaning via a listing/playthrough."
source = "inference"
confidence = "med"
depends_on = []
[[global]]
address = "0x2052e"
name = "scjump_progress_b"
category = "counter"
type = "int"
value_domain = "progress index"
usage = "Second SCJUMP switch input (1223 comparison reads) — progression counter/position. INFERENCE from SCJUMP usage."
source = "inference"
confidence = "med"
depends_on = []
[[global]]
address = "0x152618"
name = "battle_outcome_flags"
category = "unknown"
type = "int"
value_domain = "low bits: 1 = target defeated, 2 = actor defeated, 4 = both survived; combinations may accumulate during FIELD resolution"
usage = "BTL derives the low three bits from the acting and target entities' post-exchange HP. Mask 4 selects the nonlethal experience table; otherwise BTL uses the defeat table. FIELD consumes and combines the result during post-battle flow, then passes it to SCJUMP, whose former progress-C comparisons are battle-outcome decisions."
source = "investigation"
confidence = "high"
depends_on = ["0x4e085", "0x66713", "0x66714"]
[[global]]
address = "0xe6c5d"
name = "scjump_progress_d"
category = "counter"
type = "int"
value_domain = "progress index"
usage = "SCJUMP switch input (168 comparison reads) — progression counter/position. INFERENCE from SCJUMP usage."
source = "inference"
confidence = "med"
depends_on = []
[[global]]
address = "0x26f1"
name = "object_type_names"
category = "string-table"
type = "string[100]"
value_domain = "OBINIT object definition names for ids 1..46"
usage = "OBINIT writes the authoritative object names. FIELD, SETOBJ, and DRAWOBJ use STINIT's object type id to select these definitions; extract_init joins the names to stage object placements."
source = "investigation"
confidence = "high"
[[global]]
address = "0x2755"
name = "object_type_descriptions"
category = "string-table"
type = "string[100]"
value_domain = "optional OBINIT player-facing object behavior/effect descriptions for ids 1..46"
usage = "OBINIT writes the short object descriptions displayed by the field object-information path. extract_init joins populated descriptions to STINIT object placements by type id."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe6dee"
name = "object_sprite_state_row_mode"
category = "data-table"
type = "int[100]"
value_domain = "{1,2}; 1 selects a vertical sprite row from runtime object state, 2 fixes source Y at row 0"
usage = "OBINIT metadata indexed by object type. FIELD copies the type-tagged initial payload into stage_object_runtime_state only for mode 1; DRAWOBJ likewise multiplies that runtime state by the object sprite height to select source Y only for mode 1."
source = "investigation"
confidence = "high"
[[global]]
address = "0x141a4"
name = "stage_object_runtime_state"
category = "data-table"
type = "int[][50]"
value_domain = "type-dependent small integer state; initial values observed 1..3"
usage = "Per-stage, per-object-slot runtime state. FIELD initializes mode-1 objects from STINIT's first tagged payload on a fresh stage and updates capturable-object ownership; DRAWOBJ uses it as the vertical sprite-row index. RTN_M015 treats the state of Magic Pillar types 2..4 as their controlling faction and targets pillars whose value differs from the acting entity's faction."
source = "investigation"
confidence = "high"
[[global]]
address = "0xaba64"
name = "stage_object_runtime_flags"
category = "data-table"
type = "int[50]"
value_domain = "runtime stage-object bitfield; bit 1 marks a targetable active slot"
usage = "Per-current-stage object flags. RTN_M010 and RTN_M015 require bit 1 before considering Healing Feathers or Magic Pillars as movement targets; FIELD and object rendering maintain the broader type-dependent bitfield."
source = "investigation"
confidence = "high"
depends_on = ["0xe7389"]
[[global]]
address = "0x27b9"
name = "stage_victory_condition_1"
category = "string-table"
type = "string"
value_domain = "first player-facing victory-condition line for the loaded stage"
usage = "STINIT writes one value for each of its 74 stage records. AIM renders this line first in the victory-condition section, and FIELD copies it into the current mission-condition display."
source = "investigation"
confidence = "high"
[[global]]
address = "0x27ba"
name = "stage_victory_condition_2"
category = "string-table"
type = "string"
value_domain = "optional second player-facing victory-condition line; empty when unused"
usage = "STINIT writes one value for each of its 74 stage records. AIM renders nonempty values after stage_victory_condition_1, and FIELD copies the slot into the current mission-condition display."
source = "investigation"
confidence = "high"
[[global]]
address = "0x27bb"
name = "stage_defeat_condition_1"
category = "string-table"
type = "string"
value_domain = "first player-facing defeat-condition line for the loaded stage"
usage = "STINIT writes one value for each of its 74 stage records. AIM renders this line first in the defeat-condition section, and FIELD copies it into the current mission-condition display."
source = "investigation"
confidence = "high"
[[global]]
address = "0x27bc"
name = "stage_defeat_condition_2"
category = "string-table"
type = "string"
value_domain = "optional second player-facing defeat-condition line; empty when unused"
usage = "STINIT writes one value for each of its 74 stage records. AIM renders nonempty values after stage_defeat_condition_1, and FIELD copies the slot into the current mission-condition display."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7302"
name = "stage_bgm_id"
category = "data-table"
type = "int"
value_domain = "{0,11..18}; 0 disables stage BGM"
usage = "STINIT's per-stage scalar loaded for all 74 records. FIELD passes the value directly to play-bgm when starting the stage."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe730c"
name = "stage_turn_limit"
category = "data-table"
type = "int"
value_domain = "{0,10,15,30,50,60,70,75,80,100}; 0 means no limit"
usage = "STINIT's per-stage turn limit. DRAWCHP presents the value in the stage information, while FIELD compares the current turn against it when checking stage completion."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe730d"
name = "stage_turn_limit_outcome"
category = "data-table"
type = "int"
value_domain = "{0,1}; 0 defeat on expiry, 1 forced-retreat clear on expiry"
usage = "STINIT mode paired with stage_turn_limit. Stage 1 stores 0 and describes 50-turn expiry as defeat; stage 2 stores 1 and explicitly describes 15-turn expiry as a forced-retreat clear."
source = "investigation"
confidence = "high"
[[global]]
address = "0x32f1"
name = "difficulty_index"
category = "index-pointer"
type = "int"
value_domain = "{0,1,2}"
usage = "GAMESTART's three-way difficulty selection. SETEN uses the zero-based index to select difficulty stat adjustments; FIELD indexes three-column stage-enemy arrays with it, and SETOBJ tests it against each object's difficulty mask."
source = "investigation"
confidence = "high"
[[global]]
address = "0x204f8"
name = "party_reference_level"
category = "counter"
type = "int"
value_domain = "integer mean of eligible party-unit levels"
usage = "FIELD's enemy auto-level reference. It averages all eligible party units when at most five exist, otherwise the five highest-level units. SETEN raises scalable enemies above unit_starting_level by the positive gap divided by the selected auto-level divisor before applying stage level clamps. Difficulty separately adds -5/0/+5 stat-growth iterations and does not change this stored runtime level."
source = "investigation"
confidence = "high"
depends_on = ["0x673c", "0x67a0", "0x6930"]
[[global]]
address = "0x152617"
name = "current_stage_enemy_spawn_slot"
category = "index-pointer"
type = "int"
value_domain = "0..29; slot 0 is ADDEN's synthesized special-unit path"
usage = "Current STINIT enemy-template slot. FIELD selects slots 1..29 while materializing stage units, SETEN records the slot on the runtime entity and reads every parallel enemy buffer through it, and ADDEN uses slot 0 for its special generated unit."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6d3"
name = "story_event_flags"
category = "data-table"
type = "int[]"
value_domain = "mostly {0,1}"
usage = "Shared one-based story/event flag bank. Progression, recruitment, item, and stage logic read or write individual cells; STINIT object prerequisite ids are decremented by one before SETOBJ tests this array."
source = "investigation"
confidence = "high"
[[global]]
address = "0x7684"
name = "stage_clear_state"
category = "data-table"
type = "int[]"
value_domain = "{0,1}; 1 means the stage has been cleared"
usage = "Persistent per-stage completion state indexed by stage id. STAGECLEAR sets the current stage cell to 1, while FORT, SELSTAGE, and FIELD use zero versus one to distinguish an uncleared mission from a cleared replay."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7303"
name = "stage_target_clear_turns"
category = "data-table"
type = "int"
value_domain = "0..50; 0 disables turn-performance scaling"
usage = "STINIT's target/par turn count. STAGECLEAR divides elapsed turns by this value to derive a performance multiplier; when replaying an already-cleared ordinary stage, FIELD also uses it as the forced-retreat turn limit."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7304"
name = "stage_clear_performance_bonus"
category = "data-table"
type = "int"
value_domain = "0..20"
usage = "Base stage-clear reward increment. STAGECLEAR multiplies it by the turn-performance percentage derived from stage_target_clear_turns, divides by 100, and adds the result to the capped persistent reward counter at 0x6719. The counter's player-facing resource name remains unresolved."
source = "investigation"
confidence = "med"
[[global]]
address = "0xe730b"
name = "stage_replay_rules_disabled"
category = "data-table"
type = "int"
value_domain = "{0,1}; 1 preserves the original mission rules after clear"
usage = "FIELD's already-cleared-stage override gate. For a cleared stage with value 0, FIELD replaces the mission with an all-party retreat objective and a stage_target_clear_turns forced-retreat limit; value 1 suppresses that replay conversion and related revisit handling."
source = "investigation"
confidence = "high"
[[global]]
address = "0x26b5"
name = "terrain_type_names"
category = "string-table"
type = "string[30]"
value_domain = "LAINIT terrain labels for ids 1..4 and 7..19; ids 0, 5, and 6 are unnamed"
usage = "LAINIT's terrain vocabulary. MPINIT's atlas cells contain terrain ids 0..19; the named ids distinguish passages, rooms, hidden spaces, bases, water, openings, altars, lava, and themed room variants."
source = "investigation"
confidence = "high"
[[global]]
address = "0x6638b"
name = "h_scene_gallery_script_ids"
category = "data-table"
type = "int[8][15]"
columns = { "0" = "slot_0", "1" = "slot_1", "2" = "slot_2", "3" = "slot_3", "4" = "slot_4", "5" = "slot_5", "6" = "slot_6", "7" = "slot_7", "8" = "slot_8", "9" = "slot_9", "10" = "slot_10", "11" = "slot_11", "12" = "slot_12", "13" = "slot_13", "14" = "slot_14" }
value_domain = "SYS4INI SP*.BIN resource id; 118 populated cells and two trailing zero cells"
usage = "SPINIT's H-scene gallery registry. HMODE compacts the eight configured thumbnail pages, scans each page's fifteen script slots, filters populated resources through opcode 0x19d, and call-scripts the selected available entry."
source = "investigation"
confidence = "high"
depends_on = ["0x66421"]
[[global]]
address = "0x66421"
name = "h_scene_gallery_thumbnail_sheet_assets"
category = "data-table"
type = "int[8]"
value_domain = "SYS4INI resources SO027A.AGF through SO027H.AGF"
usage = "INIT2's eight HMODE thumbnail-page assets. HMODE compacts nonzero configured pages and pairs each page index with the corresponding row of h_scene_gallery_script_ids."
source = "investigation"
confidence = "high"
[[global]]
address = "0x26d3"
name = "terrain_effect_descriptions"
category = "string-table"
type = "string[30]"
value_domain = "five sparse signed summaries: accuracy/evasion/defense/speed increases or decreases"
usage = "LAINIT's player-facing terrain effect summary indexed by terrain id. FIELD shows it beneath the selected tile's terrain name; each populated string exactly describes that row of terrain_combat_stat_deltas."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0xe6afe"]
[[global]]
address = "0xe6aa4"
name = "terrain_texture_slot_indices"
category = "data-table"
type = "int[30]"
value_domain = "stage map texture slot index 0..13"
usage = "LAINIT mapping from terrain id to the index in stage_map_texture_asset_overrides. DRAWMAP uses the selected slot to choose the current stage's tiled terrain surface."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0xe7311"]
[[global]]
address = "0xe6ac2"
name = "terrain_area_fill_flags"
category = "data-table"
type = "int[30]"
value_domain = "{0,1}; 1 marks room/area-style fill, 0 marks passage/boundary-style geometry"
usage = "LAINIT terrain topology flag. DRAWMAP and CALCOCC use neighboring values to expand room-like regions across the alternating half-tile grid; DRAWMINIMAP uses the same distinction when joining adjacent revealed cells."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5"]
[[global]]
address = "0xe6ae0"
name = "terrain_layout_classes"
category = "data-table"
type = "int[30]"
value_domain = "{0=blocked_or_boundary, 1=open_area, 2=passage, 3=hidden}"
usage = "LAINIT terrain class. Zero cells are rejected by map rendering, occupancy, and pathfinding; ordinary areas, passages, and hidden spaces take distinct DRAWMAP/CALCOCC/MVSEEK paths. Combined with terrain_area_fill_flags, it distinguishes hidden rooms from hidden passages."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0xe6ac2"]
[[global]]
address = "0xe6afe"
name = "terrain_combat_stat_deltas"
category = "data-table"
type = "int[30][10]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power" }
value_domain = "signed combat parameter deltas; thirteen shipped cells range from -5 to 10"
usage = "LAINIT terrain-effect matrix. CALCBTPARAM reads the acting unit's doubled-coordinate battle tile and adds columns 0..9 through the same combat-parameter channels used by SKINIT skill deltas. INFOAF displays the first eight columns for its terrain rows, and the five populated terrain_effect_descriptions exactly summarize the shipped nonzero cells."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0x26d3", "0x341ab"]
[[global]]
address = "0xe6c2a"
name = "terrain_required_skill_ids"
category = "data-table"
type = "int[30]"
value_domain = "{0=none, 1=flight, 2=diving, 3=exploration, 4=heat_resistance}"
usage = "LAINIT traversal/reveal requirement indexed by terrain id. MVSEEK and FIELD reject ordinary terrain unless the moving unit owns the referenced SKINIT skill; hidden passages/rooms use the exploration skill through the dedicated hidden-terrain path. FIELD and INFOAF resolve populated ids to skill names for display."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0xe6ae0"]
[[global]]
address = "0xe6c48"
name = "stage_map_texture_default_asset_ids"
category = "data-table"
type = "int[20]"
value_domain = "ten sparse SYS4INI AGF resource ids 0x319c..0x31a5"
usage = "Shared fallback map texture for each of twenty stage texture slots. FIELD loads a positive stage_map_texture_asset_overrides value directly, skips zero, and when the stage value is -1 loads this slot's MP000A/B/C/E/H/I/J/K/L/N.AGF default into surface 0x52+slot."
source = "investigation"
confidence = "high"
depends_on = ["0xe6aa4", "0xe7311"]
[[global]]
address = "0x27bd"
name = "stage_display_names"
category = "string-table"
type = "string[1000]"
value_domain = "STINIT2 stage title indexed by sparse stage id; 74 populated shipped rows"
usage = "FORT and SELSTAGE enumerate this sparse catalog and render the selected title, while FIELD copies the active title into its shared display buffer. STINIT2 reserves 1,000 ids even though the shipped rows end at 170."
source = "investigation"
confidence = "high"
depends_on = ["0x4dfbc", "0x2ba5"]
[[global]]
address = "0x2ba5"
name = "stage_description_lines"
category = "string-table"
type = "string[1000][6]"
columns = { "0" = "uncleared_line_1", "1" = "uncleared_line_2", "2" = "uncleared_line_3", "3" = "cleared_line_1", "4" = "cleared_line_2", "5" = "cleared_line_3" }
value_domain = "up to three player-facing lines before clear and three after clear; 296 populated shipped cells"
usage = "SELSTAGE multiplies stage_clear_state by three and renders the corresponding three-column half of the selected STINIT2 row. The explicit 1,000-by-6 geometry prevents these strings from being mistaken for additional stage records."
source = "investigation"
confidence = "high"
depends_on = ["0x27bd", "0x7684"]
[[global]]
address = "0xe7e8d"
name = "stage_unlock_group_ids"
category = "data-table"
type = "int[1000]"
value_domain = "zero for no group; populated group ids are 32, 35, 71, and 82"
usage = "FIELD propagates an unlocked current stage to every other stage whose nonzero group id matches. The shipped groups bind route variants 32..34, 35..36, 71..72, and 82..83."
source = "investigation"
confidence = "high"
depends_on = ["0x4dfbc"]
[[global]]
address = "0xe8275"
name = "stage_main_progression_flags"
category = "data-table"
type = "int[1000]"
value_domain = "{0,1}; 49 populated main-progression rows"
usage = "When returning after a clear, FORT scans uncleared stage ids in descending order and auto-selects the first available row marked one. Side missions and all eight EX dungeons leave the flag zero."
source = "investigation"
confidence = "high"
depends_on = ["0x7684", "0xe865d", "0xea1b5"]
[[global]]
address = "0xe865d"
name = "stage_forbidden_story_flag_ids"
category = "data-table"
type = "int[1000][7]"
columns = { "0" = "forbidden_flag_1", "1" = "forbidden_flag_2", "2" = "forbidden_flag_3", "3" = "forbidden_flag_4", "4" = "forbidden_flag_5", "5" = "forbidden_flag_6", "6" = "forbidden_flag_7" }
value_domain = "one-based story_event_flags ids; zero means unused"
usage = "FORT and SELSTAGE reject a stage when any populated cell resolves to story flag value one. The scripts subtract one before indexing story_event_flags, establishing the stored one-based id convention."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3", "0xea1b5"]
[[global]]
address = "0xea1b5"
name = "stage_required_story_flag_ids"
category = "data-table"
type = "int[1000][7]"
columns = { "0" = "required_flag_1", "1" = "required_flag_2", "2" = "required_flag_3", "3" = "required_flag_4", "4" = "required_flag_5", "5" = "required_flag_6", "6" = "required_flag_7" }
value_domain = "one-based story_event_flags ids; zero means unused"
usage = "FORT and SELSTAGE require every populated cell to resolve to story flag value one. Every shipped stage carries at least one gate, including common progression flags in columns two and three."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3", "0xe865d"]
[[global]]
address = "0xebd0d"
name = "stage_display_number_major"
category = "data-table"
type = "int[1000]"
value_domain = "-1=EX label, 0=no major component, 1..10=numbered chapter"
usage = "FORT, SELSTAGE, AIM, STAGECLEAR, and management screens render this as the major half of the stage number. A negative value renders EX, while both number components zero identify an event-only row."
source = "investigation"
confidence = "high"
depends_on = ["0xec0f5"]
[[global]]
address = "0xec0f5"
name = "stage_display_number_minor"
category = "data-table"
type = "int[1000]"
value_domain = "0 for event-only rows; 1..8 for numbered/EX stages"
usage = "Rendered after stage_display_number_major as the minor stage number. FORT treats a row with both components zero as a direct event and dispatches its entry SCJUMP decision without entering FIELD."
source = "investigation"
confidence = "high"
depends_on = ["0xebd0d", "0xee035"]
[[global]]
address = "0xccc93"
name = "stage_terrain_atlas"
category = "data-table"
type = "int[][53]"
value_domain = "terrain type id 0..19; MPINIT authors columns 1..50 of 1,472 nonzero rows through grid Y 1600"
usage = "Immutable sparse half-tile terrain atlas loaded by MPINIT. Each footer copy writes fifty cells at row stride 53. FIELD doubles STINIT2's tile bounds and copies the selected rectangle into current_stage_terrain_grid; DRAWMINIMAP reads the atlas outside the active rectangle for border context, and RESETLAND restores changed cells from it."
source = "investigation"
confidence = "high"
depends_on = ["0x26b5", "0xec4dd", "0xec8c5", "0xeccad", "0xed095"]
[[global]]
address = "0x341ab"
name = "current_stage_terrain_grid"
category = "data-table"
type = "int[2000][53]"
value_domain = "mutable terrain type id 0..19 on the doubled-coordinate half-tile grid"
usage = "Current stage's mutable terrain grid. FIELD clears all 2,000 rows and copies the selected stage_terrain_atlas rectangle; rendering, minimap, occupancy, battle, and movement scripts read it, while SETLAND/DELLAND alter cells and RESETLAND restores atlas values."
source = "investigation"
confidence = "high"
depends_on = ["0xccc93"]
[[global]]
address = "0xec4dd"
name = "stage_map_min_tile_x"
category = "data-table"
type = "int[1000]"
value_domain = "inclusive tile X minimum, 1..21 in shipped mapped stages"
usage = "STINIT2's inclusive left map bound indexed by stage id. FIELD, DRAWMAP, DRAWMINIMAP, CALCOCC, and movement providers use it with stage_map_max_tile_x; terrain-grid accesses multiply the coordinate by two."
source = "investigation"
confidence = "high"
depends_on = ["0xccc93"]
[[global]]
address = "0xec8c5"
name = "stage_map_max_tile_x"
category = "data-table"
type = "int[1000]"
value_domain = "inclusive tile X maximum, 6..25 in shipped mapped stages"
usage = "STINIT2's inclusive right map bound indexed by stage id. Consumers pair it with stage_map_min_tile_x for iteration, camera/minimap limits, random placement, and the doubled-coordinate terrain-atlas copy."
source = "investigation"
confidence = "high"
depends_on = ["0xec4dd"]
[[global]]
address = "0xeccad"
name = "stage_map_min_tile_y"
category = "data-table"
type = "int[1000]"
value_domain = "inclusive tile Y minimum, 1..776 in shipped mapped stages"
usage = "STINIT2's inclusive top map bound indexed by stage id. FIELD and all map readers pair it with stage_map_max_tile_y and multiply it by two when addressing the half-tile terrain grid."
source = "investigation"
confidence = "high"
depends_on = ["0xccc93"]
[[global]]
address = "0xed095"
name = "stage_map_max_tile_y"
category = "data-table"
type = "int[1000]"
value_domain = "inclusive tile Y maximum, 7..800 in shipped mapped stages"
usage = "STINIT2's inclusive bottom map bound indexed by stage id. The maximum shipped value 800 explains MPINIT's final authored doubled grid row at Y 1600."
source = "investigation"
confidence = "high"
depends_on = ["0xeccad"]
[[global]]
address = "0xed47d"
name = "stage_minimap_atlas_origin_y"
category = "data-table"
type = "int[1000]"
value_domain = "minimap atlas Y origin; 59 populated shipped cells range from 10 to 726, zero uses the atlas origin"
usage = "FIELD and SELSTAGE copy this to the minimap drawing origin. SELSTAGE subtracts it from stage_map_min_tile_y to crop the selected stage's vertically packed minimap strip and labels the following 150 atlas rows."
source = "investigation"
confidence = "high"
depends_on = ["0xeccad", "0xed095"]
[[global]]
address = "0xed865"
name = "stage_clear_base_spendable_point_rewards"
category = "data-table"
type = "int[1000]"
value_domain = "12..60 shared spendable points across 66 mapped stages"
usage = "STAGECLEAR multiplies this base award by the turn/party-performance percentage, divides by 100, adds any card bonus, and credits the capped shared_spendable_points balance."
source = "investigation"
confidence = "high"
depends_on = ["0x671b", "0x4dfbb"]
[[global]]
address = "0xedc4d"
name = "stage_authoring_difficulty_tiers"
category = "data-table"
type = "int[1000]"
value_domain = "ordinal 1..8 across all 66 mapped stages; event-only rows are zero"
usage = "Authoring-only stage challenge/progression tier. No shipped script reads the array and the native engine can only reach VM globals through script operands, so it has no runtime effect. The ordinal correlates strongly with base clear points and encounter progression: late story maps are tier 6, EX maps use tiers 5 and 7, and the final EX map alone is tier 8. The descriptive name is correlation-based."
source = "inference"
confidence = "med"
depends_on = ["0xed865", "0xe782f", "0xe784d", "0xeebed"]
[[global]]
address = "0xee035"
name = "stage_scjump_decision_ids"
category = "data-table"
type = "int[1000][3]"
columns = { "0" = "entry", "1" = "clear", "2" = "failure" }
value_domain = "SCINIT/SCJUMP decision id; zero means no transition"
usage = "FORT dispatches column zero before entering a stage or for an event-only row. FIELD and a few scene return paths dispatch column one after clear and column two after failure or forced-retreat outcomes; all 174 populated references resolve through SCINIT."
source = "investigation"
confidence = "high"
depends_on = ["0x62ccf", "0x4dfbc"]
[[global]]
address = "0xeebed"
name = "stage_extra_dungeon_flags"
category = "data-table"
type = "int[1000]"
value_domain = "{0,1}; one for stage ids 160..167"
usage = "Marks the eight shipped EX dungeons. FORT, SELSTAGE, and management screens combine it with stage_clear_state when deciding whether to show and apply the stage's post-clear coin rewards."
source = "investigation"
confidence = "high"
depends_on = ["0x7684", "0xeefd5"]
[[global]]
address = "0xeefd5"
name = "stage_clear_coin_quantities"
category = "data-table"
type = "int[1000][3]"
columns = { "0" = "bronze_coin_item_91", "1" = "silver_coin_item_92", "2" = "gold_coin_item_93" }
value_domain = "nonnegative ITINIT item quantities; 64 populated shipped cells"
usage = "FORT and SELSTAGE render the three clear-reward quantities beside coin icons. Management screens grant the same values as item ids 91..93 after a cleared or EX-marked stage."
source = "investigation"
confidence = "high"
depends_on = ["0x8c877", "0xeebed"]
[[global]]
address = "0xefb8d"
name = "stage_loader_script_ids"
category = "data-table"
type = "int[1000]"
value_domain = "packed call-script resource id; all 74 shipped rows contain 12893=STINIT.BIN"
usage = "FIELD indirectly calls the selected STINIT2 row before initializing the map. Every shipped stage points to the shared STINIT selector program, which then populates stage-specific objects, enemies, rules, textures, and audio."
source = "investigation"
confidence = "high"
depends_on = ["0x4dfbc"]
[[global]]
address = "0xe7311"
name = "stage_map_texture_asset_overrides"
category = "data-table"
type = "int[20]"
value_domain = "SYS4INI resource id when positive, 0 disables the slot, -1 selects the shared fallback asset"
usage = "Twenty current-stage map texture slots. FIELD loads positive resource ids into tiled surface slots 0x52+index, skips zero, and substitutes the shared per-index fallback for -1; DRAWMAP selects and draws those surfaces through the terrain-to-texture-slot map."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7325"
name = "stage_object_tile_x"
category = "data-table"
type = "int[50]"
value_domain = "map tile X coordinate, 1..25 in the shipped stages"
usage = "X coordinate for each current-stage object slot. DRAWOBJ converts it to centered map-space pixels; FIELD and CALCOCC use it with stage_object_tile_y for object interaction and occupancy."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7357"
name = "stage_object_tile_y"
category = "data-table"
type = "int[50]"
value_domain = "map tile Y coordinate, 1..800 in the shipped stages"
usage = "Y coordinate for each current-stage object slot. DRAWOBJ converts it to centered map-space pixels; FIELD and CALCOCC use it with stage_object_tile_x for object interaction and occupancy."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7389"
name = "stage_object_type_id"
category = "data-table"
type = "int[50]"
value_domain = "object definition id 1..46"
usage = "Object-definition id for each current-stage object slot. SETOBJ decides whether the slot exists, while DRAWOBJ and FIELD use the id to select shared object graphics, dimensions, animation, collision, and behavior metadata."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe741f"
name = "stage_object_reinforcement_interval_turns"
category = "data-table"
type = "int[50]"
value_domain = "positive turn interval, 5..80 in the shipped stages; zero disables scheduled spawning"
usage = "Per-object reinforcement schedule. FIELD compares the current turn and the object's runtime spawn count against this interval to calculate due weighted enemy spawns; object type 27 uses the same value as its one-shot trigger turn."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7451"
name = "stage_object_reinforcement_spawn_limit"
category = "data-table"
type = "int[50]"
value_domain = "positive spawn limit, 1..20 in the shipped stages; zero disables scheduled spawning"
usage = "Maximum number of scheduled units materialized through a stage object. FIELD stops the object's reinforcement path once its runtime spawn counter reaches this value; object type 27 stores one for its one-shot special spawn."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe7483"
name = "stage_object_difficulty_mask"
category = "data-table"
type = "int[50]"
value_domain = "{3,4,7}; bit 0/1/2 enables the object on the corresponding difficulty"
usage = "Per-object difficulty inclusion mask. SETOBJ uses check-bit with difficulty_index and rejects the object slot when the selected difficulty bit is absent."
source = "investigation"
confidence = "high"
depends_on = ["0x32f1"]
[[global]]
address = "0xe74b5"
name = "stage_object_required_story_flags"
category = "data-table"
type = "int[50][7]"
columns = { "0" = "required_flag_1", "1" = "required_flag_2", "2" = "required_flag_3", "3" = "required_flag_4", "4" = "required_flag_5", "5" = "required_flag_6", "6" = "required_flag_7" }
value_domain = "one-based story_event_flags ids; zero means no requirement"
usage = "Seven positive prerequisites per stage object. SETOBJ subtracts one from every populated id and suppresses the object unless the corresponding story_event_flags cell equals 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0xe7613"
name = "stage_object_forbidden_story_flags"
category = "data-table"
type = "int[50][5]"
columns = { "0" = "forbidden_flag_1", "1" = "forbidden_flag_2", "2" = "forbidden_flag_3", "3" = "forbidden_flag_4", "4" = "forbidden_flag_5" }
value_domain = "one-based story_event_flags ids; zero means no exclusion"
usage = "Five negative prerequisites per stage object. SETOBJ subtracts one from every populated id and suppresses the object when the corresponding story_event_flags cell equals 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0xe773f"
name = "stage_enemy_spawn_tile_x"
category = "data-table"
type = "int[30]"
value_domain = "map tile X coordinate, 1..25 when populated"
usage = "Direct X coordinate for a current-stage enemy slot. FIELD copies it into the runtime unit position when stage_enemy_spawn_object_slot is zero; object-linked alternatives instead inherit the referenced object's coordinates."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe775d"
name = "stage_enemy_spawn_tile_y"
category = "data-table"
type = "int[30]"
value_domain = "map tile Y coordinate, 3..799 when populated"
usage = "Direct Y coordinate paired with stage_enemy_spawn_tile_x. FIELD and ADDEN copy the pair into the runtime unit position; object-linked alternatives instead inherit the referenced object's coordinates."
source = "investigation"
confidence = "high"
depends_on = ["0xe773f"]
[[global]]
address = "0xe777b"
name = "stage_enemy_spawn_object_slot"
category = "data-table"
type = "int[30]"
value_domain = "stage object slot 2..46; zero means use the direct tile coordinates"
usage = "Optional object-placement anchor for an enemy spawn. FIELD resolves nonzero entries through stage_object_type_id and uses the matching stage_object_tile_x/Y location; zero selects stage_enemy_spawn_tile_x/Y directly."
source = "investigation"
confidence = "high"
depends_on = ["0xe7325", "0xe7357", "0xe7389"]
[[global]]
address = "0xe7799"
name = "stage_enemy_faction_id"
category = "data-table"
type = "int[30]"
value_domain = "{0,2,3}"
usage = "Per-spawn faction/team selector. FIELD and ADDEN copy it into the runtime unit's faction field, use it to choose the entity-index band, and test the same value against map occupancy masks."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe77b7"
name = "stage_enemy_difficulty_mask"
category = "data-table"
type = "int[30]"
value_domain = "7 in the shipped table; bit 0/1/2 enables the spawn on the corresponding difficulty"
usage = "Per-spawn difficulty inclusion mask. FIELD uses check-bit with difficulty_index and rejects a slot when the selected difficulty bit is absent."
source = "investigation"
confidence = "high"
depends_on = ["0x32f1"]
[[global]]
address = "0xe77d5"
name = "stage_enemy_first_clear_only"
category = "data-table"
type = "int[30]"
value_domain = "{0,2}; 2 suppresses the spawn after the stage has been cleared"
usage = "Per-spawn replay gate. FIELD rejects a populated enemy slot when this value is 2 and stage_clear_state for the current stage is 1; zero/default slots remain eligible on cleared-stage replays."
source = "investigation"
confidence = "high"
depends_on = ["0x7684"]
[[global]]
address = "0xe77f3"
name = "stage_enemy_random_selection_weight"
category = "data-table"
type = "int[30]"
value_domain = "{0,1,2,3,10,20,30}; zero means spawn directly"
usage = "Weight for stage-enemy alternatives. FIELD groups eligible nonzero-weight slots by their stage_enemy_spawn_object_slot, sums the weights, makes a weighted random choice within each eligible group, and directly materializes zero-weight slots."
source = "investigation"
confidence = "high"
depends_on = ["0xe777b"]
[[global]]
address = "0xe7811"
name = "stage_enemy_unit_id"
category = "data-table"
type = "int[30]"
value_domain = "EBINIT unit ids 1..869; zero means unused slot"
usage = "Unit-definition id for each current-stage enemy slot. FIELD rejects zero slots, while FIELD and ADDEN pass populated ids to SETEN to copy the corresponding EBINIT definition into a runtime entity."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe782f"
name = "stage_enemy_min_level"
category = "data-table"
type = "int[30]"
value_domain = "1..99"
usage = "Scenario-specific minimum level for each stage enemy. After applying party-level auto-scaling, SETEN raises the runtime level to this floor before applying the maximum-level clamp."
source = "investigation"
confidence = "high"
[[global]]
address = "0xe784d"
name = "stage_enemy_max_level"
category = "data-table"
type = "int[30]"
value_domain = "1..99"
usage = "Scenario-specific maximum level for each stage enemy. SETEN uses a positive value as the upper clamp unless the debug/config override is active; otherwise it falls back to the unit definition's unit_level_cap."
source = "investigation"
confidence = "high"
depends_on = ["0x7a766"]
[[global]]
address = "0xe786b"
name = "stage_enemy_auto_level_scale_divisor"
category = "data-table"
type = "int[30]"
value_domain = "{1,2}"
usage = "Scenario override for enemy auto-level scaling. SETEN divides the positive gap between the scenario base level and unit_starting_level by this value before adding it to the runtime level; zero would fall back to unit_auto_level_scale_divisor."
source = "investigation"
confidence = "high"
depends_on = ["0x7a37e", "0x7ab4e"]
[[global]]
address = "0xe7889"
name = "stage_enemy_movement_routine_set_ids"
category = "data-table"
type = "int[30][3]"
columns = { "0" = "difficulty_0", "1" = "difficulty_1", "2" = "difficulty_2" }
value_domain = "movement-routine set ids 1..176"
usage = "Three difficulty-specific movement-AI routine-set ids per stage enemy. SETEN copies the row into the runtime unit, and MVRTN selects the difficulty_index column as its movement routine table row."
source = "investigation"
confidence = "high"
depends_on = ["0x32f1", "0x152617"]
[[global]]
address = "0xe78e3"
name = "stage_enemy_battle_routine_set_ids"
category = "data-table"
type = "int[30][3]"
columns = { "0" = "difficulty_0", "1" = "difficulty_1", "2" = "difficulty_2" }
value_domain = "battle-routine set ids 2..7; zero row falls back to the unit definition"
usage = "Optional three-column battle-AI routine override per stage enemy. SETEN copies a populated row into the runtime unit or falls back to the unit definition, and BTRTN selects the difficulty_index column as its battle routine table row."
source = "investigation"
confidence = "high"
depends_on = ["0x32f1", "0x152617"]
[[global]]
address = "0xe793d"
name = "stage_enemy_required_story_flags"
category = "data-table"
type = "int[30][7]"
columns = { "0" = "required_flag_1", "1" = "required_flag_2", "2" = "required_flag_3", "3" = "required_flag_4", "4" = "required_flag_5", "5" = "required_flag_6", "6" = "required_flag_7" }
value_domain = "one-based story_event_flags ids; zero means no requirement"
usage = "Seven positive prerequisites per stage enemy. FIELD subtracts one from every populated id and suppresses the spawn unless the corresponding story_event_flags cell equals 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0xe7a0f"
name = "stage_enemy_forbidden_story_flags"
category = "data-table"
type = "int[30][5]"
columns = { "0" = "forbidden_flag_1", "1" = "forbidden_flag_2", "2" = "forbidden_flag_3", "3" = "forbidden_flag_4", "4" = "forbidden_flag_5" }
value_domain = "one-based story_event_flags ids; zero means no exclusion"
usage = "Five negative prerequisites per stage enemy. FIELD subtracts one from every populated id and suppresses the spawn when the corresponding story_event_flags cell equals 1."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0x156214"
name = "alchemy_recipe_output_item_ids"
category = "data-table"
type = "int[1000]"
value_domain = "ITINIT item ids; zero means no recipe"
usage = "Output item id indexed by sparse alchemy recipe id. ALCHEMY scans recipe ids 0..999, treats a nonzero cell as a populated recipe, and adds one copy of this item after a successful synthesis."
source = "investigation"
confidence = "high"
[[global]]
address = "0x1565fc"
name = "alchemy_recipe_minimum_levels"
category = "data-table"
type = "int[1000]"
value_domain = "0..6"
usage = "Minimum alchemy level indexed by recipe id. ALCHEMY exposes a populated recipe only when this value is less than or equal to alchemy_level."
source = "investigation"
confidence = "high"
depends_on = ["0x156214", "0x671d"]
[[global]]
address = "0x1569e4"
name = "alchemy_recipe_required_story_flags"
category = "data-table"
type = "int[1000][2]"
columns = { "0" = "required_flag_1", "1" = "required_flag_2" }
value_domain = "one-based story_event_flags ids; zero means no requirement"
usage = "Two positive story prerequisites per recipe. ALCHEMY subtracts one from every populated id and hides the recipe unless the corresponding story_event_flags cell equals 1; shipped ALINIT data populates only the first column."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3", "0x156214"]
[[global]]
address = "0x1571b4"
name = "alchemy_recipe_forbidden_story_flags"
category = "data-table"
type = "int[1000][2]"
columns = { "0" = "forbidden_flag_1", "1" = "forbidden_flag_2" }
value_domain = "one-based story_event_flags ids; zero means no exclusion"
usage = "Two negative story prerequisites per recipe. ALCHEMY subtracts one from every populated id and hides the recipe when the corresponding story_event_flags cell equals 1; shipped ALINIT data populates only the first column."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3", "0x156214"]
[[global]]
address = "0x157d6c"
name = "alchemy_recipe_point_costs"
category = "data-table"
type = "int[1000]"
value_domain = "5..100"
usage = "Spendable point cost indexed by recipe id. ALCHEMY checks recipe availability against its point-capacity condition, then requires and deducts this value from shared_spendable_points on synthesis."
source = "investigation"
confidence = "high"
depends_on = ["0x156214", "0x671b"]
[[global]]
address = "0x158154"
name = "alchemy_recipe_ingredient_item_ids"
category = "data-table"
type = "int[1000][4]"
columns = { "0" = "ingredient_1", "1" = "ingredient_2", "2" = "ingredient_3", "3" = "ingredient_4" }
value_domain = "ITINIT item ids; zero means unused slot"
usage = "Up to four ingredient item ids per recipe. ALCHEMY checks total inventory for each populated slot and removes the paired alchemy_recipe_ingredient_quantities amount during synthesis."
source = "investigation"
confidence = "high"
depends_on = ["0x156214", "0x1590f4"]
[[global]]
address = "0x1590f4"
name = "alchemy_recipe_ingredient_quantities"
category = "data-table"
type = "int[1000][4]"
columns = { "0" = "ingredient_1", "1" = "ingredient_2", "2" = "ingredient_3", "3" = "ingredient_4" }
value_domain = "positive item count; shipped values are 1, 2, 3, or 5"
usage = "Required ingredient quantities paired cell-for-cell with alchemy_recipe_ingredient_item_ids. ALCHEMY requires and consumes this many copies of each populated ingredient."
source = "investigation"
confidence = "high"
depends_on = ["0x158154"]
[[global]]
address = "0x2690"
name = "attack_element_names"
category = "string-table"
type = "string[20]"
columns = { "1" = "physical", "2" = "universal", "3" = "fire", "4" = "ice", "5" = "lightning", "6" = "earth", "7" = "holy", "8" = "dark", "11" = "resistance_1", "12" = "resistance_2", "13" = "resistance_3", "14" = "resistance_4", "15" = "resistance_5", "16" = "resistance_6", "17" = "resistance_7" }
value_domain = "Japanese element/attribute display strings; unused cells are empty"
usage = "AFINIT attack-side affinity vocabulary. DRAWTIP indexes ids 1..8 from ITINIT, while INFOAF displays those same eight ordinary attack elements above attack_element_effectiveness_percent."
source = "investigation"
confidence = "high"
depends_on = ["0x8dfe9", "0xa7436", "0xab5ba"]
[[global]]
address = "0x26a4"
name = "defense_element_names"
category = "string-table"
type = "string[20]"
columns = { "1" = "physical", "2" = "universal", "3" = "fire", "4" = "ice", "5" = "lightning", "6" = "earth", "7" = "holy", "8" = "dark", "9" = "divinity", "10" = "demon", "11" = "spirit", "12" = "undead" }
value_domain = "Japanese defense-affinity display strings; unused cells are empty"
usage = "AFINIT defense-side affinity vocabulary. DRAWENP and DRAWTIP index it with unit/item defense element ids; the same id selects a row of attack_element_effectiveness_percent."
source = "investigation"
confidence = "high"
depends_on = ["0x77c6e", "0x8e3d1", "0xab5ba"]
[[global]]
address = "0x43dd"
name = "name_entry_character_palette"
category = "string-table"
type = "string[5][70]"
value_domain = "one authored input character or empty reserved cell"
usage = "INPUTNAME's five 70-cell character pages: row 0 hiragana, row 1 katakana, row 2 full-width Latin letters, row 3 Arabic/Kanji/Roman/circled numerals, and row 4 symbols. Cursor slots 70..74 select the page; selecting a populated cell copies it into the seven-character name buffer."
source = "investigation"
confidence = "high"
[[global]]
address = "0xab6fa"
name = "item_tuning_stat_bonus_curves"
category = "data-table"
type = "int[20][11]"
columns = { "0" = "tuning_level_1", "1" = "tuning_level_2", "2" = "tuning_level_3", "3" = "tuning_level_4", "4" = "tuning_level_5", "5" = "tuning_level_6", "6" = "tuning_level_7", "7" = "tuning_level_8", "8" = "tuning_level_9", "9" = "tuning_level_10", "10" = "reserved" }
value_domain = "non-negative stat bonus; zero means that tuning level is unavailable"
usage = "Eighteen usable equipment-growth curves selected by item_tuning_curve_ids, plus an explicitly zeroed reserved row 19. TUNE and IMPROVE use the nonzero prefix as the available tuning-level range; CALCREVISE and DRAWTIP add the selected zero-based tuning level's bonus to the corresponding stat."
source = "investigation"
confidence = "high"
depends_on = ["0xa2bf1"]
[[global]]
address = "0xab7d6"
name = "item_tuning_point_cost_curves"
category = "data-table"
type = "int[20][11]"
columns = { "0" = "tuning_level_1", "1" = "tuning_level_2", "2" = "tuning_level_3", "3" = "tuning_level_4", "4" = "tuning_level_5", "5" = "tuning_level_6", "6" = "tuning_level_7", "7" = "tuning_level_8", "8" = "tuning_level_9", "9" = "tuning_level_10", "10" = "reserved" }
value_domain = "non-negative point cost; shipped nonzero values are 10..400"
usage = "Point-cost curves paired by curve id and tuning level with item_tuning_stat_bonus_curves. IMPROVE sums costs for newly selected levels, subtracts refunds for removed levels, checks the resulting total against the tuning-point balance, and deducts it on confirmation."
source = "investigation"
confidence = "high"
depends_on = ["0xab6fa", "0xa2bf1"]
[[global]]
address = "0xab8b2"
name = "facility_level_progress_thresholds"
category = "data-table"
type = "int[3][7]"
columns = { "0" = "level_0_to_1", "1" = "level_1_to_2", "2" = "level_2_to_3", "3" = "level_3_to_4", "4" = "level_4_to_5", "5" = "level_5_to_6", "6" = "level_6_cap" }
value_domain = "required progress; final cap column is zero/unwritten"
usage = "AFINIT's three facility-progression rows. IMPROVE uses row 0 for equipment tuning, ALCHEMY uses row 1, and MAGIC/USEMAGIC use row 2; each indexes the row by the current level and caps advancement at level 6."
source = "investigation"
confidence = "high"
depends_on = ["0x671c", "0x671d", "0x671e", "0x671f", "0x6720", "0x6721"]
[[global]]
address = "0x453b"
name = "training_action_text"
category = "data-table"
type = "string[21][6]"
columns = { "0" = "description_line_1", "1" = "description_line_2", "2" = "description_line_3", "3" = "locked_hint_line_1", "4" = "locked_hint_line_2", "5" = "locked_hint_line_3" }
value_domain = "player-facing Japanese text; empty cells are unused lines"
usage = "TRINIT's six-string row for each of 21 training/sexual-magic actions. TRAIN renders columns 0..2 for the action description and cost/reward summary, or columns 3..5 for the unmet-condition hint."
source = "investigation"
confidence = "high"
depends_on = ["0x53edd", "0x53ede"]
[[global]]
address = "0x155bbc"
name = "training_action_required_story_flag_ids"
category = "data-table"
type = "int[21][3]"
columns = { "0" = "required_story_flag_id_1", "1" = "required_story_flag_id_2", "2" = "required_story_flag_id_3" }
value_domain = "one-based story flag id; zero means no requirement"
usage = "Up to three prerequisite story flags per TRINIT action. TRAIN subtracts one before indexing story_event_flags and rejects the action unless every populated flag equals one."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0x155bfb"
name = "training_action_forbidden_story_flag_ids"
category = "data-table"
type = "int[21][3]"
columns = { "0" = "forbidden_story_flag_id_1", "1" = "forbidden_story_flag_id_2", "2" = "forbidden_story_flag_id_3" }
value_domain = "one-based story flag id; zero means no exclusion"
usage = "Reserved three-slot exclusion table paired with training_action_required_story_flag_ids. TRAIN rejects an action when any populated flag equals one; shipped TRINIT leaves all 63 cells zero."
source = "investigation"
confidence = "high"
depends_on = ["0x6d3"]
[[global]]
address = "0x155c3a"
name = "training_action_minimum_unit_levels"
category = "data-table"
type = "int[21]"
value_domain = "unit level; zero means no lower bound"
usage = "Minimum familiar level for each TRINIT action. TRAIN compares the selected unit's level and rejects values below the populated threshold."
source = "investigation"
confidence = "high"
depends_on = ["0x6930"]
[[global]]
address = "0x155c4f"
name = "training_action_maximum_unit_levels"
category = "data-table"
type = "int[21]"
value_domain = "unit level; zero means no upper bound"
usage = "Maximum familiar level for each TRINIT action. TRAIN rejects levels above a populated threshold; shipped TRINIT leaves this reserved family empty."
source = "investigation"
confidence = "high"
depends_on = ["0x6930"]
[[global]]
address = "0x155c64"
name = "training_action_minimum_alignment_thresholds_encoded"
category = "data-table"
type = "int[21]"
value_domain = "100 + signed alignment threshold; zero means no lower bound"
usage = "Encoded lower alignment/personality gates. TRAIN subtracts 100 from a populated value and requires familiar_alignment to be at least that signed threshold; the five shipped gates correspond to the locked hints' kind-personality requirements."
source = "investigation"
confidence = "high"
depends_on = ["0x6722"]
[[global]]
address = "0x155c79"
name = "training_action_maximum_alignment_thresholds_encoded"
category = "data-table"
type = "int[21]"
value_domain = "100 + signed alignment threshold; zero means no upper bound"
usage = "Encoded upper alignment/personality gates. TRAIN subtracts 100 and requires familiar_alignment not to exceed the signed threshold; the five shipped gates correspond to evil-personality requirements."
source = "investigation"
confidence = "high"
depends_on = ["0x6722"]
[[global]]
address = "0x155c8e"
name = "training_action_minimum_progress"
category = "data-table"
type = "int[21]"
value_domain = "familiar training progress 0..99; zero means no lower bound"
usage = "Minimum familiar_training_progress required by each TRINIT action. TRAIN rejects the action when the current value is below a populated threshold."
source = "investigation"
confidence = "high"
depends_on = ["0x6724"]
[[global]]
address = "0x155ca3"
name = "training_action_maximum_progress"
category = "data-table"
type = "int[21]"
value_domain = "familiar training progress 0..99; zero means no upper bound"
usage = "Upper training-progress gate paired with training_action_minimum_progress. TRAIN enforces populated values; shipped TRINIT leaves all 21 cells zero."
source = "investigation"
confidence = "high"
depends_on = ["0x6724"]
[[global]]
address = "0x155cb8"
name = "training_action_minimum_unit_stats"
category = "data-table"
type = "int[21][10]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power" }
value_domain = "minimum unit stat; zero means no lower bound"
usage = "Ten-column minimum-stat gate using the first ten unit-stat ABI columns. TRAIN compares each populated cell with the selected familiar's current stat; shipped TRINIT leaves the table empty."
source = "investigation"
confidence = "high"
depends_on = ["0x69f8"]
[[global]]
address = "0x155d8a"
name = "training_action_maximum_unit_stats"
category = "data-table"
type = "int[21][10]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power" }
value_domain = "maximum unit stat; zero means no upper bound"
usage = "Ten-column maximum-stat gate paired with training_action_minimum_unit_stats. TRAIN enforces populated cells; shipped TRINIT leaves the table empty."
source = "investigation"
confidence = "high"
depends_on = ["0x69f8"]
[[global]]
address = "0x155e5c"
name = "training_action_required_item_ids"
category = "data-table"
type = "int[21]"
value_domain = "ITINIT item id; zero means no item requirement"
usage = "Optional item prerequisite for each TRINIT action. TRAIN requires a nonzero inventory count and displays the joined item name; the item is a gate, not consumed by this path."
source = "investigation"
confidence = "high"
[[global]]
address = "0x155e71"
name = "training_action_required_skill_ids"
category = "data-table"
type = "int[21]"
value_domain = "SKINIT skill id; zero means no skill requirement"
usage = "Optional acquired-skill prerequisite. TRAIN requires the corresponding skill_acquired_flags cell; shipped TRINIT leaves all 21 cells zero."
source = "investigation"
confidence = "high"
depends_on = ["0x65ce"]
[[global]]
address = "0x155e86"
name = "training_action_spirit_deltas"
category = "data-table"
type = "int[21]"
value_domain = "negative 精気 cost; shipped values -90..-20"
usage = "Signed current_spirit delta for each TRINIT action. TRAIN rejects an action whose post-delta spirit would be negative, displays the negated value as its cost, and applies the delta before scene dispatch."
source = "investigation"
confidence = "high"
depends_on = ["0x20530"]
[[global]]
address = "0x155e9b"
name = "training_action_unit_stat_deltas"
category = "data-table"
type = "int[21][14]"
columns = { "0" = "accuracy", "1" = "evasion", "2" = "physical_attack", "3" = "physical_defense", "4" = "magic_attack", "5" = "magic_defense", "6" = "speed", "7" = "luck", "8" = "critical_chance", "9" = "capture_power", "10" = "movement", "11" = "max_hp", "12" = "max_sp", "13" = "max_fs" }
value_domain = "signed additive unit stat delta; zero means unchanged"
usage = "Fourteen-column familiar stat effects for each TRINIT action. TRAIN adds populated values through the unit stat-growth ABI, carries fractional growth, applies caps, and invokes SHOWGROW when any stat changes."
source = "investigation"
confidence = "high"
depends_on = ["0x69f8"]
[[global]]
address = "0x155fc1"
name = "training_action_alignment_deltas_hundredths"
category = "data-table"
type = "int[21]"
value_domain = "signed hundredths of familiar alignment; shipped -2000..300"
usage = "Alignment/personality change for each TRINIT action in hundredths. TRAIN combines it with familiar_alignment_fraction, applies the integral and stochastic fractional change to familiar_alignment, and clamps the result to -99..99."
source = "investigation"
confidence = "high"
depends_on = ["0x6722", "0x6723"]
[[global]]
address = "0x155fd6"
name = "training_action_progress_deltas_hundredths"
category = "data-table"
type = "int[21]"
value_domain = "positive hundredths of training progress; shipped 100..300"
usage = "Training-progress gain for each TRINIT action in hundredths. TRAIN combines it with familiar_training_progress_fraction, advances familiar_training_progress with fractional probability, and clamps the result to 99."
source = "investigation"
confidence = "high"
depends_on = ["0x6724", "0x6725"]
[[global]]
address = "0x155feb"
name = "training_action_awarded_skill_ids"
category = "data-table"
type = "int[21]"
value_domain = "SKINIT skill id; zero means no award"
usage = "Optional skill granted by a TRINIT action. TRAIN checks whether it is new, marks the reward path, and passes the id to ADDSKILL; the extractor joins all eight populated ids to SKINIT names."
source = "investigation"
confidence = "high"
depends_on = ["0x65ce", "0xa6e59"]
[[global]]
address = "0x156000"
name = "training_action_awarded_item_ids"
category = "data-table"
type = "int[21]"
value_domain = "ITINIT item id; zero means no award"
usage = "Optional item granted by a TRINIT action. TRAIN suppresses already-owned key/story rewards, displays the joined item name, and calls ADDITEM for the three populated shipped actions."
source = "investigation"
confidence = "high"
depends_on = ["0x8c877"]
[[global]]
address = "0x156015"
name = "training_action_event_story_flag_ids"
category = "data-table"
type = "int[21][10]"
columns = { "0" = "execution_1", "1" = "execution_2", "2" = "execution_3", "3" = "execution_4", "4" = "execution_5", "5" = "execution_6", "6" = "execution_7", "7" = "execution_8", "8" = "execution_9", "9" = "execution_10" }
value_domain = "story flag / SCINIT decision id; zero ends the action's execution sequence"
usage = "Per-action event sequence selected by the prior execution count. TRAIN copies the chosen id to scjump_decision_out and dispatches it through SCINIT; GAMESTART marks every slot below a restored count in story_event_flags. Repeated ids intentionally reuse a scene, and the first zero defines the execution cap."
source = "investigation"
confidence = "high"
depends_on = ["0x53edd", "0x62ccf", "0x6727", "0x6d3", "0x87a57"]
[[global]]
address = "0x6723"
name = "familiar_alignment_fraction"
category = "counter"
type = "int"
value_domain = "signed fractional hundredths carried between alignment changes"
usage = "Fractional accumulator paired with familiar_alignment. TRAIN adds the selected action's hundredths delta, applies the integral quotient and probabilistic remainder, and preserves the remaining fraction."
source = "investigation"
confidence = "high"
depends_on = ["0x6722", "0x155fc1"]
[[global]]
address = "0x6725"
name = "familiar_training_progress_fraction"
category = "counter"
type = "int"
value_domain = "fractional hundredths carried between training-progress gains"
usage = "Fractional accumulator paired with familiar_training_progress. TRAIN adds the action's hundredths delta, advances the integer value by the quotient and probabilistic remainder, and preserves the remaining fraction."
source = "investigation"
confidence = "high"
depends_on = ["0x6724", "0x155fd6"]
[[global]]
address = "0x6726"
name = "training_action_total_execution_count"
category = "counter"
type = "int"
value_domain = "nonnegative total completed training actions"
usage = "TRAIN increments this once after every successful action, independently of the selected action's own execution count. DRAWCHP displays it with the familiar's other training statistics and SAVE persists it."
source = "investigation"
confidence = "high"
depends_on = ["0x6727"]
[[global]]
address = "0x6727"
name = "training_action_execution_counts"
category = "counter"
type = "int[21]"
value_domain = "0..10 completed executions by TRINIT action id"
usage = "Per-action completed execution counts. TRAIN uses the prior count as the column in training_action_event_story_flag_ids, increments the selected cell, and treats a zero next event as the cap; GAMESTART restores each count and replays its completed event flags."
source = "investigation"
confidence = "high"
depends_on = ["0x156015"]
[[global]]
address = "0x53edd"
name = "selected_training_action_id"
category = "index-pointer"
type = "int"
value_domain = "TRINIT action id 0..20"
usage = "TRAIN's selected action row. It indexes all TRINIT eligibility, effect, text, award, and event arrays during detail rendering and execution."
source = "investigation"
confidence = "high"
depends_on = ["0x453b", "0x155bbc", "0x156015"]
[[global]]
address = "0x53ede"
name = "training_action_unlock_flags"
category = "data-table"
type = "int[21]"
value_domain = "0/1 by TRINIT action id"
usage = "Persistent per-action discovered/unlocked state maintained by TRAIN after evaluating eligibility. TRAIN uses it while choosing the locked-versus-known menu presentation, GAMESTART restores every cell, and SAVE persists the same block."
source = "investigation"
confidence = "high"
depends_on = ["0x53edd"]
[[global]]
address = "0x4315"
name = "card_definition_names"
category = "string-table"
type = "string[100]"
value_domain = "CDINIT2 display name by one-based card id"
usage = "Card names populated by CDINIT2. FIELD indexes this table with current_card_id when presenting the card selected from CDINIT's weighted generation list."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8"]
[[global]]
address = "0x15288c"
name = "selected_battle_animation_id"
category = "index-pointer"
type = "int"
value_domain = "BTANINIT2 animation id 1..809; zero means no animation"
usage = "CALCDMG selects a skill_battle_animation_id or an equipped item's item_weapon_class, and BTL also writes passive reaction ids 801..808 and hardcoded defeat id 809. BTANINIT uses this value to select one six-effect timeline."
source = "investigation"
confidence = "high"
depends_on = ["0xaaa1e", "0xa6689", "0x15288e"]
[[global]]
address = "0x15288e"
name = "battle_animation_effect_ids"
category = "data-table"
type = "int[1000][6]"
columns = { "0" = "effect_slot_0", "1" = "effect_slot_1", "2" = "effect_slot_2", "3" = "effect_slot_3", "4" = "reserved_effect_slot_4", "5" = "effect_slot_5" }
value_domain = "BTANINIT effect ids 1..966; zero means no effect"
usage = "BTANINIT2's sparse battle-animation composition table. BTANINIT expands the selected row into six runtime effect work slots. BTL anchors requested effects in slots 0 and 1 to the actor and slots 2 through 5 to the target; shipped data never populates slot 4."
source = "investigation"
confidence = "high"
depends_on = ["0x15288c", "0x153ffe", "0x155b56"]
[[global]]
address = "0x153ffe"
name = "battle_animation_effect_start_delays_ms"
category = "data-table"
type = "int[1000][6]"
columns = { "0" = "effect_slot_0", "1" = "effect_slot_1", "2" = "effect_slot_2", "3" = "effect_slot_3", "4" = "reserved_effect_slot_4", "5" = "effect_slot_5" }
value_domain = "non-negative milliseconds; zero means start immediately"
usage = "Per-effect start delays paired with battle_animation_effect_ids. BTL passes each populated value to movie/sprite animation setup and adds it to the effect-local sound and hit-pulse offsets. Shipped data authors delays only for slots 2, 3, and 5."
source = "investigation"
confidence = "high"
depends_on = ["0x15288e", "0x15576e"]
[[global]]
address = "0x15576e"
name = "battle_animation_duration_ms"
category = "data-table"
type = "int[1000]"
value_domain = "non-negative milliseconds; shipped complete timelines use 500..1700"
usage = "Overall timing boundary for one BTANINIT2 animation row. BTL uses it to schedule delayed battle voice and to begin the 500 ms HP interpolation after the main animation. The passive/defeat auxiliary rows 801..809 intentionally omit it."
source = "investigation"
confidence = "high"
depends_on = ["0x15288c", "0x15288e"]
[[global]]
address = "0x155b56"
name = "battle_effect_visual_asset_ids"
category = "data-table"
type = "int[6]"
value_domain = "SYS4INI MVB*.AGF or AM*.AGF resource id; zero means empty slot"
usage = "BTANINIT clears and materializes the selected animation's six visual resources. BTL opens mode-0 values as nonblocking MPEG-in-AGF movies and mode-1/2 values as sprite sheets. All 202 effect definitions resolve through SYS4INI."
source = "investigation"
confidence = "high"
depends_on = ["0x15288e", "0x155b5c"]
[[global]]
address = "0x155b5c"
name = "battle_effect_visual_mode_ids"
category = "data-table"
type = "int[6]"
value_domain = "0=movie, 1=green-colorkey sprite sheet, 2=opaque sprite sheet"
usage = "BTANINIT visual playback mode per materialized effect slot. BTL routes zero through play-movie-to-surface, mode 1 through set-texture with green color key 0x00ff00, and mode 2 through set-texture with no color key."
source = "investigation"
confidence = "high"
depends_on = ["0x155b56", "0x155b74", "0x155b80", "0x155b86"]
[[global]]
address = "0x155b62"
name = "battle_effect_additive_blend_flags"
category = "data-table"
type = "int[6]"
value_domain = "{0,1}"
usage = "When nonzero, BTL applies gfx-draw-color mode 1 (SRCALPHA/ONE additive glow) to the materialized battle-effect surface. The flag is populated on all 186 movie effects and the sole green-colorkey sprite-sheet effect."
source = "investigation"
confidence = "high"
depends_on = ["0x155b56"]
[[global]]
address = "0x155b68"
name = "battle_effect_widths"
category = "data-table"
type = "int[6]"
value_domain = "surface width in pixels; shipped values 208..600"
usage = "Width of the destination surface BTL creates for each materialized battle effect. It also participates in centering the surface before applying battle_effect_offset_x_pixels."
source = "investigation"
confidence = "high"
depends_on = ["0x155b6e", "0x155b92"]
[[global]]
address = "0x155b6e"
name = "battle_effect_heights"
category = "data-table"
type = "int[6]"
value_domain = "surface height in pixels; shipped values 208..400"
usage = "Height of the destination surface BTL creates for each materialized battle effect. It also participates in centering the surface before applying battle_effect_offset_y_pixels."
source = "investigation"
confidence = "high"
depends_on = ["0x155b68", "0x155b98"]
[[global]]
address = "0x155b74"
name = "battle_effect_atlas_column_counts"
category = "data-table"
type = "int[6]"
value_domain = "4..7; zero for movie effects"
usage = "Sprite-sheet column count passed by BTL to animate-gfx-srcrect-target. The sixteen sprite-sheet definitions pair it with battle_effect_atlas_frame_counts and a finite duration."
source = "investigation"
confidence = "high"
depends_on = ["0x155b5c", "0x155b80", "0x155b86"]
[[global]]
address = "0x155b7a"
name = "battle_effect_atlas_row_counts"
category = "data-table"
type = "int[6]"
value_domain = "2..5; zero for movie effects"
usage = "Authored sprite-sheet row count. It agrees with ceil(frame_count / column_count) for all sixteen sprite effects, but BTL never reads this array and instead passes the already-authored frame count and column count to animate-gfx-srcrect-target."
source = "investigation"
confidence = "high"
depends_on = ["0x155b74", "0x155b80"]
[[global]]
address = "0x155b80"
name = "battle_effect_atlas_frame_counts"
category = "data-table"
type = "int[6]"
value_domain = "10..28; zero for movie effects"
usage = "Total sprite-sheet frame count passed by BTL to animate-gfx-srcrect-target. Shipped values equal atlas columns times authored rows."
source = "investigation"
confidence = "high"
depends_on = ["0x155b74", "0x155b7a", "0x155b86"]
[[global]]
address = "0x155b86"
name = "battle_effect_durations_ms"
category = "data-table"
type = "int[6]"
value_domain = "333..934 for authored sprite effects; movie duration is queried into the same work cell"
usage = "Per-effect playback duration. BTANINIT authors it for sixteen sprite-sheet effects; for movie effects BTL overwrites the slot with query-surface-stop-time-ms. BTL uses start delay plus this duration when extending the animation timeline."
source = "investigation"
confidence = "high"
depends_on = ["0x153ffe", "0x155b5c"]
[[global]]
address = "0x155b8c"
name = "battle_effect_combatant_anchor_flags"
category = "data-table"
type = "int[6]"
value_domain = "{0,1}"
usage = "When nonzero, BTL anchors effect slots 0 and 1 to the actor-side combatant and slots 2 through 5 to the target-side combatant. Zero uses the battlefield center."
source = "investigation"
confidence = "high"
depends_on = ["0x155b92", "0x155b98"]
[[global]]
address = "0x155b92"
name = "battle_effect_offset_x_pixels"
category = "data-table"
type = "int[6]"
value_domain = "0, 35, or 54 pixels"
usage = "Horizontal offset added after BTL centers the effect surface on its selected combatant or the battlefield."
source = "investigation"
confidence = "high"
depends_on = ["0x155b68", "0x155b8c"]
[[global]]
address = "0x155b98"
name = "battle_effect_offset_y_pixels"
category = "data-table"
type = "int[6]"
value_domain = "0, 77, 80, or 100 pixels"
usage = "Vertical offset added after BTL centers the effect surface on its selected combatant or the battlefield."
source = "investigation"
confidence = "high"
depends_on = ["0x155b6e", "0x155b8c"]
[[global]]
address = "0x155b9e"
name = "battle_effect_sound_asset_ids"
category = "data-table"
type = "int[6]"
value_domain = "SYS4INI WAV resource id; zero means no sound"
usage = "Optional WAV loaded by BTL for a materialized effect slot. BTL schedules playback at the animation row's effect start delay plus battle_effect_sound_delays_ms. All 199 populated ids resolve through SYS4INI."
source = "investigation"
confidence = "high"
depends_on = ["0x153ffe", "0x155ba4"]
[[global]]
address = "0x155ba4"
name = "battle_effect_sound_delays_ms"
category = "data-table"
type = "int[6]"
value_domain = "0..600 milliseconds"
usage = "Effect-local sound delay added to battle_animation_effect_start_delays_ms before BTL schedules the loaded WAV channel."
source = "investigation"
confidence = "high"
depends_on = ["0x153ffe", "0x155b9e"]
[[global]]
address = "0x155baa"
name = "battle_effect_hit_pulse_offsets_ms"
category = "data-table"
type = "int[6][3]"
columns = { "0" = "pulse_1", "1" = "pulse_2", "2" = "pulse_3" }
value_domain = "positive effect-local milliseconds; zero means no pulse"
usage = "Up to three BTL hit-feedback pulse offsets per materialized effect slot. BTL adds the animation row's effect start delay, fires each pulse within a 100 ms window, and tracks it once per slot/column. Shipped BTANINIT populates only pulse_1, at 100 ms, on 26 effects."
source = "investigation"
confidence = "high"
depends_on = ["0x153ffe"]
[[global]]
address = "0x4379"
name = "card_definition_result_messages"
category = "string-table"
type = "string[100]"
value_domain = "CDINIT2 result text by one-based card id"
usage = "Short player-facing result text paired with card_definition_names. FIELD displays the selected card's row after applying its CDINIT2 effect."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8"]
[[global]]
address = "0x1519f8"
name = "current_card_id"
category = "index-pointer"
type = "int"
value_domain = "CDINIT2 card id 1..81"
usage = "FIELD's selected card-definition row. Card generation copies a surviving CDINIT card id here, uses it to test CDINIT2 story-flag gates, retains it through weighted selection, and indexes the chosen card's effects, graphics, name, and result text."
source = "investigation"
confidence = "high"
depends_on = ["0x4315", "0x4379", "0x1525b2"]
[[global]]
address = "0x151a5d"
name = "card_definition_required_story_flag_ids"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "required_flag_1", "1" = "required_flag_2", "2" = "engine_dead_required_flag_3" }
value_domain = "story flag id; zero means no requirement"
usage = "CDINIT2 card eligibility rows. FIELD checks only columns 0 and 1 before admitting a card to weighted selection. CDINIT2 nevertheless authors column 2 for eighteen cards; those third requirements are engine-dead in the shipped FIELD loop and are retained separately by the extractor."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8", "0x6d3"]
[[global]]
address = "0x151b89"
name = "card_definition_forbidden_story_flag_ids"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "forbidden_flag_1", "1" = "forbidden_flag_2", "2" = "reserved_forbidden_flag_3" }
value_domain = "story flag id; zero means no exclusion"
usage = "CDINIT2 card exclusion rows. FIELD checks columns 0 and 1 and rejects a card when either populated flag is set; the shipped definitions populate only column 0."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8", "0x6d3"]
[[global]]
address = "0x152485"
name = "current_card_generation_list_id"
category = "index-pointer"
type = "int"
value_domain = "one of {1, 11, 31, 41, 55, 61, 71, 94, 160}"
usage = "Selector consumed by CDINIT. FIELD loads it from the current STINIT type-28 card object's payload before rebuilding the parallel card-id and weight-schedule buffers; selectors 55 and 94 are authored but have no shipped STINIT object reference."
source = "investigation"
confidence = "high"
depends_on = ["0xe73bb"]
[[global]]
address = "0xe73bb"
name = "stage_object_primary_payload"
category = "data-table"
type = "int[50]"
value_domain = "object-type-tagged payload"
usage = "STINIT's primary per-object payload array. FIELD interprets it by the parallel object type: initial faction for Magic Pillars, teleport destination X, item id, card-generation list id for type 28, non-triggering faction for hazards/barriers, or initial object state for the consumer-proven stateful types."
source = "investigation"
confidence = "high"
depends_on = []
[[global]]
address = "0x152486"
name = "card_generation_weight_schedules"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "base_weight", "1" = "growth_interval_turns", "2" = "growth_weight" }
value_domain = "nonnegative weighted-selection parameters"
usage = "CDINIT's selector-specific candidate weights, parallel to card_generation_card_ids. FIELD computes base_weight + floor(current_stage_turn / growth_interval_turns) * growth_weight, with a zero interval selecting the fixed base path. The shipped lists populate 11..75 one-based slots."
source = "investigation"
confidence = "high"
depends_on = ["0x152485", "0x1525b2", "0x204f4"]
[[global]]
address = "0x1525b2"
name = "card_generation_card_ids"
category = "data-table"
type = "int[100]"
value_domain = "CDINIT2 card id; zero means empty candidate slot"
usage = "Card ids parallel to card_generation_weight_schedules. FIELD scans slots 0..99, filters each nonzero id through the CDINIT2 story-flag rows, and performs cumulative weighted random selection. CDINIT clears only the first 50 slots even though its largest authored list reaches slot 75."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8", "0x152485", "0x152486"]
[[global]]
address = "0x4dfbb"
name = "stage_card_spendable_point_bonus"
category = "counter"
type = "int"
value_domain = "nonnegative accumulated point bonus for the active stage"
usage = "FIELD clears this on stage entry and adds CDINIT2 type-3 card bonuses. STAGECLEAR adds the accumulated amount to its computed stage award before increasing shared_spendable_points."
source = "investigation"
confidence = "high"
depends_on = ["0x151d7d", "0x671b"]
[[global]]
address = "0x1519f9"
name = "card_definition_type_ids"
category = "data-table"
type = "int[100]"
value_domain = "1=story event, 2=item award, 3=stage-clear point bonus, 4=recovery, 5=trap, 6=random warp"
usage = "CDINIT2 behavior class by card id. FIELD applies the common populated effect arrays, uses type 6 for the random valid-tile warp path, and uses type 1 to dispatch the card's event after showing its result."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8"]
[[global]]
address = "0x151cb5"
name = "card_definition_awarded_item_ids"
category = "data-table"
type = "int[100]"
value_domain = "ITINIT item id; zero means no item award"
usage = "Optional item granted by FIELD through ADDITEM after card selection. All 24 populated ids resolve through ITINIT."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8", "0x8c877"]
[[global]]
address = "0x151d19"
name = "card_definition_event_story_flag_ids"
category = "data-table"
type = "int[100]"
value_domain = "story flag / SCINIT decision id; zero means no event"
usage = "Event dispatched for type-1 cards after FIELD displays the card result. All 40 populated ids resolve through SCINIT."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8", "0x62ccf"]
[[global]]
address = "0x151d7d"
name = "card_definition_stage_clear_point_bonuses"
category = "data-table"
type = "int[100]"
value_domain = "nonnegative shared-spendable-point bonus"
usage = "Type-3 card reward accumulated into stage_card_spendable_point_bonus. STAGECLEAR adds it to the normal performance-adjusted award before updating shared_spendable_points; shipped small/medium/large values are 5, 10, and 15."
source = "investigation"
confidence = "high"
depends_on = ["0x4dfbb", "0x671b"]
[[global]]
address = "0x151de1"
name = "card_definition_minimum_resource_recovery"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "hp", "1" = "sp", "2" = "fs" }
value_domain = "nonnegative minimum HP/SP/FS recovery"
usage = "Lower bounds for type-4 HP/SP/FS card recovery. FIELD starts each resource delta at this value and, when the paired upper bound is larger, adds a random value below their difference."
source = "investigation"
confidence = "high"
depends_on = ["0x151f0d"]
[[global]]
address = "0x151f0d"
name = "card_definition_maximum_resource_recovery"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "hp", "1" = "sp", "2" = "fs" }
value_domain = "exclusive upper HP/SP/FS recovery bound when greater than the minimum"
usage = "Upper bounds paired with card_definition_minimum_resource_recovery. Equal bounds produce the fixed minimum; larger bounds produce a uniformly selected value from minimum through upper-bound-minus-one."
source = "investigation"
confidence = "high"
depends_on = ["0x151de1"]
[[global]]
address = "0x152039"
name = "card_definition_minimum_spirit_recovery"
category = "data-table"
type = "int[100]"
value_domain = "nonnegative minimum familiar spirit recovery"
usage = "Lower bound for type-4 familiar-spirit recovery. FIELD selects the value with the same minimum/exclusive-upper algorithm as HP/SP/FS and clamps current_spirit to maximum_spirit."
source = "investigation"
confidence = "high"
depends_on = ["0x15209d", "0x20530", "0x20534"]
[[global]]
address = "0x15209d"
name = "card_definition_maximum_spirit_recovery"
category = "data-table"
type = "int[100]"
value_domain = "exclusive upper spirit-recovery bound when greater than the minimum"
usage = "Upper bound paired with card_definition_minimum_spirit_recovery. Equal bounds produce the fixed minimum; larger bounds exclude this upper value."
source = "investigation"
confidence = "high"
depends_on = ["0x152039"]
[[global]]
address = "0x152101"
name = "card_definition_minimum_resource_damage"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "hp", "1" = "sp", "2" = "fs" }
value_domain = "nonnegative minimum HP/SP/FS loss"
usage = "Lower bounds for type-5 trap damage. FIELD subtracts these randomized HP/SP/FS amounts from the active entity through the same resource-delta path used for recovery."
source = "investigation"
confidence = "high"
depends_on = ["0x15222d"]
[[global]]
address = "0x15222d"
name = "card_definition_maximum_resource_damage"
category = "data-table"
type = "int[100][3]"
columns = { "0" = "hp", "1" = "sp", "2" = "fs" }
value_domain = "exclusive upper HP/SP/FS damage bound when greater than the minimum"
usage = "Upper bounds paired with card_definition_minimum_resource_damage. Equal bounds produce fixed damage; larger bounds exclude this upper value."
source = "investigation"
confidence = "high"
depends_on = ["0x152101"]
[[global]]
address = "0x152359"
name = "card_definition_condition_ids"
category = "data-table"
type = "int[100]"
value_domain = "ILINIT condition id; zero means no condition"
usage = "Condition applied by type-5 trap cards through ADDILL. The three populated rows resolve to paralysis, poison, and water_flow."
source = "investigation"
confidence = "high"
depends_on = ["0x1523bd"]
[[global]]
address = "0x1523bd"
name = "card_definition_condition_levels"
category = "data-table"
type = "int[100]"
value_domain = "ILINIT condition level; zero means no condition"
usage = "Condition level paired with card_definition_condition_ids and passed to ADDILL. All three shipped condition traps use level 1."
source = "investigation"
confidence = "high"
depends_on = ["0x152359"]
[[global]]
address = "0x152421"
name = "card_definition_visual_asset_ids"
category = "data-table"
type = "int[100]"
value_domain = "SYS4INI AGF resource id"
usage = "Card-result visual selected by FIELD before applying and presenting the effect. All 81 authored rows resolve to MVS*.AGF assets, with related card families sharing artwork."
source = "investigation"
confidence = "high"
depends_on = ["0x1519f8"]