Fixed most failed tests with GEN_LATEST GEN_8 (#7498)

This commit is contained in:
Eduardo Quezada 2025-08-08 03:44:12 -04:00 committed by GitHub
parent 8d8cf1b5d4
commit 0b299b3ffd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 161 additions and 55 deletions

View File

@ -17,6 +17,14 @@ enum GenConfigTag
GEN_CONFIG_BATTLE_BOND,
GEN_CONFIG_ATE_MULTIPLIER,
GEN_CONFIG_FELL_STINGER_STAT_RAISE,
GEN_PICKUP_WILD,
GEN_PROTEAN_LIBERO,
GEN_INTREPID_SWORD,
GEN_DAUNTLESS_SHIELD,
GEN_ILLUMINATE_EFFECT,
GEN_STEAL_WILD_ITEMS,
GEN_SNOW_WARNING,
GEN_ALLY_SWITCH_FAIL_CHANCE,
GEN_CONFIG_COUNT
};

View File

@ -20,6 +20,14 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
[GEN_CONFIG_BATTLE_BOND] = B_BATTLE_BOND,
[GEN_CONFIG_FELL_STINGER_STAT_RAISE] = B_FELL_STINGER_STAT_RAISE,
[GEN_CONFIG_ATE_MULTIPLIER] = B_ATE_MULTIPLIER,
[GEN_PICKUP_WILD] = B_PICKUP_WILD,
[GEN_PROTEAN_LIBERO] = B_PROTEAN_LIBERO,
[GEN_INTREPID_SWORD] = B_INTREPID_SWORD,
[GEN_DAUNTLESS_SHIELD] = B_DAUNTLESS_SHIELD,
[GEN_ILLUMINATE_EFFECT] = B_ILLUMINATE_EFFECT,
[GEN_STEAL_WILD_ITEMS] = B_STEAL_WILD_ITEMS,
[GEN_SNOW_WARNING] = B_SNOW_WARNING,
[GEN_ALLY_SWITCH_FAIL_CHANCE] = B_ALLY_SWITCH_FAIL_CHANCE,
};
#if TESTING

View File

@ -691,7 +691,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
&& gAiLogicData->abilities[opposingBattler] != ABILITY_UNAWARE
&& gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE
&& gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE
&& (B_ILLUMINATE_EFFECT >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE)
&& (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE)
&& !(gBattleMons[battler].status2 & STATUS2_FORESIGHT)
&& !(gStatuses3[battler] & STATUS3_MIRACLE_EYED))
switchMon = FALSE;

View File

@ -1945,7 +1945,7 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat)
if (stat == STAT_DEF)
return FALSE;
case ABILITY_ILLUMINATE:
if (B_ILLUMINATE_EFFECT < GEN_9)
if (GetGenConfig(GEN_ILLUMINATE_EFFECT) < GEN_9)
break;
case ABILITY_KEEN_EYE:
case ABILITY_MINDS_EYE:
@ -2128,7 +2128,7 @@ bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility)
&& defAbility != ABILITY_FULL_METAL_BODY
&& defAbility != ABILITY_KEEN_EYE
&& defAbility != ABILITY_MINDS_EYE
&& (B_ILLUMINATE_EFFECT >= GEN_9 && defAbility != ABILITY_ILLUMINATE)
&& (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && defAbility != ABILITY_ILLUMINATE)
&& gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET)
return TRUE;
return FALSE;

View File

