Fix most failed and assume fail tests with GEN_LATEST = GEN_6 (#7696)

This commit is contained in:
Eduardo Quezada 2025-09-14 15:21:38 -03:00 committed by GitHub
parent 70dec039cb
commit deaf77f619
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 213 additions and 78 deletions

View File

@ -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

View File

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

View File

@ -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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 {

View File

@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

@ -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 {

View File

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

View File

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

View File

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

View File

@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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++)
{