diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 3ca37d95a183..69be53311e85 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -488,24 +488,23 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) AI_DATA->aiCalcInProgress = FALSE; } -void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, u32 battlerAtk, u32 battlerDef) +void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) { struct Pokemon *party = GetBattlerParty(battlerDef); + struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); struct BattlePokemon switchinCandidate; - PokemonToBattleMon(&party[AI_DATA->mostSuitableMonId[battlerDef]], &switchinCandidate); - // Saves, sets, restores - struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); + PokemonToBattleMon(&party[aiData->mostSuitableMonId[battlerDef]], &switchinCandidate); gBattleMons[battlerDef] = switchinCandidate; - - SetBattlerAiData(battlerAtk, AI_DATA); - CalcBattlerAiMovesData(AI_DATA, battlerAtk, battlerDef, AI_GetWeather(AI_DATA)); + SetBattlerAiData(battlerDef, aiData); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather(aiData)); // Regular processing with new battler BattleAI_DoAIProcessing(aiThink, battlerAtk, battlerDef); FreeRestoreBattleMons(savedBattleMons); - SetBattlerAiData(battlerAtk, AI_DATA); + SetBattlerAiData(battlerDef, aiData); + CalcBattlerAiMovesData(aiData, battlerAtk, battlerDef, AI_GetWeather(aiData)); } static u32 ChooseMoveOrAction_Singles(u32 battlerAi) @@ -522,7 +521,7 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi) if (flags & 1) { if (IsBattlerPredictedToSwitch(gBattlerTarget)) - BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); else BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); } @@ -605,7 +604,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) if (flags & 1) { if (IsBattlerPredictedToSwitch(gBattlerTarget)) - BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); else BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 93148d8b837d..9925d6e0758b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -198,7 +198,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) { // 50% chance to stay in regardless if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50) || AI_DATA->aiSwitchPredictionInProgress) - return FALSE; + return TRUE; // Switch mon out return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -218,7 +218,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) // 50% chance to stay in regardless if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, 50) || AI_DATA->aiSwitchPredictionInProgress) - return FALSE; + return TRUE; // Switch mon out return SetSwitchinAndSwitch(battler, PARTY_SIZE); diff --git a/test/battle/ai/ai_flag_predict_switch.c b/test/battle/ai/ai_flag_predict_switch.c index d5b90d38cd6b..768c28b70415 100644 --- a/test/battle/ai/ai_flag_predict_switch.c +++ b/test/battle/ai/ai_flag_predict_switch.c @@ -136,6 +136,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in Focus Punc AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI will score against predicted incoming mon when switch predicted") { + PASSES_RANDOMLY(5, 10, RNG_AI_PREDICT_SWITCH); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_SWITCH); PLAYER(SPECIES_GENGAR) { Moves(MOVE_SHADOW_BALL); } @@ -148,7 +149,6 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI will score against predicted i AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_SWITCH: AI would switch out in predicted-incoming-mon scenario") { - PASSES_RANDOMLY(5, 10, RNG_AI_SWITCH_HASBADODDS); GIVEN { AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_TYRANITAR) { Moves(MOVE_CRUNCH, MOVE_SPORE); }