Understanding Pokémon Ultra Sun & Ultra Moon Capture Mechanics
Catching Pokémon in Ultra Sun and Ultra Moon (USUM) involves a complex mathematical formula that determines whether a thrown Poké Ball will successfully contain a wild Pokémon. Unlike simpler luck-based systems, Gen 7 mechanics allow players to significantly manipulate the odds through strategy, item usage, and status effects.
The Gen 7 Capture Formula
The "Modified Catch Rate" determines your success. The game calculates a value based on several factors:
HP Factor: This is the most critical variable. A Pokémon at 1 HP is significantly easier to catch than one at full health. The formula compares Current HP to Maximum HP.
Base Catch Rate: Every species has a fixed rate ranging from 3 (hardest, e.g., Necrozma, Tapu Koko) to 255 (easiest, e.g., Pikipek, Yungoos).
Ball Multiplier: Different balls apply different multipliers. While an Ultra Ball provides a standard x2 multiplier, specialized balls like the Beast Ball offer a x5 multiplier against Ultra Beasts but a penalty (x0.1) against standard Pokémon.
Status Bonus: Status conditions are vital for tough catches. Putting a Pokémon to Sleep or freezing it applies a massive x2.5 multiplier, whereas Paralysis, Poison, and Burn offer a x1.5 boost.
Optimizing for Ultra Beasts
In Ultra Sun and Ultra Moon, catching Ultra Beasts (UBs) like Nihilego or Stakataka is a core gameplay element. When hunting UBs:
Use Beast Balls: These are specifically designed for UBs, offering a x5 catch rate multiplier.
Avoid Standard Balls on UBs: A regular Poké Ball is much less effective unless the UB is weakened significantly.
False Swipe: This move is essential as it leaves the target with exactly 1 HP, maximizing the HP factor in the capture formula.
Rotom Powers
USUM introduced the Rotom Dex, which can provide "Roto Powers." The Roto Catch power increases your catch rate multiplier, stacking with ball types and status conditions. This is extremely useful for legendary encounters where the base catch rate is as low as 3.
';
return;
}
// Check for Master Ball logic
// Master Ball is usually value 255 or effectively infinite, we treated it as 1 in value but we handle it specifically here
var ballSelect = document.getElementById('ballType');
var selectedText = ballSelect.options[ballSelect.selectedIndex].text;
if (selectedText.includes("Master Ball")) {
resultDiv.style.display = 'block';
resultDiv.innerHTML = `
100.00%
Master Ball guarantees capture!
`;
return;
}
// Gen 7 Catch Formula Calculation
// 1. Modified Catch Rate (X)
// X = ( ( ( 3 * MaxHP – 2 * CurrentHP ) * (Rate * BallMod) ) / (3 * MaxHP) ) * StatusMod
// Apply Roto Catch to the Ball Mod or Status Mod depending on interpretation,
// usually stacks as a multiplier to the capture likelihood.
// In USUM, Roto Catch boosts the capture power. Let's apply it to the modifier stack.
var hpFactorNumerator = (3 * maxHP) – (2 * currentHP);
var hpFactorDenominator = (3 * maxHP);
// Avoid division by zero
if (hpFactorDenominator === 0) hpFactorDenominator = 1;
var modifiedRate = speciesRate;
// Apply modifiers
var X_numerator = hpFactorNumerator * modifiedRate * ballMult * rotoMult;
var X = (X_numerator / hpFactorDenominator) * statusMult;
X = Math.floor(X); // Game usually floors values
var catchProbability = 0;
var shakeCheck = 0;
// If X >= 255, catch is guaranteed
if (X >= 255) {
catchProbability = 100;
} else {
// Shake Probability Calculation (Gen 7)
// Y = floor( 65536 / ( (255 / X) ^ 0.1875 ) )
// Note: 0.1875 is 3/16
if (X < 1) X = 1; // Safety minimum
var power = 0.1875;
var innerTerm = 255 / X;
var denominator = Math.pow(innerTerm, power);
var Y = Math.floor(65536 / denominator);
// The game performs 4 checks. Each check compares a random number (0-65535) to Y.
// If Random 100) catchProbability = 100;
// Format result
var probabilityDisplay = catchProbability.toFixed(2) + "%";
// Estimated balls needed (1 / probability)
var expectedBalls = catchProbability > 0 ? (100 / catchProbability).toFixed(1) : "Infinite";
if (catchProbability === 100) expectedBalls = "1";
resultDiv.style.display = 'block';
resultDiv.innerHTML = `
Catch Chance: ${probabilityDisplay}
Modified Catch Value (X): ${X} (Guaranteed at 255)
Estimated Throws: ~${expectedBalls}
HP Factor: ${(hpFactorNumerator/hpFactorDenominator).toFixed(2)} / 1.0