On this page
  1. How it works
  2. Implementations
  3. Variants and combinations
  4. History
  5. Related
  6. Games
  7. References
  8. Sources

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.

Interactive: formula-lab (needs JavaScript)

Hit chance, in each game’s own content
  • 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.

RollThresholdCan a sure hit miss?Against damage
Dragon Warrior0–63, against the hero’s attacks only19,49the monster dodges below its nibble d19monsters’ attacks never roll49after19
Final Fantasy0–200, per swing23168 + hit rate − evade22, 1–255yes: 200 always misses23before, per swing23
Red and Bluea byte4accuracy byte × two stage ratios3yes: at most 255 in 2564after50
Crystala byte8the same, less 20 for a BrightPowder8no: 255 skips the roll8after51
Emerald1–10010accuracy % × one net stage ratio10no, at 100% and even stages10before11
The Sacred Stonesthe average of two 0–99 numbers35hit less avoid, within 0–10037no: 100 beats every average35before35,52
Rogue 5.40–19, plus bonuses28at least 20 less level and armor class28no: at level + armor class + bonus of 20 or more, every roll hits28before28
NetHack 3.6.71–2030below 1 + Luck + level + armor class + bonuses30no: a total over 20 always hits30before30

#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 d of its resistance byte, a chance of d/6419,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, ⌊255p/100⌋ for p 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

