Gen II Capture Mechanics

Thanks to Ultimate Pokémon Center for the original analysis and getting me curious about things, iimarckus for indulging my curiosity for clarifications, and magical for being interested, giving second opinions and determining how the game behaves when it divides by zero.

Although the original G/S/C don't see much play nowadays, the capture mechanics of the second generation are still of some interest - not only to geeks like me, but also simply as a historical stepping stone between the R/B/Y algorithm and the more refined formulas of the later games.

If you don't care about the math, I also have a G/S/C catch rate calculator that you can use to just calculate your chances of capturing a Pokémon in G/S/C.

Please note that the Pokémon games prior to the fifth generation only work with integers. In practice, this essentially means that they round all numbers down, including at every intermediate step in a calculation. This will usually not be specifically included in the mathematical formulas on this page, but whenever you perform any action within a particular formula that results in a non-integer, you should round it down before performing the next action in the formula if you want to get a perfect result.

The Catch Rate Formula

G/S/C paved the way for the later games by replacing R/B/Y's fairly intricate algorithm with a more straightforward calculation: first, the game derives a final capture rate by plugging some variables into a set mathematical formula, and then the final capture rate is used to determine whether the capture will be successful. The formula for the final capture rate in the second-generation games bears a clear resemblance to the third- and fourth-generation formula:

`X = max(((3M - 2H) * C) / (3M), 1) + S`

