2026-02-06 11:57:33 +01:00

750 lines
31 KiB
C

#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(GetMoveEffect(MOVE_DEFOG) == EFFECT_DEFOG);
ASSUME(GetMoveEffect(MOVE_REFLECT) == EFFECT_REFLECT);
ASSUME(GetMoveEffect(MOVE_LIGHT_SCREEN) == EFFECT_LIGHT_SCREEN);
ASSUME(GetMoveEffect(MOVE_MIST) == EFFECT_MIST);
ASSUME(GetMoveEffect(MOVE_SAFEGUARD) == EFFECT_SAFEGUARD);
ASSUME(GetMoveEffect(MOVE_AURORA_VEIL) == EFFECT_AURORA_VEIL);
ASSUME(GetMoveEffect(MOVE_STEALTH_ROCK) == EFFECT_STEALTH_ROCK);
ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES);
ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES);
ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB);
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS);
ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC);
ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2);
ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL);
ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL);
}
SINGLE_BATTLE_TEST("Defog lowers evasiveness by 1 stage")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_DEFOG); }
} SCENE {
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")
{
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Ability(ABILITY_SIMPLE); }
} WHEN {
TURN { MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player);
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)")
{
GIVEN {
WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_4);
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); }
} WHEN {
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); }
} SCENE {
MESSAGE("The opposing Wobbuffet used Substitute!");
NOT MESSAGE("But it failed!");
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)")
{
GIVEN {
WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_4);
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); Ability(ABILITY_SIMPLE); }
} WHEN {
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
TURN { MOVE(player, MOVE_DEFOG); }
} SCENE {
MESSAGE("The opposing Wobbuffet used Substitute!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player);
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 does not lower evasiveness if target behind Substitute (Gen5+)")
{
u32 move;
PARAMETRIZE { move = MOVE_LIGHT_SCREEN; }
PARAMETRIZE { move = MOVE_CELEBRATE; }
GIVEN {
WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, GEN_5);
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); }
} WHEN {
TURN { MOVE(opponent, move); }
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); }
} SCENE {
MESSAGE("The opposing Wobbuffet used Substitute!");
if (move == MOVE_CELEBRATE)
{
MESSAGE("But it failed!");
NONE_OF {
ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, player);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Wobbuffet's evasiveness fell!");
}
}
else
{
NONE_OF {
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);
}
}
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);
}
}
DOUBLE_BATTLE_TEST("Defog removes Reflect and Light Screen from target'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(opponentLeft, MOVE_REFLECT); MOVE(opponentRight, MOVE_LIGHT_SCREEN); }
TURN { MOVE(playerLeft, move, target: opponentLeft); }
TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentLeft); MOVE(playerRight, MOVE_GUST, target: opponentRight); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_REFLECT, opponentLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_LIGHT_SCREEN, opponentRight);
ANIMATION(ANIM_TYPE_MOVE, move, playerLeft);
if (move == MOVE_DEFOG) {
MESSAGE("The opposing team's Reflect wore off!");
MESSAGE("The opposing team's Light Screen wore off!");
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerLeft);
HP_BAR(opponentLeft, captureDamage: &results[i].damagePhysical);
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);
EXPECT_MUL_EQ(results[1].damageSpecial, Q_4_12(1.5), results[0].damageSpecial);
}
}
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;
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(opponentLeft, MOVE_MIST); MOVE(opponentRight, MOVE_SAFEGUARD); }
TURN { MOVE(playerLeft, move, target: opponentLeft); }
TURN { MOVE(playerLeft, MOVE_SCREECH, target: opponentLeft); MOVE(playerRight, MOVE_TOXIC, target: opponentRight); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_MIST, opponentLeft);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SAFEGUARD, opponentRight);
if (move == MOVE_DEFOG) {
ANIMATION(ANIM_TYPE_MOVE, move, playerLeft);
MESSAGE("The opposing team's Mist wore off!");
MESSAGE("The opposing team's Safeguard wore off!");
}
MESSAGE("Wobbuffet used Screech!");
if (move == MOVE_DEFOG) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCREECH, playerLeft);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
} else {
MESSAGE("The opposing Wobbuffet is protected by the mist!");
NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponentLeft);
}
MESSAGE("Wobbuffet used Toxic!");
if (move == MOVE_DEFOG) {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC, playerRight);
STATUS_ICON(opponentRight, badPoison: TRUE);
} else {
MESSAGE("The opposing Wobbuffet is protected by Safeguard!");
NOT STATUS_ICON(opponentRight, badPoison: TRUE);
}
}
}
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+)")
{
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(B_DEFOG_EFFECT_CLEARING, config);
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(playerLeft, move, target: opponentLeft); }
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, playerLeft);
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 || 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 {
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 || 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!");
}
}
}
SINGLE_BATTLE_TEST("Defog removes 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(B_DEFOG_EFFECT_CLEARING, config);
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
PLAYER(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); }
} WHEN {
TURN { MOVE(opponent, MOVE_SPIKES); MOVE(player, move); }
TURN { SWITCH(player, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPIKES, opponent);
ANIMATION(ANIM_TYPE_MOVE, move, player);
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 || config <= GEN_5) {
HP_BAR(player);
MESSAGE("Wobbuffet was hurt by the spikes!");
} else {
NONE_OF {
HP_BAR(player);
MESSAGE("Wobbuffet was hurt by the spikes!");
}
}
}
}
SINGLE_BATTLE_TEST("Defog removes terrain (Gen 8+)")
{
u32 move, config;
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(B_DEFOG_EFFECT_CLEARING, config);
PLAYER(SPECIES_WOBBUFFET) { Speed(50); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(5); }
} WHEN {
TURN { MOVE(player, move); MOVE(opponent, MOVE_DEFOG); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, move, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponent);
if (config >= GEN_8) {
if (move == MOVE_PSYCHIC_TERRAIN) {
MESSAGE("The weirdness disappeared from the battlefield!");
}
else if (move == MOVE_ELECTRIC_TERRAIN) {
MESSAGE("The electricity disappeared from the battlefield.");
}
else if (move == MOVE_MISTY_TERRAIN) {
MESSAGE("The mist disappeared from the battlefield.");
}
else if (move == MOVE_GRASSY_TERRAIN) {
MESSAGE("The grass disappeared from the battlefield.");
}
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG, player);
} else {
NONE_OF {
MESSAGE("The weirdness disappeared from the battlefield!");
MESSAGE("The electricity disappeared from the battlefield.");
MESSAGE("The mist disappeared from the battlefield.");
MESSAGE("The grass disappeared from the battlefield.");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_RESTORE_BG, player);
}
}
}
}
SINGLE_BATTLE_TEST("Defog removes Toxic Spikes from target's side")
{
u32 move;
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); }
TURN { MOVE(player, move); }
TURN { SWITCH(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player);
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) {
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);
}
}
}
}
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(B_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;
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(opponentLeft, move, target: playerLeft); }
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, opponentLeft);
if (move == MOVE_DEFOG) {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft);
MESSAGE("Glalie's evasiveness fell!");
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(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);
}
}
DOUBLE_BATTLE_TEST("Defog removes everything it can")
{
u32 config;
PARAMETRIZE { config = GEN_5; }
PARAMETRIZE { config = GEN_6; }
GIVEN {
WITH_CONFIG(B_DEFOG_EFFECT_CLEARING, config);
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE);
PLAYER(SPECIES_GLALIE) { Speed(4); }
PLAYER(SPECIES_GLALIE) { Speed(3); }
PLAYER(SPECIES_GLALIE) { Speed(12); }
PLAYER(SPECIES_GLALIE) { Speed(3); }
OPPONENT(SPECIES_GLALIE) { Speed(2); }
OPPONENT(SPECIES_GLALIE) { Speed(1); }
OPPONENT(SPECIES_GLALIE) { Speed(1); }
OPPONENT(SPECIES_GLALIE) { Speed(1); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_STICKY_WEB); MOVE(playerRight, MOVE_SPIKES); MOVE(opponentLeft, MOVE_STICKY_WEB); MOVE(opponentRight, MOVE_SPIKES); }
TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); SWITCH(opponentLeft, 2); SWITCH(opponentRight, 3); }
TURN { MOVE(playerLeft, MOVE_TOXIC_SPIKES); MOVE(playerRight, MOVE_STEALTH_ROCK); MOVE(opponentLeft, MOVE_TOXIC_SPIKES); MOVE(opponentRight, MOVE_STEALTH_ROCK); }
TURN { MOVE(playerLeft, MOVE_HAIL); MOVE(playerRight, MOVE_AURORA_VEIL); MOVE(opponentLeft, MOVE_AURORA_VEIL); MOVE(opponentRight, MOVE_LIGHT_SCREEN); }
TURN { MOVE(playerLeft, MOVE_REFLECT); MOVE(playerRight, MOVE_LIGHT_SCREEN); MOVE(opponentLeft, MOVE_REFLECT); MOVE(opponentRight, MOVE_SAFEGUARD); }
TURN { MOVE(playerLeft, MOVE_MIST); MOVE(playerRight, MOVE_SAFEGUARD); MOVE(opponentLeft, MOVE_MIST); MOVE(opponentRight, MOVE_DEFOG, target: playerLeft); }
} SCENE {
MESSAGE("The opposing Glalie used Defog!");
MESSAGE("Glalie is protected by the mist!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_DEFOG, opponentRight);
// Player side
MESSAGE("Your team's Reflect wore off!");
MESSAGE("Your team's Light Screen wore off!");
MESSAGE("Your team's Mist wore off!");
MESSAGE("Your team's Aurora Veil wore off!");
MESSAGE("Your team's Safeguard wore off!");
if (config == GEN_6) {
MESSAGE("The spikes disappeared from the ground around your team!");
MESSAGE("The sticky web has disappeared from the ground around your team!");
MESSAGE("The poison spikes disappeared from the ground around your team!");
MESSAGE("The pointed stones disappeared from around your team!");
// Opponent side
MESSAGE("The spikes disappeared from the ground around the opposing team!");
MESSAGE("The sticky web has disappeared from the ground around the opposing team!");
MESSAGE("The poison spikes disappeared from the ground around the opposing team!");
MESSAGE("The pointed stones disappeared from around the opposing team!");
}
} THEN {
if (config == GEN_6) {
EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_NONE);
} else {
EXPECT_EQ(gBattleStruct->hazardsQueue[0][0], HAZARDS_STICKY_WEB);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][1], HAZARDS_SPIKES);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][2], HAZARDS_STEALTH_ROCK);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][3], HAZARDS_TOXIC_SPIKES);
}
EXPECT_EQ(gBattleStruct->hazardsQueue[0][4], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[0][5], HAZARDS_NONE);
if (config == GEN_6) {
EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_NONE);
} else {
EXPECT_EQ(gBattleStruct->hazardsQueue[1][0], HAZARDS_STICKY_WEB);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][1], HAZARDS_SPIKES);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][2], HAZARDS_TOXIC_SPIKES);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][3], HAZARDS_STEALTH_ROCK);
}
EXPECT_EQ(gBattleStruct->hazardsQueue[1][4], HAZARDS_NONE);
EXPECT_EQ(gBattleStruct->hazardsQueue[1][5], HAZARDS_NONE);
}
}
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(B_DEFOG_EFFECT_CLEARING, config);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_LIGHT_SCREEN); }
TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_DEFOG); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_LIGHT_SCREEN, opponent);
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUBSTITUTE, opponent);
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);
}
}