Focus Energy glitch
|PRAMA Initiative a également une page sur Focus Energy glitch.|
The Focus Energy glitch is a glitch in Pokémon Red, Blue, and Yellow that causes the move Focus Energy to decrease (more precisely, quarter) the user's critical hit rate instead of increasing it, like the move does in all other versions of the game.
A remarkable side effect of this glitch is that it is difficult to tell which critical hit rate is the originally intended base critical hit rate in Generation I, because Pokémon Stadium uses a different critical hit rate formula, and since Generation II the base critical hit rate has become constant.
The relevant block of code for Focus Energy's effect is this, beginning at offset 3E055 in Pokémon Red and Blue (view 0F:6055 in a debugger). Thanks Wack0 for walking through this.
bit 2, a ; test for focus energy jr nz, .focusEnergyUsed sla b ; b=b*2 jr nc, .noFocusEnergyUsed ; if b was below 128, skip... ld b, $ff ; a cap at 255/256 jr .noFocusEnergyUsed .focusEnergyUsed srl b ; whoops! b=b/2, and if you look, the jump to here is before the b=b*2, so b is effectively 1/4 of what it should be .noFocusEnergyUsed ; no cap at 255/256 for focus energy. I wonder if, if done properly, this would have caused bugs related to integer wraparound... ; ... (check for high critical hit move here)
The relative jump to '.focusEnergyUsed' that happens when Focus Energy is used makes the game skip a 'sla b' (double b), and then a 'srl b' (half b) at '.focusEnergyUsed' halves the value in register 'b'.
If Focus Energy is not used, the value in 'b' is doubled and if it was used, the value in 'b' is halved. 2.0/0.5=4.0, meaning critical hits land four times less likely.
Due to this glitch, the critical hit rate of a Pokémon that has used Focus Energy is
BaseSpeed / 2048, lower than the critical rate of a Pokémon that has not used Focus Energy,
BaseSpeed / 512. However, it is unclear whether the intended critical hit rates are:
BaseSpeed / 512without Focus Energy, and
BaseSpeed / 128with Focus Energy; or
BaseSpeed / 2048without Focus Energy, and
BaseSpeed / 512with Focus Energy.
The first theory is more intuitive because it means that this glitch only affects Pokémon that has used Focus Energy, which means that it would be less likely to notice. Furthermore, the developers of the game may have written this piece of code first, then balanced the game around the perceived base critical hit rate later.
However, as alluded to by Wack0's comments above, there is no really easy way to fix the above code to fit the first theory: The value in 'b' would need to be shifted left three times so that it is multiplied by 8, compared to 2 in the normal case, and care must be taken to prevent overflow. On the other hand, in order to fit the second theory, the "jr nz, .focusEnergyUsed" simply needs to be changed to "jr z, .focusEnergyUsed" (notice that the names of labels are added by people documenting the assembly according to functionality, and do not reflect anything official).
Pokémon Stadium changed the critical hit rate formula to a "flater" formula affected less by the base speed:
(BaseSpeed + 76) / 1024 without Focus Energy and
(BaseSpeed + 236) / 512 with Focus Energy. While the resulting values are closer to what would be predicted by the first theory, the divisors seem closer to the second theory. Generation II changed the base critical hit rate again to a flat value of 1/16, which would be equivalent to a very slow (base speed 32, slightly faster than Snorlax) Pokémon in the first theory, and a very fast (base speed 128, slightly slower than Jolteon) in the second theory, so again, it could go either way.