Revert gBattleTurnCounter change (#8197)

This commit is contained in:
Alex 2025-11-13 11:25:02 +01:00 committed by GitHub
parent 8d23b9dbda
commit ea442bca6d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 96 additions and 93 deletions

View File

@ -1289,7 +1289,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
// the following checks apply to any target (including user)
// throat chop check
if (gDisableStructs[battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(move))
if (gDisableStructs[battlerAtk].throatChopTimer > 0 && IsSoundMove(move))
return 0; // Can't even select move at all
// heal block check
if (gBattleMons[battlerAtk].volatiles.healBlock && IsHealBlockPreventingMove(battlerAtk, move))
@ -1993,8 +1993,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10);
break;
case EFFECT_FUTURE_SIGHT:
if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > gBattleTurnCounter
|| gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > gBattleTurnCounter)
if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0
|| gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0)
ADJUST_SCORE(-12);
else
ADJUST_SCORE(GOOD_EFFECT);
@ -2449,7 +2449,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
ADJUST_SCORE(-10);
break;
case EFFECT_WISH:
if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter)
if (gWishFutureKnock.wishCounter[battlerAtk] > 0)
ADJUST_SCORE(-10);
break;
case EFFECT_ASSIST:
@ -2619,7 +2619,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
{
// This only happens if the ally already rolled on double trick room on final turn.
// Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out.
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == (gBattleTurnCounter + 1))
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1)
ADJUST_SCORE(PERFECT_EFFECT);
else
ADJUST_SCORE(-10);
@ -2630,7 +2630,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM))
ADJUST_SCORE(-10);
// Don't unset a trick room that doesn't harm you unless it's about to expire.
else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1) && !ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM))
else if ((gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && gFieldTimers.trickRoomTimer > 1 && !ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM))
ADJUST_SCORE(-10);
}
break;
@ -2829,7 +2829,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
case EFFECT_TAILWIND:
if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_TAILWIND
|| PartnerMoveEffectIs(BATTLE_PARTNER(battlerAtk), aiData->partnerMove, EFFECT_TAILWIND)
|| (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1)))
|| (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1))
ADJUST_SCORE(-10);
break;
case EFFECT_LUCKY_CHANT:
@ -2839,7 +2839,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
break;
case EFFECT_MAGNET_RISE:
if (gFieldStatuses & STATUS_FIELD_GRAVITY
|| gDisableStructs[battlerAtk].magnetRiseTimer > gBattleTurnCounter
|| gDisableStructs[battlerAtk].magnetRiseTimer > 0
|| aiData->holdEffects[battlerAtk] == HOLD_EFFECT_IRON_BALL
|| gBattleMons[battlerAtk].volatiles.smackDown
|| gBattleMons[battlerAtk].volatiles.root
@ -3221,7 +3221,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
// Both Pokemon use Trick Room on the final turn of Trick Room to anticipate both opponents Protecting to stall out.
// This unsets Trick Room and resets it with a full timer.
case EFFECT_TRICK_ROOM:
if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == (gBattleTurnCounter + 1)
if (hasPartner && gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1
&& ShouldSetFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)
&& HasMoveWithEffect(battlerAtkPartner, EFFECT_TRICK_ROOM)
&& RandomPercentage(RNG_AI_REFRESH_TRICK_ROOM_ON_LAST_TURN, DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE))
@ -3229,7 +3229,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
break;
case EFFECT_TAILWIND:
// Anticipate both opponents protecting to stall out Trick Room, and apply Tailwind.
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == (gBattleTurnCounter + 1)
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == 1
&& RandomPercentage(RNG_AI_APPLY_TAILWIND_ON_LAST_TURN_OF_TRICK_ROOM, TAILWIND_IN_TRICK_ROOM_CHANCE))
ADJUST_SCORE(BEST_EFFECT);
break;
@ -5331,7 +5331,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru
else if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !hasPartner && (CountUsablePartyMons(battlerAtk) != 0))
ADJUST_SCORE(DECENT_EFFECT);
// Don't unset it on last turn.
else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1) && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM))
else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1 && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM))
ADJUST_SCORE(GOOD_EFFECT);
}
break;
@ -5443,7 +5443,7 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru
break;
case EFFECT_TAILWIND:
{
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1))
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer > 1)
break;
if (HasBattlerSideMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL))

View File

