Zen Mode Fix: Removes start battle form change and adds switch-out form change (#9304)

Co-authored-by: LinathanZel <linathan@DESKTOP-RVGNQ5E.localdomain>
This commit is contained in:
Linathan 2026-02-25 13:35:16 -05:00 committed by GitHub
parent 6ac7540d3b
commit a635ac599d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 69 additions and 11 deletions

View File

@ -5425,6 +5425,17 @@ BattleScript_BattlerFormChangeFromAfterAnimation::
jumpifability BS_TARGET, ABILITY_DISGUISE, BattleScript_ApplyDisguiseFormChangeHPLoss
return
BattleScript_ZenMode::
flushtextbox
call BattleScript_AbilityPopUpScripting
handleformchange BS_SCRIPTING, 0
playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE
waitanimation
handleformchange BS_SCRIPTING, 1
printfromtable gZenModeStringIds
waitmessage B_WAIT_TIME_SHORT
end2
BattleScript_BattlerFormChangeDisguise::
call BattleScript_AbilityPopUpScripting
pause B_WAIT_TIME_LONG

View File

@ -340,6 +340,7 @@ extern const u8 BattleScript_AftermathDmg[];
extern const u8 BattleScript_BattlerFormChange[];
extern const u8 BattleScript_BattlerFormChangeEnd2[];
extern const u8 BattleScript_BattlerFormChangeNoPopup[];
extern const u8 BattleScript_ZenMode[];
extern const u8 BattleScript_BattlerFormChangeDisguise[];
extern const u8 BattleScript_TargetFormChange[];
extern const u8 BattleScript_AnticipationActivates[];

View File

@ -720,6 +720,8 @@ enum StringID
STRINGID_PKMNANGRY,
STRINGID_PKMNEATING,
STRINGID_PKMNDISGUISEWASBUSTED,
STRINGID_ZENMODETRIGGERED,
STRINGID_ZENMODEENDED,
STRINGID_COUNT
};
@ -1199,4 +1201,11 @@ enum DamageNonTypesDmgStringID
B_MSG_HURT_BY_ROCKS_THROWN,
};
// gZenModeStringIds
enum ZenModeStringID
{
B_MSG_ZEN_MODE_TRIGGERED,
B_MSG_ZEN_MODE_ENDED,
};
#endif // GUARD_CONSTANTS_BATTLE_STRING_IDS_H

View File

@ -1324,12 +1324,26 @@ static bool32 HandleEndTurnFormChange(enum BattlerId battler)
{
gBattleScripting.battler = battler;
gBattleScripting.abilityPopupOverwrite = ability; // To prevent the new form's ability from pop up
if (ability == ABILITY_POWER_CONSTRUCT) // Special animation
switch (ability)
{
case ABILITY_POWER_CONSTRUCT:
BattleScriptExecute(BattleScript_PowerConstruct);
else if (ability == ABILITY_HUNGER_SWITCH)
break;
case ABILITY_HUNGER_SWITCH:
BattleScriptExecute(BattleScript_BattlerFormChangeEnd3NoPopup);
else
break;
case ABILITY_ZEN_MODE:
if (gBattleMons[battler].species == SPECIES_DARMANITAN_ZEN
|| gBattleMons[battler].species == SPECIES_DARMANITAN_GALAR_ZEN)
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ZEN_MODE_TRIGGERED;
else
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ZEN_MODE_ENDED;
BattleScriptExecute(BattleScript_ZenMode);
break;
default:
BattleScriptExecute(BattleScript_BattlerFormChangeEnd2); // Generic animation
break;
}
effect = TRUE;
}

View File

@ -897,6 +897,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] =
[STRINGID_PKMNANGRY] = COMPOUND_STRING("{B_OPPONENT_MON1_NAME} is angry!"),
[STRINGID_PKMNEATING] = COMPOUND_STRING("{B_OPPONENT_MON1_NAME} is eating!"),
[STRINGID_PKMNDISGUISEWASBUSTED] = COMPOUND_STRING("{B_SCR_NAME_WITH_PREFIX}'s disguise was busted!"),
[STRINGID_ZENMODETRIGGERED] = COMPOUND_STRING("{B_SCR_ABILITY} triggered!"),
[STRINGID_ZENMODEENDED] = COMPOUND_STRING("{B_SCR_ABILITY} ended!"),
};
const u16 gTrainerUsedItemStringIds[] =
@ -1418,6 +1420,12 @@ const u16 gSpinHazardsStringIds[] =
[HAZARDS_STEELSURGE] = STRINGID_PKMNBLEWAWAYSHARPSTEEL,
};
const u16 gZenModeStringIds[] =
{
[B_MSG_ZEN_MODE_TRIGGERED] = STRINGID_ZENMODETRIGGERED,
[B_MSG_ZEN_MODE_ENDED] = STRINGID_ZENMODEENDED
};
const u8 gText_PkmnIsEvolving[] = _("What?\n{STR_VAR_1} is evolving!");
const u8 gText_CongratsPkmnEvolved[] = _("Congratulations! Your {STR_VAR_1}\nevolved into {STR_VAR_2}!{WAIT_SE}\p");
const u8 gText_PkmnStoppedEvolving[] = _("Huh? {STR_VAR_1}\nstopped evolving!\p");

