Focus Energy glitch

From Glitch City Wiki
Jump to navigation Jump to search
Miscellaneous glitches of Pokémon Red and Blue and Pokémon Yellow

Amazing Man (Red and Blue only) | Cable Club escape glitch | Celadon looping map trick | Champion Blue music muting glitch | Coastal Flooding | Confusion and Substitute glitch | Cooltrainer move | Cycling based glitch maps | Escape sprite handling glitch | Evolve without an evolutionary stone (Red and Blue only) | Evolving Raichu (Red and Blue only) | Expanded item pack | Expanded Pokédex | Focus Energy glitch | Get stuck in a wall | Ghost Bicycle glitch | Glitch encounter system | Glitch City RAM Manipulation | Infinite Blaine Door | Introduction Nidorino glitch (Red and Blue only) | Invisible PCs (Red and Blue only) | Invisible tree glitch | Item stack duplication glitch | Mute the music in the Pokémon League | Partial trapping move link battle glitch | Pokémon Tower Pokédex glitch | PP underflow glitches | Recovery move glitch | Rival's effect | See a Ghost without a Silph Scope | Selfdestruct and Substitute glitch | Silph Co. PC Glitch | Slot machine glitch | Stand on a tree | Statue behavior glitch (Red and Blue only) | Super effective move AI flaw (Red and Blue only) | Super Glitch | Surf down glitch | Swift miss glitch | Transform assumption glitch | Transform Empty Move Glitch | Trick Zone | Vending machine purchase glitch | Walk around with only fainted Pokémon (Red and Blue only) | Walking lag glitch | Walk on water through Surf | Walking Pikachu happiness glitch (Yellow only) | Wild appeared! | ZZAZZ Glitch

(view, talk, edit)
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.

Analysis

The relevant block of code for Focus Energy's effect is this[1], 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.

Ambiguity

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 / 512 without Focus Energy, and BaseSpeed / 128 with Focus Energy; or
  • BaseSpeed / 2048 without Focus Energy, and BaseSpeed / 512 with 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 "flatter" 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.

References