diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 3f4e72a4ad..e37074b339 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -1541,10 +1541,10 @@ BattleScript_EffectInstruct:: tryinstruct BattleScript_ButItFailed attackanimation waitanimation - copybyte gBattlerAttacker, gBattlerTarget - copybyte gBattlerTarget, gEffectBattler printstring STRINGID_USEDINSTRUCTEDMOVE waitmessage B_WAIT_TIME_LONG + copybyte gBattlerAttacker, gBattlerTarget + copybyte gBattlerTarget, gEffectBattler jumptocalledmove TRUE BattleScript_EffectAutotomize:: diff --git a/src/battle_message.c b/src/battle_message.c index 5260de5cf4..60b4b6bc90 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -666,7 +666,7 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_SWEETVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}\n因甜幕而不会睡着!"), [STRINGID_AROMAVEILPROTECTED] = COMPOUND_STRING("{B_DEF_NAME_WITH_PREFIX}\n正受到芳香幕的保护!"), [STRINGID_CELEBRATEMESSAGE] = COMPOUND_STRING("恭喜恭喜!\n{B_PLAYER_NAME}!"), - [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("根据{B_SCR_NAME_WITH_PREFIX2}的指示,\n{B_ATK_NAME_WITH_PREFIX}使出了招式!"), + [STRINGID_USEDINSTRUCTEDMOVE] = COMPOUND_STRING("根据{B_ATK_NAME_WITH_PREFIX2}的指示,\n{B_DEF_NAME_WITH_PREFIX}使出了招式!"), [STRINGID_THROATCHOPENDS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}\n变得可以使出声音的招式了!"), [STRINGID_PKMNCANTUSEMOVETHROATCHOP] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX2}\n因深渊突刺的效果无法使出招式!\p"), [STRINGID_LASERFOCUS] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX}\n磨砺了精神!"), diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e95e4695c9..be1189cfa9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6093,7 +6093,7 @@ static void Cmd_moveend(void) break; case PROTECT_BANEFUL_BUNKER: if (!IsProtectivePadsProtected(gBattlerAttacker, GetBattlerHoldEffect(gBattlerAttacker)) - && CanBePoisoned(gBattlerTarget, gBattlerAttacker, gLastUsedAbility, GetBattlerAbility(gBattlerAttacker))) + && CanBePoisoned(gBattlerTarget, gBattlerAttacker, GetBattlerAbility(gBattlerTarget), GetBattlerAbility(gBattlerAttacker))) { gProtectStructs[gBattlerAttacker].touchedProtectLike = FALSE; gBattleScripting.moveEffect = MOVE_EFFECT_POISON; diff --git a/src/battle_util.c b/src/battle_util.c index 01316491b1..46347b7028 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4809,7 +4809,8 @@ u32 AbilityBattleEffects(enum AbilityEffect caseID, u32 battler, enum Ability ab } break; case ABILITY_BALL_FETCH: - if (gBattleMons[battler].item == ITEM_NONE + if (!(gBattleTypeFlags & BATTLE_TYPE_RAID) + && gBattleMons[battler].item == ITEM_NONE && gBattleResults.catchAttempts[ItemIdToBallId(gLastUsedBall)] >= 1 && !gHasFetchedBall) { @@ -5875,6 +5876,7 @@ bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum HoldEffe u32 GetHighestStatId(u32 battler) { u32 highestId = STAT_ATK; + bool32 wonderRoom = (gFieldStatuses & STATUS_FIELD_WONDER_ROOM) != 0; u32 highestStat = gBattleMons[battler].attack; for (u32 stat = STAT_DEF; stat < NUM_STATS; stat++) @@ -5882,10 +5884,28 @@ u32 GetHighestStatId(u32 battler) if (stat == STAT_SPEED) continue; - u16 *statVal = &gBattleMons[battler].attack + (stat - 1); - if (*statVal > highestStat) + u32 statVal; + switch (stat) { - highestStat = *statVal; + case STAT_ATK: + statVal = gBattleMons[battler].attack; + break; + case STAT_DEF: + statVal = wonderRoom ? gBattleMons[battler].spDefense : gBattleMons[battler].defense; + break; + case STAT_SPATK: + statVal = gBattleMons[battler].spAttack; + break; + case STAT_SPDEF: + statVal = wonderRoom ? gBattleMons[battler].defense : gBattleMons[battler].spDefense; + break; + default: + continue; + } + + if (statVal > highestStat) + { + highestStat = statVal; highestId = stat; } } diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index d6691c2f8f..ce7df9135b 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -17,23 +17,26 @@ SINGLE_BATTLE_TEST("Beast Boost boosts the most proficient stat when knocking ou TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_BEAST_BOOST); - switch(i) { - case 0: - MESSAGE("Nihilego's Attack rose!"); - break; - case 1: - MESSAGE("Nihilego's Defense rose!"); - break; - case 2: - MESSAGE("Nihilego's Sp. Atk rose!"); - break; - case 3: - MESSAGE("Nihilego's Sp. Def rose!"); - break; - case 4: - MESSAGE("Nihilego's Speed rose!"); - break; + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + u32 expectedStat = STAT_ATK; + + switch (i) { + case 1: + expectedStat = STAT_DEF; + break; + case 2: + expectedStat = STAT_SPATK; + break; + case 3: + expectedStat = STAT_SPDEF; + break; + case 4: + expectedStat = STAT_SPEED; + break; } + + EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1); } } @@ -73,28 +76,180 @@ SINGLE_BATTLE_TEST("Beast Boost prioritizes stats in the case of a tie in the fo TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } } SCENE { ABILITY_POPUP(player, ABILITY_BEAST_BOOST); - switch(i) { - case 0: - MESSAGE("Nihilego's Attack rose!"); - break; - case 1: - MESSAGE("Nihilego's Defense rose!"); - break; - case 2: - MESSAGE("Nihilego's Sp. Atk rose!"); - break; - case 3: - MESSAGE("Nihilego's Sp. Def rose!"); - break; + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + u32 expectedStat = STAT_ATK; + + switch (i) { + case 1: + expectedStat = STAT_DEF; + break; + case 2: + expectedStat = STAT_SPATK; + break; + case 3: + expectedStat = STAT_SPDEF; + break; } + + EXPECT_EQ(player->statStages[expectedStat], DEFAULT_STAT_STAGE + 1); } } -TO_DO_BATTLE_TEST("Beast Boost considers Power Split"); -TO_DO_BATTLE_TEST("Beast Boost considers Guard Split"); -TO_DO_BATTLE_TEST("Beast Boost considers Power Trick"); -TO_DO_BATTLE_TEST("Beast Boost considers Wonder Room"); -TO_DO_BATTLE_TEST("Beast Boost considers Speed Swap"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider stat stages"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider held items"); -TO_DO_BATTLE_TEST("Beast Boost doesn't consider status condition reductions"); +SINGLE_BATTLE_TEST("Beast Boost considers Power Split") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_SPLIT) == EFFECT_POWER_SPLIT); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(200); Defense(30); SpAttack(50); SpDefense(30); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Attack(10); SpAttack(250); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POWER_SPLIT); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_SPLIT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Guard Split") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_GUARD_SPLIT) == EFFECT_GUARD_SPLIT); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(80); Defense(20); SpAttack(70); SpDefense(10); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Defense(200); SpDefense(30); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_GUARD_SPLIT); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_GUARD_SPLIT, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Power Trick") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_POWER_TRICK) == EFFECT_POWER_TRICK); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(40); Defense(200); SpAttack(60); SpDefense(50); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POWER_TRICK); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POWER_TRICK, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Wonder Room") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_WONDER_ROOM) == EFFECT_WONDER_ROOM); + ASSUME(GetMovePower(MOVE_SCRATCH) > 0); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(50); SpAttack(70); SpDefense(200); Speed(120); Moves(MOVE_SPLASH, MOVE_EXTREME_SPEED); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); Moves(MOVE_WONDER_ROOM, MOVE_SPLASH); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(30); } + } WHEN { + TURN { MOVE(opponent, MOVE_WONDER_ROOM); MOVE(player, MOVE_SPLASH); } + TURN { MOVE(player, MOVE_EXTREME_SPEED); MOVE(opponent, MOVE_SPLASH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WONDER_ROOM, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_EXTREME_SPEED, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_DEF], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost considers Speed Swap") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SPEED_SWAP) == EFFECT_SPEED_SWAP); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(60); Defense(60); SpAttack(70); SpDefense(60); Speed(30); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(200); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(50); } + } WHEN { + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SPEED_SWAP); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPEED_SWAP, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPEED], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider stat stages") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SWORDS_DANCE) == EFFECT_ATTACK_UP_2); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(100); Defense(60); SpAttack(150); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SWORDS_DANCE); } + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SWORDS_DANCE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider held items") +{ + GIVEN { + ASSUME(gItemsInfo[ITEM_CHOICE_BAND].holdEffect == HOLD_EFFECT_CHOICE_BAND); + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Item(ITEM_CHOICE_BAND); Attack(120); Defense(60); SpAttack(150); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_SPATK], DEFAULT_STAT_STAGE + 1); + } +} + +SINGLE_BATTLE_TEST("Beast Boost doesn't consider status condition reductions") +{ + GIVEN { + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Status1(STATUS1_BURN); Attack(150); Defense(60); SpAttack(100); SpDefense(60); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, player); + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, player); + } THEN { + EXPECT_EQ(player->statStages[STAT_ATK], DEFAULT_STAT_STAGE + 1); + } +} diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index ca6b602002..f46ad72a72 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -239,9 +239,115 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the Pokémon } } -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb") -TO_DO_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb") +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Baneful Bunker") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_BANEFUL_BUNKER) == EFFECT_PROTECT); + ASSUME(MoveMakesContact(MOVE_SCRATCH)); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_BANEFUL_BUNKER); MOVE(opponent, MOVE_SCRATCH); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_BANEFUL_BUNKER, player); + MESSAGE("Salandit protected itself!"); + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, opponent); + MESSAGE("Salandit protected itself!"); + STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Psycho Shift while poisoned") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Status1(STATUS1_POISON); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_PSYCHO_SHIFT); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_PSYCHO_SHIFT, player); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + STATUS_ICON(player, none: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Toxic Orb") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_TOXIC_ORB); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, badPoison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion can poison Poison/Steel types if the Pokémon uses Fling while holding a Poison Barb") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); + ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER); + ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(ITEM_POISON_BARB); } + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_FLING); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_FLING, player); + HP_BAR(opponent); + ANIMATION(ANIM_TYPE_STATUS, B_ANIM_STATUS_PSN, opponent); + STATUS_ICON(opponent, poison: TRUE); + } +} + +SINGLE_BATTLE_TEST("Corrosion does not affect Poison Spikes") +{ + u16 species; + + PARAMETRIZE { species = SPECIES_ODDISH; } + PARAMETRIZE { species = SPECIES_BELDUM; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); + PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(species); + } WHEN { + TURN { MOVE(player, MOVE_TOXIC_SPIKES); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TOXIC_SPIKES, player); + } THEN { + EXPECT_EQ(opponent->status1, STATUS1_NONE); + } +} + TO_DO_BATTLE_TEST("Dynamax: Corrosion can poison Poison/Steel types if the Pokémon uses G-Max Malodor") -TO_DO_BATTLE_TEST("Corrosion does not affect Poison Spikes") diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index be6e557990..04f5558155 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -322,3 +322,28 @@ DOUBLE_BATTLE_TEST("Instructed move will be redirected by Rage Powder after inst HP_BAR(opponentLeft); } } + +DOUBLE_BATTLE_TEST("Instruct message references the correct battlers") +{ + GIVEN { + PLAYER(SPECIES_TREECKO); + PLAYER(SPECIES_SCEPTILE); + OPPONENT(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { + MOVE(playerLeft, MOVE_CELEBRATE); + MOVE(playerRight, MOVE_SCRATCH, target: opponentLeft); + MOVE(opponentLeft, MOVE_DRAGON_DARTS, target:playerLeft); + MOVE(opponentRight, MOVE_INSTRUCT, target: playerRight); + } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + MESSAGE("The opposing Wynaut used Instruct!"); + NONE_OF { + MESSAGE("Sceptile followed the opposing Wobbuffet's instructions!"); + } + MESSAGE("Sceptile followed the opposing Wynaut's instructions!"); + ANIMATION(ANIM_TYPE_MOVE, MOVE_SCRATCH, playerRight); + } +}