On this page
  1. Quirks
  2. Related
  3. Games
  4. References
  5. Sources

A critical hit is a hit that its own random roll makes stronger than the damage formula alone would. Four games span how the chance is set: fixed, from equipment, from a stat, and from stages. The lab runs each game’s rule as its code does and counts the chance exactly over every value of the roll; set the inputs, or pick a preset.

Interactive: formula-lab (needs JavaScript)

Critical hit, three ways
  • FixedDragon Warrior (1986). One of the hero's swings in 32 is an "excellent move" that ignores defense, and monsters never land one.1,2Dragon Warrior II (1987). One swing in 64 is a "tremendous blow" that ignores defense; the cursed Sword of Destruction makes them common but wastes some turns.3,4Dragon Warrior III (1988). One swing in 64 is a "tremendous hit" that ignores defense, and Fighters land more as they level.5,6Final Fantasy II (1988). About one hit in twenty is critical, whatever the weapon, and adds the attack again.7Final Fantasy VI (1994). 1 in 32 for any attack that can crit, doubling the damage.8,9
  • From equipmentFinal Fantasy (1987). The weapon's place in the item list, not its listed critical rate, sets how often it crits.10,11Final Fantasy V (1992). Only fists, katanas, and one other attack type can land a critical, which ignores defense.12
  • Rate and bonusFinal Fantasy III (1990). The job decides how often an attack is critical and how much a critical adds.13,14Final Fantasy IV (1991). Each character has a critical rate of their own, doubled when fighting with two weapons and tripled with a bow.15
  • From a statEarthBound (1994). "SMAAAASH!!" at about Guts in 500, at least 1 in 20 for the party, for 4 × Offense − Defense.16,17Pokémon Red and Blue (1996). Half the attacker's base Speed in 256, and eight times that for four high-critical moves.18,19,20,21Pokémon Yellow (1998). Red and Blue's base-Speed rule, Focus Energy bug included.22
  • Stat against statEarthBound Beginnings (1989). "SMAAAASH!!" from the attacker's Fight against the target's, about 26 in 256 when they match; it deals the full Offense.23
  • Weapon and statsFinal Fantasy VII (1997). (level + luck − target level)/4 plus the weapon's critical %, against 1–100; doubles physical damage.24Fire Emblem: The Binding Blade (2002). The weapon's crit plus half the skill, plus 30 for some classes, less the defender's luck; a critical triples the damage.25Fire Emblem: The Sacred Stones (2004). The weapon's crit plus half the attacker's skill, less the defender's luck, on one roll; a critical triples the damage.26
  • From stagesPokémon Gold and Silver (1999). Focus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256.27Pokémon Crystal (2000). Focus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256.28,29Pokémon Ruby and Sapphire (2002). Stages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it.30Pokémon Emerald (2004). Stages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it.31,32Pokémon FireRed and LeafGreen (2004). Ruby's stages, with none in the Old Man's or Pokédude battles, or in the first battle until a tutorial flag is set.33Pokémon Platinum (2008). Emerald's stages, plus Super Luck; Lucky Chant blocks it, and Sniper makes it ×3.34,35Pokémon HeartGold and SoulSilver (2009). Platinum's stage table, with Super Luck, Lucky Chant, and Sniper.36
DamageIgnoresRolled
Dragon Warriorbetween half and all of attack power1the monster’s defense1per attack, before damage1
Final Fantasythe swing’s damage roll again10absorb, on the added roll10per swing, on the hit roll10
Red and Bluelevel doubled in the formula21stat stages, Reflect, Light Screen21once per move37
Crystal×229all boosts, unless the attacker’s stage is higher29per hit38
Emerald×232changes that hurt the attacker, Reflect, Light Screen32per hit39
The Sacred Stonesattack less defense, tripled26,40nothingper hit, after the hit roll, on one number26

In the North American release of Final Fantasy VII, the chance comes from the action’s level, the attacker’s luck, the target’s level, and the weapon: (Lv + Luck − target Lv)/4 + weapon %, against 1–100, ×224. Final Fantasy VI reads no stat, at 8 in 256 (1 in 32), ×28. Pokémon Platinum keeps Emerald’s stage table34,31. With the ability Sniper, a critical multiplies the damage by 335, a case Emerald’s multiplier lacks.

The North American Dragon Warrior II turns Dragon Warrior’s 1-in-32 excellent move into a 1-in-64 “tremendous blow”4. With the Sword of Destruction the chance is 1 in 8, but a curse roll first loses 1 attack in 43. The North American Dragon Warrior III keeps those odds for most heroes and gives a Fighter an extra roll under its level6,5.

Final Fantasy II makes each hit critical on a roll under 5 of 0–100, which adds the attack again7. Final Fantasy III rolls once per action against the job’s crit probability and adds the job’s crit bonus13,14. Final Fantasy IV gives each character a crit rate and bonus of their own; dual-wielding doubles the rate, and a bow triples a rate capped at 3315. In Final Fantasy V, only fists, katanas, and attack type 36 roll for a critical, at the attack type’s crit %, and a critical doubles Attack and sets Defense to 012. Final Fantasy VI drops the weapon from the roll9.

Pokémon Yellow keeps Red and Blue’s CriticalHitTest line for line, Focus Energy bug included22,20. Pokémon Gold and Silver already use Crystal’s stages, 17 · 32 · 64 · 85 · 128 in 25627,27. Pokémon Ruby and Sapphire’s stages, 1 in 16 · 8 · 4 · 3 · 230, are the ones Emerald keeps30,31. Pokémon FireRed and LeafGreen keep Ruby’s stages and rule out critical hits in the Old Man’s catching tutorial, in Pokédude battles, and in the first battle until a tutorial flag is set33.

In the English build of EarthBound Beginnings, a “SMAAAASH!!” comes from the attacker’s Fight against the target’s, (256 + ΔFight) ÷ 2 − 102, in 25623, and deals the attacker’s Offense, ignoring Defense23. In the US release of EarthBound, the chance comes from Guts alone, Guts ÷ 500, at least 25 ÷ 500 for the party16, and the blow deals 4 × Offense − Defense16,17. Both games roll it before the dodge, so it can’t be dodged23,17.

#Quirks

  • Final Fantasy decides the hit and the critical on one 0–200 roll, so a low roll does both. The crit chance is the weapon’s index number, because the crit rate in each weapon’s data is never read10,11.
  • Final Fantasy’s random table holds $00 twice, so at crit chance 1 a swing is critical 4 times in 256, not 341,42. In the lab, Final Fantasy’s roll 0 stands taller than its neighbors.
  • Red and Blue’s Focus Energy divides the threshold by 4 instead of raising it20. The Focus Energy preset sets it beside Crystal and Emerald, where it raises the chance.
  • Emerald’s stage-3 chance is 21,846 in 65,536, not 1 in 3, because Random() gives 16 bits and 65,536 isn’t a multiple of 3. A target with Battle Armor or Shell Armor is never hit critically31.
  • Dragon Warrior’s excellent move deals A−⌊r⌊A/2⌋/256⌋ for attack power A, and an awake monster can still dodge it1,43.
  • Fire Emblem: The Sacred Stones rolls a critical on one number from 0 to 99 but a hit on the average of two, so its shown crit is the true chance once an attack hits, and its shown hit is not the true chance of hitting26,44. Classes with a crit bonus add 15 there and 30 in The Binding Blade26,25.
  • Final Fantasy’s damage spells have a cousin of the critical: their own 0–200 roll doubles the damage instead of deciding a hit45.

Games

