Gravity and Heal Block preventing after choosing a move
This commit is contained in:
parent
c7baa71a5e
commit
92f3d89598
3 changed files with 67 additions and 17 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue