From ea6ce80ad4b785f696c615f37cae366c5676bea7 Mon Sep 17 00:00:00 2001 From: BuffelSaft Date: Wed, 1 Sep 2021 19:57:03 +1200 Subject: [PATCH] Fix protect-like moves Make Protect-like moves (King's Shield etc.) activate only if the attacker would've touched the target. This does not handle Sucker Punch, because that's not working correctly with Protect currently and will need to be addressed separately. --- include/battle.h | 1 + src/battle_script_commands.c | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/battle.h b/include/battle.h index b51a3d71b1..524f8cd967 100644 --- a/include/battle.h +++ b/include/battle.h @@ -100,6 +100,7 @@ struct DisableStruct u8 truantCounter:1; u8 truantSwitchInHack:1; u8 mimickedMoves:4; + u8 touchedProtectLike: 1; u8 rechargeTimer; u8 autotomizeCount; u8 slowStartTimer; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 21bc7945b9..4ba55668ea 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1454,6 +1454,8 @@ static void Cmd_attackcanceler(void) && (gCurrentMove != MOVE_CURSE || IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GHOST)) && ((!IsTwoTurnsMove(gCurrentMove) || (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS)))) { + if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + gDisableStructs[gBattlerAttacker].touchedProtectLike = 1; CancelMultiTurnMoves(gBattlerAttacker); gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; @@ -4776,10 +4778,11 @@ static void Cmd_moveend(void) switch (gBattleScripting.moveendState) { case MOVEEND_PROTECT_LIKE_EFFECT: - if (gBattleMoves[gCurrentMove].flags & FLAG_MAKES_CONTACT) + if (gDisableStructs[gBattlerAttacker].touchedProtectLike) { if (gProtectStructs[gBattlerTarget].spikyShielded && GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD) { + gDisableStructs[gBattlerAttacker].touchedProtectLike = 0; gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -4790,6 +4793,7 @@ static void Cmd_moveend(void) } else if (gProtectStructs[gBattlerTarget].kingsShielded) { + gDisableStructs[gBattlerAttacker].touchedProtectLike = 0; i = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = i; // gBattlerTarget and gBattlerAttacker are swapped in order to activate Defiant, if applicable @@ -4800,6 +4804,7 @@ static void Cmd_moveend(void) } else if (gProtectStructs[gBattlerTarget].banefulBunkered) { + gDisableStructs[gBattlerAttacker].touchedProtectLike = 0; gBattleScripting.moveEffect = MOVE_EFFECT_POISON | MOVE_EFFECT_AFFECTS_USER; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_BANEFUL_BUNKER); BattleScriptPushCursor();