From c90e6952f32466ed165565c561cbf862fdb90d74 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Tue, 28 Oct 2025 18:26:10 +0000 Subject: [PATCH] Fix Ally Switch being useable in Frontier Link Multi battles (#8059) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/battle_util.h | 1 + include/constants/battle.h | 1 + src/battle_script_commands.c | 4 +--- src/battle_tower.c | 2 +- src/battle_util.c | 9 +++++++++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 3531f0eb6b..8601c792f6 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -414,5 +414,6 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander); bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move); +bool32 HasPartnerTrainer(u32 battler); #endif // GUARD_BATTLE_UTIL_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 825487f24e..012b8986ef 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -99,6 +99,7 @@ enum BattlerId #define RECORDED_WILD_BATTLE ((gBattleTypeFlags & BATTLE_TYPE_RECORDED) && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER))) #define BATTLE_TWO_VS_ONE_OPPONENT ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && TRAINER_BATTLE_PARAM.opponentB == 0xFFFF)) #define BATTLE_TYPE_HAS_AI (BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_ROAMER | BATTLE_TYPE_INGAME_PARTNER) +#define BATTLE_TYPE_PLAYER_HAS_PARTNER (BATTLE_TYPE_MULTI | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_TOWER_LINK_MULTI) // Battle Outcome defines #define B_OUTCOME_WON 1 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index b8c12c1c5e..223a4bd382 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15711,9 +15711,7 @@ void BS_TryAllySwitch(void) { NATIVE_ARGS(const u8 *failInstr); - if (!IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) - || (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) - || (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + if (!IsBattlerAlive(BATTLE_PARTNER(gBattlerAttacker)) || HasPartnerTrainer(gBattlerAttacker)) { gBattlescriptCurrInstr = cmd->failInstr; } diff --git a/src/battle_tower.c b/src/battle_tower.c index e215c259a4..a03f0a130b 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1987,7 +1987,7 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; break; case FRONTIER_MODE_LINK_MULTIS: - gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_TOWER_LINK_MULTI; + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_TOWER_LINK_MULTI | BATTLE_TYPE_TWO_OPPONENTS; FillFrontierTrainersParties(FRONTIER_MULTI_PARTY_SIZE); break; } diff --git a/src/battle_util.c b/src/battle_util.c index 8700fe2b2e..2e2f18cbc9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11907,3 +11907,12 @@ bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move) return FALSE; } + +bool32 HasPartnerTrainer(u32 battler) +{ + if ((GetBattlerSide(battler) == B_SIDE_PLAYER && gBattleTypeFlags & BATTLE_TYPE_PLAYER_HAS_PARTNER) + || (GetBattlerSide(battler) == B_SIDE_OPPONENT && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) + return TRUE; + else + return FALSE; +}