GameYearHowNote
Pokémon Red and Blue1996Move accuracyan accuracy byte out of 256, so even a 100% move misses 1 time in 256
Pokémon Yellow1998Move accuracyRed and Blue's accuracy byte, so a 100% move still misses 1 time in 256
Pokémon Gold and Silver1999Move accuracyan accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits
Pokémon Crystal2000Move accuracyan accuracy byte after stages, less 20 against a BrightPowder, and 255 always hits
Pokémon Ruby and Sapphire2002Move accuracyaccuracy in percent times one combined stage ratio, then ability and item modifiers
Pokémon Emerald2004Move accuracyaccuracy in percent times one combined stage ratio, checked before the damage
Pokémon FireRed and LeafGreen2004Move accuracyEmerald's percent accuracy, skipped for every move in Pokédude battles and for the player's in the first battle
Final Fantasy II1988Hit rolls less evade rollsevery dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry
Final Fantasy III1990Hit rolls less evade rollsevery dodge the target makes cancels one of the attacker's hits, so an evasive enemy blunts a flurry
Final Fantasy IV1991Hit rolls less evade rollsevery block the target makes cancels one of the attacker's hits
Dragon Warrior1986Dodge onlymost monsters dodge one or two of the hero's attacks in 64, a few far more, and the hero never dodges
Dragon Warrior II1987Dodge onlysome monsters dodge often, and a hero only rarely
Final Fantasy1987Hit rate against evademost swings land unless the target's evade outweighs the attacker's hit rate
Final Fantasy VII1997Hit rate against evadethe 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
Rogue1980d20 against armor classa 0–19 roll plus bonuses against 20 less level and armor class: 5% a point
NetHack1987d20 against armor classa 1–20 roll below 1 + Luck + level + armor class + bonuses: 5% a point, as in Rogue
Fire Emblem: The Binding Blade2002Two rolls averagedhit less avoid, against the average of two numbers from 0 to 100, so even a shown 100 can miss
Fire Emblem: The Sacred Stones2004Two rolls averagedhit 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 Adventure1976Flat chancea dwarf's knife hits 9.5% of the time after the first volley, more once the dwarves are fed
Dune II1992Aim scatterthe rocket launcher's and the Deviator's missiles fly to a random point near the target; turrets' missiles don't scatter
EarthBound Beginnings1989Dodge, stat against statthe target dodges from its Fight against the attacker's, 27 in 256 when they match
Zork I1980Strength picks a result tablethe defender's strength picks a result table, and a 1–9 roll picks miss, stagger, wound, knockout, or kill
EarthBound1994Miss, then a stat dodgea miss roll in 16 from the weapon, then a dodge of (2 × the target's Speed − the attacker's) in 500
Final Fantasy V1992Hit, then evadean attack lands whole or misses: one roll to hit, then one for the target to dodge
Final Fantasy VI1994Hit times evadehit 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)
Colossal Cave Adventure 1976In 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.Code
Rogue 1980In 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.Code
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.Code
Zork I 1980Zork 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.Code
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.Code
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.Code
Dragon Warrior 1986Zero damage from the hero ends the turn as a failed attack, before any dodge check.Code
After the damage is set, an awake monster dodges when a roll of 0–63 falls below d, the low nibble of its resistance byte, a chance of d/64; a sleeping monster never dodges, and spells skip the check.Code
A monster's physical attack has no critical branch and no dodge roll for the hero; EnPhysAttack goes straight to EnCalcHitDmg, and only 0 damage misses.Code
The dodge nibble d of the 40 monsters (each dodges d/64 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.Code
The high nibble h of the same byte blocks Hurt and Hurtmore h/16 of the time (hero-spells); it is 0 for 26 of the 40 monsters and 15 for seven, the Metal Slime, Golem, Demon Knight, Wizard, Red Dragon, and both Dragonlord forms.Code
Each fight picks one of its zone's five monster slots with equal chance; zone 0, around Tantegel Castle, holds three Slime slots and two Red Slime slots, and zone 1 adds a Drakee, all with dodge 1.Code
The Demon Knight, the hardest monster to hit at 15/64, fills one of the five slots in overworld zones 10, 11, and 12; the Werewolf, at 7/64, fills one in zone 12 and in zone 13, which Hauksness also uses, and one on the Dragonlord's castle ground floor.Code
The Dragonlord's castle's six sublevels draw from three rows, Werewolf, Green Dragon, Starwyvern, Wizard, and Axe Knight on the first; Wizard, Axe Knight, two Blue Dragons, and Stoneman on the next three; and Wizard, Stoneman, two Armored Knights, and Red Dragon on the last two and the bottom floor. Apart from the Werewolf's 7, their dodge nibbles are 1 or 2.Code
Dragon Warrior II 1987In 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.Code
Final Fantasy 1987A 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.Code
Against 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.Code
Each 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.Code
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.Code
Measured 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
A level-up that raises a character's Agility also raises their evade by 1, up to 200.Code
A new character's hit rate is 10 as a Fighter, 7 as a Red Mage, and 5 in the other four classes; evade is 53 for the Fighter, Black Belt, and White Mage and 58 for the Thief, Red Mage, and Black Mage.Code
Each level-up adds 3 to the hit rate of a Fighter, Black Belt, Knight, or Master, 2 for a Thief, Red Mage, Ninja, or Red Wizard, and 1 for a White or Black Mage or Wizard, up to 200.Code
A new game zero-fills every character's stat page, weapon and armor slots included, so the party starts unarmed, with 400 gold.Code
The 40 weapons add from 0 to 50 to hit rate: 0 for both nunchucks, the Iron Hammer, and four of the six staves; 10 for early blades such as the Small Knife and Short Sword; 35 for the Defense, CatClaw, Katana, and Xcalber; and 50 for the Masmune.Code
Shop 1, the first weapon shop in lut_ShopData, sells the Wooden Staff, Small Knife, Wooden Nunchuck, Rapier, and Iron Hammer, with hit bonuses of 0, 10, 0, 5, and 0 and damage of 6, 5, 12, 9, and 9: the most accurate of them, the Small Knife, deals the least damage.Code
Shop 1 is the weapon shop in Coneria, the town beside the starting point; Nintendo Power's guide lists Coneria's weapons as shop 1's five.Magazine
Across the 128 enemy records, evade runs from 0 (Scum) to 144 (the Air elemental), with a median of 48; 31 records sit below 25, and six reach 100 or more: Air, Nitemare (132), Frost D and Sphinx (120), Wraith (108), and Chaos (100).Code
A new game puts the party at overworld tile (153, 165), in land domain $2C, whose eight formation slots all hold 3–5 Imps (evade 6). The domain to its north, $24, gives 3–5 Imps in 48 of 64 battles; its other slots hold 1–3 GrImps (evade 9), 1–2 Wolves (36), a lone Madpony (22), and, 1 time in 64, 3–6 Imps with up to 4 GrImps.Code
The Air elemental (evade 144) is in the random battles of five standard maps, $2F, $30, $32, $33, and $3A, as 2–4 or 3–6 of them in one 12-in-64 slot of the last three, to which $32 and $33 add a second, smaller slot of 1–3 (15 and 18 of 64 in all); Wraith (108) fills 42 of 64 chances on map $25, Frost D (120) 30 of 64 on map $34, and Sphinx (120) 24 of 64 on map $0E and 12 of 64 in four overworld domains.Code
Nintendo Power's 1990 strategy guide paces the party by level: about 3 for Garland, "Wait until Level 8 or 9" for the Marsh Cave, and "Level 27 or above to have a good chance against Chaos."Magazine
Nintendo Power's guide places Wraiths in the Ice Cave and Air elementals in the Sky Castle.Magazine
FF1Randomizer names the standard maps by index: $0F, $25, and $26 are the Ice Cave's B1–B3, $2F–$33 the Sky Palace's five floors, $34 the revisited Temple of Fiends' first floor, and $3A and $3B its Air and Chaos floors.Web
NetHack 1987In 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.Code
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.Code
Final Fantasy II 1988A 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.Code
Final 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.Code
EarthBound Beginnings 1989In 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.Code
Final Fantasy III 1990A 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.Code
Final Fantasy IV 1991A 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.Code
Final 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.Code
Dune II 1992The 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.Code
Final Fantasy V 1992A 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.Code
Final 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.Code
EarthBound 1994In 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.Code
EarthBound (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.Code
Final Fantasy VI 1994Unless 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_EVADE option, credited to Terii Senshi, that restores Evade.Code
Pokémon Red and Blue 1996Red and Blue store a move's accuracy as a byte, ⌊255p/100⌋ for p percent, so 100% is 255 and 85% is 216.Code
MoveHitTest lands a move when a random byte is below its accuracy byte, so even a 100% move misses 1 time in 256.Code
CalcHitChance multiplies 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.Code
Swift returns from MoveHitTest before 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.Code
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.Code
Of the 165 moves in Moves, Struggle included, 104 are listed at 100% accuracy and 61 below it; the lowest are the three one-hit KO moves at 30%.Code
Bulbasaur and Squirtle start with Tackle, 35 power at 95% accuracy, and Charmander with Scratch, 40 power at 100%.Code
The strongest special moves of each type trade accuracy for power: Thunder (120, 70%) against Thunderbolt (95, 100%), Blizzard (120, 90%) against Ice Beam (95, 100%), Fire Blast (120, 85%) against Flamethrower (95, 100%), and Hydro Pump (120, 80%) against Surf (95, 100%); the sleep moves run from Sing's 55% to Spore's 100%, and the one-hit KO moves sit at 30%.Code
Sand-Attack and Smokescreen (100%), Kinesis (80%), and Flash (70%) lower the target's accuracy by one stage; Double Team and Minimize (100%) raise the user's evasion by one stage. No move changes either stat by two.Code
Outside link battles, an enemy's stat-lowering effect first fails when a random byte is below 64, 1 time in 4; the player's moves skip that roll. A move whose main effect lowers a stat, such as Sand-Attack or Smokescreen, then faces the normal accuracy test, while a damaging move's side effect instead takes hold only on a byte below 85, 85 times in 256.Code
Pidgey learns Sand-Attack at level 5, and a wild or trainer Pokémon knows the moves its learnset gives up to its level; so Route 1's level-5 Pidgey (slot 9, 3 in 256 encounters), Route 2's (slot 4, 25 in 256), and the rival's level-9 Pidgey on Route 22 can use it.Code
Final Fantasy VII 1997In the North American release, BattleRollPhysicalHit hits 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 (unk234 bit 0, unk218 bit 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. BattleGetRnd164 scales 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.Code
Pokémon Yellow 1998Yellow keeps Red and Blue's MoveHitTest and CalcHitChance unchanged, 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.Code
Pokémon Gold and Silver 1999Gold 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.Code
Pokémon Crystal 2000BattleCommand_CheckHit scales 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.Code
BattleCommand_EndLoop gives 2–5 hits with Red and Blue's odds and Triple Kick 1–3 hits, 1/3 each, and jumps back to the critical command, so every hit rolls its own critical and damage; checkhit sits before the loop and runs once.Code
Fire Emblem: The Binding Blade 2002The 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.Code
Computed 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.Code
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.Code
Pokémon Ruby and Sapphire 2002Ruby 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.Code
Ruby and Sapphire's atk8D_setmultihitcounter gives 2 or 3 hits with probability 3/8 each and 4 or 5 with 1/8 each, the same code as Emerald's; the multi-hit battle script runs accuracycheck once and then loops critcalc, damagecalc, and adjustnormaldamage for every hit.Code
Fire Emblem: The Sacred Stones 2004In 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.Code
Computed from the code, taking the two numbers as independent and evenly spread, a displayed hit h connects h(2h+1) times in 10,000 up to 50 and 10,000−(100−h)(199−2h) times above it, so a displayed 80 hits 92.2% of the time, 20 hits 8.2%, and 50 hits 50.5%.Code
In 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.Code
Pokémon Emerald 2004Cmd_accuracycheck combines 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.Code
In Emerald a plain damaging move checks accuracy before it computes damage, the reverse of Red, Blue, and Crystal.Code
Cmd_setmultihitcounter gives 2 or 3 hits with probability 3/8 each and 4 or 5 with 1/8 each; the loop reruns critcalc and damagecalc for every hit, after one accuracycheck.Code
Pokémon FireRed and LeafGreen 2004FireRed and LeafGreen's Cmd_accuracycheck is 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.Code
FireRed and LeafGreen's Cmd_setmultihitcounter is Emerald's, line for line: 2 or 3 hits at 3/8 each and 4 or 5 at 1/8. The battle script runs accuracycheck once, then loops critcalc, damagecalc, and adjustnormaldamage for every hit.Code
generalThe Gameplay Design Patterns wiki defines Variable Accuracy as "Game mechanics to simulate differences in the difficulty to hit what one aims at."Wiki

References

  1. ^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.

    In the claim ledger

  2. ^ abRed and Blue store a move's accuracy as a byte, ⌊255p/100⌋ for p percent, so 100% is 255 and 85% is 216.Codepret/pokered
    How we know
    6	db \5 percent ; accuracy
    
    data/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.

    In the claim ledger

  3. ^ abcdCalcHitChance multiplies 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/pokered
    How 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.

    In the claim ledger

  4. ^ abcdeMoveHitTest lands a move when a random byte is below its accuracy byte, so even a 100% move misses 1 time in 256.Codepret/pokered
    How 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.

    In the claim ledger

  5. ^ abcSwift returns from MoveHitTest before 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/pokered
    How 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.

    In the claim ledger

  6. ^ abYellow keeps Red and Blue's MoveHitTest and CalcHitChance unchanged, 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/pokered
    How 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.

    In the claim ledger

  7. ^ 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/pokecrystal
    How 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.

    In the claim ledger

  8. ^ abcdefghBattleCommand_CheckHit scales 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/pokecrystal
    How 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_NOUSE
    
    data/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.

    In the claim ledger

  9. ^ 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/pokeemerald
    How 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.

    In the claim ledger

  10. ^ abcdefgCmd_accuracycheck combines 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/pokeemerald
    How 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.

    In the claim ledger

  11. ^ 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.

    In the claim ledger

  12. ^ abFireRed and LeafGreen's Cmd_accuracycheck is 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/pokeemeraldrevised
    How 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.

    In the claim ledger

  13. ^ 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.

    In the claim ledger

  14. ^ 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.

    In the claim ledger

  15. ^ 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.

    In the claim ledger

  16. ^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.

    In the claim ledger

  17. ^ 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.

    In the claim ledger

  18. ^ 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.

    In the claim ledger

  19. ^ abcdefghAfter the damage is set, an awake monster dodges when a roll of 0–63 falls below d, the low nibble of its resistance byte, a chance of d/64; 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.

    In the claim ledger

  20. ^The dodge nibble d of the 40 monsters (each dodges d/64 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.

    In the claim ledger

  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.

    In the claim ledger

  22. ^ 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.

    In the claim ledger

  23. ^ 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 disassembly
    How 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.

    In the claim ledger

  24. ^ 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.

    In the claim ledger

  25. ^ 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.

    In the claim ledger

  26. ^ 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.

    In the claim ledger

  27. ^ abcIn the North American release, BattleRollPhysicalHit hits 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 (unk234 bit 0, unk218 bit 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. BattleGetRnd164 scales 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 disassembly
    How 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.

    In the claim ledger

  28. ^ 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 sourcerevised
    How 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.

    In the claim ledger

  29. ^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 source
    How 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.

    In the claim ledger

  30. ^ 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.uhitinc
    
    src/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.

    In the claim ledger

  31. ^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 sourcerevised
    How we know
    266    tmp = 1 + Luck + abon() + find_mac(mtmp) + u.uhitinc
    
    src/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.

    In the claim ledger

  32. ^ 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.Codefireemblem6j
    How 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.

    In the claim ledger

  33. ^ 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.

    In the claim ledger

  34. ^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.

    In the claim ledger

  35. ^ 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.Codefireemblem8u
    How 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.

    In the claim ledger

  36. ^ abComputed from the code, taking the two numbers as independent and evenly spread, a displayed hit h connects h(2h+1) times in 10,000 up to 50 and 10,000−(100−h)(199−2h) 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.

    In the claim ledger

  37. ^ 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 the claim ledger

  38. ^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.

    In the claim ledger

  39. ^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.

    In the claim ledger

  40. ^ 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.

    In the claim ledger

  41. ^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 the claim ledger

  42. ^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 DEF3A
    
    1actions.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.

    In the claim ledger

  43. ^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.

    In the claim ledger

  44. ^ 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.

    In the claim ledger

  45. ^ 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.

    In the claim ledger

  46. ^ 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 disassembly
    How 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.

    In the claim ledger

  47. ^ 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.

    In the claim ledger

  48. ^ 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_EVADE option, credited to Terii Senshi, that restores Evade.Codeeverything8215, FF6 disassemblyrevised
    How 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.

    In the claim ledger

  49. ^ abcdA monster's physical attack has no critical branch and no dodge roll for the hero; EnPhysAttack goes straight to EnCalcHitDmg, and only 0 damage misses.Codenmikstas/dragon-warrior-disassembly
    How 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.

    In the claim ledger

  50. ^ abIn Red and Blue, a damaging move runs CriticalHitTest, CalculateDamage (base formula), AdjustDamageForMoveType (STAB, then type rows), RandomizeDamage, and then MoveHitTest (accuracy).Codepret/pokered
    How 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.

    In the claim ledger

  51. ^ 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 claim ledger

  52. ^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.

    In the claim ledger

  53. ^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.

    In the claim ledger

  54. ^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.

    In the claim ledger

  55. ^At the start of a battle, CalcWhoIsNext gives the hero the first turn when Agility × a random byte is at least the monster's defense byte × a roll of 0–63; otherwise the monster attacks first.Codenmikstas/dragon-warrior-disassembly
    How 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.

    In the claim ledger

  56. ^TryRun lets the hero escape when Agility × a random byte is at least the monster's defense byte × a roll whose range grows with the monster: 0–63 from Slime to Druinlord, 0–94 from Drollmagi to Werewolf, 0–127 from Green Dragon to Blue Dragon, and 0–255 from Stoneman on. Running from a sleeping monster always works.Codenmikstas/dragon-warrior-disassembly · Ryan8bit, DW Formulas
    How 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.

    In the claim ledger

  57. ^An attack swings ⌊h/32⌋+1 times for hit rate h, 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 + 1
    
    Final 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 hits
    
    Final 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.

    In the claim ledger

  58. ^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.

    In the claim ledger

  59. ^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 claim ledger

  60. ^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.

    In the claim ledger

  61. ^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 chance
    
    Final 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.

    In the claim ledger

  62. ^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.

    In the claim ledger

  63. ^BattleCommand_EndLoop gives 2–5 hits with Red and Blue's odds and Triple Kick 1–3 hits, 1/3 each, and jumps back to the critical command, so every hit rolls its own critical and damage; checkhit sits before the loop and runs once.Codepret/pokecrystal
    How 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.

    In the claim ledger

  64. ^Cmd_setmultihitcounter gives 2 or 3 hits with probability 3/8 each and 4 or 5 with 1/8 each; the loop reruns critcalc and damagecalc for every hit, after one accuracycheck.Codepret/pokeemerald
    How 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.

    In the claim ledger

  65. ^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.

    In the claim ledger

  66. ^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.

    In the claim ledger

Sources

Code

Primary

Secondary