From 7fd0239370994d73407c7ed4006a0ebf0faf7e09 Mon Sep 17 00:00:00 2001 From: sneed <56992013+Sneed69@users.noreply.github.com> Date: Wed, 5 Jun 2024 06:38:04 +0300 Subject: [PATCH 1/2] Rampage moves always confuse on final turn (#4722) * rampage moves confuse on the final turn * fix B_RAMPAGE_CANCELLING < GEN_5 * Remove pointless assumes --- src/battle_util.c | 13 +++++++++++-- test/battle/move_effect_secondary/thrash.c | 21 +++++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 08deb4fb59..77b02637d4 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1029,11 +1029,20 @@ void MarkBattlerReceivedLinkData(u32 battler) const u8* CancelMultiTurnMoves(u32 battler) { const u8 *result = NULL; - gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); - gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); gBattleMons[battler].status2 &= ~(STATUS2_UPROAR); gBattleMons[battler].status2 &= ~(STATUS2_BIDE); + if (B_RAMPAGE_CANCELLING < GEN_5) + { + gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + gBattleMons[battler].status2 &= ~(STATUS2_LOCK_CONFUSE); + } + else if (!(gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) + || ((gBattleMons[battler].status2 & STATUS2_LOCK_CONFUSE) > STATUS2_LOCK_CONFUSE_TURN(1))) + { + gBattleMons[battler].status2 &= ~(STATUS2_MULTIPLETURNS); + } + // Clear battler's semi-invulnerable bits if they are not held by Sky Drop. if (!(gStatuses3[battler] & STATUS3_SKY_DROPPED)) gStatuses3[battler] &= ~(STATUS3_SEMI_INVULNERABLE); diff --git a/test/battle/move_effect_secondary/thrash.c b/test/battle/move_effect_secondary/thrash.c index 5ceb56f6dc..83a49554d7 100644 --- a/test/battle/move_effect_secondary/thrash.c +++ b/test/battle/move_effect_secondary/thrash.c @@ -46,7 +46,6 @@ SINGLE_BATTLE_TEST("Thrash confuses the user after it finishes") SINGLE_BATTLE_TEST("Thrash does not confuse the user if it is canceled on turn 1 of 3") { GIVEN { - ASSUME(B_RAMPAGE_CANCELLING >= GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -61,7 +60,6 @@ SINGLE_BATTLE_TEST("Thrash does not confuse the user if it is canceled on turn 1 SINGLE_BATTLE_TEST("Thrash does not confuse the user if it is canceled on turn 2 of 3") { GIVEN { - ASSUME(B_RAMPAGE_CANCELLING >= GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -73,9 +71,8 @@ SINGLE_BATTLE_TEST("Thrash does not confuse the user if it is canceled on turn 2 } } -SINGLE_BATTLE_TEST("Thrash confuses the user if it is canceled on turn 3 of 3") +SINGLE_BATTLE_TEST("Thrash confuses the user if it is canceled on turn 3 of 3, Protect") { - KNOWN_FAILING; GIVEN { ASSUME(B_RAMPAGE_CANCELLING >= GEN_5); PLAYER(SPECIES_WOBBUFFET); @@ -89,6 +86,22 @@ SINGLE_BATTLE_TEST("Thrash confuses the user if it is canceled on turn 3 of 3") } } +SINGLE_BATTLE_TEST("Thrash confuses the user if it is canceled on turn 3 of 3, Immunity") +{ + GIVEN { + ASSUME(B_RAMPAGE_CANCELLING >= GEN_5); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GENGAR); + } WHEN { + TURN { MOVE(player, MOVE_THRASH); } + TURN { SKIP_TURN(player); } + TURN { SWITCH(opponent, 1); SKIP_TURN(player); } + } SCENE { + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_CONFUSION, player); + } +} + SINGLE_BATTLE_TEST("Petal Dance does not lock mons that copy the move with Dancer") { GIVEN { From 1241cbe79f5f567f818d177eb47f1d8d2e10b7ec Mon Sep 17 00:00:00 2001 From: sneed <56992013+Sneed69@users.noreply.github.com> Date: Fri, 7 Jun 2024 12:46:07 +0300 Subject: [PATCH 2/2] FIx mummy and lingering aroma abilities (#4731) * FIx mummy ability ..and lingering aroma. Adds tests for both. * merge the tests * new line * add 2 more tests Mummy and Lingering Aroma don't replace each other Mummy doesn't replace abilities that can't be suppressed --- src/battle_util.c | 6 +- test/battle/ability/lingering_aroma.c | 4 ++ test/battle/ability/mummy.c | 98 +++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 test/battle/ability/lingering_aroma.c create mode 100644 test/battle/ability/mummy.c diff --git a/src/battle_util.c b/src/battle_util.c index 77b02637d4..68cf7a1cef 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5315,9 +5315,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_PROTECTIVE_PADS && IsMoveMakingContact(move, gBattlerAttacker) && gBattleStruct->overwrittenAbilities[gBattlerAttacker] != GetBattlerAbility(gBattlerTarget) - && gBattleMons[gBattlerTarget].ability != ABILITY_MUMMY - && gBattleMons[gBattlerTarget].ability != ABILITY_LINGERING_AROMA - && !gAbilitiesInfo[gBattleMons[gBattlerTarget].ability].cantBeSuppressed) + && gBattleMons[gBattlerAttacker].ability != ABILITY_MUMMY + && gBattleMons[gBattlerAttacker].ability != ABILITY_LINGERING_AROMA + && !gAbilitiesInfo[gBattleMons[gBattlerAttacker].ability].cantBeSuppressed) { if (GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) { diff --git a/test/battle/ability/lingering_aroma.c b/test/battle/ability/lingering_aroma.c new file mode 100644 index 0000000000..a4ef5fc48f --- /dev/null +++ b/test/battle/ability/lingering_aroma.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +// Tests for Lingering Aroma are handled in test/battle/ability/mummy.c diff --git a/test/battle/ability/mummy.c b/test/battle/ability/mummy.c new file mode 100644 index 0000000000..ed80a178e6 --- /dev/null +++ b/test/battle/ability/mummy.c @@ -0,0 +1,98 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on contact") +{ + u32 move, ability, species; + + PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK;} + PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } + PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_LINGERING_AROMA; species = SPECIES_OINKOLOGNE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact); + ASSUME(!gMovesInfo[MOVE_WATER_GUN].makesContact); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + if (gMovesInfo[move].makesContact) { + ABILITY_POPUP(opponent, ability); + if (ability == ABILITY_MUMMY) + MESSAGE("Wobbuffet acquired Mummy!"); + else + MESSAGE("Wobbuffet acquired Lingering Aroma!"); + } else { + NONE_OF { + ABILITY_POPUP(opponent, ability); + if (ability == ABILITY_MUMMY) + MESSAGE("Wobbuffet acquired Mummy!"); + else + MESSAGE("Wobbuffet acquired Lingering Aroma!"); + } + } + } +} + +SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other") +{ + u32 ability1, species1, ability2, species2; + + PARAMETRIZE { ability1 = ability2 = ABILITY_MUMMY; species1 = species2 = SPECIES_YAMASK; } + PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; } + PARAMETRIZE { ability1 = ability2 = ABILITY_LINGERING_AROMA; species1 = species2 = SPECIES_OINKOLOGNE; } + GIVEN { + ASSUME(gMovesInfo[MOVE_AQUA_JET].makesContact); + PLAYER(species1) { Ability(ability1); Speed(2); } + OPPONENT(species2) { Ability(ability2); Speed(1); } + } WHEN { + TURN { MOVE(player, MOVE_AQUA_JET); MOVE(opponent, MOVE_AQUA_JET); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AQUA_JET, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AQUA_JET, opponent); + NONE_OF { + ABILITY_POPUP(player, ability1); + ABILITY_POPUP(player, ability2); + ABILITY_POPUP(opponent, ability1); + ABILITY_POPUP(opponent, ability2); + MESSAGE("Yamask acquired Mummy!"); + MESSAGE("Yamask acquired Lingering Aroma!"); + MESSAGE("Oinkologne acquired Mummy!"); + MESSAGE("Oinkologne acquired Lingering Aroma!"); + } + } +} + +SINGLE_BATTLE_TEST("Mummy doesn't replace abilities that can't be suppressed") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } + PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } + PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } + PARAMETRIZE { species = SPECIES_KOMALA; ability = ABILITY_COMATOSE; } + PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } + PARAMETRIZE { species = SPECIES_MIMIKYU; ability = ABILITY_DISGUISE; } + PARAMETRIZE { species = SPECIES_SILVALLY; ability = ABILITY_RKS_SYSTEM; } + PARAMETRIZE { species = SPECIES_GRENINJA_BATTLE_BOND; ability = ABILITY_BATTLE_BOND; } + PARAMETRIZE { species = SPECIES_ZYGARDE; ability = ABILITY_POWER_CONSTRUCT; } + PARAMETRIZE { species = SPECIES_EISCUE; ability = ABILITY_ICE_FACE; } + PARAMETRIZE { species = SPECIES_CRAMORANT; ability = ABILITY_GULP_MISSILE; } + PARAMETRIZE { species = SPECIES_PALAFIN_ZERO; ability = ABILITY_ZERO_TO_HERO; } + PARAMETRIZE { species = SPECIES_TATSUGIRI; ability = ABILITY_COMMANDER; } + PARAMETRIZE { species = SPECIES_CALYREX_SHADOW_RIDER; ability = ABILITY_AS_ONE_SHADOW_RIDER; } + PARAMETRIZE { species = SPECIES_CALYREX_ICE_RIDER; ability = ABILITY_AS_ONE_ICE_RIDER; } + + GIVEN { + PLAYER(SPECIES_YAMASK); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(opponent, MOVE_AQUA_JET); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_AQUA_JET, opponent); + NONE_OF { + ABILITY_POPUP(opponent, ABILITY_MUMMY); + } + } +}