diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0b7a765f6c..6926173dbb 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1140,10 +1140,11 @@ .4byte \failInstr .endm - .macro trywish turnNumber:req, failInstr:req + .macro trywish turnNumber:req, failInstr:req, blockedInstr:req .byte 0xd4 .byte \turnNumber .4byte \failInstr + .4byte \blockedInstr .endm .macro settoxicspikes failInstr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7abff820b9..41afb65a5d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5033,7 +5033,7 @@ BattleScript_EffectWish:: attackcanceler attackstring ppreduce - trywish 0, BattleScript_ButItFailed + trywish 0, BattleScript_ButItFailed, BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd @@ -6675,7 +6675,7 @@ BattleScript_SelectingNotAllowedCurrentMoveInPalace:: goto BattleScript_SelectingUnusableMoveInPalace BattleScript_WishComesTrue:: - trywish 1, BattleScript_WishButFullHp + trywish 1, BattleScript_WishButFullHp, BattleScript_WishButHealBlocked playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG @@ -6694,6 +6694,14 @@ BattleScript_WishButFullHp:: waitmessage B_WAIT_TIME_LONG end2 +BattleScript_WishButHealBlocked:: + printstring STRINGID_PKMNWISHCAMETRUE + waitmessage B_WAIT_TIME_LONG + pause B_WAIT_TIME_SHORT + printstring STRINGID_HEALBLOCKPREVENTSUSAGE + waitmessage B_WAIT_TIME_LONG + end2 + BattleScript_IngrainTurnHeal:: playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL printstring STRINGID_PKMNABSORBEDNUTRIENTS diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 407d87a017..2d301679be 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15150,7 +15150,7 @@ static void Cmd_trycopyability(void) static void Cmd_trywish(void) { - CMD_ARGS(u8 turnNumber, const u8 *failInstr); + CMD_ARGS(u8 turnNumber, const u8 *failInstr, const u8 *healBlockedInstr); switch (cmd->turnNumber) { @@ -15174,7 +15174,9 @@ static void Cmd_trywish(void) gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); gBattleStruct->moveDamage[gBattlerTarget] *= -1; - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + gBattlescriptCurrInstr = cmd->healBlockedInstr; + else if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = cmd->failInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c index e96a3e1b11..a38529d792 100644 --- a/test/battle/move_effect/wish.c +++ b/test/battle/move_effect/wish.c @@ -1,4 +1,41 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Wish heals the user at the end of the next turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); MOVE(opponent, MOVE_POUND); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Wobbuffet's wish came true!"); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Wish is blocked by Heal Block") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); MOVE(opponent, MOVE_POUND); } + TURN { MOVE(opponent, MOVE_HEAL_BLOCK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponent); + MESSAGE("Wobbuffet was prevented from healing!"); + NOT HP_BAR(player); + } +} TO_DO_BATTLE_TEST("TODO: Write Wish (Move Effect) test titles")