data/claims/lufia-tables.yamlLufia & the Fortress of Doom's data tables (USA ROM, read from its bytes and our own disassembly of the code that reads them)
Game: Lufia & the Fortress of Doom.
Each of the 165 monsters has a record reached through a table of 165 offsets at the start of the monster data: a 10-letter name, then fixed fields, then an ailment group (a mask byte and one byte per set bit), an element group (a mask and one byte per set bit of its low 7), and a count byte with that many more. The battle loader copies the name and the fixed bytes into the fighter, widening the bytes at +24 to +26 to words; the reward code reads the experience as a word at +27, the gold as a word at +30, the dropped item at +32 and its rate at +33. Lufia Forge names the words at +16, +20 and +22 HP, ATP and DFP and treats the word at +18 as MP, the bytes at +24 to +26 M.DEF, AGL and MGR, the byte at +12 the element the monster is weak to and +13 the physical damage it then takes in sixteenths, and the element group's bytes magic damage multipliers in sixteenths. 77 monsters carry a drop. HP runs up to 65535 (Gades). lufia-tables/monsters
0x5800-0x5949 — the monster offset table at $00:D800: 165 words, each an offset from $D800 (the first, $014A, is twice the count)Lufia & the Fortress of Doom (USA) · 0x594A-0x7D90 — the 165 records at $00:D94A-$FD90, each followed by the monster's battle scriptLufia & the Fortress of Doom (USA) · 0xF67D-0xF68F — $01:F67D-$F68F: Y = the word at $D800 + 2 x monster (the record's offset)Lufia & the Fortress of Doom (USA) · 0xF570-0xF665 — $01:F570-$F665, the battle loader: copy the 10-byte name (spaces as 0), bytes +10 to +23 one to one, +24 to +26 each into a word, +27 to +35 one to one; then the ailment and element groups (mask byte, one byte per set bit, 8 and 7 bits) and the counted bytes; then M.DEF x 4, the HP with its random bonus into current and maximum HP, and MPLufia & the Fortress of Doom (USA) · 0x43C26-0x43CA6 — $08:BC26-$BCA6, a defeated monster's rewards: add the experience word (fighter +$1F, record +27) to the battle's total; gold word (+$22, record +30) plus a random bonus; if the item byte (+$24, record +32) isn't 0 and random(255) < the rate byte (+$25, record +33), it is the dropLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataOffsets.cs#L36-L39// u16 pointers relative to the table start.
// +0 name (10) +10 type/flags +12 weakness +14 graphic +15 palette
// +16 HP +20 ATP +22 DFP (u16) +24 M.DEF +25 AGL +26 MGR (u8)
// +27 EXP (u16) +30 GP (u16) +32 item dropped +33 drop rate (/255)Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/MonsterEditorViewModel.cs#L34-L38private static readonly int[] UnknownFields = { 11, 29 };
public static readonly string[] ElementNames = { "Fire", "Ice", "Bolt", "Water", "Blast", "Light", "Dark" };
/// <summary>Spell damage per element (the record's second masked group).</summary>
public ObservableCollection<ElementRow> MagicElements { get; } = new(ElementNames.Select(n => new ElementRow { Name = n }));
/// <summary>Physical damage from attacks of the "weak against" element, in percent (+13, in 16ths).</summary>Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/MonsterEditorViewModel.cs#L337if (rom.ReadUInt16Le(o + 18) == 0) { rom.WriteUInt16Le(o + 18, 40); gaveMp = true; } // a caster needs MPLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Core/Battle/MonsterTable.cs#L227-L233// ── magic elements: the record's second masked group (bit n = element n + 1, one multiplier byte per set bit) ──
/// <summary>Elements the battle code reads per target ($08:BFFD, 7 entries): 1 Fire .. 5 Blast, and 6 Light,
/// 7 Dark, which the game never uses but handles the same way.</summary>
public const int ElementCount = 7;
/// <summary>Magic damage multipliers in 16ths for elements 1-7 (0 = normal damage).</summary>Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L139-L140public static readonly string[] Ailments =
{ "Paralysis", "Stone", "Sleep", "Confuse", "Poison", "Death", "Mute", "Mirror" };Checked by claude-agent, 2026-11-08 — disassembled the offset lookup at $01:F67D, the battle loader at $01:F570 and the reward routine at $08:BC26 from the ROM, and decoded every record through the offset table with a scratch reader that walks the same groups the loader walks; Lufia Forge's field names quotedRevised after a check by a second AI model, 2026-11-08.Names are as the ROM spells them, with the "@" the game's text uses inside a name read as a space. The ailment bytes follow Lufia Forge's order of the mask's bits (Paralysis, Stone, Sleep, Confuse, Poison, Death, Mute, Mirror) and the element bits its order (Fire, Ice, Bolt, Water, Blast, Light, Dark); an empty cell is a clear bit. The bytes at +11 and +29, a type byte at +10 and the graphic at +14 are left out. Monster numbers are the game's ids, from 0.
Each of the 256 items has a record reached through a table of 256 offsets: a 12-letter name, bytes at +12 to +15, a word at +16, a mask byte at +20, one record-relative pointer for each set bit of the mask's low six, and then a list of three-byte properties (an id and a word) ended by 0, which the record reader spreads into one word per property id. The equip code takes a weapon's property 14 second byte as the wearer's hit byte (255 when it is 0), property 22 as the weapon's special, and averages the nonzero property 23 bytes of the other five pieces into the wearer's encounter byte. The other meanings are Lufia Forge's alone: it names +12 the type, +13 the equipment slot (1 weapon to 6 ring), the high four bits of +14 who can equip it (Hero, Lufia, Aguro, Jerin), the word at +16 the price, and the property ids 5 ATP, 6 DFP, 7 MGR, 8 AGL, 9 STR, 10 INT, 14 weight and hit chance, and the rest. 163 items have a slot by that reading; the 57 with a nonzero mask (the usable ones) have pointers before their property list. lufia-tables/items
0x55800-0x559FF — the item offset table at $0A:D800: 256 words, each an offset from $D800Lufia & the Fortress of Doom (USA) · 0x55A00-0x5787F — the records from $0A:DA00, to the end of the last property listLufia & the Fortress of Doom (USA) · 0x47AD0-0x47AE2 — $08:FAD0-$FAE2: X = $D800 + the word at $D800 + 2 x item (data bank $0A)Lufia & the Fortress of Doom (USA) · 0x47999-0x47A2C — $08:F999-$FA2C, the record reader: clear $50 bytes; copy the 12-byte name (spaces as 0), then +12 to +20; for each set bit of the +20 mask's low six take a record-relative pointer; then, for every item, for each [id, word] entry until 0, store the word at $17C9 + 2 x (id - 1)Lufia & the Fortress of Doom (USA) · 0x47858-0x478D1 — $08:F858-$F8D1, the equip step for one party member: read the weapon; hit byte $1760,X = $17E4 (property 14's second byte), or $FF if 0; weapon special $176C,X = $17F3 (property 22); then for the other five pieces, sum and count the nonzero $17F5 bytes (property 23) and store their average at $1768,X unless it is $FFLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataOffsets.cs#L28-L30// 256 x u16 pointers, relative to the table start.
// +0 name (12) +12 type +13 equip slot +14 equip flags (hi nibble = who, lo nibble = target)
// +15 icon +16 price (u16) +18..+20 ? +21.. property/effect data (00 terminated)Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L15-L30public static readonly ByteOption[] ItemTypes =
{
new(0x00, "00 ?"),
new(0x01, "01 None / key item"),
new(0x02, "02 Equipment"),
new(0x06, "06 Equipment with special effect"),
new(0x41, "41 Used out of battle"),
new(0x81, "81 Used in battle"),
new(0xC1, "C1 Used in & out of battle"),
};
public static readonly ByteOption[] EquipSlots =
{
…Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L59-L66var known = new Dictionary<int, string>
{
[0x05] = "ATP", [0x06] = "DFP", [0x07] = "MGR", [0x08] = "AGL", [0x09] = "STR",
[0x0A] = "INT", [0x0C] = "Element / slayer type (a, b)", [0x0D] = "Ailment resist (a = ailment 1-8, b = x/16, FF immune)",
[0x0E] = "Weight (a) / hit chance (b, weapon)", [0x0F] = "Element resist (element, x/16)", [0x10] = "Spell element boost (element, x/16)",
[0x11] = "Ailment chance boost (bits, x/16)", [0x12] = "Inflict on hit (bits, chance /255; needs patch)",
[0x13] = "Item use data", [0x14] = "Ring flags", [0x15] = "Animation / sound (items)", [0x16] = "Weapon special (1 drain, 3 death)",
[0x17] = "Encounter rate (?)",Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/ItemEditorViewModel.cs#L93-L97int equip = rom.ReadByte(o + 14);
EquipHero = (equip & 0x10) != 0;
EquipLufia = (equip & 0x20) != 0;
EquipAguro = (equip & 0x40) != 0;
EquipJerin = (equip & 0x80) != 0;Checked by claude-agent, 2026-11-08 — disassembled the record reader at $08:F999, its offset lookup at $08:FAD0 and the equip step at $08:F858 from the ROM, and decoded all 256 records with a scratch reader that walks the property list the same way; Lufia Forge's names for the type, slot, character bits and property ids quotedRevised after a check by a second AI model, 2026-11-08.Who equips: H Hero, L Lufia, A Aguro, J Jerin, by Lufia Forge's reading of the high four bits of +14 (shown only for items with a slot). Weight and hit are the two bytes of property 14. Other properties are given as Lufia Forge names them, with their two bytes; "encounter" is its property 23, which only Clear Silk (item 56, byte 147) and Monster Ring (item 138, byte 192) carry. Usable items' effect data, reached through the pointers, isn't decoded here.
The 56 spells have records reached through a table of offsets: an 8-letter name, then bytes the spell reader copies from +8 to +20, among them a record-relative pointer at +12 to the effect data, which the reader turns into an address. The rest is Lufia Forge's reading: a usage byte at +8, a target byte at +10 and the MP cost at +11, effect codes (such as 1 restore HP, 5 restore all HP, 6 cure ailments, 11 elemental damage, 15 drain MP, 16 teleport, 17 float) and element numbers (1 Fire to 7 Dark); it reads the effect data as an effect byte, then for elemental damage an element, a power word and a random range; for healing and stat changes a kind, a power and a random range; for ailments a kind and a success rate. lufia-tables/spells
0xFDB00-0xFDB6F — the spell offset table at $1F:DB00: 56 words, each an offset from $DB00Lufia & the Fortress of Doom (USA) · 0xFE354-0xFE8CF — the records from $1F:E354Lufia & the Fortress of Doom (USA) · 0x47ABD-0x47ACF — $08:FABD-$FACF: X = $DB00 + the word at $DB00 + 2 x spell (data bank $1F)Lufia & the Fortress of Doom (USA) · 0x47A2D-0x47A6F — $08:FA2D-$FA6F, the spell reader: copy the 8-byte name, then +8 to +20; add the record's address to the word copied from +12Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataOffsets.cs#L52-L53// ── Spells: variable-length records with no pointer table, so the offsets are listed.
// +0 name (8) +8 usage +10 target +11 MP +20 effect +21 sub-type +22.. effect parametersLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/SpellEditorViewModel.cs#L104-L128switch (_effect)
{
case 0x01 or 0x05:
IsCure = true;
SubTypeOptions = GameDataLabels.WithValue(GameDataLabels.CureKinds, sub);
Power = rom.ReadByte(o + 22);
RandomPower = rom.ReadByte(o + 23);
break;
case 0x06 or 0x0E:
IsAilment = true;
foreach (var a in Ailments) a.IsSet = (sub & a.Bit) != 0;
SuccessRate = rom.ReadByte(o + 22);
…Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L102-L108public static readonly ByteOption[] Elements =
{
new(0, "0 None"), new(1, "1 Fire"), new(2, "2 Ice"),
new(3, "3 Bolt"), new(4, "4 Water"), new(5, "5 Blast"),
// the game never uses 6 and 7, but its damage code handles them like the others ($08:BFFD)
new(6, "6 Light"), new(7, "7 Dark"),
};Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L121-L126public static readonly string[] SpellEffects =
{
"00 Nothing", "01 Restore HP", "02 ?", "03 ?", "04 ?", "05 Restore all HP",
"06 Cure ailment(s)", "07 Raise stat", "08 ?", "09 ?", "0A ?", "0B Elemental damage",
"0C ?", "0D Lower stat", "0E Inflict ailment(s)", "0F Drain MP", "10 Teleport", "11 Float", "12 ?",
};Checked by claude-agent, 2026-11-08 — disassembled the spell reader at $08:FA2D and its lookup at $08:FABD from the ROM, and decoded every record through the offset table and each record's effect pointer with a scratch reader; Lufia Forge's effect fields quotedRevised after a check by a second AI model, 2026-11-08.Lufia Forge lists the 56 record offsets by hand and says the spells have no pointer table; the reader at $08:FABD reads one at $1F:DB00, whose 56 entries give the same offsets. Effect names are Lufia Forge's. Spell 0, Nothing, points past its own record and has no effect here.
On each level-up, unless a flag the game's event code sets and clears is set (not identified here), the game walks the new level's character's list of (level, spell) pairs, ended by $FF, skipping pairs whose level is 0, and teaches each spell whose level equals the new level; the Hero, Lufia and Jerin have lists, and the code skips Aguro's slot. The lists hold 63 pairs. lufia-tables/spells-learned
0x467EB-0x467F2 — $08:E7EB: each slot's offset into the lists (Hero 0, Lufia $23, Jerin $54)Lufia & the Fortress of Doom (USA) · 0x46E0D-0x46E8D — the (level, spell) lists at $08:EE0DLufia & the Fortress of Doom (USA) · 0x46650-0x4665D — $08:E650-$E65D: the growth counter + 1, the increment step, then the spell step is skipped if $14DA isn't 0 (set at $01:C0B5, cleared at $01:D725)Lufia & the Fortress of Doom (USA) · 0x4665E-0x46683 — $08:E65E-$E683: unless the slot is 2 (Aguro): Y = the slot's offset; for each pair: 0 skips, $FF ends, a level equal to the new level learns the spellChecked by claude-agent, 2026-11-08 — disassembled the level-up routine's spell step at $08:E65E from the ROM and decoded the three lists through the offsets at $08:E7EBRevised after a check by a second AI model, 2026-11-08.Pairs with level 0 are in the lists but the level-up step skips them; Lufia Forge reads them as spells known from the start, which this pass didn't check.
Eight character records of 29 bytes each hold a character's state when they join: level, a growth counter, six stat words (HP, MP, AGL, INT, STR, MGR), the experience, the experience for the next level and the increment (three bytes each), and six equipment bytes. The join routine fills party slot id mod 4 only when the slot's level is 0: from a level kept aside for the slot if there is one, else by copying the record; so Maxim, Selan, Guy and Artea (records 4-7, the prologue party) take the slots of the Hero, Lufia, Aguro and Jerin; Lufia Forge names the records and the stats. lufia-tables/characters
Value: character Hero, Lufia, Aguro, Jerin, Maxim, Selan, Guy, Artea · level 1, 1, 5, 14, 78, 77, 77, 75 · Growth counter 0, 0, 0, 0, 64, 64, 64, 64 · HP 23, 22, 62, 98, 611, 478, 717, 622 · MP 10, 18, 0, 56, 370, 629, 0, 514 · STR 6, 4, 20, 25, 234, 145, 255, 211 · INT 4, 9, 5, 22, 127, 250, 88, 249 · AGL 4, 7, 7, 21, 122, 129, 103, 164 · MGR 2, 5, 6, 22, 222, 254, 153, 217 · EXP 0, 0, 0, 0, 4929582, 5461525, 5597236, 6372597 · Next level at 15, 17, 105, 502, 4932398, 5467202, 5606451, 6379964 · Increment 15, 17, 105, 502, 176163, 199526, 183253, 147202 · weapon Knife, Small Knife, Short Sword, Elven Bow, Dual Blade, Silver Rod, Zircon Axe, Artea's Bow · armor Cloth, Dress, Cloth Armor, Light Robe, Zircon Armor, Silver Robe, Zircon Armor, Zircon Robe · shield null, null, null, null, Zircon Plate, Silver Wrist, Silver Plate, Zircon Wrist · helmet null, null, null, null, Zircon Helm, Sakret, Silver Helm, Zircon Beret · shoes Sandal, Sandal, Cloth Shoes, Tan Shoes, Sword Shoes, Cat Heels, Mach Shoes, Cat Heels · ring null, null, null, null, Wave Ring, Flash Ring, White Ring, Hi Daze Ring
CodeLufia & the Fortress of Doom (USA) ·0x46D25-0x46E0C — the eight records at $08:ED25Lufia & the Fortress of Doom (USA) · 0x46A9F-0x46B66 — $08:EA9F-$EB66, the join routine: slot = character mod 4; nothing if the slot's level ($156F,X) isn't 0; if $1577,X isn't 0 it becomes the level and no record is copied; record = $08:ED25 + 29 x character; level and counter, then six words into the stats and their band starts, nine bytes into experience, next and increment, six bytes into the equipmentLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataOffsets.cs#L11-L13// 8 records x 29 bytes: Hero, Lufia, Aguro, Jerin, Maxim, Selan, Guy, Artea
// +0 level +1 ? +2 HP +4 MP +6 AGL +8 INT +10 STR +12 MGR (u16 each)
// +14 EXP (u24) +17..+22 ? +23 weapon +24 armor +25 shield +26 helmet +27 shoes +28 ringChecked by claude-agent, 2026-11-08 — disassembled the join routine at $08:EA9F from the ROM and decoded the eight records; equipment bytes read as item numbers through the item tableRevised after a check by a second AI model, 2026-11-08.The order of the six stat words is Lufia Forge's (+2 HP, +4 MP, +6 AGL, +8 INT, +10 STR, +12 MGR); the level-up code's stat order (HP, MP, STR, INT, AGL, MGR) reaches the same words. The Hero's name comes from the player.
Stat growth is a table of 6 stats by 7 bands by the 4 party slots: at each level-up a stat becomes its value at the start of the current band of 16 level-ups plus the band's byte times the level-ups so far into it (1 to 16) over 16, rounded, plus a random -2 to +2 when that gain isn't 0, and it never goes down; the band start moves up at the 16th level-up of a band. The stat names come from the characters' records, whose stat names are Lufia Forge's. lufia-tables/growth
0x46C69-0x46D10 — the growth bytes at $08:EC69: 28 per stat (7 bands x 4 slots)Lufia & the Fortress of Doom (USA) · 0x467C7-0x467EA — $08:E7C7-$E7EA: per stat, its growth bytes, its current value and its band startLufia & the Fortress of Doom (USA) · 0x46692-0x466B8 — $08:E692-$E6B8: band x 4 + slot from the counter's high four bits; step = counter's low four bits + 1Lufia & the Fortress of Doom (USA) · 0x4673D-0x467C6 — $08:E73D-$E7C6, one stat: gain = (growth x step + 8) / 16; if gain isn't 0, add random(5) - 2; new = band start + gain; if new > current, current = new; at step 16 the band start = newChecked by claude-agent, 2026-11-08 — disassembled the level-up routine's stat step at $08:E73D and its tables at $08:E7C7 from the ROM, and decoded the 168 growth bytesRevised after a check by a second AI model, 2026-11-08.Bands 1-7 cover growth counters 0-15, 16-31 and so on; a counter past 111 would read past the band bytes. The four slots' bytes also serve the prologue party, which uses the same slots.
Cited by: Growth rate
Experience to reach each level, computed from the level-up code: a character levels when their experience reaches the stored next-level value (to a cap of 99); then the increment grows by itself shifted right once for each of the character's five thresholds the growth counter plus 1 has reached, by nothing once all five are reached, and the next level comes at next plus the new increment. Level 99 takes 6,857,436 (Hero), 7,017,992 (Lufia), 6,620,349 (Aguro) and 7,124,086 (Jerin). lufia-tables/experience
0x46D11-0x46D24 — the five thresholds per slot at $08:ED11: Hero 5 11 17 40 45; Lufia 5 11 17 40 43; Aguro 5 7 14 31 37; Jerin 5 7 13 20 24Lufia & the Fortress of Doom (USA) · 0x46601-0x4663F — $08:E601-$E63F: if the level isn't 0 and experience >= next (three bytes) and the level isn't 99: level + 1Lufia & the Fortress of Doom (USA) · 0x466B9-0x4673C — $08:E6B9-$E73C: for Y = 0 to 4: stop if counter + 1 < threshold Y; at Y = 4 the addition is 0; else halve it; increment += it; next += incrementChecked by claude-agent, 2026-11-08 — disassembled the level-up routine at $08:E601 and its increment step at $08:E6B9 from the ROM; the table is our computation from each character record's level, counter, next and increment and the thresholdsRevised after a check by a second AI model, 2026-11-08.Each column starts at the character's level in their record (Aguro and Jerin join above level 1) with the record's experience; the growth counter goes up by one before the increment step.
Cited by: Growth rate
The game has 86 shop numbers, each an offset into the shop records; a record is a type byte, then item numbers, ended by 0, and a type of 0 is no shop. 70 have stock. Lufia Forge names the types 2 weapons, 3 armor, 4 weapons and armor, 5 items and 7 accessories, and the town of each shop; types 1 (shop 45, no stock), 6 (four shops of ciders) and 8 (shop 13, stuffed animals) it leaves unnamed. lufia-tables/shops
0xEC5B-0xED06 — the shop offset table at $01:EC5B: 86 words, each an address in bank $01Lufia & the Fortress of Doom (USA) · 0xED5B-0xEFE7 — the records from $01:ED5BLufia & the Fortress of Doom (USA) · 0x51CD-0x51FD — $00:D1CD-$D1FD: the shop's word from $01:EC5B; its first byte, the type: 0 ends; then each item byte until 0Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataLabels.cs#L75-L94public static readonly ByteOption[] ShopTypes =
{
new(0, "0 Nothing"), new(1, "1 Unused (?)"), new(2, "2 Weapons"), new(3, "3 Armor"),
new(4, "4 Weapons & armor"), new(5, "5 Items"), new(6, "6 Battle"), new(7, "7 Accessories"),
new(8, "8 Battle"), new(9, "9 Unused (?)"),
};
/// <summary>Shop locations (index = shop id).</summary>
public static readonly string[] ShopTowns =
{
"Unused", "Alekia", "Alekia", "Alekia", "Chatam", "Treck", "Unused", "Treck", "Treck", "Treck",
"Lorbenia", "Lorbenia", "Lorbenia", "Lorbenia", "Lorbenia", "Lorbenia", "Grenoble", "Grenoble",
"Grenoble", "Unused", "Medan", "Medan", "Medan", "Jenoba", "Jenoba", "Jenoba", "Unused", "Linze",
…Checked by claude-agent, 2026-11-08 — disassembled the shop reader at $00:D1CD from the ROM and decoded the 86 records; prices are the items' price wordsRevised after a check by a second AI model, 2026-11-08.Shop numbers are the game's, from 0. Prices are in the items table. Lufia Forge's town names for each number aren't checked against the maps here.
A random battle's encounter group (1-69) points to a list of subgroups: each monster draw picks one of the listed subgroups at random, then counts random(4) + 1 steps through its non-empty monster slots, wrapping round to the first, and takes 1-3 of the monster it stops on. So a subgroup with empty slots favours its first ones: subgroup 1 (Big Newt, Madshroom, Jellyfish) gives Big Newt 2 draws in 4 (computed). lufia-tables/encounter-groups
0x45A60-0x45BE1 — the group pointers at $08:DA60 (69 words, each an address in bank $08) and the lists: a count, then subgroup numbersLufia & the Fortress of Doom (USA) · 0x459D2-0x45A5F — $08:D9D2-$DA5F, one draw: for a formation below $E6: subgroup = list[random(count)]; slot = random(4) + 1, counted through the subgroup's non-$FF ids; count = random(3) + 1The 67 subgroups each hold four monster ids ($FF empty). CodeChecked by claude-agent, 2026-11-08 — disassembled the draw at $08:D9D2 from the ROM and decoded the 69 listsRevised after a check by a second AI model, 2026-11-08.A subgroup listed twice in a group is drawn twice as often. Which group a map uses comes from the world map's zone grid or the map's setup script (Lufia Forge), not read here.
The 67 subgroups each hold four monster ids ($FF empty). lufia-tables/encounter-subgroups
0x45BE2-0x45CED — the subgroups at $08:DBE2, four ids eachLufia & the Fortress of Doom (USA) · 0x45A1D-0x45A2D — $08:DA1D-$DA2D: address = $DBE2 + 4 x (subgroup - 1)Checked by claude-agent, 2026-11-08 — disassembled the subgroup address step at $08:DA1D and decoded the 67 subgroupsChecked by a second AI model, 2026-11-08.Formations $E6 to $FA are fixed: each has four monster slots, and a battle takes each slot's monster once, in order, an $FF slot giving no monster. lufia-tables/boss-formations
0x45CEE-0x45D41 — the fixed formations at $08:DCEE, four ids eachLufia & the Fortress of Doom (USA) · 0x459E0-0x45A0B — $08:D9E0-$DA0B: a formation of $E6 or more reads $DCEE + 4 x (formation - $E6), one monster per draw for four draws, then $FFChecked by claude-agent, 2026-11-08 — disassembled the fixed-formation branch at $08:D9E0 and decoded the 21 formationsChecked by a second AI model, 2026-11-08.Before the prologue the game's script gives the prologue party 10 stacks of items (Miracle x87, Ex Potion x62, Ex Magic x28, Revive x50, Awaken x92, Stone Cure x88, Mystery Pin x95, Shriek x91, Ex Arrows x36, Ex Bomb x29) and teaches Maxim 10 spells, Selan 8 and Artea 12. lufia-tables/prologue-script
Value
{
"slot": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3,
3
],
"spell": [
"Valor",
"Boost",
"Champion",
"Stronger",
"Poison",
"Stun",
"Dead",
"Stone",
"Waken",
"Protect",
"Thunder",
"Bolt",
"Vulcan",
"Glacier",
"Blizzard",
"Succumb",
"Fake",
"Mirror",
"Flood",
"Sunder",
"Dread",
"Mirror",
"Bounce",
"Trick",
"Valor",
"Champion",
"Rally",
"Courage",
"Waken",
"Warp"
],
"item": [
"Miracle",
"Ex Potion",
"Ex Magic",
"Revive",
"Awaken",
"Stone Cure",
"Mystery Pin",
"Shriek",
"Ex Arrows",
"Ex Bomb"
],
"count": [
87,
62,
28,
50,
92,
88,
95,
91,
36,
29
]
}0x1BD8E-0x1BE05 — the prologue script's run of 3D cc ss (character slot cc learns spell ss) and 3E ii qq (give qq of item ii) commandsLufia & the Fortress of Doom (USA) · 0x11196-0x111A8 — $01:D196-$D1A8, command 3D: slot = the next byte AND 3; spell = the byte after; $08:E829 appends the spell to the slot's listLufia & the Fortress of Doom (USA) · 0x111A9-0x111CB — $01:D1A9-$D1CB, command 3E: item, count = the next two bytes; $08:F45A adds them to the bag (or $08:F49A takes the other path)Lufia & the Fortress of Doom (USA) · 0x46829-0x4684B — $08:E829-$E84B: find the slot list's first 0 at $158F + the slot's offset and store the spell thereLufia & the Fortress of Doom (USA) · 0x4745A-0x4747D — $08:F45A-$F47D: for an item 1 to $EF, walk the bag's pairs ($14F7 item, $14F8 count) to the item's own or the first empty one; the count is added while the stack stays below 100The prologue's party when its first map loads is Maxim at level 78, Selan 77, Guy 77 and Artea 75, with the stats and equipment stored in their character records, and the prologue's script has given them 10 items (87 Miracle, 62 Ex Potion, 28 Ex Magic, 50 Revive, 92 Awaken, 88 Stone Cure, 95 Mystery Pin, 91 Shriek, 36 Ex Arrows, 29 Ex Bomb) and taught Maxim 10, Selan 8 and Artea 12 spells. Measured in MesenCE from power-on, pressing A every 10 frames with Start on every fourth press, about 60 frames (60 to 69) after the prologue's first map is entered. VerifiedLufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · LufiaForge/LufiaForge/Modules/GameData/GameDataOffsets.cs#L48-L50// ── Final (prologue) party's items: 10 "give item" script commands: 3E item qty
public const int FinalPartyItems = 0x1BDE9;
public const int FinalPartyItemCount = 10;Lufia Forge: a ROM hack toolkit for Lufia & the Fortress of Doom (SNES) · research-event-commands.md#L136-L137| 3D | $D196 | 3 | cc, ss = spell | Character cc learns spell ss (appended to first free slot of its spell list, $08:E829). | no | $158F/$15AF/$15CF spell lists | confirmed | $08:E84C maps cc 0->$158F, 1->$15AF, 2->$158F(!), 3->$15CF. |
| 3E | $D1A9 | 3 | ii = item, qq = qty | Give item. Clears flag FF; $08:F45A checks room, $08:F49A adds (stacks to 99, 60 slots). **Flag FF set = did not fit / failed.** Items F0-FF are key items stored as bits in $15EF. | no | $14F7 inventory, $15EF, flag FF | confirmed | Ex `3E E6 01`. |Checked by claude-agent, 2026-11-08 — disassembled the handlers of commands 3D and 3E at $01:D196 and $01:D1A9 and the routines they call, and decoded the command run from the ROM; the prologue-party probe found the same bag and spell lists in RAMRevised after a check by a second AI model, 2026-11-08.Slot 0 is Maxim, 1 Selan, 3 Artea; Guy (slot 2) learns none. Lufia Forge's FinalPartyItems offset, 0x1BDE9, is the first give-item command's item byte; the command itself starts at 0x1BDE8.