@ -1584,7 +1584,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u
accStage = gBattleMons[battlerAtk].statStages[STAT_ACC];
evasionStage = gBattleMons[battlerDef].statStages[STAT_EVASION];
if (atkAbility == ABILITY_UNAWARE || atkAbility == ABILITY_KEEN_EYE || atkAbility == ABILITY_MINDS_EYE
|| (B_ILLUMINATE_EFFECT >= GEN_9 && atkAbility == ABILITY_ILLUMINATE))
|| (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && atkAbility == ABILITY_ILLUMINATE))
evasionStage = DEFAULT_STAT_STAGE;
if (MoveIgnoresDefenseEvasionStages(move))
evasionStage = DEFAULT_STAT_STAGE;
@ -3137,7 +3137,7 @@ void StealTargetItem(u8 battlerStealer, u8 battlerItem)
gLastUsedItem = gBattleMons[battlerItem].item;
gBattleMons[battlerItem].item = ITEM_NONE;
if (B_STEAL_WILD_ITEMS >= GEN_9
if (GetGenConfig(GEN_STEAL_WILD_ITEMS) >= GEN_9
&& !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE))
&& GetMoveEffect(gCurrentMove) == EFFECT_STEAL_ITEM
&& battlerStealer == gBattlerAttacker) // ensure that Pickpocket isn't activating this
@ -5971,7 +5971,7 @@ static void Cmd_playstatchangeanimation(void)
&& ability != ABILITY_FULL_METAL_BODY
&& ability != ABILITY_WHITE_SMOKE
&& !((ability == ABILITY_KEEN_EYE || ability == ABILITY_MINDS_EYE) && currStat == STAT_ACC)
&& !(B_ILLUMINATE_EFFECT >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC)
&& !(GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && ability == ABILITY_ILLUMINATE && currStat == STAT_ACC)
&& !(ability == ABILITY_HYPER_CUTTER && currStat == STAT_ATK)
&& !(ability == ABILITY_BIG_PECKS && currStat == STAT_DEF))
{
@ -6303,7 +6303,7 @@ static bool32 HandleMoveEndMoveBlock(u32 moveEffect)
{
StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item
if (!(B_STEAL_WILD_ITEMS >= GEN_9
if (!(GetGenConfig(GEN_STEAL_WILD_ITEMS) >= GEN_9
&& !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE))))
{
gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS)
@ -11715,8 +11715,8 @@ static void TryResetProtectUseCounter(u32 battler)
enum BattleMoveEffects lastEffect = GetMoveEffect(lastMove);
if (lastMove == MOVE_UNAVAILABLE
|| (!gBattleMoveEffects[lastEffect].usesProtectCounter
&& ((B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH)
|| B_ALLY_SWITCH_FAIL_CHANCE < GEN_9)))
&& ((GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9 && lastEffect != EFFECT_ALLY_SWITCH)
|| GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) < GEN_9)))
gDisableStructs[battler].protectUses = 0;
}
@ -12418,7 +12418,7 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr
}
else if (!certain
&& (((battlerAbility == ABILITY_KEEN_EYE || battlerAbility == ABILITY_MINDS_EYE) && statId == STAT_ACC)
|| (B_ILLUMINATE_EFFECT >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC)
|| (GetGenConfig(GEN_ILLUMINATE_EFFECT) >= GEN_9 && battlerAbility == ABILITY_ILLUMINATE && statId == STAT_ACC)
|| (battlerAbility == ABILITY_HYPER_CUTTER && statId == STAT_ATK)
|| (battlerAbility == ABILITY_BIG_PECKS && statId == STAT_DEF)))
{
@ -17759,7 +17759,7 @@ void BS_TryAllySwitch(void)
{
gBattlescriptCurrInstr = cmd->failInstr;
}
else if (B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9)
else if (GetGenConfig(GEN_ALLY_SWITCH_FAIL_CHANCE) >= GEN_9)
{
TryResetProtectUseCounter(gBattlerAttacker);
if (sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] < Random())

View File

@ -2311,7 +2311,7 @@ static void CancellerProtean(u32 *effect)
u32 moveType = GetBattleMoveType(gCurrentMove);
if (ProteanTryChangeType(gBattlerAttacker, GetBattlerAbility(gBattlerAttacker), gCurrentMove, moveType))
{
if (B_PROTEAN_LIBERO == GEN_9)
if (GetGenConfig(GEN_PROTEAN_LIBERO) >= GEN_9)
gDisableStructs[gBattlerAttacker].usedProteanLibero = TRUE;
PREPARE_TYPE_BUFFER(gBattleTextBuff1, moveType);
gBattlerAbility = gBattlerAttacker;
@ -3785,12 +3785,12 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
}
break;
case ABILITY_SNOW_WARNING:
if (B_SNOW_WARNING >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, TRUE))
if (GetGenConfig(GEN_SNOW_WARNING) >= GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_SNOW, TRUE))
{
BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesSnow);
effect++;
}
else if (B_SNOW_WARNING < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, TRUE))
else if (GetGenConfig(GEN_SNOW_WARNING) < GEN_9 && TryChangeBattleWeather(battler, BATTLE_WEATHER_HAIL, TRUE))
{
BattleScriptPushCursorAndCallback(BattleScript_SnowWarningActivatesHail);
effect++;
@ -3890,7 +3890,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
gBattleScripting.savedBattler = gBattlerAttacker;
gBattlerAttacker = battler;
if (B_INTREPID_SWORD == GEN_9)
if (GetGenConfig(GEN_INTREPID_SWORD) >= GEN_9)
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].intrepidSwordBoost = TRUE;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
SET_STATCHANGER(STAT_ATK, 1, FALSE);
@ -3904,7 +3904,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
gBattleScripting.savedBattler = gBattlerAttacker;
gBattlerAttacker = battler;
if (B_DAUNTLESS_SHIELD == GEN_9)
if (GetGenConfig(GEN_DAUNTLESS_SHIELD) >= GEN_9)
gBattleStruct->partyState[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].dauntlessShieldBoost = TRUE;
gSpecialStatuses[battler].switchInAbilityDone = TRUE;
SET_STATCHANGER(STAT_DEF, 1, FALSE);
@ -10889,7 +10889,7 @@ u16 GetUsedHeldItem(u32 battler)
bool32 CantPickupItem(u32 battler)
{
// Used by RandomUniformExcept() for RNG_PICKUP
if (battler == gBattlerAttacker && (B_PICKUP_WILD < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK)))
if (battler == gBattlerAttacker && (GetGenConfig(GEN_PICKUP_WILD) < GEN_9 || gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_LINK)))
return TRUE;
return !(IsBattlerAlive(battler) && GetUsedHeldItem(battler) && gBattleStruct->battlerState[battler].canPickupItem);
}

