From 242d68487a51a61dbc3d703c0505c1e8a38849a9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 30 Oct 2023 14:31:28 -0300 Subject: [PATCH 1/2] Weak Armor tests --- test/battle/ability/weak_armor.c | 126 +++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index abe4a797e5..f23f67cbab 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -29,6 +29,13 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hi ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); MESSAGE("Slugma's Weak Armor lowered its Defense!"); MESSAGE("Slugma's Weak Armor raised its Speed!"); + } else { + NONE_OF { + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + } } } THEN { if (move == MOVE_TACKLE) { @@ -68,3 +75,122 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); } } + +SINGLE_BATTLE_TEST("Weak Armor still lowers boosts Speed if Defense can't go any lower") +{ + GIVEN { + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_SCREECH); } + TURN { MOVE(opponent, MOVE_SCREECH); } + TURN { MOVE(opponent, MOVE_SCREECH); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + } + MESSAGE("Slugma's Defense won't go lower!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Weak Armor still lowers Defense if Speed can't go any higher") +{ + GIVEN { + PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_AGILITY); } + TURN { MOVE(player, MOVE_AGILITY); } + TURN { MOVE(player, MOVE_AGILITY); } + TURN { MOVE(opponent, MOVE_TACKLE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, opponent); + HP_BAR(player); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor lowered its Defense!"); + NONE_OF { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + MESSAGE("Slugma's Weak Armor raised its Speed!"); + } + MESSAGE("Slugma's Speed won't go higher!"); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); + EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE); + } +} + +SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can't go any lower") +{ + u32 j; + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } + OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } + } WHEN { + TURN { MOVE(opponent, MOVE_SCREECH); } + TURN { MOVE(opponent, MOVE_SCREECH); } + TURN { MOVE(opponent, MOVE_FURY_SWIPES); } + } SCENE { + for (j = 0; j < 2; j++) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Weak Armor lowered its Defense!"); + MESSAGE("Magcargo's Weak Armor raised its Speed!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Defense won't go lower!"); + MESSAGE("Magcargo's Weak Armor raised its Speed!"); + for (j = 0; j < 2; j++) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Defense won't go lower!"); + MESSAGE("Slugma's Speed won't go higher!"); + } + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} + +SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't go any higher") +{ + u32 j; + KNOWN_FAILING; + GIVEN { + PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } + OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } + } WHEN { + TURN { MOVE(player, MOVE_AGILITY); } + TURN { MOVE(player, MOVE_AGILITY); } + TURN { MOVE(opponent, MOVE_FURY_SWIPES); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Weak Armor lowered its Defense!"); + MESSAGE("Magcargo's Weak Armor raised its Speed!"); + for (j = 0; j < 4; j++) + { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Weak Armor lowered its Defense!"); + MESSAGE("Magcargo's Speed won't go higher!"); + } + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + } +} From 72dad4d7c6959d2430e828923def10e2a5a190ab Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 30 Oct 2023 20:44:42 +0100 Subject: [PATCH 2/2] Fix Weak Armor interrupting multi hit moves (#3497) --- data/battle_scripts_1.s | 2 ++ src/battle_util.c | 4 ++-- test/battle/ability/weak_armor.c | 17 +++++++++-------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 5d2e18cb4b..898be404b5 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9122,6 +9122,7 @@ BattleScript_WeakArmorActivates:: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_FELL_EMPTY, BattleScript_WeakArmorActivatesSpeed pause B_WAIT_TIME_SHORTEST printfromtable gStatDownStringIds + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED @ Set by statbuffchange when stat can't be decreased waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesSpeed BattleScript_WeakArmorDefAnim: @@ -9136,6 +9137,7 @@ BattleScript_WeakArmorActivatesSpeed: jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd pause B_WAIT_TIME_SHORTEST printstring STRINGID_TARGETSTATWONTGOHIGHER + bichalfword gMoveResultFlags, MOVE_RESULT_MISSED waitmessage B_WAIT_TIME_LONG goto BattleScript_WeakArmorActivatesEnd BattleScript_WeakArmorSpeedAnim: diff --git a/src/battle_util.c b/src/battle_util.c index d64acb6fb5..c9ef0b08bd 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5231,8 +5231,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 && TARGET_TURN_DAMAGED && IsBattlerAlive(battler) && IS_MOVE_PHYSICAL(gCurrentMove) - && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if speed cannot be raised - || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) // Don't activate if defense cannot be lowered + && (CompareStat(battler, STAT_SPEED, MAX_STAT_STAGE, CMP_LESS_THAN) // Don't activate if both Speed and Defense cannot be raised. + || CompareStat(battler, STAT_DEF, MIN_STAT_STAGE, CMP_GREATER_THAN))) { if (gBattleMoves[gCurrentMove].effect == EFFECT_HIT_ESCAPE && CanBattlerSwitch(gBattlerAttacker)) gProtectStructs[battler].disableEjectPack = TRUE; // Set flag for target diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index f23f67cbab..8fc09bb287 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -133,7 +133,6 @@ SINGLE_BATTLE_TEST("Weak Armor still lowers Defense if Speed can't go any higher SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can't go any lower") { u32 j; - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } @@ -156,20 +155,22 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' for (j = 0; j < 2; j++) { ANIMATION(ANIM_TYPE_MOVE, MOVE_FURY_SWIPES, opponent); - ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); - MESSAGE("Magcargo's Defense won't go lower!"); - MESSAGE("Slugma's Speed won't go higher!"); + // Ability doesn't activate if neither stat can be changed. + NONE_OF { + ABILITY_POPUP(player, ABILITY_WEAK_ARMOR); + MESSAGE("Magcargo's Defense won't go lower!"); + MESSAGE("Magcargo's Speed won't go higher!"); + } } } THEN { EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE); } } SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't go any higher") { u32 j; - KNOWN_FAILING; GIVEN { PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } @@ -190,7 +191,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't MESSAGE("Magcargo's Speed won't go higher!"); } } THEN { - EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 5); + EXPECT_EQ(player->statStages[STAT_SPEED], MAX_STAT_STAGE); } }