From 73e65b76c4c569e5e38558a21d024122deb176a8 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 16 May 2025 20:50:45 +0200 Subject: [PATCH] Consolidated HasMoveFlagX functions (#6874) --- include/battle_ai_util.h | 10 ++--- src/battle_ai_main.c | 18 ++++---- src/battle_ai_util.c | 90 +++++----------------------------------- 3 files changed, 22 insertions(+), 96 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 70ff0e976c..1e35dbf532 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -37,6 +37,8 @@ static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations || moveLimitations & 1u << moveIndex; } +typedef bool32 (*MoveFlag)(u32 move); + bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_RandLessThan(u32 val); @@ -167,13 +169,7 @@ bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); bool32 IsUngroundingEffect(enum BattleMoveEffects effect); bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); -bool32 HasSubstituteIgnoringMove(u32 battler); -bool32 HasHighCritRatioMove(u32 battler); -bool32 HasMagicCoatAffectedMove(u32 battler); -bool32 HasSnatchAffectedMove(u32 battler); -bool32 HasMoveThatAlwaysHitsInRain(u32 battler); -bool32 HasMoveThatHas50AccuracyInSun(u32 battler); -bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler); +bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag); bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7ac5065643..f62ff4376d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1691,7 +1691,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 25) ADJUST_SCORE(-10); - else if (HasSubstituteIgnoringMove(battlerDef)) + else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute)) ADJUST_SCORE(-8); break; case EFFECT_SHED_TAIL: @@ -1701,7 +1701,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 50) ADJUST_SCORE(-10); - else if (HasSubstituteIgnoringMove(battlerDef)) + else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute)) ADJUST_SCORE(-8); break; case EFFECT_LEECH_SEED: @@ -2366,7 +2366,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // no teammates to assist from break; case EFFECT_MAGIC_COAT: - if (!HasMagicCoatAffectedMove(battlerDef)) + if (!HasMoveWithFlag(battlerDef, MoveCanBeBouncedBack)) ADJUST_SCORE(-10); break; case EFFECT_YAWN: @@ -2413,8 +2413,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SNATCH: - if (!HasSnatchAffectedMove(battlerDef) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched) + || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_POWER_TRICK: @@ -4073,9 +4073,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_FOCUS_ENERGY: case EFFECT_LASER_FOCUS: if (aiData->abilities[battlerAtk] == ABILITY_SUPER_LUCK - || aiData->abilities[battlerAtk] == ABILITY_SNIPER - || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS - || HasHighCritRatioMove(battlerAtk)) + || aiData->abilities[battlerAtk] == ABILITY_SNIPER + || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS + || HasMoveWithFlag(battlerAtk, GetMoveCriticalHitStage)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_CONFUSE: @@ -4362,7 +4362,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveThatHas50AccuracyInSun(battlerDef) || HasMoveThatHas50AccuracyInSun(BATTLE_PARTNER(battlerDef))) + if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) ADJUST_SCORE(WEAK_EFFECT); } break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6a1e6ea681..7e74f2532d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1766,7 +1766,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_OVERCOAT || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveThatAlwaysHitsInHailSnow(battler) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -1787,7 +1787,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff || atkAbility == ABILITY_HYDRATION || atkAbility == ABILITY_RAIN_DISH || atkAbility == ABILITY_DRY_SKIN - || HasMoveThatAlwaysHitsInRain(battlerAtk) + || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) || HasMoveWithType(battlerAtk, TYPE_WATER))) { @@ -1833,7 +1833,7 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_FORECAST || ability == ABILITY_SLUSH_RUSH || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveThatAlwaysHitsInHailSnow(battler) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -2647,87 +2647,17 @@ bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) return FALSE; } -bool32 HasSubstituteIgnoringMove(u32 battler) +bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag) { - s32 i; u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + u32 moveLimitations = gAiLogicData->moveLimitations[battler]; + + for (s32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveIgnoresSubstitute(moves[i])) - return TRUE; - } - return FALSE; -} + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; -bool32 HasHighCritRatioMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveCriticalHitStage(moves[i]) > 0) - return TRUE; - } - - return FALSE; -} - -bool32 HasMagicCoatAffectedMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeBouncedBack(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasSnatchAffectedMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeSnatched(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasMoveThatAlwaysHitsInRain(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInRain(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasMoveThatHas50AccuracyInSun(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveHas50AccuracyInSun(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInHailSnow(moves[i])) + if (getFlag(moves[moveIndex])) return TRUE; } return FALSE;