diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 89c1961022..7ef1ecbf97 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8031,11 +8031,12 @@ BattleScript_WeakArmorDefPrintString: printstring STRINGID_TARGETABILITYSTATLOWER waitmessage B_WAIT_TIME_LONG BattleScript_WeakArmorActivatesSpeed: -.if B_WEAK_ARMOR_SPEED >= GEN_7 + jumpifgenconfiglowerthan GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7, BattleScript_WeakArmorSetSpeedGen6 setstatchanger STAT_SPEED, 2, FALSE -.else + goto BattleScript_WeakArmorDoSpeed +BattleScript_WeakArmorSetSpeedGen6: setstatchanger STAT_SPEED, 1, FALSE -.endif +BattleScript_WeakArmorDoSpeed: statbuffchange BS_TARGET, STAT_CHANGE_ALLOW_PTR, BattleScript_WeakArmorActivatesEnd jumpifbyte CMP_LESS_THAN, cMULTISTRING_CHOOSER, B_MSG_STAT_WONT_INCREASE, BattleScript_WeakArmorSpeedPrintString jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_EMPTY, BattleScript_WeakArmorActivatesEnd diff --git a/include/constants/generational_changes.h b/include/constants/generational_changes.h index 0478240320..b365a6ea8f 100644 --- a/include/constants/generational_changes.h +++ b/include/constants/generational_changes.h @@ -35,6 +35,12 @@ enum GenConfigTag GEN_CONFIG_DISGUISE_HP_LOSS, GEN_CONFIG_AFTER_YOU_TURN_ORDER, GEN_CONFIG_HEALING_WISH_SWITCH, + GEN_CONFIG_MEGA_EVO_TURN_ORDER, + GEN_CONFIG_SHEER_COLD_IMMUNITY, + GEN_CONFIG_WEAK_ARMOR_SPEED, + GEN_CONFIG_PRANKSTER_DARK_TYPES, + GEN_CONFIG_DESTINY_BOND_FAIL, + GEN_CONFIG_POWDER_RAIN, GEN_CONFIG_COUNT }; diff --git a/include/generational_changes.h b/include/generational_changes.h index c3667d1af5..a45325caab 100644 --- a/include/generational_changes.h +++ b/include/generational_changes.h @@ -38,6 +38,12 @@ static const u8 sGenerationalChanges[GEN_CONFIG_COUNT] = [GEN_CONFIG_DISGUISE_HP_LOSS] = B_DISGUISE_HP_LOSS, [GEN_CONFIG_AFTER_YOU_TURN_ORDER] = B_AFTER_YOU_TURN_ORDER, [GEN_CONFIG_HEALING_WISH_SWITCH] = B_HEALING_WISH_SWITCH, + [GEN_CONFIG_MEGA_EVO_TURN_ORDER] = B_MEGA_EVO_TURN_ORDER, + [GEN_CONFIG_SHEER_COLD_IMMUNITY] = B_SHEER_COLD_IMMUNITY, + [GEN_CONFIG_WEAK_ARMOR_SPEED] = B_WEAK_ARMOR_SPEED, + [GEN_CONFIG_PRANKSTER_DARK_TYPES] = B_PRANKSTER_DARK_TYPES, + [GEN_CONFIG_DESTINY_BOND_FAIL] = B_DESTINY_BOND_FAIL, + [GEN_CONFIG_POWDER_RAIN] = B_POWDER_RAIN, }; #if TESTING diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f8bfd98f1e..d9e70c6b4b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1258,7 +1258,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // def partner ability checks // gen7+ dark type mons immune to priority->elevated moves from prankster - if (B_PRANKSTER_DARK_TYPES >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) + if (GetGenConfig(GEN_CONFIG_PRANKSTER_DARK_TYPES) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_DARK) && aiData->abilities[battlerAtk] == ABILITY_PRANKSTER && IsBattleMoveStatus(move) && !(moveTarget & (MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER))) RETURN_SCORE_MINUS(10); @@ -1722,7 +1722,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SHEER_COLD: - if (B_SHEER_COLD_IMMUNITY >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) + if (GetGenConfig(GEN_CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && IS_BATTLER_OF_TYPE(battlerDef, TYPE_ICE)) RETURN_SCORE_MINUS(20); // fallthrough case EFFECT_OHKO: @@ -3094,7 +3094,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) switch (effect) { case EFFECT_HELPING_HAND: - if (!hasPartner + if (!hasPartner || !HasDamagingMove(battlerAtkPartner) || (aiData->partnerMove != MOVE_NONE && IsBattleMoveStatus(aiData->partnerMove))) { @@ -3110,7 +3110,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (hasTwoOpponents) { // Might be about to die - if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) && CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) + if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtk) && CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtk), move, predictedMove, DONT_CONSIDER_PRIORITY) && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); @@ -3132,14 +3132,14 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) else if (IsBattlerAlive(BATTLE_OPPOSITE(battlerAtkPartner))) { // Might be about to die - if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) + if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtk) && AI_IsSlower(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), move, predictedMove, DONT_CONSIDER_PRIORITY)) ADJUST_SCORE(GOOD_EFFECT); if (ownHitsToKOFoe2 > partnerHitsToKOFoe2 && partnerHitsToKOFoe2 > 1) ADJUST_SCORE(GOOD_EFFECT); - } + } } break; case EFFECT_PERISH_SONG: @@ -5184,7 +5184,7 @@ case EFFECT_GUARD_SPLIT: ADJUST_SCORE(GOOD_EFFECT); // Set it for next pokemon in singles. else if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !hasPartner && (CountUsablePartyMons(battlerAtk) != 0)) - ADJUST_SCORE(DECENT_EFFECT); + ADJUST_SCORE(DECENT_EFFECT); // Don't unset it on last turn. else if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM && gFieldTimers.trickRoomTimer != (gBattleTurnCounter + 1) && ShouldClearFieldStatus(battlerAtk, STATUS_FIELD_TRICK_ROOM)) ADJUST_SCORE(GOOD_EFFECT); @@ -5315,7 +5315,7 @@ case EFFECT_GUARD_SPLIT: u32 partnerSpeed = aiData->speedStats[BATTLE_PARTNER(battlerAtk)]; u32 foe1Speed = aiData->speedStats[FOE(battlerAtk)]; u32 foe2Speed = aiData->speedStats[BATTLE_PARTNER(FOE(battlerAtk))]; - + if (speed <= foe1Speed && (speed * 2) > foe1Speed) tailwindScore += 1; if (speed <= foe2Speed && (speed * 2) > foe2Speed) diff --git a/src/battle_main.c b/src/battle_main.c index 0fd77bd7cf..8c1d79961e 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5184,7 +5184,7 @@ static bool32 TryDoGimmicksBeforeMoves(void) } } - if (B_MEGA_EVO_TURN_ORDER >= GEN_7) + if (GetGenConfig(GEN_CONFIG_MEGA_EVO_TURN_ORDER) >= GEN_7) TryChangeTurnOrder(); // This will just do nothing if no mon has mega evolved. return FALSE; } diff --git a/src/battle_util.c b/src/battle_util.c index 44220727ac..ef7fefec44 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2342,7 +2342,7 @@ static enum MoveCanceller CancellerWeatherPrimal(void) if (HasWeatherEffect() && GetMovePower(gCurrentMove) > 0) { u32 moveType = GetBattleMoveType(gCurrentMove); - if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (B_POWDER_RAIN >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) + if (moveType == TYPE_FIRE && (gBattleWeather & B_WEATHER_RAIN_PRIMAL) && (GetGenConfig(GEN_CONFIG_POWDER_RAIN) >= GEN_7 || !TryActivatePowderStatus(gCurrentMove))) { gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PRIMAL_WEATHER_FIZZLED_BY_RAIN; effect = MOVE_STEP_BREAK; @@ -9724,7 +9724,7 @@ static inline uq4_12_t CalcTypeEffectivenessMultiplierInternal(struct DamageCont RecordAbilityBattle(ctx->battlerDef, ABILITY_LEVITATE); } } - else if (B_SHEER_COLD_IMMUNITY >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) + else if (GetGenConfig(GEN_CONFIG_SHEER_COLD_IMMUNITY) >= GEN_7 && GetMoveEffect(ctx->move) == EFFECT_SHEER_COLD && IS_BATTLER_OF_TYPE(ctx->battlerDef, TYPE_ICE)) { modifier = UQ_4_12(0.0); } @@ -10812,7 +10812,7 @@ bool32 TryRoomService(u32 battler) bool32 BlocksPrankster(u16 move, u32 battlerPrankster, u32 battlerDef, bool32 checkTarget) { - if (B_PRANKSTER_DARK_TYPES < GEN_7) + if (GetGenConfig(GEN_CONFIG_PRANKSTER_DARK_TYPES) < GEN_7) return FALSE; if (!gProtectStructs[battlerPrankster].pranksterElevated) return FALSE; @@ -11338,7 +11338,7 @@ void ClearDamageCalcResults(void) bool32 DoesDestinyBondFail(u32 battler) { - if (B_DESTINY_BOND_FAIL >= GEN_7 + if (GetGenConfig(GEN_CONFIG_DESTINY_BOND_FAIL) >= GEN_7 && GetMoveEffect(gLastLandedMoves[battler]) == EFFECT_DESTINY_BOND && GetMoveEffect(gLastResultingMoves[battler]) == EFFECT_DESTINY_BOND) return TRUE; diff --git a/test/battle/ability/flash_fire.c b/test/battle/ability/flash_fire.c index c81967d1af..4cdcec9973 100644 --- a/test/battle/ability/flash_fire.c +++ b/test/battle/ability/flash_fire.c @@ -9,9 +9,9 @@ SINGLE_BATTLE_TEST("Flash Fire boosts fire type moves by 50% but no subsequent i PLAYER(SPECIES_HEATRAN) { Ability(ABILITY_FLASH_FIRE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { - TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } - TURN { MOVE(player, MOVE_EMBER); MOVE(opponent, MOVE_EMBER); } - TURN { MOVE(player, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); MOVE(opponent, MOVE_EMBER); } + TURN { MOVE(player, MOVE_EMBER, secondaryEffect: FALSE); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); HP_BAR(opponent, captureDamage: &damage[0]); diff --git a/test/battle/ability/prankster.c b/test/battle/ability/prankster.c index fd45b94b09..e927c2d94f 100644 --- a/test/battle/ability/prankster.c +++ b/test/battle/ability/prankster.c @@ -7,22 +7,31 @@ ASSUMPTIONS ASSUME(GetMoveCategory(MOVE_CONFUSE_RAY) == DAMAGE_CATEGORY_STATUS); } -SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon") +SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon (Gen7+)") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } } WHEN { TURN { MOVE(opponent, MOVE_CONFUSE_RAY); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); - MESSAGE("It doesn't affect Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + MESSAGE("It doesn't affect Umbreon…"); + } } } SINGLE_BATTLE_TEST("Prankster-affected moves don't affect Dark-type Pokémon after they switch-in") { GIVEN { + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } @@ -49,39 +58,62 @@ DOUBLE_BATTLE_TEST("Prankster-affected moves affect Ally Dark-type Pokémon") } } -SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark-type Pokémon") +SINGLE_BATTLE_TEST("Prankster-affected moves called via Assist don't affect Dark-type Pokémon (Gen 7+)") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_UMBREON); OPPONENT(SPECIES_VOLBEAT) { Ability(ABILITY_PRANKSTER); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_CONFUSE_RAY); }; } WHEN { TURN { MOVE(opponent, MOVE_ASSIST); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); - MESSAGE("It doesn't affect Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, opponent); + MESSAGE("It doesn't affect Umbreon…"); + } } } // Tested on Showdown, even though Bulbapedia says otherwise. DOUBLE_BATTLE_TEST("Prankster-affected moves called via Instruct do not affect Dark-type Pokémon") { + u32 gen; + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, gen); PLAYER(SPECIES_VOLBEAT) { Speed(20); Ability(ABILITY_PRANKSTER); } PLAYER(SPECIES_WOBBUFFET) { Speed(10);} - OPPONENT(SPECIES_UMBREON) { Speed(1); } + OPPONENT(SPECIES_UMBREON) { Speed(15); } OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + OPPONENT(SPECIES_UMBREON) { Speed(1); } } WHEN { TURN { MOVE(playerLeft, MOVE_CONFUSE_RAY, target: opponentLeft); + MOVE(opponentLeft, MOVE_U_TURN, target: playerRight, WITH_RNG(RNG_CONFUSION, FALSE)); + SEND_OUT(opponentLeft, 2); MOVE(playerRight, MOVE_INSTRUCT, target: playerLeft); } } SCENE { - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); - MESSAGE("It doesn't affect the opposing Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + MESSAGE("It doesn't affect the opposing Umbreon…"); + } MESSAGE("Wobbuffet used Instruct!"); MESSAGE("Volbeat used Confuse Ray!"); - NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); - MESSAGE("It doesn't affect the opposing Umbreon…"); + if (gen == GEN_6) { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + } else { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CONFUSE_RAY, playerLeft); + MESSAGE("It doesn't affect the opposing Umbreon…"); + } } } @@ -171,6 +203,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat c PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; } GIVEN { + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); PLAYER(SPECIES_SABLEYE) { Ability(sableyeAbility); } OPPONENT(SPECIES_MURKROW) { Ability(ABILITY_PRANKSTER); } } WHEN { diff --git a/test/battle/ability/weak_armor.c b/test/battle/ability/weak_armor.c index e133af6508..cae8383dde 100644 --- a/test/battle/ability/weak_armor.c +++ b/test/battle/ability/weak_armor.c @@ -7,17 +7,18 @@ ASSUMPTIONS ASSUME(!IsBattleMoveStatus(MOVE_GUST)); ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); - ASSUME(B_WEAK_ARMOR_SPEED >= GEN_7); } -SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hit by a physical attack") +SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 1 (Gen5-6) or 2 (Gen7+) when hit by a physical attack") { - u16 move; + u16 move, gen; - PARAMETRIZE { move = MOVE_SCRATCH; } - PARAMETRIZE { move = MOVE_GUST; } + PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_6; } + PARAMETRIZE { move = MOVE_SCRATCH; gen = GEN_7; } + PARAMETRIZE { move = MOVE_GUST; gen = GEN_7; } GIVEN { + WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -41,7 +42,10 @@ SINGLE_BATTLE_TEST("Weak Armor lowers Defense by 1 and boosts Speed by 2 when hi } THEN { if (move == MOVE_SCRATCH) { EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE - 1); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + (gen == GEN_7 ? 2 : 1)); + } else { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE); } } } @@ -79,7 +83,12 @@ SINGLE_BATTLE_TEST("Weak Armor does not trigger when brought in by Dragon Tail a SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower") { + u16 gen; + + PARAMETRIZE { gen = GEN_6; } + PARAMETRIZE { gen = GEN_7; } GIVEN { + WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, gen); PLAYER(SPECIES_SLUGMA) { Ability(ABILITY_WEAK_ARMOR); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -100,7 +109,7 @@ SINGLE_BATTLE_TEST("Weak Armor still boosts Speed if Defense can't go any lower" MESSAGE("Slugma's Weak Armor raised its Speed!"); } THEN { EXPECT_EQ(player->statStages[STAT_DEF], MIN_STAT_STAGE); - EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 2); + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + (gen == GEN_7 ? 2 : 1)); } } @@ -135,6 +144,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Defense can' { u32 j; GIVEN { + WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { @@ -173,6 +183,7 @@ SINGLE_BATTLE_TEST("Weak Armor doesn't interrupt multi hit moves if Speed can't { u32 j; GIVEN { + WITH_CONFIG(GEN_CONFIG_WEAK_ARMOR_SPEED, GEN_7); PLAYER(SPECIES_MAGCARGO) { Ability(ABILITY_WEAK_ARMOR); Defense(999); } OPPONENT(SPECIES_CLOYSTER) { Ability(ABILITY_SKILL_LINK); } } WHEN { diff --git a/test/battle/ai/ai_flag_risky.c b/test/battle/ai/ai_flag_risky.c index 5af51b9e8c..befefb814b 100644 --- a/test/battle/ai/ai_flag_risky.c +++ b/test/battle/ai/ai_flag_risky.c @@ -64,13 +64,14 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_RISKY: Mid-battle switches prioritize offensive o PARAMETRIZE { aiRiskyFlag = AI_FLAG_RISKY; } GIVEN { + ASSUME(P_UPDATED_STATS >= GEN_7); // Swellow's 50 Sp.Atk in Gen 6 instead of the current 75 causes the AI to switch to Electrode AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT | aiRiskyFlag); PLAYER(SPECIES_SWELLOW) { Level(30); Moves(MOVE_WING_ATTACK, MOVE_BOOMBURST); Speed(5); } OPPONENT(SPECIES_PONYTA) { Level(1); Moves(MOVE_NONE); Speed(4); } // Forces switchout OPPONENT(SPECIES_ARON) { Level(30); Moves(MOVE_HEADBUTT); Speed(4); SpDefense(41); } // Mid battle, AI sends out Aron OPPONENT(SPECIES_ELECTRODE) { Level(30); Moves(MOVE_CHARGE_BEAM); Speed(6); Ability(ABILITY_STATIC); } } WHEN { - TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, aiRiskyFlag? 2 : 1); } + TURN { MOVE(player, MOVE_WING_ATTACK); EXPECT_SWITCH(opponent, aiRiskyFlag? 2 : 1); } } } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index a0532a5df3..b1aad9afb2 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -1033,7 +1033,7 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will switch into mon with good type matchup AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI correctly handles abilities when scoring moves") { GIVEN { - ASSUME(B_PRANKSTER_DARK_TYPES >= GEN_7); + WITH_CONFIG(GEN_CONFIG_PRANKSTER_DARK_TYPES, GEN_7); ASSUME(GetSpeciesType(SPECIES_GRENINJA, 1) == TYPE_DARK); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES); PLAYER(SPECIES_GRENINJA) { Moves(MOVE_WATER_GUN); } diff --git a/test/battle/ai/can_use_all_moves.c b/test/battle/ai/can_use_all_moves.c index 3bf33a98c1..364ff88a49 100644 --- a/test/battle/ai/can_use_all_moves.c +++ b/test/battle/ai/can_use_all_moves.c @@ -62,7 +62,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") { u32 moveStart = 0; u32 moveCap = 100; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -92,7 +92,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 1-100") case EFFECT_DISABLE: // tests exist elsewhere - + // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -124,7 +124,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 101-200") { u32 moveStart = 100; u32 moveCap = 200; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -200,7 +200,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 201-300") { u32 moveStart = 200; u32 moveCap = 300; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -285,7 +285,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") { u32 moveStart = 300; u32 moveCap = 400; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -329,7 +329,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 301-400") // tests exist elsewhere case EFFECT_HEAL_BELL: case EFFECT_ATTACK_UP_USER_ALLY: - + // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -361,7 +361,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") { u32 moveStart = 400; u32 moveCap = 500; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -390,12 +390,13 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 401-500") //TODO: AI TESTS case EFFECT_RESTORE_HP: case EFFECT_CAPTIVATE: + case EFFECT_DARK_VOID: // Gen 4-6's case is not being handled // tests exist elsewhere case EFFECT_TRICK_ROOM: case EFFECT_GUARD_SPLIT: case EFFECT_POWER_SPLIT: - + // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -427,7 +428,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 501-600") { u32 moveStart = 515; u32 moveCap = 600; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -502,7 +503,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") { u32 moveStart = 600; u32 moveCap = 700; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -542,7 +543,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 601-700") case EFFECT_ELECTRIC_TERRAIN: case EFFECT_PSYCHIC_TERRAIN: case EFFECT_AURORA_VEIL: - + // Skipped on purpose. case EFFECT_PROTECT: case EFFECT_NON_VOLATILE_STATUS: @@ -574,7 +575,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 701-800") { u32 moveStart = 700; u32 moveCap = 800; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; @@ -643,7 +644,7 @@ AI_DOUBLE_BATTLE_TEST("AI can use all moves, 801-900") { u32 moveStart = 800; u32 moveCap = 900; - + if (moveCap > MOVES_COUNT) moveCap = MOVES_COUNT - 1; diff --git a/test/battle/form_change/mega_evolution.c b/test/battle/form_change/mega_evolution.c index eea438229a..8cce1a084d 100644 --- a/test/battle/form_change/mega_evolution.c +++ b/test/battle/form_change/mega_evolution.c @@ -71,10 +71,26 @@ SINGLE_BATTLE_TEST("Rayquaza can Mega Evolve knowing Dragon Ascent") } } -SINGLE_BATTLE_TEST("Mega Evolution affects turn order") +SINGLE_BATTLE_TEST("Mega Evolution doesn't affect turn order (Gen6)") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_6); + PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); Speed(105); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(106); } + } WHEN { + TURN { MOVE(player, MOVE_CELEBRATE, gimmick: GIMMICK_MEGA); } + } SCENE { + MESSAGE("The opposing Wobbuffet used Celebrate!"); + MESSAGE("Gardevoir used Celebrate!"); + } THEN { + ASSUME(player->speed == 205); + } +} + +SINGLE_BATTLE_TEST("Mega Evolution affects turn order (Gen7+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); PLAYER(SPECIES_GARDEVOIR) { Item(ITEM_GARDEVOIRITE); Speed(105); } OPPONENT(SPECIES_WOBBUFFET) { Speed(106); } } WHEN { @@ -90,7 +106,7 @@ SINGLE_BATTLE_TEST("Mega Evolution affects turn order") SINGLE_BATTLE_TEST("Abilities replaced by Mega Evolution do not affect turn order") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); ASSUME(GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 0) != ABILITY_STALL && GetSpeciesAbility(SPECIES_SABLEYE_MEGA, 1) != ABILITY_STALL); PLAYER(SPECIES_SABLEYE) { Item(ITEM_SABLENITE); Ability(ABILITY_STALL); Speed(105); } diff --git a/test/battle/form_change/ultra_burst.c b/test/battle/form_change/ultra_burst.c index 640db3f881..9d7ec1c396 100644 --- a/test/battle/form_change/ultra_burst.c +++ b/test/battle/form_change/ultra_burst.c @@ -58,7 +58,7 @@ DOUBLE_BATTLE_TEST("Ultra Burst's order is determined by Speed - player faster") SINGLE_BATTLE_TEST("Ultra Burst affects turn order") { GIVEN { - ASSUME(B_MEGA_EVO_TURN_ORDER >= GEN_7); + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); PLAYER(SPECIES_NECROZMA_DUSK_MANE) { Item(ITEM_ULTRANECROZIUM_Z); Speed(105); } OPPONENT(SPECIES_WOBBUFFET) { Speed(106); } } WHEN { diff --git a/test/battle/gimmick/zmove.c b/test/battle/gimmick/zmove.c index 1cea196ae7..1744fd151b 100644 --- a/test/battle/gimmick/zmove.c +++ b/test/battle/gimmick/zmove.c @@ -6,9 +6,10 @@ SINGLE_BATTLE_TEST("(Z-MOVE) Z-Moves do not retain priority") { GIVEN { + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks ASSUME(GetMoveType(MOVE_QUICK_ATTACK) == TYPE_NORMAL); - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); } - OPPONENT(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_NORMALIUM_Z); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(2); } } WHEN { TURN { MOVE(opponent, MOVE_SCRATCH); MOVE(player, MOVE_QUICK_ATTACK, gimmick: GIMMICK_Z_MOVE); } diff --git a/test/battle/move_effect/copycat.c b/test/battle/move_effect/copycat.c index cdc164cd0f..da9e085ede 100644 --- a/test/battle/move_effect/copycat.c +++ b/test/battle/move_effect/copycat.c @@ -24,6 +24,7 @@ TO_DO_BATTLE_TEST("Copycat copies moves called by other calling moves instead of DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their base moves copied by Copycat") { GIVEN { + WITH_CONFIG(GEN_CONFIG_MEGA_EVO_TURN_ORDER, GEN_7); // TODO: Decouple this config from other gimmicks PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/destiny_bond.c b/test/battle/move_effect/destiny_bond.c index 0713a4858a..ddebc6bb1f 100644 --- a/test/battle/move_effect/destiny_bond.c +++ b/test/battle/move_effect/destiny_bond.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS +ASSUMPTIONS { ASSUME(GetMoveEffect(MOVE_DESTINY_BOND) == EFFECT_DESTINY_BOND); } @@ -21,10 +21,28 @@ SINGLE_BATTLE_TEST("Destiny Bond faints the opposing mon if it fainted from the } } -SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond doesn't fail if used sequentially (Gen2-6)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_6); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_ZIGZAGOON); + } WHEN { + TURN { MOVE(player, MOVE_DESTINY_BOND); } + TURN { MOVE(player, MOVE_DESTINY_BOND); SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + MESSAGE("2 sent out Zigzagoon!"); + NOT { MESSAGE("But it failed!"); } + ANIMATION(ANIM_TYPE_MOVE, MOVE_DESTINY_BOND, player); + } +} + +SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially (Gen7+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -39,10 +57,10 @@ SINGLE_BATTLE_TEST("Destiny Bond fails if used sequentially in Gen 7+") } } -SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by other moves (Gen7+)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -58,10 +76,10 @@ SINGLE_BATTLE_TEST("Destiny Bond does not fail if used repeatedly separated by o } } -SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing in Gen 7+") +SINGLE_BATTLE_TEST("Destiny Bond does not fail if used after failing (Gen7+)") { GIVEN { - ASSUME(B_DESTINY_BOND_FAIL >= GEN_7); + WITH_CONFIG(GEN_CONFIG_DESTINY_BOND_FAIL, GEN_7); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -108,4 +126,3 @@ TO_DO_BATTLE_TEST("Destiny Bond's effect can trigger on the next turn if the use TO_DO_BATTLE_TEST("Destiny Bond can be used multiple times in a row (Gen 2-6)"); TO_DO_BATTLE_TEST("Destiny Bond always fails if it was successfully used the previous turn (Gen 7+)"); TO_DO_BATTLE_TEST("Destiny Bond cannot be used in Raids"); - diff --git a/test/battle/move_effect/embargo.c b/test/battle/move_effect/embargo.c index 4b06b92fc1..41c456d9ac 100644 --- a/test/battle/move_effect/embargo.c +++ b/test/battle/move_effect/embargo.c @@ -77,7 +77,7 @@ WILD_BATTLE_TEST("Embargo doesn't block held item effects that affect effort val PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POWER_WEIGHT); } OPPONENT(SPECIES_CATERPIE) { HP(1); } ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffect == HOLD_EFFECT_POWER_ITEM); - ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffectParam == 8); + ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].holdEffectParam != 0); ASSUME(gItemsInfo[ITEM_POWER_WEIGHT].secondaryId == STAT_HP); ASSUME(gSpeciesInfo[SPECIES_CATERPIE].evYield_HP == 1); } WHEN { diff --git a/test/battle/move_effect/focus_punch.c b/test/battle/move_effect/focus_punch.c index e186c094a8..3f8f96d4c4 100644 --- a/test/battle/move_effect/focus_punch.c +++ b/test/battle/move_effect/focus_punch.c @@ -119,7 +119,7 @@ AI_SINGLE_BATTLE_TEST("AI won't use status moves if the player's best attacking ASSUME(GetMoveEffect(MOVE_FOCUS_PUNCH) == EFFECT_FOCUS_PUNCH); ASSUME(GetMoveCategory(MOVE_SWORDS_DANCE) == DAMAGE_CATEGORY_STATUS); 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_TACKLE); } + PLAYER(SPECIES_SNORLAX) { Moves(MOVE_FOCUS_PUNCH, MOVE_POUND); } OPPONENT(SPECIES_CLEFABLE) { Moves(MOVE_PLAY_ROUGH, MOVE_SWORDS_DANCE); } } WHEN { TURN { MOVE(player, MOVE_FOCUS_PUNCH); EXPECT_MOVE(opponent, MOVE_PLAY_ROUGH); } diff --git a/test/battle/move_effect/powder.c b/test/battle/move_effect/powder.c index 0cbe273ef2..c4e053db87 100644 --- a/test/battle/move_effect/powder.c +++ b/test/battle/move_effect/powder.c @@ -80,10 +80,27 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target if it has Magic Guard") } } -SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") +SINGLE_BATTLE_TEST("Powder damages the target under heavy rain (Gen 6)") { GIVEN { - ASSUME(B_POWDER_RAIN >= GEN_7); + WITH_CONFIG(GEN_CONFIG_POWDER_RAIN, GEN_6); + PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } + OPPONENT(SPECIES_VIVILLON); + } WHEN { + TURN { MOVE(opponent, MOVE_POWDER); MOVE(player, MOVE_EMBER); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); + HP_BAR(player); + } THEN { + EXPECT_LT(player->hp, player->maxHP); + } +} + +SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain (Gen 7+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_POWDER_RAIN, GEN_7); PLAYER(SPECIES_KYOGRE_PRIMAL) { Ability(ABILITY_PRIMORDIAL_SEA); } OPPONENT(SPECIES_VIVILLON); } WHEN { @@ -92,7 +109,7 @@ SINGLE_BATTLE_TEST("Powder doesn't damage target under heavy rain") ANIMATION(ANIM_TYPE_MOVE, MOVE_POWDER, opponent); NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_EMBER, player); - HP_BAR(opponent); + HP_BAR(player); } } THEN { EXPECT_EQ(player->maxHP, player->hp); diff --git a/test/battle/move_effect/role_play.c b/test/battle/move_effect/role_play.c index d2d937f7d1..1a05f02d4a 100644 --- a/test/battle/move_effect/role_play.c +++ b/test/battle/move_effect/role_play.c @@ -19,7 +19,7 @@ SINGLE_BATTLE_TEST("Role Play copies target's ability") } THEN { EXPECT_EQ(player->ability, ABILITY_BLAZE); EXPECT_EQ(opponent->ability, ABILITY_BLAZE); - } + } } DOUBLE_BATTLE_TEST("Role Play copies target's current ability even if it changed during that turn") @@ -93,7 +93,8 @@ SINGLE_BATTLE_TEST("Role Play fails if user's ability can't be suppressed") u32 species, ability; PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; } - PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } + if (B_UPDATED_ABILITY_DATA >= GEN_7) + PARAMETRIZE { species = SPECIES_DARMANITAN; ability = ABILITY_ZEN_MODE; } PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; } PARAMETRIZE { species = SPECIES_MINIOR; ability = ABILITY_SHIELDS_DOWN; } PARAMETRIZE { species = SPECIES_WISHIWASHI; ability = ABILITY_SCHOOLING; } diff --git a/test/battle/move_effect/sheer_cold.c b/test/battle/move_effect/sheer_cold.c index 2cb469e92d..77ecb55bf7 100644 --- a/test/battle/move_effect/sheer_cold.c +++ b/test/battle/move_effect/sheer_cold.c @@ -6,10 +6,26 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_SHEER_COLD) == EFFECT_SHEER_COLD); } -SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon") +SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen3-6)") { GIVEN { - ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); + WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_6); + ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_GLALIE); + } WHEN { + TURN { MOVE(player, MOVE_SHEER_COLD); } + } SCENE { + NOT MESSAGE("It doesn't affect the opposing Glalie…"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SHEER_COLD, player); + HP_BAR(opponent, hp: 0); + } +} + +SINGLE_BATTLE_TEST("Sheer Cold doesn't affect Ice-type Pokémon (Gen7+)") +{ + GIVEN { + WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index b42c89196c..663a720d3d 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -169,6 +169,7 @@ static const struct Trainer sTestTrainer2 = TEST("Trainer Class Balls apply to the entire party") { + ASSUME(B_TRAINER_CLASS_POKE_BALLS >= GEN_8); u32 j; struct Pokemon *testParty = Alloc(6 * sizeof(struct Pokemon)); CreateNPCTrainerPartyFromTrainer(testParty, &sTestTrainer2, TRUE, BATTLE_TYPE_TRAINER); diff --git a/test/battle/trainer_slides.c b/test/battle/trainer_slides.c index 273885fe75..012ae6e7e9 100644 --- a/test/battle/trainer_slides.c +++ b/test/battle/trainer_slides.c @@ -109,7 +109,7 @@ SINGLE_BATTLE_TEST("Trainer Slide: Enemy Mon Unaffected") { gBattleTestRunnerState->data.recordedBattle.opponentA = TRAINER_SLIDE_ENEMY_MON_UNAFFECTED; GIVEN { - ASSUME(B_SHEER_COLD_IMMUNITY >= GEN_7); + WITH_CONFIG(GEN_CONFIG_SHEER_COLD_IMMUNITY, GEN_7); ASSUME(GetSpeciesType(SPECIES_GLALIE, 0) == TYPE_ICE); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_GLALIE); diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index a116dd0b52..c71e74bb48 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -1564,9 +1564,14 @@ void OpenPokemon(u32 sourceLine, u32 side, u32 species) (*partySize)++; CreateMon(DATA.currentMon, species, 100, 0, TRUE, 0, OT_ID_PRESET, 0); - data = MOVE_NONE; + // Reset move IDs, but force PP to be non-zero. This is a safeguard against test species that only learn 1 move having test moves with 0 PP for (i = 0; i < MAX_MON_MOVES; i++) + { + data = MOVE_NONE; SetMonData(DATA.currentMon, MON_DATA_MOVE1 + i, &data); + data = 0x7F; // Max PP possible + SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &data); + } data = 0; if (B_FRIENDSHIP_BOOST) { @@ -2112,6 +2117,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * SetMonData(DATA.currentMon, MON_DATA_PP1 + i, &pp); *moveSlot = i; *moveId = ctx->move; + INVALID_IF(GetMovePP(ctx->move) == 0, "%S has 0 PP!", GetMoveName(ctx->move)); break; } } @@ -2216,7 +2222,7 @@ void Move(u32 sourceLine, struct BattlePokemon *battler, struct MoveContext ctx) DATA.battleRecordTurns[DATA.turns][battlerId].secondaryEffect = 1 + ctx.secondaryEffect; if (ctx.explicitRNG) DATA.battleRecordTurns[DATA.turns][battlerId].rng = ctx.rng; - + u32 shellSideArmCount = 0; for (u32 i = 0; i < STATE->battlersCount; i++) {