GameYearHowNote
Dragon Warrior1986Fixedone of the hero's swings in 32 is an "excellent move" that ignores defense, and monsters never land one
Dragon Warrior II1987Fixedone swing in 64 is a "tremendous blow" that ignores defense; the cursed Sword of Destruction makes them common but wastes some turns
Dragon Warrior III1988Fixedone swing in 64 is a "tremendous hit" that ignores defense, and Fighters land more as they level
Final Fantasy II1988Fixedabout one hit in twenty is critical, whatever the weapon, and adds the attack again
Final Fantasy VI1994Fixed1 in 32 for any attack that can crit, doubling the damage
Final Fantasy1987From equipmentthe weapon's place in the item list, not its listed critical rate, sets how often it crits
Final Fantasy V1992From equipmentonly fists, katanas, and one other attack type can land a critical, which ignores defense
Final Fantasy III1990Rate and bonusthe job decides how often an attack is critical and how much a critical adds
Final Fantasy IV1991Rate and bonuseach character has a critical rate of their own, doubled when fighting with two weapons and tripled with a bow
EarthBound1994From a stat"SMAAAASH!!" at about Guts in 500, at least 1 in 20 for the party, for 4 × Offense − Defense
Pokémon Red and Blue1996From a stathalf the attacker's base Speed in 256, and eight times that for four high-critical moves
Pokémon Yellow1998From a statRed and Blue's base-Speed rule, Focus Energy bug included
EarthBound Beginnings1989Stat against stat"SMAAAASH!!" from the attacker's Fight against the target's, about 26 in 256 when they match; it deals the full Offense
Final Fantasy VII1997Weapon and stats(level + luck − target level)/4 plus the weapon's critical %, against 1–100; doubles physical damage
Fire Emblem: The Binding Blade2002Weapon and statsthe weapon's crit plus half the skill, plus 30 for some classes, less the defender's luck; a critical triples the damage
Fire Emblem: The Sacred Stones2004Weapon and statsthe weapon's crit plus half the attacker's skill, less the defender's luck, on one roll; a critical triples the damage
Pokémon Gold and Silver1999From stagesFocus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256
Pokémon Crystal2000From stagesFocus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256
Pokémon Ruby and Sapphire2002From stagesstages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it
Pokémon Emerald2004From stagesstages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it
Pokémon FireRed and LeafGreen2004From stagesRuby's stages, with none in the Old Man's or Pokédude battles, or in the first battle until a tutorial flag is set
Pokémon Platinum2008From stagesEmerald's stages, plus Super Luck; Lucky Chant blocks it, and Sniper makes it ×3
Pokémon HeartGold and SoulSilver2009From stagesPlatinum's stage table, with Super Luck, Lucky Chant, and Sniper
Every claim about this mechanic, by game (45)
Dragon Warrior 1986Before the normal formula, a 1-in-32 roll gives the hero an "excellent move", except against either form of the Dragonlord; it deals A−⌊r⌊A/2⌋/256⌋ for a random byte r, from ⌈A/2⌉+1 to A (more than half to all of the attack power), and ignores defense.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
Dragon Warrior II 1987In Dragon Warrior II (NA NES), a hero's attack is "a tremendous blow" on a roll of 1 in 64, or 1 in 8 with the Sword of Destruction equipped, except against Malroth; with the Sword of Destruction (or Gremlin's Armor or the Evil Shield) a roll of 1 in 4 first freezes the hero under the curse and the attack is lost. A tremendous blow deals half the attack power plus ⌊Ar/256⌋ with the same 8–248 roll, ignores defense, and skips the monster's dodge.Code
Dragon Warrior II (NA NES) changes Dragon Warrior's battle rules: the hero's 1-in-32 "excellent move" becomes a 1-in-64 "tremendous blow", the fixed alternation of hero and monster becomes a round order sorted by half the agility plus a roll, and running no longer weighs the hero's Agility against the monster.Code
Final Fantasy 1987A 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.Code
A character's crit chance is the equipped weapon's index number, not the crit rate in the weapon's data (no code we read touches that byte); an unarmed Black Belt or Master gets twice their level.Code
A damage spell always connects, for a random value from its power E to 2E; its roll of 0–200 against 148 + the spell's hit rate − the target's magic defense doubles the damage instead of deciding a hit.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
Measured the same way, four swings with base damage 40, hit rate 100, and crit chance 20 against evade 40 and absorb 10 land 1,020 of 1,024 swings, 109 of them critical, for 129–413 damage; with FAST, eight swings land 2,040 of 2,048, 213 critical.Verified
Dragon Warrior III 1988In Dragon Warrior III (NA NES), a hero lands "a tremendous hit" when a random byte falls below 4 (1 in 64), or below 32 (1 in 8) with the Sword of Destruction or the Demon Axe; a Fighter first gets a roll below its level. The hit deals attack power × (54 + a roll of 0–10) / 64, plus 1, ignoring defense.Code
Dragon Warrior III (NA NES) keeps Dragon Warrior II's critical-hit odds for most heroes, 1 in 64, and its 1 in 8 with the Sword of Destruction.Code
Final Fantasy II 1988Each hit that gets through deals attack plus a random 0 to attack, less the target's defense (at least 0), and the hits add up. Each hit also rolls 0–100, and a roll under 5 makes it critical, adding the attack again.Code
EarthBound Beginnings 1989In EarthBound Beginnings (English build), a plain attack is a "SMAAAASH!!" when a random byte is below max(0, ⌊(256 + attacker's Fight − target's Fight) ÷ 2⌋ − 102), about 26 in 256 at equal Fight. It is checked before the dodge roll, so it can't be dodged, and it deals the attacker's Offense, ignoring Defense. There is no SMAAAASH during the invincibility scripts, while the party fires the tank gun instead, or, 1 time in 2, from a blinded attacker.Code
Final Fantasy III 1990A Fight action rolls once for a critical, 0–99 against the crit probability, and a critical adds the crit bonus to the damage before defense. Both numbers are the first two bytes of the character's job modifiers, so the job sets them.Code
Final Fantasy II rolls damage, attack plus 0 to attack less defense, and a critical for each hit that gets through and adds them up; Final Fantasy III rolls damage once, attack plus 0 to half of it, and multiplies it by the net hits, and its single critical roll uses the job's crit probability in place of Final Fantasy II's fixed roll under 5.Code
Final Fantasy IV 1991A Fight command rolls once for a critical: a percentage roll under the attacker's crit rate adds its crit bonus to the damage before defense. Each character carries a crit rate and bonus of their own (the field code loads Cecil's from CharProp); dual-wielding doubles the rate, which falls to 99 only when the doubling overflows a byte (a rate of 50–127 doubles to 100–254), and adds half the left hand's attack to the bonus, and a bow triples a rate capped at 33 and adds the arrows' attack.Code
Final Fantasy V 1992Three attack types call CheckCrit: fists (type 30), katanas (type 37), and type 36, which the source comments as bows with an element and which uses the knife damage formula, after moving its crit % from its second parameter to the first. CheckCrit makes a critical when a roll of 0–99 is under that crit %, and a critical doubles Attack and sets Defense to 0.Code
EarthBound 1994In EarthBound (US release), a bash is a "SMAAAASH!!" with a chance of about the attacker's Guts in 500, with a party member's Guts counted as at least 25 (about 1 in 20). It is rolled after the miss check and before the dodge, so it can't be dodged, and deals 4 × Offense − Defense with no random spread.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 an attack is set to always crit, it is critical when a random byte is under 8, a 1-in-32 chance, and a critical adds 2 to the damage multiplier, which the code comments as damage ×2.Code
In Final Fantasy V only three weapon attack types roll for a critical (fists, katanas, and type 36), at the crit % the attack type carries; in Final Fantasy VI an attack that can crit does so on a random byte under 8, 1 in 32, whatever the weapon.Code
Pokémon Red and Blue 1996CriticalHitTest makes a hit critical when a random byte is below a threshold set by the attacker's base Speed S: ⌊S/2⌋ for most moves, and min⁡(255,8⌊S/2⌋) for Karate Chop, Razor Leaf, Crabhammer, and Slash.Code
A Pokémon with base Speed 115, such as Persian, lands a critical hit on 57 of 256 rolls with most moves and on 255 of 256 with Slash.Code
Focus Energy cuts the critical threshold to a quarter, ⌊S/8⌋ for most moves, because the routine shifts right where it should shift left; pret marks it as a bug.Code
A critical hit doubles the level in the damage formula and takes both Pokémon's stats from their party data, so stat stages, Reflect, and Light Screen drop out.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
Final Fantasy VII 1997In the North American release, BattleRollCriticalHit is entry 2 of the hit-formula table, so it runs only for an attack whose hit-formula script includes it, and only if the hit roll didn't mark a miss. Its chance is (the action's level + the attacker's luck − the target's level)/4, plus the weapon's critical % for a party member, or 255 under Lucky Girl; a 1–100 roll at or under the chance sets bit 1 ($2) of damageFlags. BattleSetTmpDmgAsPhysical doubles the damage when that bit is set, and sets it itself for an attack whose attackFlags bit $2000 is clear. So a chance c of 0–99 crits about c times in 99 (computed for evenly spread 16-bit values). Final Fantasy VI crits on a random byte under 8, 1 in 32, whatever the stats, and a critical adds 2 to the damage multiplier, which its code comments as damage ×2.Code
Pokémon Yellow 1998Yellow keeps Red and Blue's CriticalHitTest line for line, so the attacker's base Speed still sets the chance, ⌊S/2⌋ in 256 for most moves and 8 times that for the high-critical ones, and Focus Energy still cuts it to a quarter.Code
Pokémon Gold and Silver 1999Gold and Silver already use the staged critical hit that Crystal keeps line for line: Focus Energy (+1), a high-critical move (+2), and a Scope Lens (+1) add to a critical level, which reads 17, 32, 64, 85, or 128 in 256 from CriticalHitChances. Chansey holding a Lucky Punch and Farfetch'd holding a Stick get level 2 at once and skip the other bonuses.Code
Pokémon Crystal 2000BattleCommand_Critical sums a critical level, +1 for Focus Energy, +2 for a high-critical move, and +1 for a Scope Lens, then rolls against 17, 32, 64, 85, or 128 in 256 for levels 0 to 4; Chansey with a Lucky Punch and Farfetch'd with a Stick get level 2 and skip the other bonuses.Code
A critical hit doubles the damage after item boosts and before the cap of 997 and the final +2; unless the attacker's stat stage is higher than the defender's, it also uses both Pokémon's unboosted stats, which drops Reflect and Light Screen.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's crit is the weapon's crit plus half the skill, plus 30 for classes with a crit bonus, less the defender's luck and at least 0; after a hit, one random number below it triples the damage.Code
Pokémon Ruby and Sapphire 2002Ruby and Sapphire's atk04_critcalc, which Emerald keeps apart from a renamed helper, sums Focus Energy (+2), a move whose effect is high-critical, Sky Attack, Blaze Kick, or Poison Tail (+1), a Scope Lens (+1), and Lucky Punch or Stick on their species (+2), caps the stage at 4, and hits critically 1 time in 16, 8, 4, 3, or 2. Battle Armor or Shell Armor on the target, the STATUS3_CANT_SCORE_A_CRIT flag on the attacker, Wally's tutorial, and the first battle rule it out.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, 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.Code
Pokémon Emerald 2004Cmd_critcalc sums a critical stage, +2 for Focus Energy, +1 for a high-critical move (including Sky Attack, Blaze Kick, and Poison Tail), +1 for a Scope Lens, and +2 for Chansey with a Lucky Punch or Farfetch'd with a Stick, capped at 4; a 16-bit Random() taken modulo 16, 8, 4, 3, or 2 must be 0, a chance of 1/16, 1/8, 1/4, 21,846 in 65,536 (slightly over 1/3), or 1/2, and a target with Battle Armor or Shell Armor is never hit critically.Code
Cmd_damagecalc multiplies the base damage by 2 on a critical; CalculateBaseDamage then ignores the attacker's lowered attacking stat, the defender's raised defending stat, and Reflect or Light Screen.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_critcalc keeps Ruby's stages and its 1 in 16, 8, 4, 3, or 2, but rules out critical hits in the Old Man's catching tutorial, in Pokédude battles, and in the first battle until a tutorial flag is set.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
Pokémon Platinum 2008BattleSystem_CalcCriticalMulti keeps Emerald's stage table, 1 in 16, 8, 4, 3, or 2, capped at stage 4, and its sum: +2 for Focus Energy, +1 for a held item with HOLD_EFFECT_CRITRATE_UP, +2 for Chansey or Farfetch'd holding an item whose hold effect names that species, plus the move's boosts, which in Platinum come from a battle-script variable (criticalBoosts) rather than a list of move effects. It adds +1 for the ability Super Luck, which Emerald's sum doesn't read. Besides Battle Armor and Shell Armor, which an attacker with Mold Breaker ignores, Lucky Chant on the target's side blocks a critical, and so does a MOVE_EFFECT_NO_CRITICAL flag that a comment in the header says is checked but never set. Platinum draws its 16-bit roll before those tests, where Emerald draws it only after its other tests pass.Code
A critical multiplies Platinum's damage by 2 after the base formula (its +2 included), at the same step as Emerald, and by 3 when the attacker has Sniper; Emerald's multiplier has no such case. As in Emerald, the critical then ignores the attacker's lowered attacking stat, the defender's raised defending stat, and Reflect or Light Screen.Code
Pokémon HeartGold and SoulSilver 2009HeartGold and SoulSilver's TryCriticalHit keeps Platinum's critical-hit rule: the stage sum (+2 Focus Energy, +1 for a HOLD_EFFECT_CRITRATE_UP item, +1 Super Luck, +2 for Chansey or Farfetch'd with its own item, plus the move's boosts) capped at 4, a chance of 1 in 16, 8, 4, 3, or 2, blocked by Battle Armor or Shell Armor unless ignored, by Lucky Chant on the target's side, or by bit 15 of the target's move-effect flags (named MOVE_EFFECT_FLAG_LUCKY_CHANT here), and Sniper turning ×2 into ×3.Code
generalThe Gameplay Design Patterns wiki defines critical hits as "Attacks that do significantly more damage than others, or have other special effects," made by giving an ordinary hit a small chance to become critical.Wiki

