Understanding Catch Rates in Brilliant Diamond & Shining Pearl
Catching Pokémon in Pokémon Brilliant Diamond and Shining Pearl (BDSP) relies on a mathematical formula that considers the Pokémon's health, its inherent catch difficulty (Base Rate), the type of Poké Ball used, and any status conditions inflicted.
The Formula Mechanics
The core logic uses a "modified catch rate" (a). The higher this number, the more likely the capture. If a is 255 or higher, the catch is guaranteed. The formula calculates:
HP Factor: Lowering HP increases the catch rate. A Pokémon at 1 HP is roughly 3x easier to catch than one at full health.
Base Rate: Every species has a number from 1 to 255. Legendaries usually have 3 or 30, while common Pokémon have 255.
Multipliers:
Ball Bonus: Ultra Balls provide a 2x multiplier. Dusk Balls (in caves/night) provide 3.5x. Quick Balls (Turn 1) provide 5x.
Status Bonus: Sleep and Freeze multiply the rate by 2.5x. Paralyze, Poison, and Burn multiply it by 1.5x.
Common Base Catch Rates
Use these values in the "Base Catch Rate" field above:
Pokémon
Base Catch Rate
Difficulty
Caterpie, Starly, Bidoof
255
Very Easy
Chatot, Onix, Lucario
45 – 60
Medium
Dialga / Palkia
30
Hard
Mesprit, Azelf, Uxie
3
Very Hard
Heatran, Regigigas, Giratina
3
Very Hard
Cresselia (Roamer)
3
Very Hard
Tips for Catching Legendaries
For Pokémon with a Base Rate of 3 (like the Lake Guardians), the probability can be extremely low even at 1 HP. To maximize your odds:
False Swipe: Use the move False Swipe to safely reduce the target to exactly 1 HP.
Sleep: Use Hypnosis, Spore, or Yawn. This provides a massive 2.5x multiplier compared to 1.5x for Paralysis.
Dusk Balls: If you are in a cave or it is night time (after 8 PM), Dusk Balls (3.5x) are significantly better than Ultra Balls (2x).
Timer Balls: If the battle drags on for more than 10 turns, Timer Balls reach a 4x multiplier, surpassing Dusk Balls.
function calculateBDSPCatch() {
// Get Inputs
var maxHpInput = document.getElementById('maxHp');
var currHpInput = document.getElementById('currHp');
var rateInput = document.getElementById('speciesRate');
var ballSelect = document.getElementById('ballType');
var statusSelect = document.getElementById('statusCondition');
var maxHp = parseFloat(maxHpInput.value);
var currHp = parseFloat(currHpInput.value);
var baseRate = parseFloat(rateInput.value);
var ballBonus = parseFloat(ballSelect.value);
var statusBonus = parseFloat(statusSelect.value);
// Validation / Edge Cases
if (isNaN(maxHp) || maxHp <= 0) maxHp = 100;
if (isNaN(currHp) || currHp maxHp) {
currHp = maxHp;
// distinct visual cue implies logic correction, but we won't change input value to avoid annoyance
}
// Master Ball Check
if (ballBonus === 255) {
document.getElementById('finalProbability').innerHTML = "100%";
document.getElementById('shakeDetails').innerHTML = "Guaranteed Capture (Master Ball)";
return;
}
// 1. Calculate Modified Catch Rate (Gen 8 / BDSP Logic)
// Formula: a = floor(((3 * MaxHP – 2 * CurrHP) * 4096 * Rate * BallBonus) / (3 * MaxHP)) * StatusBonus / 4096
// Simplified float math is sufficient for display, but we emulate steps for accuracy
var numerator = (3 * maxHp) – (2 * currHp);
var denominator = 3 * maxHp;
// Basic 'a' value calculation
var a = (numerator / denominator) * baseRate * ballBonus * statusBonus;
var catchProb = 0;
var shakeCheck = 0;
// If 'a' >= 255, catch is guaranteed
if (a >= 255) {
catchProb = 100;
} else {
// 2. Calculate Shake Probability 'b'
// b = 1048560 / sqrt(sqrt(16711680 / a))
var b = 1048560 / Math.sqrt(Math.sqrt(16711680 / a));
// Probability of passing one shake check (0 to 65535)
var p_shake = b / 65536;
// Limit p_shake to 1 max
if (p_shake > 1) p_shake = 1;
// Total probability is passing 4 checks: p^4
catchProb = Math.pow(p_shake, 4) * 100;
// For shake text
shakeCheck = p_shake * 100;
}
// Formatting
var displayProb = catchProb.toFixed(2);
if (catchProb >= 100) displayProb = "100";
if (catchProb 0) displayProb = "= 100) {
shakeText = "Guaranteed Capture!";
} else {
shakeText = "Shake Check Success Rate: " + shakeCheck.toFixed(1) + "% (Must pass 4 times)";
}
document.getElementById('shakeDetails').innerHTML = shakeText;
}
// Initialize on load
calculateBDSPCatch();