Finished fixing tests when setting GEN_LATEST to GEN_5 (#8263)
This commit is contained in:
parent
7c20fbd76b
commit
51a750e61a
@ -48,6 +48,11 @@ enum GenConfigTag
|
||||
GEN_CONFIG_PARALYZE_ELECTRIC,
|
||||
GEN_CONFIG_BADGE_BOOST,
|
||||
GEN_CONFIG_LEAF_GUARD_PREVENTS_REST,
|
||||
GEN_CONFIG_WIDE_GUARD,
|
||||
GEN_CONFIG_QUICK_GUARD,
|
||||
GEN_CONFIG_DEFOG_EFFECT_CLEARING,
|
||||
GEN_CONFIG_BURN_HIT_THAW,
|
||||
GEN_CONFIG_BURN_FACADE_DMG,
|
||||
GEN_CONFIG_COUNT
|
||||
};
|
||||
|
||||
|
||||
@ -51,6 +51,11 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] =
|
||||
[GEN_CONFIG_PARALYZE_ELECTRIC] = B_PARALYZE_ELECTRIC,
|
||||
[GEN_CONFIG_BADGE_BOOST] = B_BADGE_BOOST,
|
||||
[GEN_CONFIG_LEAF_GUARD_PREVENTS_REST] = B_LEAF_GUARD_PREVENTS_REST,
|
||||
[GEN_CONFIG_WIDE_GUARD] = B_WIDE_GUARD,
|
||||
[GEN_CONFIG_QUICK_GUARD] = B_QUICK_GUARD,
|
||||
[GEN_CONFIG_DEFOG_EFFECT_CLEARING] = B_DEFOG_EFFECT_CLEARING,
|
||||
[GEN_CONFIG_BURN_HIT_THAW] = B_BURN_HIT_THAW,
|
||||
[GEN_CONFIG_BURN_FACADE_DMG] = B_BURN_FACADE_DMG,
|
||||
};
|
||||
|
||||
#if TESTING
|
||||
|
||||
@ -1897,7 +1897,7 @@ bool32 IsHazardClearingMove(u32 move)
|
||||
case EFFECT_TIDY_UP:
|
||||
return TRUE;
|
||||
case EFFECT_DEFOG:
|
||||
if (B_DEFOG_EFFECT_CLEARING >= GEN_6)
|
||||
if (GetGenConfig(GEN_CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6)
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -9322,7 +9322,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear)
|
||||
DEFOG_CLEAR(SIDE_STATUS_AURORA_VEIL, auroraVeilTimer, BattleScript_SideStatusWoreOffReturn, MOVE_AURORA_VEIL);
|
||||
DEFOG_CLEAR(SIDE_STATUS_SAFEGUARD, safeguardTimer, BattleScript_SideStatusWoreOffReturn, MOVE_SAFEGUARD);
|
||||
}
|
||||
if (B_DEFOG_EFFECT_CLEARING >= GEN_6)
|
||||
if (GetGenConfig(GEN_CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_6)
|
||||
{
|
||||
gBattlerAttacker = i; // For correct battle string. Ally's / Foe's
|
||||
if (DefogClearHazards(saveBattler, i, clear))
|
||||
@ -9334,7 +9334,7 @@ static bool32 TryDefogClear(u32 battlerAtk, bool32 clear)
|
||||
BattleScriptCall(BattleScript_FogEnded_Ret);
|
||||
return TRUE;
|
||||
}
|
||||
if (B_DEFOG_EFFECT_CLEARING >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY))
|
||||
if (GetGenConfig(GEN_CONFIG_DEFOG_EFFECT_CLEARING) >= GEN_8 && (gFieldStatuses & STATUS_FIELD_TERRAIN_ANY))
|
||||
{
|
||||
RemoveAllTerrains();
|
||||
BattleScriptCall(BattleScript_TerrainEnds_Ret);
|
||||
@ -9653,8 +9653,8 @@ static void Cmd_setprotectlike(void)
|
||||
notLastTurn = FALSE;
|
||||
|
||||
if ((sProtectSuccessRates[gDisableStructs[gBattlerAttacker].protectUses] >= RandomUniform(RNG_PROTECT_FAIL, 0, USHRT_MAX) && notLastTurn)
|
||||
|| (protectMethod == PROTECT_WIDE_GUARD && B_WIDE_GUARD != GEN_5)
|
||||
|| (protectMethod == PROTECT_QUICK_GUARD && B_QUICK_GUARD != GEN_5))
|
||||
|| (protectMethod == PROTECT_WIDE_GUARD && GetGenConfig(GEN_CONFIG_WIDE_GUARD) >= GEN_6)
|
||||
|| (protectMethod == PROTECT_QUICK_GUARD && GetGenConfig(GEN_CONFIG_QUICK_GUARD) >= GEN_6))
|
||||
{
|
||||
if (GetMoveEffect(gCurrentMove) == EFFECT_ENDURE)
|
||||
{
|
||||
@ -14971,7 +14971,7 @@ bool32 CanBurnHitThaw(u16 move)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
if (B_BURN_HIT_THAW >= GEN_6)
|
||||
if (GetGenConfig(GEN_CONFIG_BURN_HIT_THAW) >= GEN_6)
|
||||
{
|
||||
u32 numAdditionalEffects = GetMoveAdditionalEffectCount(move);
|
||||
for (i = 0; i < numAdditionalEffects; i++)
|
||||
|
||||
@ -9025,12 +9025,12 @@ static inline uq4_12_t GetBurnOrFrostBiteModifier(struct DamageContext *ctx)
|
||||
|
||||
if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_BURN
|
||||
&& IsBattleMovePhysical(ctx->move)
|
||||
&& (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE)
|
||||
&& (GetGenConfig(GEN_CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE)
|
||||
&& ctx->abilityAtk != ABILITY_GUTS)
|
||||
return UQ_4_12(0.5);
|
||||
if (gBattleMons[ctx->battlerAtk].status1 & STATUS1_FROSTBITE
|
||||
&& IsBattleMoveSpecial(ctx->move)
|
||||
&& (B_BURN_FACADE_DMG < GEN_6 || moveEffect != EFFECT_FACADE))
|
||||
&& (GetGenConfig(GEN_CONFIG_BURN_FACADE_DMG) < GEN_6 || moveEffect != EFFECT_FACADE))
|
||||
return UQ_4_12(0.5);
|
||||
return UQ_4_12(1.0);
|
||||
}
|
||||
|
||||
@ -5720,7 +5720,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] =
|
||||
.ignoresProtect = TRUE,
|
||||
.ignoresSubstitute = TRUE,
|
||||
.mirrorMoveBanned = TRUE,
|
||||
.soundMove = B_UPDATED_MOVE_FLAGS != GEN_5,
|
||||
.soundMove = TRUE,
|
||||
.contestEffect = CONTEST_EFFECT_BETTER_IF_LAST,
|
||||
.contestCategory = CONTEST_CATEGORY_BEAUTY,
|
||||
.contestComboStarterId = COMBO_STARTER_HEAL_BELL,
|
||||
|
||||
@ -143,7 +143,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense
|
||||
PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CRAMORANT) { Ability(ABILITY_GULP_MISSILE); }
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
OPPONENT(species) { Ability(ability); HP(9999); MaxHP(9999); } // In Gen 5 data, Surf would be enough to knock out Chatot
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_SURF); MOVE(opponent, MOVE_SCRATCH); }
|
||||
} SCENE {
|
||||
|
||||
@ -5,12 +5,12 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon")
|
||||
{
|
||||
u16 move, statId;
|
||||
|
||||
PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; }
|
||||
PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; }
|
||||
PARAMETRIZE { move = MOVE_LEER; statId = STAT_DEF; }
|
||||
PARAMETRIZE { move = MOVE_GROWL; statId = STAT_ATK; }
|
||||
PARAMETRIZE { move = MOVE_SWEET_SCENT; statId = STAT_EVASION; }
|
||||
PARAMETRIZE { move = MOVE_SAND_ATTACK; statId = STAT_ACC; }
|
||||
PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; }
|
||||
PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; }
|
||||
PARAMETRIZE { move = MOVE_CONFIDE; statId = STAT_SPATK; }
|
||||
PARAMETRIZE { move = MOVE_FAKE_TEARS; statId = STAT_SPDEF; }
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CORVIKNIGHT) {Ability(ABILITY_MIRROR_ARMOR);}
|
||||
@ -29,7 +29,11 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon")
|
||||
MESSAGE("The opposing Wynaut's Attack fell!");
|
||||
break;
|
||||
case STAT_EVASION:
|
||||
MESSAGE("The opposing Wynaut's evasiveness harshly fell!");
|
||||
if (GetMoveEffect(move) == EFFECT_EVASION_DOWN_2) {
|
||||
MESSAGE("The opposing Wynaut's evasiveness harshly fell!");
|
||||
} else {
|
||||
MESSAGE("The opposing Wynaut's evasiveness fell!");
|
||||
}
|
||||
break;
|
||||
case STAT_ACC:
|
||||
MESSAGE("The opposing Wynaut's accuracy fell!");
|
||||
@ -43,7 +47,7 @@ SINGLE_BATTLE_TEST("Mirror Armor lowers a stat of the attacking Pokémon")
|
||||
}
|
||||
} THEN {
|
||||
EXPECT_EQ(player->statStages[statId], DEFAULT_STAT_STAGE);
|
||||
EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || statId == STAT_EVASION) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1);
|
||||
EXPECT_EQ(opponent->statStages[statId], (statId == STAT_SPDEF || (statId == STAT_EVASION && GetMoveEffect(move) == EFFECT_EVASION_DOWN_2)) ? DEFAULT_STAT_STAGE - 2 : DEFAULT_STAT_STAGE - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,6 +25,7 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp
|
||||
SINGLE_BATTLE_TEST("Synchronize will still show up the ability pop up even if it fails")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_6);
|
||||
ASSUME(MoveMakesContact(MOVE_TACKLE));
|
||||
PLAYER(SPECIES_PIKACHU) { Ability(ABILITY_STATIC); }
|
||||
OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); }
|
||||
|
||||
@ -10,6 +10,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower")
|
||||
PARAMETRIZE { speedPlayer = 10; speedAi = 200; }
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMovePower(MOVE_WATER_GUN) == GetMovePower(MOVE_BUBBLE));
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_SCIZOR) { Speed(speedPlayer); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Speed(speedAi); }
|
||||
@ -34,6 +35,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has
|
||||
PARAMETRIZE { abilityAI = ABILITY_MOXIE; }
|
||||
PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } // Mold Breaker ignores Contrary.
|
||||
GIVEN {
|
||||
ASSUME(GetMovePower(MOVE_BUBBLE) == GetMovePower(MOVE_WATER_GUN));
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_SHUCKLE) { Ability(ABILITY_CONTRARY); }
|
||||
OPPONENT(SPECIES_PINSIR) { Moves(MOVE_WATER_GUN, MOVE_BUBBLE); Ability(abilityAI); }
|
||||
@ -150,6 +152,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves
|
||||
ASSUME(GetMoveCategory(MOVE_SCALD) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_POISON_JAB) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetSpeciesBaseAttack(SPECIES_NIDOQUEEN) == 92); // Gen 5's 82 Base Attack causes the test to fail
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_TYPHLOSION) { Ability(abilityDef); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@ -204,6 +207,9 @@ AI_SINGLE_BATTLE_TEST("AI prefers a weaker move over a one with a downside effec
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_FLAMETHROWER) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet
|
||||
ASSUME(GetMoveCategory(MOVE_OVERHEAT) == DAMAGE_CATEGORY_SPECIAL); // Added because Typhlosion has to KO Wobbuffet
|
||||
// With Gen 5 data, it chooses Overheat instead
|
||||
ASSUME(GetMovePower(MOVE_FLAMETHROWER) == 90); // In Gen 5, it's 95
|
||||
ASSUME(GetMovePower(MOVE_OVERHEAT) == 130); // In Gen 5, it's 140.
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(hp); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@ -332,6 +338,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_SOLAR_BEAM) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMoveCategory(MOVE_GRASS_PLEDGE) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMovePower(MOVE_GRASS_PLEDGE) == 80); // Gen 5's 50 power causes the test to fail
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(211); }
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@ -687,6 +694,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use thawing moves if target is frozen unless it
|
||||
PARAMETRIZE { status = STATUS1_FROSTBITE; aiMove = MOVE_EMBER; aiFlags = AI_FLAG_CHECK_BAD_MOVE; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_BURN_HIT_THAW, GEN_6); // In Gen 5, non-Fire burning moves didn't cause thawing
|
||||
ASSUME(GetMoveType(MOVE_EMBER) == TYPE_FIRE);
|
||||
ASSUME(GetMoveCategory(MOVE_TACKLE) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_WATER_GUN) == DAMAGE_CATEGORY_SPECIAL);
|
||||
@ -928,6 +936,7 @@ AI_SINGLE_BATTLE_TEST("AI will see Magnitude damage")
|
||||
AI_SINGLE_BATTLE_TEST("AI will prefer resisted move over failing move")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_6);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY);
|
||||
PLAYER(SPECIES_ROSELIA) { Moves(MOVE_ABSORB); };
|
||||
OPPONENT(SPECIES_GLOOM) { Moves(MOVE_MEGA_DRAIN, MOVE_STUN_SPORE, MOVE_LEECH_SEED, MOVE_SYNTHESIS); }
|
||||
|
||||
@ -18,6 +18,7 @@ AI_SINGLE_BATTLE_TEST("AI sees increased base power of Facade")
|
||||
PARAMETRIZE { status1 = STATUS1_BURN; expectedMove = MOVE_FACADE; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_BURN_FACADE_DMG, GEN_6);
|
||||
ASSUME(GetMoveEffect(MOVE_FACADE) == EFFECT_FACADE);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { HP(60); }
|
||||
@ -162,6 +163,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov
|
||||
ASSUME(GetMoveEffect(MOVE_MIRROR_COAT) == EFFECT_MIRROR_COAT);
|
||||
ASSUME(GetMoveCategory(MOVE_STRENGTH) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
ASSUME(GetMoveCategory(MOVE_POWER_GEM) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMovePower(MOVE_POWER_GEM) == 80); // Gen 5's 70 power causes the test to fail
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { HP(102); Speed(100); Moves(opponentMove, MOVE_STRENGTH); }
|
||||
@ -199,18 +201,18 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner")
|
||||
{
|
||||
u32 status1_0, status1_1, partnerAbility, move;
|
||||
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
|
||||
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
|
||||
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
|
||||
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
|
||||
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
|
||||
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
|
||||
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SOUNDPROOF; }
|
||||
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
|
||||
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
|
||||
move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; }
|
||||
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
|
||||
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
|
||||
move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; }
|
||||
|
||||
|
||||
|
||||
@ -494,15 +494,15 @@ AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally")
|
||||
PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
|
||||
PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
|
||||
PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; }
|
||||
|
||||
GIVEN {
|
||||
@ -525,13 +525,13 @@ AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally")
|
||||
PARAMETRIZE { goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; }
|
||||
PARAMETRIZE { goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; }
|
||||
PARAMETRIZE { goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; }
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
|
||||
goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; }
|
||||
|
||||
GIVEN {
|
||||
@ -555,6 +555,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses After You to set up Trick Room")
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU);
|
||||
ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM);
|
||||
ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
@ -582,6 +583,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room intelligently")
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_AFTER_YOU) == EFFECT_AFTER_YOU);
|
||||
ASSUME(GetMoveEffect(MOVE_TRICK_ROOM) == EFFECT_TRICK_ROOM);
|
||||
ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(4); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(speed); }
|
||||
@ -611,7 +613,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room with both battlers on the turn it expi
|
||||
TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
|
||||
TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
|
||||
TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die")
|
||||
|
||||
@ -53,7 +53,7 @@ AI_SINGLE_BATTLE_TEST("AI sees on-field player ability correctly and does not se
|
||||
OPPONENT(SPECIES_BOMBIRDIER) {Level(42); Moves(MOVE_ROCK_SLIDE); }
|
||||
OPPONENT(SPECIES_IRON_THORNS) {Level(43); Moves(MOVE_SUPERCELL_SLAM, MOVE_ICE_PUNCH); }
|
||||
} WHEN {
|
||||
TURN {
|
||||
TURN {
|
||||
MOVE(player, MOVE_VOLT_SWITCH);
|
||||
SEND_OUT(player, 1);
|
||||
EXPECT_MOVE(opponent, MOVE_SCRATCH);
|
||||
@ -636,6 +636,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS);
|
||||
ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC);
|
||||
ASSUME(GetMovePower(MOVE_AURA_SPHERE) == 80); // Gen 5's 90 power causes too much damage
|
||||
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_SCRATCH, MOVE_CELEBRATE, MOVE_TOXIC, MOVE_AURA_SPHERE); }
|
||||
OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); }
|
||||
@ -939,6 +940,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will stay in if Encore'd into
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_ENCORE) == EFFECT_ENCORE);
|
||||
ASSUME(GetSpeciesType(SPECIES_AZURILL, 0) == TYPE_NORMAL);
|
||||
ASSUME(GetSpeciesType(SPECIES_AZURILL, 1) == TYPE_FAIRY);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING);
|
||||
PLAYER(SPECIES_AZURILL) { Moves(MOVE_SCRATCH, MOVE_ENCORE); }
|
||||
OPPONENT(SPECIES_ODDISH) { Moves(MOVE_ACID); }
|
||||
@ -1328,6 +1331,8 @@ AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting abi
|
||||
AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI will properly consider immunities when determining switchin type matchup")
|
||||
{
|
||||
GIVEN {
|
||||
ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 0) == TYPE_GRASS);
|
||||
ASSUME(GetSpeciesType(SPECIES_WHIMSICOTT, 1) == TYPE_FAIRY); // Gen 5's pure Grass type makes the test fail
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT);
|
||||
PLAYER(SPECIES_POLIWRATH) { Moves(MOVE_WATER_GUN, MOVE_KARATE_CHOP); }
|
||||
OPPONENT(SPECIES_ZIGZAGOON) { Level(1); Moves(MOVE_SCRATCH); }
|
||||
|
||||
@ -41,7 +41,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+")
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)")
|
||||
SINGLE_BATTLE_TEST("Damage calculation matches Gen6+ (Muscle Band, crit)")
|
||||
{
|
||||
s16 dmg;
|
||||
s16 expectedDamage;
|
||||
@ -62,6 +62,7 @@ SINGLE_BATTLE_TEST("Damage calculation matches Gen5+ (Muscle Band, crit)")
|
||||
PARAMETRIZE { expectedDamage = 276; }
|
||||
PARAMETRIZE { expectedDamage = 268; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_CRIT_MULTIPLIER, GEN_6);
|
||||
ASSUME(GetMoveCategory(MOVE_ICE_FANG) == DAMAGE_CATEGORY_PHYSICAL);
|
||||
PLAYER(SPECIES_GLACEON) { Level(75); Attack(123); Item(ITEM_MUSCLE_BAND); }
|
||||
OPPONENT(SPECIES_GARCHOMP) { Defense(163); }
|
||||
|
||||
@ -860,7 +860,7 @@ SINGLE_BATTLE_TEST("Dynamax: Max Hailstorm sets up hail")
|
||||
MESSAGE("It started to hail!");
|
||||
MESSAGE("The opposing Wobbuffet used Celebrate!");
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HAIL_CONTINUES);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -971,6 +971,7 @@ SINGLE_BATTLE_TEST("Dynamax: G-Max Stonesurge sets up Stealth Rocks")
|
||||
SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel")
|
||||
{
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_DEFOG_EFFECT_CLEARING, GEN_6);
|
||||
ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE));
|
||||
PLAYER(SPECIES_COPPERAJAH) { GigantamaxFactor(TRUE); }
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
|
||||
@ -115,10 +115,16 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_ALL_STATS_UP raises all of a battler's sta
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio")
|
||||
SINGLE_BATTLE_TEST("(Z-MOVE) Z_EFFECT_BOOST_CRITS raises a battler's critical hit ratio by 2 stages")
|
||||
{
|
||||
PASSES_RANDOMLY(1, 2, RNG_CRITICAL_HIT);
|
||||
u32 genConfig = 0, chance;
|
||||
for (u32 j = GEN_1; j <= GEN_5; j++)
|
||||
PARAMETRIZE { genConfig = j; chance = 4; } // 25%
|
||||
for (u32 j = GEN_6; j <= GEN_9; j++)
|
||||
PARAMETRIZE { genConfig = j; chance = 2; } // 50%
|
||||
PASSES_RANDOMLY(1, chance, RNG_CRITICAL_HIT);
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_CRIT_CHANCE, genConfig);
|
||||
ASSUME(GetMoveType(MOVE_FORESIGHT) == TYPE_NORMAL);
|
||||
ASSUME(GetMoveZEffect(MOVE_FORESIGHT) == Z_EFFECT_BOOST_CRITS);
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); }
|
||||
|
||||
@ -46,8 +46,10 @@ SINGLE_BATTLE_TEST("Safety Goggles blocks damage from Sandstorm")
|
||||
|
||||
SINGLE_BATTLE_TEST("Safety Goggles blocks Effect Spore's effect")
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
PASSES_RANDOMLY(100, 100, RNG_EFFECT_SPORE);
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_POWDER_GRASS, GEN_5); // Setting it to Gen 6 causes it to pass
|
||||
ASSUME(MoveMakesContact(MOVE_SCRATCH));
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SAFETY_GOGGLES); }
|
||||
OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); }
|
||||
|
||||
@ -334,7 +334,11 @@ DOUBLE_BATTLE_TEST("Defog removes Aurora Veil from target's side", s16 damagePhy
|
||||
|
||||
DOUBLE_BATTLE_TEST("Defog removes everything it can")
|
||||
{
|
||||
u32 config;
|
||||
PARAMETRIZE { config = GEN_5; }
|
||||
PARAMETRIZE { config = GEN_6; }
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_DEFOG_EFFECT_CLEARING, config);
|
||||
ASSUME(GetMoveEffect(MOVE_HAIL) == EFFECT_HAIL);
|
||||
ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE);
|
||||
PLAYER(SPECIES_GLALIE) { Speed(4); }
|
||||
@ -363,7 +367,7 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can")
|
||||
MESSAGE("Your team's Aurora Veil wore off!");
|
||||
MESSAGE("Your team's Safeguard wore off!");
|
||||
|
||||
if (B_DEFOG_EFFECT_CLEARING >= GEN_6) {
|
||||
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!");
|
||||
@ -376,17 +380,31 @@ DOUBLE_BATTLE_TEST("Defog removes everything it can")
|
||||
MESSAGE("The pointed stones disappeared from around the opposing team!");
|
||||
}
|
||||
} THEN {
|
||||
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);
|
||||
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);
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -118,6 +118,9 @@ AI_SINGLE_BATTLE_TEST("AI won't use status moves if the player's best attacking
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH);
|
||||
ASSUME(GetMoveCategory(MOVE_SWORDS_DANCE) == DAMAGE_CATEGORY_STATUS);
|
||||
// If Clefable is Normal-type, it will always use Play Rough.
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 0) == TYPE_FAIRY);
|
||||
ASSUME(GetSpeciesType(SPECIES_CLEFABLE, 1) == TYPE_FAIRY);
|
||||
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT);
|
||||
PLAYER(SPECIES_SNORLAX) { Moves(MOVE_FOCUS_PUNCH, MOVE_POUND); }
|
||||
OPPONENT(SPECIES_CLEFABLE) { Moves(MOVE_PLAY_ROUGH, MOVE_SWORDS_DANCE); }
|
||||
|
||||
@ -96,8 +96,8 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked
|
||||
{
|
||||
u32 species;
|
||||
|
||||
PARAMETRIZE { species = SPECIES_CLEFAIRY; }
|
||||
PARAMETRIZE { species = SPECIES_SHELLOS; } // Closest mon in both Defense and Sp. Defense
|
||||
PARAMETRIZE { species = SPECIES_FIDOUGH; }
|
||||
PARAMETRIZE { species = SPECIES_MAGNEMITE; } // Closest mon in both Defense and Sp. Defense
|
||||
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@ -105,7 +105,7 @@ SINGLE_BATTLE_TEST("Glaive Rush doesn't affect the user if the effect is blocked
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_GLAIVE_RUSH); MOVE(opponent, MOVE_SCRATCH); }
|
||||
} SCENE {
|
||||
if (species == SPECIES_CLEFAIRY)
|
||||
if (species == SPECIES_FIDOUGH)
|
||||
NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player);
|
||||
else
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_GLAIVE_RUSH, player);
|
||||
|
||||
@ -13,7 +13,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m
|
||||
PARAMETRIZE { faintCount = 1; }
|
||||
PARAMETRIZE { faintCount = 2; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness
|
||||
PLAYER(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness
|
||||
PLAYER(SPECIES_GEODUDE);
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); }
|
||||
} WHEN {
|
||||
@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Last Respects power is multiplied by the amount of fainted m
|
||||
PARAMETRIZE { faintCount = 2; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LEPPA_BERRY); Moves(MOVE_RECYCLE, MOVE_NONE, MOVE_NONE, MOVE_NONE); }
|
||||
OPPONENT(SPECIES_GOLEM); // Not Wobbuffet to omit type effectiveness
|
||||
OPPONENT(SPECIES_HITMONLEE); // Not Wobbuffet to omit type effectiveness
|
||||
OPPONENT(SPECIES_GEODUDE);
|
||||
} WHEN {
|
||||
for (j = 0; j < faintCount; j++)
|
||||
|
||||
@ -398,12 +398,15 @@ DOUBLE_BATTLE_TEST("Protect: Wide Guard protects self and ally from multi-target
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns")
|
||||
DOUBLE_BATTLE_TEST("Protect: Wide Guard can not fail on consecutive turns (Gen6+)")
|
||||
{
|
||||
u8 turns;
|
||||
u32 turns, config, passes;
|
||||
|
||||
PASSES_RANDOMLY(2, 2);
|
||||
PARAMETRIZE { config = GEN_5; passes = 0; }
|
||||
PARAMETRIZE { config = GEN_6; passes = 2; }
|
||||
PASSES_RANDOMLY(passes, 2);
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_WIDE_GUARD, config);
|
||||
ASSUME(GetMoveTarget(MOVE_HYPER_VOICE) == MOVE_TARGET_BOTH);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
@ -431,8 +434,8 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority mo
|
||||
u16 move = MOVE_NONE;
|
||||
struct BattlePokemon *targetOpponent = NULL;
|
||||
|
||||
PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; }
|
||||
PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; }
|
||||
PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentLeft; }
|
||||
PARAMETRIZE { move = MOVE_SCRATCH; targetOpponent = opponentRight; }
|
||||
PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentLeft; }
|
||||
PARAMETRIZE { move = MOVE_QUICK_ATTACK; targetOpponent = opponentRight; }
|
||||
|
||||
@ -461,12 +464,15 @@ DOUBLE_BATTLE_TEST("Protect: Quick Guard protects self and ally from priority mo
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns")
|
||||
DOUBLE_BATTLE_TEST("Protect: Quick Guard can not fail on consecutive turns (Gen6+)")
|
||||
{
|
||||
u8 turns;
|
||||
u32 turns, config, passes;
|
||||
|
||||
PASSES_RANDOMLY(2, 2);
|
||||
PARAMETRIZE { config = GEN_5; passes = 0; }
|
||||
PARAMETRIZE { config = GEN_6; passes = 2; }
|
||||
PASSES_RANDOMLY(passes, 2);
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_QUICK_GUARD, config);
|
||||
ASSUME(GetMovePriority(MOVE_QUICK_ATTACK) == 1);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
|
||||
@ -10,6 +10,7 @@ DOUBLE_BATTLE_TEST("Speed Down: Cotton Spore does not fail if it is blocked by o
|
||||
|
||||
GIVEN {
|
||||
ASSUME(GetMoveEffect(MOVE_COTTON_SPORE) == EFFECT_SPEED_DOWN_2);
|
||||
ASSUME(GetMoveTarget(MOVE_COTTON_SPORE) == MOVE_TARGET_BOTH);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_SHELLDER) { Ability(abilityOne); }
|
||||
|
||||
@ -68,6 +68,7 @@ SINGLE_BATTLE_TEST("Upper Hand succeeds if the target's move is boosted in prior
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0);
|
||||
ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5
|
||||
PLAYER(SPECIES_MIENSHAO) { Speed(10); }
|
||||
OPPONENT(SPECIES_COMFEY) { Speed(5); Ability(ABILITY_TRIAGE); }
|
||||
} WHEN {
|
||||
@ -85,6 +86,7 @@ SINGLE_BATTLE_TEST("Upper Hand fails if the target moves first")
|
||||
GIVEN {
|
||||
ASSUME(GetMoveCategory(MOVE_DRAINING_KISS) == DAMAGE_CATEGORY_SPECIAL);
|
||||
ASSUME(GetMovePriority(MOVE_DRAINING_KISS) == 0);
|
||||
ASSUME(IsHealingMove(MOVE_DRAINING_KISS)); // Doesn't have the Healing Move flag in Gen 5
|
||||
PLAYER(SPECIES_MIENSHAO) { Speed(5); }
|
||||
OPPONENT(SPECIES_COMFEY) { Speed(10); Ability(ABILITY_TRIAGE); }
|
||||
} WHEN {
|
||||
|
||||
@ -63,6 +63,7 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze poison/electric types respe
|
||||
|
||||
SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep Pokémon with abilities preventing respective statuses")
|
||||
{
|
||||
KNOWN_FAILING;
|
||||
u8 statusAnim;
|
||||
u16 species, ability;
|
||||
u32 rng;
|
||||
@ -75,6 +76,7 @@ SINGLE_BATTLE_TEST("Dire Claw cannot poison/paralyze/cause to fall asleep Pokém
|
||||
PARAMETRIZE { statusAnim = B_ANIM_STATUS_SLP; rng = MOVE_EFFECT_SLEEP; species = SPECIES_HYPNO; ability = ABILITY_INSOMNIA; }
|
||||
|
||||
GIVEN {
|
||||
WITH_CONFIG(GEN_CONFIG_PARALYZE_ELECTRIC, GEN_5); // To prevent Electric paralysis immunity from affecting the test
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(species) { Ability(ability); }
|
||||
} WHEN {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user