New function to check ability stat loss

This commit is contained in:
Alex 2023-10-20 12:29:55 +02:00
parent f3580aa3f5
commit ab6c5bafe9
2 changed files with 22 additions and 10 deletions

View file

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

View file

@ -2792,7 +2792,6 @@ u8 DoBattlerEndTurnEffects(void)
break;
case ENDTURN_OCTOLOCK:
{
u16 battlerAbility = GetBattlerAbility(battler);
if (gDisableStructs[battler].octolock)
{
gBattlerTarget = battler;