diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 6715cee619..d9e8edd018 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -236,5 +236,6 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); +bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); #endif //GUARD_BATTLE_AI_UTIL_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 089dd76ec5..6c651d6639 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1200,6 +1200,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_QUIVER_DANCE: case EFFECT_GEOMANCY: + if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + ADJUST_SCORE(-10); if (gBattleMons[battlerAtk].statStages[STAT_SPATK] >= MAX_STAT_STAGE || !HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL)) ADJUST_SCORE(-10); else if (!BattlerStatCanRise(battlerAtk, aiData->abilities[battlerAtk], STAT_SPEED)) @@ -1735,6 +1737,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_BELLY_DRUM: case EFFECT_FILLET_AWAY: + if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, aiData)) + ADJUST_SCORE(-10); if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) ADJUST_SCORE(-10); else if (aiData->hpPercents[battlerAtk] <= 60) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e8e6a51ba9..fee630cedb 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -3937,6 +3937,10 @@ static u32 IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, u32 statI if (considerContrary && AI_DATA->abilities[battlerAtk] == ABILITY_CONTRARY) return NO_INCREASE; + // Don't increase stats if opposing battler has Unaware + if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, AI_DATA)) + return NO_INCREASE; + // Don't increase stat if AI is at +4 if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 2) return NO_INCREASE; @@ -4423,3 +4427,12 @@ bool32 IsBattlerItemEnabled(u32 battler) return FALSE; return TRUE; } + +bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiData) +{ + if (aiData->abilities[battler] == ability) + return TRUE; + if (IsDoubleBattle() && AI_DATA->abilities[BATTLE_PARTNER(battler)] == ability) + return TRUE; + return FALSE; +} diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 783c951d1c..4eb3071b76 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -899,3 +899,15 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI considers Focus Sash when det TURN { MOVE(player, MOVE_AIR_SLASH); EXPECT_MOVE(opponent, MOVE_FLAMETHROWER); } } } + +AI_SINGLE_BATTLE_TEST("AI won't boost stats against opponent with Unaware") +{ + GIVEN { + MoveHasAdditionalEffectSelf(MOVE_SWORDS_DANCE, MOVE_EFFECT_ATK_PLUS_2); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_QUAGSIRE) { Ability(ABILITY_UNAWARE); Moves(MOVE_TACKLE); } + OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_BODY_SLAM, MOVE_SWORDS_DANCE); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); EXPECT_MOVE(opponent, MOVE_BODY_SLAM); } + } +}