Consolidated HasMoveFlagX functions (#6874)
This commit is contained in:
parent
e44d0326be
commit
73e65b76c4
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user