Fixes Protosynthesis and Quark Drive ability pop up (#3595)
This commit is contained in:
parent
c0bc6979c7
commit
71fd95e6d4
@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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++;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -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!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user