From 59a159c338d5107f879b3a38d5f6e1cacd73ad7f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 18 Dec 2023 16:02:07 +0100 Subject: [PATCH] Fix Ice Face ignoring move effects (#3755) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- data/battle_scripts_1.s | 8 +------- include/battle.h | 1 + src/battle_script_commands.c | 21 +++++++++++++++++++++ src/battle_util.c | 9 --------- test/battle/move_effect/hit_escape.c | 18 ++++++++++++++++++ 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 80b50fb208..28dcc6842c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9096,14 +9096,8 @@ BattleScript_SoundproofProtected:: goto BattleScript_MoveEnd BattleScript_IceFaceNullsDamage:: - attackstring - attackanimation - waitanimation - effectivenesssound - hitanimation BS_TARGET - waitstate call BattleScript_TargetFormChangeWithString - goto BattleScript_MoveEnd + return BattleScript_DazzlingProtected:: attackstring diff --git a/include/battle.h b/include/battle.h index 5b258d156f..4f5af755b6 100644 --- a/include/battle.h +++ b/include/battle.h @@ -59,6 +59,7 @@ struct ResourceFlags #define RESOURCE_FLAG_TRACED 0x10 #define RESOURCE_FLAG_EMERGENCY_EXIT 0x20 #define RESOURCE_FLAG_NEUTRALIZING_GAS 0x40 +#define RESOURCE_FLAG_ICE_FACE 0x80 struct DisableStruct { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d4cae009ce..e1b396aa70 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2016,6 +2016,16 @@ static void Cmd_adjustdamage(void) gBattleStruct->enduredDamage |= gBitTable[gBattlerTarget]; goto END; } + if (GetBattlerAbility(gBattlerTarget) == ABILITY_ICE_FACE && IS_MOVE_PHYSICAL(gCurrentMove) && gBattleMons[gBattlerTarget].species == SPECIES_EISCUE) + { + // Damage deals typeless 0 HP. + gMoveResultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_NOT_VERY_EFFECTIVE); + gBattleMoveDamage = 0; + RecordAbilityBattle(gBattlerTarget, ABILITY_ICE_FACE); + gBattleResources->flags->flags[gBattlerTarget] |= RESOURCE_FLAG_ICE_FACE; + // Form change will be done after attack animation in Cmd_resultmessage. + goto END; + } if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) goto END; @@ -2483,6 +2493,17 @@ static void Cmd_resultmessage(void) if (gBattleControllerExecFlags) return; + // Do Ice Face form change which was set up in Cmd_adjustdamage. + if (gBattleResources->flags->flags[gBattlerTarget] & RESOURCE_FLAG_ICE_FACE) + { + gBattleResources->flags->flags[gBattlerTarget] &= ~(RESOURCE_FLAG_ICE_FACE); + gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE_FACE; + gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED + BattleScriptPushCursor(); + gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage; + return; + } + if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { if (gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK) // Wonder Guard or Levitate - show the ability pop-up diff --git a/src/battle_util.c b/src/battle_util.c index e70691d68d..8ab84fb762 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5061,15 +5061,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 gBattlescriptCurrInstr = BattleScript_GoodAsGoldActivates; effect = 1; } - else if (gLastUsedAbility == ABILITY_ICE_FACE && IS_MOVE_PHYSICAL(move) && gBattleMons[gBattlerTarget].species == SPECIES_EISCUE_ICE_FACE) - { - gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE_FACE; - if (gBattleMons[gBattlerAttacker].status2 & STATUS2_MULTIPLETURNS) - gHitMarker |= HITMARKER_NO_PPDEDUCT; - gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED - gBattlescriptCurrInstr = BattleScript_IceFaceNullsDamage; - effect = 1; - } break; } case ABILITYEFFECT_ABSORBING: // 3 diff --git a/test/battle/move_effect/hit_escape.c b/test/battle/move_effect/hit_escape.c index 3675dc78a8..b9d1bc99e7 100644 --- a/test/battle/move_effect/hit_escape.c +++ b/test/battle/move_effect/hit_escape.c @@ -94,3 +94,21 @@ SINGLE_BATTLE_TEST("U-turn switches the user out if Wimp Out fails to activate") MESSAGE("Your foe's weak! Get 'em, Wynaut!"); } } + +SINGLE_BATTLE_TEST("U-turn switches the user out after Ice Face activates") +{ + GIVEN { + ASSUME(P_GEN_8_POKEMON == TRUE); + PLAYER(SPECIES_BEEDRILL); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_EISCUE) { Ability(ABILITY_ICE_FACE); } + } WHEN { + TURN { MOVE(player, MOVE_U_TURN); SEND_OUT(player, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, player); + HP_BAR(opponent); + ABILITY_POPUP(opponent, ABILITY_ICE_FACE); + MESSAGE("Foe Eiscue transformed!"); + MESSAGE("Go! Wynaut!"); + } +}