Fixes Protosynthesis and Quark Drive ability pop up (#3595)

This commit is contained in:
Alex 2023-11-23 19:49:21 +01:00 committed by GitHub
parent c0bc6979c7
commit 71fd95e6d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 111 additions and 11 deletions

View File

@ -103,6 +103,8 @@ struct DisableStruct
u8 toxicSpikesDone:1; u8 toxicSpikesDone:1;
u8 stickyWebDone:1; u8 stickyWebDone:1;
u8 stealthRockDone:1; u8 stealthRockDone:1;
u8 weatherAbilityDone:1;
u8 terrainAbilityDone:1;
}; };
struct ProtectStruct struct ProtectStruct
@ -193,8 +195,6 @@ struct SpecialStatus
u8 dancerUsedMove:1; u8 dancerUsedMove:1;
u8 dancerOriginalTarget:3; u8 dancerOriginalTarget:3;
// End of byte // End of byte
u8 weatherAbilityDone:1;
u8 terrainAbilityDone:1;
u8 emergencyExited:1; u8 emergencyExited:1;
u8 afterYou:1; u8 afterYou:1;
}; };

View File

@ -1968,12 +1968,13 @@ u32 GetBattlerFriendshipScore(u32 battler)
return GetMonFriendshipScore(&party[gBattlerPartyIndexes[battler]]); return GetMonFriendshipScore(&party[gBattlerPartyIndexes[battler]]);
} }
static void TryToRevertMimicry(void) static void TryToRevertMimicryAndFlags(void)
{ {
u32 i; u32 i;
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
gDisableStructs[i].terrainAbilityDone = FALSE;
if (GetBattlerAbility(i) == ABILITY_MIMICRY) if (GetBattlerAbility(i) == ABILITY_MIMICRY)
RESTORE_BATTLER_TYPE(i); RESTORE_BATTLER_TYPE(i);
} }
@ -2022,7 +2023,7 @@ static bool32 EndTurnTerrain(u32 terrainFlag, u32 stringTableId)
if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0) if (!(gFieldStatuses & STATUS_FIELD_TERRAIN_PERMANENT) && --gFieldTimers.terrainTimer == 0)
{ {
gFieldStatuses &= ~terrainFlag; gFieldStatuses &= ~terrainFlag;
TryToRevertMimicry(); TryToRevertMimicryAndFlags();
gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId; gBattleCommunication[MULTISTRING_CHOOSER] = stringTableId;
BattleScriptExecute(BattleScript_TerrainEnds); BattleScriptExecute(BattleScript_TerrainEnds);
return TRUE; return TRUE;
@ -2322,6 +2323,8 @@ u8 DoFieldEndTurnEffects(void)
&& --gWishFutureKnock.weatherDuration == 0) && --gWishFutureKnock.weatherDuration == 0)
{ {
gBattleWeather &= ~B_WEATHER_SUN_TEMPORARY; gBattleWeather &= ~B_WEATHER_SUN_TEMPORARY;
for (i = 0; i < gBattlersCount; i++)
gDisableStructs[i].weatherAbilityDone = FALSE;
gBattlescriptCurrInstr = BattleScript_SunlightFaded; gBattlescriptCurrInstr = BattleScript_SunlightFaded;
} }
else else
@ -4051,6 +4054,7 @@ static bool32 TryChangeBattleTerrain(u32 battler, u32 statusFlag, u8 *timer)
{ {
gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN); gFieldStatuses &= ~(STATUS_FIELD_MISTY_TERRAIN | STATUS_FIELD_GRASSY_TERRAIN | STATUS_FIELD_ELECTRIC_TERRAIN | STATUS_FIELD_PSYCHIC_TERRAIN);
gFieldStatuses |= statusFlag; gFieldStatuses |= statusFlag;
gDisableStructs[battler].terrainAbilityDone = FALSE;
if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER) if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_TERRAIN_EXTENDER)
*timer = 8; *timer = 8;
@ -6061,10 +6065,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
} }
break; break;
case ABILITY_PROTOSYNTHESIS: case ABILITY_PROTOSYNTHESIS:
if (!gSpecialStatuses[battler].weatherAbilityDone && IsBattlerWeatherAffected(battler, B_WEATHER_SUN)) if (!gDisableStructs[battler].weatherAbilityDone && IsBattlerWeatherAffected(battler, B_WEATHER_SUN))
{ {
gSpecialStatuses[battler].weatherAbilityDone = TRUE; gDisableStructs[battler].weatherAbilityDone = TRUE;
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
gBattlerAbility = gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates); BattleScriptPushCursorAndCallback(BattleScript_ProtosynthesisActivates);
effect++; effect++;
} }
@ -6076,9 +6081,9 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
switch (gLastUsedAbility) switch (gLastUsedAbility)
{ {
case ABILITY_MIMICRY: case ABILITY_MIMICRY:
if (!gSpecialStatuses[battler].terrainAbilityDone && ChangeTypeBasedOnTerrain(battler)) if (!gDisableStructs[battler].terrainAbilityDone && ChangeTypeBasedOnTerrain(battler))
{ {
gSpecialStatuses[battler].terrainAbilityDone = TRUE; gDisableStructs[battler].terrainAbilityDone = TRUE;
ChangeTypeBasedOnTerrain(battler); ChangeTypeBasedOnTerrain(battler);
gBattlerAbility = gBattleScripting.battler = battler; gBattlerAbility = gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_MimicryActivates_End3); BattleScriptPushCursorAndCallback(BattleScript_MimicryActivates_End3);
@ -6086,11 +6091,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
} }
break; break;
case ABILITY_QUARK_DRIVE: case ABILITY_QUARK_DRIVE:
if (!gSpecialStatuses[battler].terrainAbilityDone && IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN)) if (!gDisableStructs[battler].terrainAbilityDone && IsBattlerTerrainAffected(battler, STATUS_FIELD_ELECTRIC_TERRAIN))
{ {
gSpecialStatuses[battler].terrainAbilityDone = TRUE; gDisableStructs[battler].terrainAbilityDone = TRUE;
gBattlerAbility = gBattleScripting.battler = battler;
PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler)); PREPARE_STAT_BUFFER(gBattleTextBuff1, GetHighestStatId(battler));
gBattlerAbility = gBattleScripting.battler = battler;
BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates); BattleScriptPushCursorAndCallback(BattleScript_QuarkDriveActivates);
effect++; effect++;
} }

View File

@ -85,3 +85,50 @@ SINGLE_BATTLE_TEST("Protosynthesis either boosts Defense or Special Defense, not
EXPECT_EQ(damage[0], damage[1]); EXPECT_EQ(damage[0], damage[1]);
} }
} }
SINGLE_BATTLE_TEST("Protosynthesis ability pop up activates only once during the duration of sunny day")
{
u16 turns;
GIVEN {
PLAYER(SPECIES_BELLSPROUT) { Ability(ABILITY_PROTOSYNTHESIS); }
OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); };
} WHEN {
for (turns = 0; turns < 5; turns++)
TURN {}
TURN { MOVE(opponent, MOVE_SUNNY_DAY); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_DROUGHT);
ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS);
MESSAGE("The harsh sunlight activated Bellsprout's Protosynthesis!");
MESSAGE("Bellsprout's Attack was heightened!");
NONE_OF {
for (turns = 0; turns < 4; turns++) {
ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS);
MESSAGE("The harsh sunlight activated Bellsprout's Protosynthesis!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_SUNNY_DAY, opponent);
ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS);
MESSAGE("The harsh sunlight activated Bellsprout's Protosynthesis!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}
SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in")
{
KNOWN_FAILING; // Fails because of wrong species
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_BELLSPROUT) { Ability(ABILITY_PROTOSYNTHESIS); }
OPPONENT(SPECIES_NINETALES) { Ability(ABILITY_DROUGHT); };
} WHEN {
TURN { SWITCH(player, 1); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_DROUGHT);
ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS);
MESSAGE("The harsh sunlight activated Bellsprout's Protosynthesis!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}

View File

@ -85,3 +85,51 @@ SINGLE_BATTLE_TEST("Quark Drive either boosts Defense or Special Defense, not bo
EXPECT_EQ(damage[0], damage[1]); EXPECT_EQ(damage[0], damage[1]);
} }
} }
SINGLE_BATTLE_TEST("Quark Drive ability pop up activates only once during the duration of electric terrain")
{
u16 turns;
GIVEN {
PLAYER(SPECIES_BELLSPROUT) { Ability(ABILITY_QUARK_DRIVE); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_ELECTRIC_TERRAIN); }
for (turns = 0; turns < 4; turns++)
TURN {}
TURN { MOVE(opponent, MOVE_ELECTRIC_TERRAIN); }
} SCENE {
ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent);
ABILITY_POPUP(player, ABILITY_QUARK_DRIVE);
MESSAGE("The Electric Terrain activated Bellsprout's Quark Drive!");
MESSAGE("Bellsprout's Attack was heightened!");
NONE_OF {
for (turns = 0; turns < 4; turns++) {
ABILITY_POPUP(player, ABILITY_QUARK_DRIVE);
MESSAGE("The Electric Terrain activated Bellsprout's Quark Drive!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}
ANIMATION(ANIM_TYPE_MOVE, MOVE_ELECTRIC_TERRAIN, opponent);
ABILITY_POPUP(player, ABILITY_QUARK_DRIVE);
MESSAGE("The Electric Terrain activated Bellsprout's Quark Drive!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}
SINGLE_BATTLE_TEST("Quark Drive activates on switch-in")
{
KNOWN_FAILING; // Fails because of wrong species
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
PLAYER(SPECIES_BELLSPROUT) { Ability(ABILITY_QUARK_DRIVE); }
OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); };
} WHEN {
TURN { SWITCH(player, 1); }
} SCENE {
ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE);
ABILITY_POPUP(player, ABILITY_QUARK_DRIVE);
MESSAGE("The Electric Terrain activated Bellsprout's Quark Drive!");
MESSAGE("Bellsprout's Attack was heightened!");
}
}