From 99a3d01877aedb96a25b79dc8707e096872ffa09 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:57:38 +0100 Subject: [PATCH] Fixes dynamax reversion when ejected out + anim fix (#6416) Co-authored-by: hedara90 <90hedara@gmail.com> --- asm/macros/battle_script.inc | 7 +- data/battle_scripts_1.s | 10 ++- include/battle_scripts.h | 1 + src/battle_dynamax.c | 17 ++++ src/battle_main.c | 3 - src/battle_script_commands.c | 23 +++-- src/battle_util.c | 2 - test/battle/gimmick/dynamax.c | 161 +++++++++++++++++++--------------- 8 files changed, 137 insertions(+), 87 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index e50cbcbe43..8c1c9fc929 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1614,6 +1614,11 @@ .4byte \ptr .endm + .macro undodynamax battler:req + callnative BS_UndoDynamax + .byte \battler + .endm + .macro trytrainerslidezmovemsg callnative BS_TryTrainerSlideZMoveMsg .endm @@ -2376,7 +2381,7 @@ callnative BS_SwapStats .byte \stat .endm - + .macro restoresavedmove callnative BS_RestoreSavedMove .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 142ea013f4..02fcb66f1f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5728,7 +5728,7 @@ BattleScript_ActionSwitch:: BattleScript_DoSwitchOut:: switchoutabilities BS_ATTACKER - updatedynamax + undodynamax BS_ATTACKER waitstate returnatktoball waitstate @@ -9527,6 +9527,7 @@ BattleScript_EjectButtonActivates:: printstring STRINGID_EJECTBUTTONACTIVATE waitmessage B_WAIT_TIME_LONG removeitem BS_SCRIPTING + undodynamax BS_SCRIPTING makeinvisible BS_SCRIPTING openpartyscreen BS_SCRIPTING, BattleScript_EjectButtonEnd copybyte sSAVED_BATTLER, sBATTLER @@ -9989,6 +9990,13 @@ BattleScript_DynamaxEnds:: waitanimation end2 +BattleScript_DynamaxEnds_Ret:: + flushtextbox + updatedynamax + playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE + waitanimation + return + BattleScript_MoveBlockedByDynamax:: accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE attackstring diff --git a/include/battle_scripts.h b/include/battle_scripts.h index a3ff45a19c..4343d7eeea 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -558,6 +558,7 @@ extern const u8 BattleScript_RemoveGenericType[]; // dynamax and max raids extern const u8 BattleScript_DynamaxBegins[]; extern const u8 BattleScript_DynamaxEnds[]; +extern const u8 BattleScript_DynamaxEnds_Ret[]; extern const u8 BattleScript_MoveBlockedByDynamax[]; // Battle move scripts diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 3e8d0e9db7..fecadd887d 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -491,3 +491,20 @@ void BS_JumpIfDynamaxed(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_UndoDynamax(void) +{ + NATIVE_ARGS(u8 battler); + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) + { + BattleScriptPushCursor(); + UndoDynamax(battler); + gBattleScripting.battler = battler; + gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + return; + } + + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_main.c b/src/battle_main.c index 3ccbcd6873..6115020037 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3391,9 +3391,6 @@ const u8* FaintClearSetData(u32 battler) } } - // Clear Dynamax data - UndoDynamax(battler); - return result; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 520673805e..c22aca8187 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -4784,13 +4784,23 @@ static void Cmd_dofaintanimation(void) { CMD_ARGS(u8 battler); - if (gBattleControllerExecFlags == 0) + if (gBattleControllerExecFlags != 0) + return; + + u32 battler = GetBattlerForBattleScript(cmd->battler); + + if (GetActiveGimmick(battler) == GIMMICK_DYNAMAX) { - u32 battler = GetBattlerForBattleScript(cmd->battler); - BtlController_EmitFaintAnimation(battler, BUFFER_A); - MarkBattlerForControllerExec(battler); - gBattlescriptCurrInstr = cmd->nextInstr; + BattleScriptPushCursor(); + UndoDynamax(battler); + gBattleScripting.battler = battler; + gBattlescriptCurrInstr = BattleScript_DynamaxEnds_Ret; + return; } + + BtlController_EmitFaintAnimation(battler, BUFFER_A); + MarkBattlerForControllerExec(battler); + gBattlescriptCurrInstr = cmd->nextInstr; } static void Cmd_cleareffectsonfaint(void) @@ -6363,7 +6373,7 @@ static void Cmd_moveend(void) break; } else if (gMovesInfo[gCurrentMove].effect == EFFECT_RECOIL_IF_MISS - && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) + && (!IsBattlerTurnDamaged(gBattlerTarget) || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !gBattleStruct->noTargetPresent && IsBattlerAlive(gBattlerAttacker)) { @@ -18651,4 +18661,3 @@ void BS_RestoreSavedMove(void) gBattleStruct->savedMove = MOVE_NONE; gBattlescriptCurrInstr = cmd->nextInstr; } - diff --git a/src/battle_util.c b/src/battle_util.c index da7cf6b790..38223e058f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -494,8 +494,6 @@ void HandleAction_Switch(void) if (gBattleResults.playerSwitchesCounter < 255) gBattleResults.playerSwitchesCounter++; - if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) - UndoDynamax(gBattlerAttacker); // this is better performed here instead of SwitchInClearSetData TryBattleFormChange(gBattlerAttacker, FORM_CHANGE_BATTLE_SWITCH); } diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index 809e0f65d3..791973f893 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -2,7 +2,7 @@ #include "test/battle.h" // ============= DYNAMAX AND MAX MOVE INTERACTIONS =================== -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax increases HP and max HP by 1.5x", u16 hp) +SINGLE_BATTLE_TEST("Dynamax: Dynamax increases HP and max HP by 1.5x", u16 hp) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax increases HP and max HP by 1.5x", u16 hp) } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax Level increases HP and max HP multipliers by 0.05 for each level", u16 hp) +SINGLE_BATTLE_TEST("Dynamax: Dynamax Level increases HP and max HP multipliers by 0.05 for each level", u16 hp) { u32 dynamax, level; PARAMETRIZE { dynamax = GIMMICK_NONE; level = 0; } @@ -68,7 +68,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax Level increases HP and max HP multipliers } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns", u16 hp) +SINGLE_BATTLE_TEST("Dynamax: Dynamax expires after three turns", u16 hp) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -98,7 +98,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns", u16 hp) } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns and correctly converts HP according to Dynamax Level") +SINGLE_BATTLE_TEST("Dynamax: Dynamax expires after three turns and correctly converts HP according to Dynamax Level") { u32 dynamaxLevel, dynamax; u16 capturedHP, finalHP; @@ -141,7 +141,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamax expires after three turns and correctly co } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot be flinched") { GIVEN { ASSUME(GetMoveEffect(MOVE_FAKE_OUT) == EFFECT_FIRST_TURN_ONLY); @@ -156,7 +156,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be flinched") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based moves") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot be hit by weight-based moves") { GIVEN { ASSUME(GetMoveEffect(MOVE_HEAVY_SLAM) == EFFECT_HEAT_CRASH); @@ -172,7 +172,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by weight-based mo } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by OHKO moves") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot be hit by OHKO moves") { GIVEN { ASSUME(GetMoveEffect(MOVE_FISSURE) == EFFECT_OHKO); @@ -188,7 +188,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot be hit by OHKO moves") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are affected by Grudge") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are affected by Grudge") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(50); }; @@ -203,7 +203,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are affected by Grudge") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves, but still take damage") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by phazing moves, but still take damage") { GIVEN { ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); @@ -225,7 +225,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing move } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing moves but no block message is printed if they faint") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by phazing moves but no block message is printed if they faint") { GIVEN { ASSUME(GetMoveEffect(MOVE_DRAGON_TAIL) == EFFECT_HIT_SWITCH_TARGET); @@ -243,7 +243,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by phazing move } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Red Card") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by Red Card") { GIVEN { ASSUME(gItemsInfo[ITEM_RED_CARD].holdEffect == HOLD_EFFECT_RED_CARD); @@ -262,7 +262,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Red Card") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be switched out by Eject Button") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon can be switched out by Eject Button") { GIVEN { ASSUME(gItemsInfo[ITEM_EJECT_BUTTON].holdEffect == HOLD_EFFECT_EJECT_BUTTON); @@ -281,7 +281,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can be switched out by Eject But } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot have their ability swapped to another Pokemon's") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot have their ability swapped to another Pokemon's") { GIVEN { PLAYER(SPECIES_MILTANK) { Ability(ABILITY_SCRAPPY); } @@ -297,7 +297,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot have their ability swappe } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their ability changed or suppressed") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon can have their ability changed or suppressed") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_SHADOW_TAG); } @@ -314,7 +314,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have their ability changed o } // Max Moves don't make contact, so Cursed Body doesn't need to be tested, but it is coded for. -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon's Max Moves cannot be disabled") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon's Max Moves cannot be disabled") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -328,7 +328,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon's Max Moves cannot be disabled") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have base moves disabled on their first turn") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon can have base moves disabled on their first turn") { GIVEN { ASSUME(B_DISABLE_TURNS >= GEN_5); @@ -349,7 +349,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon can have base moves disabled on } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Torment") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are immune to Torment") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -364,7 +364,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Torment") } // This is true for all item-removing moves. -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not immune to Knock Off") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not immune to Knock Off") { GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POTION); } @@ -380,7 +380,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not immune to Knock Off") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon lose their substitutes") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon lose their substitutes") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -397,7 +397,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon lose their substitutes") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon that changes forms does not gain HP") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain HP") { u16 capturedHP, finalHP; GIVEN { @@ -418,7 +418,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon that changes forms does not gain } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon that changes forms does not gain HP unless the new form gains Max HP") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain HP unless the new form gains Max HP") { u32 hp = 1, maxHP = 200; u32 species; @@ -438,7 +438,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon that changes forms does not gain } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Max Moves deal 1/4 damage through protect", s16 damage) { bool32 protected; PARAMETRIZE { protected = TRUE; } @@ -458,7 +458,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves deal 1/4 damage through protect", s16 da } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard") +SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass Max Guard") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -470,7 +470,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass Max Guard") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) Feint bypasses Max Guard but doesn't break it") +DOUBLE_BATTLE_TEST("Dynamax: Feint bypasses Max Guard but doesn't break it") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -491,7 +491,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Feint bypasses Max Guard but doesn't break it") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Instruct") +DOUBLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are immune to Instruct") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -509,7 +509,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are immune to Instruct") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms change upon Dynamaxing") +SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms change upon Dynamaxing") { u32 species; bool32 gigantamaxFactor; @@ -525,7 +525,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms change upon Dynamaxi } } -SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms revert upon switching") +SINGLE_BATTLE_TEST("Dynamax: Pokemon with Gigantamax forms revert upon switching") { GIVEN { PLAYER(SPECIES_VENUSAUR); @@ -540,7 +540,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Pokemon with Gigantamax forms revert upon switchin } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Choice items", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon are not affected by Choice items", s16 damage) { u16 item; PARAMETRIZE { item = ITEM_CHOICE_BAND; } @@ -561,7 +561,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon are not affected by Choice items } } -SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holding Assault Vest") +SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon cannot use Max Guard while holding Assault Vest") { GIVEN { ASSUME(gItemsInfo[ITEM_ASSAULT_VEST].holdEffect == HOLD_EFFECT_ASSAULT_VEST); @@ -582,7 +582,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Dynamaxed Pokemon cannot use Max Guard while holdi // Anything that is conditional based off max HP still uses gBattleMons[battler].maxHP. // Below are some tests, but very far from all encompassing: -SINGLE_BATTLE_TEST("(DYNAMAX) Endeavor uses a Pokemon's non-Dynamax HP", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Endeavor uses a Pokemon's non-Dynamax HP", s16 damage) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -601,7 +601,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Endeavor uses a Pokemon's non-Dynamax HP", s16 dam } } -SINGLE_BATTLE_TEST("(DYNAMAX) Super Fang uses a Pokemon's non-Dynamax HP", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Super Fang uses a Pokemon's non-Dynamax HP", s16 damage) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -620,7 +620,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Super Fang uses a Pokemon's non-Dynamax HP", s16 d } } -SINGLE_BATTLE_TEST("(DYNAMAX) Pain Split uses a Pokemon's non-Dynamax HP", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Pain Split uses a Pokemon's non-Dynamax HP", s16 damage) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -639,7 +639,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Pain Split uses a Pokemon's non-Dynamax HP", s16 d } } -SINGLE_BATTLE_TEST("(DYNAMAX) Sitrus Berries heal based on a Pokemon's non-Dynamax HP", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Sitrus Berries heal based on a Pokemon's non-Dynamax HP", s16 damage) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -659,7 +659,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Sitrus Berries heal based on a Pokemon's non-Dynam } } -SINGLE_BATTLE_TEST("(DYNAMAX) Heal Pulse heals based on a Pokemon's non-Dynamax HP", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: Heal Pulse heals based on a Pokemon's non-Dynamax HP", s16 damage) { u32 dynamax; PARAMETRIZE { dynamax = GIMMICK_NONE; } @@ -679,7 +679,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Heal Pulse heals based on a Pokemon's non-Dynamax } // ============= MAX MOVE EFFECTS ========================================== -SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") +SINGLE_BATTLE_TEST("Dynamax: Max Strike lowers single opponent's speed") { GIVEN { // Fails?: ASSUME(GetMaxMove(B_POSITION_PLAYER_LEFT, MOVE_TACKLE) == MOVE_MAX_STRIKE); @@ -704,7 +704,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers single opponent's speed") } // This test should apply to all stat-lowering Max Moves, including G-Max Foam Burst and G-Max Tartness. -DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") +DOUBLE_BATTLE_TEST("Dynamax: Max Strike lowers both opponents' speed") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STRIKE, MOVE_EFFECT_LOWER_SPEED_SIDE)); @@ -740,7 +740,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Strike lowers both opponents' speed") } // This test should apply to all stat-boosting Max Moves, too. -DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") +DOUBLE_BATTLE_TEST("Dynamax: Max Knuckle raises both allies' attack") { s16 damage[4]; GIVEN { @@ -783,7 +783,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Knuckle raises both allies' attack") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") +SINGLE_BATTLE_TEST("Dynamax: Max Flare sets up sunlight") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_FLARE, MOVE_EFFECT_SUN)); @@ -799,7 +799,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Flare sets up sunlight") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") +SINGLE_BATTLE_TEST("Dynamax: Max Geyser sets up heavy rain") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_GEYSER, MOVE_EFFECT_RAIN)); @@ -815,7 +815,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Geyser sets up heavy rain") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") +SINGLE_BATTLE_TEST("Dynamax: Max Hailstorm sets up hail") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_HAILSTORM, MOVE_EFFECT_HAIL)); @@ -831,7 +831,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Hailstorm sets up hail") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") +SINGLE_BATTLE_TEST("Dynamax: Max Rockfall sets up a sandstorm") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_ROCKFALL, MOVE_EFFECT_SANDSTORM)); @@ -847,7 +847,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Rockfall sets up a sandstorm") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") +SINGLE_BATTLE_TEST("Dynamax: Max Overgrowth sets up Grassy Terrain") { s32 maxHP = 490; // Because of recalculated stats upon Dynamaxing GIVEN { @@ -868,7 +868,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Overgrowth sets up Grassy Terrain") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") +SINGLE_BATTLE_TEST("Dynamax: Max Mindstorm sets up Psychic Terrain") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_MINDSTORM, MOVE_EFFECT_PSYCHIC_TERRAIN)); @@ -885,7 +885,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Mindstorm sets up Psychic Terrain") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") +SINGLE_BATTLE_TEST("Dynamax: Max Lightning sets up Electric Terrain") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_LIGHTNING, MOVE_EFFECT_ELECTRIC_TERRAIN)); @@ -900,7 +900,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Lightning sets up Electric Terrain") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") +SINGLE_BATTLE_TEST("Dynamax: Max Starfall sets up Misty Terrain") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_MAX_STARFALL, MOVE_EFFECT_MISTY_TERRAIN)); @@ -915,7 +915,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Starfall sets up Misty Terrain") } } -SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") +SINGLE_BATTLE_TEST("Dynamax: G-Max Stonesurge sets up Stealth Rocks") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STONESURGE, MOVE_EFFECT_STEALTH_ROCK)); @@ -935,7 +935,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Stonesurge sets up Stealth Rocks") } // The test below also tests that sharp steel does type-based damage and can be Defogged away. -SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") +SINGLE_BATTLE_TEST("Dynamax: G-Max Steelsurge sets up sharp steel") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STEELSURGE, MOVE_EFFECT_STEELSURGE)); @@ -963,7 +963,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Steelsurge sets up sharp steel") } // The test below should apply to G-Max Fireball and G-Max Drum Solo, too. -SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abilities", s16 damage) +SINGLE_BATTLE_TEST("Dynamax: G-Max Hydrosnipe has fixed power and ignores abilities", s16 damage) { u16 move; PARAMETRIZE { move = MOVE_WATER_GUN; } @@ -982,7 +982,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) G-Max Hydrosnipe has fixed power and ignores abili } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Volt Crash paralyzes both opponents") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_VOLT_CRASH, MOVE_EFFECT_PARALYZE_SIDE)); @@ -1005,7 +1005,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Volt Crash paralyzes both opponents") // G-Max Stun Shock can apply different statuses to each opponent, but this isn't // compatible with the test RNG set-up. -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponents") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Stun Shock paralyzes or poisons both opponents") { u8 statusAnim; u32 rng; @@ -1046,7 +1046,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock paralyzes or poisons both opponen } // This test extends to G-Max Befuddle, too. -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before considering immunities") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Stun Shock chooses statuses before considering immunities") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_STUN_SHOCK, MOVE_EFFECT_POISON_PARALYZE_SIDE)); @@ -1074,7 +1074,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Stun Shock chooses statuses before consideri } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both opponents") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Befuddle paralyzes, poisons, or sleeps both opponents") { u8 statusAnim; u32 rng; @@ -1123,7 +1123,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Befuddle paralyzes, poisons, or sleeps both } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and generates money") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Gold Rush confuses both opponents and generates money") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_GOLD_RUSH, MOVE_EFFECT_CONFUSE_PAY_DAY_SIDE)); @@ -1143,7 +1143,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Gold Rush confuses both opponents and genera } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Smite confuses both opponents") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SMITE, MOVE_EFFECT_CONFUSE_SIDE)); @@ -1162,7 +1162,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Smite confuses both opponents") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possible") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Cuddle infatuates both opponents, if possible") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CUDDLE, MOVE_EFFECT_INFATUATE_SIDE)); @@ -1183,7 +1183,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Cuddle infatuates both opponents, if possibl } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Terror traps both opponents") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); @@ -1202,7 +1202,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Terror traps both opponents") } } -SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention effect") +SINGLE_BATTLE_TEST("Dynamax: Baton Pass passes G-Max Terror's escape prevention effect") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_TERROR, MOVE_EFFECT_PREVENT_ESCAPE_SIDE)); @@ -1219,7 +1219,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Baton Pass passes G-Max Terror's escape prevention } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Meltdown torments both opponents for 3 turns") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_MELTDOWN, MOVE_EFFECT_TORMENT_SIDE)); @@ -1255,7 +1255,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Meltdown torments both opponents for 3 turns } // This test applies to G-Max Cannonade, G-Max Vine Lash, and G-Max Volcalith, too. -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages non-Fire types") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Wildfire sets a field effect that damages non-Fire types") { s16 damage; GIVEN { @@ -1301,7 +1301,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Wildfire sets a field effect that damages no } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of the time") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Replenish recycles allies' berries 50\% of the time") { PASSES_RANDOMLY(1, 2, RNG_G_MAX_REPLENISH); GIVEN { @@ -1329,7 +1329,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Replenish recycles allies' berries 50\% of t } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Snooze makes only the target drowsy") { PASSES_RANDOMLY(1, 2, RNG_G_MAX_SNOOZE); GIVEN { @@ -1353,7 +1353,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Snooze makes only the target drowsy") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Finale heals allies by 1/6 of their health") { s16 damage1, damage2; GIVEN { @@ -1374,7 +1374,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Finale heals allies by 1/6 of their health") } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Sweetness cures allies' status conditions") { u32 j; GIVEN { @@ -1400,7 +1400,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Sweetness cures allies' status conditions") } // This test applies to G-Max Sandblast, too. -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Centiferno traps both opponents in Fire Spin") { GIVEN { ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_CENTIFERNO, MOVE_EFFECT_FIRE_SPIN_SIDE)); @@ -1427,7 +1427,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Centiferno traps both opponents in Fire Spin } } -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance by 1 stage") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Chi Strike boosts allies' crit chance by 1 stage") { u32 j; GIVEN { @@ -1458,9 +1458,9 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Chi Strike boosts allies' crit chance by 1 s } } -TO_DO_BATTLE_TEST("(DYNAMAX) Baton Pass doesn't pass G-Max Chi Strike's effect"); +TO_DO_BATTLE_TEST("Dynamax: Baton Pass doesn't pass G-Max Chi Strike's effect"); -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's last move") +DOUBLE_BATTLE_TEST("Dynamax: G-Max Depletion takes away 2 PP from the target's last move") { GIVEN { ASSUME(GetMoveCategory(MOVE_DRAGON_CLAW) == DAMAGE_CATEGORY_PHYSICAL); // Otherwise Sableye faints. @@ -1483,7 +1483,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max Depletion takes away 2 PP from the target's } // This test applies to G-Max Rapid Flow, too. -DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage", s16 damage) +DOUBLE_BATTLE_TEST("Dynamax: G-Max One Blow bypasses Max Guard for full damage", s16 damage) { bool32 protect; PARAMETRIZE { protect = TRUE; } @@ -1513,7 +1513,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) G-Max One Blow bypasses Max Guard for full damage" // Bug Testing // This test will fail if it's the first test a thread runs -DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting player partner") +DOUBLE_BATTLE_TEST("Dynamax: Max Flare doesn't softlock the game when fainting player partner") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -1529,7 +1529,7 @@ DOUBLE_BATTLE_TEST("(DYNAMAX) Max Flare doesn't softlock the game when fainting } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battlers") +SINGLE_BATTLE_TEST("Dynamax: Max Moves don't execute effects on fainted battlers") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -1544,7 +1544,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't execute effects on fainted battler } } -SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves fainting opponents") +SINGLE_BATTLE_TEST("Dynamax: Moxie clones can be triggered by Max Moves fainting opponents") { GIVEN { ASSUME(GetMovePower(MOVE_WATERFALL) > 0); @@ -1560,7 +1560,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Moxie clones can be triggered by Max Moves faintin } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Attacks prints a message when hitting into Max Guard") +SINGLE_BATTLE_TEST("Dynamax: Max Attacks prints a message when hitting into Max Guard") { GIVEN { PLAYER(SPECIES_WOBBUFFET); @@ -1573,7 +1573,7 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Attacks prints a message when hitting into Max } } -SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") +SINGLE_BATTLE_TEST("Dynamax: Max Moves don't bypass absorbing abilities") { u32 move, ability, species; PARAMETRIZE { move = MOVE_SPARK; ability = ABILITY_VOLT_ABSORB; species = SPECIES_LANTURN; } @@ -1609,3 +1609,18 @@ SINGLE_BATTLE_TEST("(DYNAMAX) Max Moves don't bypass absorbing abilities") ABILITY_POPUP(opponent, ability); } } + +SINGLE_BATTLE_TEST("Dynamax: Dynamax is reverted before switch out") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_EJECT_BUTTON); } + PLAYER(SPECIES_WYNAUT); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_TACKLE, gimmick: GIMMICK_DYNAMAX); MOVE(opponent, MOVE_TACKLE); SEND_OUT(player, 1); } + TURN { SWITCH(player, 0); } + TURN { MOVE(player, MOVE_TACKLE); } + } SCENE { + MESSAGE("Wobbuffet used Tackle!"); + } +}