diff --git a/test/battle/ability/heatproof.c b/test/battle/ability/heatproof.c index 7f1d772bb7..154569fd2a 100644 --- a/test/battle/ability/heatproof.c +++ b/test/battle/ability/heatproof.c @@ -1,4 +1,52 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Heatproof (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); +} + +SINGLE_BATTLE_TEST("Heatproof halves damage from fire type moves") +{ + s16 damage[2]; + GIVEN { + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_BRONZONG) { Ability(ABILITY_HEATPROOF); } + } + WHEN { + TURN { MOVE(player, MOVE_EMBER); } + TURN { MOVE(player, MOVE_WORRY_SEED); } + TURN { MOVE(player, MOVE_EMBER); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(opponent, captureDamage: &damage[1]); + EXPECT_MUL_EQ(damage[0], Q_4_12(2), damage[1]); + } +} + +SINGLE_BATTLE_TEST("Heatproof halves the damage done by burn from 1/8th to 1/16th (Gen1-6) or 1/16th to 1/32nd (Gen 7+)") +{ + u32 config, burnRate; + + PARAMETRIZE { config = GEN_7; burnRate = 32; } + PARAMETRIZE { config = GEN_6; burnRate = 16; } + + GIVEN { + WITH_CONFIG(CONFIG_BURN_DAMAGE, config); + PLAYER (SPECIES_BRONZONG) { Ability(ABILITY_HEATPROOF); Status1(STATUS1_BURN); } + OPPONENT (SPECIES_WOBBUFFET); + } + WHEN { + TURN {} + } + SCENE { + s32 maxHP = GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP); + HP_BAR(player, damage: maxHP / burnRate); + } +} + diff --git a/test/battle/ability/thick_fat.c b/test/battle/ability/thick_fat.c index bcc4c9487c..ce13d12982 100644 --- a/test/battle/ability/thick_fat.c +++ b/test/battle/ability/thick_fat.c @@ -1,4 +1,39 @@ #include "global.h" #include "test/battle.h" -TO_DO_BATTLE_TEST("TODO: Write Thick Fat (Ability) test titles") +ASSUMPTIONS +{ + ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE); + ASSUME(GetMoveType(MOVE_POWDER_SNOW) == TYPE_ICE); + ASSUME(GetMoveEffect(MOVE_WORRY_SEED) == EFFECT_OVERWRITE_ABILITY); +} + +SINGLE_BATTLE_TEST("Thick Fat halves damage from fire and ice type moves", s16 damage[2]) +{ + u16 move; + + PARAMETRIZE { move = MOVE_POWDER_SNOW; } + PARAMETRIZE { move = MOVE_EMBER; } + + GIVEN { + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_SNORLAX) { Ability(ABILITY_THICK_FAT); } + } + WHEN { + TURN { MOVE(player, move); } + TURN { MOVE(player, MOVE_WORRY_SEED); } + TURN { MOVE(player, move); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage[0]); + ANIMATION(ANIM_TYPE_MOVE, MOVE_WORRY_SEED, player); + ANIMATION(ANIM_TYPE_MOVE, move, player); + HP_BAR(opponent, captureDamage: &results[i].damage[1]); + } + FINALLY { + EXPECT_MUL_EQ(results[0].damage[0], Q_4_12(2), results[0].damage[1]); + EXPECT_MUL_EQ(results[1].damage[0], Q_4_12(2), results[1].damage[1]); + } +} + diff --git a/test/battle/move_effect/grudge.c b/test/battle/move_effect/grudge.c index 2b74a3b05a..9d381ad833 100644 --- a/test/battle/move_effect/grudge.c +++ b/test/battle/move_effect/grudge.c @@ -50,12 +50,258 @@ SINGLE_BATTLE_TEST("Grudge does not deplete PP of a Z-Move") } } -TO_DO_BATTLE_TEST("Grudge depletes all PP from a Max Move's base move") -TO_DO_BATTLE_TEST("Grudge does not activate for Struggle") -TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Move"); -TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Sleep"); -TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Paralysis"); -TO_DO_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Flinching"); -TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Sandstorm"); -TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Leech Seed"); -TO_DO_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Future Sight"); +SINGLE_BATTLE_TEST("Grudge depletes all PP from a Max Move's base move") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); Item(ITEM_LAGGING_TAIL); } + } WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SCRATCH, gimmick: GIMMICK_DYNAMAX); SEND_OUT(player, 1); } + } SCENE { + MESSAGE("Wobbuffet used Grudge!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + MESSAGE("The opposing Wobbuffet used Max Strike!"); + MESSAGE("Wobbuffet fainted!"); + MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_EQ(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge does not activate for Struggle") +{ + GIVEN { + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_STRUGGLE, MOVE_POUND, MOVE_SURF); }; + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_STRUGGLE); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STRUGGLE, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Struggle lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Move") +{ + GIVEN { + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_POUND, MOVE_SURF); }; + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_CELEBRATE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_SCRATCH); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Sleep") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(gMovesInfo[SanitizeMoveId(MOVE_SPORE)].argument.nonVolatileStatus == MOVE_EFFECT_SLEEP); + PLAYER (SPECIES_WOBBUFFET) { HP(1);} + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_VITAL_THROW, MOVE_SPORE, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SPORE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_VITAL_THROW); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPORE, opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_SLP, player); + MESSAGE("Wobbuffet fell asleep!"); + STATUS_ICON(player, sleep: TRUE); + MESSAGE("Wobbuffet is fast asleep."); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VITAL_THROW, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Paralysis") +{ + PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); + GIVEN { + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(gMovesInfo[SanitizeMoveId(MOVE_STUN_SPORE)].argument.nonVolatileStatus == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMovePriority(MOVE_VITAL_THROW) == -1); + PLAYER (SPECIES_WOBBUFFET) { HP(1);} + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_VITAL_THROW, MOVE_STUN_SPORE, MOVE_SURF); };\ + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_STUN_SPORE); } + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_VITAL_THROW); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_STUN_SPORE, opponent); + MESSAGE("Wobbuffet is paralyzed, so it may be unable to move!"); + STATUS_ICON(player, paralysis: TRUE); + MESSAGE("Wobbuffet couldn't move because it's paralyzed!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_VITAL_THROW, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect disappears if the user takes a new turn - Flinching") +{ + PASSES_RANDOMLY(10, 100, RNG_HOLD_EFFECT_FLINCH); + GIVEN { + ASSUME(GetMoveEffect(MOVE_FALSE_SWIPE) == EFFECT_FALSE_SWIPE); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_FALSE_SWIPE, MOVE_SURF); Item(ITEM_KINGS_ROCK); } + } + WHEN { + TURN { SWITCH(opponent, 1); MOVE(player, MOVE_GRUDGE); } + TURN { MOVE(opponent, MOVE_FALSE_SWIPE); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_CELEBRATE); SEND_OUT(player, 1); } + } + SCENE { + SEND_IN_MESSAGE("Wobbuffet"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_FALSE_SWIPE, opponent); + MESSAGE("Wobbuffet flinched and couldn't move!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Scratch lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Sandstorm") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SANDSTORM) == EFFECT_SANDSTORM); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_SANDSTORM, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_SANDSTORM); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SANDSTORM, opponent); + MESSAGE("The sandstorm is raging."); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SANDSTORM_CONTINUES); + MESSAGE("Wobbuffet is buffeted by the sandstorm!"); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Sandstorm lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Leech Seed") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_LEECH_SEED) == EFFECT_LEECH_SEED); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_LEECH_SEED, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_GRUDGE); MOVE(opponent, MOVE_LEECH_SEED); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_LEECH_SEED, opponent); + MESSAGE("Wobbuffet was seeded!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_LEECH_SEED_DRAIN, player); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Leech Seed lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} + +SINGLE_BATTLE_TEST("Grudge's effect doesn't trigger on indirect damage - Future Sight") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_FUTURE_SIGHT) == EFFECT_FUTURE_SIGHT); + PLAYER (SPECIES_WOBBUFFET) { HP(1); } + PLAYER (SPECIES_WOBBUFFET); + OPPONENT (SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH, MOVE_FUTURE_SIGHT, MOVE_SURF); } + } + WHEN { + TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_FUTURE_SIGHT); } + TURN {} + TURN { MOVE(player, MOVE_GRUDGE); SEND_OUT(player, 1); } + } + SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FUTURE_SIGHT, opponent); + MESSAGE("The opposing Wobbuffet foresaw an attack!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_GRUDGE, player); + MESSAGE("Wobbuffet took the Future Sight attack!"); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FUTURE_SIGHT_HIT); + MESSAGE("Wobbuffet fainted!"); + NOT MESSAGE("The opposing Wobbuffet's Future Sight lost all its PP due to the grudge!"); + } + THEN { + EXPECT_GT(opponent->pp[0], 0); + EXPECT_GT(opponent->pp[1], 0); + EXPECT_GT(opponent->pp[2], 0); + EXPECT_GT(opponent->pp[3], 0); + } +} +