References

  1. ^ abcdeBefore the normal formula, a 1-in-32 roll gives the hero an "excellent move", except against either form of the Dragonlord; it deals A−⌊r⌊A/2⌋/256⌋ for a random byte r, from ⌈A/2⌉+1 to A (more than half to all of the attack power), and ignores defense.Codenmikstas/dragon-warrior-disassembly · Ryan8bit, DW Formulasrevised
    How we know
    6725LE617:  CMP #EN_DRAGONLORD1     ;
    ⋮
    6729LE61D:  BEQ ChkPlyrMiss         ;If so, branch. no excellent moves permitted.
    ⋮
    6733LE624:  AND #$1F                ;Did player get an excellent move(1/32 chance)?
    ⋮
    6748LE63B:  LDA DisplayedAttck      ;
    6749LE63D:  LSR                     ;A = DisplayedAttack/2 * rnd(255).
    ⋮
    6757LE64B:  SEC                     ;Damage=DisplayedAttack-(DisplayedAttack/2 * rnd(255))/256.
    6758LE64C:  SBC MultRsltUB          ;
    
    source_files/Bank03.asm lines 6724–6759 at ebe6a13 · upstream ↗
    Excellent moves have a 1/32 chance of happening per attack
    II.B, Hero attack formulas · archived copy ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Revised after a check by a second AI model, 2026-10-21: The smallest excellent move was given as ⌈A/2⌉; the code gives ⌈A/2⌉ + 1.

    In the claim ledger

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

  3. ^ abIn Dragon Warrior II (NA NES), a hero's attack is "a tremendous blow" on a roll of 1 in 64, or 1 in 8 with the Sword of Destruction equipped, except against Malroth; with the Sword of Destruction (or Gremlin's Armor or the Evil Shield) a roll of 1 in 4 first freezes the hero under the curse and the attack is lost. A tremendous blow deals half the attack power plus ⌊Ar/256⌋ with the same 8–248 roll, ignores defense, and skips the monster's dodge.CodeNathan-R-Og/dq2revised
    How we know
    6241B04_A5E3:
    6242    lda #$08
    6243    sta $A6
    6244    lda #$4C ; Item ID #$4C: Sword of Destruction (equipped)
    ⋮
    6249    lda #$40
    6250    sta $A6
    ⋮
    6261B04_A600:
    6262    lda #$04
    ⋮
    6265    beq B04_A679
    6266B04_A607:
    6267    lda $A6
    ⋮
    6270    bne B04_A624
    ⋮
    
    src/us/prg/bank4.asm lines 6241–6282 at 0fb64a4 · upstream ↗
    lda #$42 ; String ID #$0042: No movement was possible, for the curse had frozen [name]'s body.
    src/us/prg/bank4.asm#L6334-L6335 · upstream ↗
    Monster ID #$52: Malroth
    src/us/prg/bank4.asm#L2926-L2926 · upstream ↗
    6529B04_A7A1:
    6530    sta $99
    6531    lsr
    6532    sta $A6
    6533    lda $99
    6534    jsr B04_AE8C ; $B0 = random number tightly distributed around A / 2, $B1 = #$00
    ⋮
    6536    lda $A6
    6537    clc
    6538    adc $B0
    
    src/us/prg/bank4.asm lines 6529–6542 at 0fb64a4 · upstream ↗
    5244B04_A020:
    5245    sta $99
    ⋮
    5277    and $9F
    5278    cmp $99
    5279    bcs B04_A044
    
    src/us/prg/bank4.asm lines 5244–5279 at 0fb64a4 · 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

  4. ^ abDragon Warrior II (NA NES) changes Dragon Warrior's battle rules: the hero's 1-in-32 "excellent move" becomes a 1-in-64 "tremendous blow", the fixed alternation of hero and monster becomes a round order sorted by half the agility plus a roll, and running no longer weighs the hero's Agility against the monster.Codenmikstas/dragon-warrior-disassembly · Nathan-R-Og/dq2revised
    How we know
    6733LE624:  AND #$1F                ;Did player get an excellent move(1/32 chance)?
    
    source_files/Bank03.asm lines 6724–6759 at ebe6a13 · upstream ↗
    6249    lda #$40
    6250    sta $A6
    
    src/us/prg/bank4.asm lines 6249–6250 at 0fb64a4 · upstream ↗
    6807LE691:  JMP StartEnemyTurn      ;($EB1B)It's the enemy's turn to attack.
    
    source_files/Bank03.asm lines 6803–6807 at ebe6a13 · upstream ↗
    7777LEBE6:  JMP StartPlayerTurn     ;($E5CE)It's the player's turn to attack.
    
    source_files/Bank03.asm lines 7772–7777 at ebe6a13 · upstream ↗
    9274B04_B790:
    9275    lsr
    9276    sta $99
    
    src/us/prg/bank4.asm lines 9274–9286 at 0fb64a4 · upstream ↗
    8313LEEE6:  LDA DisplayedAgi        ;
    
    source_files/Bank03.asm lines 8290–8325 at ebe6a13 · upstream ↗
    3191B04_95BF:
    3192    lda $06DD
    3193    beq B04_95CB
    3194    lda #$03
    
    src/us/prg/bank4.asm lines 3191–3197 at 0fb64a4 · 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

  5. ^ abIn Dragon Warrior III (NA NES), a hero lands "a tremendous hit" when a random byte falls below 4 (1 in 64), or below 32 (1 in 8) with the Sword of Destruction or the Demon Axe; a Fighter first gets a roll below its level. The hit deals attack power × (54 + a roll of 0–10) / 64, plus 1, ignoring defense.Code“Dragon Warrior III (USA)” · zeromus/DragonWarrior3revised
    How we know

    In the cartridge (“Dragon Warrior III (USA)”): bank 4 $968F-$96C8, the Fighter's level roll and the 4-or-32 roll; bank 4 $ADA4-$ADB5, attack × (54 + a roll of 0–10) / 64; bank 4 $B156, items $93 (Sword of Destruction) and $8F (Demon Axe) carry flag $02. We don't reproduce the bytes.

    3541loc_6968F:
    ⋮
    3545		CMP		#CLASS_FIGHTER
    3546		BNE		loc_696A2
    3547		JSR		_rand_ex
    3548		CMP		_players_level,X
    ⋮
    3551		LDX		#4 ; normal chance of crit
    3552		LDA		_attack_buff_flags
    3553		AND		#ATTACK_BUFF_HIGHER_CRIT
    ⋮
    3555		LDX		#$20 ; replacement odds for demon axe
    ⋮
    3558		JSR		_rand_ex
    ⋮
    3563		SYSX	_sys0F_msg_mFF_arg0_and_delay_or_wait_for_keypress,$10 ; "a tremendous hit!"
    3564		JSR		_sram_b0_s17_player_rATK_read
    ⋮
    
    disassembly/bank04.inc lines 3541–3568 at b35d5fd · upstream ↗
    7146sub_6ADA4:
    7147		LDA		#$B
    7148		JSR		_b4_sF_rand_mul_A
    7149		CLC
    7150		ADC		#$36
    
    disassembly/bank04.inc lines 7146–7154 at b35d5fd · upstream ↗
    7764byte_6B156:
    7765		.BYTE	#ITEM_ESWORD_OF_DESTRUCTION
    ⋮
    7768		.BYTE	#ITEM_EDEMON_AXE
    ⋮
    7774byte_6B15D:
    7775		.BYTE	 #ATTACK_BUFF_HIGHER_CRIT
    ⋮
    7778		.BYTE	 (#ATTACK_BUFF_DEMON_AXE | #ATTACK_BUFF_HIGHER_CRIT)
    
    disassembly/bank04.inc lines 7763–7778 at b35d5fd · 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

  6. ^ abDragon Warrior III (NA NES) keeps Dragon Warrior II's critical-hit odds for most heroes, 1 in 64, and its 1 in 8 with the Sword of Destruction.Codezeromus/DragonWarrior3 · “Dragon Warrior III (USA)” · Nathan-R-Og/dq2revised
    How we know
    3551		LDX		#4 ; normal chance of crit
    ⋮
    3555		LDX		#$20 ; replacement odds for demon axe
    
    disassembly/bank04.inc lines 3551–3555 at b35d5fd · upstream ↗

    In the cartridge (“Dragon Warrior III (USA)”): bank 4 $96A2 ldx; bank 4 $B156, item $93 (Sword of Destruction) carries flag $02, the higher odds. We don't reproduce the bytes.

    7764byte_6B156:
    7765		.BYTE	#ITEM_ESWORD_OF_DESTRUCTION
    ⋮
    7774byte_6B15D:
    7775		.BYTE	 #ATTACK_BUFF_HIGHER_CRIT
    
    disassembly/bank04.inc lines 7763–7775 at b35d5fd · upstream ↗
    6241B04_A5E3:
    6242    lda #$08
    6243    sta $A6
    6244    lda #$4C ; Item ID #$4C: Sword of Destruction (equipped)
    ⋮
    6249    lda #$40
    6250    sta $A6
    
    src/us/prg/bank4.asm lines 6241–6250 at 0fb64a4 · 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

  7. ^ abEach hit that gets through deals attack plus a random 0 to attack, less the target's defense (at least 0), and the hits add up. Each hit also rolls 0–100, and a roll under 5 makes it critical, adding the attack again.Codeeverything8215, FF2 disassembly
    How we know
    18008; [ calculate damage ]
    ⋮
    18010;  $44: attack
    18011;  $46: defense
    18012;  $48: number of hits
    18013; +$4A: damage
    ⋮
    18030; start of hit loop
    180310C/BCA7: A2 00     LDX #$00
    180320C/BCA9: A5 44     LDA $44
    180330C/BCAB: 20 11 FD  JSR $FD11          ; random (X..A)
    180340C/BCAE: 18        CLC 
    180350C/BCAF: 65 44     ADC $44            ; attack * (0..1)
    ⋮
    180410C/BCBA: A5 4C     LDA $4C            ; subtract defense
    ⋮
    
    ff2j.asm lines 18008–18074 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

  8. ^ abUnless an attack is set to always crit, it is critical when a random byte is under 8, a 1-in-32 chance, and a critical adds 2 to the damage multiplier, which the code comments as damage ×2.Codeeverything8215, FF6 disassembly
    How we know
    333@33f2:  lda     #$02
    334        bit     zb3
    335        beq     @340c                   ; auto-crit
    336        bit     zb2
    337        bne     @3414
    338        bit     zba
    339        beq     @3414
    340        jsr     Rand
    341        cmp     #$08
    342        bcs     @3414       ; 31/32 chance to branch
    343        lda     near w7e3eb0 + 25
    344        beq     @3414       ; branch if there are no targets
    ⋮
    
    src/battle/attack.asm lines 332–348 at 8130132 · 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

  9. ^ abIn Final Fantasy V only three weapon attack types roll for a critical (fists, katanas, and type 36), at the crit % the attack type carries; in Final Fantasy VI an attack that can crit does so on a random byte under 8, 1 in 32, whatever the weapon.Codeeverything8215, FF5 disassembly · everything8215, FF6 disassemblyrevised
    How we know
    20794;Check for Critical Hit
    20795;Param1: Crit%
    ⋮
    20802        jsr Random_0_99
    20803        cmp Param1
    
    src/battle/battle-main.asm lines 20794–20803 at 997c87d · upstream ↗
    16363;Attack Type 30 (Fists)
    ⋮
    16381        jsr CheckCrit
    
    src/battle/battle-main.asm lines 16363–16382 at 997c87d · upstream ↗
    16574;Attack Type 37 (Katanas)
    ⋮
    16591        jsr CheckCrit
    
    src/battle/battle-main.asm lines 16574–16592 at 997c87d · upstream ↗
    16542;Attack Type 36 (Bows with Element)
    ⋮
    16564        jsr CheckCrit		;because crit routine expects it there
    
    src/battle/battle-main.asm lines 16542–16564 at 997c87d · upstream ↗
    340        jsr     Rand
    341        cmp     #$08
    342        bcs     @3414       ; 31/32 chance to branch
    
    src/battle/attack.asm lines 339–342 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

  10. ^ abcdeA 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

  11. ^ abA character's crit chance is the equipped weapon's index number, not the crit rate in the weapon's data (no code we read touches that byte); an unarmed Black Belt or Master gets twice their level.CodeDisch, FF1 disassemblyrevised
    How we know
    5693    LDY #btlch_critrate
    5694    AND #$7F
    5695    STA (btl_ib_charstat_ptr), Y        ; BUGGED - this sets the critical rate to the weapon index,
    
    Final Fantasy Disassembly/bank_0C.asm lines 5692–5697 at cbb87d3 · upstream ↗
    27;;  byte 2:  Critial rate (BUGGED - not used .. see LoadOneCharacterIBStats for offending code)
    
    Final Fantasy Disassembly/bank_0C.asm line 27 at cbb87d3 · upstream ↗
    10917    LDY #0                 ; zero Y (our source index)
    ⋮
    10921    ADC (tmp), Y           ; add to it the weapon's hit bonus
    10922    STA ch_hitrate, X      ; and write it back
    10923    INY                    ;   inc source index
    ⋮
    10927    ADC (tmp), Y           ; add weapon's damage bonus
    10928    STA ch_dmg, X          ; and write back
    
    Final Fantasy Disassembly/bank_0F.asm lines 10916–10928 at cbb87d3 · upstream ↗
    5721    CMP #$02
    5722    BEQ @BB_Master                  ; is it a black belt?
    5723    CMP #$08
    ⋮
    5727    LDY #btlch_wepgfx
    5728    LDA (btl_ib_charstat_ptr), Y    ; see if they have no weapon equipped
    5729    BNE @Done
    ⋮
    5734    STA (btl_ib_charstat_ptr), Y
    ⋮
    5737    STA (btl_ib_charstat_ptr), Y
    ⋮
    5739    LDY #ch_level - ch_stats        ; Unarmed BB's crit rate is 2x his level
    5740    LDA (btl_ob_charstat_ptr), Y
    5741    ASL A
    5742    LDY #btlch_critrate
    ⋮
    
    Final Fantasy Disassembly/bank_0C.asm lines 5719–5743 at cbb87d3 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-25.

    Checked by a second AI model, 2026-10-21.

    Revised after a check by a second AI model, 2026-10-25.

    In the claim ledger

  12. ^ abThree attack types call CheckCrit: fists (type 30), katanas (type 37), and type 36, which the source comments as bows with an element and which uses the knife damage formula, after moving its crit % from its second parameter to the first. CheckCrit makes a critical when a roll of 0–99 is under that crit %, and a critical doubles Attack and sets Defense to 0.Codeeverything8215, FF5 disassemblyrevised
    How we know
    20794;Check for Critical Hit
    20795;Param1: Crit%
    ⋮
    20797.proc CheckCrit
    ⋮
    20799_87DF:
    20800        lda MagicSword	;no crits with magic sword,
    20801        bne Ret	;in vanilla FF5 no weapons support both anyway
    20802        jsr Random_0_99
    20803        cmp Param1
    20804        bcs Ret
    20805        lda #$01
    20806        sta Crit
    20807        longa
    ⋮
    
    src/battle/battle-main.asm lines 20794–20812 at 997c87d · upstream ↗
    16363;Attack Type 30 (Fists)
    16364;Param1: Crit%
    ⋮
    16381        jsr CheckCrit
    
    src/battle/battle-main.asm lines 16363–16382 at 997c87d · upstream ↗
    16574;Attack Type 37 (Katanas)
    16575;Param1: Crit%
    ⋮
    16591        jsr CheckCrit
    
    src/battle/battle-main.asm lines 16574–16592 at 997c87d · upstream ↗
    16542;Attack Type 36 (Bows with Element)
    16543;Param1: 	Hit%
    16544;Param2:  	Crit%
    ⋮
    16553        jsr KnifeDamage
    ⋮
    16562        lda Param2
    16563        sta Param1		;move Crit% to Param1
    16564        jsr CheckCrit		;because crit routine expects it there
    
    src/battle/battle-main.asm lines 16542–16564 at 997c87d · 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. ^ abA Fight action rolls once for a critical, 0–99 against the crit probability, and a critical adds the crit bonus to the damage before defense. Both numbers are the first two bytes of the character's job modifiers, so the job sets them.Codeeverything8215, FF3 disassembly
    How we know
    827831/A077: A9 63     LDA #$63
    827931/A079: 20 B4 BE  JSR $BEB4          ; random (0..A)
    828031/A07C: CD 30 74  CMP $7430          ; crit probability
    828131/A07F: B0 04     BCS $A085
    828231/A081: E6 29     INC $29            ; crit flag
    ⋮
    829131/A093: 20 44 BB  JSR $BB44          ; calculate damage
    
    ff3j.asm lines 8278–8291 at 1acef81 · upstream ↗
    823431/A019: AD 31 74  LDA $7431          ; crit bonus
    823531/A01C: 85 28     STA $28
    
    ff3j.asm lines 8234–8235 at 1acef81 · upstream ↗
    8824; [ load character properties ]
    ⋮
    8826; job modifiers format (39/BB1A)
    8827;   $00: crit probability
    8828;   $01: crit bonus
    8829;   $02: run probability
    
    ff3j.asm lines 8824–8829 at 1acef81 · upstream ↗
    886731/A4B9: B1 57     LDA ($57),Y        ; job id
    886831/A4BB: 85 46     STA $46
    886931/A4BD: 20 40 FD  JSR $FD40          ; asl2
    887031/A4C0: 18        CLC 
    887131/A4C1: 65 46     ADC $46
    887231/A4C3: 69 1A     ADC #$1A           ; 39/BB1A (job modifiers)
    ⋮
    887731/A4CD: A9 05     LDA #$05           ; size: 5 bytes
    ⋮
    888231/A4D7: 20 DC FD  JSR $FDDC          ; load rom data to buffer
    888331/A4DA: A2 00     LDX #$00
    888431/A4DC: BD 00 74  LDA $7400,X
    888531/A4DF: 95 40     STA $40,X          ; copy 5 bytes
    
    ff3j.asm lines 8867–8888 at 1acef81 · upstream ↗
    877331/A421: 20 82 A4  JSR $A482          ; load character properties
    ⋮
    877731/A429: B5 18     LDA $18,X          ; copy $18-$4B to character properties
    877831/A42B: 91 5B     STA ($5B),Y
    
    ff3j.asm lines 8773–8782 at 1acef81 · upstream ↗
    813830/9F52: B1 70     LDA ($70),Y        ; copy target's defense stats
    ⋮
    814230/9F59: E0 0F     CPX #$0F
    ⋮
    814430/9F5D: A0 27     LDY #$27
    814530/9F5F: B1 6E     LDA ($6E),Y        ; copy attacker's job modifiers
    814630/9F61: 9D 20 74  STA $7420,X
    814730/9F64: C8        INY 
    814830/9F65: E8        INX 
    814930/9F66: E0 12     CPX #$12
    
    ff3j.asm lines 8138–8150 at 1acef81 · 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

  14. ^ abFinal Fantasy II rolls damage, attack plus 0 to attack less defense, and a critical for each hit that gets through and adds them up; Final Fantasy III rolls damage once, attack plus 0 to half of it, and multiplies it by the net hits, and its single critical roll uses the job's crit probability in place of Final Fantasy II's fixed roll under 5.Codeeverything8215, FF2 disassembly · everything8215, FF3 disassembly
    How we know
    18030; start of hit loop
    ⋮
    180350C/BCAF: 65 44     ADC $44            ; attack * (0..1)
    ⋮
    180610C/BCE2: C9 05     CMP #$05
    180620C/BCE4: B0 11     BCS $BCF7          ; 5% chance for crit
    ⋮
    180720C/BCF7: 88        DEY                ; next hit
    180730C/BCF8: D0 AD     BNE $BCA7
    
    ff2j.asm lines 18030–18073 at 8d26190 · upstream ↗
    1198931/BB4A: 20 B4 BE  JSR $BEB4          ; random (0..A)
    1199031/BB4D: 18        CLC 
    1199131/BB4E: 65 25     ADC $25
    1199231/BB50: 85 18     STA $18            ; +$18 = attack * (1..3/2)
    
    ff3j.asm lines 11989–11992 at 1acef81 · upstream ↗
    1204231/BBB3: AD 7C 00  LDA $007C          ; total no. of hits
    ⋮
    1204631/BBBD: 85 18     STA $18            ; +$18 = net damage
    
    ff3j.asm lines 12042–12046 at 1acef81 · upstream ↗
    827931/A079: 20 B4 BE  JSR $BEB4          ; random (0..A)
    828031/A07C: CD 30 74  CMP $7430          ; crit probability
    
    ff3j.asm lines 8278–8282 at 1acef81 · 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. ^ abA Fight command rolls once for a critical: a percentage roll under the attacker's crit rate adds its crit bonus to the damage before defense. Each character carries a crit rate and bonus of their own (the field code loads Cecil's from CharProp); dual-wielding doubles the rate, which falls to 99 only when the doubling overflows a byte (a rate of 50–127 doubles to 100–254), and adds half the left hand's attack to the bonus, and a bow triples a rate capped at 33 and adds the arrows' attack.Codeeverything8215, FF4 disassemblyrevised
    How we know
    311@c710:  jsr     Rand99
    312        cmp     $26ad       ; compare to crit rate
    313        bcs     @c723
    314        inc     $3900       ; set crit flag for damage
    
    battle/fight.asm lines 311–318 at a360e2e · upstream ↗
    343        lda     $26ae       ; set crit bonus
    344        sta     $3901
    345        jsr     CalcDmg
    
    battle/fight.asm lines 343–345 at a360e2e · upstream ↗
    684        lda     ($80),y     ; crit rate
    ⋮
    687        lda     ($80),y     ; crit bonus
    ⋮
    698; bow and arrow
    699        lda     $a9
    700        cmp     #$21
    701        bcc     @9d48
    702        lda     #$21
    703@9d48:  sta     $df
    704        lda     #$03        ; crit rate * 3
    ⋮
    711        adc     $28a8       ; add arrow attack to crit bonus
    ⋮
    716; dual-wield
    717@9d62:  asl     $a9         ; 2x crit rate
    ⋮
    
    battle/equip.asm lines 684–734 at a360e2e · upstream ↗
    2336; [ init character properties ]
    ⋮
    2338; initializes cecil only
    ⋮
    2350@9505:  lda     f:CharProp,x            ; crit rate, bonus, and ???
    2351        sta     $102d,y
    
    field/field.asm lines 2335–2351 at a360e2e · 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. ^ abcIn EarthBound (US release), a bash is a "SMAAAASH!!" with a chance of about the attacker's Guts in 500, with a party member's Guts counted as at least 25 (about 1 in 20). It is rolled after the miss check and before the dodge, so it can't be dodged, and deals 4 × Offense − Defense with no random spread.CodeHerringway/ebsrc
    How we know
    7	LDA #0
    8	JSR MISS_CALC
    9	CMP #0
    10	BNE @UNKNOWN1
    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 7–17 at 68aec5c · upstream ↗
    10	LDX CURRENT_ATTACKER
    11	LDA __BSS_START__ + battler::guts,X
    12	STA @LOCAL01
    13	LDX CURRENT_ATTACKER
    ⋮
    15	AND #$00FF
    16	BNE @BYPASS_MINIMUM_GUTS
    17	LDA @LOCAL01
    18	CMP #GUTS_FLOOR_FOR_SMAAAASH_CHANCE
    19	BCS @BYPASS_MINIMUM_GUTS
    20	LDA #GUTS_FLOOR_FOR_SMAAAASH_CHANCE
    21	STA @LOCAL01
    22@BYPASS_MINIMUM_GUTS:
    ⋮
    
    src/battle/smaaaash.asm lines 10–26 at 68aec5c · upstream ↗
    .DEFINE GUTS_FLOOR_FOR_SMAAAASH_CHANCE 25
    include/config.asm#L66 · upstream ↗
    59	LDX CURRENT_ATTACKER
    60	LDA __BSS_START__ + battler::offense,X
    61	ASL
    62	ASL
    63	LDX CURRENT_TARGET
    64	SEC
    65	SBC __BSS_START__ + battler::defense,X
    66	LDX @LOCAL01
    67	JSR CALC_RESIST_DAMAGE
    
    src/battle/smaaaash.asm lines 59–67 at 68aec5c · upstream ↗
    8	STA @VIRTUAL02
    9	LDA #500
    10	JSR RAND_LIMIT
    11	CMP @VIRTUAL02
    12	BCS @UNKNOWN0
    13	LDA #1
    
    src/battle/success_500.asm lines 8–13 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

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

  18. ^CriticalHitTest makes a hit critical when a random byte is below a threshold set by the attacker's base Speed S: ⌊S/2⌋ for most moves, and min⁡(255,8⌊S/2⌋) for Karate Chop, Razor Leaf, Crabhammer, and Slash.Codepret/pokered
    How we know
    4489	ld a, [wMonHBaseSpeed]
    4490	ld b, a
    4491	srl b                        ; (effective (base speed/2))
    ⋮
    4514	srl b
    ⋮
    4523	srl b                        ; /2 for regular move (effective (base speed / 2))
    ⋮
    4530	sla b                        ; *4 for high critical move (effective (base speed/2)*8))
    ⋮
    4534	call BattleRandom            ; generates a random value, in "a"
    ⋮
    4538	cp b                         ; check a against calculated crit rate
    4539	ret nc                       ; no critical hit if no borrow
    ⋮
    4542	ret
    
    engine/battle/core.asm lines 4478–4544 at af51989 · upstream ↗
    1HighCriticalMoves:
    2	db KARATE_CHOP
    3	db RAZOR_LEAF
    4	db CRABHAMMER
    5	db SLASH
    
    data/battle/critical_hit_moves.asm lines 1–6 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

  19. ^A Pokémon with base Speed 115, such as Persian, lands a critical hit on 57 of 256 rolls with most moves and on 255 of 256 with Slash.Codepret/pokered
    How we know
    3	db  65,  70,  60, 115,  65
    4	;   hp  atk  def  spd  spc
    
    data/pokemon/base_stats/persian.asm lines 3–4 at af51989 · upstream ↗
    4491	srl b                        ; (effective (base speed/2))
    
    engine/battle/core.asm line 4491 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

  20. ^ abcFocus Energy cuts the critical threshold to a quarter, ⌊S/8⌋ for most moves, because the routine shifts right where it should shift left; pret marks it as a bug.Codepret/pokered
    How we know
    4506	bit GETTING_PUMPED, a        ; test for focus energy
    4507	jr nz, .focusEnergyUsed      ; bug: using focus energy causes a shift to the right instead of left,
    4508	                             ; resulting in 1/4 the usual crit chance
    ⋮
    4513.focusEnergyUsed
    4514	srl b
    
    engine/battle/core.asm lines 4506–4515 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

  21. ^ abcA critical hit doubles the level in the damage formula and takes both Pokémon's stats from their party data, so stat stages, Reflect, and Light Screen drop out.Codepret/pokered
    How we know
    4056	ld a, [wCriticalHitOrOHKO]
    4057	and a ; check for critical hit
    4058	jr z, .scaleStats
    4059; in the case of a critical hit, reset the player's attack and the enemy's defense to their base values
    4060	ld c, STAT_DEFENSE
    4061	call GetEnemyMonStat
    
    engine/battle/core.asm lines 4054–4072 at af51989 · upstream ↗
    4131	ld a, [wBattleMonLevel]
    4132	ld e, a ; e = level
    4133	ld a, [wCriticalHitOrOHKO]
    4134	and a ; check for critical hit
    4135	jr z, .done
    4136	sla e ; double level if it was a critical hit
    
    engine/battle/core.asm lines 4131–4136 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

  22. ^ abYellow keeps Red and Blue's CriticalHitTest line for line, so the attacker's base Speed still sets the chance, ⌊S/2⌋ in 256 for most moves and 8 times that for the high-critical ones, and Focus Energy still cuts it to a quarter.Codepret/pokeyellow · pret/pokered
    How we know
    4649CriticalHitTest:
    ⋮
    4660	ld a, [wMonHBaseSpeed]
    4661	ld b, a
    4662	srl b                        ; (effective (base speed/2))
    ⋮
    4685	srl b
    ⋮
    4701	sla b                        ; *4 for high critical move (effective (base speed/2)*8))
    4702	jr nc, .SkipHighCritical
    4703	ld b, $ff
    4704.SkipHighCritical
    
    engine/battle/core.asm lines 4649–4717 at b6696f2 · upstream ↗
    engine/battle/core.asm#L4478-L4546 · 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

  23. ^ abcdIn EarthBound Beginnings (English build), a plain attack is a "SMAAAASH!!" when a random byte is below max(0, ⌊(256 + attacker's Fight − target's Fight) ÷ 2⌋ − 102), about 26 in 256 at equal Fight. It is checked before the dodge roll, so it can't be dodged, and it deals the attacker's Offense, ignoring Defense. There is no SMAAAASH during the invincibility scripts, while the party fires the tank gun instead, or, 1 time in 2, from a blinded attacker.CodeNathan-R-Og/motherrevised
    How we know
    3135; Same calculation as chance to Dodge.
    ⋮
    3137BINSTCONDITION2_CRIT:
    3138    jsr SEC_IsInvinciblityOn
    3139    bcs :+
    3140    ldy attacker_offset
    3141    lda BATTLER_CORES, y
    3142    sta battle_wordvar60
    3143    ldy target_offset
    3144    lda BATTLER_CORES, y
    3145    sta battle_wordvar62
    3146    jsr DoFightEquation
    3147    lda battle_wordvar62
    ⋮
    
    src/global/prg/battle.asm lines 3135–3149 at e0b3e3f · upstream ↗
    3151; Only runs 50-50 check if attacker_offset is blinded
    3152BINSTCONDITION3_BLIND_MISS:
    3153    ldy attacker_offset
    3154    lda BATTLER_MINOR_STATUS, y
    3155    and #BLIND
    3156    eor #BLIND
    3157    rol a
    3158    bcs :+
    3159    jsr RNG_BYTE
    3160    and #$80                    ; 50-50
    3161    rol a
    3162:   rts
    
    src/global/prg/battle.asm lines 3151–3162 at e0b3e3f · upstream ↗
    3276DoFightEquation:
    3277    lda #$01
    3278    sta battle_wordvar60+1
    3279    sec
    3280    lda battle_wordvar60
    3281    sbc battle_wordvar62
    3282    sta battle_wordvar60
    3283    lda battle_wordvar60+1
    3284    sbc #$00
    3285    lsr a
    3286    ror battle_wordvar60
    3287    sec
    ⋮
    
    src/global/prg/battle.asm lines 3276–3295 at e0b3e3f · upstream ↗
    2532    .addr BINST7_IFFALSE      ; 7 : Jump If Carry Clear .word ptr
    2533    .addr BINST8_IFTRUE       ; 8 : Jump If Carry Set .word ptr
    
    src/global/prg/battle.asm lines 2532–2533 at e0b3e3f · upstream ↗
    585BATTLE_ACTION1:
    586ba_target BA_TARGET::RETARGET
    587ba_jumpifnot BA_CON::BOTHLIVE, BA1_NORMAL
    588ba_jumpif BA_CON::IS_BLINDED, BA1_NORMAL
    589ba_jumpif BA_CON::IS_TANK, BA1_TANK
    590ba_jumpif BA_CON::IS_CRIT, BA1_CRIT
    ⋮
    596ba_jumpifnot BA_CON::IS_DODGE, BATACT_DODGED_SWIFTLY
    ⋮
    602    BA1_CRIT:
    ⋮
    606ba_misc BA_MISC::DISPTEXT, $0B ;SMAAAASH
    607ba_misc BA_MISC::DAMAGECALC_CRIT, 0
    
    src/global/battle_data.asm lines 585–608 at e0b3e3f · upstream ↗
    3483; Damage = AttackerOFF
    3484; If Teddy Script, setnum to rand(1, 16)
    3485BINST61_SETNUMCRIT:
    3486    ldy attacker_offset
    3487    lda BATTLER_OFF, y
    3488    sta battle_input_num
    
    src/global/prg/battle.asm lines 3483–3490 at e0b3e3f · 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

  24. ^ abIn the North American release, BattleRollCriticalHit is entry 2 of the hit-formula table, so it runs only for an attack whose hit-formula script includes it, and only if the hit roll didn't mark a miss. Its chance is (the action's level + the attacker's luck − the target's level)/4, plus the weapon's critical % for a party member, or 255 under Lucky Girl; a 1–100 roll at or under the chance sets bit 1 ($2) of damageFlags. BattleSetTmpDmgAsPhysical doubles the damage when that bit is set, and sets it itself for an attack whose attackFlags bit $2000 is clear. So a chance c of 0–99 crits about c times in 99 (computed for evenly spread 16-bit values). Final Fantasy VI crits on a random byte under 8, 1 in 32, whatever the stats, and a critical adds 2 to the damage multiplier, which its code comments as damage ×2.CodeXeeynamo/ff7-decomp · everything8215, FF6 disassembly
    How we know
    5825static void BattleRollCriticalHit(void) {
    ⋮
    5833    if (!(g_CurrentAction->unk218 & 1)) {
    5834        critChance = 0xFF;
    5835        if (!(g_CurrentAction->attackerStatus & STATUS_LUCKY_GIRL)) {
    5836            v = (g_CurrentAction->characterLevel + g_BattleState.combatant[attacker].luck) -
    5837                g_BattleState.combatant[target].level;
    5838            critChance = v / 4;
    5839            if (attacker < NUM_PARTY) {
    5840                critChance += g_BattleWork.setup[attacker].criticalHitChance;
    ⋮
    5843        if (critChance >= BattleGetRnd164()) {
    5844            g_CurrentAction->damageFlags |= 2;
    
    src/battle/battle.c lines 5825–5847 at fc71ccc · upstream ↗
    346            setup->criticalHitChance = character->weapon.criticalPercent;
    
    src/battle/batini.c line 346 at fc71ccc · upstream ↗
    5044const BattleFormula g_BattleHitFormulaJmpTbl[] = {
    5045    /* 0x0 */ BattleRollPhysicalHit,
    5046    /* 0x1 */ BattleRollMagicalHit,
    5047    /* 0x2 */ BattleRollCriticalHit,
    
    src/battle/battle.c lines 5044–5053 at fc71ccc · upstream ↗
    4443void BattleDmgFormulaRun(void) {
    4444    BattleFormula fnDamageFormula = g_BattleDmgFormulaJmpTbl[g_CurrentAction->dmgFormulaId];
    4445    s32 i = g_BattleHitFormulaOffs[g_CurrentAction->hitFormulaId];
    4446    s32 op;
    ⋮
    4448    while ((op = g_BattleHitFormulaOpcodeStream[i++]) != HIT_OPCODE_DELIM) {
    4449        g_BattleHitFormulaJmpTbl[op]();
    
    src/battle/battle.c lines 4443–4451 at fc71ccc · upstream ↗
    4580    if (!(g_CurrentAction->attackFlags & 0x2000)) {
    4581        g_CurrentAction->damageFlags |= 2;
    ⋮
    4589    if (g_CurrentAction->damageFlags & 2) {
    4590        damage *= 2;
    
    src/battle/battle.c lines 4580–4591 at fc71ccc · upstream ↗
    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 6669–6670 at fc71ccc · upstream ↗
    333@33f2:  lda     #$02
    334        bit     zb3
    335        beq     @340c                   ; auto-crit
    336        bit     zb2
    337        bne     @3414
    338        bit     zba
    339        beq     @3414
    340        jsr     Rand
    341        cmp     #$08
    342        bcs     @3414       ; 31/32 chance to branch
    343        lda     near w7e3eb0 + 25
    344        beq     @3414       ; branch if there are no targets
    ⋮
    
    src/battle/attack.asm lines 332–348 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

  25. ^ abThe Binding Blade's crit is the weapon's crit plus half the skill, plus 30 for classes with a crit bonus, less the defender's luck and at least 0; after a hit, one random number below it triples the damage.Codefireemblem6j
    How we know
    506    attacker->battle_crit = GetItemCrit(attacker->weapon) + attacker->unit.skl/2;
    ⋮
    508    if (UNIT_ATTRIBUTES(&attacker->unit) & UNIT_ATTR_CRITBONUS)
    509        attacker->battle_crit += 30;
    ⋮
    514    attacker->battle_dodge = attacker->unit.lck;
    
    src/battle.c lines 506–514 at e83dd39 · upstream ↗
    530    attacker->battle_effective_crit = attacker->battle_crit - defender->battle_dodge;
    ⋮
    532    if (attacker->battle_effective_crit < 0)
    533        attacker->battle_effective_crit = 0;
    
    src/battle.c lines 530–533 at e83dd39 · upstream ↗
    739    gBattleSt.crit = attacker->battle_effective_crit;
    
    src/battle.c line 739 at e83dd39 · upstream ↗
    754    if (BattleRandRoll(gBattleSt.crit, FALSE) == TRUE)
    ⋮
    756        gBattleHitIt->attributes |= BATTLE_HIT_ATTR_CRIT;
    757        gBattleSt.damage = gBattleSt.damage * 3;
    
    src/battle.c lines 754–757 at e83dd39 · upstream ↗
    83bool RandRoll(int threshold)
    ⋮
    85    return (threshold > RandNext_100());
    
    src/random.c lines 83–85 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

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

  27. ^ abcGold and Silver already use the staged critical hit that Crystal keeps line for line: Focus Energy (+1), a high-critical move (+2), and a Scope Lens (+1) add to a critical level, which reads 17, 32, 64, 85, or 128 in 256 from CriticalHitChances. Chansey holding a Lucky Punch and Farfetch'd holding a Stick get level 2 at once and skip the other bonuses.Codepret/pokegold · pret/pokecrystalrevised
    How we know
    1145	cp CHANSEY
    1146	jr nz, .Farfetchd
    1147	ld a, [hl]
    1148	cp LUCKY_PUNCH
    1149	jr nz, .FocusEnergy
    ⋮
    1151; +2 critical level
    1152	ld c, 2
    1153	jr .Tally
    ⋮
    1156	cp FARFETCH_D
    1157	jr nz, .FocusEnergy
    1158	ld a, [hl]
    1159	cp STICK
    ⋮
    
    engine/battle/effect_commands.asm lines 1145–1205 at fc702b6 · upstream ↗
    1CriticalHitChances:
    2	db 1 out_of 15 ;  0
    3	db 1 out_of 8  ; +1
    4	db 1 out_of 4  ; +2
    5	db 1 out_of 3  ; +3
    6	db 1 out_of 2  ; +4
    
    data/battle/critical_hit_chances.asm lines 1–8 at fc702b6 · upstream ↗
    engine/battle/effect_commands.asm#L1120-L1213 · 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

  28. ^BattleCommand_Critical sums a critical level, +1 for Focus Energy, +2 for a high-critical move, and +1 for a Scope Lens, then rolls against 17, 32, 64, 85, or 128 in 256 for levels 0 to 4; Chansey with a Lucky Punch and Farfetch'd with a Stick get level 2 and skip the other bonuses.Codepret/pokecrystal
    How we know
    1145	cp LUCKY_PUNCH
    1146	jr nz, .FocusEnergy
    ⋮
    1148; +2 critical level
    1149	ld c, 2
    1150	jr .Tally
    ⋮
    1154	jr nz, .FocusEnergy
    ⋮
    1157	jr nz, .FocusEnergy
    ⋮
    1159; +2 critical level
    1160	ld c, 2
    1161	jr .Tally
    ⋮
    1166	bit SUBSTATUS_FOCUS_ENERGY, a
    1167	jr z, .CheckCritical
    ⋮
    
    engine/battle/effect_commands.asm lines 1120–1207 at 97187cd · upstream ↗
    1CriticalHitChances:
    2	db 1 out_of 15 ;  0
    3	db 1 out_of 8  ; +1
    4	db 1 out_of 4  ; +2
    5	db 1 out_of 3  ; +3
    6	db 1 out_of 2  ; +4
    
    data/battle/critical_hit_chances.asm lines 1–8 at 97187cd · upstream ↗
    1CriticalHitMoves:
    2	db KARATE_CHOP
    3	db RAZOR_WIND
    4	db RAZOR_LEAF
    5	db CRABHAMMER
    6	db SLASH
    7	db AEROBLAST
    8	db CROSS_CHOP
    
    data/moves/critical_hit_moves.asm lines 1–9 at 97187cd · upstream ↗
    25; e.g. 1 out_of 2 == 50 percent + 1 == $80
    26DEF out_of EQUS "* $100 /"
    
    macros/data.asm lines 25–26 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

  29. ^ abcA critical hit doubles the damage after item boosts and before the cap of 997 and the final +2; unless the attacker's stat stage is higher than the defender's, it also uses both Pokémon's unboosted stats, which drops Reflect and Light Screen.Codepret/pokecrystal
    How we know
    3021.DoneItem:
    3022; Critical hits
    3023	call .CriticalMultiplier
    
    engine/battle/effect_commands.asm lines 3021–3023 at 97187cd · upstream ↗
    3108.CriticalMultiplier:
    3109	ld a, [wCriticalHit]
    3110	and a
    3111	ret z
    ⋮
    3113; x2
    
    engine/battle/effect_commands.asm lines 3108–3120 at 97187cd · upstream ↗
    2660CheckDamageStatsCritical:
    2661; Return carry if boosted stats should be used in damage calculations.
    2662; Unboosted stats should be used if the attack is a critical hit,
    2663;  and the stage of the opponent's defense is higher than the user's attack.
    
    engine/battle/effect_commands.asm lines 2660–2663 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

  30. ^ abcRuby and Sapphire's atk04_critcalc, which Emerald keeps apart from a renamed helper, sums Focus Energy (+2), a move whose effect is high-critical, Sky Attack, Blaze Kick, or Poison Tail (+1), a Scope Lens (+1), and Lucky Punch or Stick on their species (+2), caps the stage at 4, and hits critically 1 time in 16, 8, 4, 3, or 2. Battle Armor or Shell Armor on the target, the STATUS3_CANT_SCORE_A_CRIT flag on the attacker, Wally's tutorial, and the first battle rule it out.Codepret/pokeruby · pret/pokeemeraldrevised
    How we know
    1387    critChance  = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
    1388                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
    1389                + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
    1390                + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
    1391                + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
    1392                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
    ⋮
    1399    if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)
    1400     && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT)
    1401     && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE))
    1402     && !(Random() % sCriticalHitChance[critChance]))
    
    src/battle_script_commands.c lines 1387–1402 at 5784633 · upstream ↗
    822static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c line 822 at 5784633 · upstream ↗
    1253static void Cmd_critcalc(void)
    
    src/battle_script_commands.c lines 1253–1289 at 731ad5b · upstream ↗
    606static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c line 606 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

  31. ^ abcdCmd_critcalc sums a critical stage, +2 for Focus Energy, +1 for a high-critical move (including Sky Attack, Blaze Kick, and Poison Tail), +1 for a Scope Lens, and +2 for Chansey with a Lucky Punch or Farfetch'd with a Stick, capped at 4; a 16-bit Random() taken modulo 16, 8, 4, 3, or 2 must be 0, a chance of 1/16, 1/8, 1/4, 21,846 in 65,536 (slightly over 1/3), or 1/2, and a target with Battle Armor or Shell Armor is never hit critically.Codepret/pokeemerald
    How we know
    605// The chance is 1/N for each stage.
    606static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c lines 605–606 at 731ad5b · upstream ↗
    1267    critChance  = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
    1268                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
    ⋮
    1272                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
    ⋮
    1279    if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)
    ⋮
    1282     && !(Random() % sCriticalHitChance[critChance]))
    1283        gCritMultiplier = 2;
    
    src/battle_script_commands.c lines 1267–1285 at 731ad5b · upstream ↗
    11u16 Random(void)
    ⋮
    15    return gRngValue >> 16;
    
    src/random.c lines 11–16 at 731ad5b · 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

  32. ^ abcCmd_damagecalc multiplies the base damage by 2 on a critical; CalculateBaseDamage then ignores the attacker's lowered attacking stat, the defender's raised defending stat, and Reflect or Light Screen.Codepret/pokeemerald
    How we know
    1296    gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;
    
    src/battle_script_commands.c line 1296 at 731ad5b · upstream ↗
    3234        if (gCritMultiplier == 2)
    ⋮
    3236            // Critical hit, if attacker has lost attack stat stages then ignore stat drop
    ⋮
    3248        if (gCritMultiplier == 2)
    ⋮
    3250            // Critical hit, if defender has gained defense stat stages then ignore stat increase
    ⋮
    3267        if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
    
    src/pokemon.c lines 3234–3268 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

  33. ^ abFireRed and LeafGreen's Cmd_critcalc keeps Ruby's stages and its 1 in 16, 8, 4, 3, or 2, but rules out critical hits in the Old Man's catching tutorial, in Pokédude battles, and in the first battle until a tutorial flag is set.Codepret/pokefirered · pret/pokeemeraldrevised
    How we know
    1196    if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)
    1197     && !(gStatuses3[gBattlerAttacker] & STATUS3_CANT_SCORE_A_CRIT)
    1198     && !(gBattleTypeFlags & BATTLE_TYPE_OLD_MAN_TUTORIAL)
    1199     && !(Random() % sCriticalHitChance[critChance])
    1200     && (!(gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) || BtlCtrl_OakOldMan_TestState2Flag(1))
    1201     && !(gBattleTypeFlags & BATTLE_TYPE_POKEDUDE))
    
    src/battle_script_commands.c lines 1196–1201 at ce6406d · upstream ↗
    588static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c line 588 at ce6406d · upstream ↗
    1253static void Cmd_critcalc(void)
    ⋮
    1281     && !(gBattleTypeFlags & (BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_FIRST_BATTLE))
    1282     && !(Random() % sCriticalHitChance[critChance]))
    
    src/battle_script_commands.c lines 1253–1288 at 731ad5b · upstream ↗
    606static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c line 606 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

  34. ^ abBattleSystem_CalcCriticalMulti keeps Emerald's stage table, 1 in 16, 8, 4, 3, or 2, capped at stage 4, and its sum: +2 for Focus Energy, +1 for a held item with HOLD_EFFECT_CRITRATE_UP, +2 for Chansey or Farfetch'd holding an item whose hold effect names that species, plus the move's boosts, which in Platinum come from a battle-script variable (criticalBoosts) rather than a list of move effects. It adds +1 for the ability Super Luck, which Emerald's sum doesn't read. Besides Battle Armor and Shell Armor, which an attacker with Mold Breaker ignores, Lucky Chant on the target's side blocks a critical, and so does a MOVE_EFFECT_NO_CRITICAL flag that a comment in the header says is checked but never set. Platinum draws its 16-bit roll before those tests, where Emerald draws it only after its other tests pass.Codepret/pokeplatinum · pret/pokeemeraldrevised
    How we know
    7096// each value here is implicitly 1 / N
    7097static const u8 sCriticalStageRates[] = {
    7098    16, // neutral
    7099    8, // +1
    7100    4, // +2
    7101    3, // +3
    7102    2, // +4
    
    src/battle/battle_lib.c lines 7096–7103 at 49f78f3 · upstream ↗
    7123    effectiveCritStage = (((attackerVolStatus & VOLATILE_CONDITION_FOCUS_ENERGY) != FALSE) * 2)
    7124        + (itemEffect == HOLD_EFFECT_CRITRATE_UP)
    7125        + criticalStage
    7126        + (attackerAbility == ABILITY_SUPER_LUCK)
    7127        + (2 * (itemEffect == HOLD_EFFECT_CHANSEY_CRITRATE_UP && attackerSpecies == SPECIES_CHANSEY))
    7128        + (2 * (itemEffect == HOLD_EFFECT_FARFETCHD_CRITRATE_UP && attackerSpecies == SPECIES_FARFETCHD));
    ⋮
    7131        effectiveCritStage = 4;
    ⋮
    7134    if (BattleSystem_RandNext(battleSys) % sCriticalStageRates[effectiveCritStage] == 0
    7135        && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_BATTLE_ARMOR) == FALSE
    7136        && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_SHELL_ARMOR) == FALSE
    7137        && (sideConditions & SIDE_CONDITION_LUCKY_CHANT) == FALSE
    7138        && (defenderMoveEffects & MOVE_EFFECT_NO_CRITICAL) == FALSE) {
    ⋮
    
    src/battle/battle_lib.c lines 7123–7139 at 49f78f3 · upstream ↗
    3112    if (Battler_Ability(battleCtx, attacker) != ABILITY_MOLD_BREAKER) {
    3113        if (Battler_Ability(battleCtx, defender) == ability) {
    3114            result = TRUE;
    
    src/battle/battle_lib.c lines 3112–3115 at 49f78f3 · upstream ↗
    2158        battleCtx->criticalMul = BattleSystem_CalcCriticalMulti(battleSys,
    ⋮
    2162            battleCtx->criticalBoosts,
    
    src/battle/battle_script.c lines 2158–2162 at 49f78f3 · upstream ↗
    9531    case BTLVAR_CRITICAL_BOOSTS:
    9532        return &battleCtx->criticalBoosts;
    
    src/battle/battle_script.c lines 9531–9532 at 49f78f3 · upstream ↗
    23#define MOVE_EFFECT_NO_CRITICAL            (1 << 15) // checked for, but never set
    
    include/constants/battle/moves.h line 23 at 49f78f3 · upstream ↗
    1308u16 BattleSystem_RandNext(BattleSystem *battleSys)
    ⋮
    1311    return (u16)(battleSys->seedRandNext / LCRNG_DIVISOR);
    
    src/battle/battle_system.c lines 1308–1312 at 49f78f3 · upstream ↗
    605// The chance is 1/N for each stage.
    606static const u16 sCriticalHitChance[] = {16, 8, 4, 3, 2};
    
    src/battle_script_commands.c lines 605–606 at 731ad5b · upstream ↗
    1267    critChance  = 2 * ((gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) != 0)
    1268                + (gBattleMoves[gCurrentMove].effect == EFFECT_HIGH_CRITICAL)
    1269                + (gBattleMoves[gCurrentMove].effect == EFFECT_SKY_ATTACK)
    1270                + (gBattleMoves[gCurrentMove].effect == EFFECT_BLAZE_KICK)
    1271                + (gBattleMoves[gCurrentMove].effect == EFFECT_POISON_TAIL)
    1272                + (holdEffect == HOLD_EFFECT_SCOPE_LENS)
    ⋮
    1279    if ((gBattleMons[gBattlerTarget].ability != ABILITY_BATTLE_ARMOR && gBattleMons[gBattlerTarget].ability != ABILITY_SHELL_ARMOR)
    ⋮
    1282     && !(Random() % sCriticalHitChance[critChance]))
    1283        gCritMultiplier = 2;
    
    src/battle_script_commands.c lines 1267–1283 at 731ad5b · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  35. ^ abA critical multiplies Platinum's damage by 2 after the base formula (its +2 included), at the same step as Emerald, and by 3 when the attacker has Sniper; Emerald's multiplier has no such case. As in Emerald, the critical then ignores the attacker's lowered attacking stat, the defender's raised defending stat, and Reflect or Light Screen.Codepret/pokeplatinum · pret/pokeemeraldrevised
    How we know
    7142    if (criticalMul == 2 && Battler_Ability(battleCtx, attacker) == ABILITY_SNIPER) {
    7143        criticalMul = 3;
    ⋮
    7146    return criticalMul;
    
    src/battle/battle_lib.c lines 7142–7146 at 49f78f3 · upstream ↗
    1334    battleCtx->damage = BattleSystem_CalcMoveDamage(battleSys,
    ⋮
    1344    battleCtx->damage *= battleCtx->criticalMul;
    
    src/battle/battle_script.c lines 1334–1344 at 49f78f3 · upstream ↗
    6947    if (moveClass == CLASS_PHYSICAL) {
    6948        if (criticalMul > 1) {
    6949            if (attackStage > DEFAULT_STAT_STAGE) {
    ⋮
    6963        if (criticalMul > 1) {
    6964            if (defenseStage < DEFAULT_STAT_STAGE) {
    ⋮
    6982        if ((sideConditions & SIDE_CONDITION_REFLECT) != FALSE
    6983            && criticalMul == 1
    ⋮
    6992    } else if (moveClass == CLASS_SPECIAL) {
    6993        if (criticalMul > 1) {
    6994            if (spAttackStage > DEFAULT_STAT_STAGE) {
    ⋮
    7008        if (criticalMul > 1) {
    7009            if (spDefenseStage < DEFAULT_STAT_STAGE) {
    ⋮
    
    src/battle/battle_lib.c lines 6947–7024 at 49f78f3 · upstream ↗
    7078    return damage + 2;
    
    src/battle/battle_lib.c line 7078 at 49f78f3 · upstream ↗
    1296    gBattleMoveDamage = gBattleMoveDamage * gCritMultiplier * gBattleScripting.dmgMultiplier;
    
    src/battle_script_commands.c line 1296 at 731ad5b · upstream ↗
    3234        if (gCritMultiplier == 2)
    ⋮
    3236            // Critical hit, if attacker has lost attack stat stages then ignore stat drop
    ⋮
    3248        if (gCritMultiplier == 2)
    ⋮
    3250            // Critical hit, if defender has gained defense stat stages then ignore stat increase
    ⋮
    3267        if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
    
    src/pokemon.c lines 3234–3268 at 731ad5b · upstream ↗
    3287    if (IS_TYPE_SPECIAL(type))
    ⋮
    3289        if (gCritMultiplier == 2)
    ⋮
    3291            // Critical hit, if attacker has lost sp. attack stat stages then ignore stat drop
    ⋮
    3303        if (gCritMultiplier == 2)
    ⋮
    3318        if ((sideStatus & SIDE_STATUS_LIGHTSCREEN) && gCritMultiplier == 1)
    
    src/pokemon.c lines 3287–3318 at 731ad5b · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Revised after a check by a second AI model, 2026-10-22.

    In the claim ledger

  36. ^HeartGold and SoulSilver's TryCriticalHit keeps Platinum's critical-hit rule: the stage sum (+2 Focus Energy, +1 for a HOLD_EFFECT_CRITRATE_UP item, +1 Super Luck, +2 for Chansey or Farfetch'd with its own item, plus the move's boosts) capped at 4, a chance of 1 in 16, 8, 4, 3, or 2, blocked by Battle Armor or Shell Armor unless ignored, by Lucky Chant on the target's side, or by bit 15 of the target's move-effect flags (named MOVE_EFFECT_FLAG_LUCKY_CHANT here), and Sniper turning ×2 into ×3.Codepret/pokeheartgold · pret/pokeplatinum
    How we know
    5960static const u8 sCritChance[] = {
    5961    16, 8, 4, 3, 2
    ⋮
    5979    critUp = (((status2 & STATUS2_FOCUS_ENERGY) != 0) * 2) + (item == HOLD_EFFECT_CRITRATE_UP) + critCnt + (ability == ABILITY_SUPER_LUCK) + 2 * ((item == HOLD_EFFECT_CHANSEY_CRITRATE_UP) && (species == SPECIES_CHANSEY)) + 2 * ((item == HOLD_EFFECT_FARFETCHD_CRITRATE_UP) && (species == SPECIES_FARFETCHD));
    ⋮
    5981    if (critUp > 4) {
    5982        critUp = 4;
    ⋮
    5985    if ((BattleSystem_Random(battleSystem) % sCritChance[critUp]) == 0) {
    5986        if (!CheckBattlerAbilityIfNotIgnored(ctx, battlerIdAttacker, battlerIdTarget, ABILITY_BATTLE_ARMOR) && !CheckBattlerAbilityIfNotIgnored(ctx, battlerIdAttacker, battlerIdTarget, ABILITY_SHELL_ARMOR) && !(sideCondition & SIDE_CONDITION_LUCKY_CHANT) && !(moveEffect & MOVE_EFFECT_FLAG_LUCKY_CHANT)) {
    5987            ret = 2;
    ⋮
    5991    if ((ret == 2) && GetBattlerAbility(ctx, battlerIdAttacker) == ABILITY_SNIPER) {
    5992        ret = 3;
    
    src/battle/overlay_12_0224E4FC.c lines 5960–5995 at 6988158 · upstream ↗
    177#define MOVE_EFFECT_FLAG_LUCKY_CHANT        (1 << 15)
    
    include/constants/battle.h line 177 at 6988158 · upstream ↗
    7097static const u8 sCriticalStageRates[] = {
    7098    16, // neutral
    7099    8, // +1
    7100    4, // +2
    7101    3, // +3
    7102    2, // +4
    
    src/battle/battle_lib.c lines 7096–7103 at 49f78f3 · upstream ↗
    7123    effectiveCritStage = (((attackerVolStatus & VOLATILE_CONDITION_FOCUS_ENERGY) != FALSE) * 2)
    7124        + (itemEffect == HOLD_EFFECT_CRITRATE_UP)
    7125        + criticalStage
    7126        + (attackerAbility == ABILITY_SUPER_LUCK)
    ⋮
    7134    if (BattleSystem_RandNext(battleSys) % sCriticalStageRates[effectiveCritStage] == 0
    7135        && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_BATTLE_ARMOR) == FALSE
    7136        && Battler_IgnorableAbility(battleCtx, attacker, defender, ABILITY_SHELL_ARMOR) == FALSE
    7137        && (sideConditions & SIDE_CONDITION_LUCKY_CHANT) == FALSE
    7138        && (defenderMoveEffects & MOVE_EFFECT_NO_CRITICAL) == FALSE) {
    7139        criticalMul = 2;
    
    src/battle/battle_lib.c lines 7123–7139 at 49f78f3 · upstream ↗
    23#define MOVE_EFFECT_NO_CRITICAL            (1 << 15) // checked for, but never set
    
    include/constants/battle/moves.h line 23 at 49f78f3 · upstream ↗
    7142    if (criticalMul == 2 && Battler_Ability(battleCtx, attacker) == ABILITY_SNIPER) {
    7143        criticalMul = 3;
    
    src/battle/battle_lib.c lines 7142–7143 at 49f78f3 · 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

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

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

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

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

  41. ^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“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

  42. ^BattleRNG's table holds $00 twice and never $95, so a battle draw is never $95.Code“Final Fantasy (USA)” · Disch, FF1 disassembly
    How we know

    In the cartridge (“Final Fantasy (USA)”): bank $0F $FCF1-$FDF0, the table; `$00` sits at positions 97 and 110. We don't reproduce the bytes.

    13811;;    IMPORTANT NOTE!!!!  ChaosDeath in bank B assumes that calling this routine 256 times consecutively will
    ⋮
    13823  @Scramble_lut:
    13824    .INCBIN "bin/0F_FCF1_rngtable.bin"
    
    Final Fantasy Disassembly/bank_0F.asm lines 13811–13824 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

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

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

  45. ^A damage spell always connects, for a random value from its power E to 2E; its roll of 0–200 against 148 + the spell's hit rate − the target's magic defense doubles the damage instead of deciding a hit.CodeDisch, FF1 disassembly
    How we know
    8284    JSR BtlMag_MarkSpellConnected           ; damage spells always connect
    8285    JSR BtlMag_LoadBaseHitChance            ; load base hit chance (since damage always hits, this becomes more of a "critical" chance)
    
    Final Fantasy Disassembly/bank_0C.asm lines 8283–8286 at cbb87d3 · upstream ↗
    8208    LDA #<148               ; base hit chance of 148
    
    Final Fantasy Disassembly/bank_0C.asm lines 8207–8211 at cbb87d3 · upstream ↗
    8156    JSR MathBuf_Add             ; math_hitchance += spell's base hit rate
    ⋮
    8160    JSR MathBuf_Sub             ; math_hitchance -= defender's magdef
    ⋮
    8168    JSR MathBuf_Add             ; math_basedamage = rand[ spelldamage, spelldamage*2 ]
    
    Final Fantasy Disassembly/bank_0C.asm lines 8153–8171 at cbb87d3 · upstream ↗
    8328    BEQ :+                          ; if the hit/crit roll was 200, this is NOT a crit
    ⋮
    8331        ASL math_basedamage         ; ... do 2x damage
    
    Final Fantasy Disassembly/bank_0C.asm lines 8325–8332 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

  46. ^The Gameplay Design Patterns wiki defines critical hits as "Attacks that do significantly more damage than others, or have other special effects," made by giving an ordinary hit a small chance to become critical.WikiGameplay Design Patterns wiki, “Critical Hits”
    How we know
    Attacks that do significantly more damage than others, or have other special effects.
    lead and first paragraph · archived copy ↗
    introducing a small chance that an ordinary hit instead becomes a critical one with added damage or other negative consequences for the target.
    first paragraph · archived copy ↗

    The quote matches our archived copy.

    In the claim ledger

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

Sources

Code

Secondary