From ab6c5bafe9e47651b9cae2ece93c1c4a06ee16b6 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 20 Oct 2023 12:29:55 +0200 Subject: [PATCH] New function to check ability stat loss --- src/battle_script_commands.c | 31 ++++++++++++++++++++++--------- src/battle_util.c | 1 - 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index da647034a5..0cdb99e932 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -355,6 +355,7 @@ static void TryUpdateRoundTurnOrder(void); static bool32 ChangeOrderTargetAfterAttacker(void); void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler); static void RemoveAllTerrains(void); +static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 isIntimidate); static void Cmd_attackcanceler(void); static void Cmd_accuracycheck(void); @@ -11390,15 +11391,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; } - else if (((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET - || battlerAbility == ABILITY_CLEAR_BODY - || battlerAbility == ABILITY_FULL_METAL_BODY - || battlerAbility == ABILITY_WHITE_SMOKE) - || ((B_UPDATED_INTIMIDATE >= GEN_8) && statId == STAT_ATK - && (battlerAbility == ABILITY_INNER_FOCUS - || battlerAbility == ABILITY_SCRAPPY - || battlerAbility == ABILITY_OWN_TEMPO - || battlerAbility == ABILITY_OBLIVIOUS))) + else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET + || CanAbilityPreventStatLoss(battlerAbility, GetBattlerAbility(gBattlerAttacker) == ABILITY_INTIMIDATE)) && (!affectsUser || mirrorArmored) && !certain && gCurrentMove != MOVE_CURSE) { if (flags == STAT_CHANGE_ALLOW_PTR) @@ -15703,6 +15697,25 @@ static bool8 IsFinalStrikeEffect(u16 move) return FALSE; } +static bool8 CanAbilityPreventStatLoss(u16 abilityDef, bool8 isIntimidate) +{ + switch (abilityDef) + { + case ABILITY_CLEAR_BODY: + case ABILITY_FULL_METAL_BODY: + case ABILITY_WHITE_SMOKE: + return TRUE; + case ABILITY_INNER_FOCUS: + case ABILITY_SCRAPPY: + case ABILITY_OWN_TEMPO: + case ABILITY_OBLIVIOUS: + if (isIntimidate && (B_UPDATED_INTIMIDATE >= GEN_8)) + return TRUE; + break; + } + return FALSE; +} + void BS_CheckParentalBondCounter(void) { NATIVE_ARGS(u8 counter, const u8 *jumpInstr); diff --git a/src/battle_util.c b/src/battle_util.c index 12dcb256a3..d0bb6e8c3c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2792,7 +2792,6 @@ u8 DoBattlerEndTurnEffects(void) break; case ENDTURN_OCTOLOCK: { - u16 battlerAbility = GetBattlerAbility(battler); if (gDisableStructs[battler].octolock) { gBattlerTarget = battler;