From 929ec54a3922915f9f4a0c8b822b99e70fb51d21 Mon Sep 17 00:00:00 2001 From: AtariDreams <83477269+AtariDreams@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:25:33 -0500 Subject: [PATCH] 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. --- include/config/pokemon.h | 1 + src/battle_script_commands.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/config/pokemon.h b/include/config/pokemon.h index e833399eac..abdb728ac1 100644 --- a/include/config/pokemon.h +++ b/include/config/pokemon.h @@ -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. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 330a33e96a..aef26ce826 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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++); }