Fix weatherform change when primal weather leaves the field (#9424)
Some checks are pending
CI / build (push) Waiting to run
CI / docs_validate (push) Waiting to run
CI / allcontributors (push) Waiting to run
Docs / deploy (push) Waiting to run

This commit is contained in:
Alex 2026-03-06 16:12:08 +01:00 committed by GitHub
parent 8dd4135b46
commit 78e4de61f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 66 additions and 25 deletions

View File

@ -22,6 +22,15 @@
.section script_data, "aw", %progbits
BattleScript_TryRevertWeatherform:
setbyte gEffectBattler, 0
sortbattlers
BattleScript_TryRevertWeatherformLoop:
tryrevertweatherform
addbyte gEffectBattler, 1
jumpifbytenotequal gEffectBattler, gBattlersCount, BattleScript_TryRevertWeatherformLoop
return
BattleScript_FickleBeamMessage::
pause B_WAIT_TIME_SHORTEST
printstring STRINGID_FICKLEBEAMDOUBLED
@ -906,7 +915,7 @@ BattleScript_MoveEffectCoreEnforcer::
printstring STRINGID_PKMNSABILITYSUPPRESSED
waitmessage B_WAIT_TIME_LONG
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
BattleScript_CoreEnforcerRet:
return
@ -1812,7 +1821,7 @@ BattleScript_EffectEntrainment::
printstring STRINGID_PKMNACQUIREDABILITY
waitmessage B_WAIT_TIME_LONG
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
goto BattleScript_MoveEnd
@ -1847,7 +1856,7 @@ BattleScript_EffectHealingWishGen4:
switchindataupdate BS_ATTACKER
hpthresholds BS_ATTACKER
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
flushtextbox
@ -1891,7 +1900,7 @@ BattleScript_EffectOverwriteAbility::
printstring STRINGID_PKMNACQUIREDABILITY
waitmessage B_WAIT_TIME_LONG
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
goto BattleScript_MoveEnd
@ -1997,7 +2006,7 @@ BattleScript_EffectGastroAcid::
printstring STRINGID_PKMNSABILITYSUPPRESSED
waitmessage B_WAIT_TIME_LONG
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
goto BattleScript_MoveEnd
@ -2725,7 +2734,7 @@ BattleScript_EffectEvasionUp2::
BattleScript_EffectTransform::
attackcanceler
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
flushtextbox
@ -4002,7 +4011,7 @@ BattleScript_FaintBattler::
printstring STRINGID_BATTLERFAINTED
cleareffectsonfaint BS_FAINTED
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
waitanimation
tryactivatereceiver BS_FAINTED
@ -5428,7 +5437,7 @@ BattleScript_BattlerFormChangeNoPopup::
BattleScript_BattlerFormChangeFromAfterAnimation::
handleformchange BS_SCRIPTING, 1
switchinabilities BS_SCRIPTING
jumpifability BS_TARGET, ABILITY_DISGUISE, BattleScript_ApplyDisguiseFormChangeHPLoss
jumpifability BS_SCRIPTING, ABILITY_DISGUISE, BattleScript_ApplyDisguiseFormChangeHPLoss
return
BattleScript_ZenMode::
@ -5450,7 +5459,8 @@ BattleScript_BattlerFormChangeDisguise::
waitanimation
printstring STRINGID_PKMNDISGUISEWASBUSTED
waitmessage B_WAIT_TIME_SHORT
goto BattleScript_BattlerFormChangeFromAfterAnimation
call BattleScript_BattlerFormChangeFromAfterAnimation
return
BattleScript_BattlerFormChangeEnd3NoPopup::
call BattleScript_BattlerFormChangeNoPopup
@ -5508,9 +5518,10 @@ BattleScript_ApplyDisguiseFormChangeHPLossReturn:
BattleScript_TargetFormChangeNoPopup:
flushtextbox
handleformchange BS_SCRIPTING, 0
playanimation BS_TARGET, B_ANIM_FORM_CHANGE
playanimation BS_SCRIPTING, B_ANIM_FORM_CHANGE
waitanimation
goto BattleScript_BattlerFormChangeFromAfterAnimation
call BattleScript_BattlerFormChangeFromAfterAnimation
return
BattleScript_TargetFormChange::
pause 5
@ -6662,7 +6673,7 @@ BattleScript_MummyActivates::
printstring STRINGID_ATTACKERACQUIREDABILITY
waitmessage B_WAIT_TIME_LONG
trytoclearprimalweather
tryrevertweatherform
call BattleScript_TryRevertWeatherform
flushtextbox
tryendneutralizinggas
return
@ -8255,3 +8266,4 @@ BattleScript_SilphScopeUnveiled::
printstring STRINGID_GHOSTWASMAROWAK
waitmessage B_WAIT_TIME_LONG
end2

View File

@ -12050,10 +12050,11 @@ void BS_ItemRestorePP(void)
void BS_TryRevertWeatherForm(void)
{
NATIVE_ARGS();
if (IsBattlerAlive(gBattlerTarget)
&& TryBattleFormChange(gBattlerTarget, FORM_CHANGE_BATTLE_WEATHER, GetBattlerAbility(gBattlerTarget)))
enum BattlerId battler = gBattlersBySpeed[gEffectBattler];
if (IsBattlerAlive(battler)
&& TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER, GetBattlerAbility(battler)))
{
gBattleScripting.battler = gBattlerTarget;
gBattleScripting.battler = battler;
BattleScriptPush(cmd->nextInstr);
gBattlescriptCurrInstr = BattleScript_TargetFormChangeWithStringNoPopup;
return;
@ -13888,17 +13889,18 @@ void BS_SwitchinAbilities(void)
{
NATIVE_ARGS(u8 battler);
enum BattlerId battler = GetBattlerForBattleScript(cmd->battler);
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattlescriptCurrInstr = cmd->nextInstr;
AbilityBattleEffects(ABILITYEFFECT_TERA_SHIFT, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_UNNERVE, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_COMMANDER, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, ability, MOVE_NONE, TRUE);
AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, ability, MOVE_NONE, TRUE);
if (AbilityBattleEffects(ABILITYEFFECT_TERA_SHIFT, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_UNNERVE, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_IMMUNITY, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_COMMANDER, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_ON_TERRAIN, battler, ability, MOVE_NONE, TRUE)
|| AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, ability, MOVE_NONE, TRUE))
return;
}
void BS_InstantHpDrop(void)

