From a818b97732314db42cf153eb646bde2d4b6cb5af Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 29 Sep 2025 17:16:15 +0200 Subject: [PATCH] GetBattlerHoldEffect clean up (#7819) Co-authored-by: Bassoonian --- include/battle_util.h | 7 +- src/battle_ai_switch_items.c | 4 +- src/battle_ai_util.c | 2 +- src/battle_anim_effects_3.c | 2 +- src/battle_anim_new.c | 2 +- src/battle_controller_player.c | 4 +- src/battle_dynamax.c | 2 +- src/battle_end_turn.c | 14 +-- src/battle_main.c | 26 +++--- src/battle_script_commands.c | 106 +++++++++++------------ src/battle_terastal.c | 2 +- src/battle_util.c | 154 +++++++++++++++++---------------- src/battle_z_move.c | 6 +- 13 files changed, 169 insertions(+), 162 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index b06619e6ba..ef8f51809d 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -287,9 +287,10 @@ void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler); +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability); u32 GetBattlerHoldEffectParam(u32 battler); bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 7d3c0ac4b0..34844fdbab 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -165,7 +165,7 @@ static bool32 AI_DoesChoiceEffectBlockMove(u32 battler, u32 move) { // Choice locked into something else if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move - && ((IsHoldEffectChoice(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) + && (IsHoldEffectChoice(GetBattlerHoldEffect(battler) && IsBattlerItemEnabled(battler)) || gBattleMons[battler].ability == ABILITY_GORILLA_TACTICS)) return TRUE; return FALSE; @@ -1025,7 +1025,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 7cd7c6996f..ab0be71483 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1705,7 +1705,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) if (!IsAiBattlerAware(battlerId)) holdEffect = gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; else - holdEffect = GetBattlerHoldEffect(battlerId, FALSE); + holdEffect = GetBattlerHoldEffectIgnoreNegation(battlerId); if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 65de36237b..4d41156623 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -5785,7 +5785,7 @@ static void AnimRecycle_Step(struct Sprite *sprite) void AnimTask_GetWeather(u8 taskId) { - bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA; + bool32 utilityUmbrellaAffected = GetBattlerHoldEffect(gBattleAnimAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA; gBattleAnimArgs[ARG_RET_ID] = ANIM_WEATHER_NONE; if (gWeatherMoveAnim & B_WEATHER_SUN && !utilityUmbrellaAffected) diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 3360b305c0..58e6a17dc8 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -9058,7 +9058,7 @@ void AnimTask_ShellSideArm(u8 taskId) void AnimTask_TerrainPulse(u8 taskId) { - if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker, TRUE), STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(gBattleAnimAttacker, GetBattlerAbility(gBattleAnimAttacker), GetBattlerHoldEffect(gBattleAnimAttacker), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index b08a3ee574..f98b3ca3d6 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -2356,8 +2356,8 @@ static u32 CheckTypeEffectiveness(u32 battlerAtk, u32 battlerDef) ctx.updateFlags = FALSE; ctx.abilityAtk = GetBattlerAbility(battlerAtk); ctx.abilityDef = GetBattlerAbility(battlerDef); - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); uq4_12_t modifier = CalcTypeEffectivenessMultiplier(&ctx); diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 33a7d5ee28..1ddc2b2b01 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -74,7 +74,7 @@ static const struct GMaxMove sGMaxMoveTable[] = bool32 CanDynamax(u32 battler) { u16 species = GetBattlerVisualSpecies(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Prevents Zigzagoon from dynamaxing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !IsOnPlayerSide(battler)) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index e7485da64d..3f6f0db2ca 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -235,7 +235,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -260,7 +260,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE) && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERGROUND && gBattleMons[battler].volatiles.semiInvulnerable != STATE_UNDERWATER - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_SAFETY_GOGGLES && !IsAbilityAndRecord(battler, ability, ABILITY_MAGIC_GUARD)) { gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / 16; @@ -492,7 +492,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) && !IsBattlerAtMaxHp(battler) && !gBattleMons[battler].volatiles.healBlock && !IsSemiInvulnerable(battler, CHECK_ALL) - && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { gBattlerAttacker = battler; gBattleStruct->moveDamage[battler] = -(GetNonDynamaxMaxHP(battler) / 16); @@ -766,7 +766,7 @@ static bool32 HandleEndTurnWrap(u32 battler) gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); BattleScriptExecute(BattleScript_WrapTurnDmg); - if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler], TRUE) == HOLD_EFFECT_BINDING_BAND) + if (GetBattlerHoldEffect(gBattleStruct->wrappedBy[battler]) == HOLD_EFFECT_BINDING_BAND) gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 6 : 8); else gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (B_BINDING_DAMAGE >= GEN_6 ? 8 : 16); @@ -1019,7 +1019,7 @@ static bool32 HandleEndTurnYawn(u32 battler) && !IsLeafGuardProtected(battler, ability)) { gEffectBattler = gBattlerTarget = battler; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (IsBattlerTerrainAffected(battler, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TERRAINPREVENTS_ELECTRIC; @@ -1427,7 +1427,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) } case THIRD_EVENT_BLOCK_ITEMS: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); switch (holdEffect) { case HOLD_EFFECT_FLAME_ORB: @@ -1492,7 +1492,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler) } case FOURTH_EVENT_BLOCK_EJECT_PACK: { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (holdEffect == HOLD_EFFECT_EJECT_PACK) { if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler)) diff --git a/src/battle_main.c b/src/battle_main.c index 44dc25ec8a..9b2555ba21 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3420,7 +3420,7 @@ const u8* FaintClearSetData(u32 battler) u32 ability = GetBattlerAbility(otherSkyDropper); if (!(ability == ABILITY_OWN_TEMPO || gBattleMons[otherSkyDropper].volatiles.confusionTurns - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; gBattlerAttacker = otherSkyDropper; @@ -4504,7 +4504,7 @@ static void HandleTurnActionSelectionState(void) gBattleStruct->moveTarget[battler] = gBattleResources->bufferB[battler][3]; if (IsBattleMoveStatus(gChosenMoveByBattler[battler]) && GetBattlerAbility(battler) == ABILITY_MYCELIUM_MIGHT) gProtectStructs[battler].myceliumMight = TRUE; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LAGGING_TAIL) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LAGGING_TAIL) gProtectStructs[battler].laggingTail = TRUE; // Check to see if any gimmicks need to be prepared. @@ -4812,7 +4812,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h u32 GetBattlerTotalSpeedStat(u32 battler) { u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } @@ -4857,7 +4857,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) gProtectStructs[battler].pranksterElevated = 1; priority++; } - else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) + else if (GetMoveEffect(move) == EFFECT_GRASSY_GLIDE && IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_GRASSY_TERRAIN) && GetActiveGimmick(gBattlerAttacker) != GIMMICK_DYNAMAX && !IsGimmickSelected(battler, GIMMICK_DYNAMAX)) { priority++; } @@ -4937,9 +4937,9 @@ s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenM s32 priority1 = 0, priority2 = 0; u32 ability1 = GetBattlerAbility(battler1); u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); u32 ability2 = GetBattlerAbility(battler2); if (!ignoreChosenMoves) @@ -5277,8 +5277,8 @@ static void TryChangeTurnOrder(void) static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { u32 ability1 = GetBattlerAbility(battler1); - enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2); u32 ability2 = GetBattlerAbility(battler2); // Battler 1 @@ -5323,14 +5323,14 @@ static void CheckChangingTurnOrderEffects(void) { gLastUsedItem = gBattleMons[battler].item; PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_CUSTAP_BERRY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_CUSTAP_BERRY) { // don't record berry since its gone now BattleScriptExecute(BattleScript_CustapBerryActivation); } else { - RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler, FALSE)); + RecordItemEffectBattle(battler, GetBattlerHoldEffect(battler)); BattleScriptExecute(BattleScript_QuickClawActivation); } } @@ -5858,7 +5858,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState { species = gBattleMons[battler].species; heldItem = gBattleMons[battler].item; - holdEffect = GetBattlerHoldEffect(battler, TRUE); + holdEffect = GetBattlerHoldEffect(battler); ability = GetBattlerAbility(battler); type1 = gBattleMons[battler].types[0]; type2 = gBattleMons[battler].types[1]; @@ -6000,7 +6000,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState case EFFECT_TERRAIN_PULSE: if (state == MON_IN_BATTLE) { - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_TERRAIN_ANY)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) return TYPE_ELECTRIC; @@ -6083,7 +6083,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) { u32 moveType; u32 heldItem = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); gBattleStruct->dynamicMoveType = 0; gBattleStruct->battlerState[battler].ateBoost = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f5e849f4bc..8db823c8c3 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1073,7 +1073,7 @@ bool32 IsMovePowderBlocked(struct BattleContext *ctx) RecordAbilityBattle(ctx->battlerDef, ABILITY_OVERCOAT); effect = TRUE; } - else if (GetBattlerHoldEffect(ctx->battlerDef, TRUE) == HOLD_EFFECT_SAFETY_GOGGLES) + else if (GetBattlerHoldEffect(ctx->battlerDef) == HOLD_EFFECT_SAFETY_GOGGLES) { RecordItemEffectBattle(ctx->battlerDef, HOLD_EFFECT_SAFETY_GOGGLES); gLastUsedItem = gBattleMons[ctx->battlerDef].item; @@ -1281,7 +1281,7 @@ static void Cmd_attackcanceler(void) && ctx.moveEffect != EFFECT_COUNTER && ctx.moveEffect != EFFECT_UPPER_HAND) { - if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove)) + if (!CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_ATTACKCANCELLER_CHECK); gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; @@ -1297,7 +1297,7 @@ static void Cmd_attackcanceler(void) gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr = cmd->nextInstr; } - else if (gProtectStructs[gBattlerTarget].beakBlastCharge && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove)) + else if (gProtectStructs[gBattlerTarget].beakBlastCharge && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = TRUE; gBattlescriptCurrInstr = cmd->nextInstr; @@ -1365,7 +1365,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u enum BattleMoveEffects effect = GetMoveEffect(move); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); if (move == NO_ACC_CALC_CHECK_LOCK_ON) { @@ -1421,7 +1421,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u || CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT)) continue; - u32 holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + u32 holdEffectDef = GetBattlerHoldEffect(battlerDef); u32 accuracy = GetTotalAccuracy(gBattlerAttacker, battlerDef, move, @@ -1680,7 +1680,7 @@ static void Cmd_critcalc(void) abilityAtk = GetBattlerAbility(gBattlerAttacker), battlerDef; bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); - enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); gPotentialItemEffectBattler = gBattlerAttacker; for (battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -1799,8 +1799,8 @@ static void Cmd_typecalc(void) ctx.updateFlags = TRUE; ctx.abilityAtk = GetBattlerAbility(gBattlerAttacker); ctx.abilityDef = GetBattlerAbility(gBattlerTarget); - ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker); + ctx.holdEffectDef = GetBattlerHoldEffect(gBattlerTarget); CalcTypeEffectivenessMultiplier(&ctx); } @@ -1858,7 +1858,7 @@ static void Cmd_adjustdamage(void) if (gBattleMons[gBattlerTarget].hp > gBattleStruct->moveDamage[battlerDef]) continue; - holdEffect = GetBattlerHoldEffect(battlerDef, TRUE); + holdEffect = GetBattlerHoldEffect(battlerDef); param = GetBattlerHoldEffectParam(battlerDef); affectionScore = GetBattlerAffectionHearts(battlerDef); @@ -2820,7 +2820,7 @@ static inline bool32 TrySetReflect(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_REFLECT)) { gSideStatuses[side] |= SIDE_STATUS_REFLECT; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[side].reflectTimer = gBattleTurnCounter + 8; else gSideTimers[side].reflectTimer = gBattleTurnCounter + 5; @@ -2841,7 +2841,7 @@ static inline bool32 TrySetLightScreen(u32 battler) if (!(gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN)) { gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8; else gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5; @@ -3134,7 +3134,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai else { gBattleMons[gEffectBattler].volatiles.wrapped = TRUE; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? 7 : 5; else gDisableStructs[gEffectBattler].wrapTurns = B_BINDING_TURNS >= GEN_5 ? RandomUniform(RNG_WRAP, 4, 5) : RandomUniform(RNG_WRAP, 2, 5); @@ -3397,7 +3397,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai break; case MOVE_EFFECT_INCINERATE: if ((gBattleMons[gEffectBattler].item >= FIRST_BERRY_INDEX && gBattleMons[gEffectBattler].item <= LAST_BERRY_INDEX) - || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler, FALSE) == HOLD_EFFECT_GEMS)) + || (B_INCINERATE_GEMS >= GEN_6 && GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_GEMS)) { gLastUsedItem = gBattleMons[gEffectBattler].item; gBattleMons[gEffectBattler].item = 0; @@ -3410,7 +3410,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai } break; case MOVE_EFFECT_BUG_BITE: - if (GetBattlerHoldEffect(gEffectBattler, TRUE) == HOLD_EFFECT_JABOCA_BERRY) + if (GetBattlerHoldEffect(gEffectBattler) == HOLD_EFFECT_JABOCA_BERRY) { // jaboca berry triggers instead of being stolen gBattlescriptCurrInstr++; @@ -3815,7 +3815,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai { gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_TERRAIN_EXTENDER) gFieldTimers.terrainTimer = gBattleTurnCounter + 8; else gFieldTimers.terrainTimer = gBattleTurnCounter + 5; @@ -3864,7 +3864,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai if (!(gSideStatuses[GetBattlerSide(gBattlerAttacker)] & SIDE_STATUS_AURORA_VEIL)) { gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; else gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; @@ -3894,7 +3894,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, bool32 primary, bool32 certai if (!gBattleMons[battler].volatiles.wrapped) { gBattleMons[battler].volatiles.wrapped = TRUE; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_GRIP_CLAW) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_GRIP_CLAW) gDisableStructs[battler].wrapTurns = (B_BINDING_TURNS >= GEN_5) ? 7 : 5; else gDisableStructs[battler].wrapTurns = (Random() % 2) + 4; @@ -5507,7 +5507,7 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { - if (GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_BUTTON + if (GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_BUTTON && battlerAtk != battlerDef && IsBattlerTurnDamaged(battlerDef) && IsBattlerAlive(battlerDef) @@ -5521,7 +5521,7 @@ static inline bool32 CanEjectButtonTrigger(u32 battlerAtk, u32 battlerDef, enum static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect) { if (gDisableStructs[battlerDef].tryEjectPack - && GetBattlerHoldEffect(battlerDef, TRUE) == HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(battlerDef) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(battlerDef) && CountUsablePartyMons(battlerDef) > 0 && !gProtectStructs[battlerDef].disableEjectPack @@ -5750,7 +5750,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect) } break; case EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget, TRUE)) + if (!IsBattlerGrounded(gBattlerTarget, GetBattlerAbility(gBattlerTarget), GetBattlerHoldEffect(gBattlerTarget)) && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) @@ -5914,7 +5914,7 @@ static void Cmd_moveend(void) { case PROTECT_SPIKY_SHIELD: if (moveEffect != EFFECT_COUNTER - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_MAGIC_GUARD)) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; @@ -5927,7 +5927,7 @@ static void Cmd_moveend(void) } break; case PROTECT_KINGS_SHIELD: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -5942,7 +5942,7 @@ static void Cmd_moveend(void) } break; case PROTECT_BANEFUL_BUNKER: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; @@ -5953,7 +5953,7 @@ static void Cmd_moveend(void) } break; case PROTECT_BURNING_BULWARK: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE)) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker))) { gEffectBattler = @@ -5967,7 +5967,7 @@ static void Cmd_moveend(void) case PROTECT_OBSTRUCT: if (moveEffect != EFFECT_SUCKER_PUNCH // Why??? && moveEffect != EFFECT_UPPER_HAND // Why??? - && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + && !IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -5979,7 +5979,7 @@ static void Cmd_moveend(void) } break; case PROTECT_SILK_TRAP: - if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker, TRUE))) + if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; i = gBattlerAttacker; @@ -6489,7 +6489,7 @@ static void Cmd_moveend(void) { if (i == gBattlerAttacker) continue; - if (GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_RED_CARD) + if (GetBattlerHoldEffect(i) == HOLD_EFFECT_RED_CARD) redCardBattlers |= (1u << i); } if (redCardBattlers && IsBattlerAlive(gBattlerAttacker)) @@ -6736,7 +6736,7 @@ static void Cmd_moveend(void) if (IsBattlerAlive(gBattlerAttacker) && gBattleMons[gBattlerAttacker].item != ITEM_NONE // Attacker must be holding an item && !(gWishFutureKnock.knockedOffMons[GetBattlerSide(gBattlerAttacker)] & (1u << gBattlerPartyIndexes[gBattlerAttacker])) // But not knocked off - && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) // Pickpocket requires contact + && IsMoveMakingContact(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) // Pickpocket requires contact && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Obviously attack needs to have worked { u8 battlers[4] = {0, 1, 2, 3}; @@ -7663,7 +7663,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) u32 ability = GetBattlerAbility(battler); if (ability != ABILITY_MAGIC_GUARD && IsBattlerAffectedByHazards(battler, FALSE) - && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler, TRUE))) + && IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler))) { u8 spikesDmg = (5 - gSideTimers[side].spikesAmount) * 2; gBattleStruct->moveDamage[battler] = GetNonDynamaxMaxHP(battler) / (spikesDmg); @@ -7674,7 +7674,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) break; } case HAZARDS_STICKY_WEB: - if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (IsBattlerAffectedByHazards(battler, FALSE) && IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) { gBattleScripting.battler = battler; SET_STATCHANGER(STAT_SPEED, 1, TRUE); @@ -7682,7 +7682,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType) } break; case HAZARDS_TOXIC_SPIKES: - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) break; if (IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) // Absorb the toxic spikes. @@ -8598,8 +8598,8 @@ static bool32 TrySymbiosis(u32 battler, u32 itemId, bool32 moveEnd) { if (!gBattleStruct->itemLost[B_SIDE_PLAYER][gBattlerPartyIndexes[battler]].stolen && gBattleStruct->changedItems[battler] == ITEM_NONE - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_BUTTON - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_BUTTON + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_EJECT_PACK && (B_SYMBIOSIS_GEMS < GEN_7 || !(gSpecialStatuses[battler].gemBoost)) && GetMoveEffect(gCurrentMove) != EFFECT_FLING //Fling and damage-reducing berries are handled separately. && !gSpecialStatuses[battler].berryReduced @@ -8638,7 +8638,7 @@ static void Cmd_removeitem(void) // Popped Air Balloon cannot be restored by any means. // Corroded items cannot be restored either. - if (GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_AIR_BALLOON + if (GetBattlerHoldEffect(battler) != HOLD_EFFECT_AIR_BALLOON && GetMoveEffect(gCurrentMove) != EFFECT_CORROSIVE_GAS) gBattleStruct->usedHeldItems[gBattlerPartyIndexes[battler]][GetBattlerSide(battler)] = itemId; // Remember if switched out @@ -9303,7 +9303,7 @@ static bool32 IsRototillerAffected(u32 battler) { if (!IsBattlerAlive(battler)) return FALSE; - if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE))) + if (!IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler))) return FALSE; // Only grounded battlers affected if (!IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) return FALSE; // Only grass types affected @@ -9741,7 +9741,7 @@ static void Cmd_trysetrest(void) gBattlerTarget = gBattlerAttacker; gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1); u32 ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN)) { @@ -10071,7 +10071,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan u32 index, battlerAbility; enum ItemHoldEffect battlerHoldEffect; battlerAbility = GetBattlerAbility(battler); - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); + battlerHoldEffect = GetBattlerHoldEffect(battler); gSpecialStatuses[battler].changedStatsBattlerId = gBattlerAttacker; if (battlerAbility == ABILITY_CONTRARY) @@ -10290,7 +10290,7 @@ static u32 ChangeStatBuffs(u32 battler, s8 statValue, u32 statId, union StatChan { gProtectStructs[index].activateOpportunist = 2; // set stats to copy } - if (GetBattlerHoldEffect(index, TRUE) == HOLD_EFFECT_MIRROR_HERB) + if (GetBattlerHoldEffect(index) == HOLD_EFFECT_MIRROR_HERB) { gProtectStructs[index].eatMirrorHerb = 1; } @@ -10770,7 +10770,7 @@ static void Cmd_tryKO(void) CMD_ARGS(const u8 *failInstr); enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); u16 targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); @@ -12180,7 +12180,7 @@ static void Cmd_recoverbasedonsunlight(void) } else if (GetGenConfig(GEN_CONFIG_TIME_OF_DAY_HEALING_MOVES) != GEN_2) { - if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / 2; else if (gBattleWeather & B_WEATHER_SUN) gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; @@ -12212,7 +12212,7 @@ static void Cmd_recoverbasedonsunlight(void) break; } - if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (!(gBattleWeather & B_WEATHER_ANY) || !HasWeatherEffect() || GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_UTILITY_UMBRELLA) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 4; else if (gBattleWeather & B_WEATHER_SUN) gBattleStruct->moveDamage[gBattlerAttacker] = healingModifier * GetNonDynamaxMaxHP(gBattlerAttacker) / 2; @@ -12669,7 +12669,7 @@ static void Cmd_tryswapitems(void) static bool32 CanAbilityShieldActivateForBattler(u32 battler) { - if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(battler) != HOLD_EFFECT_ABILITY_SHIELD) return FALSE; RecordItemEffectBattle(battler, HOLD_EFFECT_ABILITY_SHIELD); @@ -12757,7 +12757,7 @@ static void Cmd_setgastroacid(void) { gBattlescriptCurrInstr = cmd->failInstr; } - else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + else if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); gBattlescriptCurrInstr = cmd->failInstr; @@ -12776,7 +12776,7 @@ static void Cmd_setyawn(void) { CMD_ARGS(const u8 *failInstr); u32 ability = GetBattlerAbility(gBattlerTarget); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget); if (gBattleMons[gBattlerTarget].volatiles.yawn || gBattleMons[gBattlerTarget].status1 & STATUS1_ANY) @@ -14993,7 +14993,7 @@ void BS_SetTerrain(void) default: break; } - enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; @@ -15006,7 +15006,7 @@ void BS_JumpIfTerrainAffected(void) NATIVE_ARGS(u8 battler, u32 flags, const u8 *jumpInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), cmd->flags)) + if (IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), cmd->flags)) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; @@ -16306,7 +16306,7 @@ void BS_TryBoosterEnergy(void) for (u32 orderNum = 0; orderNum < gBattlersCount; orderNum++) { u32 battlerByTurnOrder = gBattlerByTurnOrder[orderNum]; - if (GetBattlerHoldEffect(battlerByTurnOrder, TRUE) != HOLD_EFFECT_BOOSTER_ENERGY) + if (GetBattlerHoldEffect(battlerByTurnOrder) != HOLD_EFFECT_BOOSTER_ENERGY) continue; u32 ability = GetBattlerAbility(battlerByTurnOrder); @@ -16417,7 +16417,7 @@ void BS_JumpIfHoldEffect(void) { NATIVE_ARGS(u8 battler, u8 holdEffect, const u8 *jumpInstr, u8 equal); u32 battler = GetBattlerForBattleScript(cmd->battler); - if ((GetBattlerHoldEffect(battler, TRUE) == cmd->holdEffect) == cmd->equal) + if ((GetBattlerHoldEffect(battler) == cmd->holdEffect) == cmd->equal) { if (cmd->equal) gLastUsedItem = gBattleMons[battler].item; // For B_LAST_USED_ITEM @@ -16502,7 +16502,7 @@ void BS_TryFriskMessage(void) && gBattleMons[gBattlerTarget].item != ITEM_NONE) { gLastUsedItem = gBattleMons[gBattlerTarget].item; - RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffect(gBattlerTarget, FALSE)); + RecordItemEffectBattle(gBattlerTarget, GetBattlerHoldEffectIgnoreNegation(gBattlerTarget)); // If Frisk identifies two mons' items, show the pop-up only once. if (gBattleStruct->friskedAbility) { @@ -16956,7 +16956,7 @@ void BS_TryActivateReceiver(void) u32 partnerAbility = GetBattlerAbility(gBattlerAbility); if (IsBattlerAlive(gBattlerAbility) && (partnerAbility == ABILITY_RECEIVER || partnerAbility == ABILITY_POWER_OF_ALCHEMY) - && GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_ABILITY_SHIELD + && GetBattlerHoldEffect(battler) != HOLD_EFFECT_ABILITY_SHIELD && !gAbilitiesInfo[gBattleMons[battler].ability].cantBeCopied) { gBattleStruct->tracedAbility[gBattlerAbility] = gBattleMons[battler].ability; // re-using the variable for trace @@ -17412,7 +17412,7 @@ void BS_SetAuroraVeil(void) else { gSideStatuses[side] |= SIDE_STATUS_AURORA_VEIL; - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LIGHT_CLAY) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY) gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8; else gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5; @@ -17499,7 +17499,7 @@ void BS_TryRoomService(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) { BattleScriptCall(BattleScript_ConsumableStatRaiseRet); } @@ -17513,7 +17513,7 @@ void BS_TryTerrainSeed(void) { NATIVE_ARGS(u8 battler, const u8 *failInstr); u32 battler = GetBattlerForBattleScript(cmd->battler); - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SEEDS) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SEEDS) { enum ItemEffect effect = ITEM_NO_EFFECT; u16 item = gBattleMons[battler].item; diff --git a/src/battle_terastal.c b/src/battle_terastal.c index c083ca0575..05b27a48ff 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -62,7 +62,7 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) // Returns whether a battler can Terastallize. bool32 CanTerastallize(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (gBattleMons[battler].volatiles.transformed && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 45b7bb8d83..f104d75bed 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -225,8 +225,8 @@ static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u3 ctx.updateFlags = recordAbilities; ctx.abilityAtk = abilityAtk; ctx.abilityDef = abilityDef; - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); return CalcTypeEffectivenessMultiplier(&ctx); } @@ -319,7 +319,7 @@ bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move) if (effect == EFFECT_PURSUIT && IsPursuitTargetSet()) return FALSE; - if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk, TRUE))) + if (gSideTimers[defSide].followmePowder && !IsAffectedByPowder(battlerAtk, ability, GetBattlerHoldEffect(battlerAtk))) return FALSE; return TRUE; @@ -1074,7 +1074,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) u32 ability = GetBattlerAbility(otherSkyDropper); if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0 || IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO) - || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper, TRUE), STATUS_FIELD_MISTY_TERRAIN))) + || IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN))) { // Set confused status gBattleMons[otherSkyDropper].volatiles.confusionTurns = ((Random()) % 4) + 2; @@ -1337,7 +1337,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; u32 move = gBattleMons[battler].moves[moveId]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; enum BattleMoveEffects moveEffect = GetMoveEffect(move); @@ -1599,7 +1599,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move; enum BattleMoveEffects moveEffect; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; @@ -1770,7 +1770,7 @@ bool32 BattleArenaTurnEnd(void) // Ingrain, Leech Seed, Strength Sap and Aqua Ring s32 GetDrainedBigRootHp(u32 battler, s32 hp) { - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_BIG_ROOT) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_BIG_ROOT) hp = (hp * 1300) / 1000; if (hp == 0) hp = 1; @@ -2326,7 +2326,7 @@ static enum MoveCanceller CancellerZMoves(struct BattleContext *ctx) static enum MoveCanceller CancellerChoiceLock(struct BattleContext *ctx) { u16 *choicedMoveAtk = &gBattleStruct->choicedMove[ctx->battlerAtk]; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(ctx->battlerAtk); if (gChosenMove != MOVE_STRUGGLE && (*choicedMoveAtk == MOVE_NONE || *choicedMoveAtk == MOVE_UNAVAILABLE) @@ -2811,7 +2811,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx) } else if (GetMoveStrikeCount(ctx->currentMove) > 1) { - if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (ctx->moveEffect == EFFECT_POPULATION_BOMB && GetBattlerHoldEffect(ctx->battlerAtk) == HOLD_EFFECT_LOADED_DICE) { gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 10); } @@ -3150,7 +3150,7 @@ bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbilit gBattleWeather = sBattleWeatherInfo[battleWeatherId].flag; if (gBattleWeather & B_WEATHER_PRIMAL_ANY) gWishFutureKnock.weatherDuration = 0; - else if (rock != 0 && GetBattlerHoldEffect(battler, TRUE) == rock) + else if (rock != 0 && GetBattlerHoldEffect(battler) == rock) gWishFutureKnock.weatherDuration = 8; else gWishFutureKnock.weatherDuration = 5; @@ -3168,7 +3168,7 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u16 *timer) gFieldStatuses |= statusFlag; gDisableStructs[battler].terrainAbilityDone = FALSE; - if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) + if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_EXTENDER) *timer = gBattleTurnCounter + 8; else *timer = gBattleTurnCounter + 5; @@ -3377,7 +3377,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a CancelMultiTurnMoves(battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK); // Don't cancel moves that can hit two targets bc one target might not be protected battleScriptBlocksMove = BattleScript_DoesntAffectTargetAtkString; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_PSYCHIC_TERRAIN) // Not an ability but similar conditions && !IsBattlerAlly(battlerAtk, battlerDef) && GetMoveTarget(move) != MOVE_TARGET_ALL_BATTLERS && GetMoveTarget(move) != MOVE_TARGET_OPPONENTS_FIELD) @@ -3832,7 +3832,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (gSpecialStatuses[battler].switchInAbilityDone) break; - if (GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD) break; side = (BATTLE_OPPOSITE(GetBattlerPosition(battler))) & BIT_SIDE; @@ -4864,13 +4864,13 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_MUMMY: if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && gDisableStructs[gBattlerAttacker].overwrittenAbility != GetBattlerAbility(gBattlerTarget) && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) { - if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; @@ -4887,16 +4887,16 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_WANDERING_SPIRIT: if (IsBattlerAlive(gBattlerAttacker) && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !(GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSwapped) { - if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerAttacker) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerAttacker, HOLD_EFFECT_ABILITY_SHIELD); break; } - if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) + if (GetBattlerHoldEffectIgnoreAbility(gBattlerTarget) == HOLD_EFFECT_ABILITY_SHIELD) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_ABILITY_SHIELD); break; @@ -4928,7 +4928,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && (CompareStat(gBattlerAttacker, STAT_SPEED, MIN_STAT_STAGE, CMP_GREATER_THAN) || GetBattlerAbility(gBattlerAttacker) == ABILITY_MIRROR_ARMOR) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { SET_STATCHANGER(STAT_SPEED, 1, TRUE); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gLastUsedAbility); @@ -4942,7 +4942,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { gBattleStruct->moveDamage[gBattlerAttacker] = GetNonDynamaxMaxHP(gBattlerAttacker) / (B_ROUGH_SKIN_DMG >= GEN_4 ? 8 : 16); if (gBattleStruct->moveDamage[gBattlerAttacker] == 0) @@ -4956,7 +4956,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { if ((battler = IsAbilityOnField(ABILITY_DAMP))) { @@ -4994,7 +4994,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6) && abilityAtk != ABILITY_OVERCOAT - && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES) + && GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_SAFETY_GOGGLES) { u32 poison, paralysis, sleep; @@ -5021,7 +5021,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBeSlept(gBattlerTarget, gBattlerAttacker, abilityAtk, NOT_BLOCKED_BY_SLEEP_CLAUSE) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move)) { if (IsSleepClauseEnabled()) gBattleStruct->battlerState[gBattlerAttacker].sleepClauseEffectExempt = TRUE; @@ -5045,7 +5045,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, abilityAtk) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5067,7 +5067,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && CanBeParalyzed(gBattlerTarget, gBattlerAttacker, abilityAtk) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker, TRUE), move)) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerHoldEffect(gBattlerAttacker), move)) { gEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerTarget; @@ -5082,7 +5082,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 case ABILITY_FLAME_BODY: if (IsBattlerAlive(gBattlerAttacker) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) && CanBeBurned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerAttacker)) && (B_ABILITY_TRIGGER_CHANCE >= GEN_4 ? RandomPercentage(RNG_FLAME_BODY, 30) : RandomChance(RNG_FLAME_BODY, 1, 3))) @@ -5104,7 +5104,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && !(gBattleMons[gBattlerAttacker].volatiles.infatuation) && AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget) && !IsAbilityAndRecord(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), ABILITY_OBLIVIOUS) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)) { gBattleMons[gBattlerAttacker].volatiles.infatuation = INFATUATED_WITH(gBattlerTarget); @@ -5164,7 +5164,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (!gProtectStructs[gBattlerAttacker].confusionSelfDmg && IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(battler) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && !gBattleMons[gBattlerAttacker].volatiles.perishSong) { if (!gBattleMons[battler].volatiles.perishSong) @@ -5262,7 +5262,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 if (IsBattlerAlive(gBattlerTarget) && !gProtectStructs[gBattlerAttacker].confusionSelfDmg && CanBePoisoned(gBattlerAttacker, gBattlerTarget, gLastUsedAbility, GetBattlerAbility(gBattlerTarget)) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), move) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), move) && IsBattlerTurnDamaged(gBattlerTarget) // Need to actually hit the target && RandomPercentage(RNG_POISON_TOUCH, 30)) { @@ -5634,7 +5634,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 bool32 TryPrimalReversion(u32 battler) { - if (GetBattlerHoldEffect(battler, FALSE) == HOLD_EFFECT_PRIMAL_ORB + if (GetBattlerHoldEffectIgnoreNegation(battler) == HOLD_EFFECT_PRIMAL_ORB && GetBattleFormChangeTargetSpecies(battler, FORM_CHANGE_BATTLE_PRIMAL_REVERSION) != gBattleMons[battler].species) { gBattleScripting.battler = battler; @@ -5704,7 +5704,7 @@ u32 GetBattlerAbility(u32 battler) u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield) { - bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler, TRUE) == HOLD_EFFECT_ABILITY_SHIELD; + bool32 hasAbilityShield = !noAbilityShield && GetBattlerHoldEffectIgnoreAbility(battler) == HOLD_EFFECT_ABILITY_SHIELD; bool32 abilityCantBeSuppressed = gAbilitiesInfo[gBattleMons[battler].ability].cantBeSuppressed; if (abilityCantBeSuppressed) @@ -5781,7 +5781,7 @@ u32 IsAbilityPreventingEscape(u32 battler) if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return 0; - bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE)); + bool32 isBattlerGrounded = IsBattlerGrounded(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler)); for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) { if (battler == battlerDef || IsBattlerAlly(battler, battlerDef)) @@ -5806,7 +5806,7 @@ bool32 CanBattlerEscape(u32 battler) // no ability check { if (gBattleStruct->battlerState[battler].commanderSpecies != SPECIES_NONE) return FALSE; - else if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_SHED_SHELL) + else if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_SHED_SHELL) return TRUE; else if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -6024,7 +6024,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u { battleScript = BattleScript_SleepClauseBlocked; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_ELECTRIC_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_ELECTRIC_TERRAIN)) { battleScript = BattleScript_ElectricTerrainPrevents; } @@ -6072,7 +6072,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u abilityAffected = TRUE; battleScript = BattleScript_AbilityProtectsDoesntAffect; } - else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef, TRUE), STATUS_FIELD_MISTY_TERRAIN)) + else if (IsBattlerTerrainAffected(battlerDef, abilityDef, GetBattlerHoldEffect(battlerDef), STATUS_FIELD_MISTY_TERRAIN)) { battleScript = BattleScript_MistyTerrainPrevents; } @@ -6151,7 +6151,7 @@ bool32 CanBeConfused(u32 battler) { u32 ability = GetBattlerAbility(battler); if (gBattleMons[battler].volatiles.confusionTurns > 0 - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO)) return FALSE; return TRUE; @@ -6887,11 +6887,11 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) if (caseID != ITEMEFFECT_USE_LAST_ITEM) { gLastUsedItem = gBattleMons[battler].item; - battlerHoldEffect = GetBattlerHoldEffect(battler, TRUE); + battlerHoldEffect = GetBattlerHoldEffect(battler); } atkItem = gBattleMons[gBattlerAttacker].item; - atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker); atkHoldEffectParam = GetBattlerHoldEffectParam(gBattlerAttacker); switch (caseID) @@ -7310,7 +7310,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case ITEMEFFECT_MOVE_END: for (battler = 0; battler < gBattlersCount; battler++) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ShouldWaitWithActivation(battler, holdEffect)) continue; @@ -7427,7 +7427,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) break; case HOLD_EFFECT_ROCKY_HELMET: if (IsBattlerTurnDamaged(gBattlerTarget) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) && IsBattlerAlive(gBattlerAttacker) && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { @@ -7551,7 +7551,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler) case HOLD_EFFECT_STICKY_BARB: if (IsBattlerTurnDamaged(gBattlerTarget) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) - && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker, TRUE), gCurrentMove) + && !CanBattlerAvoidContactEffects(gBattlerAttacker, gBattlerTarget, GetBattlerAbility(gBattlerAttacker), GetBattlerHoldEffect(gBattlerAttacker), gCurrentMove) && !DoesSubstituteBlockMove(gBattlerAttacker, battler, gCurrentMove) && IsBattlerAlive(gBattlerAttacker) && CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) @@ -7884,27 +7884,24 @@ u8 GetAttackerObedienceForAction() } } -enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler) { - return GetBattlerHoldEffectInternal(battler, checkNegating, TRUE); + return GetBattlerHoldEffectInternal(battler, GetBattlerAbility(battler)); } -enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler) { - return GetBattlerHoldEffectInternal(battler, checkNegating, FALSE); + return GetBattlerHoldEffectInternal(battler, ABILITY_NONE); } -enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility) +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability) { - if (checkNegating) - { - if (gBattleMons[battler].volatiles.embargo) - return HOLD_EFFECT_NONE; - if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) - return HOLD_EFFECT_NONE; - if (checkAbility && GetBattlerAbility(battler) == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) - return HOLD_EFFECT_NONE; - } + if (gBattleMons[battler].volatiles.embargo) + return HOLD_EFFECT_NONE; + if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) + return HOLD_EFFECT_NONE; + if (ability == ABILITY_KLUTZ && !gBattleMons[battler].volatiles.gastroAcid) + return HOLD_EFFECT_NONE; gPotentialItemEffectBattler = battler; @@ -7914,6 +7911,15 @@ enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegati return GetItemHoldEffect(gBattleMons[battler].item); } +enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler) +{ + gPotentialItemEffectBattler = battler; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY_E_READER) + return gEnigmaBerries[battler].holdEffect; + else + return GetItemHoldEffect(gBattleMons[battler].item); +} + static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item) { if (item == ITEM_ENIGMA_BERRY_E_READER) @@ -7978,7 +7984,7 @@ bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move) if (IsZMove(move) || IsMaxMove(move)) return FALSE; // Z-Moves and Max Moves bypass protection (except Max Guard). if (GetBattlerAbility(battlerAtk) == ABILITY_UNSEEN_FIST - && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk, TRUE), move)) + && IsMoveMakingContact(battlerAtk, battlerDef, ABILITY_UNSEEN_FIST, GetBattlerHoldEffect(battlerAtk), move)) return FALSE; } @@ -8104,7 +8110,7 @@ u32 GetBattlerWeight(u32 battler) u32 i; u32 weight = GetSpeciesWeight(gBattleMons[battler].species); u32 ability = GetBattlerAbility(battler); - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (ability == ABILITY_HEAVY_METAL) weight *= 2; @@ -8432,7 +8438,7 @@ static inline u32 CalcMoveBasePower(struct DamageContext *ctx) case EFFECT_ACROBATICS: if (gBattleMons[battlerAtk].item == ITEM_NONE // Edge case, because removal of items happens after damage calculation. - || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk, FALSE) == HOLD_EFFECT_GEMS)) + || (gSpecialStatuses[battlerAtk].gemBoost && GetBattlerHoldEffect(battlerAtk) == HOLD_EFFECT_GEMS)) basePower *= 2; break; case EFFECT_LOW_KICK: @@ -9819,8 +9825,8 @@ static inline s32 DoMoveDamageCalc(struct DamageContext *ctx) ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); return DoMoveDamageCalcVars(ctx); } @@ -9908,8 +9914,8 @@ s32 CalculateMoveDamage(struct DamageContext *ctx) ctx->weather = GetWeather(); ctx->abilityAtk = GetBattlerAbility(ctx->battlerAtk); ctx->abilityDef = GetBattlerAbility(ctx->battlerDef); - ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk, TRUE); - ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef, TRUE); + ctx->holdEffectAtk = GetBattlerHoldEffect(ctx->battlerAtk); + ctx->holdEffectDef = GetBattlerHoldEffect(ctx->battlerDef); ctx->typeEffectivenessModifier = CalcTypeEffectivenessMultiplier(ctx); @@ -9995,8 +10001,8 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType, ctx.updateFlags = FALSE; ctx.abilityAtk = GetBattlerAbility(battlerAtk); ctx.abilityDef = ABILITY_ILLUSION; - ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk, TRUE); - ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef, TRUE); + ctx.holdEffectAtk = GetBattlerHoldEffect(battlerAtk); + ctx.holdEffectDef = GetBattlerHoldEffect(battlerDef); MulByTypeEffectiveness(&ctx, &presumedModifier, GetSpeciesType(illusionSpecies, 0)); if (GetSpeciesType(illusionSpecies, 1) != GetSpeciesType(illusionSpecies, 0)) @@ -10296,7 +10302,7 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) bool32 CanMegaEvolve(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Mega Ring. if (!TESTING @@ -10334,7 +10340,7 @@ bool32 CanMegaEvolve(u32 battler) bool32 CanUltraBurst(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has a Z-Ring if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT @@ -11037,7 +11043,7 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem) bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) { bool32 ret = TRUE; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler); if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { ret = FALSE; @@ -11173,7 +11179,7 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) if (gBattleWeather & weatherFlags && HasWeatherEffect()) { // given weather is active -> check if its sun, rain against utility umbrella (since only 1 weather can be active at once) - if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_UTILITY_UMBRELLA) + if (gBattleWeather & (B_WEATHER_SUN | B_WEATHER_RAIN) && GetBattlerHoldEffect(battler) == HOLD_EFFECT_UTILITY_UMBRELLA) return FALSE; // utility umbrella blocks sun, rain effects return TRUE; @@ -11189,7 +11195,7 @@ u32 GetBattlerMoveTargetType(u32 battler, u32 move) enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return MOVE_TARGET_USER; - if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_PSYCHIC_TERRAIN)) + if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, GetBattlerAbility(battler), GetBattlerHoldEffect(battler), STATUS_FIELD_PSYCHIC_TERRAIN)) return MOVE_TARGET_BOTH; if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) return MOVE_TARGET_BOTH; @@ -11212,7 +11218,7 @@ bool32 CanTargetBattler(u32 battlerAtk, u32 battlerDef, u16 move) static void SetRandomMultiHitCounter() { - if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_LOADED_DICE) + if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LOADED_DICE) gMultiHitCounter = RandomUniform(RNG_LOADED_DICE, 4, 5); else if (GetGenConfig(GEN_CONFIG_MULTI_HIT_CHANCE) >= GEN_5) gMultiHitCounter = RandomWeighted(RNG_HITS, 0, 0, 7, 7, 3, 3); // 35%: 2 hits, 35%: 3 hits, 15% 4 hits, 15% 5 hits. @@ -11276,7 +11282,7 @@ static bool32 CanBeInfinitelyConfused(u32 battler) { u32 ability = GetBattlerAbility(battler); if (ability == ABILITY_OWN_TEMPO - || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler, TRUE), STATUS_FIELD_MISTY_TERRAIN) + || IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD) return FALSE; return TRUE; @@ -11664,7 +11670,7 @@ bool32 IsMoveEffectBlockedByTarget(u32 ability) RecordAbilityBattle(gBattlerTarget, ability); return TRUE; } - else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_COVERT_CLOAK) + else if (GetBattlerHoldEffect(gBattlerTarget) == HOLD_EFFECT_COVERT_CLOAK) { RecordItemEffectBattle(gBattlerTarget, HOLD_EFFECT_COVERT_CLOAK); return TRUE; @@ -11756,7 +11762,7 @@ void UpdateStallMons(void) bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) { if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + || GetBattlerHoldEffect(battler) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice { if (ItemBattleEffects(caseId, battler)) return TRUE; @@ -11773,7 +11779,7 @@ bool32 TrySwitchInEjectPack(enum ItemCaseId caseID) for (u32 i = 0; i < gBattlersCount; i++) { if (gDisableStructs[i].tryEjectPack - && GetBattlerHoldEffect(i, TRUE) == HOLD_EFFECT_EJECT_PACK + && GetBattlerHoldEffect(i) == HOLD_EFFECT_EJECT_PACK && IsBattlerAlive(i) && CountUsablePartyMons(i) > 0) { diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 1c5a6118a8..78d4ddc60f 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -113,7 +113,7 @@ bool32 IsZMove(u32 move) bool32 CanUseZMove(u32 battler) { - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); // Check if Player has Z-Power Ring. if (!TESTING && (battler == B_POSITION_PLAYER_LEFT @@ -144,7 +144,7 @@ bool32 CanUseZMove(u32 battler) u32 GetUsableZMove(u32 battler, u32 move) { u32 item = gBattleMons[battler].item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) { @@ -167,7 +167,7 @@ void ActivateZMove(u32 battler) bool32 IsViableZMove(u32 battler, u32 move) { u32 item; - enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffectIgnoreNegation(battler); int moveSlotIndex; item = gBattleMons[battler].item;