From 0ebd308497b71b273c1d4d86d4b9ef2a8d5dd6ea Mon Sep 17 00:00:00 2001 From: surskitty Date: Tue, 9 Sep 2025 16:13:18 -0400 Subject: [PATCH] AI uses Extreme Evoboost. (#7706) --- include/battle_ai_util.h | 1 + src/battle_ai_main.c | 6 +++--- src/battle_ai_util.c | 8 +++++++- test/battle/ai/gimmick_z_move.c | 7 ++----- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 1b23dd7e1a..2705cc4b6d 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -136,6 +136,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item); bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); 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); void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use); bool32 IsAIUsingGimmick(u32 battler); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index a28ef05aa9..cedb2db5e7 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -2760,8 +2760,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: case EFFECT_HAPPY_HOUR: - case EFFECT_LAST_RESORT: - if (gBattleStruct->gimmick.usableGimmick[battlerAtk] == GIMMICK_Z_MOVE && ShouldUseZMove(battlerAtk, battlerDef, move)) + if (IsConsideringZMove(battlerAtk, battlerDef, move)) break; ADJUST_SCORE(-10); break; @@ -4446,7 +4445,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_HOLD_HANDS: case EFFECT_CELEBRATE: 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); break; case EFFECT_TELEPORT: // Either remove or add better logic diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0b440ec39f..ee3da9f4a5 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -665,7 +665,7 @@ bool32 IsDamageMoveUnusable(struct DamageContext *ctx) return TRUE; break; case EFFECT_LAST_RESORT: - if (!CanUseLastResort(ctx->battlerAtk)) + if (!CanUseLastResort(ctx->battlerAtk) && !IsConsideringZMove(ctx->battlerAtk, ctx->battlerDef, ctx->move)) return TRUE; break; case EFFECT_LOW_KICK: @@ -4843,6 +4843,12 @@ bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move 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 bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) { diff --git a/test/battle/ai/gimmick_z_move.c b/test/battle/ai/gimmick_z_move.c index 0b74507b22..1332abe6c0 100644 --- a/test/battle/ai/gimmick_z_move.c +++ b/test/battle/ai/gimmick_z_move.c @@ -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") { - KNOWN_FAILING; GIVEN { 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); @@ -75,9 +73,8 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Extreme Evoboost") } WHEN { TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_Z_MOVE); } TURN { EXPECT_MOVE(opponent, MOVE_POUND, gimmick: GIMMICK_NONE); - SCORE_EQ_VAL(opponent, MOVE_LAST_RESORT, 80); } -// Uncomment when Last Resort works correctly. -// TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } + SCORE_LT_VAL(opponent, MOVE_LAST_RESORT, AI_SCORE_DEFAULT); } + TURN { EXPECT_MOVE(opponent, MOVE_LAST_RESORT, gimmick: GIMMICK_NONE); } } }