data/claims/ffmq-tables.yamlFinal Fantasy Mystic Quest's data tables (TheAnsarya's ffmq-info, Final Fantasy - Mystic Quest (USA) (Rev 1))
Game: Final Fantasy Mystic Quest.
Each of the 81 monsters, from the Brownie to the Dark King, has a 14-byte record at $02:C275 (HP as a word, then four stats, which terriblesecret names strength, defense, speed and magic, then eight more bytes), a 3-byte record at $02:C17C (its level, then its experience and gold, each stored as a third), and a 16-byte name at $0C:CBA0. When a battle loads a monster, the game copies its name, sets its level, sets current and maximum HP to the HP word, copies the four stats, copies bytes 6-7 to two places, bytes 8-11 to four, and bytes 12 and 13 to one place each, and and sets offset $2F to $80 for monster $42 (Behemoth) and every monster after it, $00 before it. HP runs from 50 (Brownie) to 40,000 (Dark King), levels from 1 to 40 (Dark King), and experience up to 762 (Stone Golem). ffmq-tables/monsters
0x14275-0x146e2 — $02:C275: the 81 stat records, 14 bytes eachFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x1417c-0x1426e — $02:C17C: level, experience ÷ 3 and gold ÷ 3, 3 bytes per monsterFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x64ba0-0x650af — $0C:CBA0: the monsters' names, 16 bytes eachffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1922-L1985 — Battle_SetEnemyAttributes (ffmq-info's label): the monster number to offset $60, the name from $0C:CBA0 + 16n, then the record at $C17C + 3n: its first byte to offset $10 (the level, where a party member's is) and the next two to $53Battle_SetEnemyAttributes:
dec a
pha
…
ldy.W #$0060
sta.B ($92),y
rep #$30
and.W #$00ff
asl a
asl a
asl a
asl a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1988-L2032 — the record at $C275 + 14n: the HP word to $14 and $16, the four stats to $22-$25 and copies at $26 and $4C, then bytes 6-7 to $3A and $3Cpla
pha
sta.w !WRMPYA
lda.B #$0e
sta.w !WRMPYB
rep #$30
lda.W #$c275
clc
adc.w !RDMPYL
tax
lda.W $0000,x
ldy.W #$0014
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L2033-L2047 — the record at $C275 + 14n: the HP word to $14 and $16, the four stats to $22-$25 and copies at $26 and $4C, then bytes 6-7 to $3A and $3C (continued)adc.W #$002a
tay
lda.W #$0003
phb
mvn $00,$00
plb
plx
lda.W $0000,x
inx
inx
ldy.W #$003a
sta.B ($92),y
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L2048-L2080 — bytes 8-11 to $3E-$41, byte 12 to $56, byte 13 to $2E, then $80 (monster $42 and up) or $00 to $2F, the offset after the saved $2Elda.W #$003e
clc
adc.B $92
tay
lda.W #$0003
phb
mvn $00,$02
plb
sep #$20
rep #$10
lda.W $0000,x
ldy.W #$0056
…Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/tables_list.txt — its drop table starts one byte into the level-experience-gold recordsDropObject drop_table.txt 1417D 81Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/monster_table.txt — the names of the four stats and of bytes 6, 7, 12 and 13; the loader shows only where they gohp,2
strength,1
defense,1
speed,1
magic,1
resistances,1
immunities,1
unknown,4,list
weaknesses,1
counter,1Final Fantasy Mystic Quest: A Terrible Secret Randomizer · randomizer.py#L272-L274 — its boss test counts from monster $40, where the loader's flag starts at $42def is_boss(self):
return self.index >= 0x40After a won battle, each monster present adds 3 times its experience byte to the battle's experience and 3 times its gold byte to its gold (ffmq-tables/monsters). The code would use 6 for a gold byte of $42-$49 and 10 for $4A or more, but no monster's gold byte is above 10. Code — the victory code's × 3Checked by claude-agent, 2026-11-08 — decoded the three ROM ranges and read the monster loader at the pinned linesRevised after a check by a second AI model, 2026-11-08.Experience and gold are the stored byte times 3, as the victory code computes them (ffmq/battle-rewards). The stat names and the resistances, immunities, weaknesses and counter names are abyssonym's (terriblesecret's monster table); the loader's copies go to offsets $3A, $3C, $3E-$41, $56 and $2E of the battle record. The largest stored gold byte is 10. terriblesecret reads its drop table (xp, gp, unknown) from 0x1417D, one byte into these records, so its xp and gp are bytes 1 and 2 and its third field is the next monster's level. terriblesecret's is_boss counts monsters from $40, so it takes in Skullrus Rex ($40) and Stone Golem ($41), which the loader's $42 test leaves out.
Each of the 81 monsters has a 9-byte attack record at $02:C6FF: a profile number in the first byte's low four bits, then eight bytes, which read as item and attack numbers name attacks in the shared name table ($FF in the empty ones; the code that reads them isn't traced). When a battle loads a monster, the game copies the profile's eight bytes from the 16 profiles at $02:C9EA to offset $44 of its battle record and the whole 9-byte record to offset $57. ffmq-tables/monster-attacks
0x146ff-0x149d7 — $02:C6FF: the 81 attack records, 9 bytes eachFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x64120-0x64b6f — the item, spell and attack names, 12 bytes each, numbers $00-$DBffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L2082-L2115 — the record at $C6FF + 9n; its first byte's low nibble × 8 + $C9EA, 8 bytes to offset $44; then 9 bytes to $57sta.w !WRMPYA
lda.B #$09
sta.w !WRMPYB
rep #$30
lda.W #$c6ff
clc
adc.w !RDMPYL
tax
phx
lda.W $0000,x
and.W #$000f
asl a
…Checked by claude-agent, 2026-11-08 — decoded the attack records and read the copy at the pinned linesRevised after a check by a second AI model, 2026-11-08.Reading bytes 1-8 as attack numbers rests on their names: each falls in $40-$DC, the attack range (ffmq-tables/attacks), or is $FF. Attack names are the 12-byte names the item and attack numbers share, read with abyssonym's mq.tbl.
The 16 attack profiles at $02:C9EA hold eight bytes each; a monster's attack record names its profile (ffmq-tables/monster-attacks), and the loader copies it to offset $44. In 10 of them the bytes' low seven bits sum to 100 (profiles 0, 1, 2, 8, 10, 11, 12, 13, 14, 15); the rest sum to 80, 102, 98, 102, 78, 104. Profiles 11, 12, 13, 14, 15 set the top bit on one byte. ffmq-tables/attack-profiles
0x149ea-0x14a69 — $02:C9EA: the 16 profiles, 8 bytes eachffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L2086-L2105 — the copy of a profile's 8 bytes to offset $44lda.W #$c6ff
clc
adc.w !RDMPYL
tax
phx
lda.W $0000,x
and.W #$000f
asl a
asl a
asl a
clc
adc.W #$c9ea
…Checked by claude-agent, 2026-11-08 — decoded the profiles and summed each row's low seven bitsRevised after a check by a second AI model, 2026-11-08.Low-seven-bit sums by profile: 100, 100, 100, 80, 102, 98, 102, 78, 100, 104, 100, 100, 100, 100, 100, 100. Profiles with a top bit set: 11, 12, 13, 14, 15.
Each of the 234 formations at $02:CA6A is 4 bytes: three monster slots and a flags byte. A slot of $FF is empty; otherwise its low seven bits are the monster number. Each slot's top bit is kept apart for that slot ($80 for an empty one), and the flags byte's bits 4 and 5 are kept apart too; what those do isn't read. Bit 7 of the flags byte skips the first-strike roll and bit 6 stops the party running (ffmq/first-strike, ffmq/run). ffmq-tables/formations
0x14a6a-0x14e11 — $02:CA6A: the 234 formations, 4 bytes eachffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1841-L1875 — formation × 4 + $CA6A; each slot's low seven bits (or $FF) to $04AC and $0A02, its top bit to $04B0 and $0A0A; the fourth byte to $AF, its bits 4-5 to $0A01Battle_SetEnemyHP:
lda.B #$00
xba
lda.W $0515
rep #$30
asl a
asl a
sep #$20
rep #$10
tax
ldy.W #$0000
Battle_SetEnemyLevel:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1876-L1906 — counts the slots that aren't $FF into $B3 and loads each present monsterstz.B $b3
lda.B $ac
inc a
beq Battle_CalculateEnemyMagicDef
inc.B $b3
Battle_CalculateEnemyMagicDef:
lda.B $ad
inc a
beq Battle_SetEnemyAttack
inc.B $b3
Battle_SetEnemyAttack:
lda.B $ae
…Before the first round the game rolls for a first strike. Unless the formation's flags byte has bit 7 set, it takes the monsters' figure as the first slot's level plus twice the second slot's plus 3 (an empty slot's level is $FF, so each slot counts its level plus one, and the third slot is never read), divided by the number of monsters, and the party's as Benjamin's level, averaged with the companion's when one is present; it draws 0-100 and, when the draw is at least 100 minus 10 times the difference (the difference capped at 10), gives the first strike to the side with the higher figure. Computed: a difference of d gives a first strike 10d + 1 times in 101. The party's first strike is a round in which only the party acts; the monsters' is a round in which only they act, and only in battle numbers 0-19, the battlefields. With bit 7 set the roll is skipped and the monsters strike first in a battlefield. CodeThe main loop runs the run check when bit 6 of $1020, in Benjamin's record, is set; what sets that bit isn't read. The run fails outright when the formation's flags byte has bit 6 set, and succeeds outright in round 0 after the party won the first strike. Otherwise the game takes the party's speed (Benjamin's, averaged with the companion's when both can act) and the monsters' average speed: the speeds of those that can act, summed from 1 instead of 0 when the first monster can't act, over their number. It draws a random byte modulo ⌊average ÷ 5⌋ × round + 1 (rounds counted from 0; the product and the + 1 kept to 8 bits), and the run succeeds when (average − draw) mod 256 is below the party's speed, so a draw larger than the average wraps to 256 + average − draw. A failed run gives the monsters a round to themselves. Computed: in round 0 the draw is 0, so the run succeeds only when the party is faster. CodeChecked by claude-agent, 2026-11-08 — decoded the formations and read the loader at the pinned linesRevised after a check by a second AI model, 2026-11-08.The slots' top bits go to $04B0 and $0A0A, the flags byte to $AF and its bits 4-5 to $0A01. Bit 7 is read by the first-strike roll and bit 6 by the run check: ffmq/first-strike and ffmq/run. The top-bits column counts an empty slot's $FF as 1, as the code stores it.
The 207 battle numbers each have three formations at $02:CE12. When a battle starts, the game draws a number from 0 to 100 and takes the first formation for 0-33, the second for 34-67, and the third for 68-100. Computed: the third comes up 33 times in 101 and the others 34; battle number $FF skips the draw and uses the formation already in $0515. Battle numbers 0-19 are the 20 battlefields (ffmq/battlefields). ffmq-tables/formation-sets
0x14e12-0x1507e — $02:CE12: three formation numbers per battle numberffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1766-L1809 — Battle_InitializeEnemies (ffmq-info's label): a draw of 0-100 ($65 is the range; ffmq/rng), the battle number in $0513 × 3, plus 1 for each 34 taken off the draw, indexes $CE12; $FF in $0513 skips to the formation already in $0515Battle_InitializeEnemies:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$65
sta.W $00a8
jsl.L ExecuteAudioCall
lda.B #$00
xba
lda.W !sys_operation_type
cmp.B #$ff
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1810-L1829 — Battle_InitializeEnemies (ffmq-info's label): a draw of 0-100 ($65 is the range; ffmq/rng), the battle number in $0513 × 3, plus 1 for each 34 taken off the draw, indexes $CE12; $FF in $0513 skips to the formation already in $0515 (continued)Battle_ProcessEnemySlot:
lda.B #$00
xba
lda.W $00a9
cmp.B #$22
bcc Battle_InitEnemyStats
sec
sbc.B #$22
inx
cmp.B #$22
bcc Battle_InitEnemyStats
sec
…The game's random numbers come from one 16-bit state kept in save RAM at $70:1FFE: each call shifts it left twice, then adds the old state, $3711 and the frame counter at $0E96 in turn, each addition taking in the carry the step before left (the first takes bit 14 of the old state, which the second shift pushed out, so the step is 5 times the state plus that bit, not 5 times the state alone), keeps the 16-bit result, and returns its high byte, reduced modulo the range the caller puts in $A8 when that isn't 0. A range of $65 gives 0-100. Code — a call with $65 in $A8 returns 0-100Each of the 20 battlefields, battle numbers 0-19, has a count of battles at $0C:D4D0, which a new game copies to $0FD4, and a reward word at $07:EFA1. Every battlefield starts at 10. After a won battle with a number below 20, the game takes one off that battlefield's count and shows the number left; at zero it gives the reward: with the top bit set, the low 15 bits times 3 in experience; with bit 14, the item in the low byte; otherwise the low 14 bits times 3 in gold. The battlefield names are Archipelago's, not the game's: Archipelago's object ids 1-20 are taken as battle numbers 0-19 because their types (experience, item, gold) follow the reward words in the same order, and the official guide's numbered battlefields -2-, -5-, -19- and -20- have the rewards of battle numbers 1, 4, 18 and 19. CodeChecked by claude-agent, 2026-11-08 — decoded the table and read the draw at the pinned linesRevised after a check by a second AI model, 2026-11-08.Both branches the code takes (battle numbers below 20 and from 20) do the same subtraction. The battlefield names are Archipelago's, whose 20 battlefields match the reward table's types in order (ffmq/battlefields).
The 15 weapons, items $20-$2E from the Steel Sword to the Ninja Star, have 8-byte records at $02:BC00. When a weapon's action is set up, the game takes bytes 0-1 as a word, bytes 2-5 into four places (keeping the low six bits of bytes 3 and 4, and folding their top two bits into a derived byte), byte 6 into one place, and byte 7 split into its two nibbles. terriblesecret names byte 0 the element, byte 1 the status, byte 2 the power and byte 7 a stat boost. ffmq-tables/weapons
0x13c00-0x13c77 — $02:BC00: the 15 weapon recordsFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x10bf2-0x10c05 — $02:8BF2, the loader's three small tables: the bases $BC00, $BC78, $C0C3, $C117 and $C127, the record sizes 8, 7, 7, 4 and 5, and the first numbers $20, $40, $14, $10 and $2Fffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1606-L1648 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement saysBattle_SetupTargeting:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$00
xba
lda.B $38
lsr a
lsr a
lsr a
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1649-L1686 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_ValidateAllTargets:
rep #$30
phb
ldy.W #$04dd
lda.W #$0003
mvn $00,$02
plb
sep #$20
rep #$10
lda.B $df
and.B #$c0
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1687-L1722 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_CheckTargetStatus:
cmp.B #$10
beq Battle_ProcessTargetCheck
lda.W $0000,x
sta.B $e2
lda.B $38
cmp.B #$20
bne Battle_TargetStatusValid
rts
Battle_TargetStatusValid:
inx
Battle_ProcessTargetCheck:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1723-L1742 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_TargetCheckLoop:
jsr.W Battle_NextTargetCheck
sta.B $e7
xba
and.B #$f0
lsr a
lsr a
lsr a
lsr a
sta.B $e6
jsr.W Battle_NextTargetCheck
sta.B $e9
…Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/weapon_table.txt — the field nameselement,1
status,1
power,1
unknown,4
statboost,1Checked by claude-agent, 2026-11-08 — decoded the records and read the action loader and its table of basesChecked by a second AI model, 2026-11-08.Names are the ROM's 12-byte item names. Field names are abyssonym's; the loader shows only where each byte goes.
The 157 monster attacks, numbers $40-$DC from Sword to an unnamed last entry, have 7-byte records at $02:BC78. The game takes bytes 0-1 as a word, bytes 2-5 into four places (byte 3's low six bits are the effect routine its battle code dispatches on, and its top two bits and byte 4's go into a derived byte), and byte 6 split into nibbles. terriblesecret names byte 0 the element, 1 the status, 2 the power, 3 the effect and 5 the targeting. ffmq-tables/attacks
0x13c78-0x140c2 — $02:BC78: the 157 attack recordsFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x10bf2-0x10c05 — $02:8BF2, the loader's three small tables: the bases $BC00, $BC78, $C0C3, $C117 and $C127, the record sizes 8, 7, 7, 4 and 5, and the first numbers $20, $40, $14, $10 and $2Fffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1606-L1648 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement saysBattle_SetupTargeting:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$00
xba
lda.B $38
lsr a
lsr a
lsr a
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1649-L1686 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_ValidateAllTargets:
rep #$30
phb
ldy.W #$04dd
lda.W #$0003
mvn $00,$02
plb
sep #$20
rep #$10
lda.B $df
and.B #$c0
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1687-L1722 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_CheckTargetStatus:
cmp.B #$10
beq Battle_ProcessTargetCheck
lda.W $0000,x
sta.B $e2
lda.B $38
cmp.B #$20
bne Battle_TargetStatusValid
rts
Battle_TargetStatusValid:
inx
Battle_ProcessTargetCheck:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1723-L1742 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_TargetCheckLoop:
jsr.W Battle_NextTargetCheck
sta.B $e7
xba
and.B #$f0
lsr a
lsr a
lsr a
lsr a
sta.B $e6
jsr.W Battle_NextTargetCheck
sta.B $e9
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L3176-L3182 — the effect number in $DE, doubled, indexes a jump table at $02:992EBattle_StatusCured:
lda.B #$00
xba
lda.B $de
asl a
tax
jmp.W (DB_UNREACH_02992E,x)Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/tables_list.txt — its countAttackObject attack_table.txt 13c78 156Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/attack_table.txt — the field nameselement,1
status,1
power,1
effect,1
sound_effect,1
targeting,1
unknown,1Checked by claude-agent, 2026-11-08 — decoded the records and read the action loader and the effect dispatchChecked by a second AI model, 2026-11-08.terriblesecret's table list counts 156 attacks from 0x13C78; the area between that table and the spells at $02:C0C3 holds 157 records, and the loader's arithmetic reaches number $DC. Names are the ROM's 12-byte names; $DC's is blank.
The 12 spells, items $14-$1F from Exit to Flare, have 7-byte records at $02:C0C3 in the attack format: bytes 0-1 a word, bytes 2-5 into four places (byte 3's low six bits the effect routine), and byte 6 into one place. terriblesecret's attack fields name them: element, status, power, effect, sound effect, targeting. ffmq-tables/spells
0x140c3-0x14116 — $02:C0C3: the 12 spell recordsFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x10bf2-0x10c05 — $02:8BF2, the loader's three small tables: the bases $BC00, $BC78, $C0C3, $C117 and $C127, the record sizes 8, 7, 7, 4 and 5, and the first numbers $20, $40, $14, $10 and $2Fffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1606-L1648 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement saysBattle_SetupTargeting:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$00
xba
lda.B $38
lsr a
lsr a
lsr a
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1649-L1686 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_ValidateAllTargets:
rep #$30
phb
ldy.W #$04dd
lda.W #$0003
mvn $00,$02
plb
sep #$20
rep #$10
lda.B $df
and.B #$c0
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1687-L1722 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_CheckTargetStatus:
cmp.B #$10
beq Battle_ProcessTargetCheck
lda.W $0000,x
sta.B $e2
lda.B $38
cmp.B #$20
bne Battle_TargetStatusValid
rts
Battle_TargetStatusValid:
inx
Battle_ProcessTargetCheck:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1723-L1742 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_TargetCheckLoop:
jsr.W Battle_NextTargetCheck
sta.B $e7
xba
and.B #$f0
lsr a
lsr a
lsr a
lsr a
sta.B $e6
jsr.W Battle_NextTargetCheck
sta.B $e9
…Checked by claude-agent, 2026-11-08 — decoded the records and read the action loaderChecked by a second AI model, 2026-11-08.The four consumables, items $10-$13 (Cure Potion, Heal Potion, Seed, Refresher), have 4-byte records at $02:C117, which the game copies into the same four places as an attack's bytes 2-5: byte 1's low six bits are the effect routine. ffmq-tables/consumables
Value: item 0x10, 0x11, 0x12, 0x13 · name Cure Potion, Heal Potion, Seed, Refresher · Byte 0 25, 0, 0, 0 · Byte 1, low 6 bits (effect) 14, 13, 27, 10 · Byte 2 0x14, 0x15, 0x14, 0x14 · Byte 3 0x95, 0x94, 0xA0, 0x94
CodeFinal Fantasy - Mystic Quest (USA) (Rev 1) ·0x14117-0x14126 — $02:C117: the four item recordsFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x10bf2-0x10c05 — $02:8BF2, the loader's three small tables: the bases $BC00, $BC78, $C0C3, $C117 and $C127, the record sizes 8, 7, 7, 4 and 5, and the first numbers $20, $40, $14, $10 and $2Fffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1606-L1648 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement saysBattle_SetupTargeting:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$00
xba
lda.B $38
lsr a
lsr a
lsr a
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1649-L1686 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_ValidateAllTargets:
rep #$30
phb
ldy.W #$04dd
lda.W #$0003
mvn $00,$02
plb
sep #$20
rep #$10
lda.B $df
and.B #$c0
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1687-L1722 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_CheckTargetStatus:
cmp.B #$10
beq Battle_ProcessTargetCheck
lda.W $0000,x
sta.B $e2
lda.B $38
cmp.B #$20
bne Battle_TargetStatusValid
rts
Battle_TargetStatusValid:
inx
Battle_ProcessTargetCheck:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1723-L1742 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_TargetCheckLoop:
jsr.W Battle_NextTargetCheck
sta.B $e7
xba
and.B #$f0
lsr a
lsr a
lsr a
lsr a
sta.B $e6
jsr.W Battle_NextTargetCheck
sta.B $e9
…Checked by claude-agent, 2026-11-08 — decoded the records and read the action loaderChecked by a second AI model, 2026-11-08.The 17 pieces of armor, items $2F-$3F (helmets, armor, shields, and the Charm, Magic Ring and Cupid Locket), have 5-byte records at $02:C127. The game takes bytes 0-1 as a word, then splits each of bytes 2, 3 and 4 into its two nibbles. Byte 2 runs in blocks: 0x80 for 3 (Steel Helm, Moon Helm, Apollo Helm); 0x00 for 6 (Steel Armor, Noble Armor, Gaia's Armor, Relica Armor, Mystic Robe, Flame Armor); 0x20 for 5 (Black Robe, Steel Shield, Venus Shield, Aegis Shield, Ether Shield); 0x10 for 3 (Charm, Magic Ring, Cupid Locket). terriblesecret names byte 0 the element and byte 1 the status. ffmq-tables/armor
0x14127-0x1417b — $02:C127: the 17 armor recordsFinal Fantasy - Mystic Quest (USA) (Rev 1) · 0x10bf2-0x10c05 — $02:8BF2, the loader's three small tables: the bases $BC00, $BC78, $C0C3, $C117 and $C127, the record sizes 8, 7, 7, 4 and 5, and the first numbers $20, $40, $14, $10 and $2Fffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1606-L1648 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement saysBattle_SetupTargeting:
pea.w !JOY_DOWN
pld
sep #$20
rep #$10
lda.B #$00
xba
lda.B $38
lsr a
lsr a
lsr a
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1649-L1686 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_ValidateAllTargets:
rep #$30
phb
ldy.W #$04dd
lda.W #$0003
mvn $00,$02
plb
sep #$20
rep #$10
lda.B $df
and.B #$c0
lsr a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1687-L1722 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_CheckTargetStatus:
cmp.B #$10
beq Battle_ProcessTargetCheck
lda.W $0000,x
sta.B $e2
lda.B $38
cmp.B #$20
bne Battle_TargetStatusValid
rts
Battle_TargetStatusValid:
inx
Battle_ProcessTargetCheck:
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1723-L1742 — Battle_SetupTargeting (ffmq-info's label): the action kind's high nibble picks an entry of the three small tables, and the record is base + (number − first number) × size; it then copies the bytes as the statement says (continued)Battle_TargetCheckLoop:
jsr.W Battle_NextTargetCheck
sta.B $e7
xba
and.B #$f0
lsr a
lsr a
lsr a
lsr a
sta.B $e6
jsr.W Battle_NextTargetCheck
sta.B $e9
…Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/armor_table.txt — the field names; it calls byte 2 statboostelement,1
status,1
statboost,1
power,1
unknown,1Checked by claude-agent, 2026-11-08 — decoded the records and read the action loaderRevised after a check by a second AI model, 2026-11-08.The 9 character records at $0C:D0B0, 80 bytes each, are Benjamin's starting record and two for each companion, Kaeli, Tristam, Phoebe and Reuben, the second at a higher level. A new game copies record 0 to Benjamin's place at $1000; a script command copies the record it names, whole, to the companion's place at $1080 (ffmq/companion-records). By terriblesecret's field names, which the copies and the level-up fit, each holds the level ($10), current and maximum HP ($14, $16), the three kinds of magic points ($18-$1A, with maxima at $1B-$1D), the four stats as level gives them ($4C-$4F) and with equipment ($22-$25), and accuracy ($40), which Benjamin's level-up sets to 75 plus half the level. ffmq-tables/characters
Value: record 0, 1, 2, 3, 4, 5, 6, 7, 8 · name Benjamin, Kaeli, Tristam, Phoebe, Reuben, Kaeli, Tristam, Phoebe, Reuben · level 1, 3, 7, 15, 23, 31, 23, 34, 31 · HP 40, 120, 360, 680, 1040, 1280, 1120, 1480, 1320 · White MP 3, 3, 7, 21, 23, 35, 23, 40, 31 · Black MP 1, 0, 0, 10, 0, 17, 0, 20, 0 · Wizard MP 0, 0, 0, 5, 0, 0, 0, 10, 7 · attack 7, 11, 23, 47, 84, 96, 68, 70, 99 · defense 6, 11, 10, 20, 61, 73, 31, 39, 68 · speed 8, 11, 28, 36, 61, 77, 80, 66, 70 · magic 10, 9, 16, 49, 35, 55, 26, 94, 41 · Attack with equipment 7, 11, 28, 47, 84, 96, 73, 70, 99 · Defense with equipment 12, 29, 32, 36, 80, 97, 54, 71, 87 · Speed with equipment 8, 11, 33, 36, 61, 77, 85, 71, 70 · Magic with equipment 10, 14, 16, 54, 35, 60, 31, 99, 41 · Offset $40 (accuracy) 75, 76, 78, 82, 86, 90, 86, 92, 90
CodeFinal Fantasy - Mystic Quest (USA) (Rev 1) ·0x650b0-0x6537f — $0C:D0B0: the 9 records, 80 bytes eachffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_00.asm#L1059-L1062 — a new game: 80 bytes from $0C:D0B0 to $1000ldx.W #$d0b0
ldy.W #$1000
lda.W #$004f
mvn $00,$0cffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_00.asm#L11130-L11159 — Party_LoadCharacterData (ffmq-info's label): the script's byte × $50 + $D0B0, 80 bytes from bank $0C to $1080Party_LoadCharacterData:
lda.W #$0080
and.w !char2_active_flag
php
lda.B [$17]
inc.B $17
and.W #$00ff
sep #$30
sta.W $0e92
sta.W !SNES_WRMPYA
lda.B #$50
jsl.L Math_SetMultiplier
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1144-L1185 — Benjamin's level-up shows the record's layout: level at $10, MP maxima at $1B-$1D, the level stats at $4C-$4F copied to $26-$29 and, plus $2A-$2D, to $22-$25, and $40 set to 75 + level ÷ 2lda.B $10
sta.W !sys_temp_work_2
lda.B $1b
sec
sbc.W !sys_temp_work_1
clc
adc.B $10
sta.B $1b
lsr.W !sys_temp_work_1
lsr.W !sys_temp_work_2
lda.B $1c
sec
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1186-L1214 — Benjamin's level-up shows the record's layout: level at $10, MP maxima at $1B-$1D, the level stats at $4C-$4F copied to $26-$29 and, plus $2A-$2D, to $22-$25, and $40 set to 75 + level ÷ 2 (continued)Battle_ProcessCommand:
sta.W $0000,x
inx
dey
bne Battle_InputReceived
lda.B $4c
sta.B $26
clc
adc.B $2a
sta.B $22
lda.B $4d
sta.B $27
…Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/char_table.txt#L1-L16 — its field names and sizes, from offset 0: level at $10, HP at $14 and $16, white, black and wizard at $18-$1A and again at $1B-$1Dname_text,16,list
level,1
unknown1,3
current_hp,2
max_hp,2
white,1
black,1
wizard,1
white2,1
black2,1
wizard2,1
unknown3,8
…Final Fantasy Mystic Quest: A Terrible Secret Randomizer · tables/char_table.txt#L21-L26 — accuracy at $40 and a second attack, defense, speed and magic at $4C-$4Faccuracy,1
unknown6,11
attack2,1
defense2,1
speed2,1
magic2,1Archipelago multiworld randomizer · worlds/ffmq/Options.py#L250-L256 — the randomizer's options speak of each companion's second versionQuests: Complete each companion's individual quest for them to promote to their second version.A companion joins when an event-script command names one of the 9 character records (ffmq-tables/characters): the game copies all 80 bytes of that record over the companion's place at $1080, so the companion arrives at the record's level, HP, stats and equipment, and nothing of the previous companion's record is kept; bit 7 of offset $20 is cleared in the copy unless it was set in the record it replaced. CodeChecked by claude-agent, 2026-11-08 — decoded the records and read the copies and the level-up at the pinned linesRevised after a check by a second AI model, 2026-11-08.Archipelago's companion options call the later records each companion's second version, which a quest promotes them to. Record 0's own name field holds "DemoPlay"; the player names Benjamin. The companions' names are their records' name fields. Magic points are the maxima at offsets $1B-$1D. The field names are terriblesecret's; the copies show only where the bytes go, and the level-up adds to $16 and $1B-$1D and copies $4C-$4F (ffmq/benjamin-level-up).
Each of the 20 battlefields, battle numbers 0-19, has a count of battles at $0C:D4D0, which a new game copies to $0FD4, and a reward word at $07:EFA1. Every battlefield starts at 10. After a won battle with a number below 20, the game takes one off that battlefield's count and shows the number left; at zero it gives the reward: with the top bit set, the low 15 bits times 3 in experience; with bit 14, the item in the low byte; otherwise the low 14 bits times 3 in gold. The battlefield names are Archipelago's, not the game's: Archipelago's object ids 1-20 are taken as battle numbers 0-19 because their types (experience, item, gold) follow the reward words in the same order, and the official guide's numbered battlefields -2-, -5-, -19- and -20- have the rewards of battle numbers 1, 4, 18 and 19. ffmq-tables/battlefields
Value: Battle 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 · battlefield Foresta South, Foresta West, Foresta East, South of Libra Temple, East of Libra Temple, South of Aquaria, South of Wintry Cave, West of Wintry Cave, Ice Pyramid, North of Libra Temple, Aquaria Frozen Field, Path to Fireburg Southern, Path to Fireburg Central, Path to Fireburg Northern, Sealed Temple, Mine, Boulder, Volcano, Kaidge Temple, South of Windia · Battles 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 · reward experience, item, gold, experience, gold, item, experience, gold, experience, item, experience, gold, item, experience, gold, item, experience, experience, experience, experience · Reward 54, Charm, 150, 99, 300, Magic Ring, 99, 600, 540, Exit, 744, 900, Gemini Crest, 816, 1200, Thunder, 1200, 1068, 2808, 2700 · formations 7, 6, 8, 9, 10, 11, 19, 176, 177, 25, 24, 25, 27, 25, 29, 30, 29, 32, 33, 32, 34, 49, 48, 50, 54, 52, 53, 184, 184, 185, 190, 190, 191, 66, 66, 67, 69, 69, 68, 71, 71, 72, 75, 73, 74, 78, 76, 80, 87, 86, 89, 207, 201, 207, 136, 133, 137, 140, 138, 138
CodeFinal Fantasy - Mystic Quest (USA) (Rev 1) ·0x654d0-0x654e3 — $0C:D4D0: a byte per battlefield, inside the 380 bytes a new game copies to $0E84Final Fantasy - Mystic Quest (USA) (Rev 1) · 0x3efa1-0x3efc8 — $07:EFA1: a reward word per battlefieldffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_00.asm#L1055-L1058 — a new game: 380 bytes from $0C:D380 to $0E84, so $0C:D4D0 lands at $0FD4ldx.W #$d380
ldy.W #$0e84
lda.W #$017b
mvn $00,$0cffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1452-L1472 — after the rewards: a battle number below 20 takes one off $0FD4 + n; not zero, a message with the count; zero, the reward word at $07:EFA1 + 2n, by its top bitslda.B #$00
xba
lda.W $0514
cmp.B #$14
bcc Battle_UpdateBattleCount
Battle_DisplayRewardsComplete:
jmp.W Battle_RewardsEnd
Battle_UpdateBattleCount:
tax
dec.W $0fd4,x
beq Battle_ProcessBossDefeat
lda.W $0fd4,x
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1473-L1516 — after the rewards: a battle number below 20 takes one off $0FD4 + n; not zero, a message with the count; zero, the reward word at $07:EFA1 + 2n, by its top bits (continued)Battle_ProcessBossDefeat:
pha
lda.B #$81
clc
adc.B $01,s
jsl.L PlaySoundEffectBank
lda.B #$95
clc
adc.B $01,s
jsl.L Sub_009760
pla
asl a
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_02.asm#L1517-L1527 — after the rewards: a battle number below 20 takes one off $0FD4 + n; not zero, a message with the count; zero, the reward word at $07:EFA1 + 2n, by its top bits (continued)Battle_ApplyRewardBonus:
and.W #$3fff
pha
asl a
clc
adc.B $01,s
sta.B $a2
pla
ldx.W #$d578
jsr.W Battle_DisplayMessageArchipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 1, taken as battle number 0: its name and its type, which matches the reward word'name': 'Foresta South Battlefield', 'object_id': 1, 'location': 'ForestaSouthBattlefield', 'location_slot': 'ForestaSouthBattlefield', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 2, taken as battle number 1: its name and its type, which matches the reward word'name': 'Foresta West Battlefield', 'object_id': 2, 'location': 'ForestaWestBattlefield', 'location_slot': 'ForestaWestBattlefield', 'type': 'BattlefieldItem'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 3, taken as battle number 2: its name and its type, which matches the reward word'name': 'Foresta East Battlefield', 'object_id': 3, 'location': 'ForestaEastBattlefield', 'location_slot': 'ForestaEastBattlefield', 'type': 'BattlefieldGp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 4, taken as battle number 3: its name and its type, which matches the reward word'name': 'South of Libra Temple Battlefield', 'object_id': 4, 'location': 'AquariaBattlefield01', 'location_slot': 'AquariaBattlefield01', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 5, taken as battle number 4: its name and its type, which matches the reward word'name': 'East of Libra Temple Battlefield', 'object_id': 5, 'location': 'AquariaBattlefield02', 'location_slot': 'AquariaBattlefield02', 'type': 'BattlefieldGp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 6, taken as battle number 5: its name and its type, which matches the reward word'name': 'South of Aquaria Battlefield', 'object_id': 6, 'location': 'AquariaBattlefield03', 'location_slot': 'AquariaBattlefield03', 'type': 'BattlefieldItem'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 7, taken as battle number 6: its name and its type, which matches the reward word'name': 'South of Wintry Cave Battlefield', 'object_id': 7, 'location': 'WintryBattlefield01', 'location_slot': 'WintryBattlefield01', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 8, taken as battle number 7: its name and its type, which matches the reward word'name': 'West of Wintry Cave Battlefield', 'object_id': 8, 'location': 'WintryBattlefield02', 'location_slot': 'WintryBattlefield02', 'type': 'BattlefieldGp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 9, taken as battle number 8: its name and its type, which matches the reward word'name': 'Ice Pyramid Battlefield', 'object_id': 9, 'location': 'PyramidBattlefield01', 'location_slot': 'PyramidBattlefield01', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 10, taken as battle number 9: its name and its type, which matches the reward word'name': 'North of Libra Temple Battlefield', 'object_id': 10, 'location': 'LibraBattlefield01', 'location_slot': 'LibraBattlefield01', 'type': 'BattlefieldItem'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 11, taken as battle number 10: its name and its type, which matches the reward word'name': 'Aquaria Frozen Field Battlefield', 'object_id': 11, 'location': 'LibraBattlefield02', 'location_slot': 'LibraBattlefield02', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 12, taken as battle number 11: its name and its type, which matches the reward word'name': 'Path to Fireburg Southern Battlefield', 'object_id': 12, 'location': 'FireburgBattlefield01', 'location_slot': 'FireburgBattlefield01', 'type': 'BattlefieldGp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 13, taken as battle number 12: its name and its type, which matches the reward word'name': 'Path to Fireburg Central Battlefield', 'object_id': 13, 'location': 'FireburgBattlefield02', 'location_slot': 'FireburgBattlefield02', 'type': 'BattlefieldItem'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 14, taken as battle number 13: its name and its type, which matches the reward word'name': 'Path to Fireburg Northern Battlefield', 'object_id': 14, 'location': 'FireburgBattlefield03', 'location_slot': 'FireburgBattlefield03', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 15, taken as battle number 14: its name and its type, which matches the reward word'name': 'Sealed Temple Battlefield', 'object_id': 15, 'location': 'MineBattlefield01', 'location_slot': 'MineBattlefield01', 'type': 'BattlefieldGp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 16, taken as battle number 15: its name and its type, which matches the reward word'name': 'Mine Battlefield', 'object_id': 16, 'location': 'MineBattlefield02', 'location_slot': 'MineBattlefield02', 'type': 'BattlefieldItem'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 17, taken as battle number 16: its name and its type, which matches the reward word'name': 'Boulder Battlefield', 'object_id': 17, 'location': 'MineBattlefield03', 'location_slot': 'MineBattlefield03', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 18, taken as battle number 17: its name and its type, which matches the reward word'name': 'Volcano Battlefield', 'object_id': 18, 'location': 'VolcanoBattlefield01', 'location_slot': 'VolcanoBattlefield01', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 19, taken as battle number 18: its name and its type, which matches the reward word'name': 'Kaidge Temple Battlefield', 'object_id': 19, 'location': 'WindiaBattlefield01', 'location_slot': 'WindiaBattlefield01', 'type': 'BattlefieldXp'Archipelago multiworld randomizer · worlds/ffmq/data/rooms.py#L1 — object id 20, taken as battle number 19: its name and its type, which matches the reward word'name': 'South of Windia Battlefield', 'object_id': 20, 'location': 'WindiaBattlefield02', 'location_slot': 'WindiaBattlefield02', 'type': 'BattlefieldXp'Final Fantasy Mystic Quest Strategy Guidebook · p. 20, Battlefield -2- — battle number 1's reward, the Charm, and its 10 battlesAfter clearing out the 10 rounds worth of monsters in this Battlefield, you'll win a prize the Charm Pendant.Final Fantasy Mystic Quest Strategy Guidebook · p. 28, Battlefield -5- — battle number 4's rewardGrab 300 GP after clearing this Battlefield!Final Fantasy Mystic Quest Strategy Guidebook · p. 59, Battlefields -19- and -20- — battle number 18's rewardHang in there for 10 rounds and you'll receive 2,808 Experience points.Final Fantasy Mystic Quest Strategy Guidebook · p. 59, Battlefields -19- and -20- — battle number 19's rewardLast Battlefield in the game. Pick up an extra 2,700 Experience points here.ファイナルファンタジーUSA ミスティッククエスト 取扱説明書 (Final Fantasy USA: Mystic Quest instruction booklet) · p. 28, バトルポイントについて — 20 battle points on the field (our gloss)フィールド上には、全部で20のバトルポイントが存在します。Checked by claude-agent, 2026-11-08 — decoded the counts and the reward words and read the countdown at the pinned linesRevised after a check by a second AI model, 2026-11-08.The guide numbers the battlefields -1- to -20- and names none; its -n- is battle number n − 1 at the four rows it confirms. The formations column is each battle number's three formations (ffmq/formation-sets). Experience and gold rewards are the stored value times 3, as for monsters.
The level-up compares Benjamin's experience total at $1011-$1013 with the figure at $0510-$0512 (the experience for his next level). A Mesen probe replays the attract mode's level-25 Benjamin from one savestate, answers each read of his level with 1 to 41 in turn, and records what the game then writes to $0510-$0512: 13L³ + 100L² + 161L + 74 for levels 1 to 39 (348 at level 1, 929,600 at level 39), but 146,546 at level 40 and 218,780 at level 41, each 851,968 (13 × 65,536) below that cubic, so the level-40 figure is lower than the 929,600 that took him to level 40. The probe records the write coming from the script command at $00:AF5B with the event-script pointer at $03:AE36; the script isn't decoded. ffmq-tables/experience-to-level
src/asm/banks/bank_02.asm#L1533-L1558 — the level-up's check: $0510-$0512 against his experience at $1011-$1013Battle_DisplayNumberValue:
sep #$20
rep #$10
sec
lda.W $0512
cmp.W $1013
beq Battle_ConvertNumberLoop
bcc Battle_DisplayDigitLoop
rts
Battle_ConvertNumberLoop:
rep #$30
lda.W $0510
…ffmq-info: Final Fantasy Mystic Quest (SNES) disassembly and tools · src/asm/banks/bank_00.asm#L12916-L12925 — Memory_BlockCopy_ToPointer (ffmq-info's label), a script command at $00:AF5B: the 3-byte result at $9E copied to the address that follows in the script; the probe records the program counter of the write to $0512 in this rangeMemory_BlockCopy_ToPointer:
tax
lda.B [$17]
inc.B $17
inc.B $17
tay
txa
ldx.W #$009e
mvn $00,$00
rtsChecked by claude-agent, 2026-11-08 — ran probes/ffmq/exp-threshold.mjs: Benjamin's level read answered with each of 1-41 from one savestate before the attract mode's script, and the program counter of the attract run's write (00:AF6A) and the script pointer recorded, and the 41 figures written to $0510-$0512 checked against the cubic (levels 1-39) and the cubic less 13 × 65,536 (40-41); the unaltered attract run (level 25) writes 269,724, the same figure; read the store and the check at the pinned linesRevised after a check by a second AI model, 2026-11-08.Probe: probes/ffmq/exp-threshold.mjsThe figures are a running total, not an amount per level: the check compares them with his whole experience. The cubic is our fit, and the probe checks it at every level. Losing exactly 13 × 65,536 at levels 40 and 41 looks like an overflow in the script's arithmetic, which isn't read yet. If the game sets the level-40 figure, a level-40 Benjamin already meets it at the next check; the level-up stops at 41 (ffmq/benjamin-level-up).
Cited by: Growth rate