GetBattlerHoldEffect clean up (#7819)

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
Alex 2025-09-29 17:16:15 +02:00 committed by GitHub
parent b2c5a82003
commit a818b97732
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 169 additions and 162 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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))

View File

@ -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))

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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)
{

View File

@ -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;