diff --git a/include/battle_util.h b/include/battle_util.h index da47b3444b..2866d9072f 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -190,7 +190,7 @@ bool32 IsBattlerMegaEvolved(u32 battler); bool32 IsBattlerPrimalReverted(u32 battler); bool32 IsBattlerUltraBursted(u32 battler); u16 GetBattleFormChangeTargetSpecies(u32 battler, u16 method); -bool32 TryBattleFormChange(u32 battler, u16 method); +bool32 TryBattleFormChange(u32 battler, u32 method); bool32 DoBattlersShareType(u32 battler1, u32 battler2); bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId); u32 GetIllusionMonSpecies(u32 battler); diff --git a/src/battle_util.c b/src/battle_util.c index 3f6067c396..ffa81eb2a7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10568,12 +10568,12 @@ bool32 CanBattlerFormChange(u32 battler, u16 method) return DoesSpeciesHaveFormChangeMethod(gBattleMons[battler].species, method); } -bool32 TryBattleFormChange(u32 battler, u16 method) +bool32 TryBattleFormChange(u32 battler, u32 method) { - u8 monId = gBattlerPartyIndexes[battler]; - u8 side = GetBattlerSide(battler); + u32 monId = gBattlerPartyIndexes[battler]; + u32 side = GetBattlerSide(battler); struct Pokemon *party = GetBattlerParty(battler); - u16 targetSpecies; + u32 targetSpecies; if (!CanBattlerFormChange(battler, method)) return FALSE; @@ -10611,10 +10611,14 @@ bool32 TryBattleFormChange(u32 battler, u16 method) if (restoreSpecies) { + u32 abilityForm = gBattleMons[battler].ability; // Reverts the original species TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[side][monId]); RecalcBattlerStats(battler, &party[monId]); + // Battler data is not updated with regular form's ability, not doing so could cause wrong ability activation. + if (method == FORM_CHANGE_FAINT) + gBattleMons[battler].ability = abilityForm; return TRUE; } } diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index b2426933f7..a42c003a3d 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -153,3 +153,26 @@ SINGLE_BATTLE_TEST("Regular Mega Evolution and Fervent Wish Mega Evolution can h EXPECT_EQ(opponent->species, SPECIES_GARDEVOIR_MEGA); } } + +SINGLE_BATTLE_TEST("Mega Evolved Pokemon do not change abilities after fainting") +{ + GIVEN { + ASSUME(gMovesInfo[MOVE_CRUNCH].makesContact == TRUE); + ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[0] != ABILITY_ROUGH_SKIN); + ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[1] != ABILITY_ROUGH_SKIN); + ASSUME(gSpeciesInfo[SPECIES_GARCHOMP_MEGA].abilities[2] != ABILITY_ROUGH_SKIN); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GARCHOMP) { Ability(ABILITY_ROUGH_SKIN); Item(ITEM_GARCHOMPITE); HP(1); } + } WHEN { + TURN { MOVE(player, MOVE_CRUNCH); MOVE(opponent, MOVE_CELEBRATE, megaEvolve: TRUE); } + } SCENE { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_MEGA_EVOLUTION, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CRUNCH, player); + MESSAGE("Foe Garchomp fainted!"); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_ROUGH_SKIN); + MESSAGE("Wobbuffet was hurt by Foe Garchomp's Rough Skin!"); + HP_BAR(player); + } + } +}