Improved move additional effect handling; now accounts for Shield Dust. (#7650)

This commit is contained in:
surskitty 2025-08-30 16:40:44 -04:00 committed by GitHub
parent 70068bf314
commit 4fa26b2296
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 45 additions and 5 deletions

View File

@ -5661,7 +5661,8 @@ case EFFECT_GUARD_SPLIT:
break;
case MOVE_EFFECT_SPD_MINUS_1:
case MOVE_EFFECT_SPD_MINUS_2:
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED));
if (CanLowerStat(battlerAtk, battlerDef, aiData, STAT_SPEED))
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, STAT_SPEED));
break;
case MOVE_EFFECT_ATK_MINUS_1:
case MOVE_EFFECT_DEF_MINUS_1:
@ -5669,18 +5670,35 @@ case EFFECT_GUARD_SPLIT:
case MOVE_EFFECT_SP_DEF_MINUS_1:
case MOVE_EFFECT_ACC_MINUS_1:
case MOVE_EFFECT_EVS_MINUS_1:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
{
u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_1;
if (CanLowerStat(battlerAtk, battlerDef, aiData, statId))
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId));
break;
}
case MOVE_EFFECT_ATK_MINUS_2:
case MOVE_EFFECT_DEF_MINUS_2:
case MOVE_EFFECT_SP_ATK_MINUS_2:
case MOVE_EFFECT_SP_DEF_MINUS_2:
case MOVE_EFFECT_ACC_MINUS_2:
case MOVE_EFFECT_EVS_MINUS_2:
if (aiData->abilities[battlerDef] != ABILITY_CONTRARY)
ADJUST_SCORE(DECENT_EFFECT);
{
u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_ATK_MINUS_2;
if (CanLowerStat(battlerAtk, battlerDef, aiData, statId))
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId));
break;
}
case MOVE_EFFECT_LOWER_ATTACK_SIDE:
case MOVE_EFFECT_LOWER_DEFENSE_SIDE:
case MOVE_EFFECT_LOWER_SPEED_SIDE:
case MOVE_EFFECT_LOWER_SP_ATK_SIDE:
case MOVE_EFFECT_LOWER_SP_DEF_SIDE:
{
u32 statId = STAT_ATK + additionalEffect->moveEffect - MOVE_EFFECT_LOWER_ATTACK_SIDE;
if (CanLowerStat(battlerAtk, battlerDef, aiData, statId))
ADJUST_SCORE(IncreaseStatDownScore(battlerAtk, battlerDef, statId));
break;
}
case MOVE_EFFECT_POISON:
IncreasePoisonScore(battlerAtk, battlerDef, move, &score);
break;

View File

@ -2056,6 +2056,10 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData,
case ABILITY_WHITE_SMOKE:
case ABILITY_FULL_METAL_BODY:
return FALSE;
case ABILITY_SHIELD_DUST:
if (!IsBattleMoveStatus(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX)
return FALSE;
break;
default:
break;
}

View File

@ -391,3 +391,21 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would
TURN { MOVE(player, MOVE_EARTHQUAKE); EXPECT_MOVE(opponent, MOVE_WIDE_GUARD); }
}
}
AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects")
{
u32 ability;
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; }
PARAMETRIZE { ability = ABILITY_TINTED_LENS; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_VENOMOTH) { Ability(ability); Moves(MOVE_CELEBRATE, MOVE_POUND); }
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CHILLING_WATER, MOVE_BRINE); }
} WHEN {
if (ability == ABILITY_SHIELD_DUST)
TURN { EXPECT_MOVE(opponent, MOVE_BRINE); }
else
TURN { EXPECT_MOVE(opponent, MOVE_CHILLING_WATER); }
}
}