Add basic Unaware check bad move scoring (#6524)

This commit is contained in:
Pawkkie 2025-04-02 18:18:33 -04:00 committed by GitHub
parent 5b9077e207
commit 9cb96235f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 30 additions and 0 deletions

View File

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

View File

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

View File

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

View File

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