Fix stat change / stat ID ambiguity (#7346)

Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
Pawkkie 2025-07-15 12:07:26 -04:00 committed by GitHub
parent 0894d8d0dc
commit 0e37bfd7ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 7 deletions

View File

@ -4141,13 +4141,41 @@ bool32 IsRecycleEncouragedItem(u32 item)
return FALSE;
}
static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statId, bool32 considerContrary)
static u32 GetStatBeingChanged(enum StatChange statChange)
{
switch(statChange)
{
case STAT_CHANGE_ATK:
case STAT_CHANGE_ATK_2:
return STAT_ATK;
case STAT_CHANGE_DEF:
case STAT_CHANGE_DEF_2:
return STAT_DEF;
case STAT_CHANGE_SPEED:
case STAT_CHANGE_SPEED_2:
return STAT_SPEED;
case STAT_CHANGE_SPATK:
case STAT_CHANGE_SPATK_2:
return STAT_SPATK;
case STAT_CHANGE_SPDEF:
case STAT_CHANGE_SPDEF_2:
return STAT_SPDEF;
case STAT_CHANGE_ACC:
return STAT_ACC;
case STAT_CHANGE_EVASION:
return STAT_EVASION;
}
return 0; // STAT_HP, should never be getting changed
}
static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, enum StatChange statChange, bool32 considerContrary)
{
enum AIScore tempScore = NO_INCREASE;
u32 noOfHitsToFaint = NoOfHitsForTargetToFaintAI(battlerDef, battlerAtk);
u32 aiIsFaster = AI_IsFaster(battlerAtk, battlerDef, TRUE);
u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS);
u32 i;
u32 statId = GetStatBeingChanged(statChange);
if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY)
return NO_INCREASE;
@ -4206,7 +4234,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef,
tempScore += WEAK_EFFECT;
}
switch (statId)
switch (statChange)
{
case STAT_CHANGE_ATK:
if (HasMoveWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL) && shouldSetUp)
@ -4269,7 +4297,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef,
}
break;
case STAT_CHANGE_ACC:
if (gBattleMons[battlerAtk].statStages[STAT_ACC] <= 3) // Increase only if necessary
if (gBattleMons[battlerAtk].statStages[statId] <= 3) // Increase only if necessary
tempScore += DECENT_EFFECT;
break;
case STAT_CHANGE_EVASION:
@ -4283,14 +4311,14 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef,
return tempScore;
}
u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statId)
u32 IncreaseStatUpScore(u32 battlerAtk, u32 battlerDef, enum StatChange statChange)
{
return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statId, TRUE);
return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, TRUE);
}
u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statId)
u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange statChange)
{
return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statId, FALSE);
return IncreaseStatUpScoreInternal(battlerAtk, battlerDef, statChange, FALSE);
}
void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)

View File

@ -881,3 +881,16 @@ AI_SINGLE_BATTLE_TEST("Move scoring comparison properly awards bonus point to be
TURN { EXPECT_MOVE(opponent, MOVE_WATER_SPOUT); }
}
}
AI_SINGLE_BATTLE_TEST("AI will stop setting up at +4")
{
GIVEN {
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_CELEBRATE); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_TACKLE, MOVE_IRON_DEFENSE); }
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_IRON_DEFENSE); }
TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_IRON_DEFENSE); }
TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_TACKLE); }
}
}