From f1c1906324ad8808f980c2038ec254c07d02d43a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 17 May 2025 16:23:30 +0200 Subject: [PATCH] Fix misleading name (#6865) --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 114 +++++++++++++++++------------------ src/battle_ai_switch_items.c | 2 +- src/battle_ai_util.c | 76 +++++++++++------------ 4 files changed, 97 insertions(+), 97 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 791e49cddd..6461e181ee 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -134,7 +134,7 @@ bool32 HasMove(u32 battlerId, u32 move); bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive); bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); -bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index dc2e36adc0..111e025345 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1105,7 +1105,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } - + switch(nonVolatileStatus) { case MOVE_EFFECT_POISON: @@ -1612,7 +1612,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || IsBattlerIncapacitated(battlerDef, abilityDef) || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) ADJUST_SCORE(-10); - if (HasMoveEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) ADJUST_SCORE(-10); if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); @@ -2954,7 +2954,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); - bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) + bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) && !partnerProtecting && IsBattlerAlive(battlerAtkPartner); bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); @@ -3082,16 +3082,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (wouldPartnerFaint) { // If it kills both opponents, that's a good reason. - if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) && CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { switch (effect) { case EFFECT_EXPLOSION: - if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) { RETURN_SCORE_PLUS(10); - } + } break; default: RETURN_SCORE_PLUS(10); @@ -3099,16 +3099,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } // Both opponents can kill the partner - else if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtkPartner) + else if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtkPartner) && (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtkPartner))) { // The spread move should kill an opponent. - if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { ADJUST_SCORE(WEAK_EFFECT); } - + // Alternatively, it benefits from the ally's death, and it will probably die anyway. if (IsMoxieTypeAbility(aiData->abilities[battlerAtk])) { @@ -3125,10 +3125,10 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // It can kill one opponent when killing its ally, and its ally is not in extreme danger. // This is easy for the player to cheese. - else if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + else if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) { RETURN_SCORE_PLUS(10); } @@ -3143,7 +3143,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); } } - + // Partner will not faint. else { @@ -3154,7 +3154,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (aiData->effectiveness[battlerAtk][battlerAtkPartner][gAiThinkingStruct->movesetIndex] >= UQ_4_12(2.0) && isFriendlyFireOK) { ADJUST_SCORE(GOOD_EFFECT); - } + } break; default: break; @@ -3171,7 +3171,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(30); } - + // partner ability checks if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { @@ -3253,7 +3253,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(10); } - + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); @@ -3280,7 +3280,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - + if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) { ADJUST_SCORE(DECENT_EFFECT); @@ -3353,7 +3353,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - + if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); @@ -3428,7 +3428,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(30); } - + switch (effect) { case EFFECT_SPICY_EXTRACT: @@ -4080,8 +4080,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_SLP || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_STATUS - || HasMoveEffect(EFFECT_SLEEP_TALK, battlerAtk) - || HasMoveEffect(EFFECT_SNORE, battlerAtk) + || HasMoveWithEffect(EFFECT_SLEEP_TALK, battlerAtk) + || HasMoveWithEffect(EFFECT_SNORE, battlerAtk) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) @@ -4123,7 +4123,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_LEECH_SEED: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || gStatuses3[battlerDef] & STATUS3_LEECHSEED - || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) || aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) break; @@ -4194,7 +4194,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; bool32 encourage = gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore; - + switch(GetMoveNonVolatileStatus(gLastMoves[battlerDef])) { case MOVE_EFFECT_POISON: @@ -4214,7 +4214,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_LOCK_ON: - if (HasMoveEffect(battlerAtk, EFFECT_OHKO)) + if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO)) ADJUST_SCORE(GOOD_EFFECT); else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) ADJUST_SCORE(GOOD_EFFECT); @@ -4298,7 +4298,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && IsPinchBerryItemEffect(aiData->holdEffects[battlerAtk])) ADJUST_SCORE(GOOD_EFFECT); else if ((gBattleMons[battlerAtk].hp > 1) // Only spam endure for Flail/Reversal if you're not at Min Health - && (HasMoveEffect(battlerAtk, EFFECT_FLAIL) || HasMoveEffect(battlerAtk, EFFECT_ENDEAVOR))) + && (HasMoveWithEffect(battlerAtk, EFFECT_FLAIL) || HasMoveWithEffect(battlerAtk, EFFECT_ENDEAVOR))) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -4338,41 +4338,41 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_HAIL: if (ShouldSetHail(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) + if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_SNOWSCAPE: if (ShouldSetSnow(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) + if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; @@ -4382,10 +4382,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_SOLAR_BEAM) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithType(battlerDef, TYPE_FIRE) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) ADJUST_SCORE(WEAK_EFFECT); @@ -4431,7 +4431,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_DEFENSE_CURL: - if (HasMoveEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) + if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; @@ -4444,16 +4444,16 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_STOCKPILE: if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) break; - if (HasMoveEffect(battlerAtk, EFFECT_SWALLOW) || HasMoveEffect(battlerAtk, EFFECT_SPIT_UP)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SWALLOW) || HasMoveWithEffect(battlerAtk, EFFECT_SPIT_UP)) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; case EFFECT_SWAGGER: case EFFECT_FLATTER: - if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY) - || HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) + || HasMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4553,7 +4553,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (!HasMoveEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) + if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4603,7 +4603,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4622,7 +4622,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->holdEffects[battlerDef]) { case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) + if (HasMoveWithEffect(battlerDef, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4859,7 +4859,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_PLEDGE: - if (isDoubleBattle && HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) + if (isDoubleBattle && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: @@ -4943,7 +4943,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SOAK: - if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) + if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) ADJUST_SCORE(DECENT_EFFECT); // Get some super effective moves break; case EFFECT_THIRD_TYPE: @@ -5070,7 +5070,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->holdEffects[battlerDef]) { case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) + if (HasMoveWithEffect(battlerDef, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -5234,7 +5234,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && aiData->items[battlerDef] != ITEM_NONE && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) + && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) { switch (aiData->holdEffects[battlerDef]) @@ -5259,7 +5259,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -5297,7 +5297,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case MOVE_EFFECT_WRAP: - if (!HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) + if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) ADJUST_SCORE(BEST_EFFECT); break; case MOVE_EFFECT_SALT_CURE: @@ -5562,7 +5562,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 || !IsBattleMoveStatus(move) - || !HasMoveEffect(battlerAtk, EFFECT_BATON_PASS) + || !HasMoveWithEffect(battlerAtk, EFFECT_BATON_PASS) || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk))) return score; @@ -5821,15 +5821,15 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_TRICK_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !HasMoveEffect(battlerDef, EFFECT_TRICK_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_TRICK_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_MAGIC_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) && !HasMoveEffect(battlerDef, EFFECT_MAGIC_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_MAGIC_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_WONDER_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM) && !HasMoveEffect(battlerDef, EFFECT_WONDER_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_WONDER_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_GRAVITY: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 76b7cc0565..2f7f74a726 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -677,7 +677,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) + || (HasMoveWithEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) || (IsBattlerGrounded(battler) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d6f3a5b533..6789fa58aa 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1588,7 +1588,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) else { enum ProtectMethod protectMethod = GetMoveProtectMethod(allyMove); - + if (protectMethod == PROTECT_QUICK_GUARD) { u32 priority = GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], attackerMove); @@ -1735,8 +1735,8 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffe || ability == ABILITY_MAGIC_GUARD || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - || HasMoveEffect(battler, EFFECT_SHORE_UP) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_SHORE_UP) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1758,8 +1758,8 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1779,7 +1779,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff || atkAbility == ABILITY_RAIN_DISH || atkAbility == ABILITY_DRY_SKIN || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) - || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) + || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) || HasMoveWithType(battlerAtk, TYPE_WATER))) { return TRUE; @@ -1800,12 +1800,12 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffe || atkAbility == ABILITY_LEAF_GUARD || atkAbility == ABILITY_SOLAR_POWER || atkAbility == ABILITY_HARVEST - || HasMoveEffect(battlerAtk, EFFECT_SOLAR_BEAM) - || HasMoveEffect(battlerAtk, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerAtk, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerAtk, EFFECT_MOONLIGHT) - || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveEffect(battlerAtk, EFFECT_GROWTH) + || HasMoveWithEffect(battlerAtk, EFFECT_SOLAR_BEAM) + || HasMoveWithEffect(battlerAtk, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerAtk, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerAtk, EFFECT_MOONLIGHT) + || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) + || HasMoveWithEffect(battlerAtk, EFFECT_GROWTH) || HasMoveWithType(battlerAtk, TYPE_FIRE))) { return TRUE; @@ -1825,8 +1825,8 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_SLUSH_RUSH || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1916,7 +1916,7 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) // If AI is faster and doesn't have any mons left, lowering speed doesn't give any return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) && CountUsablePartyMons(battlerAtk) == 0 - && !HasMoveEffect(battlerAtk, EFFECT_ELECTRO_BALL)); + && !HasMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } return TRUE; @@ -2177,7 +2177,7 @@ bool32 HasMoveWithType(u32 battler, u32 type) return FALSE; } -bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects effect) +bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects effect) { s32 i; u16 *moves = GetMovesArray(battlerId); @@ -3131,7 +3131,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler)) return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveEffect(battler, EFFECT_SLEEP_TALK)) + if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveWithEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) @@ -3155,8 +3155,8 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab || ability == ABILITY_QUICK_FEET || ability == ABILITY_MAGIC_GUARD || (ability == ABILITY_GUTS && HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)) - || HasMoveEffect(battler, EFFECT_FACADE) - || HasMoveEffect(battler, EFFECT_PSYCHO_SHIFT)) + || HasMoveWithEffect(battler, EFFECT_FACADE) + || HasMoveWithEffect(battler, EFFECT_PSYCHO_SHIFT)) return TRUE; return FALSE; } @@ -3538,8 +3538,8 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo u32 atkSide = GetBattlerSide(battlerAtk); // Don't waste a turn if screens will be broken - if (HasMoveEffect(battlerDef, EFFECT_BRICK_BREAK) - || HasMoveEffect(battlerDef, EFFECT_RAGING_BULL)) + if (HasMoveWithEffect(battlerDef, EFFECT_BRICK_BREAK) + || HasMoveWithEffect(battlerDef, EFFECT_RAGING_BULL)) return FALSE; switch (moveEffect) @@ -4071,10 +4071,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has Encore - if (HasMoveEffect(battlerDef, EFFECT_ENCORE)) + if (HasMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; - if (IsDoubleBattle() && HasMoveEffect(GetPartnerBattler(battlerDef), EFFECT_ENCORE)) + if (IsDoubleBattle() && HasMoveWithEffect(GetPartnerBattler(battlerDef), EFFECT_ENCORE)) return NO_INCREASE; // Predicting switch @@ -4193,12 +4193,12 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (!HasDamagingMove(battlerDef)) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveWithEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(WEAK_EFFECT); // stall tactic if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) - || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) - || gAiLogicData->abilities[battlerAtk] == ABILITY_MERCILESS) + || HasMoveWithEffect(battlerAtk, EFFECT_VENOM_DRENCH) + || gAiLogicData->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -4262,8 +4262,8 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) else return; - if ((HasMoveEffect(battlerAtk, EFFECT_DREAM_EATER) || HasMoveEffect(battlerAtk, EFFECT_NIGHTMARE)) - && !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK))) + if ((HasMoveWithEffect(battlerAtk, EFFECT_DREAM_EATER) || HasMoveWithEffect(battlerAtk, EFFECT_NIGHTMARE)) + && !(HasMoveWithEffect(battlerDef, EFFECT_SNORE) || HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK))) ADJUST_SCORE_PTR(WEAK_EFFECT); if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) @@ -4409,11 +4409,11 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData { if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0 - || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasMoveEffect(battlerDef, EFFECT_TIDY_UP) - || HasMoveEffect(battlerDef, EFFECT_DEFOG) + || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasMoveWithEffect(battlerDef, EFFECT_TIDY_UP) + || HasMoveWithEffect(battlerDef, EFFECT_DEFOG) || HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG) - || HasMoveEffect(battlerDef, EFFECT_MAGIC_COAT)) + || HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) return FALSE; return TRUE; @@ -4451,8 +4451,8 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE || partnerAbility == ABILITY_CONTRARY || partnerAbility == ABILITY_GOOD_AS_GOLD - || HasMoveEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) - || HasMoveEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) + || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) + || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) return FALSE; preventsStatLoss = (partnerAbility == ABILITY_CLEAR_BODY @@ -4509,8 +4509,8 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_TOXIC) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_PARALYSIS) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_BURN) - || HasMoveEffect(battlerDef, EFFECT_CONFUSE) - || HasMoveEffect(battlerDef, EFFECT_LEECH_SEED)) + || HasMoveWithEffect(battlerDef, EFFECT_CONFUSE) + || HasMoveWithEffect(battlerDef, EFFECT_LEECH_SEED)) scoreIncrease += GOOD_EFFECT; if (gAiLogicData->hpPercents[battlerAtk] > 70) @@ -4586,7 +4586,7 @@ bool32 ShouldTriggerAbility(u32 battler, u32 ability) case ABILITY_STORM_DRAIN: if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) return FALSE; - else + else return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); case ABILITY_DEFIANT: @@ -4601,7 +4601,7 @@ bool32 ShouldTriggerAbility(u32 battler, u32 ability) case ABILITY_CONTRARY: return TRUE; - + case ABILITY_DRY_SKIN: case ABILITY_VOLT_ABSORB: case ABILITY_WATER_ABSORB: