Fixes weather abilities not activating when Cloud Nine user leaves th… (#5209)

* Fixes weather abilities not activating when Cloud Nine user leaves the field

* parametrize
This commit is contained in:
Alex 2024-08-20 13:24:48 +02:00 committed by GitHub
parent a111ac496d
commit bde6982890
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 52 additions and 16 deletions

View File

@ -7150,7 +7150,7 @@ BattleScript_TargetFormChangeWithStringNoPopup::
BattleScript_BattlerFormChangeWithStringEnd3:: BattleScript_BattlerFormChangeWithStringEnd3::
pause 5 pause 5
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUpScripting
flushtextbox flushtextbox
handleformchange BS_SCRIPTING, 0 handleformchange BS_SCRIPTING, 0
handleformchange BS_SCRIPTING, 1 handleformchange BS_SCRIPTING, 1
@ -8010,7 +8010,7 @@ BattleScript_DeltaStreamActivates::
end3 end3
BattleScript_ProtosynthesisActivates:: BattleScript_ProtosynthesisActivates::
call BattleScript_AbilityPopUp call BattleScript_AbilityPopUpScripting
printstring STRINGID_SUNLIGHTACTIVATEDABILITY printstring STRINGID_SUNLIGHTACTIVATEDABILITY
waitmessage B_WAIT_TIME_MED waitmessage B_WAIT_TIME_MED
printstring STRINGID_STATWASHEIGHTENED printstring STRINGID_STATWASHEIGHTENED

View File

@ -7292,19 +7292,32 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
gDisableStructs[battler].truantSwitchInHack = 0; gDisableStructs[battler].truantSwitchInHack = 0;
for (i = 0; i < gBattlersCount; i++)
{
if (i != battler
&& GetBattlerAbility(i) == ABILITY_TRACE
&& AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0))
return TRUE;
}
if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler, FALSE)) if (DoSwitchInAbilities(battler) || ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, battler, FALSE))
return TRUE; return TRUE;
else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0)) else if (AbilityBattleEffects(ABILITYEFFECT_OPPORTUNIST, battler, 0, 0, 0))
return TRUE; return TRUE;
for (i = 0; i < gBattlersCount; i++)
{
if (i == battler)
continue;
switch (GetBattlerAbility(i))
{
case ABILITY_TRACE:
if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, i, 0, 0, 0))
return TRUE;
break;
case ABILITY_FORECAST:
case ABILITY_FLOWER_GIFT:
case ABILITY_ICE_FACE:
case ABILITY_PROTOSYNTHESIS:
if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, 0, 0, 0))
return TRUE;
break;
}
}
gDisableStructs[battler].stickyWebDone = FALSE; gDisableStructs[battler].stickyWebDone = FALSE;
gDisableStructs[battler].spikesDone = FALSE; gDisableStructs[battler].spikesDone = FALSE;
gDisableStructs[battler].toxicSpikesDone = FALSE; gDisableStructs[battler].toxicSpikesDone = FALSE;

View File

@ -6269,17 +6269,17 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
} }
break; break;
case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes. case ABILITYEFFECT_ON_WEATHER: // For ability effects that activate when the battle weather changes.
battler = gBattlerAbility = gBattleScripting.battler;
gLastUsedAbility = GetBattlerAbility(battler); gLastUsedAbility = GetBattlerAbility(battler);
switch (gLastUsedAbility) switch (gLastUsedAbility)
{ {
case ABILITY_FORECAST: case ABILITY_FORECAST:
case ABILITY_FLOWER_GIFT: case ABILITY_FLOWER_GIFT:
if ((IsBattlerWeatherAffected(battler, gBattleWeather) if ((IsBattlerWeatherAffected(battler, gBattleWeather)
|| gBattleWeather == B_WEATHER_NONE || gBattleWeather == B_WEATHER_NONE
|| !WEATHER_HAS_EFFECT) // Air Lock active || !WEATHER_HAS_EFFECT) // Air Lock active
&& TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER)) && TryBattleFormChange(battler, FORM_CHANGE_BATTLE_WEATHER))
{ {
gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3);
effect++; effect++;
} }
@ -6290,6 +6290,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
&& !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) && !(gBattleMons[battler].status2 & STATUS2_TRANSFORMED))
{ {
// TODO: Convert this to a proper FORM_CHANGE type. // TODO: Convert this to a proper FORM_CHANGE type.
gBattleScripting.battler = battler;
gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE; gBattleMons[battler].species = SPECIES_EISCUE_ICE_FACE;
BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3); BattleScriptPushCursorAndCallback(BattleScript_BattlerFormChangeWithStringEnd3);
effect++; effect++;
@ -6300,7 +6301,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{ {
gDisableStructs[battler].weatherAbilityDone = TRUE; gDisableStructs[battler].weatherAbilityDone = TRUE;
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
gBattlerAbility = gBattleScripting.battler = battler; gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates); BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates);
effect++; effect++;
} }

View File

@ -397,3 +397,25 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back when it uses a move that f
EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_CASTFORM); EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_SPECIES), SPECIES_CASTFORM);
} }
} }
SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user leaves the field")
{
u32 species = 0, ability = 0;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
GIVEN {
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); }
OPPONENT(species) { Ability(ability); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(player, MOVE_SUNNY_DAY); MOVE(opponent, MOVE_CELEBRATE); }
TURN { SWITCH(opponent, 1); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, player);
ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent);
MESSAGE("2 sent out Wobbuffet!");
ABILITY_POPUP(player, ABILITY_FORECAST);
MESSAGE("Castform transformed!");
}
}