View File

@ -454,3 +454,30 @@ DOUBLE_BATTLE_TEST("Forecast reverts Castform back after Teraform Zero clears we
EXPECT_EQ(playerRight->species, SPECIES_CASTFORM_NORMAL);
}
}
DOUBLE_BATTLE_TEST("Forecast: All Forecast mons revert on the field if Primal Weather is removed due to fainting")
{
GIVEN {
PLAYER(SPECIES_KYOGRE) { Speed(20); HP(1); Item(ITEM_BLUE_ORB); }
PLAYER(SPECIES_CASTFORM) { Speed(10); Ability(ABILITY_FORECAST); }
OPPONENT(SPECIES_CASTFORM) { Speed(40); Ability(ABILITY_FORECAST); }
OPPONENT(SPECIES_CASTFORM) { Speed(30); Ability(ABILITY_FORECAST); }
} WHEN {
TURN { MOVE(opponentLeft, MOVE_POUND, target: playerLeft); }
} SCENE {
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_PRIMAL_REVERSION, playerLeft);
ABILITY_POPUP(opponentLeft, ABILITY_FORECAST);
ABILITY_POPUP(opponentRight, ABILITY_FORECAST);
ABILITY_POPUP(playerRight, ABILITY_FORECAST);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponentLeft);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponentRight);
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, playerRight);
} THEN {
EXPECT_EQ(opponentLeft->species, SPECIES_CASTFORM_NORMAL);
EXPECT_EQ(opponentRight->species, SPECIES_CASTFORM_NORMAL);
EXPECT_EQ(playerRight->species, SPECIES_CASTFORM_NORMAL);
}
}