AI uses Court Change. (#7525)

This commit is contained in:
surskitty 2025-08-11 13:35:10 -04:00 committed by GitHub
parent 38cfc4bacf
commit 2469627c61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 70 additions and 1 deletions

View File

@ -2320,6 +2320,23 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
|| DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove))
ADJUST_SCORE(-9);
break;
case EFFECT_COURT_CHANGE:
if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_BAD_COURT)
ADJUST_SCORE(BAD_EFFECT);
if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_GOOD_COURT)
ADJUST_SCORE(BAD_EFFECT);
if (AreAnyHazardsOnSide(GetBattlerSide(FOE(battlerAtk))) && CountUsablePartyMons(battlerAtk) != 0)
ADJUST_SCORE(WORST_EFFECT);
if (hasPartner)
{
if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards
&& AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change
{
ADJUST_SCORE(-10);
break; // Don't use Defog if partner is going to set up hazards
}
}
break;
case EFFECT_DEFOG:
if (gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SCREEN_ANY | SIDE_STATUS_SAFEGUARD | SIDE_STATUS_MIST)
|| AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)))
@ -2880,7 +2897,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10);
}
break;
case EFFECT_COURT_CHANGE:
case EFFECT_TEATIME:
if (DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove))
ADJUST_SCORE(-10);
@ -4603,6 +4619,27 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
//if (CountUsablePartyMons(battlerDef) != 0)
//ADJUST_SCORE(8);
break;
case EFFECT_COURT_CHANGE:
if (gSideStatuses[GetBattlerSide(FOE(battlerAtk))] & SIDE_STATUS_GOOD_COURT)
ADJUST_SCORE(WEAK_EFFECT);
if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_BAD_COURT)
ADJUST_SCORE(WEAK_EFFECT);
if (AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0)
{
ADJUST_SCORE(DECENT_EFFECT);
}
if (hasPartner)
{
if (IsHazardMove(aiData->partnerMove) // partner is going to set up hazards
&& AI_IsFaster(BATTLE_PARTNER(battlerAtk), battlerAtk, aiData->partnerMove, predictedMove, CONSIDER_PRIORITY)) // partner is going to set up before the Court Change
{
ADJUST_SCORE(-10);
break;
}
}
break;
case EFFECT_DEFOG:
if ((AreAnyHazardsOnSide(GetBattlerSide(battlerAtk)) && CountUsablePartyMons(battlerAtk) != 0)
|| (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_GOOD_FOG))

View File

@ -217,3 +217,35 @@ DOUBLE_BATTLE_TEST("Court Change used by the player swaps G-Max Vine Lash, G-Max
}
}
}
AI_SINGLE_BATTLE_TEST("AI uses Court Change")
{
u32 move;
PARAMETRIZE { move = MOVE_HEADBUTT; }
PARAMETRIZE { move = MOVE_REFLECT; }
PARAMETRIZE { move = MOVE_LIGHT_SCREEN; }
PARAMETRIZE { move = MOVE_SAFEGUARD; }
PARAMETRIZE { move = MOVE_SPIKES; }
PARAMETRIZE { move = MOVE_STEALTH_ROCK; }
PARAMETRIZE { move = MOVE_TOXIC_SPIKES; }
PARAMETRIZE { move = MOVE_TAILWIND; }
PARAMETRIZE { move = MOVE_STICKY_WEB; }
PARAMETRIZE { move = MOVE_MIST; }
PARAMETRIZE { move = MOVE_LUCKY_CHANT; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); }
PLAYER(SPECIES_ZIGZAGOON) { Moves(move, MOVE_CELEBRATE); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_COURT_CHANGE, MOVE_HEADBUTT); }
} WHEN {
TURN { MOVE(player, move); EXPECT_MOVE(opponent, MOVE_HEADBUTT); }
if (move == MOVE_HEADBUTT)
TURN { MOVE(player, MOVE_CELEBRATE); NOT_EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); }
else
TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_COURT_CHANGE); }
}
}