Add some missing tests for heatproof, thick fat and grudge (#8705)

This commit is contained in:
Kildemal 2025-12-31 20:07:16 +05:30 committed by GitHub
parent c0d4f0e45f
commit cd0834237b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 340 additions and 11 deletions

View File

@ -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);
}
}

View File

@ -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]);
}
}

View File

@ -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);
}
}