View File

@ -1,11 +1,6 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(B_DAUNTLESS_SHIELD == GEN_9);
}
SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage")
{
GIVEN {
@ -22,9 +17,32 @@ SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage")
}
}
SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle")
SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage every time it switches in (Gen8)")
{
GIVEN {
WITH_CONFIG(GEN_DAUNTLESS_SHIELD, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); }
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { SWITCH(opponent, 1); }
TURN { SWITCH(opponent, 0); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!");
ABILITY_POPUP(opponent, ABILITY_DAUNTLESS_SHIELD);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!");
} THEN {
EXPECT_EQ(opponent->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Dauntless Shield raises Defense by one stage only once per battle (Gen 9+)")
{
GIVEN {
WITH_CONFIG(GEN_DAUNTLESS_SHIELD, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ZAMAZENTA) { Ability(ABILITY_DAUNTLESS_SHIELD); }
OPPONENT(SPECIES_WYNAUT);
@ -63,4 +81,3 @@ SINGLE_BATTLE_TEST("Dauntless Shield activates when it's no longer effected by N
MESSAGE("The opposing Zamazenta's Dauntless Shield raised its Defense!");
}
}

View File

@ -1,11 +1,6 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(B_INTREPID_SWORD == GEN_9);
}
SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage")
{
GIVEN {
@ -22,9 +17,32 @@ SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage")
}
}
SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle")
SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage every time it switches in (Gen8)")
{
GIVEN {
WITH_CONFIG(GEN_INTREPID_SWORD, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); }
OPPONENT(SPECIES_WYNAUT);
} WHEN {
TURN { SWITCH(opponent, 1); }
TURN { SWITCH(opponent, 0); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!");
ABILITY_POPUP(opponent, ABILITY_INTREPID_SWORD);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, opponent);
MESSAGE("The opposing Zacian's Intrepid Sword raised its Attack!");
} THEN {
EXPECT_EQ(opponent->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1);
}
}
SINGLE_BATTLE_TEST("Intrepid Sword raises Attack by one stage only once per battle (Gen9+)")
{
GIVEN {
WITH_CONFIG(GEN_INTREPID_SWORD, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_ZACIAN) { Ability(ABILITY_INTREPID_SWORD); }
OPPONENT(SPECIES_WYNAUT);

View File

@ -5,7 +5,6 @@ ASSUMPTIONS
{
ASSUME(GetMoveAccuracy(MOVE_SCRATCH) == 100);
ASSUME(GetMoveEffect(MOVE_SAND_ATTACK) == EFFECT_ACCURACY_DOWN);
ASSUME(B_ILLUMINATE_EFFECT >= GEN_9);
}
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stage reduction from moves")
@ -19,6 +18,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag
PASSES_RANDOMLY(100, 100, RNG_ACCURACY);
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(species) { Ability(ability); }
} WHEN {
@ -47,6 +47,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi
PASSES_RANDOMLY(100, 100, RNG_ACCURACY);
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
ASSUME(GetMoveEffect(MOVE_DOUBLE_TEAM) == EFFECT_EVASION_UP);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(species) { Ability(ability); }
@ -80,6 +81,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B
PASSES_RANDOMLY(GetMoveAccuracy(MOVE_SCRATCH) * 3 / 4, 100, RNG_ACCURACY);
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
PLAYER(speciesPlayer) { Ability(abilityPlayer); }
OPPONENT(speciesOpponent) { Ability(abilityOpponent); }
} WHEN {
@ -102,6 +104,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T
PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; }
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP);
ASSUME(GetMoveEffect(MOVE_TOPSY_TURVY) == EFFECT_TOPSY_TURVY);
PLAYER(SPECIES_WOBBUFFET);
@ -141,6 +144,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi
PARAMETRIZE { species = SPECIES_URSALUNA_BLOODMOON; ability = ABILITY_MINDS_EYE; }
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
ASSUME(GetMoveEffect(MOVE_BATON_PASS) == EFFECT_BATON_PASS);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
@ -173,6 +177,7 @@ SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief fro
PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; }
GIVEN {
WITH_CONFIG(GEN_ILLUMINATE_EFFECT, GEN_9);
ASSUME(GetMoveEffect(MOVE_HONE_CLAWS) == EFFECT_ATTACK_ACCURACY_UP);
ASSUME(GetMoveEffect(MOVE_SPECTRAL_THIEF) == EFFECT_SPECTRAL_THIEF);
PLAYER(SPECIES_WOBBUFFET);

View File

@ -23,10 +23,10 @@ SINGLE_BATTLE_TEST("Pickup grants an item used by another Pokémon")
}
}
WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen 9)")
WILD_BATTLE_TEST("Pickup grants an item used by itself in wild battles (Gen9+)")
{
GIVEN {
ASSUME(B_PICKUP_WILD >= GEN_9);
WITH_CONFIG(GEN_PICKUP_WILD, GEN_9);
PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); MaxHP(100); HP(51); Item(ITEM_SITRUS_BERRY); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -1,14 +1,36 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS
{
ASSUME(B_PROTEAN_LIBERO == GEN_9);
}
SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in")
SINGLE_BATTLE_TEST("Protean changes the type of the user to the move used every time (Gen6-8)")
{
GIVEN {
WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_6);
PLAYER(SPECIES_REGIROCK);
OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_WATER_GUN); }
TURN { MOVE(opponent, MOVE_SCRATCH); }
TURN { SWITCH(opponent, 1); }
TURN { SWITCH(opponent, 0); }
TURN { MOVE(opponent, MOVE_WATER_GUN); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_PROTEAN);
MESSAGE("The opposing Kecleon transformed into the Water type!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent);
ABILITY_POPUP(opponent, ABILITY_PROTEAN);
MESSAGE("The opposing Kecleon transformed into the Normal type!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent);
ABILITY_POPUP(opponent, ABILITY_PROTEAN);
MESSAGE("The opposing Kecleon transformed into the Water type!");
ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_GUN, opponent);
}
}
SINGLE_BATTLE_TEST("Protean changes the type of the user only once per switch in (Gen9+)")
{
GIVEN {
WITH_CONFIG(GEN_PROTEAN_LIBERO, GEN_9);
PLAYER(SPECIES_REGIROCK);
OPPONENT(SPECIES_KECLEON) { Ability(ABILITY_PROTEAN); }
OPPONENT(SPECIES_WOBBUFFET);

View File

@ -52,6 +52,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage)
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; }
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_REFRIGERATE; }
GIVEN {
WITH_CONFIG(GEN_SNOW_WARNING, GEN_9); //To prevent capturing hail damage
ASSUME(GetMoveEffect(MOVE_WEATHER_BALL) == EFFECT_WEATHER_BALL);
ASSUME(gSpeciesInfo[SPECIES_PINSIR].types[0] == TYPE_BUG);
PLAYER(SPECIES_AMAURA) { Ability(ability); }

View File

@ -1,24 +1,30 @@
#include "global.h"
#include "test/battle.h"
#if B_SNOW_WARNING < GEN_9
SINGLE_BATTLE_TEST("Snow Warning summons hail")
#elif B_SNOW_WARNING >= GEN_9
SINGLE_BATTLE_TEST("Snow Warning summons snow")
#endif
SINGLE_BATTLE_TEST("Snow Warning summons hail (Gen4-8)")
{
GIVEN {
WITH_CONFIG(GEN_SNOW_WARNING, GEN_8);
PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN {}
} SCENE {
#if B_SNOW_WARNING < GEN_9
MESSAGE("It started to hail!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES);
#elif B_SNOW_WARNING >= GEN_9
MESSAGE("It started to snow!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES);
#endif
}
}
SINGLE_BATTLE_TEST("Snow Warning summons snow (Gen9+)")
{
GIVEN {
WITH_CONFIG(GEN_SNOW_WARNING, GEN_9);
PLAYER(SPECIES_ABOMASNOW) { Ability(ABILITY_SNOW_WARNING); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN {}
} SCENE {
MESSAGE("It started to snow!");
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_SNOW_CONTINUES);
}
}

View File

@ -842,6 +842,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an
PARAMETRIZE { aiMon = SPECIES_SHIFTRY; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;}
GIVEN {
ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5);
ASSUME(P_UPDATED_ABILITIES >= GEN_9); //For the predicted ability for Shiftry
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING);
PLAYER(SPECIES_ZIGZAGOON) { Moves(move); }
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); }

