Fixed incorrect weather damage rounding when maxHP <16 (#5183)

Co-authored-by: Hedara <hedara90@gmail.com>
This commit is contained in:
hedara90 2024-08-16 23:02:49 +02:00 committed by GitHub
parent bd3d99d7d9
commit b641c6f4fa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 75 additions and 9 deletions

View File

@ -1564,9 +1564,9 @@ static u32 GetSwitchinStatusDamage(u32 battler)
if ((status & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns
AI_DATA->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1);
statusDamage = maxHP / 16;
statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8;
if (statusDamage == 0)
statusDamage = 1;
statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8;
}
}

View File

@ -2514,7 +2514,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId)
bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability)
{
if ((BattlerAffectedBySandstorm(battler, ability) || BattlerAffectedByHail(battler, ability))
&& gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 16)
&& gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16))
return TRUE;
return FALSE;
@ -2523,7 +2523,7 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability)
bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability)
{
if (GetBattlerSecondaryDamage(battler) != 0
&& gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 16)
&& gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16))
return TRUE;
return FALSE;
}

View File

@ -2379,6 +2379,8 @@ u8 DoBattlerEndTurnEffects(void)
{
gBattleScripting.battler = battler;
gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_DamagingWeather);
effect++;
}
@ -2389,7 +2391,7 @@ u8 DoBattlerEndTurnEffects(void)
&& !(gStatuses3[battler] & STATUS3_HEAL_BLOCK))
{
gBattleScripting.battler = battler;
gBattleMoveDamage = -1 * (GetNonDynamaxMaxHP(battler) / 16);
gBattleMoveDamage = -1 * max(1, GetNonDynamaxMaxHP(battler) / 16);
BattleScriptExecute(BattleScript_IceBodyHeal);
effect++;
}
@ -2403,6 +2405,8 @@ u8 DoBattlerEndTurnEffects(void)
{
gBattleScripting.battler = battler;
gBattleMoveDamage = GetNonDynamaxMaxHP(battler) / 16;
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
BattleScriptExecute(BattleScript_DamagingWeather);
effect++;
}

View File

@ -1,13 +1,21 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS {
ASSUME(gMovesInfo[MOVE_HAIL].effect == EFFECT_HAIL);
ASSUME(gMovesInfo[MOVE_SNOWSCAPE].effect == EFFECT_SNOWSCAPE);
}
SINGLE_BATTLE_TEST("Ice Body prevents damage from hail")
{
u32 move;
PARAMETRIZE { move = MOVE_HAIL; }
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
GIVEN {
PLAYER(SPECIES_WOBBUFFET);
OPPONENT(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); }
} WHEN {
TURN { MOVE(player, MOVE_HAIL); MOVE(opponent, MOVE_SKILL_SWAP); }
TURN { MOVE(player, move); MOVE(opponent, MOVE_SKILL_SWAP); }
} SCENE {
NONE_OF { HP_BAR(player); }
}
@ -15,11 +23,14 @@ SINGLE_BATTLE_TEST("Ice Body prevents damage from hail")
SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.")
{
u32 move;
PARAMETRIZE { move = MOVE_HAIL; }
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
GIVEN {
PLAYER(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); HP(1); MaxHP(100); }
OPPONENT(SPECIES_WOBBUFFET);
} WHEN {
TURN { MOVE(opponent, MOVE_HAIL); }
TURN { MOVE(opponent, move); }
} SCENE {
ABILITY_POPUP(player, ABILITY_ICE_BODY);
HP_BAR(player, damage: -(100 / 16));
@ -27,4 +38,17 @@ SINGLE_BATTLE_TEST("Ice Body recovers 1/16th of Max HP in hail.")
}
}
TO_DO_BATTLE_TEST("Sand Rush doesn't recover HP if Cloud Nine/Air Lock is on the field");
SINGLE_BATTLE_TEST("Ice Body doesn't recover HP if Cloud Nine/Air Lock is on the field")
{
u32 move;
PARAMETRIZE { move = MOVE_HAIL; }
PARAMETRIZE { move = MOVE_SNOWSCAPE; }
GIVEN {
PLAYER(SPECIES_GLALIE) { Ability(ABILITY_ICE_BODY); HP(1); MaxHP(100); }
OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); }
} WHEN {
TURN { MOVE(opponent, move); }
} SCENE {
NOT ABILITY_POPUP(player, ABILITY_ICE_BODY);
}
}

View File

@ -1,6 +1,10 @@
#include "global.h"
#include "test/battle.h"
ASSUMPTIONS {
ASSUME(gMovesInfo[MOVE_RAIN_DANCE].effect == EFFECT_RAIN_DANCE);
}
SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain")
{
GIVEN {
@ -11,8 +15,18 @@ SINGLE_BATTLE_TEST("Rain Dish recovers 1/16th of Max HP in Rain")
} SCENE {
ABILITY_POPUP(player, ABILITY_RAIN_DISH);
MESSAGE("Ludicolo's Rain Dish restored its HP a little!");
HP_BAR(player, damage: -(100 / 16));
HP_BAR(player, damage: -(100 / 16));
}
}
TO_DO_BATTLE_TEST("Rain Dish doesn't recover HP if Cloud Nine/Air Lock is on the field");
SINGLE_BATTLE_TEST("Rain Dish doesn't recover HP if Cloud Nine/Air Lock is on the field")
{
GIVEN {
PLAYER(SPECIES_LUDICOLO) { Ability(ABILITY_RAIN_DISH); HP(1); MaxHP(100); }
OPPONENT(SPECIES_GOLDUCK) { Ability(ABILITY_CLOUD_NINE); }
} WHEN {
TURN { MOVE(opponent, MOVE_RAIN_DANCE); }
} SCENE {
NOT ABILITY_POPUP(player, ABILITY_RAIN_DISH);
}
}

View File

@ -70,3 +70,15 @@ DOUBLE_BATTLE_TEST("Hail deals damage based on turn order")
HP_BAR(playerRight);
}
}
SINGLE_BATTLE_TEST("Hail damage rounds properly when maxHP < 16")
{
GIVEN {
PLAYER(SPECIES_MAGIKARP) { Level(1); MaxHP(11); HP(11); }
OPPONENT(SPECIES_GLALIE);
} WHEN {
TURN { MOVE(opponent, MOVE_HAIL); }
} SCENE {
HP_BAR(player, damage: 1);
}
}

View File

@ -82,3 +82,15 @@ DOUBLE_BATTLE_TEST("Sandstorm deals damage based on turn order")
HP_BAR(playerRight);
}
}
SINGLE_BATTLE_TEST("Sandstorm damage rounds properly when maxHP < 16")
{
GIVEN {
PLAYER(SPECIES_MAGIKARP) { Level(1); MaxHP(11); HP(11); }
OPPONENT(SPECIES_SANDSLASH);
} WHEN {
TURN { MOVE(opponent, MOVE_SANDSTORM); }
} SCENE {
HP_BAR(player, damage: 1);
}
}