From 34e91dd96ff2949683ee7cc125ed11622fc5c888 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Thu, 24 Apr 2025 14:26:23 +0100 Subject: [PATCH] Fixes Unburden doubling speed when affected by Neutralizing Gas (#6691) --- src/battle_main.c | 4 +- test/battle/ability/unburden.c | 101 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/battle/ability/unburden.c diff --git a/src/battle_main.c b/src/battle_main.c index 85194a0d54..7bb13fa5c2 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4750,6 +4750,8 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; else if (ability == ABILITY_QUARK_DRIVE && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED) && (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN || gDisableStructs[battler].boosterEnergyActivates)) speed = (GetHighestStatId(battler) == STAT_SPEED) ? (speed * 150) / 100 : speed; + else if (ability == ABILITY_UNBURDEN && gDisableStructs[battler].unburdenActive) + speed *= 2; // stat stages speed *= gStatStageRatios[gBattleMons[battler].statStages[STAT_SPEED]][0]; @@ -4776,8 +4778,6 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) // various effects if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_TAILWIND) speed *= 2; - if (gDisableStructs[battler].unburdenActive) - speed *= 2; // paralysis drop if (gBattleMons[battler].status1 & STATUS1_PARALYSIS && ability != ABILITY_QUICK_FEET) diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c new file mode 100644 index 0000000000..63a72e2ace --- /dev/null +++ b/test/battle/ability/unburden.c @@ -0,0 +1,101 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") +{ + GIVEN { + ASSUME(ItemId_GetHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_SEEDS); + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_GRASSY_SEED); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } + OPPONENT(SPECIES_RILLABOOM) { Speed(7); Ability(ABILITY_GRASSY_SURGE); } + } WHEN { + TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, opponent); + ABILITY_POPUP(opponent, ABILITY_GRASSY_SURGE); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 2, doubled speed + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } +} + +SINGLE_BATTLE_TEST("Unburden doubles speed once user gets their item knocked off") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } + } WHEN { + TURN { MOVE(opponent, MOVE_KNOCK_OFF); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 2, doubled speed + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } +} + +SINGLE_BATTLE_TEST("Unburden doesn't activate when item is consumed in Neutralizing Gas") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } + OPPONENT(SPECIES_WEEZING) { Speed(7); Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } + } WHEN { + TURN { MOVE(opponent, MOVE_KNOCK_OFF); } + TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } + TURN { } + } SCENE { + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 2, no speed increase + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, opponent); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 3, no speed increase + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + } +} + +SINGLE_BATTLE_TEST("Unburden doubling speed effect is ignored by Neutralizing Gas") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); + ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } + OPPONENT(SPECIES_WEEZING) { Speed(7); Ability(ABILITY_NEUTRALIZING_GAS); } + } WHEN { + TURN { MOVE(opponent, MOVE_KNOCK_OFF); } + TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 1); } + TURN { MOVE(opponent, MOVE_U_TURN); SEND_OUT(opponent, 0); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 2, doubled speed + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, opponent); + ABILITY_POPUP(opponent, ABILITY_NEUTRALIZING_GAS); + // Turn 3, no speed increase + ANIMATION(ANIM_TYPE_MOVE, MOVE_U_TURN, opponent); + MESSAGE("The effects of the neutralizing gas wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + // Turn 4, doubled speed + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + } +}