data/claims/dw1.yamlDragon Warrior (nmikstas/dragon-warrior-disassembly)
Game: Dragon Warrior.
Dragon Quest (developer Chunsoft, publisher Enix) came out for the Famicom in Japan on 27 May 1986, and Dragon Warrior for the NES in North America in August 1989. dw1/release
Q2313869, P178 developer, P123 publisher, and P577 publication date qualified by P291 place and P400 platform — 1986-05-27 (Japan, NES/Famicom; day precision) and 1989-08 (North America, NES; month precision), read through the Query Service on 2026-10-20+1986-05-27T00:00:00Z … +1989-08-00T00:00:00ZCited by: Critical hit, Dragon Warrior, Fleeing, Hit chance, Random encounter, Turn order
Dragon Warrior's title screen reads "©1989 ENIX" and "LICENSED TO NINTENDO", by the disassembly's comments on the strings' tiles. dw1/title-screen
source_files/Bank00.asm#L7375-L7389; COPY 1 9 8 9 _ E N I X
LBF5D: .byte $62, $01, $09, $08, $09, $5F, $28, $31, $2C, $3B
…
; L I C E N S E D _ T O _ N I N T
LBF72: .byte $2F, $2C, $26, $28, $31, $36, $28, $27, $5F, $37, $32, $5F, $31, $2C, $31, $37
; E N D O
LBF82: .byte $28, $31, $27, $32Checked by claude, 2026-10-25 — read the two strings' bytes and the tile comments above them; the letters agree with TXT_UPR_A = $24 (Dragon_Warrior_Defines.asm L1133), but which tiles the title screen draws wasn't traced, so the reading rests on the commentsLowered from T3 on 2026-10-25: the evidence quoted only the annotator's tile comments. In the Rev 1 CHR bank whose tiles $01, $08, $09, and $24 to $3D match the comments' digits and letters (CHR $1000-$1FFF), tile $62 is a window-border piece, not ©, so the title screen may load other tiles or another bank; an emulator read of the title screen's nametable would settle it.
Cited by: Dragon Warrior
Rev 1 differs from the build of nmikstas's disassembly in three bytes of text and none of code; on its title screen "TRADEMARK TO NINTENDO" becomes "TRADEMARK OF NINTENDO". dw1/rev1-text
0x3FAE-0x3FAF — bank 0 $BF9E-$BF9F, the tiles for "OF"dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank00.asm#L7399-L7400; T M _ T R A D E M A R K _ T O _
LBF91: .byte $37, $30, $5F, $37, $35, $24, $27, $28, $30, $24, $35, $2E, $5F, $37, $32, $5FDragon Warrior (USA) (Rev 1) · 0xAF7C-0xAF7C — bank 2 $AF6C, $F0 where the disassembly has $EF, the plural code in "Thy Hit decreased"dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank02.asm#L2840-L2841LAF65: .byte $37, $11, $22, $5F, $2B, $12, $1D, $EF, $5F, $0D, $0E, $0C, $1B, $0E, $0A, $1CChecked by claude, 2026-10-25 — the earlier check assembled the four banks with Ophis (michaelcmartin/Ophis); they match the md5s in the repo's build_script, and against Rev 1 banks 1 and 3 are identical, bank 0 differs at $BF9E-$BF9F, and bank 2 at $AF6C (a plural code in "Thy Hit decreased"). Re-read 2026-10-25: Rev 1 has $32 $29 at $BF9E-$BF9F where LBF91 has $37 $32, the letters OF and TO with TXT_UPR_A = $24 (Dragon_Warrior_Defines.asm L1133)Banks 1 and 3 hold all the battle code cited here (bank 3 is fixed at $C000), so every Bank03.asm claim describes Rev 1 too.
Cited by: Damage formula, Dragon Warrior
UpdateRandNum steps a 16-bit state as , and battle code reads its high byte, RandNumUB. dw1/rng
About: Dragon Warrior Random number generator
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L668-L692UpdateRandNum:
…
LC563: ASL RandNumLB ;
LC565: ROL RandNumUB ;
…
LC57C: ADC #$81 ;Dragon Warrior (NES) Formulas · III.A, Common algorithms$9495 = $9495 * 771 + 0x81Checked by claude-agent, 2026-10-20 — traced L669-L691 (×3 by shift and add, ×257 by adding the low byte into the high, then +$81); probes/ff-dq/dw-battle.mjs runs the routine's instructions for all 65,536 states and gets 771s + 129Cited by: Dragon Warrior, Random number generator, RNG manipulation
GetJoypadStatus steps the generator each time it reads the controller. dw1/rng-joypad
About: Dragon Warrior Random number generator
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L805-L811GetJoypadStatus:
…
LC60A: PHA ;Prepare to update the random number by first saving registers
…
LC60E: JSR UpdateRandNum ;($C55B)Get random number.Dragon Warrior (NES) Formulas · IV, Frequently Asked QuestionsIf you sit by idly while waiting to make a command, the random generator is run 60 times per second.Checked by claude-agent, 2026-10-20 — read GetJoypadStatus; Bank03.asm calls it from 9 placesRyan8bit's guide adds that an idle menu runs the generator 60 times a second, so a command's outcome depends on when it is chosen.
Cited by: Dragon Warrior, Random number generator, RNG manipulation
Computed from the generator's update, its 65,536 states form two cycles of 32,768, and over each cycle the high byte takes every value exactly 128 times. dw1/rng-cycles
About: Dragon Warrior Random number generator
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L668-L692 — the routine the probe iteratesASL RandNumLB
ROL RandNumUB
CLC
ADC RandNumLB
…
ADC #$81Dragon Warrior (NES) Formulas · III.A, Common algorithmsThis makes 32,768 possibilities.Checked by claude-agent, 2026-10-25 — Read UpdateRandNum (Bank03.asm L668-692) at the pinned commit: shift, add, and add $81 on the 16-bit word, which the rng claim reduces to 771s + 129; the cycle walk and the high-byte counts are the probe's arithmetic on that formula, not a run of the ROM.Probe: probes/ff-dq/dw-battle.mjsBecause the high byte is uniform, sweeping all 65,536 states gives a routine's exact odds for a uniformly random state, which is how dw-battle.mjs measures every *-measured claim.
Cited by: Dragon Warrior, Random number generator
The hero's attack power is Strength plus the weapon's bonus; defense power is half of Agility, rounded down, plus the armor's and shield's bonuses, plus 2 with the Dragon's Scale. dw1/attack-power
About: Dragon Warrior Damage formula
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L8655-L8704LF0D9: ADC DisplayedStr ;Add bonus from weapons table to strength attribute.
LF0DB: STA DisplayedAttck ;
…
LF0DF: LSR ;Divide agility by 2 and add to defense attribute.
…
LF107: ADC #$02 ;Dragon's scale equipped. Add 2 to defense.Checked by claude-agent, 2026-10-20 — read AddItemBonuses from the weapon lookup to the Dragon's Scale bonusCited by: Dragon Warrior, Hit chance
PlyrCalcHitDmg takes , the hero's attack power less half the monster's defense byte; if , damage is for a random byte , so from to . dw1/hero-damage
About: Dragon Warrior Damage formula
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6719-L6722LE60C: LDA DisplayedAttck ;
LE60E: STA AttackStat ;Save a copy of the player's attack and enemy's defense.
LE610: LDA EnBaseDef ;
LE613: STA DefenseStat ;dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8491-L8500LEFE5: LSR DefenseStat ;
LEFE7: LDA AttackStat ;
LEFE9: SEC ; A = AttackStat - DefenseStat/2.
LEFEA: SBC DefenseStat ;
LEFEC: BCC PlyrWeakAttack ;
…
LEFEE: CMP #$02dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8541-L8560LF032: STA MultNum2LB ;A = A+1.
LF034: INC MultNum2LB ;
…
LF046: LDA MultRsltUB ;A = (A/256 + BaseAttack) / 4.
LF048: CLC ;
LF049: ADC BaseAttack ;
LF04B: ROR ;Total equation for normal attack damage:
LF04C: LSR ;Dragon Warrior (NES) Formulas · II.B, Hero attack formulas(HeroAttack - EnemyAgility / 2) / 4,Checked by claude-agent, 2026-10-20 — read L8491-L8500 and NormalAttack L8541-L8560 (ROR keeps the add's carry, LSR halves again); the comments at L8498-L8500 sit one line off their branches, but the code branches to NormalAttack when X ≥ 2nmikstas names the monster's second stat byte EnBaseDef; Ryan8bit calls the same byte Agility, because run checks also use it (run).
Cited by: Damage formula, Dragon Warrior, Multi-hit attack
When , the hero deals 0 or 1 damage, each half the time. dw1/hero-weak
About: Dragon Warrior Damage formula
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L8533-L8539LF02B: AND #$01 ;Player is too weak to fight this enemy. 50% chance
LF02D: STA CalcDamage ;of doing 1 point of damage or 50% chance of missing.Checked by claude-agent, 2026-10-20 — read PlyrWeakAttackCited by: Damage formula, Dragon Warrior
Zero damage from the hero ends the turn as a failed attack, before any dodge check. dw1/zero-damage-fails
About: Dragon Warrior Hit chance
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6761-L6773LE651: JSR PlyrCalcHitDmg ;($EFE5)Calculate the damage player will do to the enemy.
LE654: LDA CalcDamage ;Did player do damage to the enemy?
LE656: BNE SetEnDmg1 ;If so, branch.
…
LE661: JMP StartEnemyTurnChecked by claude-agent, 2026-10-20 — read ChkPlyrMissCited by: Dragon Warrior, Hit chance
Before the normal formula, a 1-in-32 roll gives the hero an "excellent move", except against either form of the Dragonlord; it deals for a random byte , from to (more than half to all of the attack power), and ignores defense. dw1/excellent-move
About: Dragon Warrior Critical hit
Value
{
"chance": [
1,
32
]
}source_files/Bank03.asm#L6724-L6759LE617: CMP #EN_DRAGONLORD1 ;
…
LE61D: BEQ ChkPlyrMiss ;If so, branch. no excellent moves permitted.
…
LE624: AND #$1F ;Did player get an excellent move(1/32 chance)?
…
LE63B: LDA DisplayedAttck ;
LE63D: LSR ;A = DisplayedAttack/2 * rnd(255).
…
LE64B: SEC ;Damage=DisplayedAttack-(DisplayedAttack/2 * rnd(255))/256.
LE64C: SBC MultRsltUB ;Dragon Warrior (NES) Formulas · II.B, Hero attack formulasExcellent moves have a 1/32 chance of happening per attackChecked by claude-agent, 2026-10-20 — read PlyrFight from the attack copy to the jump into SetEnDmg1The excellent move then joins the normal path at SetEnDmg1, so the monster's dodge check applies to it too (dodge).
Cited by: Critical hit, Damage formula, Dragon Warrior
After the damage is set, an awake monster dodges when a roll of 0–63 falls below , the low nibble of its resistance byte, a chance of ; a sleeping monster never dodges, and spells skip the check. dw1/dodge
About: Dragon Warrior Hit chance
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6775-L6796LE66A: BIT PlayerFlags ;Is the enemy asleep?
LE66C: BVS PlyrHitEn ;If so, branch. Enemy can't dodge.
…
LE673: AND #$3F ;Get a random number and keep lower 6 bits(0-63).
…
LE677: LDA EnBaseMDef ;Does enemy have magic defense?
LE67A: AND #$0F ;
LE67C: BEQ PlyrHitEn ;If not, branch. Enemy can't dodge.
…
LE67F: SBC #$01
…
LE681: CMP RandNumUB ;
…dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L6809-L6814SetSpellDmg:
LE694: STA EnDamage ;
LE696: LDA #$00 ;Set the damage the player will do. Enemy can't dodge spells.
…
PlyrHitEn:Dragon Warrior (NES) Formulas · III.C, CombatThe second nibble / 64 is the chance of dodgingChecked by claude-agent, 2026-10-20 — read L6775-L6796; the attack lands when the roll exceeds d - 1, so it is dodged for rolls 0 to d - 1, which is d of 64nmikstas's comment at L6796 gives the top chance as "22% (14/63)"; by the code a nibble of 15 dodges 15 times in 64, 23.4%.
Cited by: Critical hit, Damage formula, Dragon Warrior, Hit chance, Multi-hit attack
EnCalcHitDmg takes , the monster's attack less half the hero's defense power; if , it uses the hero's normal formula, and otherwise the monster deals , from 0 to about . dw1/monster-damage
About: Dragon Warrior Damage formula
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L7761-L7765LEBCD: LDA EnBaseAtt ;Make a copy of enemy's attack stat.
LEBD0: STA AttackStat ;
LEBD2: LDA DisplayedDefns ;Make a copy of player's defense stat.
LEBD4: STA DefenseStat ;
LEBD6: JSR EnCalcHitDmgdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8502-L8531LEFF4: LSR DefenseStat ;
LEFF6: LDA AttackStat ;
LEFF8: LSR ;A = AttackStat - DefenseStat/2.
LEFF9: STA MultNum2LB ;
LEFFB: INC MultNum2LB ;
…
LF004: CMP MultNum2LB ;Is enemy AttackStat more than 2X player DefenseStat?
LF006: BCS NormalAttack ;If so, branch to do normal attack damage.
…
LF01B: ADC #$02 ;
…
LF01F: LDA #$03Dragon Warrior (NES) Formulas · III.C, CombatSo the end result is floor(((((EnemyStrength >> 1 + 1) * RAND) >> 8) + 2) / 3).Checked by claude-agent, 2026-10-20 — read EnPhysAttack's setup and EnCalcHitDmg; the weak path multiplies the random byte by MultNum2LB, which still holds ⌊A/2⌋ + 1 from L8505-L8507, not by Xnmikstas's comment at L8529 writes the weak formula with AttackStat - DefenseStat/2; the multiply uses ⌊A/2⌋ + 1, as Ryan8bit's guide also has it.
Cited by: Damage formula, Dragon Warrior
A monster's physical attack has no critical branch and no dodge roll for the hero; EnPhysAttack goes straight to EnCalcHitDmg, and only 0 damage misses. dw1/monster-no-critical
About: Dragon Warrior Critical hit
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L7751-L7774LEBD6: JSR EnCalcHitDmg ;($EFF4)Calculate enemy hit damage on player.
…
LEBD9: LDA CalcDamage ;Did enemy do damage to the player?
LEBDB: BNE EnHitsPlayer ;If so, branch to subtract damage from player's HP.Checked by claude-agent, 2026-10-20 — read EnPhysAttack from the attack sound to the miss textCited by: Damage formula, Dragon Warrior, Hit chance
A monster's HP is its base value less up to a quarter, ; the Dragonlord's final form always has its base HP. dw1/monster-hp
About: Dragon Warrior Damage formula
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6614-L6652LE583: LDA EnNumber ;Is this the end boss?
LE585: CMP #EN_DRAGONLORD2 ;
…
LE599: LDA EnBaseHP ;Prepare to multiply enemy HP by random number(0 to 255).
…
LE5B0: LSR ;Take upper byte of result and divide it by 4.
LE5B1: LSR ;
…
LE5B8: SBC MultRsltLB ;Checked by claude-agent, 2026-10-20 — read the fight setup from the end-boss check to SetEnHPCited by: Dragon Warrior
The hero's Hurt deals 5–12 damage and Hurtmore 58–65, whatever the stats on either side; a roll of 0–15 below the high nibble of the monster's resistance byte blocks the spell instead. dw1/hero-spells
About: Dragon Warrior Damage formula
Value
{
"hurt": [
5,
12
],
"hurtmore": [
58,
65
]
}source_files/Bank03.asm#L6924-L6960LE73A: LDA EnBaseMDef ;
…
LE741: JSR ChkSpellFail ;($E946)Check if the spell will fail or succeed.
…
LE749: AND #$07 ;Hurt will do between 5 and 12 damage.
LE74B: CLC ;
LE74C: ADC #$05 ;
…
LE764: AND #$07 ;Hurtmore will do between 58 and 65 damage.
LE766: CLC ;
LE767: ADC #$3A ;dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L7306-L7316LE94D: AND #$0F ;
…
LE94F: CMP GenByte3E ;Is the spell test byte greater than the random number?
LE951: BCC SpellFailed ;If so, branch. The spell failed.Checked by claude-agent, 2026-10-20 — read the Hurt and Hurtmore branches of PlyrPrepSpell and ChkSpellFailCited by: Damage formula, Dragon Warrior
A monster's Hurt deals 3–10 damage and Hurtmore 30–45; Magic Armor or Erdrick's Armor cuts either to . dw1/monster-spells
About: Dragon Warrior Damage formula
Value
{
"hurt": [
3,
10
],
"hurtmore": [
30,
45
]
}source_files/Bank03.asm#L7821-L7867LEC2F: AND #$07 ;Keep 3 bits of random number(0-7).
LEC31: CLC ;
LEC32: ADC #$03
…
LEC3E: CMP #AR_MAGIC_ARMR ;Does player have magic armor?
…
LEC4F: ASL ;Multiply player damage by 2. Result is 2/3 damage.
…
LEC61: AND #$0F ;
LEC63: CLC ;Add 30.
LEC64: ADC #$1EChecked by claude-agent, 2026-10-20 — read EnCastHurt through EnCastHurtmorenmikstas's comment at L7830 says Hurt does "between 7 and 10"; the code adds 3 to 0–7.
Cited by: Dragon Warrior
At the start of a battle, CalcWhoIsNext gives the hero the first turn when Agility × a random byte is at least the monster's defense byte × a roll of 0–63; otherwise the monster attacks first. dw1/first-turn
About: Dragon Warrior Turn order
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6654-L6663LE5BF: JSR CalcWhoIsNext ;($EEC0)Randomly calculate who attacks next.
…
LE5C2: BCS StartPlayerTurn ;($E5CE)It's the player's turn to attack.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8290-L8325LEEC5: AND #$3F ;Keep only lower 6 bits(0-63).
…
LEEC9: LDA EnBaseDef ;
…
LEEE6: LDA DisplayedAgi ;
…
LEEF5: SEC ;Subtract the enemy's defense*rnd from player's agility*rnd.Checked by claude-agent, 2026-10-20 — read the fight start and CalcWhoIsNext through CalcNextOddsCited by: Dragon Warrior, Fleeing, Hit chance, Turn order
TryRun lets the hero escape when Agility × a random byte is at least the monster's defense byte × a roll whose range grows with the monster: 0–63 from Slime to Druinlord, 0–94 from Drollmagi to Werewolf, 0–127 from Green Dragon to Blue Dragon, and 0–255 from Stoneman on. Running from a sleeping monster always works. dw1/run
About: Dragon Warrior Fleeing
Value
{
"groups": [
[
0,
63
],
[
0,
94
],
[
0,
127
],
[
0,
255
]
],
"firstMonster": [
0,
20,
30,
35
]
}source_files/Bank03.asm#L7191-L7195LE894: BIT PlayerFlags ;Is the enemy asleep?
LE896: BVS RunSuccessful ;If so, branch for a successful run.
…
LE898: JSR TryRun ;($EE91)Determine if player can run.
LE89B: BCS RunSuccessfuldragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8256-L8293LEE96: CMP #EN_STONEMAN ;Dragonlord 1 or Dragonlord 2?
…
LEE9A: LDA RandNumUB ;Load a random number and keep all the bits(0-255).
…
LEE9F: CMP #EN_GDRAGON
…
LEEA5: AND #$7F
…
LEEAA: CMP #EN_DROLLMAGI
…
LEEAC: BCC CalcWhoIsNext ;If not, branch.
…
…The atlas reads this differently: BCC branches below EN_STONEMAN, so this group starts at Stoneman: Stoneman through Dragonlord 2 draw the full byte, 0–255.The atlas reads this differently: The compare with EN_GDRAGON makes this group Green Dragon through Blue Dragon, which draw 0–127; Stoneman went to the full byte above.The atlas reads this differently: This group is Drollmagi through Werewolf: EN_DROLLMAGI is its lower bound, and Green Dragon is in the group above.The atlas reads this differently: A 6-bit byte plus a 5-bit byte gives 0–94, not 0–95.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Dragon_Warrior_Defines.asm#L970-L986.alias EN_DRUINLORD $13 ;Druinlord.
.alias EN_DROLLMAGI $14 ;Drollmagi.
…
.alias EN_GDRAGON $1E ;Green dragon.
…
.alias EN_STONEMAN $23 ;Stoneman.Dragon Warrior (NES) Formulas · II.B, RunningGroup 1: #00 (Slime) - #19 (Druinlord)Checked by claude-agent, 2026-10-20 — read PlyrRun and TryRun into CalcNextOdds; the third group adds 0-63 and 0-31, so 0-94 (the comment says 0-95), plus the carry UpdateRandNum leaves, which is set only in states where the second byte is 0nmikstas's comments name the groups one monster off (Stoneman is in the last group, not the one before). The first group goes through CalcWhoIsNext, so it draws one byte more than the others and uses the same test as first-turn.
Cited by: Dragon Warrior, Fleeing, Hit chance, Random encounter, Turn order
Measured in the ROM over all 65,536 generator states, with Agility 40 against a defense byte of 40, the hero escapes 87.70% of the time from the first group, 81.64% from the second, 75.20% from the third, and 50.20% from the fourth; the hero takes the first turn 87.70% of the time. dw1/run-measured
About: Dragon Warrior Fleeing
Value
{
"probe": {
"run-slime": {
"states": 57474
},
"run-drollmagi": {
"states": 53506
},
"run-green-dragon": {
"states": 49282
},
"run-stoneman": {
"states": 32898
},
"first-turn": {
"states": 57474
}
}
}0xEEA1-0xEF0C — bank 3 $EE91-$EEFC, TryRun through CalcNextOdds, the code the probe callsdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8256-L8325 — TryRun and CalcWhoIsNext, called by the probe at $EE91 and $EEC0LDA RandNumUB
AND #$7F
…
LDA EnBaseDef
…
JSR WordMultiply
…
LDA DisplayedAgi
…
SBC GenWord42LB
LDA MultRsltUB
SBC GenWord42UBThe atlas reads this differently: BCC branches below EN_STONEMAN, so this group starts at Stoneman: Stoneman through Dragonlord 2 draw the full byte, 0–255. (dw1/run)The atlas reads this differently: The compare with EN_GDRAGON makes this group Green Dragon through Blue Dragon, which draw 0–127; Stoneman went to the full byte above. (dw1/run)The atlas reads this differently: This group is Drollmagi through Werewolf: EN_DROLLMAGI is its lower bound, and Green Dragon is in the group above. (dw1/run)The atlas reads this differently: A 6-bit byte plus a 5-bit byte gives 0–94, not 0–95. (dw1/run)Checked by claude-agent, 2026-10-25 — Read TryRun, CalcWhoIsNext, and CalcNextOdds (Bank03.asm L8256-8325) at the pinned commit: the random byte is masked by enemy group, multiplied by the enemy's defense, and compared with a second byte times the hero's agility; the percentages are the probe's run of those routines in the ROM over every generator state.Probe: probes/ff-dq/dw-battle.mjsCited by: Dragon Warrior, Fleeing, Random number generator, Turn order
Measured in the ROM over all 65,536 generator states, attack power 60 against a defense byte of 40 deals 10–20 damage, each of 10 to 19 in 25 of 256 rolls and 20 in 6; attack power 20 deals 0 or 1, half each. dw1/hero-damage-measured
About: Dragon Warrior Damage formula
Value
{
"probe": {
"hero-normal": {
"atk": 60,
"def": 40,
"min": 10,
"max": 20
},
"hero-weak": {
"atk": 20,
"def": 40,
"min": 0,
"max": 1
}
}
}0xEFF5-0xF05F — bank 3 $EFE5-$F04F, PlyrCalcHitDmg through NormalAttackdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8491-L8560 — PlyrCalcHitDmg, called by the probe at $EFE5LSR DefenseStat
LDA AttackStat
SEC
SBC DefenseStat
BCC PlyrWeakAttack
…
AND #$01
STA CalcDamage
…
ADC BaseAttack
ROR
LSR
…Checked by claude-agent, 2026-10-25 — Read PlyrCalcHitDmg, PlyrWeakAttack, and NormalAttack (Bank03.asm L8491-8560) at the pinned commit: attack minus half defense, a coin flip for a weak hero, otherwise (rnd × (A+1) / 256 + A) / 4; the histograms are the probe's run of that code in the ROM over every generator state.Probe: probes/ff-dq/dw-battle.mjsCited by: Dragon Warrior
Measured the same way, a monster's attack of 90 against defense power 60 deals 15–30 damage, and an attack of 20 against defense power 40 deals 0–4, mostly 1–3. dw1/monster-damage-measured
About: Dragon Warrior Damage formula
Value
{
"probe": {
"monster-normal": {
"atk": 90,
"def": 60,
"min": 15,
"max": 30
},
"monster-weak": {
"atk": 20,
"def": 40,
"min": 0,
"max": 4
}
}
}0xF004-0xF05F — bank 3 $EFF4-$F04F, EnCalcHitDmg through NormalAttackdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L8502-L8560 — EnCalcHitDmg, called by the probe at $EFF4LSR DefenseStat
LDA AttackStat
LSR
STA MultNum2LB
INC MultNum2LB
…
CMP MultNum2LB
BCS NormalAttack
…
LDA MultRsltUB
CLC
ADC #$02
…Checked by claude-agent, 2026-10-25 — Read EnCalcHitDmg, EnWeakAttack, and NormalAttack (Bank03.asm L8502-8560) at the pinned commit: attack/2 + 1 goes to MultNum2LB (L8503-8507); a normal hit when attack minus half defense reaches it, otherwise the weak attack multiplies the roll by attack/2 + 1, giving (rnd × (attack/2+1) / 256 + 2) / 3; the ranges are the probe's run of that code in the ROM over every generator state.Probe: probes/ff-dq/dw-battle.mjsCited by: Dragon Warrior
At the start of a battle and before each monster turn, CheckEnRun gives the monster a 1-in-4 chance to flee when half the hero's Strength is at least the monster's attack. dw1/monster-flees
About: Dragon Warrior Fleeing
Value
{
"chance": [
1,
4
]
}source_files/Bank03.asm#L8455-L8467LEFB7: LDA DisplayedStr ;Is player's strength at least double the enemy's attack?
LEFB9: LSR ;
LEFBA: CMP EnBaseAtt ;
LEFBD: BCC EnRunExit ;If not, branch. Enemy will not run.
…
LEFC4: AND #$03 ;Player is very strong. 25% chance enemy will run.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L6654LE5BC: JSR CheckEnRun ;($EFB7)Check if enemy is going to run away.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L7682-L7683LEB48: JSR CheckEnRun ;($EFB7)Check if enemy is going to run away.Checked by claude-agent, 2026-10-20 — read CheckEnRun and both call sitesCited by: Dragon Warrior, Fleeing
Each step on the map draws a byte and starts a fight when its masked bits are all 0: 1 in 8 on sand and hills, 1 in 16 in swamp, forest, brick, and barrier squares, and on other terrain 1 in 32 where the X and Y coordinates are both even or both odd, 1 in 16 elsewhere. dw1/encounter-rate
About: Dragon Warrior Random encounter
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L1887-L1888LCDA2: JSR UpdateRandNum ;($C55B)Get random number.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L1948-L1981LCDFB: LDA #$0F ;Get random number.
…
LCDFD: AND RandNumUB ;Is lower nibble 0?
LCDFF: BEQ DoRandomFight ;If so, branch to start a random fight.
…
LCE02: CMP #BLK_SAND ;Is the player on a sand block?
…
LCE06: CMP #BLK_HILL ;Is the player on a hill block?
…
LCE13: LDA #$07 ;Twice as likely to get into a fight in the sandy areas!
…
LCE17: CMP #BLK_TREES ;Is player on a tree block?
…dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L2020-L2045LCE63: LDA CharXPos ;Is character on an odd X map position?
…
LCE74: LDA #$1F ;Higher chance for fight. Check 5 bits instead of 4.
…
LCE78: LDA #$0FChecked by claude-agent, 2026-10-20 — read CheckBlockDmg from the per-step random draw through NormFightChance; swamp falls into ChkFight (mask $0F) after its damage checknmikstas's comment at L2040 calls the $1F mask the higher chance; five zero bits are half as likely as four. Towns and other maps without enemies return later, in DoRandomFight.
Cited by: Dragon Warrior, Random encounter
On the overworld's zone 0, the slime-only region around Tantegel Castle, a second byte lets only half of those fights through, and a quarter on hills. dw1/encounter-zone-0
About: Dragon Warrior Random encounter
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L2093-L2114LCEBD: AND #$0F ;data from OvrWrldEnGrid.
LCEBF: BNE GetEnemyRow ;
…
LCECC: AND #$03 ;Do another check to avoid the fight. 25% chance the fight
LCECE: BEQ GetEnemyRow ;may not happen. Is fight going to happen?
…
LCED3: AND #$01 ;Do another check to avoid the fight. 50% chance the fight
LCED5: BEQ GetEnemyRowThe atlas reads this differently: AND #$03 lets the fight through only when both low bits are 0, one time in four, so on hills three of these fights in four don't happen.Dragon Warrior (NES) Formulas · II.A, EncountersIn the zones where you fight only Slimes and Red Slimes around Tantegel (which I call Zone 0), the encounter rates are significantly lower.Checked by claude-agent, 2026-10-20 — read the zone lookup's end and both modifiers; on hills a fight needs both low bits 0 (1 in 4), although nmikstas's comment reads it as a 25% chance to avoid the fightCited by: Dragon Warrior, Random encounter
After the first turn, the hero and the monster alternate; each of the hero's actions ends by jumping to StartEnemyTurn, and each of the monster's to StartPlayerTurn. dw1/turns-alternate
About: Dragon Warrior Turn order
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L6803-L6807LE68D: JSR DoDialogHiBlock ;($C7C5)It is dodging!...
LE690: .byte $0A ;TextBlock17, entry 10.
LE691: JMP StartEnemyTurn ;($EB1B)It's the enemy's turn to attack.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L7772-L7777LEBE2: JSR DoDialogLoBlock ;($C7CB)A miss! no damage hath been scored...
LEBE5: .byte $FB ;TextBlock16, entry 11.
LEBE6: JMP StartPlayerTurn ;($E5CE)It's the player's turn to attack.Checked by claude-agent, 2026-10-20 — listed every jump to StartEnemyTurn and StartPlayerTurn in Bank03.asm; the six jumps back to StartPlayerTurn inside the hero's turn (L6855-L7027) re-prompt after an unlearned spell, an aborted menu, an invalid spell, too little MP, or no items, without spending the turnCited by: Dragon Warrior, Turn order
A failed run prints "But was blocked in front" and passes the turn to the monster. dw1/run-fail
About: Dragon Warrior Fleeing
Codedragon-warrior-disassembly: NES Dragon Warrior software disassembly ·source_files/Bank03.asm#L7194-L7200LE898: JSR TryRun ;($EE91)Determine if player can run.
LE89B: BCS RunSuccessful ;Was player able to run? If so, branch.
LE89D: JSR DoDialogLoBlock ;($C7CB)But was blocked in front...
…
LE8A1: JMP StartEnemyTurn ;($EB1B)It's the enemy's turn to attack.Checked by claude-agent, 2026-10-20 — read PlyrRun from the sleep check to the jumpCited by: Dragon Warrior, Fleeing
The NES manual advises running away when the hero's HP is close to 0, calling it “a very important ‘fighting’ technique”. dw1/manual-run
About: Dragon Warrior Fleeing
ManualDragon Warrior instruction booklet (NES, North America) ·p. 13, Entering Commands During Fighting Mode, RunSo run away if you think you're dangerously close to that point. Remember, running away can be a very important “fighting” technique.Checked by claude-agent, 2026-10-20 — read on the scan (PDF page 8); that point is 0 HP, per the sentence beforeCited by: Fleeing
The NES manual says Agility helps the hero escape: "This means that you can more easily avoid the enemy or run away." dw1/manual-agility
About: Dragon Warrior Fleeing
ManualDragon Warrior instruction booklet (NES, North America) ·p. 15, AgilityYour character becomes faster at higher levels. This means that you can more easily avoid the enemy or run away.Checked by claude-agent, 2026-10-20 — read on the scan (PDF page 9)In the code, Agility enters the run and first-turn tests and the hero's defense power (run, first-turn, attack-power); no roll lets the hero dodge (monster-no-critical).
Cited by: Fleeing, Hit chance, Turn order
The NES manual describes encounters as meeting a monster on the map: "If you happen to bump into one of them, the game will automatically enter the fight mode." dw1/manual-encounters
About: Dragon Warrior Random encounter
ManualDragon Warrior instruction booklet (NES, North America) ·p. 13, Entering Commands During Fighting ModeWhen you leave a castle or town, lots of monsters will come out to attack you. If you happen to bump into one of them, the game will automatically enter the fight mode.Checked by claude-agent, 2026-10-20 — read on the scan (PDF page 8)The map holds no monsters to bump into; a per-step roll starts each fight (encounter-rate).
Cited by: Random encounter
The NES manual's terrain guide says fewer monsters live on plains, more lurk in forests, and mountains bring "many enemies". dw1/manual-terrain
About: Dragon Warrior Random encounter
ManualDragon Warrior instruction booklet (NES, North America) ·p. 16, Getting to Know the TerrainYou can walk about normally as fewer monsters live here.Dragon Warrior instruction booklet (NES, North America) · p. 16, ForestsBut more monsters are lurking here.Dragon Warrior instruction booklet (NES, North America) · p. 17, MountainsMountains will slow you down a bit. More importantly you'll come across many enemies.Checked by claude-agent, 2026-10-20 — read on the scan (PDF pages 9 and 10)The manual's passable "Mountains" are the hill squares of nmikstas's labels (BLK_HILL); its "Craggy mountains" are impassable. The order matches the code's rates, 1 in 8 on hills and 1 in 16 in forest (encounter-rate).
Cited by: Random encounter
The dodge nibble of the 40 monsters (each dodges of the hero's attacks, dodge) is 1 or 2 for 27 of them; the Demon Knight's is 15, the Werewolf's 7, the Poltergeist's and Drakeema's 6, six monsters' 4, and the Golem's and both Dragonlord forms' 0. dw1/monster-dodge
About: Dragon Warrior Hit chance
Value
{
"of": 64,
"byD": {
"0": 3,
"1": 12,
"2": 15,
"4": 6,
"6": 2,
"7": 1,
"15": 1
},
"byMonster": {
"Slime": 1,
"Red Slime": 1,
"Drakee": 1,
"Ghost": 4,
"Magician": 1,
"Magidrakee": 1,
"Scorpion": 1,
"Druin": 2,
"Poltergeist": 6,
"Droll": 2,
"Drakeema": 6,
"Skeleton": 4,
"Warlock": 2,
"Metal Scorpion": 2,
"Wolf": 2,
"Wraith": 4,
"Metal Slime": 1,
"Specter": 4,
"Wolflord": 2,
"Druinlord": 4,
"Drollmagi": 1,
"Wyvern": 2,
"Rogue Scorpion": 2,
"Wraith Knight": 4,
"Golem": 0,
"Goldman": 1,
"Knight": 1,
"Magiwyvern": 2,
"Demon Knight": 15,
"Werewolf": 7,
"Green Dragon": 2,
"Starwyvern": 2,
"Wizard": 2,
"Axe Knight": 1,
"Blue Dragon": 2,
"Stoneman": 1,
"Armored Knight": 2,
"Red Dragon": 2,
"Dragonlord": 0,
"Dragonlord True Self": 0
}
}source_files/Bank01.asm#L4425-L4442;The following table contains the stats for the enemies. There are 16 bytes per enemy.
…
;Mdef - Enemy's magical defense.
…
EnStatTbl:
;Enemy $00-Slime.
; Att Def HP Spel Agi Mdef Exp Gld |--------------Unused--------------|
L9E4B: .byte $05, $03, $03, $00, $0F, $01, $01, $02, $69, $40, $4A, $4D, $FA, $FA, $FA, $FAdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank01.asm#L4504-L4506;Enemy $10-Metal slime.
…
L9F4B: .byte $0A, $FF, $04, $03, $FF, $F1, $73, $06, $3F, $47, $43, $69, $40, $4A, $4D, $FAdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank01.asm#L4552-L4554;Enemy $1C-Demon Knight.
…
LA00B: .byte $4F, $40, $32, $00, $FF, $FF, $25, $96, $0F, $12, $F8, $22, $10, $15, $FA, $FAdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank01.asm#L3873-L3874L9975:* LDA (GenPtr3C),Y ;Use the general pointer to load the enemy data.
L9977: STA EnBaseAtt,Y ;dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Dragon_Warrior_Defines.asm#L550-L573.alias EnBaseAtt $0100 ;Enemy base attack attibute.
…
.alias EnBaseMDef $0105 ;Enemy base magic defense.Dragon Warrior (NES) Formulas · II.B, Combat, monster list (#28 Demon Knight)Dodge is the chance that the enemy will dodge any physical attack.Checked by claude-agent, 2026-10-21 — read all 40 rows of EnStatTbl (L4439-L4598) and took the low nibble of the sixth byte, which LoadEnemyStats copies to EnBaseAtt+5, EnBaseMDef, the byte the dodge check masks with $0F; Ryan8bit's monster list gives the same 40 values, in the same ordernmikstas's column label is Mdef; the byte also holds the Hurt resistance in its high nibble (monster-hurt-resist). His row labels read "Metal slime" and "Rouge Scorpion"; the value uses the names from Ryan8bit's list. The Metal Slime's dodge is 1/64, like a Slime's.
Cited by: Dragon Warrior
The high nibble of the same byte blocks Hurt and Hurtmore of the time (hero-spells); it is 0 for 26 of the 40 monsters and 15 for seven, the Metal Slime, Golem, Demon Knight, Wizard, Red Dragon, and both Dragonlord forms. dw1/monster-hurt-resist
About: Dragon Warrior Hit chance
Value
{
"of": 16,
"byH": {
"0": 26,
"1": 3,
"2": 1,
"3": 1,
"7": 2,
"15": 7
},
"byMonster": {
"Metal Slime": 15,
"Wraith Knight": 3,
"Golem": 15,
"Demon Knight": 15,
"Green Dragon": 2,
"Starwyvern": 1,
"Wizard": 15,
"Axe Knight": 1,
"Blue Dragon": 7,
"Stoneman": 7,
"Armored Knight": 1,
"Red Dragon": 15,
"Dragonlord": 15,
"Dragonlord True Self": 15
},
"others": 0
}source_files/Bank03.asm#L6927-L6941LE73A: LDA EnBaseMDef ;
LE73D: LSR ;
…
LE73F: LSR ;
…
LE741: JSR ChkSpellFail ;($E946)Check if the spell will fail or succeed.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank01.asm#L4504-L4506L9F4B: .byte $0A, $FF, $04, $03, $FF, $F1, $73, $06, $3F, $47, $43, $69, $40, $4A, $4D, $FADragon Warrior (NES) Formulas · II.B, Combat, monster listHURT and HURTMORE have the same chance.Checked by claude-agent, 2026-10-21 — took the high nibble of the sixth byte of each EnStatTbl row (L4439-L4598); the Hurt branch shifts EnBaseMDef right four times before ChkSpellFail; Ryan8bit's "HURT resist" values matchbyMonster lists the 14 monsters with a nonzero nibble; the other 26 have 0.
Each fight picks one of its zone's five monster slots with equal chance; zone 0, around Tantegel Castle, holds three Slime slots and two Red Slime slots, and zone 1 adds a Drakee, all with dodge 1. dw1/opening-monsters
About: Dragon Warrior Hit chance
Value
{
"slots": 5,
"zone0": {
"Slime": 3,
"Red Slime": 2
},
"zone1": {
"Red Slime": 3,
"Slime": 1,
"Drakee": 1
},
"dodge": {
"Slime": 1,
"Red Slime": 1,
"Drakee": 1
}
}source_files/Bank03.asm#L2165-L2175GetEnemyInRow:
…
LCF12: AND #$07 ;Keep only 3 LSBs. Is number between 0 and 4? If not, branch
LCF14: CMP #$05 ;to get another random number as there are only 5 enemy slots
LCF16: BCS GetEnemyInRow ;per enemy zone.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L9064-L9072;The map is divided into an 8X8 grid. Each nibble from the table below corresponds to a grid.
…
LF52A: .byte $41, $00, $23, $45
LF52E: .byte $51, $1C, $66, $66dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L9090-L9092EnemyGroupsTbl:
LF54F: .byte EN_SLIME, EN_RSLIME, EN_SLIME, EN_RSLIME, EN_SLIME
LF554: .byte EN_RSLIME, EN_SLIME, EN_RSLIME, EN_DRAKEE, EN_RSLIMEDragon Warrior (NES) Formulas · II.A, EncountersIn the zones where you fight only Slimes and Red Slimes around Tantegel (which I call Zone 0), the encounter rates are significantly lower.Checked by claude-agent, 2026-10-21 — read GetEnemyInRow (a 3-bit roll redrawn until it is below 5), OvrWrldEnGrid, where zone 0 fills two cells of the third grid row, and the first two rows of EnemyGroupsTbl; dodge values from monster-dodgeZone 0's lower encounter rate is encounter-zone-0.
The Demon Knight, the hardest monster to hit at 15/64, fills one of the five slots in overworld zones 10, 11, and 12; the Werewolf, at 7/64, fills one in zone 12 and in zone 13, which Hauksness also uses, and one on the Dragonlord's castle ground floor. dw1/evasive-monsters
About: Dragon Warrior Hit chance
Value
{
"Demon Knight": {
"d": 15,
"zones": [
10,
11,
12
],
"slotsPerZone": 1
},
"Werewolf": {
"d": 7,
"zones": [
12,
13,
16
],
"slotsPerZone": 1
},
"slots": 5
}source_files/Bank03.asm#L9101-L9104LF581: .byte EN_WYVERN, EN_RSCORPION, EN_WKNIGHT, EN_KNIGHT, EN_DKNIGHT
LF586: .byte EN_WKNIGHT, EN_KNIGHT, EN_MAGIWYVERN, EN_DKNIGHT, EN_MSLIME
LF58B: .byte EN_KNIGHT, EN_MAGIWYVERN, EN_DKNIGHT, EN_WEREWOLF, EN_STARWYVERN
LF590: .byte EN_WEREWOLF, EN_GDRAGON, EN_STARWYVERN, EN_STARWYVERN, EN_WIZARDdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L9109LF59F: .byte EN_WEREWOLF, EN_GDRAGON, EN_STARWYVERN, EN_WIZARD, EN_AXEKNIGHTdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L2119-L2128LCED8: CMP #MAP_DLCSTL_GF ;Is player on ground floor of the dragonlord's castle?
…
LCEDC: LDA #$10 ;If so, load proper offset to enemy data row in EnemyGroupsTbl.
…
LCEE0: CMP #MAP_HAUKSNESS ;Is player in Hauksness?
…
LCEE4: LDA #$0D ;If so, load proper offset to enemy data row in EnemyGroupsTbl.Checked by claude-agent, 2026-10-21 — read EnemyGroupsTbl rows $0A-$0D and $10 and the dungeon checks that send the castle's ground floor to row $10 and Hauksness to row $0D; dodge values from monster-dodgeZone 11 also holds the Metal Slime, whose dodge is 1/64. In OvrWrldEnGrid, zone 12 fills the grid cell just south of one of zone 0's.
The Dragonlord's castle's six sublevels draw from three rows, Werewolf, Green Dragon, Starwyvern, Wizard, and Axe Knight on the first; Wizard, Axe Knight, two Blue Dragons, and Stoneman on the next three; and Wizard, Stoneman, two Armored Knights, and Red Dragon on the last two and the bottom floor. Apart from the Werewolf's 7, their dodge nibbles are 1 or 2. dw1/late-monsters
About: Dragon Warrior Hit chance
Value
{
"rows": {
"16": [
"Werewolf",
"Green Dragon",
"Starwyvern",
"Wizard",
"Axe Knight"
],
"17": [
"Wizard",
"Axe Knight",
"Blue Dragon",
"Blue Dragon",
"Stoneman"
],
"18": [
"Wizard",
"Stoneman",
"Armored Knight",
"Armored Knight",
"Red Dragon"
]
},
"dodge": {
"Werewolf": 7,
"Green Dragon": 2,
"Starwyvern": 2,
"Wizard": 2,
"Axe Knight": 1,
"Blue Dragon": 2,
"Stoneman": 1,
"Armored Knight": 2,
"Red Dragon": 2
}
}source_files/Bank03.asm#L9078-L9082;The following table dictates what random encounters will happen in the dungeons. The indexes
;into the table correspond to the order of the caves starting with map number #$0F and ending
;with map number #$1B. Each byte corresponds to a row in the EnemyGroupsTbl below.
…
CaveEnIndexTbl:dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L9083LF542: .byte $10, $11, $11, $11, $12, $12, $13, $13, $0E, $0E, $07, $0F, $0Fdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Dragon_Warrior_Defines.asm#L1007-L1012.alias MAP_DLCSTL_SL1 $0F ;Dragonlord castle, sublevel 1.
…
.alias MAP_DLCSTL_SL6 $14 ;Dragonlord castle, sublevel 6.dragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L9109-L9111LF59F: .byte EN_WEREWOLF, EN_GDRAGON, EN_STARWYVERN, EN_WIZARD, EN_AXEKNIGHT
LF5A4: .byte EN_WIZARD, EN_AXEKNIGHT, EN_BDRAGON, EN_BDRAGON, EN_STONEMAN
LF5A9: .byte EN_WIZARD, EN_STONEMAN, EN_ARMORKNIGHT, EN_ARMORKNIGHT, EN_RDRAGONdragon-warrior-disassembly: NES Dragon Warrior software disassembly · source_files/Bank03.asm#L2131-L2134LCEE8: CMP #MAP_DLCSTL_BF ;Is player on bottom floor of the dragonlord's castle?
…
LCEEC: LDA #$12 ;If so, load proper offset to enemy data row in EnemyGroupsTbl.Checked by claude-agent, 2026-10-21 — mapped CaveEnIndexTbl's first six entries (maps $0F-$14, the castle's sublevels 1-6) to rows $10, $11, $11, $11, $12, $12, and read those rows; the bottom floor also uses row $12Rows are numbered from 0 in EnemyGroupsTbl; row 16 ($10) is also the castle's ground floor (evasive-monsters).