From 5ac3e603dc0766dc38391dfadd593312bf00425f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 5 Dec 2025 12:45:48 -0300 Subject: [PATCH] Finished Defog tests (#8424) --- test/battle/move_effect/defog.c | 351 +++++++++++++++++++++++++++----- 1 file changed, 300 insertions(+), 51 deletions(-) diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index 286a9c00bb..f2fa558e13 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -31,6 +31,8 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 stage") ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } @@ -49,10 +51,12 @@ SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change") ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); } } -SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4-)") +SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4)") { GIVEN { WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); @@ -66,10 +70,12 @@ SINGLE_BATTLE_TEST("Defog lowers evasiveness of target behind Substitute (Gen4-) ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness fell!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } } -SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind Substitute (Gen4-)") +SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind Substitute (Gen4)") { GIVEN { WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_4); @@ -86,6 +92,8 @@ SINGLE_BATTLE_TEST("Defog fails if target has minimum evasion stat change behind ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent); MESSAGE("The opposing Wobbuffet's evasiveness harshly fell!"); MESSAGE("But it failed!"); + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 6); } } @@ -97,7 +105,7 @@ SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute PARAMETRIZE { move = MOVE_CELEBRATE; } GIVEN { - ASSUME(CONFIG_DEFOG_EFFECT_CLEARING >= GEN_5); + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, GEN_5); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -121,10 +129,44 @@ SINGLE_BATTLE_TEST("Defog does not lower evasiveness if target behind Substitute MESSAGE("The opposing Wobbuffet's evasiveness fell!"); } } + } THEN { + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } +} + +DOUBLE_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_REFLECT); MOVE(playerRight, MOVE_LIGHT_SCREEN); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LIGHT_SCREEN, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NONE_OF { + MESSAGE("Your team's Reflect wore off!"); + MESSAGE("Your team's Light Screen wore off!"); + } + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); } } -TO_DO_BATTLE_TEST("Defog doesn't remove Reflect or Light Screen from the user's side"); DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", s16 damagePhysical, s16 damageSpecial) { u16 move; @@ -148,9 +190,9 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", MESSAGE("The opposing team's Reflect wore off!"); MESSAGE("The opposing team's Light Screen wore off!"); } - MESSAGE("Wobbuffet used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft); HP_BAR(opponentLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("Wobbuffet used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, playerRight); HP_BAR(opponentRight, captureDamage: &results[i].damageSpecial); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); @@ -158,7 +200,38 @@ DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target's side", } } -TO_DO_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side"); +DOUBLE_BATTLE_TEST("Defog doesn't remove Mist or Safeguard from the user's side") +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCREECH, target: playerLeft); MOVE(opponentRight, MOVE_TOXIC, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + NONE_OF { + MESSAGE("Your team's Mist wore off!"); + MESSAGE("Your team's Safeguard wore off!"); + } + MESSAGE("The opposing Wobbuffet used Screech!"); + MESSAGE("Wobbuffet is protected by the mist!"); + NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("The opposing Wobbuffet used Toxic!"); + MESSAGE("Wobbuffet is protected by Safeguard!"); + NOT STATUS_ICON(playerRight, badPoison: TRUE); + } +} + DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") { u16 move; @@ -186,8 +259,7 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by the mist!"); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); } @@ -195,23 +267,73 @@ DOUBLE_BATTLE_TEST("Defog removes Mist and Safeguard from target's side") if (move == MOVE_DEFOG) { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, playerRight); STATUS_ICON(opponentRight, badPoison: TRUE); - } - else { + } else { MESSAGE("The opposing Wobbuffet is protected by Safeguard!"); NOT STATUS_ICON(opponentRight, badPoison: TRUE); } } } -TO_DO_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Stealth Rock or Sticky Web from user's side (Gen 4-5)"); +DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from target's side") +{ + u32 move; + + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(4); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_STEALTH_ROCK); MOVE(opponentRight, MOVE_STICKY_WEB); } + TURN { MOVE(opponentLeft, move, target: playerLeft); } + TURN { SWITCH(playerLeft, 2); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); + ANIMATION(ANIM_TYPE_MOVE, move, opponentLeft); + if (move == MOVE_DEFOG) { + MESSAGE("The sticky web has disappeared from the ground around your team!"); + MESSAGE("The pointed stones disappeared from around your team!"); + } + // Switch happens + SWITCH_OUT_MESSAGE("Wobbuffet"); + SEND_IN_MESSAGE("Wobbuffet"); + if (move != MOVE_DEFOG) { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } else { + NONE_OF { + HP_BAR(playerLeft); + MESSAGE("Pointed stones dug into Wobbuffet!"); + MESSAGE("Wobbuffet was caught in a sticky web!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); + MESSAGE("Wobbuffet's Speed fell!"); + } + } + } THEN { + if (move != MOVE_DEFOG) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } + } +} + DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side (Gen 6+)") { - u16 move; + u32 move, config; - PARAMETRIZE { move = MOVE_DEFOG; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(4); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } PLAYER(SPECIES_WOBBUFFET) { Speed(3); } @@ -225,21 +347,20 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( ANIMATION(ANIM_TYPE_MOVE, MOVE_STEALTH_ROCK, opponentLeft); ANIMATION(ANIM_TYPE_MOVE, MOVE_STICKY_WEB, opponentRight); ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) { + if (move == MOVE_DEFOG && config >= GEN_6) { MESSAGE("The sticky web has disappeared from the ground around your team!"); MESSAGE("The pointed stones disappeared from around your team!"); } // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); MESSAGE("Wobbuffet was caught in a sticky web!"); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); MESSAGE("Wobbuffet's Speed fell!"); - } - else { + } else { NONE_OF { HP_BAR(playerLeft); MESSAGE("Pointed stones dug into Wobbuffet!"); @@ -248,18 +369,55 @@ DOUBLE_BATTLE_TEST("Defog removes Stealth Rock and Sticky Web from user's side ( MESSAGE("Wobbuffet's Speed fell!"); } } + } THEN { + if (move != MOVE_DEFOG || config <= GEN_5) { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE - 1); + } else { + EXPECT_EQ(playerLeft->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); + } + } +} + +SINGLE_BATTLE_TEST("Defog removes Spikes from target's side") +{ + u32 move; + + PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } + } WHEN { + TURN { MOVE(player, MOVE_SPIKES); } + TURN { MOVE(player, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) { + MESSAGE("The spikes disappeared from the ground around the opposing team!"); + NONE_OF { + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } + } else { + NOT MESSAGE("The spikes disappeared from the ground around the opposing team!"); + HP_BAR(opponent); + MESSAGE("The opposing Wobbuffet was hurt by the spikes!"); + } } } -TO_DO_BATTLE_TEST("Defog removes Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Spikes from user's side (Gen 4-5)"); SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") { - u16 move; + u32 move, config; - PARAMETRIZE { move = MOVE_DEFOG; } - PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(2); } PLAYER(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } @@ -269,16 +427,15 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent); ANIMATION(ANIM_TYPE_MOVE, move, player); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + if (move == MOVE_DEFOG && config >= GEN_6) MESSAGE("The spikes disappeared from the ground around your team!"); // Switch happens SWITCH_OUT_MESSAGE("Wobbuffet"); SEND_IN_MESSAGE("Wobbuffet"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG || config <= GEN_5) { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); - } - else { + } else { NONE_OF { HP_BAR(player); MESSAGE("Wobbuffet was hurt by the spikes!"); @@ -287,16 +444,20 @@ SINGLE_BATTLE_TEST("Defog removes Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove terrain (Gen 4-7)"); SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") { - u16 move; + u32 move, config; - PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; } - PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; } - PARAMETRIZE { move = MOVE_MISTY_TERRAIN; } - PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_7; } + PARAMETRIZE { move = MOVE_PSYCHIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_ELECTRIC_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_MISTY_TERRAIN; config = GEN_8; } + PARAMETRIZE { move = MOVE_GRASSY_TERRAIN; config = GEN_8; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET) { Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } } WHEN { @@ -304,7 +465,7 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } SCENE { ANIMATION(ANIM_TYPE_MOVE, move, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponent); - if (B_DEFOG_EFFECT_CLEARING >= GEN_8) { + if (config >= GEN_8) { if (move == MOVE_PSYCHIC_TERRAIN) { MESSAGE("The weirdness disappeared from the battlefield!"); } @@ -330,34 +491,32 @@ SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)") } } -TO_DO_BATTLE_TEST("Defog removes Toxic Spikes from target's side"); -TO_DO_BATTLE_TEST("Defog doesn't remove Toxic Spikes from user's side (Gen 4-5)"); -SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from target's side") { - u16 move; + u32 move; - PARAMETRIZE { move = MOVE_DEFOG; } PARAMETRIZE { move = MOVE_CELEBRATE; } + PARAMETRIZE { move = MOVE_DEFOG; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { - TURN { MOVE(player, MOVE_TOXIC_SPIKES); MOVE(opponent, move); } + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } + TURN { MOVE(player, move); } TURN { SWITCH(opponent, 1); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); - ANIMATION(ANIM_TYPE_MOVE, move, opponent); - if (move == MOVE_DEFOG && B_DEFOG_EFFECT_CLEARING >= GEN_6) + ANIMATION(ANIM_TYPE_MOVE, move, player); + if (move == MOVE_DEFOG) MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); // Switch happens MESSAGE("2 sent out Wobbuffet!"); - if (move != MOVE_DEFOG || B_DEFOG_EFFECT_CLEARING <= GEN_5) { + if (move != MOVE_DEFOG) { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); STATUS_ICON(opponent, poison: TRUE); - } - else { + } else { NONE_OF { MESSAGE("The opposing Wobbuffet was poisoned!"); ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); @@ -367,7 +526,83 @@ SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") } } -TO_DO_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side"); +SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from user's side (Gen 6+)") +{ + u32 move, config; + + PARAMETRIZE { move = MOVE_CELEBRATE; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_5; } + PARAMETRIZE { move = MOVE_DEFOG; config = GEN_6; } + GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); + PLAYER(SPECIES_WOBBUFFET) { Speed(5); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_SPIKES); MOVE(opponent, move); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); + ANIMATION(ANIM_TYPE_MOVE, move, opponent); + if (move == MOVE_DEFOG && config >= GEN_6) + MESSAGE("The poison spikes disappeared from the ground around the opposing team!"); + // Switch happens + MESSAGE("2 sent out Wobbuffet!"); + if (move != MOVE_DEFOG || config <= GEN_5) { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } else { + NONE_OF { + MESSAGE("The opposing Wobbuffet was poisoned!"); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } + } + } +} + +DOUBLE_BATTLE_TEST("Defog doesn't remove Aurora Veil from the user's side", s16 damagePhysical, s16 damageSpecial) +{ + u16 move; + + PARAMETRIZE { move = MOVE_DEFOG; } + PARAMETRIZE { move = MOVE_CELEBRATE; } + GIVEN { + ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_GLALIE) { Speed(4); } + PLAYER(SPECIES_GLALIE) { Speed(3); } + OPPONENT(SPECIES_GLALIE) { Speed(2); } + OPPONENT(SPECIES_GLALIE) { Speed(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HAIL); MOVE(playerRight, MOVE_AURORA_VEIL); } + TURN { MOVE(playerLeft, move, target: opponentLeft); } + TURN { MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); MOVE(opponentRight, MOVE_GUST, target: playerRight); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HAIL, playerLeft); + ANIMATION(ANIM_TYPE_MOVE, MOVE_AURORA_VEIL, playerRight); + ANIMATION(ANIM_TYPE_MOVE, move, playerLeft); + if (move == MOVE_DEFOG) { + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft); + MESSAGE("The opposing Glalie's evasiveness fell!"); + } + NOT MESSAGE("Your team's Aurora Veil wore off!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); + HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); + HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(opponentLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + } FINALLY { + EXPECT_EQ(results[1].damagePhysical, results[0].damagePhysical); + EXPECT_EQ(results[1].damageSpecial, results[0].damageSpecial); + } +} + DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhysical, s16 damageSpecial) { u16 move; @@ -394,10 +629,15 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy MESSAGE("Glalie's evasiveness fell!"); MESSAGE("Your team's Aurora Veil wore off!"); } - MESSAGE("The opposing Glalie used Scratch!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponentLeft); HP_BAR(playerLeft, captureDamage: &results[i].damagePhysical); - MESSAGE("The opposing Glalie used Gust!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUST, opponentRight); HP_BAR(playerRight, captureDamage: &results[i].damageSpecial); + } THEN { + if (move == MOVE_DEFOG) + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); + else + EXPECT_EQ(playerLeft->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); } FINALLY { EXPECT_MUL_EQ(results[1].damagePhysical, Q_4_12(1.5), results[0].damagePhysical); EXPECT_MUL_EQ(results[1].damageSpecial, Q_4_12(1.5), results[0].damageSpecial); @@ -482,9 +722,13 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can") } } -SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a substitute with Screen up") +SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind a Substitute with Screen up") { + u32 config; + PARAMETRIZE { config = GEN_4; } + PARAMETRIZE { config = GEN_5; } GIVEN { + WITH_CONFIG(CONFIG_DEFOG_EFFECT_CLEARING, config); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -496,5 +740,10 @@ SINGLE_BATTLE_TEST("Defog is used on the correct side if opposing mon is behind MESSAGE("Wobbuffet used Defog!"); ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player); MESSAGE("The opposing team's Light Screen wore off!"); + } THEN { + if (config >= GEN_5) + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE); + else + EXPECT_EQ(opponent->statStages[STAT_EVASION], DEFAULT_STAT_STAGE - 1); } }