From 63faa6e3a941faa60fecbfbd60ee37375c22904c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 11 Jul 2021 14:15:24 +1200 Subject: [PATCH 1/3] Fix Disguise reverting on switch out Make Mimikyu's disguise stay busted when it's switched out. --- include/battle_util.h | 1 + src/battle_util.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/battle_util.h b/include/battle_util.h index 0bf49dadf..cec7f7b73 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -124,6 +124,7 @@ u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 bool32 CanMegaEvolve(u8 battlerId); void UndoMegaEvolution(u32 monId); void UndoFormChange(u32 monId, u32 side); +void UndoFormChangeOnSwitch(u32 monId, u32 side); bool32 DoBattlersShareType(u32 battler1, u32 battler2); bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId); struct Pokemon *GetIllusionMonPtr(u32 battlerId); diff --git a/src/battle_util.c b/src/battle_util.c index 87f9003e0..8ac9a8257 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -492,7 +492,7 @@ void HandleAction_Switch(void) if (gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; - UndoFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker)); + UndoFormChangeOnSwitch(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker)); } void HandleAction_UseItem(void) @@ -8353,6 +8353,37 @@ void UndoFormChange(u32 monId, u32 side) } } +// Same as UndoFormChange but doesn't revert Mimikyu +void UndoFormChangeOnSwitch(u32 monId, u32 side) +{ + u32 i, currSpecies; + struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; + static const u16 species[][2] = // changed form id, default form id + { + {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, + {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN}, + {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED}, + {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE}, + {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN}, + {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO}, + {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE}, + {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET}, + {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW}, + {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, + }; + + currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); + for (i = 0; i < ARRAY_COUNT(species); i++) + { + if (currSpecies == species[i][0]) + { + SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]); + CalculateMonStats(&party[monId]); + break; + } + } +} + bool32 DoBattlersShareType(u32 battler1, u32 battler2) { s32 i; From 90fdb74ccbcd19fa575840b76899282b2242bff4 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 16 Jul 2021 17:56:53 +1200 Subject: [PATCH 2/3] Remove UndoFormChangeOnSwitch Handle switching out Mimikyu Busted in UndoFormChange. --- include/battle_util.h | 3 +-- src/battle_main.c | 4 ++-- src/battle_util.c | 40 +++++++--------------------------------- 3 files changed, 10 insertions(+), 37 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index cec7f7b73..0b7b01d0c 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -123,8 +123,7 @@ u16 GetMegaEvolutionSpecies(u16 preEvoSpecies, u16 heldItemId); u16 GetWishMegaEvolutionSpecies(u16 preEvoSpecies, u16 moveId1, u16 moveId2, u16 moveId3, u16 moveId4); bool32 CanMegaEvolve(u8 battlerId); void UndoMegaEvolution(u32 monId); -void UndoFormChange(u32 monId, u32 side); -void UndoFormChangeOnSwitch(u32 monId, u32 side); +void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut); bool32 DoBattlersShareType(u32 battler1, u32 battler2); bool32 CanBattlerGetOrLoseItem(u8 battlerId, u16 itemId); struct Pokemon *GetIllusionMonPtr(u32 battlerId); diff --git a/src/battle_main.c b/src/battle_main.c index 9cf56abf7..94700bf96 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3122,7 +3122,7 @@ void FaintClearSetData(void) ClearBattlerMoveHistory(gActiveBattler); ClearBattlerAbilityHistory(gActiveBattler); ClearBattlerItemEffectHistory(gActiveBattler); - UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler)); + UndoFormChange(gBattlerPartyIndexes[gActiveBattler], GET_BATTLER_SIDE(gActiveBattler), FALSE); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]); } @@ -4878,7 +4878,7 @@ static void HandleEndTurn_FinishBattle(void) for (i = 0; i < PARTY_SIZE; i++) { UndoMegaEvolution(i); - UndoFormChange(i, B_SIDE_PLAYER); + UndoFormChange(i, B_SIDE_PLAYER, FALSE); } gBattleMainFunc = FreeResetData_ReturnToOvOrDoEvolutions; gCB2_AfterEvolution = BattleMainCB2; diff --git a/src/battle_util.c b/src/battle_util.c index 8ac9a8257..089226317 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -492,7 +492,7 @@ void HandleAction_Switch(void) if (gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; - UndoFormChangeOnSwitch(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker)); + UndoFormChange(gBattlerPartyIndexes[gBattlerAttacker], GetBattlerSide(gBattlerAttacker), TRUE); } void HandleAction_UseItem(void) @@ -8322,44 +8322,13 @@ void UndoMegaEvolution(u32 monId) } } -void UndoFormChange(u32 monId, u32 side) +void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) { u32 i, currSpecies; struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; static const u16 species[][2] = // changed form id, default form id { - {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, {SPECIES_MIMIKYU_BUSTED, SPECIES_MIMIKYU}, - {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN}, - {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED}, - {SPECIES_MINIOR_METEOR_BLUE, SPECIES_MINIOR_CORE_BLUE}, - {SPECIES_MINIOR_METEOR_GREEN, SPECIES_MINIOR_CORE_GREEN}, - {SPECIES_MINIOR_METEOR_INDIGO, SPECIES_MINIOR_CORE_INDIGO}, - {SPECIES_MINIOR_METEOR_ORANGE, SPECIES_MINIOR_CORE_ORANGE}, - {SPECIES_MINIOR_METEOR_VIOLET, SPECIES_MINIOR_CORE_VIOLET}, - {SPECIES_MINIOR_METEOR_YELLOW, SPECIES_MINIOR_CORE_YELLOW}, - {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, - }; - - currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); - for (i = 0; i < ARRAY_COUNT(species); i++) - { - if (currSpecies == species[i][0]) - { - SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]); - CalculateMonStats(&party[monId]); - break; - } - } -} - -// Same as UndoFormChange but doesn't revert Mimikyu -void UndoFormChangeOnSwitch(u32 monId, u32 side) -{ - u32 i, currSpecies; - struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; - static const u16 species[][2] = // changed form id, default form id - { {SPECIES_AEGISLASH_BLADE, SPECIES_AEGISLASH}, {SPECIES_DARMANITAN_ZEN_MODE, SPECIES_DARMANITAN}, {SPECIES_MINIOR, SPECIES_MINIOR_CORE_RED}, @@ -8375,6 +8344,11 @@ void UndoFormChangeOnSwitch(u32 monId, u32 side) currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); for (i = 0; i < ARRAY_COUNT(species); i++) { + if (i == 0 && isSwitchingOut) + { + i++; // Don't revert Mimikyu Busted when switching out + } + if (currSpecies == species[i][0]) { SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]); From d2d7b6ffefa3a5cc677e64f5a0172ab2f233f752 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 16 Jul 2021 18:09:41 +1200 Subject: [PATCH 3/3] Remove Mimikyu check from loop More efficient than checking in each loop iteration. --- src/battle_util.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 089226317..3466a88f9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8341,14 +8341,14 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) {SPECIES_WISHIWASHI_SCHOOL, SPECIES_WISHIWASHI}, }; - currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); - for (i = 0; i < ARRAY_COUNT(species); i++) - { - if (i == 0 && isSwitchingOut) - { - i++; // Don't revert Mimikyu Busted when switching out - } + if (isSwitchingOut) // Don't revert Mimikyu Busted when switching out + i = 1; + else + i = 0; + currSpecies = GetMonData(&party[monId], MON_DATA_SPECIES, NULL); + for (; i < ARRAY_COUNT(species); i++) + { if (currSpecies == species[i][0]) { SetMonData(&party[monId], MON_DATA_SPECIES, &species[i][1]);