AI uses Extreme Evoboost. (#7706)

This commit is contained in:
surskitty 2025-09-09 16:13:18 -04:00 committed by GitHub
parent 0f2518c17f
commit 0ebd308497
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 13 additions and 9 deletions

View File

@ -136,6 +136,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item);
bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 IsAbilityOfRating(u32 ability, s8 rating);
bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability);
bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move);
bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove);
void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use);
bool32 IsAIUsingGimmick(u32 battler); bool32 IsAIUsingGimmick(u32 battler);

View File

@ -2760,8 +2760,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
case EFFECT_HOLD_HANDS: case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE: case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR: case EFFECT_HAPPY_HOUR:
case EFFECT_LAST_RESORT: if (IsConsideringZMove(battlerAtk, battlerDef, move))
if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move))
break; break;
ADJUST_SCORE(-10); ADJUST_SCORE(-10);
break; break;
@ -4446,7 +4445,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
case EFFECT_HOLD_HANDS: case EFFECT_HOLD_HANDS:
case EFFECT_CELEBRATE: case EFFECT_CELEBRATE:
case EFFECT_HAPPY_HOUR: case EFFECT_HAPPY_HOUR:
if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) case EFFECT_LAST_RESORT:
if (IsConsideringZMove(battlerAtk, battlerDef, move))
ADJUST_SCORE(BEST_EFFECT); ADJUST_SCORE(BEST_EFFECT);
break; break;
case EFFECT_TELEPORT: // Either remove or add better logic case EFFECT_TELEPORT: // Either remove or add better logic

View File

@ -665,7 +665,7 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx)
return TRUE; return TRUE;
break; break;
case EFFECT_LAST_RESORT: case EFFECT_LAST_RESORT:
if (!CanUseLastResort(ctx->battlerAtk)) if (!CanUseLastResort(ctx->battlerAtk) && !IsConsideringZMove(ctx->battlerAtk, ctx->battlerDef, ctx->move))
return TRUE; return TRUE;
break; break;
case EFFECT_LOW_KICK: case EFFECT_LOW_KICK:
@ -4843,6 +4843,12 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move
return FALSE; return FALSE;
} }
bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move)
{
return gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move);
}
//TODO - this could use some more sophisticated logic //TODO - this could use some more sophisticated logic
bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove)
{ {

View File

@ -63,10 +63,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Happy Hour")
} }
} }
// Last Resort itself is missing logic!
AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost")
{ {
KNOWN_FAILING;
GIVEN { GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT ); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT );
ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL);
@ -75,9 +73,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost")
} WHEN { } WHEN {
TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); }
TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE);
SCORE_EQ_VAL(opponent, MOVE_LAST_RESORT, 80); } SCORE_LT_VAL(opponent, MOVE_LAST_RESORT, AI_SCORE_DEFAULT); }
// Uncomment when Last Resort works correctly. TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); }
// TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); }
} }
} }