@ -2089,7 +2089,7 @@ bool32 ShouldSetFieldStatus(u32 battler, u32 fieldStatus)
if (!(fieldStatus & STATUS_FIELD_TRICK_ROOM))
return FALSE;
// DOUBLE_TRICK_ROOM_ON_LAST_TURN_CHANCE
else if (gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1))
else if (gFieldTimers.trickRoomTimer != 1)
return FALSE;
}

View File

@ -6833,8 +6833,8 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner)
u32 i, temp;
// if used future sight on opposing side, properly track who used it
if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > gBattleTurnCounter
|| gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > gBattleTurnCounter)
if (gWishFutureKnock.futureSightCounter[LEFT_FOE(battlerAtk)] > 0
|| gWishFutureKnock.futureSightCounter[RIGHT_FOE(battlerAtk)] > 0)
{
for (i = 0; i < gBattlersCount; i++)
{
@ -6858,8 +6858,8 @@ static void TrySwapWishBattlerIds(u32 battlerAtk, u32 battlerPartner)
}
// swap wish party indices
if (gWishFutureKnock.wishCounter[battlerAtk] > gBattleTurnCounter
|| gWishFutureKnock.wishCounter[battlerPartner] > gBattleTurnCounter)
if (gWishFutureKnock.wishCounter[battlerAtk] > 0
|| gWishFutureKnock.wishCounter[battlerPartner] > 0)
SWAP(gWishFutureKnock.wishPartyId[battlerAtk], gWishFutureKnock.wishPartyId[battlerPartner], temp);
}

View File

@ -177,7 +177,7 @@ void ActivateDynamax(u32 battler)
// Set appropriate use flags.
SetActiveGimmick(battler, GIMMICK_DYNAMAX);
SetGimmickAsActivated(battler, GIMMICK_DYNAMAX);
gBattleStruct->dynamax.dynamaxTurns[battler] = gBattleTurnCounter + DYNAMAX_TURNS_COUNT;
gBattleStruct->dynamax.dynamaxTurns[battler] = DYNAMAX_TURNS_COUNT;
// Substitute is removed upon Dynamaxing.
gBattleMons[battler].volatiles.substitute = FALSE;

View File

