mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 03:34:15 +01:00
fixed Forecast and Flower Gift
This commit is contained in:
parent
ef348e7e65
commit
a5f28afe42
@ -1346,6 +1346,10 @@
|
||||
callnative BS_ItemRestorePP
|
||||
.endm
|
||||
|
||||
.macro trytorevertweatherform
|
||||
callnative BS_TryRevertWeatherForm
|
||||
.endm
|
||||
|
||||
@ various command changed to more readable macros
|
||||
.macro cancelmultiturnmoves battler:req
|
||||
various \battler, VARIOUS_CANCEL_MULTI_TURN_MOVES
|
||||
|
@ -1580,6 +1580,7 @@ BattleScript_MoveEffectCoreEnforcer::
|
||||
printstring STRINGID_PKMNSABILITYSUPPRESSED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
trytoclearprimalweather
|
||||
trytorevertweatherform
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
BattleScript_CoreEnforcerRet:
|
||||
@ -2728,6 +2729,7 @@ BattleScript_EffectSimpleBeam:
|
||||
printstring STRINGID_PKMNACQUIREDSIMPLE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
trytoclearprimalweather
|
||||
trytorevertweatherform
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
tryendneutralizinggas BS_TARGET
|
||||
@ -2827,6 +2829,7 @@ BattleScript_EffectWorrySeed:
|
||||
printstring STRINGID_PKMNACQUIREDABILITY
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
trytoclearprimalweather
|
||||
trytorevertweatherform
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
goto BattleScript_MoveEnd
|
||||
@ -2958,6 +2961,7 @@ BattleScript_EffectGastroAcid:
|
||||
printstring STRINGID_PKMNSABILITYSUPPRESSED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
trytoclearprimalweather
|
||||
trytorevertweatherform
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
tryendneutralizinggas BS_TARGET
|
||||
@ -6847,6 +6851,7 @@ BattleScript_RainContinuesOrEnds::
|
||||
jumpifbyte CMP_EQUAL, cMULTISTRING_CHOOSER, B_MSG_RAIN_STOPPED, BattleScript_RainContinuesOrEndsEnd
|
||||
playanimation BS_ATTACKER, B_ANIM_RAIN_CONTINUES
|
||||
BattleScript_RainContinuesOrEndsEnd::
|
||||
call BattleScript_ActivateWeatherAbilities
|
||||
end2
|
||||
|
||||
BattleScript_DamagingWeatherContinues::
|
||||
@ -6880,22 +6885,26 @@ BattleScript_DamagingWeatherLoopIncrement::
|
||||
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop
|
||||
BattleScript_DamagingWeatherContinuesEnd::
|
||||
bicword gHitMarker, HITMARKER_SKIP_DMG_TRACK | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE
|
||||
call BattleScript_ActivateWeatherAbilities
|
||||
end2
|
||||
|
||||
BattleScript_SandStormHailEnds::
|
||||
printfromtable gSandStormHailEndStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
call BattleScript_ActivateWeatherAbilities
|
||||
end2
|
||||
|
||||
BattleScript_SunlightContinues::
|
||||
printstring STRINGID_SUNLIGHTSTRONG
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
playanimation BS_ATTACKER, B_ANIM_SUN_CONTINUES
|
||||
call BattleScript_ActivateWeatherAbilities
|
||||
end2
|
||||
|
||||
BattleScript_SunlightFaded::
|
||||
printstring STRINGID_SUNLIGHTFADED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
call BattleScript_ActivateWeatherAbilities
|
||||
end2
|
||||
|
||||
BattleScript_OverworldWeatherStarts::
|
||||
@ -8020,6 +8029,19 @@ BattleScript_TargetFormChangeWithString::
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
return
|
||||
|
||||
BattleScript_TargetFormChangeWithStringNoPopupEnd3::
|
||||
pause 5
|
||||
printstring STRINGID_EMPTYSTRING3
|
||||
waitmessage 1
|
||||
handleformchange BS_TARGET, 0
|
||||
handleformchange BS_TARGET, 1
|
||||
playanimation BS_TARGET, B_ANIM_FORM_CHANGE, NULL
|
||||
waitanimation
|
||||
handleformchange BS_TARGET, 2
|
||||
printstring STRINGID_PKMNTRANSFORMED
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
end3
|
||||
|
||||
BattleScript_BattlerFormChangeWithStringEnd3::
|
||||
pause 5
|
||||
call BattleScript_AbilityPopUp
|
||||
@ -8663,14 +8685,15 @@ BattleScript_ShedSkinActivates::
|
||||
end3
|
||||
|
||||
BattleScript_ActivateWeatherAbilities:
|
||||
copybyte sBATTLER, gBattlerAttacker
|
||||
setbyte gBattlerAttacker, 0
|
||||
savetarget
|
||||
setbyte gBattlerTarget, 0
|
||||
BattleScript_ActivateWeatherAbilities_Loop:
|
||||
activateweatherchangeabilities BS_ATTACKER
|
||||
copybyte sBATTLER, gBattlerTarget
|
||||
activateweatherchangeabilities BS_TARGET
|
||||
BattleScript_ActivateWeatherAbilities_Increment:
|
||||
addbyte gBattlerAttacker, 1
|
||||
jumpifbytenotequal gBattlerAttacker, gBattlersCount, BattleScript_ActivateWeatherAbilities_Loop
|
||||
copybyte gBattlerAttacker, sBATTLER
|
||||
addbyte gBattlerTarget, 1
|
||||
jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_ActivateWeatherAbilities_Loop
|
||||
restoretarget
|
||||
return
|
||||
|
||||
BattleScript_TryAdrenalineOrb:
|
||||
|
@ -465,6 +465,7 @@ extern const u8 BattleScript_MoveEffectStockpileWoreOff[];
|
||||
extern const u8 BattleScript_StealthRockActivates[];
|
||||
extern const u8 BattleScript_SpikesActivates[];
|
||||
extern const u8 BattleScript_BerserkGeneRet[];
|
||||
extern const u8 BattleScript_TargetFormChangeWithStringNoPopupEnd3[];
|
||||
|
||||
// zmoves
|
||||
extern const u8 BattleScript_ZMoveActivateDamaging[];
|
||||
|
@ -139,7 +139,6 @@ void TryClearRageAndFuryCutter(void);
|
||||
u8 AtkCanceller_UnableToUseMove(void);
|
||||
u8 AtkCanceller_UnableToUseMove2(void);
|
||||
bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2);
|
||||
u8 TryWeatherFormChange(u8 battlerId);
|
||||
bool32 TryChangeBattleWeather(u8 battler, u32 weatherEnumId, bool32 viaAbility);
|
||||
u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u16 ability, u8 special, u16 moveArg);
|
||||
bool32 IsNeutralizingGasOnField(void);
|
||||
|
@ -101,6 +101,7 @@
|
||||
#define B_STOCKPILE_RAISES_DEFS GEN_LATEST // In Gen4+, Stockpile also raises Defense and Sp. Defense stats. Once Spit Up / Swallow is used, these stat changes are lost.
|
||||
#define B_TRANSFORM_SHINY GEN_LATEST // In Gen4+, Transform will copy the shiny state of the opponent instead of maintaining its own shiny state.
|
||||
#define B_TRANSFORM_FORM_CHANGES GEN_LATEST // In Gen5+, Transformed Pokemon cannot change forms.
|
||||
#define B_WEATHER_FORM_SUPPRESS GEN_LATEST // In Gen5+, Cherrim and Castform revert to their normal forms upon losing their ability.
|
||||
|
||||
// Ability settings
|
||||
#define B_EXPANDED_ABILITY_NAMES TRUE // If TRUE, ability names are increased from 12 characters to 16 characters.
|
||||
|
@ -16414,7 +16414,8 @@ u8 GetFirstFaintedPartyIndex(u8 battlerId)
|
||||
return PARTY_SIZE;
|
||||
}
|
||||
|
||||
void BS_ItemRestoreHP(void) {
|
||||
void BS_ItemRestoreHP(void)
|
||||
{
|
||||
NATIVE_ARGS();
|
||||
u16 healAmount;
|
||||
u32 battlerId = MAX_BATTLERS_COUNT;
|
||||
@ -16476,7 +16477,8 @@ void BS_ItemRestoreHP(void) {
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
|
||||
void BS_ItemCureStatus(void) {
|
||||
void BS_ItemCureStatus(void)
|
||||
{
|
||||
NATIVE_ARGS();
|
||||
struct Pokemon *party = GetBattlerParty(gBattlerAttacker);
|
||||
|
||||
@ -16504,7 +16506,8 @@ void BS_ItemCureStatus(void) {
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
|
||||
void BS_ItemIncreaseStat(void) {
|
||||
void BS_ItemIncreaseStat(void)
|
||||
{
|
||||
NATIVE_ARGS();
|
||||
u16 statId = GetItemEffect(gLastUsedItem)[1];
|
||||
u16 stages = ItemId_GetHoldEffectParam(gLastUsedItem);
|
||||
@ -16512,7 +16515,8 @@ void BS_ItemIncreaseStat(void) {
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
|
||||
void BS_ItemRestorePP(void) {
|
||||
void BS_ItemRestorePP(void)
|
||||
{
|
||||
NATIVE_ARGS();
|
||||
const u8 *effect = GetItemEffect(gLastUsedItem);
|
||||
u32 i, pp, maxPP, moveId;
|
||||
@ -16559,3 +16563,18 @@ void BS_ItemRestorePP(void) {
|
||||
PREPARE_SPECIES_BUFFER(gBattleTextBuff1, GetMonData(mon, MON_DATA_SPECIES));
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
|
||||
void BS_TryRevertWeatherForm(void)
|
||||
{
|
||||
NATIVE_ARGS();
|
||||
u16 ability = gBattleMons[gBattlerTarget].ability;
|
||||
if (B_WEATHER_FORM_SUPPRESS >= GEN_5
|
||||
&& (ability == ABILITY_FORECAST || ability == ABILITY_FLOWER_GIFT)
|
||||
&& TryBattleFormChange(gBattlerTarget, FORM_CHANGE_BATTLE_SWITCH)) // revert form
|
||||
{
|
||||
gBattleScripting.battler = gBattlerTarget;
|
||||
BattleScriptPushCursorAndCallback(BattleScript_TargetFormChangeWithStringNoPopupEnd3);
|
||||
return;
|
||||
}
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
}
|
||||
|
@ -3984,96 +3984,6 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2)
|
||||
}
|
||||
}
|
||||
|
||||
u8 TryWeatherFormChange(u8 battler)
|
||||
{
|
||||
u8 ret = 0;
|
||||
bool32 weatherEffect = WEATHER_HAS_EFFECT;
|
||||
u16 holdEffect = GetBattlerHoldEffect(battler, TRUE);
|
||||
|
||||
switch (gBattleMons[battler].species)
|
||||
{
|
||||
case SPECIES_CASTFORM:
|
||||
/* Placeholder
|
||||
case SPECIES_CASTFORM_RAINY:
|
||||
case SPECIES_CASTFORM_SNOWY:
|
||||
case SPECIES_CASTFORM_SUNNY:*/
|
||||
#if B_WEATHER_FORMS >= GEN_5
|
||||
if (gBattleMons[battler].hp == 0)
|
||||
{
|
||||
ret = 0; // No change
|
||||
}
|
||||
else if (GetBattlerAbility(battler) != ABILITY_FORECAST || !weatherEffect)
|
||||
{
|
||||
if (!IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
|
||||
ret = CASTFORM_NORMAL + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = 0; // No change
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (GetBattlerAbility(battler) != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
|
||||
{
|
||||
ret = 0; // No change
|
||||
}
|
||||
else if (!weatherEffect)
|
||||
{
|
||||
if (!IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
|
||||
ret = CASTFORM_NORMAL + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = 0; // No change
|
||||
}
|
||||
}
|
||||
#endif
|
||||
else if (holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA || (!(gBattleWeather & (B_WEATHER_RAIN | B_WEATHER_SUN | B_WEATHER_HAIL)) && !IS_BATTLER_OF_TYPE(battler, TYPE_NORMAL)))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_NORMAL);
|
||||
ret = CASTFORM_NORMAL + 1;
|
||||
}
|
||||
else if (gBattleWeather & B_WEATHER_SUN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && !IS_BATTLER_OF_TYPE(battler, TYPE_FIRE))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_FIRE);
|
||||
ret = CASTFORM_FIRE + 1;
|
||||
}
|
||||
else if (gBattleWeather & B_WEATHER_RAIN && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && !IS_BATTLER_OF_TYPE(battler, TYPE_WATER))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_WATER);
|
||||
ret = CASTFORM_WATER + 1;
|
||||
}
|
||||
else if (gBattleWeather & B_WEATHER_HAIL && !IS_BATTLER_OF_TYPE(battler, TYPE_ICE))
|
||||
{
|
||||
SET_BATTLER_TYPE(battler, TYPE_ICE);
|
||||
ret = CASTFORM_ICE + 1;
|
||||
}
|
||||
break;
|
||||
case SPECIES_CHERRIM:
|
||||
// case SPECIES_CHERRIM_SUNSHINE:
|
||||
if (gBattleMons[battler].hp == 0)
|
||||
ret = 0; // No change
|
||||
#if B_WEATHER_FORMS >= GEN_5
|
||||
if (GetBattlerAbility(battler) != ABILITY_FLOWER_GIFT)
|
||||
if (gBattleMonForms[battler] != 0)
|
||||
ret = CHERRIM_OVERCAST + 1;
|
||||
else
|
||||
ret = 0; // No change
|
||||
#endif
|
||||
else if (gBattleMonForms[battler] == 0 && weatherEffect && holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA && gBattleWeather & B_WEATHER_SUN)
|
||||
ret = CHERRIM_SUNSHINE + 1;
|
||||
else if (gBattleMonForms[battler] != 0 && (!weatherEffect || holdEffect == HOLD_EFFECT_UTILITY_UMBRELLA || !(gBattleWeather & B_WEATHER_SUN)))
|
||||
ret = CHERRIM_OVERCAST + 1;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const u16 sWeatherFlagsInfo[][3] =
|
||||
{
|
||||
[ENUM_WEATHER_RAIN] = {B_WEATHER_RAIN_TEMPORARY, B_WEATHER_RAIN_PERMANENT, HOLD_EFFECT_DAMP_ROCK},
|
||||
@ -9273,7 +9183,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
|
||||
break;
|
||||
#endif
|
||||
case ABILITY_FLOWER_GIFT:
|
||||
if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move))
|
||||
if (gBattleMons[battlerAtk].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerAtk, B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move))
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
case ABILITY_HUSTLE:
|
||||
@ -9313,7 +9223,7 @@ static u32 CalcAttackStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType, b
|
||||
switch (GetBattlerAbility(BATTLE_PARTNER(battlerAtk)))
|
||||
{
|
||||
case ABILITY_FLOWER_GIFT:
|
||||
if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move))
|
||||
if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IS_MOVE_PHYSICAL(move))
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
}
|
||||
@ -9447,7 +9357,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType,
|
||||
}
|
||||
break;
|
||||
case ABILITY_FLOWER_GIFT:
|
||||
if (gBattleMons[battlerDef].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat)
|
||||
if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat)
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
case ABILITY_PUNK_ROCK:
|
||||
@ -9466,7 +9376,7 @@ static u32 CalcDefenseStat(u16 move, u8 battlerAtk, u8 battlerDef, u8 moveType,
|
||||
switch (GetBattlerAbility(BATTLE_PARTNER(battlerDef)))
|
||||
{
|
||||
case ABILITY_FLOWER_GIFT:
|
||||
if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat)
|
||||
if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat)
|
||||
MulModifier(&modifier, UQ_4_12(1.5));
|
||||
break;
|
||||
}
|
||||
|
@ -92,6 +92,8 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] =
|
||||
[SPECIES_BURMY] = sBurmyFormChangeTable,
|
||||
[SPECIES_BURMY_SANDY_CLOAK] = sBurmyFormChangeTable,
|
||||
[SPECIES_BURMY_TRASH_CLOAK] = sBurmyFormChangeTable,
|
||||
[SPECIES_CHERRIM] = sCherrimFormChangeTable,
|
||||
[SPECIES_CHERRIM_SUNSHINE] = sCherrimFormChangeTable,
|
||||
[SPECIES_LOPUNNY] = sLopunnyFormChangeTable,
|
||||
[SPECIES_LOPUNNY_MEGA] = sLopunnyFormChangeTable,
|
||||
[SPECIES_GARCHOMP] = sGarchompFormChangeTable,
|
||||
|
86
test/ability_flower_gift.c
Normal file
86
test/ability_flower_gift.c
Normal file
@ -0,0 +1,86 @@
|
||||
#include "global.h"
|
||||
#include "test_battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim in harsh sunlight")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SUNNY_DAY); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when weather changes")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SUNNY_DAY); }
|
||||
TURN { MOVE(opponent, MOVE_RAIN_DANCE); }
|
||||
} SCENE {
|
||||
// transforms in sun
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
// back to normal
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its ability is suppressed")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, MOVE_SUNNY_DAY); }
|
||||
TURN { MOVE(opponent, MOVE_GASTRO_ACID); }
|
||||
} SCENE {
|
||||
// transforms in sun
|
||||
ABILITY_POPUP(player, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
// back to normal
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Flower Gift increases the attack of Cherrim's ally by 1.5x", s16 damage)
|
||||
{
|
||||
bool32 sunny;
|
||||
PARAMETRIZE { sunny = FALSE; }
|
||||
PARAMETRIZE { sunny = TRUE; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CHERRIM) { Ability(ABILITY_FLOWER_GIFT); };
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
if (sunny)
|
||||
TURN { MOVE(playerLeft, MOVE_SUNNY_DAY); }
|
||||
TURN { MOVE(playerRight, MOVE_TACKLE, target: opponentLeft); }
|
||||
} SCENE {
|
||||
// Sun activates
|
||||
if (sunny) {
|
||||
ABILITY_POPUP(playerLeft, ABILITY_FLOWER_GIFT);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, playerLeft);
|
||||
MESSAGE("Cherrim transformed!");
|
||||
}
|
||||
// Partner uses Tackle
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, playerRight);
|
||||
HP_BAR(opponentLeft, captureDamage: &results[i].damage);
|
||||
} FINALLY {
|
||||
EXPECT_MUL_EQ(results[0].damage, UQ_4_12(1.5), results[1].damage);
|
||||
}
|
||||
}
|
||||
|
||||
TO_DO_BATTLE_TEST("Flower Gift does not transform Cherrim back to normal when suppressed if Cherrim is Dynamaxed");
|
201
test/ability_forecast.c
Normal file
201
test/ability_forecast.c
Normal file
@ -0,0 +1,201 @@
|
||||
#include "global.h"
|
||||
#include "test_battle.h"
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an opponent's move")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; }
|
||||
PARAMETRIZE { move = MOVE_RAIN_DANCE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(opponent, move); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from its own move")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; }
|
||||
PARAMETRIZE { move = MOVE_RAIN_DANCE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, move); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Forecast transforms Castform in weather from a partner's move")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; }
|
||||
PARAMETRIZE { move = MOVE_RAIN_DANCE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, move); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(playerLeft, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, playerLeft);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather")
|
||||
{
|
||||
u32 move;
|
||||
PARAMETRIZE { move = MOVE_SUNNY_DAY; }
|
||||
PARAMETRIZE { move = MOVE_RAIN_DANCE; }
|
||||
PARAMETRIZE { move = MOVE_HAIL; }
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
} WHEN {
|
||||
TURN { MOVE(playerRight, move); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(playerLeft, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, playerLeft);
|
||||
MESSAGE("Castform transformed!");
|
||||
ABILITY_POPUP(opponentLeft, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponentLeft);
|
||||
MESSAGE("Foe Castform transformed!");
|
||||
ABILITY_POPUP(playerRight, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, playerRight);
|
||||
MESSAGE("Castform transformed!");
|
||||
ABILITY_POPUP(opponentRight, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, opponentRight);
|
||||
MESSAGE("Foe Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); };
|
||||
} WHEN {
|
||||
TURN { SWITCH(opponent, 1); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
OPPONENT(SPECIES_KYOGRE) { Ability(ABILITY_DRIZZLE); Item(ITEM_BLUE_ORB); };
|
||||
} WHEN {
|
||||
TURN { SWITCH(opponent, 1); }
|
||||
} SCENE {
|
||||
ABILITY_POPUP(opponent, ABILITY_PRIMORDIAL_SEA);
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when weather expires")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_RAIN_DANCE); }
|
||||
TURN { }
|
||||
TURN { }
|
||||
TURN { }
|
||||
TURN { }
|
||||
TURN { }
|
||||
} SCENE {
|
||||
// transforms
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
// back to normal
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when Sandstorm is active")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_RAIN_DANCE); }
|
||||
TURN { MOVE(player, MOVE_SANDSTORM); }
|
||||
} SCENE {
|
||||
// transforms
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
// back to normal
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform on switch-in")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET);
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_RAIN_DANCE); }
|
||||
TURN { SWITCH(player, 1); }
|
||||
} SCENE {
|
||||
// turn 1
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_RAIN_DANCE, player);
|
||||
// turn 2
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
||||
|
||||
SINGLE_BATTLE_TEST("Forecast transforms Castform when weather changes")
|
||||
{
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_CASTFORM) { Ability(ABILITY_FORECAST); };
|
||||
OPPONENT(SPECIES_WOBBUFFET);
|
||||
} WHEN {
|
||||
TURN { MOVE(player, MOVE_RAIN_DANCE); }
|
||||
TURN { MOVE(player, MOVE_SUNNY_DAY); }
|
||||
} SCENE {
|
||||
// transforms
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
// transforms again
|
||||
ABILITY_POPUP(player, ABILITY_FORECAST);
|
||||
ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player);
|
||||
MESSAGE("Castform transformed!");
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user