Update catch curve for pokeballs (#3685)

Since Gen 6, the capture rate curve was changed to make pokeballs more effective on lower level pokemon

It's by 65536 divided by 255 to the power of(1/5.33) and I did the work of translating that so a rough approximation can be done in integers, and so far, it seems to work close enough. I use this in my romhack for months now and it works fine.
This commit is contained in:
AtariDreams 2023-12-12 10:25:33 -05:00 committed by GitHub
parent 1ed07f792b
commit 929ec54a39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 3 deletions

View File

@ -31,6 +31,7 @@
#define P_CUSTOM_GENDER_DIFF_ICONS TRUE // If TRUE, will give more Pokémon custom icons for their female forms, i.e. Hippopotas and Hippowdon
#define P_LEGENDARY_PERFECT_IVS GEN_LATEST // Since Gen 6, Legendaries, Mythicals and Ultra Beasts found in the wild or given through gifts have at least 3 perfect IVs.
#define P_EV_CAP GEN_LATEST // Since Gen 6, the max EVs per stat is 252 instead of 255.
#define P_CATCH_CURVE GEN_LATEST // Since Gen 6, the capture rate curve was changed to make pokeballs more effective on lower level pokemon
// Flag settings
// To use the following features in scripting, replace the 0s with the flag ID you're assigning it to.

View File

@ -14959,7 +14959,7 @@ static void Cmd_handleballthrow(void)
if (gBattleResults.catchAttempts[gLastUsedItem - FIRST_BALL] < 255)
gBattleResults.catchAttempts[gLastUsedItem - FIRST_BALL]++;
if (odds > 254) // mon caught
if (odds >= 255) // mon caught
{
BtlController_EmitBallThrowAnim(gBattlerAttacker, BUFFER_A, BALL_3_SHAKES_SUCCESS);
MarkBattlerForControllerExec(gBattlerAttacker);
@ -15004,8 +15004,16 @@ static void Cmd_handleballthrow(void)
}
else
{
odds = Sqrt(Sqrt(16711680 / odds));
odds = 1048560 / odds;
if (P_CATCH_CURVE >= GEN_6)
{
odds = (255 * 255 * 255) / (odds * odds * odds);
odds = 65536 / Sqrt(Sqrt(Sqrt(Sqrt(odds))));
}
else
{
odds = Sqrt(Sqrt(16711680 / odds));
odds = 1048560 / odds;
}
for (shakes = 0; shakes < maxShakes && Random() < odds; shakes++);
}