From 92f3d89598427b8ca25ae75fb0681423a4e5486c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 2 Aug 2018 21:27:28 +0200 Subject: [PATCH] Gravity and Heal Block preventing after choosing a move --- include/battle.h | 2 ++ src/battle_main.c | 3 ++ src/battle_util.c | 79 +++++++++++++++++++++++++++++++++++++---------- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/include/battle.h b/include/battle.h index e62d8d7e9b..f3b9ff266b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -210,6 +210,8 @@ struct ProtectStruct u32 flag_x40:1; // 0x40 u32 flag_x80:1; // 0x80 u32 usesBouncedMove:1; + u32 usedHealBlockedMove:1; + u32 usedGravityPreventedMove:1; /* field_4 */ u32 physicalDmg; /* field_8 */ u32 specialDmg; diff --git a/src/battle_main.c b/src/battle_main.c index 84fc6531ba..0829d24559 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3253,6 +3253,9 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].flag2Unknown = 0; gProtectStructs[gActiveBattler].flinchImmobility = 0; gProtectStructs[gActiveBattler].notFirstStrike = 0; + gProtectStructs[gActiveBattler].usedHealBlockedMove = 0; + gProtectStructs[gActiveBattler].usesBouncedMove = 0; + gProtectStructs[gActiveBattler].usedGravityPreventedMove = 0; gDisableStructs[gActiveBattler].isFirstTurn = 2; diff --git a/src/battle_util.c b/src/battle_util.c index 863ce9f184..6c190bd798 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -477,6 +477,8 @@ bool8 WasUnableToUseMove(u8 battler) || gProtectStructs[battler].loveImmobility || gProtectStructs[battler].usedDisabledMove || gProtectStructs[battler].usedTauntedMove + || gProtectStructs[battler].usedGravityPreventedMove + || gProtectStructs[battler].usedHealBlockedMove || gProtectStructs[battler].flag2Unknown || gProtectStructs[battler].flinchImmobility || gProtectStructs[battler].confusionSelfDmg) @@ -1948,7 +1950,26 @@ void TryClearRageStatuses(void) } } -#define ATKCANCELLER_MAX_CASE 14 +enum +{ + CANCELLER_FLAGS, + CANCELLER_ASLEEP, + CANCELLER_FROZEN, + CANCELLER_TRUANT, + CANCELLER_RECHARGE, + CANCELLER_FLINCH, + CANCELLER_DISABLED, + CANCELLER_GRAVITY, + CANCELLER_HEAL_BLOCKED, + CANCELLER_TAUNTED, + CANCELLER_IMPRISONED, + CANCELLER_CONFUSED, + CANCELLER_PARALYSED, + CANCELLER_IN_LOVE, + CANCELLER_BIDE, + CANCELLER_THAW, + CANCELLER_END, +}; u8 AtkCanceller_UnableToUseMove(void) { @@ -1958,12 +1979,12 @@ u8 AtkCanceller_UnableToUseMove(void) { switch (gBattleStruct->atkCancellerTracker) { - case 0: // flags clear + case CANCELLER_FLAGS: // flags clear gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND); gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); gBattleStruct->atkCancellerTracker++; break; - case 1: // check being asleep + case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(gBattlerAttacker)) @@ -2007,7 +2028,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 2: // check being frozen + case CANCELLER_FROZEN: // check being frozen if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (Random() % 5) @@ -2034,7 +2055,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 3: // truant + case CANCELLER_TRUANT: // truant if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { CancelMultiTurnMoves(gBattlerAttacker); @@ -2046,7 +2067,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 4: // recharge + case CANCELLER_RECHARGE: // recharge if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE); @@ -2058,7 +2079,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 5: // flinch + case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED); @@ -2070,7 +2091,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 6: // disabled move + case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != 0) { gProtectStructs[gBattlerAttacker].usedDisabledMove = 1; @@ -2082,7 +2103,31 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 7: // taunt + case CANCELLER_HEAL_BLOCKED: + if (gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK && IsHealBlockPreventingMove(gBattlerAttacker, gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedHealBlockedMove = 1; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedHealBlockPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_GRAVITY: + if (gFieldStatuses & STATUS_FIELD_GRAVITY && IsGravityPreventingMove(gCurrentMove)) + { + gProtectStructs[gBattlerAttacker].usedGravityPreventedMove = 1; + gBattleScripting.battler = gBattlerAttacker; + CancelMultiTurnMoves(gBattlerAttacker); + gBattlescriptCurrInstr = BattleScript_MoveUsedGravityPrevents; + gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; + effect = 1; + } + gBattleStruct->atkCancellerTracker++; + break; + case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) { gProtectStructs[gBattlerAttacker].usedTauntedMove = 1; @@ -2093,7 +2138,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 8: // imprisoned + case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { gProtectStructs[gBattlerAttacker].usedImprisionedMove = 1; @@ -2104,7 +2149,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 9: // confusion + case CANCELLER_CONFUSED: // confusion if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { gBattleMons[gBattlerAttacker].status2--; @@ -2134,7 +2179,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 10: // paralysis + case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = 1; @@ -2146,7 +2191,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 11: // infatuation + case CANCELLER_IN_LOVE: // infatuation if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) { gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); @@ -2166,7 +2211,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 12: // bide + case CANCELLER_BIDE: // bide if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattleMons[gBattlerAttacker].status2 -= 0x100; @@ -2196,7 +2241,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 13: // move thawing + case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) @@ -2210,11 +2255,11 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case ATKCANCELLER_MAX_CASE: + case CANCELLER_END: break; } - } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); if (effect == 2) {