Catch rate glitches (Generation II)

From Glitch City Wiki
Revision as of 00:17, 28 February 2019 by >Sherkel (Created page with "In {{GSC}}, if the opposing Pokémon's catch rate is not affected if it is burned, poisoned, or paralyzed, despite those conditions increasing catch rate in other generations...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

In Pokémon Gold, Silver and Crystal, if the opposing Pokémon's catch rate is not affected if it is burned, poisoned, or paralyzed, despite those conditions increasing catch rate in other generations and the code seeming to attempt to factor them in. Sleep and freeze still affect the catch rate as intended.

Explanation

The code for factoring status conditions into catch rate reads as follows:

       ld b, a
       ld a, [WildPokemonStatus]
       and SLP|FRZ
       ld c, 10
       jr nz, .done
       and a
       ld c, 5
       jr nz, .done
       ld c, 0
       .done

What the code does is set a value increasing catch rate to 10 if the opponent is asleep or frozen, and do nothing otherwise. The "and a" is presumably intended to read from WildPokemonStatus and set the value to 5 if there is a different status condition; however, the "jr nz" preceding it prevents this from being able to occur, as WildPokemonStatus will not be 0.

A simple fix would be modifying the code to the following:

       ld b, a
       ld a, [WildPokemonStatus]
       and a
       ld c, 0
       jr z, .done
       and SLP|FRZ
       ld c, 10
       jr nz, .done
       ld c, 5
       .done

This would instead jump to ".done" if c was 0, indicating no status condition present, and instead set it to 5 if the opponent was inflicted by a status condition that was not sleep or freeze.

Attriution