fix ShouldSetScreen (thx Syreldar)

This commit is contained in:
Evan 2021-02-14 09:11:29 -07:00
parent 0664daf384
commit 49e41a2d3b
2 changed files with 21 additions and 34 deletions

View File

@ -3232,7 +3232,7 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
case EFFECT_LIGHT_SCREEN: case EFFECT_LIGHT_SCREEN:
case EFFECT_REFLECT: case EFFECT_REFLECT:
case EFFECT_AURORA_VEIL: case EFFECT_AURORA_VEIL:
if (ShouldSetScreen(battlerAtk, battlerDef, move)) if (ShouldSetScreen(battlerAtk, battlerDef, moveEffect))
{ {
score += 5; score += 5;
if (AI_DATA->atkHoldEffect == HOLD_EFFECT_LIGHT_CLAY) if (AI_DATA->atkHoldEffect == HOLD_EFFECT_LIGHT_CLAY)

View File

@ -2891,41 +2891,28 @@ bool32 ShouldRecover(u8 battlerAtk, u8 battlerDef, u16 move, u8 healPercent)
bool32 ShouldSetScreen(u8 battlerAtk, u8 battlerDef, u16 moveEffect) bool32 ShouldSetScreen(u8 battlerAtk, u8 battlerDef, u16 moveEffect)
{ {
u8 atkSide = GetBattlerSide(battlerAtk); u8 atkSide = GetBattlerSide(battlerAtk);
if (gSideTimers[atkSide].auroraVeilTimer != 0)
{
bool8 defHasPhysical = HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL);
bool8 defHasSpecial = HasMoveWithSplit(battlerDef, SPLIT_SPECIAL);
switch (moveEffect) switch (moveEffect)
{ {
case EFFECT_AURORA_VEIL: case EFFECT_AURORA_VEIL:
// Use only in Hail and only if AI doesn't already have Reflect, Light Screen or Aurora Veil itself active.
if (gBattleWeather & WEATHER_HAIL_ANY if (gBattleWeather & WEATHER_HAIL_ANY
&& !((gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN)))) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)))
return TRUE; return TRUE;
break; break;
case EFFECT_REFLECT: case EFFECT_REFLECT:
if (SideHasMoveSplit(battlerDef, SPLIT_PHYSICAL)) // Use only if the player has a physical move and AI doesn't already have Reflect itself active.
{ if (HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL)
if (!defHasPhysical && !defHasSpecial) && !(gSideStatuses[atkSide] & SIDE_STATUS_REFLECT))
return TRUE; // Target has no attacking moves so no point in doing Light Screen check
if (defHasPhysical || !HasMoveEffect(battlerAtk, EFFECT_LIGHT_SCREEN) || !defHasSpecial)
return TRUE; return TRUE;
}
break; break;
case EFFECT_LIGHT_SCREEN: case EFFECT_LIGHT_SCREEN:
if (SideHasMoveSplit(battlerDef, SPLIT_SPECIAL)) // Use only if the player has a special move and AI doesn't already have Light Screen itself active.
{ if (HasMoveWithSplit(battlerDef, SPLIT_SPECIAL)
if (!defHasPhysical && !defHasSpecial) && !(gSideStatuses[atkSide] & SIDE_STATUS_LIGHTSCREEN))
return TRUE; //Target has no attacking moves so no point in doing Light Screen check
if (defHasSpecial || !HasMoveEffect(battlerAtk, EFFECT_REFLECT) || !defHasPhysical)
return TRUE; return TRUE;
}
break; break;
} }
}
return FALSE; return FALSE;
} }