In Pokémon Gold, Silver and Crystal, many "special" kinds of Poké Balls are introduced that affects the catch rate in various ways. Due to the probabilistic nature of the catch rate, glitches that affect its value are very difficult to catch. Listed below are the known catch rate glitches in Pokémon Gold, Silver and Crystal.
In Pokémon Gold, Silver and Crystal, a wild 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.
The code for factoring status conditions into catch rate reads as follows:
ld b, a
ld a, [WildPokemonStatus]
ld c, 10
jr nz, .done
; ld a, [wEnemyMonStatus] ; bugfix
ld c, 5
jr nz, .done
ld c, 0
What the code does is set a value increasing catch rate (referred to as "a" in Bulbapedia's explanation, linked below) to 10 if the opponent is asleep or frozen, and do nothing otherwise. The next few lines are presumably intended to set the value to 5 if there is a different status condition present; however, since the value of register
a is already
WildPokemonStatus & (SLP|FRZ), the second
jr nz, .done is never taken, and the value is set to 0 anyway.
Inserting the commented line would fix this glitch.
In Pokémon Gold, Silver and Crystal, the Moon Ball is supposed to boost the catch rate of a Pokémon that evolves with Moon Stone, but it checks a Pokémon that evolves with Burn Heal instead. Since such a Pokémon does not exist, Moon Ball never boosts the catch rate in Generation II.
The cause of this glitch is simply a erroneous constant: The hex value 0x0A, while corresponding to Moon Stone in Generation I, corresponds to Burn Heal in Generation II instead.
In Pokémon Gold, Silver and Crystal, the Love Ball boosts the catch rate if the target Pokémon is of the same species, and the same gender (except genderless) as the player's Pokémon, despite the in-game description ("For catching the opposite gender"). In all other generations, it boosts the catch rate if the target Pokémon is of the same species, but the opposite gender.
The cause of this glitch is likely to be a simple typo.
In Pokémon Gold, Silver and Crystal, the Fast Ball is supposed to boost the catch rate of a Pokémon that can flee. However, it only does this for three of those Pokémon: Magnemite, Grimer, and Tangela.
The table of Pokémon that can flee is actually three lists,
AlwaysFleeMons. The three lists are contiguous in ROM, each terminated with a 0xFF terminator.
The code to calculate the catch rate multiplier of the Fast Ball tries to iterate through this table by keeping a temporary variable
d that is initialized to 3, and decreased by 1 each time an 0xFF terminator is found. However, due to an erroneous jump target, the value of
d is also decreased whenever a valid entry in the table does not match the species of the target Pokémon. Therefore, instead of iterating over three lists, it only iterates over the first three entries, which are Magnemite, Grimer, and Tangela.
- IIMarckus for discovery and PikalaxALT for the corrected code, in addition to everyone who helped with pokegold and pokecrystal.