Fix AI wakeup-turn detection to consider Early Bird (#9053)

This commit is contained in:
GGbond 2026-01-30 01:33:36 +08:00 committed by GitHub
parent 4198a5cb85
commit 08dd7da30c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 77 additions and 16 deletions

View File

@ -3829,24 +3829,21 @@ bool32 HasChoiceEffect(u32 battler)
}
}
static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x)
{
s32 i, index = gBattleHistory->moveHistoryIndex[battlerId];
for (i = 0; i < x; i++)
{
if (--index < 0)
index = AI_MOVE_HISTORY_COUNT - 1;
}
return gBattleHistory->moveHistory[battlerId][index];
}
bool32 IsWakeupTurn(u32 battler)
{
// Check if rest was used 2 turns ago
if ((gBattleMons[battler].status1 & STATUS1_SLEEP) == 1 && GetMoveEffect(FindMoveUsedXTurnsAgo(battler, 2)) == EFFECT_REST)
return TRUE;
else // no way to know
u32 sleepTurns = gBattleMons[battler].status1 & STATUS1_SLEEP;
u32 toSub;
if (sleepTurns == 0)
return FALSE;
// Early Bird reduces the sleep timer twice as fast.
if (gAiLogicData->abilities[battler] == ABILITY_EARLY_BIRD)
toSub = 2;
else
toSub = 1;
return sleepTurns <= toSub;
}
bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof)

View File

@ -1,4 +1,49 @@
#include "global.h"
#include "test/battle.h"
TO_DO_BATTLE_TEST("TODO: Write Early Bird (Ability) test titles")
SINGLE_BATTLE_TEST("Early Bird wakes up if 1 sleep turn is preset")
{
GIVEN {
PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); Status1(STATUS1_SLEEP_TURN(1)); Moves(MOVE_CELEBRATE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); }
} SCENE {
MESSAGE("Doduo woke up!");
STATUS_ICON(player, none: TRUE);
MESSAGE("Doduo used Celebrate!");
}
}
SINGLE_BATTLE_TEST("Early Bird turns a 3-turn sleep into one missed turn")
{
GIVEN {
PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); Status1(STATUS1_SLEEP_TURN(3)); Moves(MOVE_CELEBRATE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); }
TURN { MOVE(player, MOVE_CELEBRATE); }
} SCENE {
MESSAGE("Doduo is fast asleep.");
MESSAGE("Doduo woke up!");
STATUS_ICON(player, none: TRUE);
MESSAGE("Doduo used Celebrate!");
}
}
SINGLE_BATTLE_TEST("Early Bird reduces Rest sleep to one turn")
{
GIVEN {
PLAYER(SPECIES_DODUO) { Ability(ABILITY_EARLY_BIRD); MaxHP(99); HP(66); Moves(MOVE_REST, MOVE_CELEBRATE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_REST); }
TURN { MOVE(player, MOVE_CELEBRATE); }
TURN { MOVE(player, MOVE_CELEBRATE); }
} SCENE {
MESSAGE("Doduo is fast asleep.");
MESSAGE("Doduo woke up!");
STATUS_ICON(player, none: TRUE);
MESSAGE("Doduo used Celebrate!");
}
}

View File

@ -135,6 +135,25 @@ AI_SINGLE_BATTLE_TEST("AI will only use Dream Eater if target is asleep")
}
}
AI_SINGLE_BATTLE_TEST("AI chooses Sleep Talk only when it will not wake up with Early Bird")
{
enum Ability ability;
PARAMETRIZE { ability = ABILITY_RUN_AWAY; }
PARAMETRIZE { ability = ABILITY_EARLY_BIRD; }
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_DODRIO) { Ability(ability); Status1(STATUS1_SLEEP_TURN(2)); Moves(MOVE_SLEEP_TALK, MOVE_TACKLE); }
} WHEN {
if (ability == ABILITY_EARLY_BIRD)
TURN { EXPECT_MOVE(opponent, MOVE_TACKLE); }
else
TURN { EXPECT_MOVE(opponent, MOVE_SLEEP_TALK); }
}
}
AI_SINGLE_BATTLE_TEST("AI sees increased base power of Spit Up")
{
GIVEN {