diff --git a/src/battle_ai_switch.c b/src/battle_ai_switch.c index 178d1a1730..e3d0c0acbc 100644 --- a/src/battle_ai_switch.c +++ b/src/battle_ai_switch.c @@ -41,13 +41,15 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, enum BattlerId battler, const st static void GetIncomingHealInfo(enum BattlerId battler, struct IncomingHealInfo *healInfo); static u32 GetWishHealAmountForBattler(enum BattlerId battler); -static void InitializeSwitchinCandidate(enum BattlerId switchinBattler, struct Pokemon *mon) +static void InitializeSwitchinCandidate(enum BattlerId switchinBattler, u32 monIndex, struct Pokemon *mon) { + u32 storeCurrBattlerPartyIndex = gBattlerPartyIndexes[switchinBattler]; // Rage Fist fix PokemonToBattleMon(mon, &gBattleMons[switchinBattler]); // Setup switchin battler data gAiThinkingStruct->saved[switchinBattler].saved = TRUE; SetBattlerAiData(switchinBattler, gAiLogicData); SetBattlerFieldStatusForSwitchin(switchinBattler); + gBattlerPartyIndexes[switchinBattler] = monIndex; for (enum BattlerId battlerIndex = 0; battlerIndex < gBattlersCount; battlerIndex++) { if (switchinBattler == battlerIndex || !IsBattlerAlive(battlerIndex)) @@ -57,6 +59,7 @@ static void InitializeSwitchinCandidate(enum BattlerId switchinBattler, struct P CalcBattlerAiMovesData(gAiLogicData, battlerIndex, switchinBattler, AI_GetSwitchinWeather(switchinBattler), AI_GetSwitchinFieldStatus(switchinBattler)); } + gBattlerPartyIndexes[switchinBattler] = storeCurrBattlerPartyIndex; gAiThinkingStruct->saved[switchinBattler].saved = FALSE; } @@ -2139,7 +2142,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, validMonIds |= (1u << monIndex); } - InitializeSwitchinCandidate(battler, &party[monIndex]); + InitializeSwitchinCandidate(battler, monIndex, &party[monIndex]); u32 originalHp = gBattleMons[battler].hp; @@ -2395,7 +2398,7 @@ static u32 GetBestMonVanilla(struct Pokemon *party, int firstId, int lastId, enu { validMonIds |= (1u << monIndex); } - InitializeSwitchinCandidate(battler, &party[monIndex]); + InitializeSwitchinCandidate(battler, monIndex, &party[monIndex]); // While not really invalid per se, not really wise to switch into this mon if (gAiLogicData->abilities[battler] == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) @@ -2547,7 +2550,7 @@ u32 AI_SelectRevivalBlessingMon(enum BattlerId battler) bool32 isAceMon = IsAceMon(battler, monIndex); - InitializeSwitchinCandidate(battler, &party[monIndex]); + InitializeSwitchinCandidate(battler, monIndex, &party[monIndex]); gBattleMons[battler].hp = gBattleMons[battler].maxHP / 2; // Revival Blessing restores half HP gBattleMons[battler].status1 = 0; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 8241a2de15..477bf5a784 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -2212,3 +2212,16 @@ AI_MULTI_BATTLE_TEST("AI will not switch out if the opposite battler is absent a } } } + +AI_SINGLE_BATTLE_TEST("Rage Fist stacks are seen properly for switch logic") +{ + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_VICTINI) { Level(70); Speed(2); Ability(ABILITY_VICTORY_STAR); Moves(MOVE_V_CREATE, MOVE_PSYCHIC); } + OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Speed(1); HP(1); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_GROUDON) { Level(85); Speed(3); Moves(MOVE_PRECIPICE_BLADES); } + OPPONENT(SPECIES_ANNIHILAPE) { Level(85); Speed(3); Moves(MOVE_RAGE_FIST); } + } WHEN { + TURN { MOVE(player, MOVE_PSYCHIC); EXPECT_SEND_OUT(opponent, 1); } + } +}