From e2f14d43dbce4316e9d1c54916c3eca2982cc716 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 8 Jun 2021 12:13:40 +0200 Subject: [PATCH 1/9] Fix Gravity's animation --- data/battle_anim_scripts.s | 1 + src/battle_anim_mon_movement.c | 6 ++++++ src/battle_anim_utility_funcs.c | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 65bac00d7..9ebf32a92 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -863,6 +863,7 @@ Move_ROOST: Move_GRAVITY: fadetobg BG_COSMIC waitbgfadein + createvisualtask AnimTask_SetAnimTargetToAttackerOpposite, 1 playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_ATTACKER, 2, 0, 96, 30 createvisualtask AnimTask_ShakeAndSinkMon, 5, ANIM_DEF_PARTNER, 2, 0, 96, 30 diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 9b0835224..75b77494e 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -321,6 +321,12 @@ static void AnimTask_ShakeMonInPlace_Step(u8 taskId) void AnimTask_ShakeAndSinkMon(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); + + if (spriteId == SPRITE_NONE) + { + DestroyAnimVisualTask(taskId); + return; + } gSprites[spriteId].pos2.x = gBattleAnimArgs[1]; gTasks[taskId].data[0] = spriteId; gTasks[taskId].data[1] = gBattleAnimArgs[1]; diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 4d18d04fa..0f2c8bda8 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -1084,3 +1084,9 @@ void AnimTask_SetInvisible(u8 taskId) gSprites[spriteId].invisible = gBattleSpritesDataPtr->battlerData[battlerId].invisible = gBattleAnimArgs[1]; DestroyAnimVisualTask(taskId); } + +void AnimTask_SetAnimTargetToAttackerOpposite(u8 taskId) +{ + gBattleAnimTarget = BATTLE_OPPOSITE(gBattleAnimAttacker); + DestroyAnimVisualTask(taskId); +} From fb69b65337c4013df8cf3e3bbfec6f4f7208977d Mon Sep 17 00:00:00 2001 From: ExpoSeed <43502820+ExpoSeed@users.noreply.github.com> Date: Fri, 2 Jul 2021 14:23:41 -0500 Subject: [PATCH 2/9] Fix redefinition error in battle_config.h --- include/constants/battle_config.h | 2 ++ include/constants/expansion_branches.h | 10 ++++++++++ include/global.h | 6 ------ 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 include/constants/expansion_branches.h diff --git a/include/constants/battle_config.h b/include/constants/battle_config.h index fe376da8d..bf31c77b3 100644 --- a/include/constants/battle_config.h +++ b/include/constants/battle_config.h @@ -1,6 +1,8 @@ #ifndef GUARD_CONSTANTS_BATTLE_CONFIG_H #define GUARD_CONSTANTS_BATTLE_CONFIG_H +#include "constants/expansion_branches.h" + // Species with peculiar battle effects. #ifndef POKEMON_EXPANSION #define SPECIES_DIALGA 0 diff --git a/include/constants/expansion_branches.h b/include/constants/expansion_branches.h new file mode 100644 index 000000000..f88066e68 --- /dev/null +++ b/include/constants/expansion_branches.h @@ -0,0 +1,10 @@ +#ifndef GUARD_CONSTANTS_EXPANSION_BRANCHES_H +#define GUARD_CONSTANTS_EXPANSION_BRANCHES_H + +// Branch defines: Used by other branches to detect each other. +// Each define must be here for each of RHH's branch you have pulled. +// e.g. If you have both the battle_engine and pokemon_expansion branch, +// then both BATTLE_ENGINE and POKEMON_EXPANSION must be defined here. +#define BATTLE_ENGINE + +#endif diff --git a/include/global.h b/include/global.h index e6b0797e7..95245fe6c 100644 --- a/include/global.h +++ b/include/global.h @@ -127,12 +127,6 @@ f; \ }) -// Branch defines: Used by other branches to detect each other. -// Each define must be here for each of RHH's branch you have pulled. -// e.g. If you have both the battle_engine and pokemon_expansion branch, -// then both BATTLE_ENGINE and POKEMON_EXPANSION must be defined here. -#define BATTLE_ENGINE - #define ROUND_BITS_TO_BYTES(numBits)(((numBits) / 8) + (((numBits) % 8) ? 1 : 0)) #define DEX_FLAGS_NO (ROUND_BITS_TO_BYTES(NUM_SPECIES)) From 0ed1d29ece38703798db59be83530578a5a5dc94 Mon Sep 17 00:00:00 2001 From: ExpoSeed <43502820+ExpoSeed@users.noreply.github.com> Date: Sun, 4 Jul 2021 12:39:30 -0500 Subject: [PATCH 3/9] Include expansion_branches.h in global.h --- include/global.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/global.h b/include/global.h index 95245fe6c..53a6175a2 100644 --- a/include/global.h +++ b/include/global.h @@ -10,6 +10,7 @@ #include "constants/vars.h" #include "constants/species.h" #include "constants/berry.h" +#include "constants/expansion_branches.h" // Prevent cross-jump optimization. #define BLOCK_CROSS_JUMP asm(""); From 59c16ff1cf1efda65873dbf425bb5073a39a8691 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Sat, 10 Jul 2021 16:41:41 -0600 Subject: [PATCH 4/9] AI_IsTerrainAffected checks --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 15 +++++++-------- src/battle_ai_util.c | 9 +++++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index db33a7ff1..d4df682c6 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -36,6 +36,7 @@ u32 AI_GetMoveAccuracy(u8 battlerAtk, u8 battlerDef, u16 atkAbility, u16 defAbil bool32 DoesBattlerIgnoreAbilityChecks(u16 atkAbility, u16 move); bool32 AI_WeatherHasEffect(void); bool32 CanAttackerFaintTarget(u8 battlerAtk, u8 battlerDef, u8 index, u8 numHits); +bool32 AI_IsTerrainAffected(u8 battlerId, u32 flags); bool32 AI_IsBattlerGrounded(u8 battlerId); bool32 HasDamagingMove(u8 battlerId); bool32 HasDamagingMoveOfType(u8 battlerId, u8 type); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 5dc460f6a..81d97fcab 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -721,22 +721,21 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) #endif // terrain & effect checks - if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) + if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) { if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) RETURN_SCORE_MINUS(20); } - if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) + if (AI_IsTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) { if (IsNonVolatileStatusMoveEffect(moveEffect) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } - if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) + if (AI_IsTerrainAffected(battlerAtk, STATUS_FIELD_PSYCHIC_TERRAIN) && atkPriority > 0) { - if (atkPriority > 0) - RETURN_SCORE_MINUS(20); + RETURN_SCORE_MINUS(20); } } // end check MOVE_TARGET_USER @@ -1641,11 +1640,11 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) case EFFECT_TEETER_DANCE: if (((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) || (!DoesBattlerIgnoreAbilityChecks(AI_DATA->atkAbility, move) && AI_DATA->defAbility == ABILITY_OWN_TEMPO) - || (IsBattlerGrounded(battlerDef) && (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) + || (IsBattlerGrounded(battlerDef) && AI_IsTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) || (DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) && ((gBattleMons[AI_DATA->battlerDefPartner].status2 & STATUS2_CONFUSION) || (!DoesBattlerIgnoreAbilityChecks(AI_DATA->atkAbility, move) && AI_DATA->defPartnerAbility == ABILITY_OWN_TEMPO) - || (IsBattlerGrounded(AI_DATA->battlerDefPartner) && (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN)) + || (IsBattlerGrounded(AI_DATA->battlerDefPartner) && AI_IsTerrainAffected(AI_DATA->battlerDefPartner, STATUS_FIELD_MISTY_TERRAIN)) || (DoesSubstituteBlockMove(battlerAtk, AI_DATA->battlerDefPartner, move)))) { score -= 10; @@ -3836,7 +3835,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) score++; break; case EFFECT_SAFEGUARD: - if (!(gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) + if (!AI_IsTerrainAffected(battlerAtk, STATUS_FIELD_MISTY_TERRAIN) || !IsBattlerGrounded(battlerAtk)) score++; //if (CountUsablePartyMons(battlerDef) != 0) //score += 8; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 5695677bb..600921d97 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1110,6 +1110,15 @@ u16 AI_GetHoldEffect(u32 battlerId) return holdEffect; } +bool32 AI_IsTerrainAffected(u8 battlerId, u32 flags) +{ + if (gStatuses3[battlerId] & STATUS3_SEMI_INVULNERABLE) + return FALSE; + else if (!(gFieldStatuses & flags)) + return FALSE; + return AI_IsBattlerGrounded(battlerId); +} + // different from IsBattlerGrounded in that we don't always know battler's hold effect or ability bool32 AI_IsBattlerGrounded(u8 battlerId) { From 8d432e4e34348a37bde3c9f25efc0d47c9cab8f1 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 11 Jul 2021 12:51:27 +1200 Subject: [PATCH 5/9] Undo form changes on capture This will revert busted Mimikyu, Schooling Wishiwashi etc. to their base forms when caught. --- src/battle_script_commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index c8a393da3..b9e392041 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -12097,6 +12097,7 @@ static void Cmd_handleballthrow(void) { BtlController_EmitBallThrowAnim(0, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); + UndoFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget)); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); @@ -12141,6 +12142,7 @@ static void Cmd_handleballthrow(void) if (IsCriticalCapture()) gBattleSpritesDataPtr->animationData->criticalCaptureSuccess = 1; + UndoFormChange(gBattlerPartyIndexes[gBattlerTarget], GET_BATTLER_SIDE(gBattlerTarget)); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); if (CalculatePlayerPartyCount() == PARTY_SIZE) From 63faa6e3a941faa60fecbfbd60ee37375c22904c Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Sun, 11 Jul 2021 14:15:24 +1200 Subject: [PATCH 6/9] 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 02eace45745536e13f84338872f767abdf112a11 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 13 Jul 2021 13:54:31 -0300 Subject: [PATCH 7/9] Fixed Cotton Down It will no longer affect fainted 'mons. --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e3b34fdda..007d3649c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6258,6 +6258,8 @@ BattleScript_CottonDownActivates:: savetarget setbyte gBattlerTarget, 0 BattleScript_CottonDownLoop: + getbattlerfainted BS_TARGET + jumpifbyte CMP_EQUAL, gBattleCommunication, TRUE, BattleScript_CottonDownLoopIncrement setstatchanger STAT_SPEED, 1, TRUE jumpifbyteequal gBattlerTarget, gEffectBattler, BattleScript_CottonDownLoopIncrement statbuffchange STAT_BUFF_NOT_PROTECT_AFFECTED, BattleScript_CottonDownTargetSpeedCantGoLower From 90fdb74ccbcd19fa575840b76899282b2242bff4 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Fri, 16 Jul 2021 17:56:53 +1200 Subject: [PATCH 8/9] 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 9/9] 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]);