From 4782f713f2e0cde617a06add661ce57fdec2743d Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 12 Feb 2021 08:57:57 -0700 Subject: [PATCH] update semi invulnerable state check --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 2 +- src/battle_ai_util.c | 23 +++++++++++++++-------- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index fffd85c5b5..547ec060f8 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -115,6 +115,7 @@ bool32 IsStatLoweringEffect(u16 effect); bool32 IsStatRaisingEffect(u16 effect); bool32 IsAttackBoostMoveEffect(u16 effect); bool32 IsUngroundingEffect(u16 effect); +bool32 IsSemiInvulnerable(u8 battlerDef, u16 move); // status checks bool32 CanBeBurned(u8 battler, u16 ability); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c45ccc311b..7f76e35f9d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -547,7 +547,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) } // check off screen - if (gStatuses3[battlerDef] & STATUS3_SEMI_INVULNERABLE && GetWhoStrikesFirst(battlerAtk, battlerDef, TRUE) != 1) + if (IsSemiInvulnerable(battlerDef, move) && effect != EFFECT_SEMI_INVULNERABLE && GetWhoStrikesFirst(battlerAtk, battlerDef, TRUE) != 1) RETURN_SCORE_MINUS(20); // if target off screen and we go first, don't use move // check if negates type diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index bbfae9bda1..8d55776030 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1339,16 +1339,23 @@ u32 AI_GetMoveAccuracy(u8 battlerAtk, u8 battlerDef, u16 atkAbility, u16 defAbil return calc; } +bool32 IsSemiInvulnerable(u8 battlerDef, u16 move) +{ + if (gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) + return TRUE; + else if (!TestMoveFlags(move, FLAG_HIT_IN_AIR) && gStatuses3[battlerDef] & STATUS3_ON_AIR) + return TRUE; + else if (!TestMoveFlags(move, FLAG_DMG_UNDERWATER) && gStatuses3[battlerDef] & STATUS3_UNDERWATER) + return TRUE; + else if (!TestMoveFlags(move, FLAG_DMG_UNDERGROUND) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) + return TRUE; + else + return FALSE; +} + bool32 IsMoveEncouragedToHit(u8 battlerAtk, u8 battlerDef, u16 move) { - // never hits - if (gStatuses3[battlerDef] & (STATUS3_SEMI_INVULNERABLE)) - return FALSE; - - if ((gStatuses3[battlerDef] & STATUS3_PHANTOM_FORCE) - || (!TestMoveFlags(move, FLAG_HIT_IN_AIR) && gStatuses3[battlerDef] & STATUS3_ON_AIR) - || (!TestMoveFlags(move, FLAG_DMG_UNDERGROUND) && gStatuses3[battlerDef] & STATUS3_UNDERGROUND) - || (!TestMoveFlags(move, FLAG_DMG_UNDERWATER) && gStatuses3[battlerDef] & STATUS3_UNDERWATER)) + if (IsSemiInvulnerable(battlerDef, move)) return FALSE; //TODO - anticipate protect move?