Hit chance
The roll that decides whether an attack connects, set by the attack's accuracy and the target's evasion.
On this page
Hit chance is the probability that an attack connects. The Gameplay Design Patterns wiki calls the pattern Variable Accuracy, “Game mechanics to simulate differences in the difficulty to hit what one aims at”1. Each game read here compares a random number, or in Fire Emblem the average of two, with a threshold built from the attack’s accuracy and the target’s evasion.
- Move accuracyPokémon Red and Blue (1996). An accuracy byte out of 256, so even a 100% move misses 1 time in 256.2,3,4,5Pokémon Yellow (1998). Red and Blue's accuracy byte, so a 100% move still misses 1 time in 256.6Pokémon Gold and Silver (1999). An accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits.7Pokémon Crystal (2000). An accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits.8Pokémon Ruby and Sapphire (2002). Accuracy in percent times one combined stage ratio, then ability and item modifiers.9Pokémon Emerald (2004). Accuracy in percent times one combined stage ratio, checked before the damage.10,11Pokémon FireRed and LeafGreen (2004). Emerald's percent accuracy, skipped for every move in Pokédude battles and for the player's in the first battle.12
- Hit rolls less evade rollsFinal Fantasy II (1988). Every dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry.13,14Final Fantasy III (1990). Every dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry.15Final Fantasy IV (1991). Every block the target makes cancels one of the attacker's hits.16,17
- Dodge onlyDragon Warrior (1986). Most monsters dodge one or two of the hero's attacks in 64, a few far more, and the hero never dodges.18,19,20Dragon Warrior II (1987). Some monsters dodge often, and a hero only rarely.21
- Hit rate against evadeFinal Fantasy (1987). Most swings land unless the target's evade outweighs the attacker's hit rate.22,23,24,25,26Final Fantasy VII (1997). The attack's hit % and a quarter of dexterity, plus the attacker's Df% less the target's, against 1–100; luck can force a hit, or for a party member a dodge.27
- d20 against armor classRogue (1980). A 0–19 roll plus bonuses against 20 less level and armor class: 5% a point.28,29NetHack (1987). A 1–20 roll below 1 + Luck + level + armor class + bonuses: 5% a point, as in Rogue.30,31
- Two rolls averagedFire Emblem: The Binding Blade (2002). Hit less avoid, against the average of two numbers from 0 to 100, so even a shown 100 can miss.32,33,34Fire Emblem: The Sacred Stones (2004). Hit less avoid, against the average of two numbers from 0 to 99, so a shown 80 hits 92.2% of the time, computed with the two rolls taken as independent.35,36,37
- Flat chanceColossal Cave Adventure (1976). A dwarf's knife hits 9.5% of the time after the first volley, more once the dwarves are fed.38
- Aim scatterDune II (1992). The rocket launcher's and the Deviator's missiles fly to a random point near the target; turrets' missiles don't scatter.39
- Dodge, stat against statEarthBound Beginnings (1989). The target dodges from its Fight against the attacker's, 27 in 256 when they match.40
- Strength picks a result tableZork I (1980). The defender's strength picks a result table, and a 1–9 roll picks miss, stagger, wound, knockout, or kill.41,42,43
- Miss, then a stat dodgeEarthBound (1994). A miss roll in 16 from the weapon, then a dodge of (2 × the target's Speed − the attacker's) in 500.44,45
- Hit, then evadeFinal Fantasy V (1992). An attack lands whole or misses: one roll to hit, then one for the target to dodge.46,47
- Hit times evadeFinal Fantasy VI (1994). Hit rate scaled by the target's evade, and by a bug every attack reads magic evade; a physical attack on a target with Image rolls against the Image instead.48
#How it works
threshold = accuracy(attacker, move), adjusted by evasion(target)
if roll(range) passes threshold:
the attack hits
else:
it misses; its damage is thrown away or never computed
The games differ in the range of the roll, in how accuracy and evasion combine, and in whether the roll comes before the damage or after it.
| Roll | Threshold | Can a sure hit miss? | Against damage | |
|---|---|---|---|---|
| Dragon Warrior | 0–63, against the hero’s attacks only19,49 | the monster dodges below its nibble 19 | monsters’ attacks never roll49 | after19 |
| Final Fantasy | 0–200, per swing23 | 168 + hit rate − evade22, 1–255 | yes: 200 always misses23 | before, per swing23 |
| Red and Blue | a byte4 | accuracy byte × two stage ratios3 | yes: at most 255 in 2564 | after50 |
| Crystal | a byte8 | the same, less 20 for a BrightPowder8 | no: 255 skips the roll8 | after51 |
| Emerald | 1–10010 | accuracy % × one net stage ratio10 | no, at 100% and even stages10 | before11 |
| The Sacred Stones | the average of two 0–99 numbers35 | hit less avoid, within 0–10037 | no: 100 beats every average35 | before35,52 |
| Rogue 5.4 | 0–19, plus bonuses28 | at least 20 less level and armor class28 | no: at level + armor class + bonus of 20 or more, every roll hits28 | before28 |
| NetHack 3.6.7 | 1–2030 | below 1 + Luck + level + armor class + bonuses30 | no: a total over 20 always hits30 | before30 |
#Implementations
#Dragon Warrior
Only the hero’s attacks face a dodge roll. Once 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 19,19. Zero damage counts as a failed attack before that roll18. A sleeping monster never dodges, and spells skip the roll19.
A monster’s attack has no hit roll; it misses only when it deals 049. The NES manual says Agility lets the hero “more easily avoid the enemy”53. In the code, Agility raises the hero’s defense power and enters the first-turn and run tests, and no roll lets the hero dodge54,55,56,49.
In the North American Dragon Warrior II, a monster that isn’t asleep still dodges a hero’s hit on a roll of 0–63, against a nibble the disassembly calls its “evade chance / 64”21,19. Heroes now dodge a monster’s attack 1 time in 64, and the Clothes Hiding adds a second chance of 1 in 821.
#Final Fantasy
A physical attack’s hit chance is 168 + hit rate − evade22 against a defender that can move, held within 1–25522. Dark on the attacker costs 40, and Dark on the defender gives 4022. Each swing rolls 0–200 with RandAX; a roll of 200 always misses, and any other roll at most the hit chance hits23. Hit rate grows with level and with the weapon’s hit bonus57,58. Evade rises by 1 whenever a level-up raises Agility25.
Against a sleeping or stunned defender, the attacker’s hit rate and the defender’s evade drop out, leaving the chance at 168, moved only by Dark24. An evasive target is therefore easier to hit asleep, and an accurate attacker harder; Disch flags the branch as possibly a bug24. Run in the ROM for all 256 generator states, one swing at hit chance 172 gives 221 hits and 4 criticals in 25626; with the attacker in Dark it hits 170 times26.
A physical attack would gain 40 hit chance against a matching monster category or element, but no attack can trigger the match59.
In the North American release of Final Fantasy VII, a physical attack hits on At% + Dex/4 + own Df% − target Df%, against 1–10027. Against a sleeping target its chance becomes 25527. Final Fantasy instead drops the attacker’s hit rate and the defender’s evade and keeps the chance at 16824.
#Final Fantasy II to VI
Final Fantasy II splits Final Fantasy’s single roll into two sets of rolls14. The attacker rolls 0–100 once per point of its hit multiplier against its hit %, the defender rolls once per point of its evade multiplier against its evade %, and each evade cancels a hit13. Final Fantasy III rolls the same way on 0–99, and halves the hit % for Blind and, except with a harp or bow and arrow, for a back-row attacker or target15,13. Final Fantasy IV keeps Final Fantasy III’s rolls17,15.
Final Fantasy V replaces that loop with one hit roll and one evade roll, so an attack either lands or misses47,46. Final Fantasy VI scales the hit rate by the target’s evade and rolls 0–99 once48. Because of a carry-flag bug, every physical attack tests the target’s magic evade (MBlock) instead of Evade; the disassembly’s BUGFIX_EVADE option, credited to Terii Senshi, restores Evade48.
#Pokémon Red and Blue
Red and Blue store accuracy as a byte, for percent, so 100% is 2552. CalcHitChance scales it by the attacker’s accuracy stage and then by the defender’s evasion stage read in reverse, using the same ratios as the other stats, from ×0.25 to ×43. It truncates after each step, keeps at least 1, and caps the result at 2553.
MoveHitTest then hits when a random byte is below the result, so even a 100% move lands at most 255 in 2564. The test runs after the damage is computed50. Swift returns before any check and never misses, even against a Pokémon in the air from Fly or underground from Dig; X Accuracy skips only the roll5.
Pokémon Yellow keeps MoveHitTest and CalcHitChance unchanged6,4.
#Pokémon Crystal
Crystal keeps the byte and the two stage steps, with its own accuracy ratios from ×0.33 to ×38. A BrightPowder on the target subtracts 20 from the threshold8. An accuracy of 255 now skips the roll, so a 100% move at even stages always hits8. A plain damaging move still checks accuracy last51.
Pokémon Gold and Silver already have the BrightPowder and the sure hit at 255, and Crystal keeps their BattleCommand_CheckHit unchanged7,8.
#Pokémon Emerald
Emerald works in percent. It nets the attacker’s accuracy stage against the target’s evasion stage, multiplies the move’s accuracy by that one ratio, and misses when a roll from 1 to 100 exceeds the result10. Compound Eyes, Sand Veil in a sandstorm, Hustle on physical moves, and an evasion item scale the threshold first10. A plain damaging move now checks accuracy before it computes any damage11.
Pokémon Ruby and Sapphire already have this check, and Emerald keeps their atk01_accuracycheck with renamed constants9,10. Pokémon FireRed and LeafGreen add one exception to Emerald’s check: every move skips the roll in Pokédude battles, and the player’s moves skip it in the first battle until tutorial flags are set12.
#EarthBound Beginnings and EarthBound
In the English build of EarthBound Beginnings, the attacker has no accuracy stat40. The target dodges a plain attack with a chance of (256 + ΔFight) ÷ 2 − 102, in 25640, where ΔFight is its Fight less the attacker’s; that is 27 in 256 at equal Fight40. In the US release of EarthBound, a bash first misses at the attacker’s miss rate in 16, and the target then dodges by Speed instead of Fight44,45.
#Fire Emblem: The Sacred Stones
The Sacred Stones shows one hit percentage in its battle forecast. It is twice the attacker’s skill, plus the weapon’s hit, half the luck, and the weapon triangle’s bonus, less the defender’s avoid of twice attack speed plus terrain and luck, held within 0–10037. The game then averages two random numbers from 0 to 99, rounding down, and the attack hits when the shown hit is greater35. The average bunches near the middle, so a high chance hits more often than shown and a low one less often. Computed from the code, taking the two rolls as independent, a shown 80 hits 92.2% of the time, 50 hits 50.5%, and 20 hits 8.2%36. The crit roll that follows a hit uses one number60.
The Binding Blade, read in its Japanese build, already averages two numbers32. Its numbers divide by 655 rather than scale by 100/65,536, so each can reach 100, and a displayed 100 misses 1,296 times in 2³², computed the same way33,35.
#Variants and combinations
- Critical hit. Final Fantasy reads the critical from the hit roll itself, so a critical is always a hit61.
- Multi-hit attack. Final Fantasy rolls every swing; Pokémon rolls once for the whole move23,62,63,64.
#History
The games read here run from Dragon Quest (Famicom, 1986) to Emerald (2004)65,66.
Games
| Game | Year | How | Note |
|---|---|---|---|
| Pokémon Red and Blue | 1996 | Move accuracy | an accuracy byte out of 256, so even a 100% move misses 1 time in 256 |
| Pokémon Yellow | 1998 | Move accuracy | Red and Blue's accuracy byte, so a 100% move still misses 1 time in 256 |
| Pokémon Gold and Silver | 1999 | Move accuracy | an accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits |
| Pokémon Crystal | 2000 | Move accuracy | an accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits |
| Pokémon Ruby and Sapphire | 2002 | Move accuracy | accuracy in percent times one combined stage ratio, then ability and item modifiers |
| Pokémon Emerald | 2004 | Move accuracy | accuracy in percent times one combined stage ratio, checked before the damage |
| Pokémon FireRed and LeafGreen | 2004 | Move accuracy | Emerald's percent accuracy, skipped for every move in Pokédude battles and for the player's in the first battle |
| Final Fantasy II | 1988 | Hit rolls less evade rolls | every dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry |
| Final Fantasy III | 1990 | Hit rolls less evade rolls | every dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry |
| Final Fantasy IV | 1991 | Hit rolls less evade rolls | every block the target makes cancels one of the attacker's hits |
| Dragon Warrior | 1986 | Dodge only | most monsters dodge one or two of the hero's attacks in 64, a few far more, and the hero never dodges |
| Dragon Warrior II | 1987 | Dodge only | some monsters dodge often, and a hero only rarely |
| Final Fantasy | 1987 | Hit rate against evade | most swings land unless the target's evade outweighs the attacker's hit rate |
| Final Fantasy VII | 1997 | Hit rate against evade | the attack's hit % and a quarter of dexterity, plus the attacker's Df% less the target's, against 1–100; luck can force a hit, or for a party member a dodge |
| Rogue | 1980 | d20 against armor class | a 0–19 roll plus bonuses against 20 less level and armor class: 5% a point |
| NetHack | 1987 | d20 against armor class | a 1–20 roll below 1 + Luck + level + armor class + bonuses: 5% a point, as in Rogue |
| Fire Emblem: The Binding Blade | 2002 | Two rolls averaged | hit less avoid, against the average of two numbers from 0 to 100, so even a shown 100 can miss |
| Fire Emblem: The Sacred Stones | 2004 | Two rolls averaged | hit less avoid, against the average of two numbers from 0 to 99, so a shown 80 hits 92.2% of the time, computed with the two rolls taken as independent |
| Colossal Cave Adventure | 1976 | Flat chance | a dwarf's knife hits 9.5% of the time after the first volley, more once the dwarves are fed |
| Dune II | 1992 | Aim scatter | the rocket launcher's and the Deviator's missiles fly to a random point near the target; turrets' missiles don't scatter |
| EarthBound Beginnings | 1989 | Dodge, stat against stat | the target dodges from its Fight against the attacker's, 27 in 256 when they match |
| Zork I | 1980 | Strength picks a result table | the defender's strength picks a result table, and a 1–9 roll picks miss, stagger, wound, knockout, or kill |
| EarthBound | 1994 | Miss, then a stat dodge | a miss roll in 16 from the weapon, then a dodge of (2 × the target's Speed − the attacker's) in 500 |
| Final Fantasy V | 1992 | Hit, then evade | an attack lands whole or misses: one roll to hit, then one for the target to dodge |
| Final Fantasy VI | 1994 | Hit times evade | hit rate scaled by the target's evade, and by a bug every attack reads magic evade; a physical attack on a target with Image rolls against the Image instead |
Every claim about this mechanic, by game (77)
References
- ^The Gameplay Design Patterns wiki defines Variable Accuracy as "Game mechanics to simulate differences in the difficulty to hit what one aims at."WikiGameplay Design Patterns wiki, “Variable Accuracy”
How we know
Game mechanics to simulate differences in the difficulty to hit what one aims at.
lead · archived copy ↗ The quote matches our archived copy.
- ^ abRed and Blue store a move's accuracy as a byte, for percent, so 100% is 255 and 85% is 216.Codepret/pokered
How we know
6 db \5 percent ; accuracydata/moves/moves.asm lines 1–8 at af51989 · upstream ↗ 3DEF percent EQUS "* $ff / 100"macros/data.asm line 3 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcd
CalcHitChancemultiplies the accuracy byte by the attacker's accuracy-stage ratio and then by the defender's evasion-stage ratio, read in reverse; it truncates after each step, keeps at least 1, and caps the result at 255.Codepret/pokeredHow we know
5355 ld c, a ⋮ 5362 ld c, a ⋮ 5366 ld c, a ; c = 14 - EVASIONMOD (this "reflects" the value over 7, so that an increase in the target's evasion ⋮ 5400; make sure the result is always at least one ⋮ 5413 ld a, $ff ; set the hit chance to 0xFF
engine/battle/core.asm lines 5348–5418 at af51989 · upstream ↗ 1StatModifierRatios: 2; first byte is numerator, second byte is denominator 3 db 25, 100 ; 0.25 ⋮ 9 db 1, 1 ; 1.00 ⋮ 15 db 4, 1 ; 4.00
data/battle/stat_modifiers.asm lines 1–15 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcde
MoveHitTestlands a move when a random byte is below its accuracy byte, so even a 100% move misses 1 time in 256.Codepret/pokeredHow we know
5322; if the random number generated is greater than or equal to the scaled accuracy, the move misses 5323; note that this means that even the highest accuracy is still just a 255/256 chance, not 100% 5324 call BattleRandom 5325 cp b 5326 jr nc, .moveMissed
engine/battle/core.asm lines 5321–5327 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcSwift returns from
MoveHitTestbefore any check, so it never misses, even against a Pokémon in the air from Fly or underground from Dig; other moves always miss such a target, and X Accuracy skips only the roll.Codepret/pokeredHow we know
5249 cp SWIFT_EFFECT 5250 ret z ; Swift never misses (this was fixed from the Japanese versions) ⋮ 5260 bit INVULNERABLE, [hl] 5261 jp nz, .moveMissed
engine/battle/core.asm lines 5247–5261 at af51989 · upstream ↗ 5289 bit USING_X_ACCURACY, a ; is the player using X Accuracy? 5290 ret nz ; if so, always hit regardless of accuracy/evasion
engine/battle/core.asm lines 5287–5290 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abYellow keeps Red and Blue's
MoveHitTestandCalcHitChanceunchanged, so a move still hits when a random byte is below its scaled accuracy byte, and even a 100% move misses 1 time in 256.Codepret/pokeyellow · pret/pokeredHow we know
5506 call BattleRandom 5507 cp b 5508 jr nc, .moveMissed
engine/battle/core.asm lines 5506–5508 at b6696f2 · upstream ↗ engine/battle/core.asm#L5228-L5419 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abGold and Silver's
BattleCommand_CheckHit, which Crystal keeps unchanged, subtracts a target's BrightPowder value (20) from the stage-scaled accuracy byte, lets a byte of 255 always hit, and otherwise hits on a random byte below it.Codepret/pokegold · pret/pokecrystalHow we know
1595 cp HELD_BRIGHTPOWDER ⋮ 1602 sub c ⋮ 1609 cp -1 1610 jr z, .Hit ⋮ 1612 call BattleRandom 1613 cp b 1614 jr nc, .Miss
engine/battle/effect_commands.asm lines 1595–1614 at fc702b6 · upstream ↗ 15; BRIGHTPOWDER 16 item_attribute 10, HELD_BRIGHTPOWDER, 20, CANT_SELECT, ITEM, ITEMMENU_NOUSE, ITEMMENU_NOUSE
data/items/attributes.asm lines 15–16 at fc702b6 · upstream ↗ engine/battle/effect_commands.asm#L1546-L1850 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdefgh
BattleCommand_CheckHitscales the accuracy byte by the accuracy and evasion stages, subtracts 20 if the target holds a BrightPowder, and then hits on a random byte below it; an accuracy of 255 always hits.Codepret/pokecrystalHow we know
1584.BrightPowder: ⋮ 1587 ld a, b 1588 cp HELD_BRIGHTPOWDER ⋮ 1594 ld a, b 1595 sub c ⋮ 1600.skip_brightpowder 1601 ld a, b 1602 cp -1 1603 jr z, .Hit ⋮ 1605 call BattleRandom 1606 cp b 1607 jr nc, .Miss
engine/battle/effect_commands.asm lines 1584–1608 at 97187cd · upstream ↗ 4AccuracyLevelMultipliers: 5 db 33, 100 ; -6 = 33% ⋮ 11 db 1, 1 ; 0 = 100% ⋮ 17 db 3, 1 ; +6 = 300%
data/battle/accuracy_multipliers.asm lines 1–17 at 97187cd · upstream ↗ 16 item_attribute 10, HELD_BRIGHTPOWDER, 20, CANT_SELECT, ITEM, ITEMMENU_NOUSE, ITEMMENU_NOUSEdata/items/attributes.asm lines 15–16 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abRuby and Sapphire's
atk01_accuracycheck, which Emerald keeps with renamed constants, scales a move's percent accuracy by one combined stage ratio, applies Compound Eyes (×1.3), Sand Veil in a sandstorm and Hustle on physical moves (×0.8 each), and a target's evasion item, and misses when a roll from 1 to 100 exceeds the result.Codepret/pokeruby · pret/pokeemeraldHow we know
1272 calc = gAccuracyStageRatios[buff].dividend * moveAcc; 1273 calc /= gAccuracyStageRatios[buff].divisor; ⋮ 1276 calc = (calc * 130) / 100; // 1.3 compound eyes boost ⋮ 1278 calc = (calc * 80) / 100; // 1.2 sand veil loss; ⋮ 1280 calc = (calc * 80) / 100; // 1.2 hustle loss; ⋮ 1296 calc = (calc * (100 - quality)) / 100; ⋮ 1299 if ((Random() % 100 + 1) > calc)
src/battle_script_commands.c lines 1272–1299 at 5784633 · upstream ↗ src/battle_script_commands.c#L1099-L1252 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdefg
Cmd_accuracycheckcombines the attacker's accuracy stage and the target's evasion stage into one stage, multiplies the move's accuracy in percent by that stage's ratio, and misses when a roll from 1 to 100 exceeds the result, so a 100% move at even stages never misses.Codepret/pokeemeraldHow we know
1128 if (gBattleMons[gBattlerTarget].status2 & STATUS2_FORESIGHT) ⋮ 1136 buff = acc + DEFAULT_STAT_STAGE - gBattleMons[gBattlerTarget].statStages[STAT_EVASION]; ⋮ 1149 calc = sAccuracyStageRatios[buff].dividend * moveAcc; 1150 calc /= sAccuracyStageRatios[buff].divisor; ⋮ 1175 // final calculation 1176 if ((Random() % 100 + 1) > calc)
src/battle_script_commands.c lines 1128–1176 at 731ad5b · upstream ↗ 588static const struct StatFractions sAccuracyStageRatios[] = ⋮ 590 { 33, 100}, // -6 ⋮ 596 { 1, 1}, // 0 ⋮ 602 { 3, 1}, // +6
src/battle_script_commands.c lines 588–603 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcIn Emerald a plain damaging move checks accuracy before it computes damage, the reverse of Red, Blue, and Crystal.Codepret/pokeemerald
How we know
241BattleScript_HitFromAtkCanceler:: 242 attackcanceler 243BattleScript_HitFromAccCheck:: 244 accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE ⋮ 249 critcalc 250 damagecalc 251 typecalc 252 adjustnormaldamage
data/battle_scripts_1.s lines 241–252 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abFireRed and LeafGreen's
Cmd_accuracycheckis Emerald's with one addition: in Pokédude battles every move, on either side, skips the accuracy roll, and in the first battle the player's damaging moves skip it until one tutorial flag is set and the player's status moves until a second.Codepret/pokefirered · pret/pokeemeraldrevisedHow we know
1003static void Cmd_accuracycheck(void) ⋮ 1007 if ((gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE 1008 && !BtlCtrl_OakOldMan_TestState2Flag(1) 1009 && gBattleMoves[move].power != 0 1010 && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) 1011 || (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE 1012 && !BtlCtrl_OakOldMan_TestState2Flag(2) 1013 && gBattleMoves[move].power == 0 1014 && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) 1015 || (gBattleTypeFlags & BATTLE_TYPE_POKEDUDE)) ⋮ 1017 JumpIfMoveFailed(7, move); 1018 return;
src/battle_script_commands.c lines 1003–1019 at ce6406d · upstream ↗ 1099static void Cmd_accuracycheck(void) ⋮ 1101 u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); ⋮ 1103 if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON)
src/battle_script_commands.c lines 1099–1103 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcA Fight action rolls 0–100 once per point of the attacker's hit multiplier (adjusted by haste or slow, at least 1) and counts the rolls under its hit %, then rolls once per point of the target's evade multiplier and counts the rolls under its evade %. The evaded rolls are subtracted from the hits, at least 0, and the rest are the hits that deal damage. Blind halves the attacker's hit % and the target's evade %. The check returns no successes when the attacker is a toad or mini, and the disassembly marks as a bug that the evade check reads the attacker's status too.Codeeverything8215, FF2 disassembly
How we know
16227; [ do fight effect ] ⋮ 162300C/AFBF: B1 9F LDA ($9F),Y ; main hand hit multiplier ⋮ 162330C/AFC4: 71 9F ADC ($9F),Y ; add haste/slow modifier ⋮ 162400C/AFD1: E9 14 SBC #$14 ; subtract 20 ⋮ 162460C/AFDD: A2 01 LDX #$01 ; min 1 ⋮ 162510C/AFE6: B1 9F LDA ($9F),Y ; main hand hit % ⋮ 162570C/AFF3: F0 04 BEQ $AFF9 ; branch if not blind ⋮ 162600C/AFF9: 20 2C BC JSR $BC2C ; check for hit ⋮ 162620C/AFFE: 85 52 STA $52 ; +$52: number of successful hits ⋮ 162660C/B006: B1 A1 LDA ($A1),Y ; target's evade multiplier ⋮ 162690C/B00B: B1 A1 LDA ($A1),Y ; target's evade % ⋮ 162790C/B020: 20 2C BC JSR $BC2C ; check for hit ⋮
ff2j.asm lines 16227–16290 at 8d26190 · upstream ↗ 17943; [ check for hit ] ⋮ 17945; $44: hit % 17946; $46: number of hit attempts 17947; $48: number of successful hits (out) ⋮ 17949; *** bug *** should use target status for evade checks ⋮ 179510C/BC2C: A9 00 LDA #$00 ; start with 0 hits ⋮ 179610C/BC40: A4 46 LDY $46 179620C/BC42: A2 00 LDX #$00 179630C/BC44: A9 64 LDA #$64 179640C/BC46: 20 11 FD JSR $FD11 ; random (X..A) 179650C/BC49: 38 SEC 179660C/BC4A: E5 44 SBC $44 ⋮
ff2j.asm lines 17943–17971 at 8d26190 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abFinal Fantasy rolls once per swing against a single hit chance that already has the defender's evade subtracted; Final Fantasy II splits that into two sets of rolls, the attacker's against its hit % and the defender's against its evade %, and subtracts the defender's successes from the attacker's.CodeDisch, FF1 disassembly · everything8215, FF2 disassembly
How we know
4378 LDA #MATHBUF_HITCHANCE ; add their hit rate to their hit chance ⋮ 4388 LDX btl_defender_evade ; the hit chance.
Final Fantasy Disassembly/bank_0C.asm lines 4377–4399 at cbb87d3 · upstream ↗ 4474 LDX #200 4475 JSR RandAX ; [0,200] ⋮ 4484 JSR RandAX ⋮ 4493 CMP math_randhit ; if hit chance is < randhit value, then this was a miss. Jump ahead
Final Fantasy Disassembly/bank_0C.asm lines 4471–4494 at cbb87d3 · upstream ↗ 162600C/AFF9: 20 2C BC JSR $BC2C ; check for hit ⋮ 162660C/B006: B1 A1 LDA ($A1),Y ; target's evade multiplier ⋮ 162690C/B00B: B1 A1 LDA ($A1),Y ; target's evade % ⋮ 162790C/B020: 20 2C BC JSR $BC2C ; check for hit ⋮ 162850C/B02C: A5 52 LDA $52 ; subtract evaded hits
ff2j.asm lines 16260–16290 at 8d26190 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcA Fight action rolls 0–99 once per point of the attacker's attack multiplier and counts the rolls under its hit %; Blind halves the hit %, and when a back-row penalty applies (not for a harp or bow and arrow) an attacker in the back row halves it, and a target in the back row halves it again and adds one evaded hit. The target then rolls once per point of its evade multiplier against its evade %, with no evade rolls when it is a toad, mini, or jumping, and its successes are subtracted from the hits, at least 0. The net hits multiply one damage roll, and none is a miss. Each hand rolls separately.Codeeverything8215, FF3 disassemblyrevised
How we know
11953; [ get number of hits ] ⋮ 11955; $24: attack/defense multiplier (no. of hits) 11956; $25: hit/def % 11957; $30: number of hits ⋮ 1195931/BB28: A9 00 LDA #$00 1196031/BB2A: 85 30 STA $30 1196131/BB2C: A5 24 LDA $24 ; no. of hits 1196231/BB2E: F0 11 BEQ $BB41 1196331/BB30: A9 63 LDA #$63 1196431/BB32: 20 B4 BE JSR $BEB4 ; random (0..A) 1196531/BB35: C5 25 CMP $25 ; hit % 1196631/BB37: B0 02 BCS $BB3B ⋮
ff3j.asm lines 11953–11972 at 1acef81 · upstream ↗ 8151; start of loop for 2 hands 815230/9F6A: AD 41 74 LDA $7441 ; attack multiplier ⋮ 815430/9F6F: AD 42 74 LDA $7442 ; hit % ⋮ 816030/9F7C: 46 25 LSR $25 ; halve hit % ⋮ 816430/9F84: D0 20 BNE $9FA6 ; branch if harp or bow + arrow ⋮ 816830/9F8C: 20 97 A3 JSR $A397 ; check for back row penalty 816930/9F8F: B0 15 BCS $9FA6 ; branch if no penalty ⋮ 817330/9F97: F0 02 BEQ $9F9B ; branch if attacker not in back row 817430/9F99: 46 25 LSR $25 ; halve hit % ⋮ 817730/9F9F: F0 05 BEQ $9FA6 ; branch if target is not in back row 817830/9FA1: EE E9 7C INC $7CE9 817930/9FA4: 46 25 LSR $25 ; halve hit % ⋮
ff3j.asm lines 8151–8210 at 1acef81 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^A Fight command makes one percentage roll per point of the attacker's attack multiplier and counts the rolls under its hit rate; the target rolls once per point of its defense multiplier and blocks one hit for each roll under its defense rate. The hits left after blocking multiply one damage roll, and none left is a miss.Codeeverything8215, FF4 disassembly
How we know
16CalcHits: 17@c987: stz $38fd ; clear number of hits 18 lda $38fb 19 beq @c99e ; return if no base hits 20 tay 21@c990: jsr Rand99 22 cmp $38fa ; check vs. hit rate 23 bcs @c99b 24 inc $38fd ; increment number of hits 25@c99b: dey 26 bne @c990
battle/damage.asm lines 16–27 at a360e2e · upstream ↗ 114@c55b: lda $38f8 115 sta $38fa ; set attack rate 116 lda $269b ; attack multiplier 117 sta $38fb 118 jsr CalcHits 119 lda $38fd 120 sta $38f8 ; set number of hits
battle/fight.asm lines 114–120 at a360e2e · upstream ↗ 147@c59f: lda $2729 ; defense rate 148 sta $38f9 ⋮ 166 sta $38f9 ⋮ 169 lda $2728 ; defense multiplier 170 sta $38fb ⋮ 175@c5e4: jsr CalcHits 176 lda $38fd 177@c5ea: sta $38f9 ; set number of hits defended 178 sec 179 lda $38f8 180 sbc $38f9 ; subtract from number of hits 181 sta $34c8 ⋮
battle/fight.asm lines 147–203 at a360e2e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abFinal Fantasy IV keeps Final Fantasy III's physical attack: percentage rolls per point of an attack multiplier, the target's successful evade rolls subtracted, and one damage roll of attack plus 0 to half of it, with the crit bonus added before defense, multiplied by the net hits and capped at 9,999.Codeeverything8215, FF3 disassembly · everything8215, FF4 disassembly
How we know
1196331/BB30: A9 63 LDA #$63 1196431/BB32: 20 B4 BE JSR $BEB4 ; random (0..A) 1196531/BB35: C5 25 CMP $25 ; hit %
ff3j.asm lines 11959–11970 at 1acef81 · upstream ↗ 1199231/BB50: 85 18 STA $18 ; +$18 = attack * (1..3/2) ⋮ 1202131/BB89: 85 18 STA $18 ; +$18 = attack + crit bonus ⋮ 1203131/BB9D: E5 26 SBC $26 ; subtract defense ⋮ 1204231/BBB3: AD 7C 00 LDA $007C ; total no. of hits ⋮ 1206231/BBDD: A9 27 LDA #$27 ; max damage is 9999
ff3j.asm lines 11985–12062 at 1acef81 · upstream ↗ 21@c990: jsr Rand99 22 cmp $38fa ; check vs. hit rate
battle/damage.asm lines 16–27 at a360e2e · upstream ↗ 33CalcDmg: 34@c99f: ldx $3902 ; base attack ⋮ 59 adc $3901 ; add crit bonus ⋮ 66 sbc $3904 ⋮ 76 lda $38fc ⋮ 92 cpx #$270f
battle/damage.asm lines 33–99 at a360e2e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abZero damage from the hero ends the turn as a failed attack, before any dodge check.Codenmikstas/dragon-warrior-disassembly
How we know
6762LE651: JSR PlyrCalcHitDmg ;($EFE5)Calculate the damage player will do to the enemy. 6763LE654: LDA CalcDamage ;Did player do damage to the enemy? 6764LE656: BNE SetEnDmg1 ;If so, branch.
source_files/Bank03.asm lines 6761–6773 at ebe6a13 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcdefghAfter 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.Codenmikstas/dragon-warrior-disassembly · Ryan8bit, DW Formulas
How we know
6780LE66A: BIT PlayerFlags ;Is the enemy asleep? 6781LE66C: BVS PlyrHitEn ;If so, branch. Enemy can't dodge. ⋮ 6786LE673: AND #$3F ;Get a random number and keep lower 6 bits(0-63). ⋮ 6789LE677: LDA EnBaseMDef ;Does enemy have magic defense? 6790LE67A: AND #$0F ; 6791LE67C: BEQ PlyrHitEn ;If not, branch. Enemy can't dodge. ⋮ 6795LE681: CMP RandNumUB ;
source_files/Bank03.asm lines 6775–6796 at ebe6a13 · upstream ↗ 6809SetSpellDmg: 6810LE694: STA EnDamage ; 6811LE696: LDA #$00 ;Set the damage the player will do. Enemy can't dodge spells. ⋮ 6814PlyrHitEn:
source_files/Bank03.asm lines 6809–6814 at ebe6a13 · upstream ↗ The second nibble / 64 is the chance of dodging
III.C, Combat · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^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.Codenmikstas/dragon-warrior-disassembly · Ryan8bit, DW Formulas
How we know
4432;Mdef - Enemy's magical defense. ⋮ 4439EnStatTbl: 4440;Enemy $00-Slime. 4441; Att Def HP Spel Agi Mdef Exp Gld |--------------Unused--------------| 4442L9E4B: .byte $05, $03, $03, $00, $0F, $01, $01, $02, $69, $40, $4A, $4D, $FA, $FA, $FA, $FA
source_files/Bank01.asm lines 4425–4442 at ebe6a13 · upstream ↗ 4504;Enemy $10-Metal slime. ⋮ 4506L9F4B: .byte $0A, $FF, $04, $03, $FF, $F1, $73, $06, $3F, $47, $43, $69, $40, $4A, $4D, $FA
source_files/Bank01.asm lines 4504–4506 at ebe6a13 · upstream ↗ 4552;Enemy $1C-Demon Knight. ⋮ 4554LA00B: .byte $4F, $40, $32, $00, $FF, $FF, $25, $96, $0F, $12, $F8, $22, $10, $15, $FA, $FA
source_files/Bank01.asm lines 4552–4554 at ebe6a13 · upstream ↗ 3873L9975:* LDA (GenPtr3C),Y ;Use the general pointer to load the enemy data. 3874L9977: STA EnBaseAtt,Y ;
source_files/Bank01.asm lines 3873–3874 at ebe6a13 · upstream ↗ 550.alias EnBaseAtt $0100 ;Enemy base attack attibute. ⋮ 573.alias EnBaseMDef $0105 ;Enemy base magic defense.
source_files/Dragon_Warrior_Defines.asm lines 550–573 at ebe6a13 · upstream ↗ Dodge is the chance that the enemy will dodge any physical attack.
II.B, Combat, monster list (#28 Demon Knight) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcIn Dragon Warrior II (NA NES), after a hero's normal hit is rolled, a monster that isn't asleep dodges when a roll of 0–63 falls below the high nibble of its second stat byte, which the disassembly calls its "evade chance / 64"; heroes dodge a monster's attack 1 time in 64, and the Clothes Hiding adds a second chance of 1 in 8.CodeNathan-R-Og/dq2
How we know
6310B04_A656: 6311 ldy #$00 6312 lda ($B7), y 6313 bmi B04_A676 6314 ldy #$01 6315 lda ($BB), y 6316 lsr 6317 lsr 6318 lsr 6319 lsr 6320 sta $A6 6321 lda #$40 ⋮
src/us/prg/bank4.asm lines 6310–6329 at 0fb64a4 · upstream ↗ Enemy Stats (Max HP, [4-bit evade chance / 64, 4-bit unused]
src/us/prg/bank4.asm#L5079-L5079 · upstream ↗ 6180B04_A580: 6181 lda #$80 6182 sta $A1 6183 lda #$01 ⋮ 6187 sta $A1 ⋮ 6191 lda #$01 6192 sta $A1 ⋮ 6195 jsr B04_A74A 6196 ldy #$00 6197 lda ($B7), y 6198 and $A1
src/us/prg/bank4.asm lines 6180–6199 at 0fb64a4 · upstream ↗ 6935B04_A9D3: 6936 and #$40 6937 bne B04_A9FF 6938 lda #$40 ⋮ 6941 beq B04_A9EE ⋮ 6944 lda #$52 ; Item ID #$52: Clothes Hiding (equipped) ⋮ 6949 jsr B04_B007 6950 bcs B04_A9FF 6951B04_A9EE: ⋮ 6958 lda #$0A ; String ID #$000A: [name] dodged the blow.[end-FC]
src/us/prg/bank4.asm lines 6935–6958 at 0fb64a4 · upstream ↗ 8011B04_B007: 8012 lda #$08 ⋮ 8015 cmp #$01 ; 1/8 Heroic Attack, Defeat
src/us/prg/bank4.asm lines 8011–8015 at 0fb64a4 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdeA physical attack's hit chance starts at 168; Dark on the attacker costs 40, and Dark on the defender gives 40. Unless the defender is asleep or stunned, it then adds the attacker's hit rate and subtracts the defender's evade. The result is held within 1–255.CodeDisch, FF1 disassemblyrevised
How we know
4309 LDA #168 ; base hit chance of 168 ⋮ 4318 LDA btl_attacker_ailments ; if attacker has DARK status, penalty of 40 to their hit chance ⋮ 4326 : LDA btl_defender_ailments ; if defender has DARK, bonus of 40 to attacker's hit chance
Final Fantasy Disassembly/bank_0C.asm lines 4309–4332 at cbb87d3 · upstream ↗ 4378 LDA #MATHBUF_HITCHANCE ; add their hit rate to their hit chance ⋮ 4383 JSR CapXYAtFF ; cap at 255 ⋮ 4388 LDX btl_defender_evade ; the hit chance. ⋮ 4399 INC math_hitchance ; minimum hit chance of 1
Final Fantasy Disassembly/bank_0C.asm lines 4377–4399 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcdefEach swing rolls 0–200 with
RandAX; a roll of 200 always misses, and any other roll hits when it is at most the hit chance.CodeDisch, FF1 disassemblyHow we know
4474 LDX #200 4475 JSR RandAX ; [0,200] ⋮ 4480 JMP @NextHitIteration ; skip if got 200 exactly (guaranteed miss) ⋮ 4484 JSR RandAX ⋮ 4493 CMP math_randhit ; if hit chance is < randhit value, then this was a miss. Jump ahead
Final Fantasy Disassembly/bank_0C.asm lines 4471–4494 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcdAgainst a sleeping or stunned defender, base damage rises by a quarter, and the attacker's hit rate and the defender's evade drop out, so the hit chance stays at 168 apart from Dark's 40 either way.CodeDisch, FF1 disassemblyrevised
How we know
4363 : LDA btl_defender_ailments 4364 AND #AIL_STUN | AIL_SLEEP 4365 BEQ @DefenderMobile ; if defender alseep or stunned.... 4366 LDA math_basedamage ; apply 25% bonus to base damage ⋮ 4379 LDX btl_attacker_hitrate ; This seems strange to me. Shouldn't this be done even if defender 4380 JSR MathBuf_Add ; is immobile? Is this BUGGED?
Final Fantasy Disassembly/bank_0C.asm lines 4363–4380 at cbb87d3 · upstream ↗ 4309 LDA #168 ; base hit chance of 168 ⋮ 4318 LDA btl_attacker_ailments ; if attacker has DARK status, penalty of 40 to their hit chance ⋮ 4326 : LDA btl_defender_ailments ; if defender has DARK, bonus of 40 to attacker's hit chance
Final Fantasy Disassembly/bank_0C.asm lines 4309–4332 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abA level-up that raises a character's Agility also raises their evade by 1, up to 200.CodeDisch, FF1 disassembly
How we know
1074 : LDY #ch_evade - ch_stats ; evade goes up 1 if agility went up 1075 LDA @statupbuffer+1 1076 BEQ :+ ; did agility go up? ⋮ 1080 CMP #201 ; cap at 200 1081 BEQ :+
Final Fantasy Disassembly/bank_0B.asm lines 1074–1082 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcMeasured in the ROM over all 256 battle-RNG states, one swing with base damage 20, hit rate 10, and crit chance 1 against evade 6 and absorb 4 hits 221 times and is critical 4 times; with the attacker in Dark it hits 170 times, and against a sleeping defender 216 times.Verified“Final Fantasy (USA)” · Disch, FF1 disassembly
How we know
In the cartridge (“Final Fantasy (USA)”): bank $0C $A68C-$A8D3, the math of DoPhysicalAttack the probe runs, skipping the animation at $A775-$A7C8. We don't reproduce the bytes.
4310 STA math_hitchance ⋮ 4319 AND #AIL_DARK 4320 BEQ :+ 4321 LDA math_hitchance 4322 SEC 4323 SBC #40 4324 STA math_hitchance ⋮ 4327 AND #AIL_DARK 4328 BEQ :+ 4329 LDA math_hitchance ⋮ 4332 STA math_hitchance ⋮ 4364 AND #AIL_STUN | AIL_SLEEP ⋮
Final Fantasy Disassembly/bank_0C.asm lines 4307–4591 at cbb87d3 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on Final Fantasy (USA) (SHA-1
e8f34d935760…). It fails if the result disagrees with the claim.The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcIn the North American release,
BattleRollPhysicalHithits when a roll of 1–100 (BattleGetRnd164) is under the hit chance: the attack's hit % (targetAttackPercent) plus a quarter of the attacker's dexterity, plus the attacker's Df%, less the target's Df%, cut by 30% under Fury, and raised to at least 1, which never hits. A party member's Df% is a quarter of its dexterity plus its physical evade and an enemy's is its physical evade alone, so a party attacker's dexterity counts twice. The chance is instead 255 against a target under Death, Sleep, Confusion, Stop, Petrify, Manipulate, or Paralysis, for the Death, Nullify, and Absorb affinities and one unnamed affinity flag, and for two flags the code leaves unnamed (unk234bit 0,unk218bit 5). Before the roll, a 0–99 roll under the attacker's luck/4 makes a sure hit; failing that, when an enemy attacks a party member and the same roll is under the target's luck/4, the attack misses, even at 255.BattleGetRnd164scales a 16-bit random number by 99/65,535 and adds 1, so it gives 100 only for $FFFF, and a chance h of 2–100 hits about (h − 1) times in 99 (computed for evenly spread 16-bit values). Final Fantasy VI instead scales the hit rate by the target's stored evade (magic evade, through a bug) and rolls 0–99 against it.CodeXeeynamo/ff7-decomp · everything8215, FF6 disassemblyHow we know
5702void BattleRollPhysicalHit(void) { ⋮ 5711 const s32 vulnerableStatusMask = STATUS_DEATH | STATUS_SLEEP | STATUS_CONFU | STATUS_STOP | STATUS_PETRIFY | 5712 STATUS_MANIPULATE | STATUS_PARALYSIS; ⋮ 5716 hitChance = -1; 5717 if (g_CurrentAction->unk234 & 1) { 5718 hitChance = 255; ⋮ 5721 // Auto-hit on element Death-weakness, Auto-Hit weakness, Immune or Absorb 5722 if (g_CurrentAction->affinityFlags & (AFFINITY_DEATH | AFFINITY_UNK2 | AFFINITY_NULLIFY | AFFINITY_ABSORB)) { 5723 hitChance = 255; ⋮ 5737 hitChance = 255; ⋮ 5740 if (g_CurrentAction->unk218 & 0x20) { 5741 hitChance = 255; ⋮
src/battle/battle.c lines 5702–5780 at fc71ccc · upstream ↗ 5920s32 BattleCalcDefPercent(s32 arg0) { 5921 s32 evade; ⋮ 5923 if (arg0 < START_ENEMY) { 5924 evade = g_BattleState.combatant[arg0].dexterity / 4 + g_BattleState.combatant[arg0].physEvade; 5925 } else { 5926 evade = g_BattleState.combatant[arg0].physEvade; ⋮ 5928 return BattleApplyStatMult(arg0, evade, STAT_MULT_PHYS_EVADE);
src/battle/battle.c lines 5920–5929 at fc71ccc · upstream ↗ 6008static s32 BattleApplyFuryHitChanceReduction(s32 hitChance) { 6009 if ((hitChance < 0xFF) && (g_CurrentAction->attackerStatus & STATUS_FURY)) { 6010 hitChance -= (hitChance * 3) / 10; ⋮ 6012 return hitChance;
src/battle/battle.c lines 6008–6013 at fc71ccc · upstream ↗ 6667u16 BattleGetRndU16(void) { return SysRandomTwoBytes(); } ⋮ 6669// scale a 16-bit value into the range 1..100 6670static s32 BattleGetRnd164(void) { return (((BattleGetRndU16() & 0xFFFF) * 0x63) / 0xFFFF) + 1; }
src/battle/battle.c lines 6667–6670 at fc71ccc · upstream ↗ 19u8 SysGetRandomByteFromTable(void) { return g_KernRndTable[g_KernRndTablePos[g_KernRndTableIndex]++]; } ⋮ 21u8 SysGetRandomByteRange(s32 upperBound) { return (SysGetRandomByteFromTable() * upperBound) >> 8; }
src/main/btlrand.c lines 19–21 at fc71ccc · upstream ↗ 166.else 167 lda near wTargetProp2::Evade,y 168 bcs @2347 169 lda near wTargetProp2::MagicEvade,y 170@2347: pha 171 bcc @2388 172.endif ⋮ 185 lda $ee ⋮ 195 lda $ee ⋮ 200 sta $ee 201@2388: pla 202 xba ⋮
src/battle/check_hit.asm lines 166–210 at 8130132 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcdeIn Rogue 5.4 an attack hits when
rnd(20), a roll of 0 to 19, plus a to-hit bonus is at least 20 less the attacker's level less the defender's armor class. The bonus is the weapon's plus (with a fired missile's launcher plus, and the hero's dexterity rings when the weapon used is the hero's wielded one), the attacker's strength adjustment, and +4 when the target isn't running (asleep or held); a hero defender's armor class is the worn armor's, when the hero wears any, less any rings of protection. Computed, the chance is (level + armor class + bonus) / 20, held within 0 to 100%. Damage is rolled only after a hit.CodeRogue 5.4.4 sourcerevisedHow we know
381 int need = (20 - at_lvl) - op_arm;fight.c lines 378–384 at cf9bd26 · upstream ↗ 431 hplus += cur_weapon->o_hplus;fight.c lines 411–433 at cf9bd26 · upstream ↗ 442 if (!on(*thdef, ISRUN))fight.c lines 438–453 at cf9bd26 · upstream ↗ 460 if (swing(att->s_lvl, def_arm, hplus + str_plus[att->s_str]))fight.c lines 460–470 at cf9bd26 · upstream ↗ 188 return range == 0 ? 0 : abs((int) RN) % range;main.c lines 186–189 at cf9bd26 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^Computed from
swing, a level-1 Rogue 5.4 hero at strength 16 with a +1 weapon hits a monster of armor class 7 45% of the time while it is running, and 65% while it is asleep or held.CodeRogue 5.4.4 sourceHow we know
383 return (res + wplus >= need);fight.c lines 378–384 at cf9bd26 · upstream ↗ 47 -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,fight.c lines 46–49 at cf9bd26 · upstream ↗ 443 hplus += 4;fight.c lines 442–443 at cf9bd26 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdeIn NetHack 3.6.7 the hero's melee attack hits when a roll of 1 to 20 is below a total of 1 + Luck + the strength and dexterity bonus + the target's armor class + the hero's level (a polymorphed hero's monster level) + the hero's to-hit increment from rings of increase accuracy. The total gains 2 against a stunned, a fleeing, or a sleeping target (which the attack wakes), and 4 against one that can't move; it loses 3 while the hero is trapped and more for a heavier load; it adds the wielded weapon's to-hit and the hero's skill bonus, and adjusts for a monk and for an elf against an orc. An engulfed hero always hits. Computed, the chance is (total − 1) / 20, held within 0 to 100%. Damage is computed only after a hit.CodeNetHack 3.6.7 sourcerevised
How we know
266 tmp = 1 + Luck + abon() + find_mac(mtmp) + u.uhitincsrc/uhitm.c lines 266–267 at ed600d9 · upstream ↗ 285 if (!mtmp->mcanmove) {src/uhitm.c lines 275–291 at ed600d9 · upstream ↗ 306 tmp -= (tmp2 * 2) - 1;src/uhitm.c lines 293–322 at ed600d9 · upstream ↗ 613 int mhit = (tmp > dieroll || u.uswallow);src/uhitm.c lines 612–613 at ed600d9 · upstream ↗ 172 x = RND(x) + 1;src/rnd.c line 172 at ed600d9 · upstream ↗ 494 malive = hmon(mon, weapon, HMON_MELEE, dieroll);src/uhitm.c lines 481–494 at ed600d9 · upstream ↗ 890int 891abon() ⋮ 894 int str = ACURR(A_STR), dex = ACURR(A_DEX);
src/weapon.c lines 889–894 at ed600d9 · upstream ↗ 980 u.uhitinc += obj->spe;src/do_wear.c line 980 at ed600d9 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Revised after a check by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^Computed from both games' code, NetHack 3.6.7's melee roll keeps the rate of Rogue 5.4's
swing: each point of the attacker's level or the target's armor class adds 5% to the chance to hit, which is (level + armor class + bonuses) / 20 in Rogue and (level + armor class + Luck + bonuses) / 20 in NetHack.CodeNetHack 3.6.7 source · Rogue 5.4.4 sourcerevisedHow we know
266 tmp = 1 + Luck + abon() + find_mac(mtmp) + u.uhitincsrc/uhitm.c lines 266–267 at ed600d9 · upstream ↗ 613 int mhit = (tmp > dieroll || u.uswallow);src/uhitm.c lines 612–613 at ed600d9 · upstream ↗ 172 x = RND(x) + 1;src/rnd.c line 172 at ed600d9 · upstream ↗ 381 int need = (20 - at_lvl) - op_arm;fight.c lines 378–384 at cf9bd26 · upstream ↗ 188 return range == 0 ? 0 : abs((int) RN) % range;main.c lines 186–189 at cf9bd26 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abThe Binding Blade hits when the displayed hit is greater than the average of two random numbers, rounded down; each number divides a 16-bit
NextRN()by 655, so it runs from 0 to 100, and 100 comes from only 36 of the 65,536 values.Codefireemblem6jHow we know
69int RandNext_100(void) ⋮ 71 // take the next rn (range 0-0xFFFF) and convert it to a range 0-99 value 72 // NOTE: bugged due to rounding 73 return NextRN() / (UINT16_MAX / 100);
src/random.c lines 69–73 at e83dd39 · upstream ↗ 88bool RandRoll2Rn(int threshold) ⋮ 92 rand = RandNext_100(); 93 rand = rand + RandNext_100(); 94 rand = rand / 2; ⋮ 96 return (threshold > rand);
src/random.c lines 88–96 at e83dd39 · upstream ↗ 746 if (BattleRandRoll2Rn(gBattleSt.hit, TRUE) == FALSE) ⋮ 748 gBattleHitIt->attributes |= BATTLE_HIT_ATTR_MISS;
src/battle.c lines 746–749 at e83dd39 · upstream ↗ 738 gBattleSt.hit = attacker->battle_effective_hit;src/battle.c line 738 at e83dd39 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abComputed from the code, taking the two numbers as independent, a displayed 80 in The Binding Blade hits 92.16% of the time, 50 hits 50.44%, and 20 hits 8.19%; a displayed 100 misses 1,296 times in 4,294,967,296, when both numbers come out 100.Codefireemblem6jrevised
How we know
73 return NextRN() / (UINT16_MAX / 100);src/random.c line 73 at e83dd39 · upstream ↗ 92 rand = RandNext_100(); 93 rand = rand + RandNext_100(); 94 rand = rand / 2; ⋮ 96 return (threshold > rand);
src/random.c lines 92–96 at e83dd39 · upstream ↗ 521 if (attacker->battle_effective_hit > 100) 522 attacker->battle_effective_hit = 100;
src/battle.c lines 521–522 at e83dd39 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^The Binding Blade computes hit as twice the skill, plus the weapon's hit, half the luck, and the weapon triangle's bonus, and avoid as twice the attack speed plus the terrain's avoid and the luck; the hit it rolls against is hit less avoid, held within 0–100.Codefireemblem6j
How we know
493 attacker->battle_hit = attacker->unit.skl*2 + GetItemHit(attacker->weapon) + attacker->unit.lck/2 + attacker->advantage_bonus_hit;src/battle.c line 493 at e83dd39 · upstream ↗ 498 attacker->battle_avoid = attacker->battle_speed*2 + attacker->terrain_avoid + attacker->unit.lck;src/battle.c line 498 at e83dd39 · upstream ↗ 519 attacker->battle_effective_hit = attacker->battle_hit - defender->battle_avoid; ⋮ 521 if (attacker->battle_effective_hit > 100) 522 attacker->battle_effective_hit = 100; ⋮ 524 if (attacker->battle_effective_hit < 0) 525 attacker->battle_effective_hit = 0;
src/battle.c lines 519–525 at e83dd39 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcdefIn the North American build, an attack hits when the displayed hit is greater than the average of two random numbers from 0 to 99, rounded down; each number scales a 16-bit
NextRN()by 100/65,536.Codefireemblem8uHow we know
68int NextRN_100(void) { 69 // take the next rn (range 0-0xFFFF) and convert it to a range 0-99 value 70 return NextRN() * 100 / 0x10000;
src/rng.c lines 68–70 at 04d1edb · upstream ↗ 89s8 Roll2RN(int threshold) { 90 int average = (NextRN_100() + NextRN_100()) / 2; ⋮ 92 return (threshold > average);
src/rng.c lines 89–93 at 04d1edb · upstream ↗ 1007 if (!(gBattleHitIterator->attributes & BATTLE_HIT_ATTR_SURESHOT)) { 1008 if (!BattleRoll2RN(gBattleStats.hitRate, TRUE)) { 1009 gBattleHitIterator->attributes |= BATTLE_HIT_ATTR_MISS;
src/bmbattle.c lines 1007–1011 at 04d1edb · upstream ↗ 879void BattleUpdateBattleStats(struct BattleUnit* attacker, struct BattleUnit* defender) { ⋮ 882 gBattleStats.hitRate = attacker->battleEffectiveHitRate;
src/bmbattle.c lines 879–882 at 04d1edb · upstream ↗ 260 PutNumberTwoChr(gUiTmScratchA + 0xA8 + 0x40, 2, gBattleActor.battleEffectiveHitRate);src/bksel.c line 260 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abComputed from the code, taking the two numbers as independent and evenly spread, a displayed hit connects times in 10,000 up to 50 and times above it, so a displayed 80 hits 92.2% of the time, 20 hits 8.2%, and 50 hits 50.5%.Codefireemblem8urevised
How we know
89s8 Roll2RN(int threshold) { 90 int average = (NextRN_100() + NextRN_100()) / 2; ⋮ 92 return (threshold > average);
src/rng.c lines 89–93 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcIn the North American build, a unit's hit is twice its skill, plus its weapon's hit, half its luck, and the weapon triangle's bonus; its avoid is twice its attack speed plus its terrain's avoid and its luck; the hit shown and rolled is the attacker's hit less the defender's avoid, held within 0–100.Codefireemblem8u
How we know
577void ComputeBattleUnitHitRate(struct BattleUnit* bu) { 578 bu->battleHitRate = (bu->unit.skl * 2) + GetItemHit(bu->weapon) + (bu->unit.lck / 2) + bu->wTriangleHitBonus; ⋮ 582 bu->battleAvoidRate = (bu->battleSpeed * 2) + bu->terrainAvoid + (bu->unit.lck);
src/bmbattle.c lines 577–586 at 04d1edb · upstream ↗ 600 attacker->battleEffectiveHitRate = attacker->battleHitRate - defender->battleAvoidRate; ⋮ 602 if (attacker->battleEffectiveHitRate > 100) 603 attacker->battleEffectiveHitRate = 100; ⋮ 605 if (attacker->battleEffectiveHitRate < 0) 606 attacker->battleEffectiveHitRate = 0;
src/bmbattle.c lines 599–607 at 04d1edb · upstream ↗ 480 ComputeBattleUnitHitRate(attacker); 481 ComputeBattleUnitAvoidRate(attacker); ⋮ 484 ComputeBattleUnitSupportBonuses(attacker, defender); 485 ComputeBattleUnitWeaponRankBonuses(attacker); 486 ComputeBattleUnitStatusBonuses(attacker);
src/bmbattle.c lines 476–487 at 04d1edb · upstream ↗ 646 if (wType < 8 && bu->unit.ranks[wType] >= WPN_EXP_S) { 647 bu->battleHitRate += 5; 648 bu->battleCritRate += 5;
src/bmbattle.c lines 642–651 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^In Open Adventure (Adventure 2.5), each dwarf that was already in the hero's location before the dwarves moved throws a knife, which hits if a roll of 0–999 is below 95 × (dflag − 2). The first volley always misses, at dflag 2; it raises dflag to 3, so each later knife hits 9.5% of the time (computed). Feeding a dwarf while food is here adds 2 to dflag, so 28.5% after one feeding (computed). Any hit kills the hero.CodeOpen Adventure 1.22
How we know
313 /* Dwarves move. Return true if player survives, false if he dies. */main.c lines 312–313 at e616052 · upstream ↗ 442 if (randrange(1000) < 95 * (game.dflag - 2)) {main.c lines 437–444 at e616052 · upstream ↗ 457 if (game.dflag == 2) { 458 game.dflag = 3;
main.c lines 457–458 at e616052 · upstream ↗ 472 game.oldlc2 = game.loc; 473 return false;
main.c lines 469–473 at e616052 · upstream ↗ 3 A knife has been thrown (first set always misses) 3+
advent.h#L198-L202 · upstream ↗ 717 if (HERE(FOOD)) { 718 game.dflag += 2;
actions.c lines 716–719 at e616052 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^The rocket launcher's and the Deviator's missiles aim at a random point near the target. 15 times in 16 the miss distance is a random byte halved until it is at most 8 + the distance to the target in whole tiles, and 1 time in 16 at most 8 + a second random byte, in sixteenths of a tile, in a random direction. The rocket turret's missiles carry no such flag and fly to the target point.CodeOpenDUNE
How we know
1985 if (ui->flags.notAccurate) { 1986 bullet->currentDestination = Tile_MoveByRandom(tile, (Tools_Random_256() & 0xF) != 0 ? Tile_GetDistance(position, tile) / 256 + 8 : Tools_Random_256() + 8, false);
src/unit.c lines 1985–1987 at ebea79a · upstream ↗ 319 newDistance = Tools_Random_256(); 320 while (newDistance > distance) newDistance /= 2; ⋮ 323 orientation = Tools_Random_256(); 324 x += ((_stepX[orientation] * distance) / 128) * 16;
src/tile.c lines 319–325 at ebea79a · upstream ↗ 1405 /* name */ "Rocket", ⋮ 1454 /* notAccurate */ true,
src/table/unitinfo.c lines 1405–1454 at ebea79a · upstream ↗ 1551 /* name */ "GRocket", ⋮ 1600 /* notAccurate */ true,
src/table/unitinfo.c lines 1551–1600 at ebea79a · upstream ↗ 1478 /* name */ "ARocket", ⋮ 1527 /* notAccurate */ false,
src/table/unitinfo.c lines 1478–1527 at ebea79a · upstream ↗ 31 UNIT_MISSILE_ROCKET = 19, 32 UNIT_MISSILE_TURRET = 20, 33 UNIT_MISSILE_DEVIATOR = 21,
src/unit.h lines 31–33 at ebea79a · upstream ↗ 595 /* bulletType */ UNIT_MISSILE_ROCKET,src/table/unitinfo.c line 595 at ebea79a · upstream ↗ 668 /* bulletType */ UNIT_MISSILE_DEVIATOR,src/table/unitinfo.c line 668 at ebea79a · upstream ↗ 529 type = UNIT_MISSILE_TURRET;src/script/structure.c line 529 at ebea79a · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abcdIn EarthBound Beginnings (English build), the target of a plain attack dodges when a random byte is at most max(0, ⌊(256 + target's Fight − attacker's Fight) ÷ 2⌋ − 102), 27 in 256 at equal Fight; a paralyzed, sleeping, or petrified target can't dodge. The attacker has no accuracy stat of its own.CodeNathan-R-Og/mother
How we know
3106; Used by Normal Attack and all its goons (various semi-clones) to determine if physical missed. 3107; Uses Fight in calculation. "Base chance" to dodge is ~10% (26/256). ⋮ 3110BINSTCONDITION1_DODGED: ⋮ 3112 bne @DodgeFalse ⋮ 3115 and #PETRIFICATION | PARALYSIS | SLEEP 3116 bne @DodgeFalse ⋮ 3119 lda BATTLER_CORES, y 3120 sta battle_wordvar60 3121 ldy attacker_offset 3122 lda BATTLER_CORES, y 3123 sta battle_wordvar62 3124 jsr DoFightEquation ⋮
src/global/prg/battle.asm lines 3106–3133 at e0b3e3f · upstream ↗ 3276DoFightEquation: ⋮ 3282 sta battle_wordvar60 ⋮ 3289 sbc #$66 3290 bcs :+ 3291 lda #$00 3292: sta battle_wordvar60 3293 jsr RNG_BYTE 3294 sta battle_wordvar62
src/global/prg/battle.asm lines 3276–3295 at e0b3e3f · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^Zork I's ZIL source sets the player's fighting strength at 2 + score ÷ 70, rounded down (computed from 2 + score ÷ (350 ÷ (7 − 2))), from 2 at no points to 7 at 350, plus a wound modifier that is 0 when unhurt. A villain's strength is its STRENGTH: 2 for the troll and 5 for the thief. Attacked with its bane, the sword for the troll and the nasty knife for the thief, a villain counts 1 less, but no less than 1; a thief engrossed in a treasure counts at most 2.CodeZork I ZIL source
How we know
3323<CONSTANT STRENGTH-MAX 7>1actions.zil lines 3323–3324 at 97b7b3d · upstream ↗ 3377 <+ ,STRENGTH-MIN 3378 </ ,SCORE 3379 </ ,SCORE-MAX 3380 <- ,STRENGTH-MAX ,STRENGTH-MIN>>>>>
1actions.zil lines 3375–3381 at 97b7b3d · upstream ↗ 1046 (STRENGTH 2)>1dungeon.zil lines 1036–1046 at 97b7b3d · upstream ↗ 978 (STRENGTH 5)>1dungeon.zil lines 968–978 at 97b7b3d · upstream ↗ 3394 <SET TMP <- .OD <GET .OO ,V-BEST-ADV>>>1actions.zil lines 3383–3397 at 97b7b3d · upstream ↗ 3802 <LTABLE <TABLE TROLL SWORD 1 0 TROLL-MELEE>1actions.zil lines 3801–3803 at 97b7b3d · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^In Zork I's ZIL source each blow, by the player or a villain, reads 9 entries of a result table picked by the defender's strength, and a roll of 1–9 picks one. A defender of strength 1 uses DEF1, starting 0, 1, or 2 entries in for an attacker of strength 1, 2, or 3 and up. A defender of 2 uses DEF2A for an attacker of 1, or DEF2B starting 0, 1, or 2 entries in for 2, 3, or 4 and up. A defender of 3 or more uses the attacker's strength less the defender's, clamped to −2..2: DEF3A starting 0 or 1 entries in for −2 or −1, DEF3B likewise for 0 or 1, and DEF3C for 2. The results are miss, stagger, light wound, serious wound, knockout, and kill; the DEF3 tables hold no knockout or kill, and an unarmed or unconscious villain dies to the player's blow outright.CodeZork I ZIL source
How we know
3250<CONSTANT SERIOUS-WOUND 5> ;"defender seriously wounded"1actions.zil lines 3246–3254 at 97b7b3d · upstream ↗ 3261 STAGGER STAGGER ⋮ 3268 STAGGER STAGGER 3269 LIGHT-WOUND LIGHT-WOUND ⋮ 3275 STAGGER STAGGER 3276 LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND ⋮ 3283 STAGGER STAGGER 3284 LIGHT-WOUND LIGHT-WOUND ⋮ 3290 STAGGER STAGGER 3291 LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND ⋮ 3296 MISSED 3297 STAGGER STAGGER 3298 LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND LIGHT-WOUND
1actions.zil lines 3258–3299 at 97b7b3d · upstream ↗ 3313 <TABLE DEF3A1actions.zil lines 3301–3317 at 97b7b3d · upstream ↗ 2644 <PUT ,DEF1-RES 1 <REST ,DEF1 2>>1dungeon.zil lines 2644–2649 at 97b7b3d · upstream ↗ 3440 <SET RES <GET .TBL <- <RANDOM 9> 1>>>1actions.zil lines 3427–3440 at 97b7b3d · upstream ↗ cannot defend himself: He dies." CR>
1actions.zil#L3502-L3521 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^Computed from Zork I's ZIL source: at 0 points the player's strength is 2. Swinging the sword at the unhurt troll (2, less 1 for the sword) reads DEF1 from its second entry, so a blow misses 3 times in 9, staggers 2, knocks out 2, and kills 2. Swinging the nasty knife at the thief when he isn't engrossed (5, less 1) reads DEF3A from its start: 5 misses, 2 staggers, and 2 light wounds, and no kill.CodeZork I ZIL source
How we know
3260 MISSED MISSED MISSED MISSED 3261 STAGGER STAGGER 3262 UNCONSCIOUS UNCONSCIOUS 3263 KILLED KILLED KILLED KILLED KILLED>>
1actions.zil lines 3258–3263 at 97b7b3d · upstream ↗ 3282 MISSED MISSED MISSED MISSED MISSED 3283 STAGGER STAGGER 3284 LIGHT-WOUND LIGHT-WOUND 3285 SERIOUS-WOUND SERIOUS-WOUND>>
1actions.zil lines 3280–3285 at 97b7b3d · upstream ↗ 3491 <SET ATT <FIGHT-STRENGTH>>1actions.zil lines 3491–3495 at 97b7b3d · upstream ↗ 3520 <SET TBL <GET ,DEF3-RES <+ .ATT 2>>>)>1actions.zil lines 3510–3521 at 97b7b3d · upstream ↗ 3377 <+ ,STRENGTH-MIN 3378 </ ,SCORE 3379 </ ,SCORE-MAX 3380 <- ,STRENGTH-MAX ,STRENGTH-MIN>>>>>
1actions.zil lines 3375–3381 at 97b7b3d · upstream ↗ 3394 <SET TMP <- .OD <GET .OO ,V-BEST-ADV>>>1actions.zil lines 3383–3397 at 97b7b3d · upstream ↗ 2644 <PUT ,DEF1-RES 1 <REST ,DEF1 2>>1dungeon.zil lines 2644–2645 at 97b7b3d · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^ abIn EarthBound (US release), a bash first misses at the attacker's miss rate in 16: for a party member its weapon's, or 1 with no weapon, plus 8 while crying or nauseous; for an enemy its own. Then the target dodges with a chance of about (2 × target's Speed − attacker's Speed) in 500, never when that is 0 or less, nor while the target is paralyzed, asleep, immobilized, or solidified.CodeHerringway/ebsrc
How we know
40 OPTIMIZED_MULT @VIRTUAL04, .SIZEOF(item) 41 CLC 42 ADC #item::params + item_parameters::special ⋮ 45 LDA f:ITEM_CONFIGURATION_TABLE,X ⋮ 52 STX @MISS_CHANCE 53 BRA @UNKNOWN3 54@UNKNOWN2: 55 LDX #1 56 STX @MISS_CHANCE
src/battle/miss_calc.asm lines 40–56 at 68aec5c · upstream ↗ 72 ADC #8 ;miss chance + 1/2 ⋮ 82 ADC #enemy_data::miss_rate ⋮ 89 LDX @MISS_CHANCE 90 BEQ @UNKNOWN9 91 LDA #16 92 JSR RAND_LIMIT 93 STA @VIRTUAL02 94 LDX @MISS_CHANCE 95 TXA 96 DEC 97 CMP @VIRTUAL02 98 BCC @UNKNOWN9
src/battle/miss_calc.asm lines 72–98 at 68aec5c · upstream ↗ 34 LDX CURRENT_TARGET 35 LDA a:battler::speed,X 36 ASL 37 LDX CURRENT_ATTACKER 38 SEC 39 SBC a:battler::speed,X 40 STA @LOCAL00 41 STA @VIRTUAL02 42 LDA #0 43 CLC 44 SBC @VIRTUAL02 45 BRANCHGTS @UNKNOWN6 ⋮
src/battle/determine_dodge.asm lines 34–47 at 68aec5c · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abEarthBound (US release) keeps EarthBound Beginnings' order of a plain attack, with the "SMAAAASH!!" rolled before the dodge so it can't be dodged, but changes the numbers: the chance comes from the attacker's Guts alone (about Guts in 500) instead of Fight against Fight; the SMAAAASH deals 4 × Offense − Defense instead of the full Offense; a normal hit deals 2 × Offense − Defense instead of Offense − Defense ÷ 2; and the dodge comes from Speed instead of Fight.CodeNathan-R-Og/mother · Herringway/ebsrc
How we know
585BATTLE_ACTION1: ⋮ 590ba_jumpif BA_CON::IS_CRIT, BA1_CRIT ⋮ 596ba_jumpifnot BA_CON::IS_DODGE, BATACT_DODGED_SWIFTLY ⋮ 602 BA1_CRIT: ⋮ 607ba_misc BA_MISC::DAMAGECALC_CRIT, 0
src/global/battle_data.asm lines 585–608 at e0b3e3f · upstream ↗ 3137BINSTCONDITION2_CRIT: ⋮ 3141 lda BATTLER_CORES, y ⋮ 3144 lda BATTLER_CORES, y ⋮ 3146 jsr DoFightEquation
src/global/prg/battle.asm lines 3137–3146 at e0b3e3f · upstream ↗ 3399; Normal Attack Damage = AttackerOFF - (DefenderDEF / 2) 3400; If DEF > OFF, Damage = (3 * AttackerOFF - DefenderDEF ) / 4 ⋮ 3407 sec ⋮ 3413 sbc battle_wordvar64 ⋮ 3419 bcc @SETNUM_WeakBash 3420 lsr battle_wordvar64+1 3421 ror battle_wordvar64 3422 sec 3423 lda battle_wordvar66 3424 sbc battle_wordvar64 3425 sta battle_wordvar60
src/global/prg/battle.asm lines 3399–3428 at e0b3e3f · upstream ↗ 3483; Damage = AttackerOFF ⋮ 3487 lda BATTLER_OFF, y
src/global/prg/battle.asm lines 3483–3488 at e0b3e3f · upstream ↗ 11 JSR SMAAAASH 12 CMP #0 13 BNE @UNKNOWN1 14 JSR DETERMINE_DODGE 15 CMP #0 16 BNE @UNKNOWN0 17 JSR BTLACT_LEVEL_2_ATK
src/battle/actions/bash.asm lines 11–17 at 68aec5c · upstream ↗ 11 LDA __BSS_START__ + battler::guts,X ⋮ 24 JSR SUCCESS_500
src/battle/smaaaash.asm lines 10–24 at 68aec5c · upstream ↗ 60 LDA __BSS_START__ + battler::offense,X 61 ASL 62 ASL ⋮ 65 SBC __BSS_START__ + battler::defense,X
src/battle/smaaaash.asm lines 60–65 at 68aec5c · upstream ↗ 8 LDA a:battler::offense,X 9 ASL 10 LDX CURRENT_TARGET 11 SEC 12 SBC a:battler::defense,X
src/battle/actions/level_2_attack.asm lines 8–12 at 68aec5c · upstream ↗ 34 LDX CURRENT_TARGET 35 LDA a:battler::speed,X 36 ASL 37 LDX CURRENT_ATTACKER 38 SEC 39 SBC a:battler::speed,X
src/battle/determine_dodge.asm lines 34–39 at 68aec5c · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abA physical attack first rolls 0–99 against its hit % (100 where the attack type calls
SetHit100andTargetEvade, as fists and katanas do) and misses on a roll at or above it; a target that can dodge then rolls 0–99 against its evade %, and a roll under it is a miss, or a shield block when the target carries a shield.Codeeverything8215, FF5 disassemblyHow we know
19091;Check for Physical Hit 19092.proc CheckPHit ⋮ 19094_7E23: 19095 jsr Random_0_99 19096 cmp HitPercent 19097 bcs Miss 19098 ldx TargetOffset ⋮ 19106 jsr Random_0_99 19107 cmp EvadePercent 19108 bcs Return 19109 ldx TargetOffset 19110 lda CharStruct::RHShield,X ⋮
src/battle/battle-main.asm lines 19091–19122 at 997c87d · upstream ↗ 18698.proc SetHit100andTargetEvade ⋮ 18700_7C47: 18701 lda #$64 18702 sta HitPercent 18703 ldx TargetOffset 18704 lda CharStruct::Evade,X 18705 sta EvadePercent
src/battle/battle-main.asm lines 18698–18705 at 997c87d · upstream ↗ 16363;Attack Type 30 (Fists) ⋮ 16368 jsr SetHit100andTargetEvade 16369 jsr HitPhysical
src/battle/battle-main.asm lines 16363–16369 at 997c87d · upstream ↗ 16574;Attack Type 37 (Katanas) ⋮ 16581 jsr SetHit100andTargetEvade 16582 jsr HitPhysical
src/battle/battle-main.asm lines 16574–16582 at 997c87d · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abFinal Fantasy IV counts a weapon attack's hits from a loop of percentage rolls, one per point of the attack multiplier, less the target's evade rolls; Final Fantasy V's physical check makes one hit roll and one evade roll, and the attack either lands or misses.Codeeverything8215, FF4 disassembly · everything8215, FF5 disassembly
How we know
16CalcHits: ⋮ 21@c990: jsr Rand99 22 cmp $38fa ; check vs. hit rate 23 bcs @c99b 24 inc $38fd ; increment number of hits 25@c99b: dey 26 bne @c990
battle/damage.asm lines 16–27 at a360e2e · upstream ↗ 19092.proc CheckPHit ⋮ 19095 jsr Random_0_99 19096 cmp HitPercent 19097 bcs Miss ⋮ 19106 jsr Random_0_99 19107 cmp EvadePercent ⋮ 19118Miss: 19119 inc AtkMissed
src/battle/battle-main.asm lines 19092–19122 at 997c87d · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^ abcUnless the target has Image, which a physical attack instead tests with a random byte under $40 (a miss that may remove the Image), an attack that can miss hits when a roll of 0–99 is under its hit rate times the target's stored evade, over 256, where the stored value is 256 − 2 × the evade % (255 for 0). The branch meant to pick Evade for a physical attack tests a carry flag that the check before it has cleared, so every such attack is checked against the target's magic evade (MBlock) and skips the Blind and status adjustments; the disassembly carries a
BUGFIX_EVADEoption, credited to Terii Senshi, that restores Evade.Codeeverything8215, FF6 disassemblyrevisedHow we know
138 lda $11a2 139 lsr 140 bcc @233f ; branch if a magic attack 141 lda near wTargetProp2::RetalFlags,y ; RETAL_FLAGS::RETORT 142 lsr 143 bcs @22e8 ; branch if $3e4c.0 is set (retort) 144 lda near wTargetProp3::w7e3ee5,y 145 bit #STATUS2::IMAGE 146.if BUGFIX_EVADE 147 beq @2346 148.else 149 beq @233f ⋮
src/battle/check_hit.asm lines 138–210 at 8130132 · upstream ↗ 121; [ invert evade/mblock ] ⋮ 123_evasionconv: 124InvertEvade: 125@2861: .a8 126 asl 127 bcc @2866 128 lda #$ff 129@2866: neg_a 130 bne @286c 131 dec
src/battle/init_attacker.asm lines 121–132 at 8130132 · upstream ↗ 41; evade bugfix by Terii Senshi 42def_config BUGFIX_EVADE, 0
src/common/const.inc lines 41–42 at 8130132 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^ abcdA monster's physical attack has no critical branch and no dodge roll for the hero;
EnPhysAttackgoes straight toEnCalcHitDmg, and only 0 damage misses.Codenmikstas/dragon-warrior-disassemblyHow we know
7765LEBD6: JSR EnCalcHitDmg ;($EFF4)Calculate enemy hit damage on player. ⋮ 7767LEBD9: LDA CalcDamage ;Did enemy do damage to the player? 7768LEBDB: BNE EnHitsPlayer ;If so, branch to subtract damage from player's HP.
source_files/Bank03.asm lines 7751–7774 at ebe6a13 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abIn Red and Blue, a damaging move runs
CriticalHitTest,CalculateDamage(base formula),AdjustDamageForMoveType(STAB, then type rows),RandomizeDamage, and thenMoveHitTest(accuracy).Codepret/pokeredHow we know
3144 call CalculateDamage ⋮ 3147 call AdjustDamageForMoveType 3148 call RandomizeDamage 3149.moveHitTest 3150 call MoveHitTest
engine/battle/core.asm lines 3140–3150 at af51989 · upstream ↗ engine/battle/core.asm#L5531-L5543 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abA plain damaging move runs critical, damagestats, damagecalc (base formula, item boosts, and critical ×2), stab (weather, badges, STAB, and type rows), damagevariation, and then checkhit (accuracy).Codepret/pokecrystal
How we know
5NormalHit: 6 checkobedience 7 usedmovetext 8 doturn 9 critical 10 damagestats 11 damagecalc 12 stab 13 damagevariation 14 checkhit
data/moves/effects.asm lines 5–14 at 97187cd · upstream ↗ engine/battle/effect_commands.asm#L2983-L3023 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^In the North American build, damage is attack less defense, where attack is the weapon's might plus the triangle's damage bonus, tripled when the attacker or its weapon is effective against the target (doubled instead when the effective weapon is one of eight legendary weapons), plus the attacker's strength, and defense is terrain defense plus Defense, or terrain resistance plus Resistance against magic; no roll changes it except two skills, Pierce (which sets defense to 0) and Great Shield (which sets the damage to 0); a critical triples it, and the result is held within 0–127.Codefireemblem8urevised
How we know
512 if (GetItemAttributes(defender->weapon) & IA_MAGICDAMAGE) 513 attacker->battleDefense = attacker->terrainResistance + attacker->unit.res; ⋮ 515 attacker->battleDefense = attacker->terrainResistance + attacker->unit.res; ⋮ 517 attacker->battleDefense = attacker->terrainDefense + attacker->unit.def;
src/bmbattle.c lines 511–517 at 04d1edb · upstream ↗ 527 attacker->battleAttack = GetItemMight(attacker->weapon) + attacker->wTriangleDmgBonus; ⋮ 530 if (IsUnitEffectiveAgainst(&attacker->unit, &defender->unit) == TRUE) 531 attack = attacker->battleAttack * 3; ⋮ 533 if (IsItemEffectiveAgainst(attacker->weapon, &defender->unit) == TRUE) { ⋮ 538 case ITEM_SWORD_AUDHULMA: ⋮ 545 case ITEM_LANCE_SIEGMUND: 546 attack *= 2; ⋮ 549 default: 550 attack *= 3; ⋮ 556 attacker->battleAttack = attack; 557 attacker->battleAttack += attacker->unit.pow;
src/bmbattle.c lines 527–557 at 04d1edb · upstream ↗ 1022 if (gBattleHitIterator->attributes & BATTLE_HIT_ATTR_PIERCE) 1023 defense = 0; ⋮ 1025 gBattleStats.damage = attack - defense; ⋮ 1027 if (gBattleHitIterator->attributes & BATTLE_HIT_ATTR_GREATSHLD) 1028 gBattleStats.damage = 0;
src/bmbattle.c lines 1022–1028 at 04d1edb · upstream ↗ 1030 if (BattleRoll1RN(gBattleStats.critRate, FALSE) == TRUE) { ⋮ 1039 gBattleStats.damage = gBattleStats.damage * 3;
src/bmbattle.c lines 1030–1039 at 04d1edb · upstream ↗ 1043 if (gBattleStats.damage > BATTLE_MAX_DAMAGE) 1044 gBattleStats.damage = BATTLE_MAX_DAMAGE; ⋮ 1046 if (gBattleStats.damage < 0) 1047 gBattleStats.damage = 0;
src/bmbattle.c lines 1043–1047 at 04d1edb · upstream ↗ 16 // Maximum battle damage 17 BATTLE_MAX_DAMAGE = 127,
include/bmbattle.h lines 16–17 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Revised after a check by a second AI model, 2026-10-21.
- ^The NES manual says Agility helps the hero escape: "This means that you can more easily avoid the enemy or run away."ManualDragon Warrior NES manual
How we know
Your character becomes faster at higher levels. This means that you can more easily avoid the enemy or run away.
p. 15, Agility · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^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.Codenmikstas/dragon-warrior-disassembly
How we know
8667LF0D9: ADC DisplayedStr ;Add bonus from weapons table to strength attribute. 8668LF0DB: STA DisplayedAttck ; ⋮ 8671LF0DF: LSR ;Divide agility by 2 and add to defense attribute. ⋮ 8702LF107: ADC #$02 ;Dragon's scale equipped. Add 2 to defense.
source_files/Bank03.asm lines 8655–8704 at ebe6a13 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^At the start of a battle,
CalcWhoIsNextgives 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.Codenmikstas/dragon-warrior-disassemblyHow we know
6655LE5BF: JSR CalcWhoIsNext ;($EEC0)Randomly calculate who attacks next. ⋮ 6657LE5C2: BCS StartPlayerTurn ;($E5CE)It's the player's turn to attack.
source_files/Bank03.asm lines 6654–6663 at ebe6a13 · upstream ↗ 8293LEEC5: AND #$3F ;Keep only lower 6 bits(0-63). ⋮ 8297LEEC9: LDA EnBaseDef ; ⋮ 8313LEEE6: LDA DisplayedAgi ; ⋮ 8321LEEF5: SEC ;Subtract the enemy's defense*rnd from player's agility*rnd.
source_files/Bank03.asm lines 8290–8325 at ebe6a13 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
TryRunlets 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.Codenmikstas/dragon-warrior-disassembly · Ryan8bit, DW FormulasHow we know
7191LE894: BIT PlayerFlags ;Is the enemy asleep? 7192LE896: BVS RunSuccessful ;If so, branch for a successful run. ⋮ 7194LE898: JSR TryRun ;($EE91)Determine if player can run.
source_files/Bank03.asm lines 7191–7195 at ebe6a13 · upstream ↗ 8260LEE96: CMP #EN_STONEMAN ;Dragonlord 1 or Dragonlord 2? ⋮ 8263LEE9A: LDA RandNumUB ;Load a random number and keep all the bits(0-255). ⋮ 8276LEEAC: BCC CalcWhoIsNext ;If not, branch. ⋮ 8279LEEB0: AND #$3F ; ⋮ 8284LEEB9: AND #$1F ;previous number to get a range of 0-95. 8285LEEBB: ADC MultNum2LB ;
source_files/Bank03.asm lines 8256–8293 at ebe6a13 · upstream ↗ 970.alias EN_DRUINLORD $13 ;Druinlord. 971.alias EN_DROLLMAGI $14 ;Drollmagi. ⋮ 981.alias EN_GDRAGON $1E ;Green dragon. ⋮ 986.alias EN_STONEMAN $23 ;Stoneman.
source_files/Dragon_Warrior_Defines.asm lines 970–986 at ebe6a13 · upstream ↗ Group 1: #00 (Slime) - #19 (Druinlord)
II.B, Running · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^An attack swings times for hit rate , times a multiplier that FAST raises from 1 to 2; an unarmed Black Belt or Master swings twice as often.CodeDisch, FF1 disassembly
How we know
5657 LDA (btl_ob_charstat_ptr), Y ; num hits = hitrate / 32 + 1Final Fantasy Disassembly/bank_0C.asm lines 5656–5666 at cbb87d3 · upstream ↗ 4407 : LDA btl_attacker_numhits ; get proper number of hits (numhits * mult) 4408 LDX btl_attacker_numhitsmult ; the mult is essentially the multiplier for the FAST spell 4409 JSR MultiplyXA
Final Fantasy Disassembly/bank_0C.asm lines 4407–4415 at cbb87d3 · upstream ↗ 8618 INC btlmag_defender_numhitsmult ; Increase hit multiplier ⋮ 8625 LDA #$02 ; and max the multiplier at 2
Final Fantasy Disassembly/bank_0C.asm lines 8616–8627 at cbb87d3 · upstream ↗ 5745 LDY #btlch_numhits ; unarmed BB/master gets 2x as many hitsFinal Fantasy Disassembly/bank_0C.asm lines 5745–5748 at cbb87d3 · upstream ↗ 897 LDY #ch_hitrate - ch_stats ; assign Hit Rate bonus ⋮ 900 ADC lut_LvlUpHitRateBonus, X 901 JSR CapAAt200 ; cap hit rate at 200
Final Fantasy Disassembly/bank_0B.asm lines 897–901 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^A character's damage stat rises by 1 whenever a level-up raises Strength to an even number, and by the weapon's damage when it is equipped; the weapon's hit bonus adds to hit rate the same way.CodeDisch, FF1 disassembly
How we know
1060 LDY #ch_str - ch_stats ; damage goes up 1 pt for each 2pts of strength ⋮ 1066 LDY #ch_dmg - ch_stats ; if yes, add 1 to damage stat
Final Fantasy Disassembly/bank_0B.asm lines 1060–1072 at cbb87d3 · upstream ↗ 10921 ADC (tmp), Y ; add to it the weapon's hit bonus ⋮ 10927 ADC (tmp), Y ; add weapon's damage bonus
Final Fantasy Disassembly/bank_0F.asm lines 10919–10928 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^A physical attack gains 40 hit chance and 4 base damage when its category or element matches the defender's, but neither side of a battle can trigger it: a character's attack reads the character's own category and weakness bytes instead of the weapon's, and a monster's attack is matched against a character's, and all four bytes are always 0.CodeDisch, FF1 disassembly
How we know
4334 : LDA btl_attacker_category ; see if attacker category matches defender category 4335 AND btl_defender_category ⋮ 4338 LDA btl_attacker_element ; see if attacker element matches defender elemental weakness 4339 AND btl_defender_elemweakness ⋮ 4345 LDA #MATHBUF_HITCHANCE ; +40 bonus to hit chance ⋮ 4354 LDA math_basedamage ; and +4 bonus to base damage
Final Fantasy Disassembly/bank_0C.asm lines 4334–4357 at cbb87d3 · upstream ↗ 3998 LDY #btlch_category ; BUGGED - this is pulling a player's category (always 0). It should be ⋮ 4002 LDY #btlch_elemweak ; BUGGED - uses player elemental weakness as attack element. This is always 0
Final Fantasy Disassembly/bank_0C.asm lines 3998–4004 at cbb87d3 · upstream ↗ 4167 LDY #btlch_category ; IB: assigned category. Always zero? Players don't have categories. ⋮ 4171 LDY #btlch_elemweak ; IB: elemental weakness. (Always zero?)
Final Fantasy Disassembly/bank_0C.asm lines 4166–4172 at cbb87d3 · upstream ↗ 5668 ; Players start with no elemental weakness or assigned category 5669 LDA #$00 5670 LDY #btlch_category 5671 STA (btl_ib_charstat_ptr), Y 5672 LDY #btlch_elemweak 5673 STA (btl_ib_charstat_ptr), Y
Final Fantasy Disassembly/bank_0C.asm lines 5668–5673 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^In the North American build, a unit's crit is its weapon's crit plus half its skill, plus 15 for classes with a crit bonus; the crit shown and rolled is that less the defender's luck, at least 0, and one random number from 0 to 99 below it triples the hit's damage.Codefireemblem8u
How we know
589 bu->battleCritRate = GetItemCrit(bu->weapon) + (bu->unit.skl / 2); ⋮ 591 if (UNIT_CATTRIBUTES(&bu->unit) & CA_CRITBONUS) 592 bu->battleCritRate += 15; ⋮ 596 bu->battleDodgeRate = bu->unit.lck;
src/bmbattle.c lines 588–597 at 04d1edb · upstream ↗ 612 attacker->battleEffectiveCritRate = attacker->battleCritRate - defender->battleDodgeRate; ⋮ 615 attacker->battleEffectiveCritRate = 0; ⋮ 617 if (attacker->battleEffectiveCritRate < 0) 618 attacker->battleEffectiveCritRate = 0;
src/bmbattle.c lines 612–618 at 04d1edb · upstream ↗ 85s8 Roll1RN(int threshold) { 86 return (threshold > NextRN_100());
src/rng.c lines 85–87 at 04d1edb · upstream ↗ 1030 if (BattleRoll1RN(gBattleStats.critRate, FALSE) == TRUE) { ⋮ 1038 gBattleHitIterator->attributes = gBattleHitIterator->attributes | BATTLE_HIT_ATTR_CRIT; 1039 gBattleStats.damage = gBattleStats.damage * 3;
src/bmbattle.c lines 1030–1039 at 04d1edb · upstream ↗ 883 gBattleStats.critRate = attacker->battleEffectiveCritRate;src/bmbattle.c line 883 at 04d1edb · upstream ↗ 243 critRate = gBattleActor.battleEffectiveCritRate;src/bksel.c line 243 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^A swing is critical when its roll is at most the crit chance, which is capped at the hit chance; a critical adds the swing's random damage again, with no absorb taken from it.CodeDisch, FF1 disassembly
How we know
4404 LDA math_hitchance ; crit chance cannot exceed hit chanceFinal Fantasy Disassembly/bank_0C.asm lines 4401–4405 at cbb87d3 · upstream ↗ 4515 LDA math_critchance ; see if hit value is <= crit chance (this will be impossible if the attack was a miss) ⋮ 4519 LDX math_basedamage ; add random damage to our total 4520 JSR MathBuf_Add 4521 INC battle_critsconnected
Final Fantasy Disassembly/bank_0C.asm lines 4514–4521 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^A multi-hit move runs the critical test, the damage formula, and the accuracy roll once; every later hit repeats the first hit's damage, and a first hit that misses ends the move.Codepret/pokered
How we know
3246 bit ATTACKING_MULTIPLE_TIMES, [hl] 3247 jr z, .executeOtherEffects 3248 ld a, [wPlayerNumAttacksLeft] 3249 dec a 3250 ld [wPlayerNumAttacksLeft], a 3251 jp nz, GetPlayerAnimationType ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints. 3252 ; damage calculation and accuracy tests only happen for the first hit
engine/battle/core.asm lines 3246–3253 at af51989 · upstream ↗ 1AlwaysHappenSideEffects: ⋮ 7 db TWO_TO_FIVE_ATTACKS_EFFECT
data/battle/always_happen_effects.asm lines 1–7 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
BattleCommand_EndLoopgives 2–5 hits with Red and Blue's odds and Triple Kick 1–3 hits, 1/3 each, and jumps back to thecriticalcommand, so every hit rolls its own critical and damage;checkhitsits before the loop and runs once.Codepret/pokecrystalHow we know
5203BattleCommand_EndLoop: 5204; Loop back to 'critical'. ⋮ 5233.reject_triple_kick_sample 5234 call BattleRandom 5235 and $3 5236 jr z, .reject_triple_kick_sample ⋮ 5271.not_triple_kick 5272 call BattleRandom 5273 and $3 5274 cp 2 5275 jr c, .got_number_hits 5276 call BattleRandom ⋮
engine/battle/effect_commands.asm lines 5203–5284 at 97187cd · upstream ↗ 5320.loop_back_to_critical ⋮ 5327 cp critical_command
engine/battle/effect_commands.asm lines 5320–5328 at 97187cd · upstream ↗ 842MultiHit: 843 checkobedience 844 usedmovetext 845 doturn 846 startloop 847 lowersub 848 checkhit 849 critical 850 damagestats 851 damagecalc
data/moves/effects.asm lines 842–851 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
Cmd_setmultihitcountergives 2 or 3 hits with probability 3/8 each and 4 or 5 with 1/8 each; the loop rerunscritcalcanddamagecalcfor every hit, after oneaccuracycheck.Codepret/pokeemeraldHow we know
7145 else ⋮ 7147 gMultiHitCounter = Random() & 3; 7148 if (gMultiHitCounter > 1) 7149 gMultiHitCounter = (Random() & 3) + 2; 7150 else 7151 gMultiHitCounter += 2;
src/battle_script_commands.c lines 7139–7155 at 731ad5b · upstream ↗ 604BattleScript_EffectMultiHit:: 605 attackcanceler 606 accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE ⋮ 609 setmultihitcounter 0 ⋮ 612BattleScript_MultiHitLoop:: ⋮ 620 critcalc 621 damagecalc 622 typecalc ⋮ 639 decrementmultihit BattleScript_MultiHitLoop
data/battle_scripts_1.s lines 604–639 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^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.WikidataWikidata
How we know
+1986-05-27T00:00:00Z … +1989-08-00T00:00:00Z
Q2313869, P178 developer, P123 publisher, and P577 publication date qualified by P291 place and P400 platform · archived copy ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-21.
- ^Pokémon Emerald (developer Game Freak, publisher Nintendo, Game Boy Advance, and Generation III core series) came out in Japan on 16 September 2004 and North America on 1 May 2005.WikiBulbapedia, “Pokémon Emerald Version”
How we know
Developer: Game Freak … Publisher: Nintendo … Part of: Generation III core series … Japan: September 16, 2004 … North America: May 1, 2005
infobox, Basic info and Release dates · archived copy ↗ The quote matches our archived copy.
Sources
Code
- nmikstas. 2023. “dragon-warrior-disassembly: NES Dragon Warrior software disassembly.” Commit ebe6a13. nmikstas/dragon-warrior-disassembly @ ebe6a13 · licence, all uses
- Disch. 2019. “Final Fantasy Disassembly.” Commit cbb87d3. BenWenger/FinalFantasyDisassembly @ cbb87d3 · licence, all uses
- pret contributors. 2026. “pokered: disassembly of Pokémon Red and Blue.” pret. Commit af51989. pret/pokered @ af51989 · licence, all uses
- pret contributors. 2026. “pokecrystal: disassembly of Pokémon Crystal.” pret. Commit 97187cd. pret/pokecrystal @ 97187cd · licence, all uses
- pret contributors. 2026. “pokeemerald: decompilation of Pokémon Emerald.” pret. Commit 731ad5b. pret/pokeemerald @ 731ad5b · licence, all uses
- FireEmblemUniverse contributors. 2026. “fireemblem8u: decompilation of Fire Emblem: The Sacred Stones.” FireEmblemUniverse. Commit 04d1edb. FireEmblemUniverse/fireemblem8u @ 04d1edb · licence, all uses
- Toy, Michael, Ken Arnold, and Glenn Wichman. 2016. “Rogue 5.4.4 source code.” Commit cf9bd26. Davidslv/rogue @ cf9bd26 · licence, all uses
- NetHack DevTeam. 2023. “NetHack 3.6.7 source code.” Commit ed600d9. NetHack/NetHack @ ed600d9 · licence, all uses
- Nathan-R-Og. 2026. “dq2: Disassembly of NES Dragon Warrior II.” Commit 0fb64a4. Nathan-R-Og/dq2 @ 0fb64a4 · licence, all uses
- 1990. “Final Fantasy (USA).” · licence, all uses
- Xeeynamo and ff7-decomp contributors. 2026. “ff7-decomp: a matching decompilation of Final Fantasy VII for the PlayStation (Xeeynamo/ff7-decomp).” Commit fc71ccc. Xeeynamo/ff7-decomp @ fc71ccc · licence, all uses
- everything8215. 2026. “Final Fantasy VI Disassembly.” Commit 8130132. everything8215/ff6 @ 8130132 · licence, all uses
- everything8215. 2022. “Final Fantasy II (NES) disassembly and ROM info.” Commit 8d26190. everything8215/ff2 @ 8d26190 · licence, all uses
- everything8215. 2022. “Final Fantasy III (NES) disassembly and ROM info.” Commit 1acef81. everything8215/ff3 @ 1acef81 · licence, all uses
- everything8215. 2022. “Final Fantasy IV Disassembly.” Commit a360e2e. everything8215/ff4 @ a360e2e · licence, all uses
- everything8215. 2026. “Final Fantasy V Disassembly.” Commit 997c87d. everything8215/ff5 @ 997c87d · licence, all uses
- pret contributors. 2026. “pokeyellow: disassembly of Pokémon Yellow.” pret. Commit b6696f2. pret/pokeyellow @ b6696f2 · licence, all uses
- pret contributors. 2026. “pokegold: disassembly of Pokémon Gold and Silver.” pret. Commit fc702b6. pret/pokegold @ fc702b6 · licence, all uses
- pret contributors. 2026. “pokeruby: decompilation of Pokémon Ruby and Sapphire.” pret. Commit 5784633. pret/pokeruby @ 5784633 · licence, all uses
- pret contributors. 2026. “pokefirered: decompilation of Pokémon FireRed and LeafGreen.” pret. Commit ce6406d. pret/pokefirered @ ce6406d · licence, all uses
- Nathan-R-Og. 2026. “mother: Disassembly of Mother/Earthbound Zero/Earthbound Beginnings for the NES.” Commit e0b3e3f. Nathan-R-Og/mother @ e0b3e3f · licence, all uses
- Herringway. 2026. “ebsrc: Source code recreation for the game Earthbound.” Commit 68aec5c. Herringway/ebsrc @ 68aec5c · licence, all uses
- FireEmblemUniverse contributors. 2026. “fireemblem6j: decompilation of Fire Emblem: The Binding Blade.” FireEmblemUniverse. Commit e83dd39. FireEmblemUniverse/fireemblem6j @ e83dd39 · licence, all uses
Primary
- America, Nintendo of. 1989. “Dragon Warrior instruction booklet (NES, North America).” Nintendo of America. original · archived · licence, all uses
Secondary
- Björk, Staffan. 2015. “Variable Accuracy.” Gameplay Design Patterns wiki (gdp3, Chalmers University of Technology). revision 23733. original · archived · licence, all uses
- Ryan8bit. 2011. “Dragon Warrior (NES) Formulas.” GameFAQs. v1.0. original · archived · licence, all uses
- Wikidata contributors. 2026. “Wikidata.” Wikimedia Foundation. original · licence, all uses
- Bulbapedia contributors. 2026. “Pokémon Emerald Version.” Bulbapedia (Bulbagarden). revision 4629817. original · archived · licence, all uses