From cc9ca81c29e1e3bcf81bbe4d7fa74f9faddbd623 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:32:34 +0100 Subject: [PATCH] Add abstraction layer for battler positions (#6212) --- include/battle.h | 26 ++++++++++++++++++++++++++ include/battle_anim.h | 1 - src/battle_ai_switch_items.c | 32 ++++++++++++++++---------------- src/battle_ai_util.c | 4 ++-- src/battle_anim_mons.c | 12 ------------ src/battle_controller_player.c | 2 +- src/battle_main.c | 30 +++++++++++++++--------------- src/battle_script_commands.c | 10 +++++++--- src/battle_util.c | 28 ++++++++++++++-------------- 9 files changed, 81 insertions(+), 64 deletions(-) diff --git a/include/battle.h b/include/battle.h index 8a5fd34c04..e0a6225f82 100644 --- a/include/battle.h +++ b/include/battle.h @@ -1217,11 +1217,37 @@ static inline u32 GetBattlerPosition(u32 battler) return gBattlerPositions[battler]; } +static inline u32 GetBattlerAtPosition(u32 position) +{ + u32 battler; + for (battler = 0; battler < gBattlersCount; battler++) + { + if (GetBattlerPosition(battler) == position) + break; + } + return battler; +} + +static inline u32 GetPartnerBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); +} + +static inline u32 GetOppositeBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); +} + static inline u32 GetBattlerSide(u32 battler) { return GetBattlerPosition(battler) & BIT_SIDE; } +static inline u32 GetOpposingSideBattler(u32 battler) +{ + return GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); +} + static inline struct Pokemon* GetPartyBattlerData(u32 battler) { u32 index = gBattlerPartyIndexes[battler]; diff --git a/include/battle_anim.h b/include/battle_anim.h index 6605448249..ce94f667e3 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -165,7 +165,6 @@ void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void DestroyAnimVisualTaskAndDisableBlend(u8 taskId); void DestroySpriteAndFreeResources_(struct Sprite *sprite); void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId); -u8 GetBattlerAtPosition(u8 position); void ConvertPosDataToTranslateLinearData(struct Sprite *sprite); void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 59baf4362e..908568769e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -314,7 +314,7 @@ static bool32 ShouldSwitchIfTruant(u32 battler) static bool32 ShouldSwitchIfAllMovesBad(u32 battler) { u32 moveIndex; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 aiMove; // Switch if no moves affect opponents @@ -347,7 +347,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) static bool32 FindMonThatHitsWonderGuard(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); s32 i, j; s32 firstId; s32 lastId; // + 1 @@ -409,7 +409,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) s32 lastId; struct Pokemon *party; u16 monAbility; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; u32 incomingType = GetMoveType(incomingMove); u32 predictedMove = incomingMove; // Update for move prediction @@ -428,10 +428,10 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -516,7 +516,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) { - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); @@ -536,7 +536,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) struct Pokemon *party; s32 i; u16 monAbility; - s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -795,10 +795,10 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -870,10 +870,10 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); } else { @@ -921,7 +921,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) static bool32 ShouldSwitchIfEncored(u32 battler) { u32 encoredMove = gDisableStructs[battler].encoredMove; - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -1628,7 +1628,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) u32 hitsToKO = 0, singleUseItemHeal = 0; u16 maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, item = AI_DATA->switchinCandidate.battleMon.item, heldItemEffect = ItemId_GetHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = ItemId_GetHoldEffectParam(item); - u32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + u32 opposingBattler = GetOppositeBattler(battler); u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = AI_DATA->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP; @@ -2073,10 +2073,10 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) if (IsDoubleBattle()) { battlerIn1 = battler; - if (gAbsentBattlerFlags & (1u << GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))))) + if (gAbsentBattlerFlags & (1u << GetPartnerBattler(battler))) battlerIn2 = battler; else - battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))); + battlerIn2 = GetPartnerBattler(battler); opposingBattler = BATTLE_OPPOSITE(battlerIn1); if (gAbsentBattlerFlags & (1u << opposingBattler)) @@ -2084,7 +2084,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) } else { - opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + opposingBattler = GetOppositeBattler(battler); battlerIn1 = battler; battlerIn2 = battler; } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 05c4f5dac3..6c4183786b 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3158,7 +3158,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF @@ -3587,7 +3587,7 @@ s32 CountUsablePartyMons(u32 battlerId) if (IsDoubleBattle()) { battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battlerId)))]; + battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; } else // In singles there's only one battlerId by side. { diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 718ffb0a49..13b1cf834f 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -799,18 +799,6 @@ bool32 InitSpritePosToAnimBattler(u32 animBattlerId, struct Sprite *sprite, bool return TRUE; } -u8 GetBattlerAtPosition(u8 position) -{ - u8 i; - - for (i = 0; i < gBattlersCount; i++) - { - if (GetBattlerPosition(i) == position) - break; - } - return i; -} - bool8 IsBattlerSpritePresent(u8 battlerId) { if (IsContest()) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 78b7852374..fee5c963e2 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -688,7 +688,7 @@ void HandleInputChooseMove(u32 battler) if (moveTarget & MOVE_TARGET_USER) gMultiUsePlayerCursor = battler; else - gMultiUsePlayerCursor = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(battler))); + gMultiUsePlayerCursor = GetOpposingSideBattler(battler); if (!gBattleResources->bufferA[battler][1]) // not a double battle { diff --git a/src/battle_main.c b/src/battle_main.c index 5be19de6fc..33ab6ca1c2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4146,7 +4146,7 @@ enum void SetupAISwitchingData(u32 battler, enum SwitchType switchType) { - s32 opposingBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); + s32 opposingBattler = GetOppositeBattler(battler); // AI's predicting data if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) @@ -4361,38 +4361,38 @@ static void HandleTurnActionSelectionState(void) break; case B_ACTION_CANCEL_PARTNER: gBattleCommunication[battler] = STATE_WAIT_SET_BEFORE_ACTION; - gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] = STATE_BEFORE_ACTION_CHOSEN; + gBattleCommunication[GetPartnerBattler(battler)] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(battler, 1); - if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_MULTIPLETURNS - || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].status2 & STATUS2_RECHARGE) + if (gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_MULTIPLETURNS + || gBattleMons[GetPartnerBattler(battler)].status2 & STATUS2_RECHARGE) { BtlController_EmitEndBounceEffect(battler, BUFFER_A); MarkBattlerForControllerExec(battler); return; } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_SWITCH) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_SWITCH) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 2); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 2); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_RUN) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_RUN) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } - else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE - && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].noValidMoves - || gDisableStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))].encoredMove)) + else if (gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE + && (gProtectStructs[GetPartnerBattler(battler)].noValidMoves + || gDisableStructs[GetPartnerBattler(battler)].encoredMove)) { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else if (gBattleTypeFlags & BATTLE_TYPE_PALACE - && gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler)))] == B_ACTION_USE_MOVE) + && gChosenActionByBattler[GetPartnerBattler(battler)] == B_ACTION_USE_MOVE) { gRngValue = gBattlePalaceMoveSelectionRngValue; - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 1); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 1); } else { - RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(battler))), 3); + RecordedBattle_ClearBattlerAction(GetPartnerBattler(battler), 3); } gBattleStruct->gimmick.toActivate &= ~((1u << BATTLE_PARTNER(GetBattlerPosition(battler)))); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f372df183b..a47146c6fe 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -13946,9 +13946,10 @@ static void Cmd_healpartystatus(void) { CMD_ARGS(); - u32 i, zero = 0; + u32 i = 0; + u32 zero = 0; + u32 toHeal = 0; u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); - u8 toHeal = 0; struct Pokemon *party = GetBattlerParty(gBattlerAttacker); bool32 isSoundMove = IsSoundMove(gCurrentMove); @@ -16270,6 +16271,8 @@ static void Cmd_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: + FREE_AND_SET_NULL(gBattleResources->aiData); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gBattleCommunication[0]++; break; @@ -16309,8 +16312,9 @@ static void Cmd_displaydexinfo(void) } break; case 5: - if (!gPaletteFade.active) + if (!gPaletteFade.active) { gBattlescriptCurrInstr = cmd->nextInstr; + } break; } } diff --git a/src/battle_util.c b/src/battle_util.c index e292c25493..35dd52c5e3 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -382,7 +382,7 @@ void HandleAction_UseMove(void) if (!IsBattlerAlive(gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } else @@ -405,7 +405,7 @@ void HandleAction_UseMove(void) if (gAbsentBattlerFlags & (1u << gBattlerTarget) && GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget)) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } else if (moveTarget == MOVE_TARGET_ALLY) @@ -432,7 +432,7 @@ void HandleAction_UseMove(void) && moveTarget != MOVE_TARGET_OPPONENTS_FIELD && (GetBattlerSide(gBattlerAttacker) != GetBattlerSide(gBattlerTarget))) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + gBattlerTarget = GetPartnerBattler(gBattlerTarget); } } @@ -4235,7 +4235,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability u32 atkPriority = AI_DATA->aiCalcInProgress ? GetBattleMovePriority(battlerAtk, move) : GetChosenMovePriority(battlerAtk); u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); u32 battlerAbility = battlerDef; - + switch (abilityDef) { case ABILITY_SOUNDPROOF: @@ -4292,10 +4292,10 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability break; } } - + if (battleScriptBlocksMove == NULL) return FALSE; - + if (option == ABILITY_RUN_SCRIPT) { gBattleScripting.battler = gBattlerAbility = battlerAbility; @@ -4377,10 +4377,10 @@ bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 effect = MOVE_ABSORBED_BY_BOOST_FLASH_FIRE; break; } - + if (effect == MOVE_ABSORBED_BY_NO_ABILITY || option == ABILITY_CHECK_TRIGGER) return effect; - + switch (effect) { default: @@ -4828,7 +4828,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_UNNERVE: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); @@ -4839,7 +4839,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_AS_ONE_SHADOW_RIDER: if (!gSpecialStatuses[battler].switchInAbilityDone) { - gBattlerTarget = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerAtPosition(battler))); + gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); @@ -5595,7 +5595,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 return effect; case ABILITYEFFECT_MOVES_BLOCK: effect = CanAbilityBlockMove(gBattlerAttacker, battler, move, gLastUsedAbility, ABILITY_RUN_SCRIPT); - + // prankster check if (effect == 0 && GetChosenMovePriority(gBattlerAttacker) > 0 @@ -8568,12 +8568,12 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_DEPENDS: case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); if (!IsBattlerAlive(targetBattler)) targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_OPPONENTS_FIELD: - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_RANDOM: side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker)); @@ -8582,7 +8582,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget) else if (IsDoubleBattle() && moveTarget & MOVE_TARGET_RANDOM) targetBattler = SetRandomTarget(gBattlerAttacker); else - targetBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker))); + targetBattler = GetOpposingSideBattler(gBattlerAttacker); break; case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: