data/claims/ff6-tables.yamlFinal Fantasy VI's data tables (everything8215's ff6 disassembly)
Game: Final Fantasy VI.
Every one of the 384 monster slots, from the Guard (no. 0) to no. 383, which the disassembly calls COLOSSEUM, has 32 bytes of stats: speed, battle power, hit rate, evade, magic block, defense, magic defense, magic power, HP, MP, experience, gil, level, its Metamorph set and rate, three flag bytes (undead, human, dies at 0 MP, harder to run from, can't be suplexed, can't escape, can't be controlled, the retaliations such as Runic and the Piranha's, and so on), its immunities, the elements it absorbs, nullifies, and is weak to, its attack animation, the statuses it starts the battle with, and its special attack. HP runs from 1 to 63001 (Kefka), level up to 99 (Pugs), and experience up to 14396 (Brachosaur); 13 slots have no name in the ROM. ff6-tables/monsters
src/data/monster_prop.asm#L12-L8991MonsterProp:
; ------------------------------------------------------------------------------
; cf/37c0
.segment "monster_special_anim"
MonsterSpecialAnim:
; ------------------------------------------------------------------------------
; 0: GUARD
…Final Fantasy VI Disassembly · src/data/monster_prop.mac#L42-L75.mac end_monster_prop
.segment "monster_prop"
.byte _monster_prop_speed
.byte _monster_prop_attack_power
.byte _monster_prop_hit_rate
.byte _monster_prop_evade
.byte _monster_prop_mblock
.byte _monster_prop_defense
.byte _monster_prop_mag_def
.byte _monster_prop_mag_pwr
.word _monster_prop_hp
.word _monster_prop_mp
…Final Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/init_2.asm#L66-L77 lda f:MonsterProp+5,x ; defense/magic defense
sta near wTargetProp2::Defense,y
lda f:MonsterProp+12,x ; experience points
sta near wTargetProp2::MonsterExp,y
lda f:MonsterProp+14,x ; gold
sta near wTargetProp2::MonsterGil,y
lda near w7e3a47 - 1
bmi @2ce4 ; branch if monsters get returned to full hp/mp ($3a47.7)
lda f:MonsterProp+10,x ; mp
sta near wTargetProp2::CurrMP,y
sta near wTargetProp2::MaxMP,y
lda f:MonsterProp+8,x ; hpFinal Fantasy VI Disassembly · src/common/const.inc#L2068-L2099.enum MONSTER_FLAG
DIE_AT_0_MP = %00000001
; = %00000010
HIDE_NAME = %00000100
; = %00001000
HUMAN = %00010000
; = %00100000
IMP_DMG_BONUS = %01000000
UNDEAD = %10000000
.endenum
.enum RETAL_FLAGS
…Final Fantasy VI Disassembly · src/battle/init_2.asm#L221-L223 lda f:MonsterProp+27,x ; status 1 & 2
sta near wTargetProp2::w7e3dd4,y
lda f:MonsterProp+29,x ; status 3 & 4Checked by claude, 2026-10-28 — parsed every monster_prop block at the pinned commit (a keyword left out takes the macro's default: hit rate 100, everything else 0) and compared speed through level, HP, MP, experience, gil, and the Metamorph byte with the ROM's 32 bytes per monster at $CF:0000Revised after a check by a second AI model, 2026-10-28.Names are the ROM's own text; the disassembly's identifier for each slot is in its own column. Status, element, and flag columns list the disassembly's constant names. A monster's special attack's animation is stored apart, a byte per monster at $CF:37C0.
Each of the 384 monster slots has four item bytes: a rare and a common item to steal and a rare and a common item to drop. 246 slots have a rare steal, 167 a common one, 169 a rare drop, and 53 a common drop. When a defeated monster (Wound, Petrify, or Zombie) drops an item, a random byte under $20 picks the rare drop and any other the common one (the disassembly's comment calls it a 1/8 chance). ff6-tables/steals-drops
src/data/monster_items.asm#L21-L2330MonsterItems:
; ------------------------------------------------------------------------------
; 0: guard
monster_steal POTION, TONIC
monster_drop TONIC, EMPTY
; ------------------------------------------------------------------------------
; 1: soldier
monster_steal TONIC, POTION
…Final Fantasy VI Disassembly · src/data/monster_items.asm#L5-L8; $00: rare steal
; $01: common steal
; $02: rare drop
; $03: common dropFinal Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/win.asm#L208-L223@5f17: lda near wTargetProp3::_4::w7e3ee4,y ; status 1
bitflg STATUS1, {DEAD, PETRIFY, ZOMBIE}
beq @5f4e ; skip if not wound, petrify, or zombie
jsr Rand
cmp #$20 ; 1/8 chance to get rare item
longai
clr_a
ror
adc near w7e2001,y ; monster index
asl
rol
tax
…Our readingif the monster has Wound, Petrify, or Zombie:208–210 roll a random byte; carry set when it's $20 or more211–212 index = monster × 4 + carry213–219 take the item at index + 2 (rare drop, or common drop when carry was set)220 no item when it is $FF221–223Final Fantasy VI Disassembly · src/battle/init_2.asm#L19-L19lda f:MonsterItems,x ; items stolenChecked by claude, 2026-10-28 — parsed every monster_steal and monster_drop line at the pinned commit, matched each item id against the ROM's 1,536 bytes at $CF:3000, and read the drop roll in WinBattleRevised after a check by a second AI model, 2026-10-28.An empty slot is item $FF, shown blank. Names are the ROM's own text, without the icon the item names begin with.
The item table has 256 entries of 30 bytes: the empty slot (the last, typed as a weapon) and 90 weapons, 15 shields, 27 helmets, 31 armors, 8 tools, 29 consumables, 55 relics. Each gives who can equip it, its power (attack, defense, or a consumable's effect), hit rate (a weapon) or magic defense (armor), stat bonuses, evade and magic block, the element a weapon strikes with or armor halves, the elements it absorbs, nullifies, and is weak to (except consumables), the spell it teaches and how fast, the spell a weapon or shield casts, and its price. 9 items teach a spell. Prices run up to 20000 (Bone Club); 97 items are priced at 2 gil. ff6-tables/items
src/data/item_prop.asm#L10-L3129ItemProp:
; ------------------------------------------------------------------------------
; 0: DIRK
item_prop DIRK, WEAPON
usage THROW
equip {TERRA, LOCKE, SHADOW, EDGAR, CELES, STRAGO, RELM, SETZER, MOG, GOGO}, MERIT
targeting {MANUAL, INIT_SINGLE, ENEMY}
weapon_flags {TWO_HAND, RUNIC}
attack_power 26
hit_rate 180
…Final Fantasy VI Disassembly · src/data/item_prop.asm#L3119-L3129; 255: EMPTY
item_prop EMPTY, WEAPON
equip {TERRA, LOCKE, CYAN, SHADOW, EDGAR, SABIN, CELES, STRAGO}
targeting {MANUAL, INIT_SINGLE, ENEMY}
attack_power 10
hit_rate 200
elem_absorb ALL
elem_weak ALL
equip_status {CONDEMNED, NEAR_FATAL, IMAGE, SILENCE, BERSERK, CONFUSE, SAP, SLEEP}
price 0
end_item_propFinal Fantasy VI Disassembly · src/data/item_prop.mac#L82-L99.mac elem_attack val
make_bitmask {_item_prop_elem_attack .set }, 0, ELEMENT, val
.endmac
.mac elem_half val
make_bitmask {_item_prop_elem_attack .set }, 0, ELEMENT, val
.endmac
.mac elem_absorb val
make_bitmask {_item_prop_elem_absorb .set }, 0, ELEMENT, val
.endmac
…Final Fantasy VI Disassembly · src/data/item_prop.mac#L240-L277.mac end_item_prop
.byte _item_prop_type | _item_prop_usage
.word _item_prop_equip_chars | _item_prop_equip_flags
.byte _item_prop_spell_rate, _item_prop_spell_learned
.byte _item_prop_field_effect
.word _item_prop_immune_status
.byte >_item_prop_equip_status
.byte _item_prop_relic_effect1
.byte _item_prop_relic_effect2
.byte _item_prop_relic_effect3
.byte _item_prop_relic_effect4
.byte _item_prop_relic_effect5
…Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f567-0x26f6e0 — MagicName: the spells' names, for the spells items teach and cast, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/menu/item.asm#L1008-L1016GetItemPropPtr:
@8321: pha
@8322: lda hHVBJOY ; wait for hblank
and #$40
beq @8322
pla
sta hM7A
stz hM7A
lda #30 ; multiply by 30Checked by claude, 2026-10-28 — parsed every item_prop block at the pinned commit, English side of its conditionals, and compared each item's price, power, hit rate or magic defense (one byte), learn rate, and four stat nibbles with the ROM's 30 bytes per item at $D8:5000Revised after a check by a second AI model, 2026-10-28.Stat bonuses, evade, and magic block are the values the source writes; the ROM stores them as nibbles (a negative stat bonus as 8 + its size, evade and magic block in tens). Names are the ROM's own text without their icons. On the English side the Atma Weapon's equip line drops the MERIT flag the Japanese side gives it (item_prop.asm L456-L460).
The attack table has 256 entries of 14 bytes: targeting, element, flags, MP cost, power, a byte of two more flags (the source's status_block and show_msg), hit rate, a special effect, and the statuses it sets or clears. Rows 0–53 are the magic spells, 54–80 the espers, and the rest the characters' skills and the monsters' attacks. MP costs run up to 110 (Phoenix). ff6-tables/spells
src/data/magic_prop.asm#L10-L2801MagicProp:
; ------------------------------------------------------------------------------
; 0: FIRE
magic_prop FIRE
targetting {MANUAL, INIT_SINGLE, MULTI_TARGET, ENEMY}
element FIRE
flags {RUNIC, AUTO_RETARGET}
mp_cost 4
spell_power 21
hit_rate 150
…Final Fantasy VI Disassembly · src/data/magic_prop.mac#L47-L75.mac status_block
_magic_prop_misc_flags .set _magic_prop_misc_flags | 1
.endmac
.mac show_msg
_magic_prop_misc_flags .set _magic_prop_misc_flags | 2
.endmac
.mac special_effect val
_magic_prop_special_effect .set ATTACK_SPECIAL_EFFECT::val
.endmac
…Final Fantasy III (USA) (Rev 1) · 0x26f567-0x26f6e0 — MagicName: the spells' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f6e1-0x26f7b8 — GenjuName: the espers' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the other attacks' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0xf3c40-0xf3cff — BushidoName: the SwdTechs' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/attack.asm#L918-L918lda f:MagicProp,x ; spell dataChecked by claude, 2026-10-28 — parsed every magic_prop block at the pinned commit, English side of its conditionals, and compared each entry's MP cost, power, and hit rate with the ROM's 14 bytes per entry at $C4:6AC0; names are the three name tables in orderRevised after a check by a second AI model, 2026-10-28.SwdTechs (DISPATCH to CLEAVE) are named from the SwdTech name table; the attack name table's slots for them are blank but for the first, which reads "Joker Doom". The English side marks two entries' status34 with HIDE where the Japanese side doesn't (magic_prop.asm L563 and L577). Status, element, targeting, and flag columns list the disassembly's constant names.
Each of the 27 espers has 11 bytes: up to five spells, each with a learning rate, and the bonus a character gets on leveling up with it equipped. They teach 92 spell entries in all, at rates from 1 to 25; 9 espers give no level-up bonus (the byte $FF, which the level-up code skips). ff6-tables/espers
src/data/genju_prop.asm#L12-L232GenjuProp:
; ------------------------------------------------------------------------------
; 0: ramuh
genju_prop RAMUH
genju_spell THUNDER, 10
genju_spell THUNDARA, 2
genju_spell POISON, 5
genju_bonus STAMINA_1
end_genju_prop
…Final Fantasy VI Disassembly · src/data/genju_prop.mac#L32-L40.mac end_genju_prop
.byte _genju_prop_rate1, _genju_prop_spell1
.byte _genju_prop_rate2, _genju_prop_spell2
.byte _genju_prop_rate3, _genju_prop_spell3
.byte _genju_prop_rate4, _genju_prop_spell4
.byte _genju_prop_rate5, _genju_prop_spell5
.byte _genju_prop_bonus
_genju_prop_seq .set _genju_prop_seq + 1
.endmacFinal Fantasy III (USA) (Rev 1) · 0x26f6e1-0x26f7b8 — GenjuName: the espers' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f567-0x26f6e0 — MagicName: the spells' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0xffeae-0xfff9d — GenjuBonusName: the level-up bonuses' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/win.asm#L380-L389@6031: clr_a
lda f:GenjuProp+1,x ; spell taught by esper
cmp #$ff
beq @6044
phy
tay
lda f:GenjuProp,x ; spell learn rate
jsr IncLearnMagic
ply
@6044: inx2Final Fantasy VI Disassembly · src/battle/win.asm#L490-L498 lda $161e,x ; equipped esper
bmi @60f6 ; branch if no esper equipped
phy
phx
txy
jsr GetGenjuPropPtr
clr_a
lda f:GenjuProp+10,x ; esper level up bonus
bmi @60f4 ; branch if no bonusFinal Fantasy VI Disassembly · src/data/genju_prop.mac#L19-L19_genju_prop_bonus .set GENJU_BONUS::NONEFinal Fantasy VI Disassembly · src/common/const.inc#L993-L993NONE = $ffChecked by claude, 2026-10-28 — parsed every genju_prop block at the pinned commit and compared the five rate and spell pairs and the bonus byte with the ROM's 11 bytes per esper at $D8:6E00Revised after a check by a second AI model, 2026-10-28.The bonus names are the ROM's own text, misspelling included ("Strengh").
Three tables give, for each of levels 2 to 99, the experience from the level before (stored divided by 8) and the HP and MP a character gains on reaching it. The experience to reach a level is 8 times the sum of the entries up to it: 32 for level 2, 2637112 for level 99 (computed). HP gains peak at 162 (level 70) and fall to 80 (level 96) before rising again; MP gains run from 4 to 17. ff6-tables/level-ups
src/data/level_up.asm#L11-L21LevelUpExp:
.word 4,8,14,24,34,48,62,79 ; 2-9
.word 99,120,143,169,195,224,257,289,323,360 ; 10-19
.word 402,441,484,528,575,627,674,728,785,842 ; 20-29
…Final Fantasy VI Disassembly · src/data/level_up.asm#L28-L38LevelUpHP:
.byte 11,12,14,17,20,22,24,26 ; 2-9
.byte 27,28,30,35,39,44,50,54,57,61 ; 10-19
.byte 65,67,69,72,76,79,82,86,90,95 ; 20-29
…Final Fantasy VI Disassembly · src/data/level_up.asm#L45-L69LevelUpMP:
.if LANG_EN
.byte 4,4,5,5,6,6,7,8 ; 2-9
.byte 8,9,9,10,10,10,10,10,11,11 ; 10-19
…Final Fantasy VI Disassembly · src/battle/win.asm#L425-L449
CheckLevelUp:
@606d: stz $f8 ; $f8 is the high byte of the calculated experience
clr_a
lda $1608,x ; level
cmp #MAX_LEVEL
bcs _606c ; return if >= 99
longa
asl
phx
tax
clr_a
…Final Fantasy VI Disassembly · src/battle/win.asm#L476-L497DoLevelUp:
@60c2: php
inc $1608,x ; increment level
stz $fd ; clear high byte of hp/mp increase
stz $ff
phx
clr_a
lda $1608,x ; level
tax
lda f:LevelUpMP-2,x ; character mp progression data
sta $fe
lda f:LevelUpHP-2,x ; character hp progression data
…Checked by claude, 2026-10-28 — summed the pinned LevelUpExp words as CheckLevelUp does (times 8), and compared all three tables, English side, with the ROM at $ED:8220, $E6:F4A0, and $E6:F502Revised after a check by a second AI model, 2026-10-28.The MP table differs between the versions: the English side's gains are not the Japanese side's (level_up.asm L47-L69). The HP and MP gains here are before an esper's level-up bonus (espers).
The world maps' battle rates are a byte for each of the 8 × 8 sectors (32 × 32 tiles each) of the World of Balance and then the World of Ruin, two bits for each ground type (grass, forest, desert, dirt): normal, low, high, or no battles. Every sector is normal except 7 in the World of Balance; the World of Ruin's are all normal. Only the sector around Narshe gives its ground types different rates. ff6-tables/world-battle-rates
src/data/world_battle_rate.asm#L40-L76; 128 bytes total
; WoB then WoR, 8x8 sectors per world, sectors are 32x32 tiles each
; 1 byte per sector, 2 bits per battle bg
; grass, forest, desert, dirt, where grass is the highest 2 bits
; The only sector which uses different rates for each battle bg is near
; Narshe in the world of balance which has a low rate everywhere except in
; forests. Also, most of the sectors which don't have a normal rate don't
; seem to make much sense based on the final version of the map. It seems
; likely that the world map was adjusted somewhat prior to release but this
; table was not updated to match.
…Final Fantasy VI Disassembly · src/field/battle.asm#L154-L160 lda f:WorldBattleRate,x ; world battle rate for this sector
ldy $22
beq :+
Loop: lsr2
dey
bne Loop
: and #$03Checked by claude, 2026-10-28 — rebuilt the 128 bytes from the pinned world_battle_rate lines (both bitlists) and matched them with the ROM at $CF:5800Checked by a second AI model, 2026-10-28.The areas are the disassembly's descriptions in our words; it says most of these sectors don't fit the final world map, as if the map moved after the table was made. The step rates for normal, low, and high are in encounter-rate; which sector a step reads is subject to world-map-sector-bug.
Town and dungeon maps' battle rates are two bits for each of 512 maps (normal, low, high, or a fourth rate above high), 128 bytes. All are normal except 9: 8 low and 1 high; no map uses the fourth rate. ff6-tables/sub-battle-rates
src/data/sub_battle_rate.asm#L18-L39; 128 bytes total
; 2 bits per sub-map (lower map ids in lower bits)
; 0: normal
; 1: low
; 2: high
; 3: very high (never used)
; all maps have normal battle rate except those listed below
; cf/5880
SubBattleRate:
bitlist 1024
…Final Fantasy VI Disassembly · src/field/battle.asm#L359-L368 stx $078c
lda a:$0082 ; map index
and #$03
tay
longa
lda a:$0082
lsr2
tax
shorta0
lda f:SubBattleRate,x ; probability data (2 bits per map)Checked by claude, 2026-10-28 — rebuilt the 128 bytes from the pinned sub_battle_rate lines and matched them with the ROM at $CF:5880Checked by a second AI model, 2026-10-28.The places are the disassembly's comments in our words. The step rates are in encounter-rate.
The shop table has 128 entries of 9 bytes: the shop's kind and price rule, then up to 8 items. 87 shops stock something (up to 8 items) and 41 are empty; the 10 with a price rule, in Figaro Castle and South Figaro, all use the one that halves prices when the character shown on the map is Edgar, and the table's other rules (+50%, +100%, half, and half or +50% by the shown character's sex) go unused. ff6-tables/shops
src/data/shop_prop.asm#L8-L1325ShopProp:
; ------------------------------------------------------------------------------
; 0: NARSHE_WEAPONS_1
shop_prop NARSHE_WEAPONS_1, WEAPON
shop_item REGAL_CUTLASS
shop_item MITHRIL_CLAW
shop_item KOTETSU
shop_item MITHRIL_PIKE
shop_item AIR_LANCET
shop_item FLAIL
…Final Fantasy VI Disassembly · src/data/shop_prop.mac#L6-L40.mac end_shop_prop
.byte _shop_prop_type | _shop_prop_price_mod << 3
.byte _shop_prop_item1
.byte _shop_prop_item2
.byte _shop_prop_item3
.byte _shop_prop_item4
.byte _shop_prop_item5
.byte _shop_prop_item6
.byte _shop_prop_item7
.byte _shop_prop_item8
_shop_prop_seq .set _shop_prop_seq + 1Final Fantasy VI Disassembly · src/menu/shop.asm#L1007-L1020
; -50% edgar
array_label ADJUST_SHOP_PRICE, SHOP_PRICE_MOD::HALF_FOR_EDGAR
@ba92: pha
shorta
lda r0202
cmp #MAP_SPRITE_GFX::EDGAR
beq @baa0
longa
pla
rts
@baa0: longa
…Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/menu/shop.asm#L829-L829lda f:ShopProp,x ; item idChecked by claude, 2026-10-28 — parsed every shop_prop block at the pinned commit and matched each shop's kind, price rule, and 8 item bytes with the ROM's 9 bytes per shop at $C4:7AC0Checked by a second AI model, 2026-10-28.Shops are named by the disassembly's identifiers, which say the town and kind. The Edgar rule compares the map sprite's graphics with Edgar's (ADJUST_SHOP_PRICE in shop.asm); the other rules' wording here is the disassembly's comments on SHOP_PRICE_MOD (const.inc L2350-L2360).
Terra and Celes each learn 16 spells on their own at set levels, two bytes a spell (the spell and the level): Terra from Cure at level 1 to Ultima at 99, Celes from Ice at 1 to Meteor at 98. Celes's list puts Muddle (level 32) after Bserk (level 40); see natural-magic-celes-order. ff6-tables/natural-magic
src/data/natural_magic.asm#L12-L52NaturalMagic:
; ------------------------------------------------------------------------------
; terra
.byte ATTACK::CURE, 1
…Final Fantasy III (USA) (Rev 1) · 0x26f567-0x26f6e0 — MagicName: the spells' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x478c0-0x47a3f — CharName: the characters' default names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/win.asm#L693-L708; learn spell
@61fc: phy
xba ; A: level
ldy #$0010 ; 16 spells for each character
@6201: cmp f:NaturalMagic+1,x ; natural magic data (level)
bne @621b
pha
phy
clr_a
lda f:NaturalMagic,x ; natural magic data (spell)
tay
lda ($f4),y
…Final Fantasy VI Disassembly · src/field/event.asm#L1134-L1137 cmp #CHAR::TERRA
beq UpdateTerra
cmp #CHAR::CELES
beq UpdateCelesFinal Fantasy VI Disassembly · src/field/event.asm#L1145-L1147UpdateTerra:
ldx $00
Loop1: lda f:NaturalMagic+1,x ; level that the spell is learnedFinal Fantasy VI Disassembly · src/field/event.asm#L1163-L1165UpdateCeles:
ldx $00
Loop2: lda f:NaturalMagic+$21,x ; level that the spell is learnedFinal Fantasy VI Disassembly · src/data/natural_magic.asm#L36-L37; celes
.byte ATTACK::BLIZZARD, 1Celes's natural-magic list puts Muddle (level 32) after Bserk (level 40). The field's natural-magic update walks her list in order and stops at the first spell above her level, so when it runs while she is level 32 to 39 it teaches Haste (level 32) but not Muddle, which it gives only once it runs at level 40 or above. The update runs when an event sets up a character (at the party's average level plus that character's level modifier), when an event raises a character to the party's average level, and after a saved game is reloaded. The battle level-up check compares every row with the new level, so reaching level 32 in battle does teach Muddle. CodeChecked by claude, 2026-10-28 — parsed the pinned NaturalMagic lines and matched every byte with the ROM's bytes at $EC:E3C0Revised after a check by a second AI model, 2026-10-28.Cyan learns his 8 SwdTechs and Sabin his 8 Blitzes at set levels, a byte each: SwdTechs at levels 1, 6, 12, 15, 24, 34, 44, 70, Blitzes at 1, 6, 10, 15, 23, 30, 42, 70. ff6-tables/skill-levels
src/data/bushido_blitz_level.asm#L8-L12BushidoLevelTbl:
.byte 1,6,12,15,24,34,44,70
BlitzLevelTbl:
.byte 1,6,10,15,23,30,42,70Final Fantasy III (USA) (Rev 1) · 0xf3c40-0xf3cff — BushidoName: the SwdTechs' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the Blitzes' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/win.asm#L728-L728@6227: cmp f:BushidoLevelTbl,x ; blitz/swdtech learn data (level)Final Fantasy VI Disassembly · src/field/event.asm#L1138-L1141 cmp #CHAR::CYAN
beq UpdateCyan
cmp #CHAR::SABIN
jeq UpdateSabinFinal Fantasy VI Disassembly · src/field/event.asm#L1181-L1184UpdateCyan:
stz $1b
ldx $00
Loop3: lda f:BushidoLevelTbl,xFinal Fantasy VI Disassembly · src/field/event.asm#L1201-L1204UpdateSabin:
stz $1b
ldx $00
Loop4: lda f:BlitzLevelTbl,xChecked by claude, 2026-10-28 — parsed the pinned BushidoLevelTbl and BlitzLevelTbl and matched every byte with the ROM's 16 bytes at $E6:F490Revised after a check by a second AI model, 2026-10-28.Each of the 512 battle groups gives a set number of magic points on a normal victory, a byte each, from 0 to 10: 88 give 0, 187 give 1, 94 give 2, 50 give 3, 20 give 4, 27 give 5, 15 give 6, 9 give 7, 4 give 8, 1 give 9, 17 give 10. ff6-tables/magic-points
src/data/battle_magic_points.asm#L6-L38BattleMagicPoints:
.byte 0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1
.byte 1,1,1,3,1,1,1,1,0,1,0,1,1,1,1,1
.byte 1,1,2,1,1,1,1,1,0,0,0,0,0,0,0,1
.byte 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1
.byte 1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1
…Final Fantasy VI Disassembly · src/battle/win.asm#L38-L44; normal victory
@5d91: longi
clr_a
ldx near wBattleID
cpx #$0200
bcs @5da0 ; branch if >= $0200 (no magic points)
lda f:BattleMagicPoints,x ; $fb = number of magic points gained from battleChecked by claude, 2026-10-28 — parsed the pinned BattleMagicPoints bytes and matched every byte with the ROM's bytes at $DF:B400Revised after a check by a second AI model, 2026-10-28.Each of the first 256 monsters has two attacks for the Rage command, two bytes: the first is always the plain attack (BATTLE), the second set per monster, for 32 of them its special attack (SPECIAL). A random bit picks one of the two each time. ff6-tables/rage
src/data/monster_rage.asm#L16-L272MonsterRage:
monster_rage SPECIAL ; GUARD
monster_rage FIRE ; SOLDIER
monster_rage FIRA ; TEMPLAR
monster_rage WATER_EDGE ; NINJA
monster_rage LULLABY ; SAMURAI
monster_rage HOLY ; OROG
monster_rage BIO ; MAG_ROADER_1
monster_rage SHOCK ; RETAINER
monster_rage THUNDARA ; HAZER
monster_rage CURA ; DAHLING
monster_rage THUNDAGA ; RAIN_MAN
…Final Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the attacks' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/action_1.asm#L827-L858; [ rage command (random) ]
…
rol ; 1/2 chance first or second attack will be chosen
tax
shorta
lda f:MonsterRage,x ; monster rage attacksChecked by claude, 2026-10-28 — parsed the pinned monster_rage lines and matched every byte with the ROM's 2 bytes per monster at $CF:4600Revised after a check by a second AI model, 2026-10-28.Each of the 384 monster slots has two attacks the Sketch effect can make it use, two bytes. ff6-tables/sketch
src/data/monster_sketch.asm#L16-L400MonsterSketch:
monster_sketch BATTLE, BATTLE ; GUARD
monster_sketch SCAN, BATTLE ; SOLDIER
monster_sketch SPECIAL, BATTLE ; TEMPLAR
monster_sketch FIRE_SKEAN, WATER_EDGE ; NINJA
monster_sketch FLARE, DOOM ; SAMURAI
monster_sketch BIO, HOLY ; OROG
monster_sketch SPECIAL, BATTLE ; MAG_ROADER_1
monster_sketch SPECIAL, WIND_SLASH ; RETAINER
monster_sketch DRAIN, BATTLE ; HAZER
monster_sketch MUTE, CURA ; DAHLING
monster_sketch SPECIAL, THUNDAGA ; RAIN_MAN
…Final Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the attacks' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/target_effect.asm#L441-L468; [ target special effect $55: sketch ]
array_label TARGET_EFFECT, ATTACK_SPECIAL_EFFECT::SKETCH
…
cmp #$40
longai
lda near w7e2001 - 8,y
rol
tax
lda f:MonsterSketch,xChecked by claude, 2026-10-28 — parsed the pinned monster_sketch lines and matched every byte with the ROM's 2 bytes per monster at $CF:4300Revised after a check by a second AI model, 2026-10-28.Each of the 384 monster slots has four attacks, four bytes, read both when the monster is controlled ("set command for control") and when it acts confused ("choose monster confused attack"); the first is always the plain attack (BATTLE), and an unused slot is empty. ff6-tables/control
src/data/monster_control.asm#L29-L413MonsterControl:
monster_control ; GUARD
monster_control SCAN ; SOLDIER
monster_control SPECIAL ; TEMPLAR
monster_control FIRE_SKEAN, WATER_EDGE, BOLT_EDGE ; NINJA
monster_control FLARE, DOOM, HASTE2 ; SAMURAI
monster_control BIO, HOLY ; OROG
monster_control SPECIAL ; MAG_ROADER_1
monster_control SPECIAL, WIND_SLASH, CONDEMNED ; RETAINER
monster_control DRAIN, FIRE ; HAZER
monster_control MUTE, CURA ; DAHLING
monster_control SPECIAL, THUNDAGA, FLASH_RAIN ; RAIN_MAN
…Final Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the attacks' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/action_1.asm#L887-L897; [ choose monster confused attack ]
…
lda f:MonsterControl,x ; monster control/muddled attacks
sta $f0
lda f:MonsterControl+2,xFinal Fantasy VI Disassembly · src/battle/attack.asm#L884-L907; [ set command for control ]
…
lda f:MonsterControl,xChecked by claude, 2026-10-28 — parsed the pinned monster_control lines and matched every byte with the ROM's 4 bytes per monster at $CF:3D00Revised after a check by a second AI model, 2026-10-28.The Metamorph effect (target effect $12) turns a monster into an item from one of 32 sets of 4 items, 4 bytes each: the monster's set number picks the set and two random bits the item. A monster's Metamorph set and rate are in its 32 bytes (monsters). ff6-tables/metamorph
src/data/metamorph_prop.asm#L13-L45MetamorphProp:
metamorph_items ANTIDOTE, GREEN_CHERRY, EYEDROP, SOFT ; 0
metamorph_items TENT, FENIX_DOWN, WARP_STONE, REVIVIFY ; 1
metamorph_items DRIED_MEAT, DRIED_MEAT, DRIED_MEAT, DRIED_MEAT ; 2
metamorph_items REMEDY, REMEDY, REMEDY, REMEDY ; 3
metamorph_items MITHRILBLADE, MITHRIL_HELM, MITHRIL_MAIL, HEAVY_SHLD ; 4
metamorph_items GOLD_LANCE, GOLD_SHLD, GOLD_HELMET, GOLD_ARMOR ; 5
metamorph_items CRYSTAL, CRYSTAL_SHLD, CRYSTAL_HELM, CRYSTAL_MAIL ; 6
…Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/target_effect.asm#L308-L321; [ target special effect $12: metamorph ]
array_label TARGET_EFFECT, ATTACK_SPECIAL_EFFECT::METAMORPH
@3a3c: cpy #$08
bcc _3a8a
lda near wTargetProp2::MetamorphProp,y
pha
and #$1f
jsr RandCarry
rol
jsr RandCarry
rol
…Every one of the 384 monster slots, from the Guard (no. 0) to no. 383, which the disassembly calls COLOSSEUM, has 32 bytes of stats: speed, battle power, hit rate, evade, magic block, defense, magic defense, magic power, HP, MP, experience, gil, level, its Metamorph set and rate, three flag bytes (undead, human, dies at 0 MP, harder to run from, can't be suplexed, can't escape, can't be controlled, the retaliations such as Runic and the Piranha's, and so on), its immunities, the elements it absorbs, nullifies, and is weak to, its attack animation, the statuses it starts the battle with, and its special attack. HP runs from 1 to 63001 (Kefka), level up to 99 (Pugs), and experience up to 14396 (Brachosaur); 13 slots have no name in the ROM. CodeChecked by claude, 2026-10-28 — parsed the pinned metamorph_items lines and matched every byte with the ROM's 4 bytes per set at $C4:7F40Revised after a check by a second AI model, 2026-10-28.The Dance command's 8 dances each have 4 attacks, a byte each; a random roll picks which of the four a step uses, with chances of 7/16, 3/8, 1/8, and 1/16 (by the comment). ff6-tables/dances
src/data/dance_prop.asm#L37-L92DanceProp:
dance_prop WIND_SONG
dance_attack WIND_SLASH
dance_attack SUN_BATH
dance_attack PLASMA
dance_attack COKATRICE
end_dance_prop
dance_prop FOREST_SUITE
dance_attack RAGE
…Final Fantasy III (USA) (Rev 1) · 0x26ff9d-0x26fffc — DanceName: the dances' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the attacks' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/action_1.asm#L794-L817; [ dance command (random) ]
…
sta $ee
jsr Rand
ldx #$02
@05bb: cmp f:DanceRateTbl,x
bcs @05c3
inc $ee
@05c3: dex
bpl @05bb
ldx $ee
lda f:DanceProp,x ; dance dataFinal Fantasy VI Disassembly · src/battle/action_1.asm#L821-L822; dance attack probabilities (7/16, 3/8, 1/8, 1/16)
DanceRateTbl:Checked by claude, 2026-10-28 — parsed the pinned dance_prop blocks and matched every byte with the ROM's 4 bytes per dance at $CF:FE80Revised after a check by a second AI model, 2026-10-28.Sabin's 8 Blitzes each have a 12-byte code: up to 11 inputs, ending with the A button, and the count of inputs times 2. With the A press the codes run from 4 to 10 inputs. ff6-tables/blitz-codes
src/data/blitz_code.asm#L11-L102BlitzCode:
; ------------------------------------------------------------------------------
; 0: pummel
blitz_code PUMMEL
blitz_btn LEFT
blitz_btn RIGHT
blitz_btn LEFT
end_blitz_code
…Final Fantasy VI Disassembly · src/data/blitz_code.mac#L6-L9; [ blitz code data format (12 bytes each) ]
; 0-10: button inputs (including A button at the end)
; 11: number of buttons * 2Final Fantasy III (USA) (Rev 1) · 0x26f7b9-0x26fe8e — AttackName: the Blitzes' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/btlgfx/cursor.asm#L327-L332 lda f:BlitzCode+11,x ; length of code
dec2
longa
sta $38
clr_ay
@6fa6: lda f:BlitzCode,x ; blitz codesChecked by claude, 2026-10-28 — parsed the pinned blitz_code blocks (end_blitz_code adds the A button) and matched every byte with the ROM's 12 bytes per Blitz at $C4:7A40Checked by a second AI model, 2026-10-28.The Colosseum has 4 bytes for each of the 256 items: the monster fought, a byte that is always $40, the prize, and whether the prize's name is hidden. 105 items have their own match and prize; 151 share a default of a Chupon for an Elixir. 4 prizes are hidden. ff6-tables/colosseum
src/data/colosseum_prop.asm#L37-L294ColosseumProp:
colosseum_prop ; DIRK
colosseum_prop ; MITHRILKNIFE
colosseum_prop ; MAIN_GAUCHE
colosseum_prop ; AIR_LANCET
colosseum_prop WART_PUCK, THIEF_GLOVE ; THIEFKNIFE
colosseum_prop TEST_RIDER, SWORDBREAKER ; ASSASSIN
…Final Fantasy VI Disassembly · src/data/colosseum_prop.asm#L6-L30; ------------------------------------------------------------------------------
; [ colosseum data format ]
; 0: monster opponent
; 1: unused (always $40)
; 2: prize item
; 3: hide prize name if nonzero
.macro colosseum_prop monster, item, hide_prize
.ifblank monster
.byte MONSTER::CHUPON_COLOSSEUM
…Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy III (USA) (Rev 1) · 0xfc050-0xfd0cf — MonsterName: the monsters' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/menu/colosseum.asm#L842-L846 lda f:ColosseumProp,x
sta r0206
lda f:ColosseumProp+2,x ; prize
sta r0207
lda f:ColosseumProp+3,xChecked by claude, 2026-10-28 — parsed the pinned colosseum_prop lines (an entry without arguments is the macro's Chupon and Elixir) and matched every byte with the ROM's 4 bytes per item at $DF:B600Checked by a second AI model, 2026-10-28.Opponent and prize are blank where the item uses the default match. Which items the Colosseum refuses outright is not read here.
The 10 items the equipment menu's best-item search skips (6 empty slots follow); the search checks the first 10 slots. ff6-tables/imp-items
src/data/imp_item.asm#L7-L23ImpItem:
.byte ITEM::CURSED_SHLD
.byte ITEM::THORNLET
.byte ITEM::IMP_HALBERD
.byte ITEM::TORTOISESHLD
.byte ITEM::TITANIUM
.byte ITEM::IMPS_ARMOR
.byte ITEM::ATMA_WEAPON
.byte ITEM::DRAINER
.byte ITEM::SOUL_SABRE
.byte ITEM::HEAL_ROD
.byte ITEM::EMPTY
…Final Fantasy III (USA) (Rev 1) · 0x12b300-0x12bfff — ItemName: the items' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/menu/equip.asm#L1653-L1680; [ select the best item in the list ]
GetBestEquip:
@9819: phy
phb
lda #$7e
pha
plb
clr_ay
@9821: clr_ax
@9823: phx
clr_a
…Final Fantasy VI Disassembly · src/data/imp_item.asm#L2-L2.export IMP_ITEM_COUNT: zp = 10Final Fantasy VI Disassembly · src/menu/equip.asm#L1684-L1701; [ select the best 2-handed weapon in the list ]
…
cmp f:ImpItem,x
beq @9878 ; branch if this is an imp itemChecked by claude, 2026-10-28 — parsed the pinned ImpItem lines and matched every byte with the ROM's bytes at $ED:82E4Revised after a check by a second AI model, 2026-10-28.Both best-item routines, the one for a slot (GetBestEquip) and the one for two-handed weapons (GetBest2Hand), skip these items.
Each of the 32 battle commands has two bytes: flags (whether Gogo can choose it, whether Mimic can repeat it, whether an Imp can use it, and a fourth whose use the disassembly leaves unknown) and how it picks targets. 22 commands carry the Gogo flag (the list he picks his commands from leaves out Mimic), 21 can be mimicked, and 11 work for an Imp. ff6-tables/battle-commands
src/data/battle_cmd_prop.asm#L39-L137BattleCmdProp:
; ------------------------------------------------------------------------------
; $00: FIGHT
battle_cmd_prop FIGHT, {GOGO, MIMIC, IMP, UNKNOWN}, {MANUAL, INIT_SINGLE, ENEMY}
; $01: ITEM
…Final Fantasy VI Disassembly · src/common/const.inc#L1517-L1523.enum BATTLE_CMD_FLAG
NONE = %00000000 ; no flags set
GOGO = %00000001 ; can be used by gogo
MIMIC = %00000010 ; can be mimicked
IMP = %00000100 ; can be used by imp
UNKNOWN = %00001000 ; unknown
.endenumFinal Fantasy III (USA) (Rev 1) · 0x18cea0-0x18cf7f — BattleCmdName: the commands' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Final Fantasy VI Disassembly · src/battle/action_1.asm#L185-L185 lda f:BattleCmdProp,x ; return if command can't be mimickedFinal Fantasy VI Disassembly · src/battle/party.asm#L51-L53 lda f:BattleCmdProp,x ; battle command data
bit #BATTLE_CMD_FLAG::IMP
bne @52c3 ; branch if command can be used as impFinal Fantasy VI Disassembly · src/menu/status.asm#L186-L198 clr_axy
@5e42: clr_a
phx
lda $7e9e09,x
bmi @5e60
cmp #BATTLE_CMD::MIMIC
beq @5e60
sta ze0
asl
tax
lda f:BattleCmdProp,x
and #BATTLE_CMD_FLAG::GOGO
…Checked by claude, 2026-10-28 — parsed the pinned battle_cmd_prop lines and matched every byte with the ROM's flag byte per command at $CF:FE00Revised after a check by a second AI model, 2026-10-28.Targeting lists the disassembly's TARGET constants; it was not compared with the ROM byte by byte. The Gogo check is in the status menu's command list (status.asm L186-L198, which first skips Mimic), the Imp check where the party's commands are set up (party.asm L51-L53).
Celes's natural-magic list puts Muddle (level 32) after Bserk (level 40). The field's natural-magic update walks her list in order and stops at the first spell above her level, so when it runs while she is level 32 to 39 it teaches Haste (level 32) but not Muddle, which it gives only once it runs at level 40 or above. The update runs when an event sets up a character (at the party's average level plus that character's level modifier), when an event raises a character to the party's average level, and after a saved game is reloaded. The battle level-up check compares every row with the new level, so reaching level 32 in battle does teach Muddle. ff6-tables/natural-magic-celes-order
src/data/natural_magic.asm#L44-L46 .byte ATTACK::HASTE, 32
.byte ATTACK::BERSERK, 40
.byte ATTACK::CONFUSE, 32Final Fantasy VI Disassembly · src/field/event.asm#L1163-L1178UpdateCeles:
ldx $00
Loop2: lda f:NaturalMagic+$21,x ; level that the spell is learned
cmp $1608,y ; current level
beq :+
bcs Done ; return if greater than current level
: phy
lda f:NaturalMagic+$20,x ; spell number
tay
lda #$ff
sta $1bb2,y ; learn spell
ply
…Final Fantasy VI Disassembly · src/field/event.asm#L1132-L1141.proc UpdateAbilities
lda $1600,y ; actor index
cmp #CHAR::TERRA
beq UpdateTerra
cmp #CHAR::CELES
beq UpdateCeles
cmp #CHAR::CYAN
beq UpdateCyan
cmp #CHAR::SABIN
jeq UpdateSabinFinal Fantasy VI Disassembly · src/field/event.asm#L1026-L1030; [ event command $40: set character properties ]
; $eb: character number
; $ec: actor number
Final Fantasy VI Disassembly · src/field/event.asm#L1078-L1083 lda $ec ; actor
sta $1600,y
jsr CalcAverageLevel
ply
plx
sta $1608,y ; set levelFinal Fantasy VI Disassembly · src/field/event.asm#L1084-L1090 lda f:CharProp+21,x ; level modifier
and #CHAR_LEVEL_MOD::MASK
lsr2
tax
lda f:CharLevelModTbl,x ; add level modifier
clc
adc $1608,yFinal Fantasy VI Disassembly · src/field/event.asm#L1120-L1121 txy
jsr UpdateAbilitiesFinal Fantasy VI Disassembly · src/field/event.asm#L853-L863; [ event command $77: normalize character level ]
; $eb: character number
…Final Fantasy VI Disassembly · src/field/event.asm#L882-L882 jsr UpdateAbilitiesFinal Fantasy VI Disassembly · src/field/menu.asm#L20-L21; [ load saved game ]
Final Fantasy VI Disassembly · src/field/menu.asm#L82-L82 jsr UpdateAbilitiesFinal Fantasy VI Disassembly · src/battle/win.asm#L693-L713; learn spell
@61fc: phy
xba ; A: level
ldy #$0010 ; 16 spells for each character
@6201: cmp f:NaturalMagic+1,x ; natural magic data (level)
bne @621b
pha
phy
clr_a
lda f:NaturalMagic,x ; natural magic data (spell)
tay
lda ($f4),y
…Final Fantasy III (USA) (Rev 1) · 0x26f567-0x26f6e0 — MagicName: the spells' names, as the ROM spells them, decoded with the disassembly's English character tables (tools/extract_assets.py)Checked by claude, 2026-10-28 — read UpdateCeles's loop (bcs Done on the first row above the current level), its three callers, and the battle path's loop over all 16 rows at the pinned commit; the order is the only one out of sequence in either character's listRevised after a check by a second AI model, 2026-10-28.