Consolidated HasMoveFlagX functions (#6874)

This commit is contained in:
Alex 2025-05-16 20:50:45 +02:00 committed by GitHub
parent e44d0326be
commit 73e65b76c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 22 additions and 96 deletions

View File

@ -37,6 +37,8 @@ static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations
|| moveLimitations & 1u << moveIndex;
}
typedef bool32 (*MoveFlag)(u32 move);
bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move);
bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move);
bool32 AI_RandLessThan(u32 val);
@ -167,13 +169,7 @@ bool32 IsChaseEffect(enum BattleMoveEffects effect);
bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect);
bool32 IsUngroundingEffect(enum BattleMoveEffects effect);
bool32 IsSemiInvulnerable(u32 battlerDef, u32 move);
bool32 HasSubstituteIgnoringMove(u32 battler);
bool32 HasHighCritRatioMove(u32 battler);
bool32 HasMagicCoatAffectedMove(u32 battler);
bool32 HasSnatchAffectedMove(u32 battler);
bool32 HasMoveThatAlwaysHitsInRain(u32 battler);
bool32 HasMoveThatHas50AccuracyInSun(u32 battler);
bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler);
bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag);
bool32 IsHazardClearingMove(u32 move);
bool32 IsSubstituteEffect(enum BattleMoveEffects effect);

View File

@ -1691,7 +1691,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-8);
else if (aiData->hpPercents[battlerAtk] <= 25)
ADJUST_SCORE(-10);
else if (HasSubstituteIgnoringMove(battlerDef))
else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute))
ADJUST_SCORE(-8);
break;
case EFFECT_SHED_TAIL:
@ -1701,7 +1701,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-8);
else if (aiData->hpPercents[battlerAtk] <= 50)
ADJUST_SCORE(-10);
else if (HasSubstituteIgnoringMove(battlerDef))
else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute))
ADJUST_SCORE(-8);
break;
case EFFECT_LEECH_SEED:
@ -2366,7 +2366,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10); // no teammates to assist from
break;
case EFFECT_MAGIC_COAT:
if (!HasMagicCoatAffectedMove(battlerDef))
if (!HasMoveWithFlag(battlerDef, MoveCanBeBouncedBack))
ADJUST_SCORE(-10);
break;
case EFFECT_YAWN:
@ -2413,8 +2413,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10);
break;
case EFFECT_SNATCH:
if (!HasSnatchAffectedMove(battlerDef)
|| PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))
if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched)
|| PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove))
ADJUST_SCORE(-10);
break;
case EFFECT_POWER_TRICK:
@ -4073,9 +4073,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
case EFFECT_FOCUS_ENERGY:
case EFFECT_LASER_FOCUS:
if (aiData->abilities[battlerAtk] == ABILITY_SUPER_LUCK
|| aiData->abilities[battlerAtk] == ABILITY_SNIPER
|| aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS
|| HasHighCritRatioMove(battlerAtk))
|| aiData->abilities[battlerAtk] == ABILITY_SNIPER
|| aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS
|| HasMoveWithFlag(battlerAtk, GetMoveCriticalHitStage))
ADJUST_SCORE(GOOD_EFFECT);
break;
case EFFECT_CONFUSE:
@ -4362,7 +4362,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move)
ADJUST_SCORE(WEAK_EFFECT);
if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER))
ADJUST_SCORE(WEAK_EFFECT);
if (HasMoveThatHas50AccuracyInSun(battlerDef) || HasMoveThatHas50AccuracyInSun(BATTLE_PARTNER(battlerDef)))
if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun))
ADJUST_SCORE(WEAK_EFFECT);
}
break;

View File

@ -1766,7 +1766,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect)
|| ability == ABILITY_OVERCOAT
|| holdEffect == HOLD_EFFECT_SAFETY_GOGGLES
|| IS_BATTLER_OF_TYPE(battler, TYPE_ICE)
|| HasMoveThatAlwaysHitsInHailSnow(battler)
|| HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow)
|| HasMoveEffect(battler, EFFECT_AURORA_VEIL)
|| HasMoveEffect(battler, EFFECT_WEATHER_BALL))
{
@ -1787,7 +1787,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff
|| atkAbility == ABILITY_HYDRATION
|| atkAbility == ABILITY_RAIN_DISH
|| atkAbility == ABILITY_DRY_SKIN
|| HasMoveThatAlwaysHitsInRain(battlerAtk)
|| HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain)
|| HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL)
|| HasMoveWithType(battlerAtk, TYPE_WATER)))
{
@ -1833,7 +1833,7 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect)
|| ability == ABILITY_FORECAST
|| ability == ABILITY_SLUSH_RUSH
|| IS_BATTLER_OF_TYPE(battler, TYPE_ICE)
|| HasMoveThatAlwaysHitsInHailSnow(battler)
|| HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow)
|| HasMoveEffect(battler, EFFECT_AURORA_VEIL)
|| HasMoveEffect(battler, EFFECT_WEATHER_BALL))
{
@ -2647,87 +2647,17 @@ bool32 HasDamagingMoveOfType(u32 battlerId, u32 type)
return FALSE;
}
bool32 HasSubstituteIgnoringMove(u32 battler)
bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
u32 moveLimitations = gAiLogicData->moveLimitations[battler];
for (s32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveIgnoresSubstitute(moves[i]))
return TRUE;
}
return FALSE;
}
if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations))
continue;
bool32 HasHighCritRatioMove(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveCriticalHitStage(moves[i]) > 0)
return TRUE;
}
return FALSE;
}
bool32 HasMagicCoatAffectedMove(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeBouncedBack(moves[i]))
return TRUE;
}
return FALSE;
}
bool32 HasSnatchAffectedMove(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeSnatched(moves[i]))
return TRUE;
}
return FALSE;
}
bool32 HasMoveThatAlwaysHitsInRain(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInRain(moves[i]))
return TRUE;
}
return FALSE;
}
bool32 HasMoveThatHas50AccuracyInSun(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveHas50AccuracyInSun(moves[i]))
return TRUE;
}
return FALSE;
}
bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler)
{
s32 i;
u16 *moves = GetMovesArray(battler);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInHailSnow(moves[i]))
if (getFlag(moves[moveIndex]))
return TRUE;
}
return FALSE;