Fix UB when accessing move result flags (#6030)
Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
parent
ed0c9a4671
commit
75d5edad08
@ -248,6 +248,7 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk,
|
|||||||
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
|
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
|
||||||
uq4_12_t GetTypeModifier(u32 atkType, u32 defType);
|
uq4_12_t GetTypeModifier(u32 atkType, u32 defType);
|
||||||
uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType);
|
uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType);
|
||||||
|
void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags);
|
||||||
s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler);
|
s32 GetStealthHazardDamage(enum TypeSideHazard hazardType, u32 battler);
|
||||||
s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp);
|
s32 GetStealthHazardDamageByTypesAndHP(enum TypeSideHazard hazardType, u8 type1, u8 type2, u32 maxHp);
|
||||||
bool32 CanMegaEvolve(u32 battler);
|
bool32 CanMegaEvolve(u32 battler);
|
||||||
|
|||||||
@ -727,6 +727,8 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc
|
|||||||
for (i = firstId; i < lastId; i++)
|
for (i = firstId; i < lastId; i++)
|
||||||
{
|
{
|
||||||
u16 species, monAbility;
|
u16 species, monAbility;
|
||||||
|
uq4_12_t typeMultiplier;
|
||||||
|
u16 moveFlags = 0;
|
||||||
|
|
||||||
if (!IsValidForBattle(&party[i]))
|
if (!IsValidForBattle(&party[i]))
|
||||||
continue;
|
continue;
|
||||||
@ -743,8 +745,9 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc
|
|||||||
|
|
||||||
species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG);
|
species = GetMonData(&party[i], MON_DATA_SPECIES_OR_EGG);
|
||||||
monAbility = GetMonAbility(&party[i]);
|
monAbility = GetMonAbility(&party[i]);
|
||||||
CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility);
|
typeMultiplier = CalcPartyMonTypeEffectivenessMultiplier(gLastLandedMoves[battler], species, monAbility);
|
||||||
if (gBattleStruct->moveResultFlags[BATTLE_OPPOSITE(battler)] & flags)
|
UpdateMoveResultFlags(typeMultiplier, &moveFlags);
|
||||||
|
if (moveFlags & flags)
|
||||||
{
|
{
|
||||||
battlerIn1 = gLastHitBy[battler];
|
battlerIn1 = gLastHitBy[battler];
|
||||||
|
|
||||||
|
|||||||
@ -10654,27 +10654,27 @@ static inline void TryNoticeIllusionInTypeEffectiveness(u32 move, u32 moveType,
|
|||||||
RecordAbilityBattle(battlerDef, ABILITY_ILLUSION);
|
RecordAbilityBattle(battlerDef, ABILITY_ILLUSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateMoveResultFlags(uq4_12_t modifier, u32 battler)
|
void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags)
|
||||||
{
|
{
|
||||||
if (modifier == UQ_4_12(0.0))
|
if (modifier == UQ_4_12(0.0))
|
||||||
{
|
{
|
||||||
gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_DOESNT_AFFECT_FOE;
|
*resultFlags |= MOVE_RESULT_DOESNT_AFFECT_FOE;
|
||||||
gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE);
|
*resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE);
|
||||||
gBattleStruct->blunderPolicy = FALSE; // Don't activate if missed
|
gBattleStruct->blunderPolicy = FALSE; // Don't activate if missed
|
||||||
}
|
}
|
||||||
else if (modifier == UQ_4_12(1.0))
|
else if (modifier == UQ_4_12(1.0))
|
||||||
{
|
{
|
||||||
gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
*resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
||||||
}
|
}
|
||||||
else if (modifier > UQ_4_12(1.0))
|
else if (modifier > UQ_4_12(1.0))
|
||||||
{
|
{
|
||||||
gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_SUPER_EFFECTIVE;
|
*resultFlags |= MOVE_RESULT_SUPER_EFFECTIVE;
|
||||||
gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
*resultFlags &= ~(MOVE_RESULT_NOT_VERY_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
||||||
}
|
}
|
||||||
else //if (modifier < UQ_4_12(1.0))
|
else //if (modifier < UQ_4_12(1.0))
|
||||||
{
|
{
|
||||||
gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
|
*resultFlags |= MOVE_RESULT_NOT_VERY_EFFECTIVE;
|
||||||
gBattleStruct->moveResultFlags[battler] &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
*resultFlags &= ~(MOVE_RESULT_SUPER_EFFECTIVE | MOVE_RESULT_DOESNT_AFFECT_FOE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10760,7 +10760,7 @@ uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (recordAbilities)
|
if (recordAbilities)
|
||||||
UpdateMoveResultFlags(modifier, battlerDef);
|
UpdateMoveResultFlags(modifier, &gBattleStruct->moveResultFlags[battlerDef]);
|
||||||
return modifier;
|
return modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10781,7 +10781,6 @@ uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 a
|
|||||||
modifier = UQ_4_12(0.0);
|
modifier = UQ_4_12(0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateMoveResultFlags(modifier, speciesDef);
|
|
||||||
return modifier;
|
return modifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user