The final capture rate X can range from 1 to 255 (if it's higher than 255 at the end of the calculation, it is made 255 instead). In G/S/C, the chance of a successful capture is then simply (X + 1)/256, meaning an X of 255 automatically yields a guaranteed capture.

The variables plugged into the formula are based on the Pokémon's hit points (M and H), catch rate (C) and status condition if any (S), where the C value may also be modified by the kind of ball you are using. I will cover each of these in turn.

M (Maximum HP) and H (Current HP)

As the formula is intended, these values are very straightforward: they are simply the maximum and current HP of the Pokémon you are trying to catch. When the Pokémon is at full health, the formula will roughly simplify to max(C / 3, 1) + S, and as you whittle down its HP, the value will rise linearly towards a theoretical limit of max(C, 1) + S (the Pokémon would need to be at 0 HP to reach the limit, but the lower its current HP, the closer it gets). Thus, by lowering the Pokémon's HP you can nearly triple your chances of capturing it, assuming it does not have a status condition.

But there is a slight snag here. The Game Boy was a rather limited system, and the division routines used by the first- and second-generation Pokémon games can only divide by 8-bit numbers (integers between 0 and 255 inclusive). However, the capture formula needs to divide by 3M, which can easily be considerably more than 255. In order to get around this, if 3M is greater than 255, then 3M and 2H are both divided by four and rounded down before being plugged into the formula (this will give basically the same result bar rounding errors, since the division is happening both above and below the line). For all legitimate wild Pokémon encounters in the game, this is sufficient to make the formula work as intended.

However, if 3M were to be greater than 255 even after the division by four (that is, if the Pokémon's maximum HP were more than 341), some very strange things would start to happen:

The game would act (for the purposes of the capture formula) as if the Pokémon's maximum HP were much lower than it is. It only plugs the low eight bits of the divided 3M into the formula, or essentially the remainder if you divided it by 256. For example, if the Pokémon had 343 maximum HP, then 3M would be 1029, which would be divided by four to get 257. This would be represented in binary form as 100000001, but only the last eight bits - 00000001, or just 1 - would be plugged into the formula where 3M should be. This is called a truncation.

It only plugs the low eight bits of the divided 3M into the formula, or essentially the remainder if you divided it by 256. For example, if the Pokémon had 343 maximum HP, then 3M would be 1029, which would be divided by four to get 257. This would be represented in binary form as 100000001, but only the last eight bits - 00000001, or just 1 - would be plugged into the formula where 3M should be. This is called a truncation. If you were to try to capture a Pokémon with exactly 342 or 683 max HP, the game would freeze. This is because for these HP values, 3M divided by four is evenly divisible by 256, which means a zero would get plugged into the formula where 3M should be. Because the formula then tries to divide by 3M, and the division routine used by the game has no checks or safeguards in case of a divisor of zero, it would simply go into an infinite loop until you reset the game. Whoops.

This is because for these HP values, 3M divided by four is evenly divisible by 256, which means a zero would get plugged into the formula where 3M should be. Because the formula then tries to divide by 3M, and the division routine used by the game has no checks or safeguards in case of a divisor of zero, it would simply go into an infinite loop until you reset the game. Whoops. The final capture rate could be ridiculously inflated if 3M were greater than 255 after the division by four but 2H weren't. Since 3M could be truncated to some extremely low value, the result of 3M - 2H would actually be negative. However, the game treats all variables as unsigned, meaning there is no such thing as a negative number - a subtraction will essentially simply start to count down from 256 once it passes zero. (3 - 5, for instance, would become 254.) This is called an underflow. Normally, ((3M - 2H) * C) / 3M should result in a value less than C, but if the subtraction underflowed, this limitation would be thrown out of the window.

Since 3M could be truncated to some extremely low value, the result of 3M - 2H would actually be negative. However, the game treats all variables as unsigned, meaning there is no such thing as a negative number - a subtraction will essentially simply start to count down from 256 once it passes zero. (3 - 5, for instance, would become 254.) This is called an underflow. Normally, ((3M - 2H) * C) / 3M should result in a value less than C, but if the subtraction underflowed, this limitation would be thrown out of the window. Under the conditions in the above point, the final capture rate would cycle around bizarrely as the Pokémon's HP was lowered. This is because of yet another truncation: all but the last eight bits of the outcome of ((3M - 2H) * C) / 3M are thrown away before the maximum is applied. Normally this makes sense because this value should be lower than C, which can at most be 255, but if the subtraction were to underflow, this wouldn't necessarily be the case anymore, and the capture rate would rise at a rate of C / 3M for every two hit points of damage you dealt to the Pokémon, wrapping around to zero whenever it passed 255.

Again, all that weird, glitchy stuff can't happen on an actual game played as the creators intended it - the highest HP any legal encounter can have is 249 for the level 70 Lugia and Ho-Oh in Gold and Silver respectively. It could, however, happen with hacking, and if you play around with impossible encounters on the catch rate calculator, you might run into all the various wonkiness described above (which I've faithfully reproduced in the calculator). Be prepared.

C (Modified Capture Rate)

This number starts out as the intrinsic capture rate of the Pokémon you're trying to catch. This is a number that is set for every Pokémon species, ranges from 3 to 255 and can be found in most online Pokédexes; all first- and second-generation catch rates have been unchanged since G/S/C except Raticate's, which was 90 in G/S/C but was changed to 127 in Ruby and Sapphire. A higher catch rate means a better chance of capturing the Pokémon.

In the second-generation games, the Pokéball used will directly modify this value before it is plugged into the formula above. If we call the original capture rate of the Pokémon R, the C value will be set as follows, depending on the ball used:

Poké Ball, Friend Ball C = R Great Ball, Park Ball C = R * 1.5 Ultra Ball C = R * 2 Master Ball The formula isn't used; the capture automatically succeeds Fast Ball C = R * 4 if the Pokémon is Grimer, Tangela or Magnemite (they are only the first three of many Pokémon that may flee from battle in the games, but they're the only ones affected by the Fast Ball); C = R otherwise Heavy Ball C = R + 40 if the Pokémon weighs at least 409.6 kilograms (903.0 lbs); otherwise, R + 30 if the Pokémon weighs at least 307.2 kilograms (677.3 lbs); otherwise, C = R + 20 if the Pokémon weighs at least 204.8 kilograms (451.5 lbs); otherwise, C = R if the Pokémon weighs at least 102.4 kilograms (225.8 lbs); otherwise, C = R - 20 Level Ball C = R * 8 if your Pokémon's level divided by four and rounded down is greater than the Pokémon's level; otherwise C = R * 4 if your Pokémon's level divided by two and rounded down is greater than the Pokémon's level; otherwise C = R * 2 if your Pokémon's level is greater than the Pokémon's; otherwise C = R Love Ball C = R * 8 if the Pokémon is of the same species as your Pokémon and they are either both male or both female (that is not a typo: the Love Ball in G/S/C gives a bonus only if the Pokémon are of the same gender); C = R otherwise Lure Ball C = R * 3 when fishing; C = R otherwise Moon Ball C = R * 4 if the Pokémon can evolve with a Burn Heal; C = R otherwise (obviously, this was meant to check if the Pokémon can evolve with a Moon Stone, not a Burn Heal, but it's buggy like so much else in this formula, so effectively the Moon Ball is just a glorified Poké Ball)

If C is greater than 255 after the appropriate ball modifier has been applied, it will be made 255 instead, and if C is less than zero, it will be bumped up to 1. This means that if the Pokémon you are trying to catch already has an intrinsic catch rate of 255 (this includes common early-game Pokémon such as Caterpie or Pidgey), then using a better Pokéball will not actually improve your chances of catching it at all; in fact, it is impossible for ball bonuses, however great, to make a Pokémon easier to catch than a Caterpie or Pidgey would be in a regular Poké Ball. Moreover, this also means there is no such thing as a guaranteed capture without a status condition in G/S/C, barring the impossible-in-game case where the subtraction in the formula underflows as discussed above: even when C is 255, the division by 3M will always ultimately result in a lower value than that.

The Heavy Ball is unusual in that it adds to (or subtracts from) the capture rate rather than multiplying it. This means that in theory it vastly outperforms all other balls for Pokémon with extremely low intrinsic catch rates, provided they're heavy enough to get a bonus from it, but isn't that useful for Pokémon with higher intrinsic catch rates even if they're very heavy; it can even make things worse against Pokémon that are relatively light. In practice, given the weights and catch rates of all the Pokémon available in G/S/C, the Heavy Ball is great for catching Lugia (+20 Heavy Ball bonus but an intrinsic catch rate of 3, effectively giving a boost of 7.67x), significantly better than an Ultra Ball for Snorlax (+40 bonus to an intrinsic catch rate of 25, or 2.6x) but only a little better than an Ultra Ball for Steelix (+30 Heavy Ball bonus to an intrinsic catch rate of 25, or 2.2x), slightly worse than an Ultra Ball for Mantine (+20 Heavy Ball bonus, intrinsic catch rate of 25, or 1.8x), worse than a Great Ball for all the other Pokémon heavy enough to get a +20 bonus (Golem, Onix, Gyarados, Lapras and Dragonite, which all have an intrinsic catch rate of 45, so the Heavy Ball is effectively 1.44x), and no better than a Poké Ball or even worse for all other Pokémon.

S (Status)

This is one area where the G/S/C capture formula takes after R/B/Y: the status factor is added to the final capture rate rather than being a multiplier like in the later games. This means that, like in R/B/Y, status has a more significant effect on your chances of capturing a Pokémon with a low catch rate than one with a high catch rate.

The S value is supposed to be 5 if the Pokémon is poisoned, burned or paralyzed, 10 if the Pokémon is asleep or frozen, and 0 if it has no status, but due to a bug (yes, this formula is astoundingly buggy), only sleep and freezing actually affect this value; the subsequent check that's supposed to be for poisoning, burning and paralysis always fails. So in fact, the S value is 10 if the Pokémon is asleep or frozen and 0 otherwise. Making a Pokémon poisoned, burned or paralyzed does not improve your chances of catching it at all.

Thus, the Pokémon being asleep or frozen adds a flat 10/256 = ~3.91% extra chance of catching it. Unfortunately, this is a whole lot less significant than in R/B/Y (where, with an Ultra Ball, sleep or freezing would add a flat 16.56%), to the point of only really being worth it for Pokémon with extremely low catch rates.

Wobbles

As previously noted, the final capture rate X straightforwardly represents the actual chance of catching the Pokémon: after it has been calculated, a random number between 0 and 255 is generated, and if it is less than or equal to X, the Pokémon is caught.

If the Pokémon is not caught, however, the game will decide how often the ball should wobble on the screen before breaking. Unlike R/B/Y's static calculation, G/S/C introduce a random factor into the wobbling for more tension and variety. First, a Y value is determined from X according to the following table:

X Y 0-1 63 2 75 3 84 4 90 5 95 6-7 103 8-10 113 11-15 126 16-20 134 21-30 149 31-40 160 41-50 169 51-60 177 61-80 191 81-100 201 101-120 211 121-140 220 141-160 227 161-180 234 181-200 240 201-220 246 221-240 251 241-254 253 255 255

The table looks pretty mysterious - where do those seemingly random Y values come from? - but in fact, Y is pretty close to being 64 times the fourth root of the highest value in each X interval, and the table was likely calculated from some similar function to that originally (the table is precalculated, though, so the game only looks up the value in the table rather than calculating anything).

Once Y has been determined, the game calculates up to three random numbers between 0 and 255 (inclusive), each representing an attempt by the Pokémon to break out. For each random number, if it is greater than or equal to Y, the Pokémon will break out and no further numbers will be generated; otherwise, if it is less than Y, that corresponds to one wobble of the ball before the Pokémon tries to break out again. (If none of these three attempts succeed, the Pokémon automatically breaks out after the last attempt anyway, since at this point we've already determined that we don't manage to catch the Pokémon.)

In other words, if you see the ball pop open without wobbling at all ("Oh no! The POKéMON broke free!"), the first random number was greater than or equal to Y; if it wobbles once and then opens ("Aww! It appeared to be caught!"), the first was less than Y but the second was greater than or equal to it; if it wobbles twice before opening ("Aargh! Almost had it!"), the first two were less than Y but the third was greater than or equal to it; and if it wobbles three times ("Shoot! It was so close, too!"), all three numbers were less than Y.

Catch Rate Calculator

The G/S/C catch rate calculator now has its own page. Go there to easily calculate your chances of catching a Pokémon in the second-generation games.

Page last modified April 8 2018 at 18:50 GMT