pokeemerald-expansion/test/battle/capture.c
2026-01-17 02:26:09 -08:00

235 lines
7.7 KiB
C

#include "global.h"
#include "event_data.h"
#include "pokedex.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(gSpeciesInfo[SPECIES_CLEFFA].catchRate == 150);
}
WILD_BATTLE_TEST("Capture: Incapacitated catch bonus apply correcly with all gen configs")
{
u32 expectedOdds;
u32 recordedOdds;
u32 status;
u32 gen;
PARAMETRIZE(expectedOdds = 100, status = STATUS1_SLEEP, gen = GEN_4);
PARAMETRIZE(expectedOdds = 100, status = STATUS1_FREEZE, gen = GEN_4);
PARAMETRIZE(expectedOdds = 125, status = STATUS1_SLEEP, gen = GEN_5);
PARAMETRIZE(expectedOdds = 125, status = STATUS1_FREEZE, gen = GEN_5);
GIVEN {
WITH_CONFIG(CONFIG_INCAPACITATED_CATCH_BONUS, gen);
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CLEFFA) {Status1(status);}
} WHEN {
TURN { USE_ITEM(player, ITEM_POKE_BALL); }
} SCENE {
CATCHING_CHANCE(&recordedOdds);
} THEN {
EXPECT_EQ(expectedOdds, recordedOdds);
}
}
WILD_BATTLE_TEST("Capture: Low level catch bonus apply correcly with all gen configs")
{
u32 expectedOdds;
u32 recordedOdds;
u32 level;
u32 gen;
PARAMETRIZE(expectedOdds = 50, level = 10, gen = GEN_7);
PARAMETRIZE(expectedOdds = 50, level = 15, gen = GEN_7);
PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_7);
PARAMETRIZE(expectedOdds = 100, level = 10, gen = GEN_8);
PARAMETRIZE(expectedOdds = 75, level = 15, gen = GEN_8);
PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_8);
PARAMETRIZE(expectedOdds = 80, level = 10, gen = GEN_9);
PARAMETRIZE(expectedOdds = 50, level = 15, gen = GEN_9);
PARAMETRIZE(expectedOdds = 50, level = 30, gen = GEN_9);
GIVEN {
WITH_CONFIG(CONFIG_LOW_LEVEL_CATCH_BONUS, gen);
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CLEFFA) {Level(level);}
} WHEN {
TURN { USE_ITEM(player, ITEM_POKE_BALL); }
} SCENE {
CATCHING_CHANCE(&recordedOdds);
} THEN {
EXPECT_EQ(expectedOdds, recordedOdds);
}
}
WILD_BATTLE_TEST("Capture: Missing badge malus apply correcly in gen 8")
{
u32 expectedOdds = 0;
u32 recordedOdds;
u32 playerLevel = 0;
u32 numBadges = 0;
for (u32 j = 0; j < 8; j++)
{
PARAMETRIZE(expectedOdds = 50, playerLevel = 100, numBadges = j);
PARAMETRIZE(expectedOdds = 5, playerLevel = 99, numBadges = j);
}
PARAMETRIZE(expectedOdds = 50, playerLevel = 100, numBadges = 8);
PARAMETRIZE(expectedOdds = 50, playerLevel = 99, numBadges = 8);
PARAMETRIZE(expectedOdds = 50, playerLevel = 21, numBadges = 8);
GIVEN {
for (u32 j = 0; j < 8; j++)
{
if (j < numBadges)
FlagSet(FLAG_BADGE01_GET + j);
else
FlagClear(FLAG_BADGE01_GET + j);
}
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_8);
PLAYER(SPECIES_WOBBUFFET) {Level(playerLevel);}
OPPONENT(SPECIES_CLEFFA);
} WHEN {
TURN { USE_ITEM(player, ITEM_POKE_BALL); }
} SCENE {
CATCHING_CHANCE(&recordedOdds);
} THEN {
EXPECT_EQ(expectedOdds, recordedOdds);
}
}
WILD_BATTLE_TEST("Capture: Missing badge malus apply correcly in gen 9")
{
u32 expectedOdds;
u32 recordedOdds;
u32 level = 0;
u32 numBadges = 0;
PARAMETRIZE(expectedOdds = 250, level = 100, numBadges = 8);
PARAMETRIZE(expectedOdds = 200, level = 100, numBadges = 7);
PARAMETRIZE(expectedOdds = 160, level = 100, numBadges = 6);
PARAMETRIZE(expectedOdds = 128, level = 100, numBadges = 5);
PARAMETRIZE(expectedOdds = 250, level = 40, numBadges = 4);
PARAMETRIZE(expectedOdds = 250, level = 40, numBadges = 3);
PARAMETRIZE(expectedOdds = 200, level = 40, numBadges = 2);
PARAMETRIZE(expectedOdds = 160, level = 40, numBadges = 1);
PARAMETRIZE(expectedOdds = 128, level = 40, numBadges = 0);
GIVEN {
for (u32 j = 0; j < 8; j++)
{
if (j < numBadges)
FlagSet(FLAG_BADGE01_GET + j);
else
FlagClear(FLAG_BADGE01_GET + j);
}
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CLEFFA) {Level(level);};
} WHEN {
TURN { USE_ITEM(player, ITEM_QUICK_BALL); }
} SCENE {
CATCHING_CHANCE(&recordedOdds);
} THEN {
EXPECT_EQ(expectedOdds, recordedOdds);
}
}
WILD_BATTLE_TEST("Capture: when CRITICAL_CAPTURE_IF_OWNED is enabled, capture of owned pokemon always appear critical")
{
enum Item item;
bool32 alreadyOwned;
u32 catchingChance;
PARAMETRIZE(item = ITEM_POKE_BALL, alreadyOwned = FALSE);
PARAMETRIZE(item = ITEM_QUICK_BALL, alreadyOwned = FALSE);
PARAMETRIZE(item = ITEM_MASTER_BALL, alreadyOwned = FALSE);
PARAMETRIZE(item = ITEM_POKE_BALL, alreadyOwned = TRUE);
PARAMETRIZE(item = ITEM_QUICK_BALL, alreadyOwned = TRUE);
PARAMETRIZE(item = ITEM_MASTER_BALL, alreadyOwned = TRUE);
GIVEN {
ASSUME(gSpeciesInfo[SPECIES_CATERPIE].catchRate > 155);
if (alreadyOwned)
GetSetPokedexFlag(SPECIES_CATERPIE, FLAG_SET_CAUGHT);
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7);
WITH_CONFIG(CONFIG_CRITICAL_CAPTURE_IF_OWNED, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CATERPIE);
} WHEN {
TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); }
} SCENE {
CATCHING_CHANCE(&catchingChance);
if (alreadyOwned)
{
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW);
NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW);
}
else
{
NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW);
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW);
}
} THEN {
if (item == ITEM_POKE_BALL)
EXPECT_LT(catchingChance, 255);
else
EXPECT_GT(catchingChance, 255);
}
}
WILD_BATTLE_TEST("Capture: when CRITICAL_CAPTURE_IF_OWNED is enabled, failed capture of owned pokemon does not appear critical")
{
bool32 success;
PARAMETRIZE(success = TRUE);
PARAMETRIZE(success = FALSE);
GIVEN {
GetSetPokedexFlag(SPECIES_CATERPIE, FLAG_SET_CAUGHT);
WITH_CONFIG(CONFIG_MISSING_BADGE_CATCH_MALUS, GEN_7);
WITH_CONFIG(CONFIG_CRITICAL_CAPTURE_IF_OWNED, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_CATERPIE);
} WHEN {
TURN { USE_ITEM(player, ITEM_POKE_BALL, WITH_RNG(RNG_BALLTHROW_SHAKE, success ? 0 : MAX_u16)); }
} SCENE {
if (success)
{
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW);
NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW);
}
else
{
NOT ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW);
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW);
}
}
}
WILD_BATTLE_TEST("Capture: ball data is properly set in captured pokemon")
{
u32 item = ITEM_NONE;
for (enum PokeBall ballId = BALL_STRANGE; ballId < POKEBALL_COUNT; ballId++)
{
PARAMETRIZE(item = gBallItemIds[ballId]);
}
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { USE_ITEM(player, item, WITH_RNG(RNG_BALLTHROW_SHAKE, 0)); }
} SCENE {
ONE_OF
{
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_CRITICAL_CAPTURE_THROW);
ANIMATION(ANIM_TYPE_SPECIAL, B_ANIM_BALL_THROW);
}
} THEN {
EXPECT_EQ(GetMonData(&gPlayerParty[1], MON_DATA_POKEBALL), GetItemSecondaryId(item));
}
}