View File

@ -1066,10 +1066,9 @@ static const struct FormChange sScolipedeFormChangeTable[] =
#if P_FAMILY_DARUMAKA
static const struct FormChange sDarmanitanFormChangeTable[] =
{
{FORM_CHANGE_BATTLE_HP_PERCENT_SEND_OUT, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_SEND_OUT, SPECIES_DARMANITAN_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_TURN_END, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_TURN_END, SPECIES_DARMANITAN_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50},
{FORM_CHANGE_BATTLE_SWITCH_OUT, SPECIES_DARMANITAN_STANDARD, ABILITY_ZEN_MODE},
{FORM_CHANGE_FAINT, SPECIES_DARMANITAN_STANDARD},
{FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_STANDARD},
{FORM_CHANGE_TERMINATOR},
@ -1078,10 +1077,9 @@ static const struct FormChange sDarmanitanFormChangeTable[] =
#if P_GALARIAN_FORMS
static const struct FormChange sDarmanitanGalarFormChangeTable[] =
{
{FORM_CHANGE_BATTLE_HP_PERCENT_SEND_OUT, SPECIES_DARMANITAN_GALAR_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_SEND_OUT, SPECIES_DARMANITAN_GALAR_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_TURN_END, SPECIES_DARMANITAN_GALAR_STANDARD, ABILITY_ZEN_MODE, HP_HIGHER_THAN, 50},
{FORM_CHANGE_BATTLE_HP_PERCENT_TURN_END, SPECIES_DARMANITAN_GALAR_ZEN, ABILITY_ZEN_MODE, HP_LOWER_EQ_THAN, 50},
{FORM_CHANGE_BATTLE_SWITCH_OUT, SPECIES_DARMANITAN_GALAR_STANDARD, ABILITY_ZEN_MODE},
{FORM_CHANGE_FAINT, SPECIES_DARMANITAN_GALAR_STANDARD},
{FORM_CHANGE_END_BATTLE, SPECIES_DARMANITAN_GALAR_STANDARD},
{FORM_CHANGE_TERMINATOR},

View File

@ -24,17 +24,18 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less
HP_BAR(player);
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Zen Mode triggered!");
} THEN {
EXPECT_LT(player->hp, player->maxHP / 2);
EXPECT_EQ(player->species, zenSpecies);
}
}
SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less before the first turn")
SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form to Standard when swapped out")
{
u16 standardSpecies, zenSpecies;
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_STANDARD; zenSpecies = SPECIES_DARMANITAN_ZEN; }
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; }
PARAMETRIZE { standardSpecies = SPECIES_DARMANITAN_GALAR_STANDARD; zenSpecies = SPECIES_DARMANITAN_GALAR_ZEN; }
GIVEN {
ASSUME(GetSpeciesBaseHP(standardSpecies) == 105);
@ -44,14 +45,25 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is half or less
Ability(ABILITY_ZEN_MODE);
HP(GetMonData(&PLAYER_PARTY[0], MON_DATA_MAX_HP) / 2);
}
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); }
TURN { SWITCH(player, 1); MOVE(opponent, MOVE_CELEBRATE); }
TURN { SWITCH(player, 0); MOVE(opponent, MOVE_CELEBRATE); }
} SCENE {
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Darmanitan used Celebrate!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Zen Mode triggered!");
MESSAGE("Go! Wobbuffet!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
MESSAGE("Go! Darmanitan!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Zen Mode triggered!");
} THEN {
EXPECT_LE(player->hp, player->maxHP / 2);
EXPECT_EQ(player->species, zenSpecies);
@ -74,15 +86,20 @@ SINGLE_BATTLE_TEST("Zen Mode switches Darmanitan's form when HP is healed above
}
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_CELEBRATE); }
TURN { MOVE(player, MOVE_CELEBRATE); MOVE(opponent, MOVE_HEAL_PULSE); }
} SCENE {
MESSAGE("Darmanitan used Celebrate!");
MESSAGE("The opposing Wobbuffet used Celebrate!");
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Zen Mode triggered!");
MESSAGE("Darmanitan used Celebrate!");
MESSAGE("The opposing Wobbuffet used Heal Pulse!");
HP_BAR(player);
ABILITY_POPUP(player, ABILITY_ZEN_MODE);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
MESSAGE("Zen Mode ended!");
} THEN {
EXPECT_GT(player->hp, player->maxHP / 2);
EXPECT_EQ(player->species, standardSpecies);