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 b51a3d71b..524f8cd96 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 21bc7945b..4ba55668e 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();