From d55d2b6dfcaa4fe05222aa80b9345b561ee5542d Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Mon, 22 Dec 2025 09:11:21 +0000 Subject: [PATCH] Corrects test system Forced Ability handing for multi battles (#8611) --- include/test/battle.h | 2 +- include/test_runner.h | 2 +- src/battle_controllers.c | 6 +++--- src/battle_main.c | 18 +++++++++--------- src/battle_script_commands.c | 12 ++++++------ test/test_runner_battle.c | 4 ++-- test/test_test_runner.c | 20 ++++++++++++++++++++ 7 files changed, 42 insertions(+), 22 deletions(-) diff --git a/include/test/battle.h b/include/test/battle.h index 198de63f3c..7c4d285f6f 100644 --- a/include/test/battle.h +++ b/include/test/battle.h @@ -750,7 +750,7 @@ struct BattleTestData u8 gender; u8 nature; bool8 isShiny; - enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE]; + enum Ability forcedAbilities[MAX_BATTLERS_COUNT][PARTY_SIZE]; u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE]; u8 forcedEnvironment; diff --git a/include/test_runner.h b/include/test_runner.h index fa97da9881..b15ae349ad 100644 --- a/include/test_runner.h +++ b/include/test_runner.h @@ -31,7 +31,7 @@ void TestRunner_CheckMemory(void); void TestRunner_Battle_CheckBattleRecordActionType(u32 battlerId, u32 recordIndex, u32 actionType); -u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex); +u32 TestRunner_Battle_GetForcedAbility(u32 array, u32 partyIndex); u32 TestRunner_Battle_GetChosenGimmick(u32 side, u32 partyIndex); u32 TestRunner_Battle_GetForcedEnvironment(void); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 06ed79c892..dd8abcf213 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1438,10 +1438,10 @@ static u32 GetBattlerMonData(u32 battler, struct Pokemon *party, u32 monId, u8 * #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + u32 array = (!IsPartnerMonFromSameTrainer(battler)) ? battler : GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(array, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(array, partyIndex); } #endif break; diff --git a/src/battle_main.c b/src/battle_main.c index 787e05608e..242ad60588 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3284,10 +3284,10 @@ void SwitchInClearSetData(u32 battler, struct Volatiles *volatilesCopy) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + u32 array = (!IsPartnerMonFromSameTrainer(battler)) ? battler : GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(array, partyIndex)) + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(array, partyIndex); } #endif // TESTING @@ -3495,10 +3495,10 @@ static void DoBattleIntro(void) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + u32 array = (!IsPartnerMonFromSameTrainer(battler)) ? battler : GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(array, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(array, partyIndex); } #endif } @@ -3794,10 +3794,10 @@ static void TryDoEventsBeforeFirstTurn(void) { for (i = 0; i < gBattlersCount; ++i) { - u32 side = GetBattlerSide(i); + u32 array = (!IsPartnerMonFromSameTrainer(i)) ? i : GetBattlerSide(i); u32 partyIndex = gBattlerPartyIndexes[i]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(array, partyIndex)) + gBattleMons[i].ability = TestRunner_Battle_GetForcedAbility(array, partyIndex); } } #endif // TESTING diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e13a18fc97..85f63839a4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7308,10 +7308,10 @@ static void Cmd_switchindataupdate(void) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(battler); + u32 array = (!IsPartnerMonFromSameTrainer(battler)) ? battler : GetBattlerSide(battler); u32 partyIndex = gBattlerPartyIndexes[battler]; - if (TestRunner_Battle_GetForcedAbility(side, partyIndex)) - gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(side, partyIndex); + if (TestRunner_Battle_GetForcedAbility(array, partyIndex)) + gBattleMons[battler].ability = TestRunner_Battle_GetForcedAbility(array, partyIndex); } #endif @@ -11846,9 +11846,9 @@ static void Cmd_healpartystatus(void) #if TESTING if (gTestRunnerEnabled) { - u32 side = GetBattlerSide(gBattlerAttacker); - if (TestRunner_Battle_GetForcedAbility(side, i)) - ability = TestRunner_Battle_GetForcedAbility(side, i); + u32 array = (!IsPartnerMonFromSameTrainer(gBattlerAttacker)) ? gBattlerAttacker : GetBattlerSide(gBattlerAttacker); + if (TestRunner_Battle_GetForcedAbility(array, i)) + ability = TestRunner_Battle_GetForcedAbility(array, i); } #endif } diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 9bc28363d4..72b28d4ee2 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -3219,9 +3219,9 @@ void ValidateFinally(u32 sourceLine) INVALID_IF(STATE->parametersCount == 0, "FINALLY without PARAMETRIZE"); } -u32 TestRunner_Battle_GetForcedAbility(u32 side, u32 partyIndex) +u32 TestRunner_Battle_GetForcedAbility(u32 array, u32 partyIndex) { - return DATA.forcedAbilities[side][partyIndex]; + return DATA.forcedAbilities[array][partyIndex]; } u32 TestRunner_Battle_GetForcedEnvironment(void) diff --git a/test/test_test_runner.c b/test/test_test_runner.c index 670be27674..4bfa84305f 100644 --- a/test/test_test_runner.c +++ b/test/test_test_runner.c @@ -1,5 +1,6 @@ #include "global.h" #include "test/test.h" +#include "test/battle.h" TEST("Tests resume after CRASH") { @@ -7,3 +8,22 @@ TEST("Tests resume after CRASH") void (*f)(void) = NULL; f(); } + +MULTI_BATTLE_TEST("Forced Abilities are set correctly in multi battle tests") +{ + GIVEN { + MULTI_PLAYER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_WOBBUFFET); + MULTI_PARTNER(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_DRIZZLE); } + MULTI_OPPONENT_A(SPECIES_WOBBUFFET); + MULTI_OPPONENT_A(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_SAND_STREAM); } + MULTI_OPPONENT_B(SPECIES_WYNAUT); + MULTI_OPPONENT_B(SPECIES_NINETALES_ALOLA) { Ability(ABILITY_DROUGHT); } + } WHEN { + TURN { SWITCH(opponentLeft, 1); SWITCH(playerRight, 4); SWITCH(opponentRight, 4); } + } SCENE { + ABILITY_POPUP(opponentLeft, ABILITY_SAND_STREAM); + ABILITY_POPUP(playerRight, ABILITY_DRIZZLE); + ABILITY_POPUP(opponentRight, ABILITY_DROUGHT); + } +}