Critical hit
A hit that its own random roll makes stronger than the damage formula alone.
On this page
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.
- 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
| Damage | Ignores | Rolled | |
|---|---|---|---|
| Dragon Warrior | between half and all of attack power1 | the monster’s defense1 | per attack, before damage1 |
| Final Fantasy | the swing’s damage roll again10 | absorb, on the added roll10 | per swing, on the hit roll10 |
| Red and Blue | level doubled in the formula21 | stat stages, Reflect, Light Screen21 | once per move37 |
| Crystal | ×229 | all boosts, unless the attacker’s stage is higher29 | per hit38 |
| Emerald | ×232 | changes that hurt the attacker, Reflect, Light Screen32 | per hit39 |
| The Sacred Stones | attack less defense, tripled26,40 | nothing | per 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
$00twice, 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 for attack power , 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
| Game | Year | How | Note |
|---|---|---|---|
| Dragon Warrior | 1986 | Fixed | one of the hero's swings in 32 is an "excellent move" that ignores defense, and monsters never land one |
| Dragon Warrior II | 1987 | Fixed | one swing in 64 is a "tremendous blow" that ignores defense; the cursed Sword of Destruction makes them common but wastes some turns |
| Dragon Warrior III | 1988 | Fixed | one swing in 64 is a "tremendous hit" that ignores defense, and Fighters land more as they level |
| Final Fantasy II | 1988 | Fixed | about one hit in twenty is critical, whatever the weapon, and adds the attack again |
| Final Fantasy VI | 1994 | Fixed | 1 in 32 for any attack that can crit, doubling the damage |
| Final Fantasy | 1987 | From equipment | the weapon's place in the item list, not its listed critical rate, sets how often it crits |
| Final Fantasy V | 1992 | From equipment | only fists, katanas, and one other attack type can land a critical, which ignores defense |
| Final Fantasy III | 1990 | Rate and bonus | the job decides how often an attack is critical and how much a critical adds |
| Final Fantasy IV | 1991 | Rate and bonus | each character has a critical rate of their own, doubled when fighting with two weapons and tripled with a bow |
| EarthBound | 1994 | From a stat | "SMAAAASH!!" at about Guts in 500, at least 1 in 20 for the party, for 4 × Offense − Defense |
| Pokémon Red and Blue | 1996 | From a stat | half the attacker's base Speed in 256, and eight times that for four high-critical moves |
| Pokémon Yellow | 1998 | From a stat | Red and Blue's base-Speed rule, Focus Energy bug included |
| EarthBound Beginnings | 1989 | Stat 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 VII | 1997 | Weapon and stats | (level + luck − target level)/4 plus the weapon's critical %, against 1–100; doubles physical damage |
| Fire Emblem: The Binding Blade | 2002 | Weapon and stats | the 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 Stones | 2004 | Weapon and stats | the 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 Silver | 1999 | From stages | Focus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256 |
| Pokémon Crystal | 2000 | From stages | Focus Energy, high-critical moves, and a Scope Lens add stages, from 17 to 128 in 256 |
| Pokémon Ruby and Sapphire | 2002 | From stages | stages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it |
| Pokémon Emerald | 2004 | From stages | stages from 1 in 16 to 1 in 2, and Battle Armor and Shell Armor block it |
| Pokémon FireRed and LeafGreen | 2004 | From stages | 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 |
| Pokémon Platinum | 2008 | From stages | Emerald's stages, plus Super Luck; Lucky Chant blocks it, and Sniper makes it ×3 |
| Pokémon HeartGold and SoulSilver | 2009 | From stages | Platinum's stage table, with Super Luck, Lucky Chant, and Sniper |
Every claim about this mechanic, by game (45)
References
- ^ abcdeBefore the normal formula, a 1-in-32 roll gives the hero an "excellent move", except against either form of the Dragonlord; it deals for a random byte , from to (more than half to all of the attack power), and ignores defense.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.
- ^A monster's physical attack has no critical branch and no dodge roll for the hero;
EnPhysAttackgoes straight toEnCalcHitDmg, and only 0 damage misses.Codenmikstas/dragon-warrior-disassemblyHow we know
7765LEBD6: JSR EnCalcHitDmg ;($EFF4)Calculate enemy hit damage on player. ⋮ 7767LEBD9: LDA CalcDamage ;Did enemy do damage to the player? 7768LEBDB: BNE EnHitsPlayer ;If so, branch to subtract damage from player's HP.
source_files/Bank03.asm lines 7751–7774 at ebe6a13 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abIn 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 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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.
- ^ 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 chanceFinal Fantasy Disassembly/bank_0C.asm lines 4401–4405 at cbb87d3 · upstream ↗ 4515 LDA math_critchance ; see if hit value is <= crit chance (this will be impossible if the attack was a miss) ⋮ 4519 LDX math_basedamage ; add random damage to our total 4520 JSR MathBuf_Add 4521 INC battle_critsconnected
Final Fantasy Disassembly/bank_0C.asm lines 4514–4521 at cbb87d3 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ 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.
- ^ 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.CheckCritmakes a critical when a roll of 0–99 is under that crit %, and a critical doubles Attack and sets Defense to 0.Codeeverything8215, FF5 disassemblyrevisedHow 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.
- ^ 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.
- ^ 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.
- ^ 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 disassemblyrevisedHow 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.
- ^ 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.
- ^ 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.
- ^
CriticalHitTestmakes a hit critical when a random byte is below a threshold set by the attacker's base Speed : for most moves, and for Karate Chop, Razor Leaf, Crabhammer, and Slash.Codepret/pokeredHow 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.
- ^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.
- ^ abcFocus Energy cuts the critical threshold to a quarter, 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.
- ^ 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.
- ^ abYellow keeps Red and Blue's
CriticalHitTestline for line, so the attacker's base Speed still sets the chance, 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/pokeredHow 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.
- ^ 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.
- ^ abIn the North American release,
BattleRollCriticalHitis 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) ofdamageFlags.BattleSetTmpDmgAsPhysicaldoubles the damage when that bit is set, and sets it itself for an attack whoseattackFlagsbit $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 disassemblyHow 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.
- ^ 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.
- ^ 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.
- ^ 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/pokecrystalrevisedHow 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.
- ^
BattleCommand_Criticalsums 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/pokecrystalHow 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.
- ^ 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.
- ^ 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, theSTATUS3_CANT_SCORE_A_CRITflag on the attacker, Wally's tutorial, and the first battle rule it out.Codepret/pokeruby · pret/pokeemeraldrevisedHow 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.
- ^ abcd
Cmd_critcalcsums 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-bitRandom()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/pokeemeraldHow 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.
- ^ abc
Cmd_damagecalcmultiplies the base damage by 2 on a critical;CalculateBaseDamagethen ignores the attacker's lowered attacking stat, the defender's raised defending stat, and Reflect or Light Screen.Codepret/pokeemeraldHow 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.
- ^ abFireRed and LeafGreen's
Cmd_critcalckeeps 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/pokeemeraldrevisedHow 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.
- ^ ab
BattleSystem_CalcCriticalMultikeeps 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 withHOLD_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 aMOVE_EFFECT_NO_CRITICALflag 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/pokeemeraldrevisedHow 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 setinclude/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.
- ^ 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.
- ^HeartGold and SoulSilver's
TryCriticalHitkeeps Platinum's critical-hit rule: the stage sum (+2 Focus Energy, +1 for aHOLD_EFFECT_CRITRATE_UPitem, +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 (namedMOVE_EFFECT_FLAG_LUCKY_CHANThere), and Sniper turning ×2 into ×3.Codepret/pokeheartgold · pret/pokeplatinumHow 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 setinclude/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.
- ^A multi-hit move runs the critical test, the damage formula, and the accuracy roll once; every later hit repeats the first hit's damage, and a first hit that misses ends the move.Codepret/pokered
How we know
3246 bit ATTACKING_MULTIPLE_TIMES, [hl] 3247 jr z, .executeOtherEffects 3248 ld a, [wPlayerNumAttacksLeft] 3249 dec a 3250 ld [wPlayerNumAttacksLeft], a 3251 jp nz, GetPlayerAnimationType ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints. 3252 ; damage calculation and accuracy tests only happen for the first hit
engine/battle/core.asm lines 3246–3253 at af51989 · upstream ↗ 1AlwaysHappenSideEffects: ⋮ 7 db TWO_TO_FIVE_ATTACKS_EFFECT
data/battle/always_happen_effects.asm lines 1–7 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
BattleCommand_EndLoopgives 2–5 hits with Red and Blue's odds and Triple Kick 1–3 hits, 1/3 each, and jumps back to thecriticalcommand, so every hit rolls its own critical and damage;checkhitsits before the loop and runs once.Codepret/pokecrystalHow we know
5203BattleCommand_EndLoop: 5204; Loop back to 'critical'. ⋮ 5233.reject_triple_kick_sample 5234 call BattleRandom 5235 and $3 5236 jr z, .reject_triple_kick_sample ⋮ 5271.not_triple_kick 5272 call BattleRandom 5273 and $3 5274 cp 2 5275 jr c, .got_number_hits 5276 call BattleRandom ⋮
engine/battle/effect_commands.asm lines 5203–5284 at 97187cd · upstream ↗ 5320.loop_back_to_critical ⋮ 5327 cp critical_command
engine/battle/effect_commands.asm lines 5320–5328 at 97187cd · upstream ↗ 842MultiHit: 843 checkobedience 844 usedmovetext 845 doturn 846 startloop 847 lowersub 848 checkhit 849 critical 850 damagestats 851 damagecalc
data/moves/effects.asm lines 842–851 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
Cmd_setmultihitcountergives 2 or 3 hits with probability 3/8 each and 4 or 5 with 1/8 each; the loop rerunscritcalcanddamagecalcfor every hit, after oneaccuracycheck.Codepret/pokeemeraldHow we know
7145 else ⋮ 7147 gMultiHitCounter = Random() & 3; 7148 if (gMultiHitCounter > 1) 7149 gMultiHitCounter = (Random() & 3) + 2; 7150 else 7151 gMultiHitCounter += 2;
src/battle_script_commands.c lines 7139–7155 at 731ad5b · upstream ↗ 604BattleScript_EffectMultiHit:: 605 attackcanceler 606 accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE ⋮ 609 setmultihitcounter 0 ⋮ 612BattleScript_MultiHitLoop:: ⋮ 620 critcalc 621 damagecalc 622 typecalc ⋮ 639 decrementmultihit BattleScript_MultiHitLoop
data/battle_scripts_1.s lines 604–639 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^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.
- ^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.
- ^
BattleRNG's table holds$00twice and never$95, so a battle draw is never$95.Code“Final Fantasy (USA)” · Disch, FF1 disassemblyHow 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.
- ^After the damage is set, an awake monster dodges when a roll of 0–63 falls below , the low nibble of its resistance byte, a chance of ; a sleeping monster never dodges, and spells skip the check.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 North American build, an attack hits when the displayed hit is greater than the average of two random numbers from 0 to 99, rounded down; each number scales a 16-bit
NextRN()by 100/65,536.Codefireemblem8uHow we know
68int NextRN_100(void) { 69 // take the next rn (range 0-0xFFFF) and convert it to a range 0-99 value 70 return NextRN() * 100 / 0x10000;
src/rng.c lines 68–70 at 04d1edb · upstream ↗ 89s8 Roll2RN(int threshold) { 90 int average = (NextRN_100() + NextRN_100()) / 2; ⋮ 92 return (threshold > average);
src/rng.c lines 89–93 at 04d1edb · upstream ↗ 1007 if (!(gBattleHitIterator->attributes & BATTLE_HIT_ATTR_SURESHOT)) { 1008 if (!BattleRoll2RN(gBattleStats.hitRate, TRUE)) { 1009 gBattleHitIterator->attributes |= BATTLE_HIT_ATTR_MISS;
src/bmbattle.c lines 1007–1011 at 04d1edb · upstream ↗ 879void BattleUpdateBattleStats(struct BattleUnit* attacker, struct BattleUnit* defender) { ⋮ 882 gBattleStats.hitRate = attacker->battleEffectiveHitRate;
src/bmbattle.c lines 879–882 at 04d1edb · upstream ↗ 260 PutNumberTwoChr(gUiTmScratchA + 0xA8 + 0x40, 2, gBattleActor.battleEffectiveHitRate);src/bksel.c line 260 at 04d1edb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^A damage spell always connects, for a random value from its power to ; 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 148Final 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.
- ^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.
- ^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.
Sources
Code
- nmikstas. 2023. “dragon-warrior-disassembly: NES Dragon Warrior software disassembly.” Commit ebe6a13. nmikstas/dragon-warrior-disassembly @ ebe6a13 · licence, all uses
- Disch. 2019. “Final Fantasy Disassembly.” Commit cbb87d3. BenWenger/FinalFantasyDisassembly @ cbb87d3 · licence, all uses
- pret contributors. 2026. “pokered: disassembly of Pokémon Red and Blue.” pret. Commit af51989. pret/pokered @ af51989 · licence, all uses
- pret contributors. 2026. “pokecrystal: disassembly of Pokémon Crystal.” pret. Commit 97187cd. pret/pokecrystal @ 97187cd · licence, all uses
- pret contributors. 2026. “pokeemerald: decompilation of Pokémon Emerald.” pret. Commit 731ad5b. pret/pokeemerald @ 731ad5b · licence, all uses
- FireEmblemUniverse contributors. 2026. “fireemblem8u: decompilation of Fire Emblem: The Sacred Stones.” FireEmblemUniverse. Commit 04d1edb. FireEmblemUniverse/fireemblem8u @ 04d1edb · licence, all uses
- Xeeynamo and ff7-decomp contributors. 2026. “ff7-decomp: a matching decompilation of Final Fantasy VII for the PlayStation (Xeeynamo/ff7-decomp).” Commit fc71ccc. Xeeynamo/ff7-decomp @ fc71ccc · licence, all uses
- everything8215. 2026. “Final Fantasy VI Disassembly.” Commit 8130132. everything8215/ff6 @ 8130132 · licence, all uses
- pret contributors. 2026. “pokeplatinum: decompilation of Pokémon Platinum.” pret. Commit 49f78f3. pret/pokeplatinum @ 49f78f3 · licence, all uses
- Nathan-R-Og. 2026. “dq2: Disassembly of NES Dragon Warrior II.” Commit 0fb64a4. Nathan-R-Og/dq2 @ 0fb64a4 · licence, all uses
- zeromus and CaH4e3. 2024. “DragonWarrior3: Dragon Warrior III Reverse Engineering & Reconstructing.” Commit b35d5fd. zeromus/DragonWarrior3 @ b35d5fd · licence, all uses
- n.d. “Dragon Warrior III (USA).” · licence, all uses
- everything8215. 2022. “Final Fantasy II (NES) disassembly and ROM info.” Commit 8d26190. everything8215/ff2 @ 8d26190 · licence, all uses
- everything8215. 2022. “Final Fantasy III (NES) disassembly and ROM info.” Commit 1acef81. everything8215/ff3 @ 1acef81 · licence, all uses
- everything8215. 2022. “Final Fantasy IV Disassembly.” Commit a360e2e. everything8215/ff4 @ a360e2e · licence, all uses
- everything8215. 2026. “Final Fantasy V Disassembly.” Commit 997c87d. everything8215/ff5 @ 997c87d · licence, all uses
- pret contributors. 2026. “pokeyellow: disassembly of Pokémon Yellow.” pret. Commit b6696f2. pret/pokeyellow @ b6696f2 · licence, all uses
- pret contributors. 2026. “pokegold: disassembly of Pokémon Gold and Silver.” pret. Commit fc702b6. pret/pokegold @ fc702b6 · licence, all uses
- pret contributors. 2026. “pokeruby: decompilation of Pokémon Ruby and Sapphire.” pret. Commit 5784633. pret/pokeruby @ 5784633 · licence, all uses
- pret contributors. 2026. “pokefirered: decompilation of Pokémon FireRed and LeafGreen.” pret. Commit ce6406d. pret/pokefirered @ ce6406d · licence, all uses
- Nathan-R-Og. 2026. “mother: Disassembly of Mother/Earthbound Zero/Earthbound Beginnings for the NES.” Commit e0b3e3f. Nathan-R-Og/mother @ e0b3e3f · licence, all uses
- Herringway. 2026. “ebsrc: Source code recreation for the game Earthbound.” Commit 68aec5c. Herringway/ebsrc @ 68aec5c · licence, all uses
- 1990. “Final Fantasy (USA).” · licence, all uses
- FireEmblemUniverse contributors. 2026. “fireemblem6j: decompilation of Fire Emblem: The Binding Blade.” FireEmblemUniverse. Commit e83dd39. FireEmblemUniverse/fireemblem6j @ e83dd39 · licence, all uses
Secondary
- Ryan8bit. 2011. “Dragon Warrior (NES) Formulas.” GameFAQs. v1.0. original · archived · licence, all uses
- Björk, Staffan. 2018. “Critical Hits.” Gameplay Design Patterns wiki (gdp3, Chalmers University of Technology). revision 26026. original · archived · licence, all uses
- Wikidata contributors. 2026. “Wikidata.” Wikimedia Foundation. original · licence, all uses