Catching Pokemon in Gen 9 (Scarlet and Violet) relies on a mathematical formula that considers the Pokemon's species rarity, its remaining health, the type of ball used, and any status conditions inflicted. This calculator uses the standard Generation 9 capture formula to estimate your success rate.
The Capture Formula
The game calculates a "Modified Catch Rate" ($X$) based on the following factors:
Max HP vs Current HP: Lowering a Pokemon's health increases the catch rate. A Pokemon at 1 HP is significantly easier to catch than one at full health.
Species Rate: Every Pokemon has a base catch rate from 1 to 255. Pidgey (255) is easy, while Koraidon/Miraidon (3) are difficult.
Ball Multiplier: Using better balls multiplies your odds. An Ultra Ball (2x) is twice as effective as a Poké Ball (1x).
Status Multiplier: Sleep and Freeze provide the highest bonus (2.5x), while Paralyze, Poison, and Burn provide a smaller bonus (1.5x).
Common Species Catch Rates
Use these values in the "Species Catch Rate" input field above:
Pokemon Type
Example Pokemon
Catch Rate
Common / Early Game
Lechonk, Pawmi, Magikarp
255
Uncommon
Pikachu, Eevee, Ralts
190 – 200
Evolved Forms
Lucario, Garchomp, Tyranitar
45 – 90
Starters
Sprigatito, Fuecoco, Quaxly
45
Legendaries / Paradox
Koraidon, Miraidon, Ruin Legends
3 – 10
Tips for Increasing Catch Rates
False Swipe is King: Use the move False Swipe to lower the target's HP to exactly 1 without knocking it out. This maximizes the HP multiplier.
Put them to Sleep: Since Sleep gives a 2.5x multiplier compared to Paralysis (1.5x), moves like Spore or Hypnosis are superior for catching difficult Pokemon.
Dusk Balls: If you are playing at night or inside a cave (like Area Zero), Dusk Balls provide a 3.0x multiplier, which is better than an Ultra Ball (2.0x).
Critical Captures: The more Pokemon you have registered in your Pokedex, the higher your chance of a "Critical Capture," which bypasses three of the four shake checks, significantly increasing success rates.
Sandwich Powers
In Pokemon Scarlet and Violet, you can make sandwiches that grant "Catching Power." This power applies an additional multiplier to your catch rate depending on the type of Pokemon and the level of the power (Lv. 1, 2, or 3). If you are struggling with a Legendary, consider eating a sandwich with Catching Power corresponding to its type.
function updateHPDisplay(val) {
document.getElementById('hpValueText').innerText = val + '%';
var hpFill = document.getElementById('hpFill');
hpFill.style.width = val + '%';
// Change color based on HP
if (val > 50) {
hpFill.style.backgroundColor = '#4CAF50'; // Green
} else if (val > 20) {
hpFill.style.backgroundColor = '#FFC107'; // Yellow
} else {
hpFill.style.backgroundColor = '#F44336'; // Red
}
}
function calculateCatchRate() {
// 1. Get Inputs
var speciesRateInput = document.getElementById('speciesRate');
var hpPercentInput = document.getElementById('hpPercent');
var ballTypeSelect = document.getElementById('ballType');
var statusSelect = document.getElementById('statusCondition');
var speciesRate = parseFloat(speciesRateInput.value);
var hpPercent = parseFloat(hpPercentInput.value);
var ballBonus = parseFloat(ballTypeSelect.value);
var statusBonus = parseFloat(statusSelect.value);
// Validation
if (isNaN(speciesRate) || speciesRate 255) speciesRate = 255;
if (isNaN(hpPercent)) hpPercent = 100;
// Master Ball Check (Value in select doesn't mathematically matter, logic override)
var selectText = ballTypeSelect.options[ballTypeSelect.selectedIndex].text;
if (selectText.includes("Master Ball")) {
displayResult(100, 1, "Automatic");
return;
}
// 2. The Math (Gen 9 Approximation)
// Formula: X = ((3 * HPmax – 2 * HPcurrent) / (3 * HPmax)) * Rate * BallMod * StatusMod
// Since HPcurrent = HPmax * (percent/100), HPmax cancels out.
// Simplified Factor: (3 – 2 * (percent/100)) / 3
var hpFactor = (3 – (2 * (hpPercent / 100))) / 3;
// Calculate Modified Catch Rate (X)
var modifiedRate = Math.floor(speciesRate * ballBonus * statusBonus * hpFactor);
// 3. Shake Checks
var probability = 0;
var b = 0; // Shake probability threshold
if (modifiedRate >= 255) {
probability = 1; // 100%
b = 65536;
} else {
// Calculate 'b' – The shake threshold
// b = 1048560 / sqrt(sqrt(16711680 / modifiedRate))
// Note: Game uses integer math, but float is close enough for web calc
var x = 16711680 / modifiedRate;
var sqrtX = Math.sqrt(x);
var quartX = Math.sqrt(sqrtX);
b = Math.floor(1048560 / quartX);
// The game performs 4 random checks against 'b' range (0-65535)
// Probability of one check passing = b / 65536
// Probability of all 4 passing = (b / 65536) ^ 4
var pSingle = b / 65536;
probability = Math.pow(pSingle, 4);
}
// 4. Formatting Results
var percentage = probability * 100;
// Cap at 100%
if (percentage > 100) percentage = 100;
// Expected balls = 1 / probability
var expected = 0;
if (percentage === 0) {
expected = "∞";
} else {
expected = (1 / probability).toFixed(1);
if (expected < 1) expected = 1;
}
// Display
displayResult(percentage, expected, b);
}
function displayResult(percentage, expected, shakeVal) {
var resultDiv = document.getElementById('result');
var chanceText = document.getElementById('captureChance');
var ballsText = document.getElementById('expectedBalls');
var shakeText = document.getElementById('shakeCheck');
resultDiv.style.display = 'block';
chanceText.innerText = percentage.toFixed(2) + "%";
ballsText.innerText = expected;
shakeText.innerText = shakeVal + " / 65536";
}