View File

@ -185,10 +185,25 @@ DOUBLE_BATTLE_TEST("Ally Switch doesn't make self-targeting status moves fail")
}
}
DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter")
DOUBLE_BATTLE_TEST("Ally Switch doesn't increase the Protect-like moves counter (Gen5-8)")
{
GIVEN {
ASSUME(B_ALLY_SWITCH_FAIL_CHANCE >= GEN_9);
WITH_CONFIG(GEN_ALLY_SWITCH_FAIL_CHANCE, GEN_8);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(playerLeft, MOVE_ALLY_SWITCH); }
} THEN {
EXPECT(gDisableStructs[B_POSITION_PLAYER_RIGHT].protectUses == 0);
}
}
DOUBLE_BATTLE_TEST("Ally Switch increases the Protect-like moves counter (Gen9+)")
{
GIVEN {
WITH_CONFIG(GEN_ALLY_SWITCH_FAIL_CHANCE, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
@ -319,7 +334,7 @@ DOUBLE_BATTLE_TEST("Ally switch updates last used moves for Mimic")
OPPONENT(SPECIES_FEAROW) { Speed(20); }
OPPONENT(SPECIES_ARON) { Speed(30); }
} WHEN {
TURN { MOVE(playerRight, MOVE_FAKE_OUT, target: opponentRight); MOVE(playerLeft, MOVE_ALLY_SWITCH);
TURN { MOVE(playerRight, MOVE_FAKE_OUT, target: opponentRight); MOVE(playerLeft, MOVE_ALLY_SWITCH);
MOVE(opponentLeft, MOVE_MIMIC, target: playerLeft);
}
} SCENE {

View File

@ -137,9 +137,14 @@ SINGLE_BATTLE_TEST("Chloroblast is not affected by Reckless", s16 damage)
u32 move;
PARAMETRIZE { move = MOVE_CHLOROBLAST; }
PARAMETRIZE { move = MOVE_FRENZY_PLANT; }
if (B_UPDATED_MOVE_DATA >= GEN_9) {
PARAMETRIZE { move = MOVE_FRENZY_PLANT; } // 150 power
} else {
PARAMETRIZE { move = MOVE_SEED_FLARE; } // 120 power
}
GIVEN {
ASSUME(GetMovePower(MOVE_CHLOROBLAST) == GetMovePower(move));
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {

View File

@ -107,13 +107,13 @@ SINGLE_BATTLE_TEST("Thief and Covet don't steal target's held item if target has
}
// Test can't currently verify if the item is sent to Bag
WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag in wild battles (Gen 9)")
WILD_BATTLE_TEST("Thief and Covet steal target's held item and it's added to Bag in wild battles (Gen 9+)")
{
u32 move;
PARAMETRIZE { move = MOVE_THIEF; }
PARAMETRIZE { move = MOVE_COVET; }
GIVEN {
ASSUME(B_STEAL_WILD_ITEMS >= GEN_9);
WITH_CONFIG(GEN_STEAL_WILD_ITEMS, GEN_9);
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_HYPER_POTION); }
} WHEN {