@ -62,24 +62,27 @@ static bool32 HandleEndTurnVarious(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK && gFieldTimers.fairyLockTimer == gBattleTurnCounter)
if (gFieldTimers.fairyLockTimer > 0 && --gFieldTimers.fairyLockTimer == 0)
gFieldStatuses &= ~STATUS_FIELD_FAIRY_LOCK;
for (i = 0; i < NUM_BATTLE_SIDES; i++)
{
if (gSideStatuses[i] & SIDE_STATUS_DAMAGE_NON_TYPES && gSideTimers[i].damageNonTypesTimer == gBattleTurnCounter)
if (gSideTimers[i].damageNonTypesTimer > 0 && --gSideTimers[i].damageNonTypesTimer == 0)
gSideStatuses[i] &= ~SIDE_STATUS_DAMAGE_NON_TYPES;
}
for (i = 0; i < gBattlersCount; i++)
{
if (gDisableStructs[i].throatChopTimer > 0)
gDisableStructs[i].throatChopTimer--;
if (gBattleMons[i].volatiles.lockOn > 0)
gBattleMons[i].volatiles.lockOn--;
if (gDisableStructs[i].chargeTimer && --gDisableStructs[i].chargeTimer == 0)
if (gDisableStructs[i].chargeTimer > 0 && --gDisableStructs[i].chargeTimer == 0)
gBattleMons[i].volatiles.charge = FALSE;
if (gBattleMons[i].volatiles.laserFocus && gDisableStructs[i].laserFocusTimer == gBattleTurnCounter)
if (gDisableStructs[i].laserFocusTimer > 0 && --gDisableStructs[i].laserFocusTimer == 0)
gBattleMons[i].volatiles.laserFocus = FALSE;
gBattleStruct->battlerState[i].wasAboveHalfHp = gBattleMons[i].hp > gBattleMons[i].maxHP / 2;
@ -246,7 +249,7 @@ static bool32 HandleEndTurnFutureSight(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gWishFutureKnock.futureSightCounter[battler] == gBattleTurnCounter)
if (gWishFutureKnock.futureSightCounter[battler] > 0 && --gWishFutureKnock.futureSightCounter[battler] == 0)
{
if (!IsBattlerAlive(battler))
return effect;
@ -278,7 +281,7 @@ static bool32 HandleEndTurnWish(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gWishFutureKnock.wishCounter[battler] == gBattleTurnCounter && IsBattlerAlive(battler))
if (gWishFutureKnock.wishCounter[battler] > 0 && --gWishFutureKnock.wishCounter[battler] == 0 && IsBattlerAlive(battler))
{
s32 wishHeal = 0;
gBattlerTarget = battler;
@ -740,7 +743,7 @@ static bool32 HandleEndTurnTorment(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gDisableStructs[battler].tormentTimer == gBattleTurnCounter)
if (gDisableStructs[battler].tormentTimer > 0 && --gDisableStructs[battler].tormentTimer == 0)
{
gBattleMons[battler].volatiles.torment = FALSE;
gBattleScripting.battler = battler;
@ -815,7 +818,7 @@ static bool32 HandleEndTurnMagnetRise(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gBattleMons[battler].volatiles.magnetRise && gDisableStructs[battler].magnetRiseTimer == gBattleTurnCounter)
if (gDisableStructs[battler].magnetRiseTimer > 0 && --gDisableStructs[battler].magnetRiseTimer == 0)
{
gBattleMons[battler].volatiles.magnetRise = FALSE;
BattleScriptExecute(BattleScript_BufferEndTurn);
@ -832,7 +835,7 @@ static bool32 HandleEndTurnTelekinesis(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gBattleMons[battler].volatiles.telekinesis && gDisableStructs[battler].telekinesisTimer == gBattleTurnCounter)
if (gDisableStructs[battler].telekinesisTimer > 0 && --gDisableStructs[battler].telekinesisTimer == 0)
{
gBattleMons[battler].volatiles.telekinesis = FALSE;
BattleScriptExecute(BattleScript_TelekinesisEndTurn);
@ -848,7 +851,7 @@ static bool32 HandleEndTurnHealBlock(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gBattleMons[battler].volatiles.healBlock && gDisableStructs[battler].healBlockTimer == gBattleTurnCounter)
if (gDisableStructs[battler].healBlockTimer > 0 && --gDisableStructs[battler].healBlockTimer == 0)
{
gBattleMons[battler].volatiles.healBlock = FALSE;
gBattleScripting.battler = battler;
@ -866,7 +869,7 @@ static bool32 HandleEndTurnEmbargo(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (gBattleMons[battler].volatiles.embargo && gDisableStructs[battler].embargoTimer == gBattleTurnCounter)
if (gDisableStructs[battler].embargoTimer > 0 && --gDisableStructs[battler].embargoTimer == 0)
{
gBattleMons[battler].volatiles.embargo = FALSE;
BattleScriptExecute(BattleScript_EmbargoEndTurn);
@ -985,7 +988,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
switch (gBattleStruct->eventState.endTurnBlock)
{
case SECOND_EVENT_BLOCK_REFLECT:
if (gSideStatuses[side] & SIDE_STATUS_REFLECT && gSideTimers[side].reflectTimer == gBattleTurnCounter)
if (gSideTimers[side].reflectTimer > 0 && --gSideTimers[side].reflectTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_REFLECT;
@ -997,7 +1000,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_LIGHT_SCREEN:
if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN && gSideTimers[side].lightscreenTimer == gBattleTurnCounter)
if (gSideTimers[side].lightscreenTimer > 0 && --gSideTimers[side].lightscreenTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN;
@ -1009,7 +1012,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_SAFEGUARD:
if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD && gSideTimers[side].safeguardTimer == gBattleTurnCounter)
if (gSideTimers[side].safeguardTimer > 0 && --gSideTimers[side].safeguardTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD;
@ -1019,7 +1022,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_MIST:
if (gSideTimers[side].mistTimer != 0 && gSideTimers[side].mistTimer == gBattleTurnCounter)
if (gSideTimers[side].mistTimer > 0 && --gSideTimers[side].mistTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_MIST;
@ -1031,7 +1034,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_TAILWIND:
if (gSideStatuses[side] & SIDE_STATUS_TAILWIND && gSideTimers[side].tailwindTimer == gBattleTurnCounter)
if (gSideTimers[side].tailwindTimer > 0 && --gSideTimers[side].tailwindTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_TAILWIND;
@ -1041,7 +1044,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_LUCKY_CHANT:
if (gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT && gSideTimers[side].luckyChantTimer == gBattleTurnCounter)
if (gSideTimers[side].luckyChantTimer > 0 && --gSideTimers[side].luckyChantTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_LUCKY_CHANT;
@ -1052,7 +1055,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
break;
case SECOND_EVENT_BLOCK_RAINBOW:
gBattlerAttacker = GetBattlerSideForMessage(side);
if (gSideStatuses[side] & SIDE_STATUS_RAINBOW && gSideTimers[side].rainbowTimer == gBattleTurnCounter)
if (gSideTimers[side].rainbowTimer > 0 && --gSideTimers[side].rainbowTimer == 0)
{
gSideStatuses[side] &= ~SIDE_STATUS_RAINBOW;
BattleScriptExecute(BattleScript_TheRainbowDisappeared);
@ -1061,7 +1064,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_SEA_OF_FIRE:
if (gSideStatuses[side] & SIDE_STATUS_SEA_OF_FIRE && gSideTimers[side].seaOfFireTimer == gBattleTurnCounter)
if (gSideTimers[side].seaOfFireTimer > 0 && --gSideTimers[side].seaOfFireTimer == 0)
{
gSideStatuses[side] &= ~SIDE_STATUS_SEA_OF_FIRE;
BattleScriptExecute(BattleScript_TheSeaOfFireDisappeared);
@ -1071,7 +1074,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
break;
case SECOND_EVENT_BLOCK_SWAMP:
gBattlerAttacker = GetBattlerSideForMessage(side);
if (gSideStatuses[side] & SIDE_STATUS_SWAMP && gSideTimers[side].swampTimer == gBattleTurnCounter)
if (gSideTimers[side].swampTimer > 0 && --gSideTimers[side].swampTimer == 0)
{
gSideStatuses[side] &= ~SIDE_STATUS_SWAMP;
BattleScriptExecute(BattleScript_TheSwampDisappeared);
@ -1080,7 +1083,7 @@ static bool32 HandleEndTurnSecondEventBlock(u32 battler)
gBattleStruct->eventState.endTurnBlock++;
break;
case SECOND_EVENT_BLOCK_AURORA_VEIL:
if (gSideStatuses[side] & SIDE_STATUS_AURORA_VEIL && gSideTimers[side].auroraVeilTimer == gBattleTurnCounter)
if (gSideTimers[side].auroraVeilTimer > 0 && --gSideTimers[side].auroraVeilTimer == 0)
{
gBattlerAttacker = GetBattlerSideForMessage(side);
gSideStatuses[side] &= ~SIDE_STATUS_AURORA_VEIL;
@ -1103,7 +1106,7 @@ static bool32 HandleEndTurnTrickRoom(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer == gBattleTurnCounter)
if (gFieldTimers.trickRoomTimer > 0 && --gFieldTimers.trickRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_TRICK_ROOM;
BattleScriptExecute(BattleScript_TrickRoomEnds);
@ -1119,7 +1122,7 @@ static bool32 HandleEndTurnGravity(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_GRAVITY && gFieldTimers.gravityTimer == gBattleTurnCounter)
if (gFieldTimers.gravityTimer > 0 && --gFieldTimers.gravityTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_GRAVITY;
BattleScriptExecute(BattleScript_GravityEnds);
@ -1135,7 +1138,7 @@ static bool32 HandleEndTurnWaterSport(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_WATERSPORT && gFieldTimers.waterSportTimer == gBattleTurnCounter)
if (gFieldTimers.waterSportTimer > 0 && --gFieldTimers.waterSportTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_WATERSPORT;
BattleScriptExecute(BattleScript_WaterSportEnds);
@ -1151,7 +1154,7 @@ static bool32 HandleEndTurnMudSport(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_MUDSPORT && gFieldTimers.mudSportTimer == gBattleTurnCounter)
if (gFieldTimers.mudSportTimer > 0 && --gFieldTimers.mudSportTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_MUDSPORT;
BattleScriptExecute(BattleScript_MudSportEnds);
@ -1167,7 +1170,7 @@ static bool32 HandleEndTurnWonderRoom(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_WONDER_ROOM && gFieldTimers.wonderRoomTimer == gBattleTurnCounter)
if (gFieldTimers.wonderRoomTimer > 0 && --gFieldTimers.wonderRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_WONDER_ROOM;
BattleScriptExecute(BattleScript_WonderRoomEnds);
@ -1183,7 +1186,7 @@ static bool32 HandleEndTurnMagicRoom(u32 battler)
gBattleStruct->eventState.endTurn++;
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM && gFieldTimers.magicRoomTimer == gBattleTurnCounter)
if (gFieldTimers.magicRoomTimer > 0 && --gFieldTimers.magicRoomTimer == 0)
{
gFieldStatuses &= ~STATUS_FIELD_MAGIC_ROOM;
BattleScriptExecute(BattleScript_MagicRoomEnds);
@ -1195,7 +1198,7 @@ static bool32 HandleEndTurnMagicRoom(u32 battler)
static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId)
{
if (gFieldStatuses & terrainFlag && gFieldTimers.terrainTimer == gBattleTurnCounter)
if (gFieldTimers.terrainTimer > 0 && --gFieldTimers.terrainTimer == 0)
{
gFieldStatuses &= ~terrainFlag;
TryToRevertMimicryAndFlags();
@ -1367,7 +1370,7 @@ static bool32 HandleEndTurnDynamax(u32 battler)
gBattleStruct->eventState.endTurnBattler++;
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] == gBattleTurnCounter)
if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX && gBattleStruct->dynamax.dynamaxTurns[battler] > 0 && --gBattleStruct->dynamax.dynamaxTurns[battler] == 0)
{
gBattleScripting.battler = battler;
UndoDynamax(battler);

View File

@ -2810,9 +2810,9 @@ static inline bool32 TrySetReflect(u32 battler)
{
gSideStatuses[side] |= SIDE_STATUS_REFLECT;
if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY)
gSideTimers[side].reflectTimer = gBattleTurnCounter + 8;
gSideTimers[side].reflectTimer = 8;
else
gSideTimers[side].reflectTimer = gBattleTurnCounter + 5;
gSideTimers[side].reflectTimer = 5;
if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE;
@ -2831,9 +2831,9 @@ static inline bool32 TrySetLightScreen(u32 battler)
{
gSideStatuses[side] |= SIDE_STATUS_LIGHTSCREEN;
if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_LIGHT_CLAY)
gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 8;
gSideTimers[side].lightscreenTimer = 8;
else
gSideTimers[side].lightscreenTimer = gBattleTurnCounter + 5;
gSideTimers[side].lightscreenTimer = 5;
if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, battler) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE;
@ -3382,7 +3382,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
}
break;
case MOVE_EFFECT_THROAT_CHOP:
gDisableStructs[gEffectBattler].throatChopTimer = gBattleTurnCounter + 2;
gDisableStructs[gEffectBattler].throatChopTimer = 2;
gBattlescriptCurrInstr = battleScript;
break;
case MOVE_EFFECT_INCINERATE:
@ -3523,7 +3523,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
else if (!gBattleMons[gEffectBattler].volatiles.healBlock)
{
gBattleMons[gEffectBattler].volatiles.healBlock = TRUE;
gDisableStructs[gEffectBattler].healBlockTimer = gBattleTurnCounter + 2;
gDisableStructs[gEffectBattler].healBlockTimer = 2;
BattleScriptPush(battleScript);
gBattlescriptCurrInstr = BattleScript_EffectPsychicNoise;
}
@ -3808,9 +3808,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY;
gFieldStatuses |= statusFlag;
if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_TERRAIN_EXTENDER)
gFieldTimers.terrainTimer = gBattleTurnCounter + 8;
gFieldTimers.terrainTimer = 8;
else
gFieldTimers.terrainTimer = gBattleTurnCounter + 5;
gFieldTimers.terrainTimer = 5;
BattleScriptPush(battleScript);
gBattlescriptCurrInstr = BattleScript_EffectSetTerrain;
}
@ -3826,7 +3826,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
{
u32 moveType = GetMoveType(gCurrentMove);
gSideStatuses[side] |= SIDE_STATUS_DAMAGE_NON_TYPES;
gSideTimers[side].damageNonTypesTimer = gBattleTurnCounter + 5; // damage is dealt for 4 turns, ends on 5th
gSideTimers[side].damageNonTypesTimer = 5;
gSideTimers[side].damageNonTypesType = moveType;
BattleScriptPush(battleScript);
ChooseDamageNonTypesString(moveType);
@ -3857,9 +3857,9 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
{
gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_AURORA_VEIL;
if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY)
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8;
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8;
else
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5;
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD;
BattleScriptPush(battleScript);
gBattlescriptCurrInstr = BattleScript_MoveEffectAuroraVeil;
@ -3869,7 +3869,7 @@ void SetMoveEffect(u32 battler, u32 effectBattler, enum MoveEffect moveEffect, c
if (!(gFieldStatuses & STATUS_FIELD_GRAVITY))
{
gFieldStatuses |= STATUS_FIELD_GRAVITY;
gFieldTimers.gravityTimer = gBattleTurnCounter + 5;
gFieldTimers.gravityTimer = 5;
BattleScriptPush(battleScript);
gBattlescriptCurrInstr = BattleScript_EffectGravitySuccess;
}
@ -7142,7 +7142,7 @@ static void Cmd_sethealblock(void)
else
{
gBattleMons[gBattlerTarget].volatiles.healBlock = TRUE;
gDisableStructs[gBattlerTarget].healBlockTimer = gBattleTurnCounter + 5;
gDisableStructs[gBattlerTarget].healBlockTimer = 5;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
@ -8686,7 +8686,7 @@ static void Cmd_setgravity(void)
else
{
gFieldStatuses |= STATUS_FIELD_GRAVITY;
gFieldTimers.gravityTimer = gBattleTurnCounter + 5;
gFieldTimers.gravityTimer = 5;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
@ -11104,7 +11104,7 @@ static void Cmd_setmist(void)
}
else
{
gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = gBattleTurnCounter + 5;
gSideTimers[GetBattlerSide(gBattlerAttacker)].mistTimer = 5;
gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_MIST;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST;
}
@ -11665,7 +11665,7 @@ static void Cmd_settailwind(void)
if (!(gSideStatuses[side] & SIDE_STATUS_TAILWIND))
{
gSideStatuses[side] |= SIDE_STATUS_TAILWIND;
gSideTimers[side].tailwindTimer = gBattleTurnCounter + (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3);
gSideTimers[side].tailwindTimer = (B_TAILWIND_TURNS >= GEN_5 ? 4 : 3);
gBattlescriptCurrInstr = cmd->nextInstr;
}
else
@ -11990,7 +11990,7 @@ static void Cmd_setembargo(void)
else
{
gBattleMons[gBattlerTarget].volatiles.embargo = TRUE;
gDisableStructs[gBattlerTarget].embargoTimer = gBattleTurnCounter + 5;
gDisableStructs[gBattlerTarget].embargoTimer = 5;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
@ -12055,7 +12055,7 @@ static void Cmd_setsafeguard(void)
else
{
gSideStatuses[GetBattlerSide(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD;
gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = gBattleTurnCounter + 5;
gSideTimers[GetBattlerSide(gBattlerAttacker)].safeguardTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD;
}
@ -12375,7 +12375,7 @@ static void Cmd_setfutureattack(void)
gWishFutureKnock.futureSightMove[gBattlerTarget] = gCurrentMove;
gWishFutureKnock.futureSightBattlerIndex[gBattlerTarget] = gBattlerAttacker;
gWishFutureKnock.futureSightPartyIndex[gBattlerTarget] = gBattlerPartyIndexes[gBattlerAttacker];
gWishFutureKnock.futureSightCounter[gBattlerTarget] = gBattleTurnCounter + 3;
gWishFutureKnock.futureSightCounter[gBattlerTarget] = 3;
if (gCurrentMove == MOVE_DOOM_DESIRE)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE;
@ -12826,9 +12826,9 @@ static void Cmd_trywish(void)
{
gBattlescriptCurrInstr = cmd->failInstr;
}
else if (gWishFutureKnock.wishCounter[gBattlerAttacker] <= gBattleTurnCounter)
else if (gWishFutureKnock.wishCounter[gBattlerAttacker] == 0)
{
gWishFutureKnock.wishCounter[gBattlerAttacker] = gBattleTurnCounter + 2;
gWishFutureKnock.wishCounter[gBattlerAttacker] = 2;
gWishFutureKnock.wishPartyId[gBattlerAttacker] = gBattlerPartyIndexes[gBattlerAttacker];
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -12934,7 +12934,7 @@ static void HandleRoomMove(u32 statusFlag, u16 *timer, u8 stringId)
else
{
gFieldStatuses |= statusFlag;
*timer = gBattleTurnCounter + 5;
*timer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = stringId;
}
}
@ -13077,10 +13077,10 @@ static void Cmd_trysetvolatile(void)
switch (cmd->_volatile)
{
case VOLATILE_MAGNET_RISE:
gDisableStructs[battler].magnetRiseTimer = gBattleTurnCounter + 5;
gDisableStructs[battler].magnetRiseTimer = 5;
break;
case VOLATILE_LASER_FOCUS:
gDisableStructs[battler].laserFocusTimer = gBattleTurnCounter + 2;
gDisableStructs[battler].laserFocusTimer = 2;
break;
default:
break;
@ -13287,7 +13287,7 @@ static void Cmd_settypebasedhalvers(void)
if (!(gFieldStatuses & STATUS_FIELD_MUDSPORT))
{
gFieldStatuses |= STATUS_FIELD_MUDSPORT;
gFieldTimers.mudSportTimer = gBattleTurnCounter + 5;
gFieldTimers.mudSportTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC;
worked = TRUE;
}
@ -13309,7 +13309,7 @@ static void Cmd_settypebasedhalvers(void)
if (!(gFieldStatuses & STATUS_FIELD_WATERSPORT))
{
gFieldStatuses |= STATUS_FIELD_WATERSPORT;
gFieldTimers.waterSportTimer = gBattleTurnCounter + 5;
gFieldTimers.waterSportTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE;
worked = TRUE;
}
@ -14293,7 +14293,7 @@ static void Cmd_settelekinesis(void)
else
{
gBattleMons[gBattlerTarget].volatiles.telekinesis = TRUE;
gDisableStructs[gBattlerTarget].telekinesisTimer = gBattleTurnCounter + 3;
gDisableStructs[gBattlerTarget].telekinesisTimer = 3;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
@ -15300,13 +15300,13 @@ void BS_SetPledgeStatus(void)
switch (cmd->sideStatus)
{
case SIDE_STATUS_RAINBOW:
gSideTimers[side].rainbowTimer = gBattleTurnCounter + 4;
gSideTimers[side].rainbowTimer = 4;
break;
case SIDE_STATUS_SEA_OF_FIRE:
gSideTimers[side].seaOfFireTimer = gBattleTurnCounter + 4;
gSideTimers[side].seaOfFireTimer = 4;
break;
case SIDE_STATUS_SWAMP:
gSideTimers[side].swampTimer = gBattleTurnCounter + 4;
gSideTimers[side].swampTimer = 4;
}
gBattlescriptCurrInstr = cmd->nextInstr;
@ -16261,7 +16261,7 @@ void BS_TrySetTorment(void)
&& !IsAbilityOnSide(gBattlerTarget, ABILITY_AROMA_VEIL))
{
gBattleMons[gBattlerTarget].volatiles.torment = TRUE;
gDisableStructs[gBattlerTarget].tormentTimer = gBattleTurnCounter + 3; // 3 turns excluding current turn
gDisableStructs[gBattlerTarget].tormentTimer = 3;
gEffectBattler = gBattlerTarget;
gBattlescriptCurrInstr = cmd->nextInstr;
}
@ -16595,7 +16595,7 @@ void BS_TrySetFairyLock(void)
else
{
gFieldStatuses |= STATUS_FIELD_FAIRY_LOCK;
gFieldTimers.fairyLockTimer = gBattleTurnCounter + 2;
gFieldTimers.fairyLockTimer = 2;
gBattlescriptCurrInstr = cmd->nextInstr;
}
}
@ -17147,7 +17147,7 @@ void BS_SetLuckyChant(void)
if (!(gSideStatuses[side] & SIDE_STATUS_LUCKY_CHANT))
{
gSideStatuses[side] |= SIDE_STATUS_LUCKY_CHANT;
gSideTimers[side].luckyChantTimer = gBattleTurnCounter + 5;
gSideTimers[side].luckyChantTimer = 5;
gBattlescriptCurrInstr = cmd->nextInstr;
}
else
@ -17519,9 +17519,9 @@ void BS_SetAuroraVeil(void)
{
gSideStatuses[side] |= SIDE_STATUS_AURORA_VEIL;
if (GetBattlerHoldEffect(gBattlerAttacker) == HOLD_EFFECT_LIGHT_CLAY)
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 8;
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 8;
else
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = gBattleTurnCounter + 5;
gSideTimers[GetBattlerSide(gBattlerAttacker)].auroraVeilTimer = 5;
if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;

View File

@ -1442,7 +1442,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler)
}
}
if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move))
if (DYNAMAX_BYPASS_CHECK && GetActiveGimmick(battler) != GIMMICK_Z_MOVE && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move))
{
gCurrentMove = move;
if (gBattleTypeFlags & BATTLE_TYPE_PALACE)
@ -1683,7 +1683,7 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check)
else if (check & MOVE_LIMITATION_BELCH && IsBelchPreventingMove(battler, move))
unusableMoves |= 1u << i;
// Throat Chop
else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > gBattleTurnCounter && IsSoundMove(move))
else if (check & MOVE_LIMITATION_THROAT_CHOP && gDisableStructs[battler].throatChopTimer > 0 && IsSoundMove(move))
unusableMoves |= 1u << i;
// Stuff Cheeks
else if (check & MOVE_LIMITATION_STUFF_CHEEKS && moveEffect == EFFECT_STUFF_CHEEKS && GetItemPocket(gBattleMons[battler].item) != POCKET_BERRIES)
@ -2185,7 +2185,7 @@ static enum MoveCanceller CancellerVolatileBlocked(struct BattleContext *ctx)
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
return MOVE_STEP_FAILURE;
}
else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > gBattleTurnCounter && IsSoundMove(ctx->currentMove))
else if (GetActiveGimmick(ctx->battlerAtk) != GIMMICK_Z_MOVE && gDisableStructs[ctx->battlerAtk].throatChopTimer > 0 && IsSoundMove(ctx->currentMove))
{
gProtectStructs[ctx->battlerAtk].unableToUseMove = TRUE;
CancelMultiTurnMoves(ctx->battlerAtk, SKY_DROP_ATTACKCANCELLER_CHECK);
@ -2634,7 +2634,7 @@ static enum MoveCanceller CancellerMoveFailure(struct BattleContext *ctx)
battleScript = BattleScript_ButItFailed;
break;
case EFFECT_FUTURE_SIGHT:
if (gWishFutureKnock.futureSightCounter[ctx->battlerDef] > gBattleTurnCounter)
if (gWishFutureKnock.futureSightCounter[ctx->battlerDef] > 0)
battleScript = BattleScript_ButItFailed;
break;
case EFFECT_LAST_RESORT:
@ -3200,9 +3200,9 @@ bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag)
for (u32 i = 0; i < gBattlersCount; i++)
gDisableStructs[i].terrainAbilityDone = FALSE;
if (GetBattlerHoldEffect(battler) == HOLD_EFFECT_TERRAIN_EXTENDER)
gFieldTimers.terrainTimer = gBattleTurnCounter + 8;
gFieldTimers.terrainTimer = 8;
else
gFieldTimers.terrainTimer = gBattleTurnCounter + 5;
gFieldTimers.terrainTimer = 5;
gBattleScripting.battler = battler;
return TRUE;
}
@ -3583,7 +3583,7 @@ static inline bool32 SetStartingFieldStatus(u32 flag, u32 message, u32 anim, u16
gFieldStatuses |= flag;
gBattleScripting.animArg1 = anim;
if (gBattleStruct->startingStatusTimer)
*timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer;
*timer = gBattleStruct->startingStatusTimer;
else
*timer = 0; // Infinite
@ -3602,7 +3602,7 @@ static inline bool32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32
gSideStatuses[side] |= flag;
gBattleScripting.animArg1 = anim;
if (gBattleStruct->startingStatusTimer)
*timer = gBattleTurnCounter + gBattleStruct->startingStatusTimer;
*timer = gBattleStruct->startingStatusTimer;
else
*timer = 0; // Infinite
@ -3975,7 +3975,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
case ABILITY_SLOW_START:
if (!gSpecialStatuses[battler].switchInAbilityDone)
{
gDisableStructs[battler].slowStartTimer = gBattleTurnCounter + 5;
gDisableStructs[battler].slowStartTimer = 5;
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_SLOWSTART;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg);
@ -4675,7 +4675,7 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab
gDisableStructs[gBattlerAttacker].truantCounter ^= 1;
break;
case ABILITY_SLOW_START:
if (gDisableStructs[battler].slowStartTimer == gBattleTurnCounter)
if (gDisableStructs[battler].slowStartTimer > 0 && --gDisableStructs[battler].slowStartTimer == 0)
{
BattleScriptExecute(BattleScript_SlowStartEnds);
effect++;
@ -7480,7 +7480,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(2.0));
break;
case ABILITY_SLOW_START:
if (gDisableStructs[battlerAtk].slowStartTimer > gBattleTurnCounter)
if (gDisableStructs[battlerAtk].slowStartTimer > 0)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(0.5));
break;
case ABILITY_SOLAR_POWER: