Refactors residual damage (#4945)

* Refactors damage non types

* correction

* Refactor weather damage script

* new line

* correction

* there was a hail test already

* ndebug

* add sandstorm test

* Update src/battle_script_commands.c

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>

---------

Co-authored-by: Bassoonian <iasperbassoonian@gmail.com>
This commit is contained in:
Alex 2024-07-13 12:12:40 +02:00 committed by GitHub
parent 522a8ba3f7
commit edc883d038
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 141 additions and 153 deletions

View file

@ -838,7 +838,7 @@
.byte 0x95 .byte 0x95
.endm .endm
.macro weatherdamage .macro unused_96
.byte 0x96 .byte 0x96
.endm .endm
@ -1359,15 +1359,15 @@
.macro restoretarget .macro restoretarget
callnative BS_RestoreTarget callnative BS_RestoreTarget
.endm .endm
.macro saveattacker .macro saveattacker
callnative BS_SaveAttacker callnative BS_SaveAttacker
.endm .endm
.macro restoreattacker .macro restoreattacker
callnative BS_RestoreAttacker callnative BS_RestoreAttacker
.endm .endm
.macro metalburstdamagecalculator failInstr:req .macro metalburstdamagecalculator failInstr:req
callnative BS_CalcMetalBurstDmg callnative BS_CalcMetalBurstDmg
.4byte \failInstr .4byte \failInstr
@ -1560,10 +1560,6 @@
.4byte \failInstr .4byte \failInstr
.endm .endm
.macro damagenontypes
callnative BS_DamageNonTypes
.endm
.macro trysetstatus1, ptr:req .macro trysetstatus1, ptr:req
callnative BS_TrySetStatus1 callnative BS_TrySetStatus1
.4byte \ptr .4byte \ptr
@ -1659,7 +1655,7 @@
.macro removeweather .macro removeweather
callnative BS_RemoveWeather callnative BS_RemoveWeather
.endm .endm
.macro applyterastallization .macro applyterastallization
callnative BS_ApplyTerastallization callnative BS_ApplyTerastallization
.endm .endm

View file

@ -85,6 +85,7 @@ gBattleAnims_General::
.4byte General_Fog @ B_ANIM_FOG_CONTINUES .4byte General_Fog @ B_ANIM_FOG_CONTINUES
.4byte General_TeraCharge @ B_ANIM_TERA_CHARGE .4byte General_TeraCharge @ B_ANIM_TERA_CHARGE
.4byte General_TeraActivate @ B_ANIM_TERA_ACTIVATE .4byte General_TeraActivate @ B_ANIM_TERA_ACTIVATE
.4byte General_SimpleHeal @ B_ANIM_SIMPLE_HEAL
.align 2 .align 2
gBattleAnims_Special:: gBattleAnims_Special::
@ -27347,6 +27348,12 @@ General_WishHeal:
createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 10, 0, RGB_BLACK
end end
General_SimpleHeal:
loadspritegfx ANIM_TAG_BLUE_STAR
call HealingEffect
waitforvisualfinish
end
General_IllusionOff: General_IllusionOff:
monbg ANIM_TARGET monbg ANIM_TARGET
createvisualtask AnimTask_TransformMon, 2, 1, 0 createvisualtask AnimTask_TransformMon, 2, 1, 0

View file

@ -5921,33 +5921,22 @@ BattleScript_DamagingWeatherContinues::
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
playanimation_var BS_ATTACKER, sB_ANIM_ARG1 playanimation_var BS_ATTACKER, sB_ANIM_ARG1
setbyte gBattleCommunication, 0 setbyte gBattleCommunication, 0
BattleScript_DamagingWeatherLoop:: end2
copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 1
weatherdamage BattleScript_DamagingWeather::
jumpifword CMP_EQUAL, gBattleMoveDamage, 0, BattleScript_DamagingWeatherLoopIncrement
jumpifword CMP_COMMON_BITS gBattleMoveDamage, 1 << 31, BattleScript_DamagingWeatherHeal
printfromtable gSandStormHailDmgStringIds printfromtable gSandStormHailDmgStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
effectivenesssound effectivenesssound
hitanimation BS_ATTACKER hitanimation BS_SCRIPTING
goto BattleScript_DamagingWeatherHpChange goto BattleScript_DoTurnDmg
BattleScript_DamagingWeatherHeal:
call BattleScript_AbilityPopUp BattleScript_IceBodyHeal::
call BattleScript_AbilityPopUpScripting
playanimation BS_SCRIPTING, B_ANIM_SIMPLE_HEAL
healthbarupdate BS_SCRIPTING
datahpupdate BS_SCRIPTING
printstring STRINGID_ICEBODYHPGAIN printstring STRINGID_ICEBODYHPGAIN
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
BattleScript_DamagingWeatherHpChange:
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
tryfaintmon BS_ATTACKER
checkteamslost BattleScript_DamagingWeatherLoopIncrement
BattleScript_DamagingWeatherLoopIncrement::
jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_DamagingWeatherContinuesEnd
addbyte gBattleCommunication, 1
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamagingWeatherLoop
BattleScript_DamagingWeatherContinuesEnd::
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE
call BattleScript_ActivateWeatherAbilities
end2 end2
BattleScript_SandStormHailSnowEnds:: BattleScript_SandStormHailSnowEnds::
@ -9834,27 +9823,11 @@ BattleScript_DamageNonTypesStarts::
goto BattleScript_MoveEnd goto BattleScript_MoveEnd
BattleScript_DamageNonTypesContinues:: BattleScript_DamageNonTypesContinues::
setbyte gBattleCommunication, 0
BattleScript_DamageNonTypesLoop::
copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattleCommunication, 1
damagenontypes
jumpifword CMP_EQUAL, gBattleMoveDamage, 0, BattleScript_DamageNonTypesLoopIncrement
printfromtable gDamageNonTypesDmgStringIds printfromtable gDamageNonTypesDmgStringIds
waitmessage B_WAIT_TIME_LONG waitmessage B_WAIT_TIME_LONG
effectivenesssound effectivenesssound
hitanimation BS_ATTACKER hitanimation BS_SCRIPTING
orword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE goto BattleScript_DoTurnDmg
healthbarupdate BS_ATTACKER
datahpupdate BS_ATTACKER
tryfaintmon BS_ATTACKER
checkteamslost BattleScript_DamageNonTypesLoopIncrement
BattleScript_DamageNonTypesLoopIncrement::
jumpifbyte CMP_NOT_EQUAL, gBattleOutcome, 0, BattleScript_DamageNonTypesContinuesEnd
addbyte gBattleCommunication, 1
jumpifbytenotequal gBattleCommunication, gBattlersCount, BattleScript_DamageNonTypesLoop
BattleScript_DamageNonTypesContinuesEnd::
bicword gHitMarker, HITMARKER_IGNORE_BIDE | HITMARKER_IGNORE_SUBSTITUTE | HITMARKER_PASSIVE_DAMAGE | HITMARKER_GRUDGE
end2
BattleScript_EffectTryReducePP:: BattleScript_EffectTryReducePP::
tryspiteppreduce BattleScript_MoveEnd tryspiteppreduce BattleScript_MoveEnd

View file

@ -76,7 +76,6 @@ void BS_SetMaxMoveEffect(void);
void BS_SetSteelsurge(void); void BS_SetSteelsurge(void);
void BS_TrySetStatus1(void); void BS_TrySetStatus1(void);
void BS_TrySetStatus2(void); void BS_TrySetStatus2(void);
void BS_DamageNonTypes(void);
void BS_HealOneSixth(void); void BS_HealOneSixth(void);
void BS_TryRecycleBerry(void); void BS_TryRecycleBerry(void);
void BS_JumpIfDynamaxed(void); void BS_JumpIfDynamaxed(void);

View file

@ -51,6 +51,8 @@ extern const u8 BattleScript_LevelUp[];
extern const u8 BattleScript_RainContinuesOrEnds[]; extern const u8 BattleScript_RainContinuesOrEnds[];
extern const u8 BattleScript_SnowContinuesOrEnds[]; extern const u8 BattleScript_SnowContinuesOrEnds[];
extern const u8 BattleScript_DamagingWeatherContinues[]; extern const u8 BattleScript_DamagingWeatherContinues[];
extern const u8 BattleScript_DamagingWeather[];
extern const u8 BattleScript_IceBodyHeal[];
extern const u8 BattleScript_SandStormHailSnowEnds[]; extern const u8 BattleScript_SandStormHailSnowEnds[];
extern const u8 BattleScript_SunlightContinues[]; extern const u8 BattleScript_SunlightContinues[];
extern const u8 BattleScript_SunlightFaded[]; extern const u8 BattleScript_SunlightFaded[];

View file

@ -573,6 +573,7 @@
#define B_ANIM_FOG_CONTINUES 49 #define B_ANIM_FOG_CONTINUES 49
#define B_ANIM_TERA_CHARGE 50 #define B_ANIM_TERA_CHARGE 50
#define B_ANIM_TERA_ACTIVATE 51 #define B_ANIM_TERA_ACTIVATE 51
#define B_ANIM_SIMPLE_HEAL 52
// special animations table (gBattleAnims_Special) // special animations table (gBattleAnims_Special)
#define B_ANIM_LVL_UP 0 #define B_ANIM_LVL_UP 0

View file

@ -971,24 +971,6 @@ void BS_TrySetStatus2(void)
} }
} }
// Applies the endturn damage effect associated with the "Damage Non-" G-Max moves.
void BS_DamageNonTypes(void)
{
NATIVE_ARGS();
u8 side = GetBattlerSide(gBattlerAttacker);
gBattleMoveDamage = 0;
if (gSideTimers[side].damageNonTypesTimer
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType)
&& IsBattlerAlive(gBattlerAttacker)
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD)
{
gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 6;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
gBattlescriptCurrInstr = cmd->nextInstr;
}
// Heals one-sixth of the target's HP, including for Dynamaxed targets. // Heals one-sixth of the target's HP, including for Dynamaxed targets.
void BS_HealOneSixth(void) void BS_HealOneSixth(void)
{ {

View file

@ -490,7 +490,7 @@ static void Cmd_setlightscreen(void);
static void Cmd_tryKO(void); static void Cmd_tryKO(void);
static void Cmd_damagetohalftargethp(void); static void Cmd_damagetohalftargethp(void);
static void Cmd_unused_95(void); static void Cmd_unused_95(void);
static void Cmd_weatherdamage(void); static void Cmd_unused_96(void);
static void Cmd_tryinfatuating(void); static void Cmd_tryinfatuating(void);
static void Cmd_updatestatusicon(void); static void Cmd_updatestatusicon(void);
static void Cmd_setmist(void); static void Cmd_setmist(void);
@ -749,7 +749,7 @@ void (* const gBattleScriptingCommandsTable[])(void) =
Cmd_tryKO, //0x93 Cmd_tryKO, //0x93
Cmd_damagetohalftargethp, //0x94 Cmd_damagetohalftargethp, //0x94
Cmd_unused_95, //0x95 Cmd_unused_95, //0x95
Cmd_weatherdamage, //0x96 Cmd_unused_96, //0x96
Cmd_tryinfatuating, //0x97 Cmd_tryinfatuating, //0x97
Cmd_updatestatusicon, //0x98 Cmd_updatestatusicon, //0x98
Cmd_setmist, //0x99 Cmd_setmist, //0x99
@ -12411,74 +12411,8 @@ static void Cmd_unused_95(void)
{ {
} }
static void Cmd_weatherdamage(void) static void Cmd_unused_96(void)
{ {
CMD_ARGS();
u32 ability = GetBattlerAbility(gBattlerAttacker);
gBattleMoveDamage = 0;
if (IsBattlerAlive(gBattlerAttacker) && WEATHER_HAS_EFFECT && ability != ABILITY_MAGIC_GUARD)
{
if (gBattleWeather & B_WEATHER_SANDSTORM)
{
if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ROCK)
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GROUND)
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL)
&& ability != ABILITY_SAND_VEIL
&& ability != ABILITY_SAND_FORCE
&& ability != ABILITY_SAND_RUSH
&& ability != ABILITY_OVERCOAT
&& !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES)
{
gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
}
if (gBattleWeather & B_WEATHER_HAIL)
{
if (ability == ABILITY_ICE_BODY
&& !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& !BATTLER_MAX_HP(gBattlerAttacker)
&& !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK))
{
gBattlerAbility = gBattlerAttacker;
gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
}
else if (!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ICE)
&& ability != ABILITY_SNOW_CLOAK
&& ability != ABILITY_OVERCOAT
&& ability != ABILITY_ICE_BODY
&& !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES)
{
gBattleMoveDamage = GetNonDynamaxMaxHP(gBattlerAttacker) / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
}
}
if (gBattleWeather & B_WEATHER_SNOW)
{
if (ability == ABILITY_ICE_BODY
&& !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& !BATTLER_MAX_HP(gBattlerAttacker)
&& !(gStatuses3[gBattlerAttacker] & STATUS3_HEAL_BLOCK))
{
gBattlerAbility = gBattlerAttacker;
gBattleMoveDamage = gBattleMons[gBattlerAttacker].maxHP / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
gBattleMoveDamage *= -1;
}
}
}
gBattlescriptCurrInstr = cmd->nextInstr;
} }
static void Cmd_tryinfatuating(void) static void Cmd_tryinfatuating(void)
@ -14044,7 +13978,7 @@ u32 GetNaturePowerMove(u32 battler)
move = MOVE_PSYCHIC; move = MOVE_PSYCHIC;
else if (sNaturePowerMoves[gBattleTerrain] == MOVE_NONE) else if (sNaturePowerMoves[gBattleTerrain] == MOVE_NONE)
move = MOVE_TRI_ATTACK; move = MOVE_TRI_ATTACK;
if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE) if (GetActiveGimmick(battler) == GIMMICK_Z_MOVE)
{ {
gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move; gBattleStruct->zmove.baseMoves[gBattlerAttacker] = move;

View file

@ -1715,7 +1715,7 @@ u8 DoFieldEndTurnEffects(void)
do do
{ {
s32 i; s32 i;
u8 side; u32 side;
switch (gBattleStruct->turnCountersTracker) switch (gBattleStruct->turnCountersTracker)
{ {
@ -2068,19 +2068,11 @@ u8 DoFieldEndTurnEffects(void)
while (gBattleStruct->turnSideTracker < 2) while (gBattleStruct->turnSideTracker < 2)
{ {
side = gBattleStruct->turnSideTracker; side = gBattleStruct->turnSideTracker;
if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES) if (gSideStatuses[side] & SIDE_STATUS_DAMAGE_NON_TYPES && --gSideTimers[side].damageNonTypesTimer == 0)
{ {
if (--gSideTimers[side].damageNonTypesTimer == 0) // There is no in-game message when this side status ends.
{ gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES;
// There is no in-game message when this side status ends. effect++;
gSideStatuses[side] &= ~SIDE_STATUS_DAMAGE_NON_TYPES;
effect++;
}
else
{
ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType);
BattleScriptExecute(BattleScript_DamageNonTypesContinues);
}
} }
gBattleStruct->turnSideTracker++; gBattleStruct->turnSideTracker++;
if (effect != 0) if (effect != 0)
@ -2346,7 +2338,9 @@ enum
ENDTURN_SALT_CURE, ENDTURN_SALT_CURE,
ENDTURN_SYRUP_BOMB, ENDTURN_SYRUP_BOMB,
ENDTURN_DYNAMAX, ENDTURN_DYNAMAX,
ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE,
ENDTURN_SEA_OF_FIRE_DAMAGE, ENDTURN_SEA_OF_FIRE_DAMAGE,
ENDTURN_WEATHER_DAMAGE,
ENDTURN_BATTLER_COUNT ENDTURN_BATTLER_COUNT
}; };
@ -2933,10 +2927,27 @@ u8 DoBattlerEndTurnEffects(void)
} }
gBattleStruct->turnEffectsTracker++; gBattleStruct->turnEffectsTracker++;
break; break;
case ENDTURN_GMAX_MOVE_RESIDUAL_DAMAGE:
{
u32 side = GetBattlerSide(gBattlerAttacker);
if (gSideTimers[side].damageNonTypesTimer
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, gSideTimers[side].damageNonTypesType)
&& IsBattlerAlive(gBattlerAttacker)
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_MAGIC_GUARD)
{
gBattleScripting.battler = battler;
gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 6;
ChooseDamageNonTypesString(gSideTimers[side].damageNonTypesType);
BattleScriptExecute(BattleScript_DamageNonTypesContinues);
effect++;
}
gBattleStruct->turnEffectsTracker++;
break;
}
case ENDTURN_SEA_OF_FIRE_DAMAGE: case ENDTURN_SEA_OF_FIRE_DAMAGE:
if (IsBattlerAlive(battler) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE) if (IsBattlerAlive(battler) && gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SEA_OF_FIRE)
{ {
gBattleMoveDamage = gBattleMons[battler].maxHP / 8; gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 8;
BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN); BtlController_EmitStatusAnimation(battler, BUFFER_A, FALSE, STATUS1_BURN);
MarkBattlerForControllerExec(battler); MarkBattlerForControllerExec(battler);
BattleScriptExecute(BattleScript_HurtByTheSeaOfFire); BattleScriptExecute(BattleScript_HurtByTheSeaOfFire);
@ -2944,6 +2955,55 @@ u8 DoBattlerEndTurnEffects(void)
} }
gBattleStruct->turnEffectsTracker++; gBattleStruct->turnEffectsTracker++;
break; break;
case ENDTURN_WEATHER_DAMAGE:
ability = GetBattlerAbility(battler);
if (!IsBattlerAlive(battler) || !WEATHER_HAS_EFFECT || ability == ABILITY_MAGIC_GUARD)
{
gBattleStruct->turnEffectsTracker++;
break;
}
else if (gBattleWeather & B_WEATHER_SANDSTORM
&& ability != ABILITY_SAND_VEIL
&& ability != ABILITY_SAND_FORCE
&& ability != ABILITY_SAND_RUSH
&& ability != ABILITY_OVERCOAT
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_ROCK)
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GROUND)
&& !IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_STEEL)
&& !(gStatuses3[gBattlerAttacker] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& GetBattlerHoldEffect(gBattlerAttacker, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES)
{
gBattleScripting.battler = battler;
gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16;
BattleScriptExecute(BattleScript_DamagingWeather);
effect++;
}
else if (gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)
&& ability == ABILITY_ICE_BODY
&& !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& !BATTLER_MAX_HP(battler)
&& !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))
{
gBattleScripting.battler = battler;
gBattleMoveDamage = -1 * (GetNonDynamaxMaxHP(battler) / 16);
BattleScriptExecute(BattleScript_IceBodyHeal);
effect++;
}
else if (gBattleWeather & B_WEATHER_HAIL
&& !IS_BATTLER_OF_TYPE(battler, TYPE_ICE)
&& ability != ABILITY_SNOW_CLOAK
&& ability != ABILITY_OVERCOAT
&& ability != ABILITY_ICE_BODY
&& !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER))
&& GetBattlerHoldEffect(battler, TRUE) != HOLD_EFFECT_SAFETY_GOGGLES)
{
gBattleScripting.battler = battler;
gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16;
BattleScriptExecute(BattleScript_DamagingWeather);
effect++;
}
gBattleStruct->turnEffectsTracker++;
break;
case ENDTURN_BATTLER_COUNT: // done case ENDTURN_BATTLER_COUNT: // done
gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsTracker = 0;
gBattleStruct->turnEffectsBattlerId++; gBattleStruct->turnEffectsBattlerId++;

