From 0999ca8ff919df44fca31d0319c18054ba6da411 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:29:19 +0100 Subject: [PATCH] Shell Trap tests and Fix for Encore interaction (#8268) Co-authored-by: PhallenTree <168426989+PhallenTree@users.noreply.github.com> --- src/battle_script_commands.c | 16 +++---- test/battle/move_effect/shell_trap.c | 65 ++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 9 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e100d3a9ca..be70970fa7 100755 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11527,14 +11527,16 @@ static void Cmd_trysetencore(void) } if ((IsMoveEncoreBanned(gLastMoves[gBattlerTarget])) + || i == MAX_MON_MOVES || gLastMoves[gBattlerTarget] == MOVE_NONE - || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE) + || gLastMoves[gBattlerTarget] == MOVE_UNAVAILABLE + || gBattleMons[gBattlerTarget].pp[i] == 0 + || gDisableStructs[gBattlerTarget].encoredMove != MOVE_NONE + || GetMoveEffect(gChosenMoveByBattler[gBattlerTarget]) == EFFECT_SHELL_TRAP) { - i = MAX_MON_MOVES; + gBattlescriptCurrInstr = cmd->failInstr; } - - if (gDisableStructs[gBattlerTarget].encoredMove == MOVE_NONE - && i != MAX_MON_MOVES && gBattleMons[gBattlerTarget].pp[i] != 0) + else { gDisableStructs[gBattlerTarget].encoredMove = gBattleMons[gBattlerTarget].moves[i]; gDisableStructs[gBattlerTarget].encoredMovePos = i; @@ -11552,10 +11554,6 @@ static void Cmd_trysetencore(void) gDisableStructs[gBattlerTarget].encoreTimer = 3; gBattlescriptCurrInstr = cmd->nextInstr; } - else - { - gBattlescriptCurrInstr = cmd->failInstr; - } } static void Cmd_painsplitdmgcalc(void) diff --git a/test/battle/move_effect/shell_trap.c b/test/battle/move_effect/shell_trap.c index 903f984929..f3f0068d6f 100644 --- a/test/battle/move_effect/shell_trap.c +++ b/test/battle/move_effect/shell_trap.c @@ -214,3 +214,68 @@ SINGLE_BATTLE_TEST("Shell Trap activates if user is hit with a physical move but HP_BAR(opponent); } } + +SINGLE_BATTLE_TEST("Encore fails if target has active Shell Trap waiting") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_SHELL_TRAP); MOVE(opponent, MOVE_ENCORE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Wobbuffet set a shell trap!"); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_ENCORE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } + } +} + +SINGLE_BATTLE_TEST("Shell Trap fails if an other -3 or lower priority Move is used") +{ + GIVEN { + ASSUME(GetMovePriority(MOVE_DRAGON_TAIL) <= -3); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { + MOVE(player, MOVE_SHELL_TRAP); + MOVE(opponent, MOVE_DRAGON_TAIL); + } + } SCENE { + MESSAGE("Wobbuffet set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DRAGON_TAIL, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, player); + } +} + +DOUBLE_BATTLE_TEST("Shell Trap does not trigger when hit into Substitute") +{ + GIVEN { + ASSUME(GetMoveCategory(MOVE_DOUBLE_EDGE) == DAMAGE_CATEGORY_PHYSICAL); + PLAYER(SPECIES_WYNAUT); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SNORLAX); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SUBSTITUTE); } + TURN { + MOVE(playerLeft, MOVE_SHELL_TRAP); + MOVE(opponentLeft, MOVE_DOUBLE_EDGE, target: playerLeft); + MOVE(opponentRight, MOVE_SCRATCH, target: playerLeft); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, playerLeft); + MESSAGE("Wynaut set a shell trap!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_DOUBLE_EDGE, opponentLeft); + MESSAGE("Wynaut's substitute faded!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHELL_TRAP, playerLeft); + } +}