None
Asleep or Frozen
Paralyzed, Burned, or Poisoned
Catch Probability: 0%
How Catch Rates Work in Generation 1
The mechanics of Pokemon Red, Blue, and Yellow are notoriously complex and often counter-intuitive. Unlike later generations, Gen 1 uses a series of checks that prioritize status effects and specific ball modifiers before even looking at the Pokemon's current HP.
The Great Ball Quirk
In Gen 1, the Great Ball is often mathematically superior to the Ultra Ball for certain Pokemon. This is because the Great Ball uses a specific constant (200) in the denominator of the HP factor, whereas the Ultra Ball uses 150. For Pokemon with high catch rates, the Great Ball provides a significantly better modifier relative to its cost.
Status Effects: The Most Important Factor
Status conditions are the single most effective way to catch legendary Pokemon like Articuno, Zapdos, Moltres, and Mewtwo. Gen 1 applies a "Status Check" at the very beginning of the calculation:
Sleep and Freeze: Adds a flat ~10% (25/256) chance to catch regardless of HP.
Paralyze, Burn, and Poison: Adds a flat ~4.7% (12/256) chance.
Example Catch Scenarios
Pokemon
HP %
Ball
Status
Catch Chance
Mewtwo (Rate 3)
10%
Ultra Ball
Sleep
~14.5%
Snorlax (Rate 25)
25%
Great Ball
None
~12.8%
Pidgey (Rate 255)
100%
Poke Ball
None
~100%
Calculation Steps
Step 1: Check Status. If a random number (0-255) is less than the Status Value (25 for Sleep, 12 for others), the Pokemon is caught instantly.
Step 2: Calculate HP Factor. $f = (MaxHP \times 255) / (\text{BallModifier})$, then $f = f / (CurrentHP / 4)$. If $f > 255$, it is capped at 255.
Step 3: Compare the Pokemon's Base Catch Rate with a random number. If $CatchRate > Random(0, 255)$, proceed to the final check involving the HP factor.
function calculateGen1Catch() {
var baseRate = parseInt(document.getElementById('pokemonCatchRate').value);
var ballVal = parseInt(document.getElementById('ballType').value);
var statusVal = parseInt(document.getElementById('statusEffect').value);
var maxHP = parseInt(document.getElementById('maxHP').value);
var currentHP = parseInt(document.getElementById('currentHP').value);
var resultDiv = document.getElementById('pg1Result');
var percentText = document.getElementById('pg1Percent');
var descText = document.getElementById('pg1Description');
if (isNaN(baseRate) || isNaN(maxHP) || isNaN(currentHP) || currentHP <= 0 || maxHP maxHP) currentHP = maxHP;
// Master Ball Check
if (ballVal === 0) {
resultDiv.style.display = "block";
percentText.innerHTML = "Catch Probability: 100%";
descText.innerHTML = "The Master Ball never fails in Gen 1 (unless it's the Ghost Marowak)!";
return;
}
// Gen 1 Catch Logic
// Step 1: Status Probability
var probStatus = statusVal / 256;
// Step 2: HP Factor (f)
// f = (MaxHP * 255 / BallFactor) / (CurrentHP / 4)
var ballFactor = ballVal;
var f = Math.floor((maxHP * 255) / ballFactor);
f = Math.floor(f / Math.max(1, Math.floor(currentHP / 4)));
if (f > 255) f = 255;
// Step 3: Probability of passing the Capture Check
// Prob = StatusProb + (1 – StatusProb) * (min(Rate+1, f+1) / 256)
var checkVal = Math.min(baseRate + 1, f + 1);
var probCapture = checkVal / 256;
var finalProb = probStatus + (1 – probStatus) * probCapture;
var finalPercent = (finalProb * 100).toFixed(2);
if (finalPercent > 100) finalPercent = 100;
if (finalPercent < 0) finalPercent = 0;
resultDiv.style.display = "block";
percentText.innerHTML = "Catch Probability: " + finalPercent + "%";
var averageBalls = Math.ceil(100 / finalPercent);
if (finalPercent == 0) averageBalls = "∞";
descText.innerHTML = "On average, it will take " + averageBalls + " " + document.getElementById('ballType').options[document.getElementById('ballType').selectedIndex].text + "(s) to catch this Pokemon under these conditions.";
}