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);
switch (moveEffect)
if (gSideTimers[atkSide].auroraVeilTimer != 0)
{ {
bool8 defHasPhysical = HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL); case EFFECT_AURORA_VEIL:
bool8 defHasSpecial = HasMoveWithSplit(battlerDef, SPLIT_SPECIAL); // 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
switch (moveEffect) && !(gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN | SIDE_STATUS_AURORA_VEIL)))
{ return TRUE;
case EFFECT_AURORA_VEIL: break;
if (gBattleWeather & WEATHER_HAIL_ANY case EFFECT_REFLECT:
&& !((gSideStatuses[atkSide] & (SIDE_STATUS_REFLECT | SIDE_STATUS_LIGHTSCREEN)))) // Use only if the player has a physical move and AI doesn't already have Reflect itself active.
return TRUE; if (HasMoveWithSplit(battlerDef, SPLIT_PHYSICAL)
break; && !(gSideStatuses[atkSide] & SIDE_STATUS_REFLECT))
case EFFECT_REFLECT: return TRUE;
if (SideHasMoveSplit(battlerDef, SPLIT_PHYSICAL)) break;
{ case EFFECT_LIGHT_SCREEN:
if (!defHasPhysical && !defHasSpecial) // Use only if the player has a special move and AI doesn't already have Light Screen itself active.
return TRUE; // Target has no attacking moves so no point in doing Light Screen check if (HasMoveWithSplit(battlerDef, SPLIT_SPECIAL)
&& !(gSideStatuses[atkSide] & SIDE_STATUS_LIGHTSCREEN))
if (defHasPhysical || !HasMoveEffect(battlerAtk, EFFECT_LIGHT_SCREEN) || !defHasSpecial) return TRUE;
return TRUE; break;
}
break;
case EFFECT_LIGHT_SCREEN:
if (SideHasMoveSplit(battlerDef, SPLIT_SPECIAL))
{
if (!defHasPhysical && !defHasSpecial)
return TRUE; //Target has no attacking moves so no point in doing Light Screen check
if (defHasSpecial || !HasMoveEffect(battlerAtk, EFFECT_REFLECT) || !defHasPhysical)
return TRUE;
}
break;
}
} }
return FALSE; return FALSE;
} }