View file

@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.")
TURN { MOVE(opponent, MOVE_HAIL); } TURN { MOVE(opponent, MOVE_HAIL); }
} SCENE { } SCENE {
ABILITY_POPUP(player, ABILITY_ICE_BODY); ABILITY_POPUP(player, ABILITY_ICE_BODY);
MESSAGE("Glalie's Ice Body healed it a little bit!");
HP_BAR(player, damage: -(100 / 16)); HP_BAR(player, damage: -(100 / 16));
MESSAGE("Glalie's Ice Body healed it a little bit!");
} }
} }

View file

@ -53,3 +53,20 @@ SINGLE_BATTLE_TEST("Hail fails if Desolate Land or Primordial Sea are active")
} }
} }
} }
DOUBLE_BATTLE_TEST("Hail deals damage based on turn order")
{
GIVEN {
PLAYER(SPECIES_GLALIE);
PLAYER(SPECIES_WYNAUT) { Speed(1); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(3); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_HAIL); }
} SCENE {
NOT HP_BAR(playerLeft);
HP_BAR(opponentRight);
HP_BAR(opponentLeft);
HP_BAR(playerRight);
}
}

View file

@ -65,3 +65,20 @@ SINGLE_BATTLE_TEST("Sandstorm damage does not hurt Ground, Rock, and Steel-type
} }
} }
} }
DOUBLE_BATTLE_TEST("Sandstorm deals damage based on turn order")
{
GIVEN {
PLAYER(SPECIES_PHANPY);
PLAYER(SPECIES_WYNAUT) { Speed(1); }
OPPONENT(SPECIES_WOBBUFFET) { Speed(2); }
OPPONENT(SPECIES_WYNAUT) { Speed(3); }
} WHEN {
TURN { MOVE(playerLeft, MOVE_SANDSTORM); }
} SCENE {
NOT HP_BAR(playerLeft);
HP_BAR(opponentRight);
HP_BAR(opponentLeft);
HP_BAR(playerRight);
}
}