From 512368fd0381b11e03714d796e142b4d7bf19160 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Tue, 15 Apr 2025 23:33:00 +0200 Subject: [PATCH] Add type checking for hold item effects (#6619) --- include/battle_ai_util.h | 16 +++---- include/battle_main.h | 5 +- include/battle_script_commands.h | 4 +- include/battle_util.h | 10 ++-- src/battle_ai_main.c | 12 +++-- src/battle_ai_switch_items.c | 10 ++-- src/battle_ai_util.c | 34 ++++++------- src/battle_debug.c | 6 +-- src/battle_dynamax.c | 2 +- src/battle_end_turn.c | 10 ++-- src/battle_main.c | 22 +++++---- src/battle_script_commands.c | 34 ++++++------- src/battle_terastal.c | 2 +- src/battle_util.c | 82 +++++++++++++++++++++----------- src/battle_z_move.c | 6 +-- src/pokemon.c | 3 +- test/test_runner_battle.c | 2 +- 17 files changed, 150 insertions(+), 110 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 78efa5183b..aa54d022ca 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -71,7 +71,7 @@ u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits); bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod); s32 AI_DecideKnownAbilityForTurn(u32 battlerId); -u32 AI_DecideHoldEffectForTurn(u32 battlerId); +enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId); bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); u32 AI_GetWeather(void); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); @@ -95,7 +95,7 @@ bool32 IsStatBoostingBerry(u32 item); bool32 CanKnockOffItem(u32 battler, u32 item); bool32 IsAbilityOfRating(u32 ability, s8 rating); bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability); -bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move); +bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move); bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove); u32 AI_GetBattlerAbility(u32 battler); @@ -115,7 +115,7 @@ bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility); bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility); // move checks -bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect); +bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category); s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo); struct SimulatedDamage AI_CalcDamageSaveBattlers(u32 move, u32 battlerAtk, u32 battlerDef, uq4_12_t *typeEffectiveness, bool32 considerZPower); @@ -147,11 +147,11 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMove(u32 move); bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move); void ProtectChecks(u32 battlerAtk, u32 battlerDef, u32 move, u32 predictedMove, s32 *score); -bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect); -bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect); -bool32 ShouldSetSnow(u32 battler, u32 ability, u32 holdEffect); -bool32 ShouldSetRain(u32 battlerAtk, u32 ability, u32 holdEffect); -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect); +bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); +bool32 ShouldSetRain(u32 battlerAtk, u32 ability, enum ItemHoldEffect holdEffect); +bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect); bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef); bool32 IsHealingMove(u32 move); bool32 HasHealingEffect(u32 battler); diff --git a/include/battle_main.h b/include/battle_main.h index 2d2483d84b..3ec100e4aa 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -3,6 +3,7 @@ #include "pokemon.h" #include "data.h" +#include "constants/hold_effects.h" // For displaying a multi battle partner's Pokémon in the party menu struct MultiPartnerMenuPokemon @@ -69,12 +70,12 @@ u8 IsRunningFromBattleImpossible(u32 battler); void SwitchTwoBattlersInParty(u32 battler, u32 battler2); void SwitchPartyOrder(u32 battlerId); void SwapTurnOrder(u8 id1, u8 id2); -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect); +u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect); u32 GetBattlerTotalSpeedStat(u32 battler); s32 GetChosenMovePriority(u32 battler, u32 ability); s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move); s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, - u32 holdEffectBattler1, u32 holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); + enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2); s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index ead678e993..23cec12e24 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -22,8 +22,8 @@ struct PickupItem u8 percentage[10]; }; -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk); -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk); +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk); s32 GetCritHitOdds(s32 critChanceIndex); u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); u8 GetBattlerTurnOrderNum(u8 battlerId); diff --git a/include/battle_util.h b/include/battle_util.h index 9748beee4e..0a95984ccd 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -240,9 +240,9 @@ void HandleAction_RunBattleScript(void); u32 SetRandomTarget(u32 battler); u32 GetBattleMoveTarget(u16 move, u8 setTarget); u8 GetAttackerObedienceForAction(); -u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating); -u32 GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); -u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating); +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating); +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility); u32 GetBattlerHoldEffectParam(u32 battler); bool32 IsMoveMakingContact(u32 move, u32 battlerAtk); bool32 IsBattlerGrounded(u32 battler); @@ -252,8 +252,8 @@ u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer); u32 CalcFuryCutterBasePower(u32 basePower, u32 furyCutterCounter); s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedBasePower); s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef); -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk, u32 holdEffectDef); + u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef); +s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef); uq4_12_t CalcTypeEffectivenessMultiplier(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 defAbility, bool32 recordAbilities); uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef); uq4_12_t GetTypeModifier(u32 atkType, u32 defType); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 1c6698820e..ebeaaac94d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -36,7 +36,7 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi); static u32 ChooseMoveOrAction_Doubles(u32 battlerAi); static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef); static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAi, u32 battlerDef); -static bool32 IsPinchBerryItemEffect(u32 holdEffect); +static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect); // ewram EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests @@ -3145,7 +3145,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return score; } -static bool32 IsPinchBerryItemEffect(u32 holdEffect) +static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) { switch (holdEffect) { @@ -3159,9 +3159,9 @@ static bool32 IsPinchBerryItemEffect(u32 holdEffect) case HOLD_EFFECT_CUSTAP_BERRY: case HOLD_EFFECT_MICLE_BERRY: return TRUE; + default: + return FALSE; } - - return FALSE; } static s32 CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) @@ -3291,7 +3291,7 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) { struct AiLogicData *aiData = AI_DATA; - u32 holdEffect = aiData->holdEffects[battlerAtk]; + enum ItemHoldEffect holdEffect = aiData->holdEffects[battlerAtk]; s32 score = 0; @@ -3311,6 +3311,8 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } } break; + default: + break; } return score; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 3f742536fd..8344f41d8a 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -630,7 +630,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { bool32 switchMon = FALSE; u16 monAbility = AI_DATA->abilities[battler]; - u16 holdEffect = AI_DATA->holdEffects[battler]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); bool32 hasStatRaised = AnyStatIsRaised(battler); @@ -993,7 +993,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); u32 lastUsedMove = AI_DATA->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; @@ -1489,7 +1489,7 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon static s32 GetSwitchinWeatherImpact(void) { s32 weatherImpact = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - u32 holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); if (HasWeatherEffect()) { @@ -1553,7 +1553,7 @@ static s32 GetSwitchinWeatherImpact(void) static u32 GetSwitchinRecurringHealing(void) { u32 recurringHealing = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - u32 holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_KLUTZ) @@ -1587,7 +1587,7 @@ static u32 GetSwitchinRecurringHealing(void) static u32 GetSwitchinRecurringDamage(void) { u32 passiveDamage = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - u32 holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0a9145d72b..2839096a59 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -343,7 +343,7 @@ bool32 AI_BattlerAtMaxHp(u32 battlerId) bool32 AI_CanBattlerEscape(u32 battler) { - u32 holdEffect = AI_DATA->holdEffects[battler]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battler]; if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -401,7 +401,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) } // move checks -bool32 IsAffectedByPowder(u32 battler, u32 ability, u32 holdEffect) +bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { if (ability == ABILITY_OVERCOAT || (B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS)) @@ -568,7 +568,7 @@ static inline void AI_RestoreBattlerTypes(u32 battlerAtk, u32 *types) gBattleMons[battlerAtk].types[2] = types[2]; } -static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage, u32 holdEffectAtk, u32 abilityAtk) +static inline void CalcDynamicMoveDamage(struct DamageCalculationData *damageCalcData, u16 *medianDamage, u16 *minimumDamage, u16 *maximumDamage, enum ItemHoldEffect holdEffectAtk, u32 abilityAtk) { u32 move = damageCalcData->move; u32 effect = GetMoveEffect(move); @@ -1124,8 +1124,8 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) { u32 speedBattlerAI, speedBattler; - u32 holdEffectAI = AI_DATA->holdEffects[battlerAI]; - u32 holdEffectPlayer = AI_DATA->holdEffects[battler]; + enum ItemHoldEffect holdEffectAI = AI_DATA->holdEffects[battlerAI]; + enum ItemHoldEffect holdEffectPlayer = AI_DATA->holdEffects[battler]; u32 abilityAI = AI_DATA->abilities[battlerAI]; u32 abilityPlayer = AI_DATA->abilities[battler]; @@ -1424,9 +1424,9 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) return ABILITY_NONE; // Unknown. } -u32 AI_DecideHoldEffectForTurn(u32 battlerId) +enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) { - u32 holdEffect; + enum ItemHoldEffect holdEffect; if (!IsAiBattlerAware(battlerId)) holdEffect = AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; @@ -1644,7 +1644,7 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) { - u32 holdEffect = AI_DATA->holdEffects[battlerDef]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battlerDef]; u32 accuracy = AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; gPotentialItemEffectBattler = battlerDef; @@ -1674,7 +1674,7 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil return FALSE; } -bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) +bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SANDSTORM) @@ -1695,7 +1695,7 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) return FALSE; } -bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) +bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) @@ -1718,7 +1718,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) return FALSE; } -bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) +bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) { u32 weather = AI_GetWeather(); if (weather & B_WEATHER_RAIN) @@ -1739,7 +1739,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) return FALSE; } -bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) +bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffect) { u32 weather = AI_GetWeather(); if (weather & B_WEATHER_SUN) @@ -1765,7 +1765,7 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) return FALSE; } -bool32 ShouldSetSnow(u32 battler, u32 ability, u32 holdEffect) +bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { u32 weather = AI_GetWeather(); if (weather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) @@ -2691,7 +2691,7 @@ static u32 GetTrapDamage(u32 battlerId) { // ai has no knowledge about turns remaining u32 damage = 0; - u32 holdEffect = AI_DATA->holdEffects[gBattleStruct->wrappedBy[battlerId]]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[gBattleStruct->wrappedBy[battlerId]]; if (gBattleMons[battlerId].status2 & STATUS2_WRAPPED) { if (holdEffect == HOLD_EFFECT_BINDING_BAND) @@ -2755,7 +2755,7 @@ static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) static u32 GetWeatherDamage(u32 battlerId) { u32 ability = AI_DATA->abilities[battlerId]; - u32 holdEffect = AI_DATA->holdEffects[battlerId]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battlerId]; u32 damage = 0; u32 weather = AI_GetWeather(); if (!weather) @@ -2851,7 +2851,7 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler) { struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler]; u32 ability = GetMonAbility(mon); // we know our own party data - u32 holdEffect; + enum ItemHoldEffect holdEffect; u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 flags = gSideStatuses[GetBattlerSide(currBattler)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_STEELSURGE | SIDE_STATUS_STICKY_WEB | SIDE_STATUS_TOXIC_SPIKES); s32 hazardDamage = 0; @@ -4264,7 +4264,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score } } -bool32 AI_MoveMakesContact(u32 ability, u32 holdEffect, u32 move) +bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move) { if (MoveMakesContact(move) && ability != ABILITY_LONG_REACH diff --git a/src/battle_debug.c b/src/battle_debug.c index 93872bde45..efdebf6377 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -278,7 +278,7 @@ enum }; // Static Declarations -static const u8 *GetHoldEffectName(u16 holdEffect); +static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect); // const rom data static const u8 sText_Moves[] = _("Moves"); @@ -1130,7 +1130,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data) if (GetBattlerSide(i) == B_SIDE_PLAYER && IsBattlerAlive(i)) { u16 ability = AI_DATA->abilities[i]; - u16 holdEffect = AI_DATA->holdEffects[i]; + enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[i]; u16 item = AI_DATA->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilitiesInfo[ability].name, x, 0, 0, NULL); @@ -2617,7 +2617,7 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_OGERPON_MASK] = sText_HoldEffectOgerponMask, [HOLD_EFFECT_BERSERK_GENE] = sText_HoldEffectBerserkGene, }; -static const u8 *GetHoldEffectName(u16 holdEffect) +static const u8 *GetHoldEffectName(enum ItemHoldEffect holdEffect) { if (holdEffect > ARRAY_COUNT(sHoldEffectNames)) return sHoldEffectNames[0]; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 007b5b20ee..07efc111a5 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -74,7 +74,7 @@ static const struct GMaxMove sGMaxMoveTable[] = bool32 CanDynamax(u32 battler) { u16 species = gBattleMons[battler].species; - u16 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); // Prevents Zigzagoon from dynamaxing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && GetBattlerSide(battler) == B_SIDE_OPPONENT) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 531c5a778f..a511b6698d 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -489,7 +489,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) } case FIRST_EVENT_BLOCK_HEAL_ITEMS: { - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); switch (holdEffect) { case HOLD_EFFECT_LEFTOVERS: @@ -497,6 +497,8 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler) if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) effect = TRUE; break; + default: + break; } gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId++; @@ -1419,7 +1421,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) } case THIRD_EVENT_BLOCK_ITEMS: { - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); switch (holdEffect) { case HOLD_EFFECT_FLAME_ORB: @@ -1432,6 +1434,8 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler) if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) effect = TRUE; break; + default: + break; } gBattleStruct->eventBlockCounter = 0; gBattleStruct->turnEffectsBattlerId++; @@ -1482,7 +1486,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler) } case FOURTH_EVENT_BLOCK_EJECT_PACK: { - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); if (holdEffect == HOLD_EFFECT_EJECT_PACK) { if (ItemBattleEffects(ITEMEFFECT_NORMAL, battler, FALSE)) diff --git a/src/battle_main.c b/src/battle_main.c index 6d7a5334b7..21d74e3a34 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4012,7 +4012,8 @@ void BattleTurnPassed(void) u8 IsRunningFromBattleImpossible(u32 battler) { - u32 holdEffect, i; + enum ItemHoldEffect holdEffect; + u32 i; if (FlagGet(B_FLAG_NO_RUNNING)) { @@ -4722,7 +4723,7 @@ void SwapTurnOrder(u8 id1, u8 id2) } // For AI, so it doesn't 'cheat' by knowing player's ability -u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) +u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) { u32 speed = gBattleMons[battler].speed; @@ -4792,7 +4793,7 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, u32 holdEffect) u32 GetBattlerTotalSpeedStat(u32 battler) { u32 ability = GetBattlerAbility(battler); - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect); } @@ -4848,7 +4849,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move) // Function for AI with variables provided as arguments to speed the computation time s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2, - u32 holdEffectBattler1, u32 holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) + enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2) { u32 strikesFirst = 0; @@ -4915,9 +4916,9 @@ s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenM s32 priority1 = 0, priority2 = 0; u32 ability1 = GetBattlerAbility(battler1); u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1); - u32 holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2); - u32 holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); u32 ability2 = GetBattlerAbility(battler2); if (!ignoreChosenMoves) @@ -5252,8 +5253,8 @@ static void TryChangeTurnOrder(void) static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom) { u32 ability1 = GetBattlerAbility(battler1); - u32 holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); - u32 holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); + enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1, TRUE); + enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2, TRUE); u32 ability2 = GetBattlerAbility(battler2); // Battler 1 @@ -5834,8 +5835,9 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) { u32 moveType = GetMoveType(move); u32 moveEffect = GetMoveEffect(move); - u32 species, heldItem, holdEffect, ability, type1, type2, type3; + u32 species, heldItem, ability, type1, type2, type3; bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE; + enum ItemHoldEffect holdEffect; if (move == MOVE_STRUGGLE) return TYPE_NORMAL; @@ -6060,7 +6062,7 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) { u32 moveType; u32 heldItem = gBattleMons[battler].item; - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); gBattleStruct->dynamicMoveType = 0; gBattleStruct->ateBoost[battler] = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3256b472a4..9b489b4dc9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1699,7 +1699,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u u32 effect = GetMoveEffect(move); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); if (move == NO_ACC_CALC_CHECK_LOCK_ON) { @@ -1891,7 +1891,7 @@ static inline u32 GetCriticalHitOdds(u32 critChance) return sCriticalHitOdds[critChance]; } -static inline u32 IsBattlerLeekAffected(u32 battler, u32 holdEffect) +static inline u32 IsBattlerLeekAffected(u32 battler, enum ItemHoldEffect holdEffect) { if (holdEffect == HOLD_EFFECT_LEEK) { @@ -1901,7 +1901,7 @@ static inline u32 IsBattlerLeekAffected(u32 battler, u32 holdEffect) return FALSE; } -static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect) +static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffect holdEffect) { u32 critStageIncrease = 0; @@ -1926,7 +1926,7 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, u32 holdEffect) return critStageIncrease; } -s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) +s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) { s32 critChance = 0; @@ -1975,7 +1975,7 @@ s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordA // Threshold = Base Speed / 2 // High crit move = 8 * (Base Speed / 2) // Focus Energy = 4 * (Base Speed / 2) -s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk) +s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk) { s32 critChance = 0; s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove); @@ -2043,7 +2043,7 @@ static void Cmd_critcalc(void) u32 moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove); bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove); u32 abilityAtk = GetBattlerAbility(gBattlerAttacker); - u32 holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker, TRUE); gPotentialItemEffectBattler = gBattlerAttacker; for (u32 battlerDef = 0; battlerDef < gBattlersCount; battlerDef++) @@ -2163,7 +2163,8 @@ static void Cmd_adjustdamage(void) { CMD_ARGS(); - u8 holdEffect, param; + enum ItemHoldEffect holdEffect; + u8 param; u32 battlerDef; u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); @@ -5080,7 +5081,7 @@ static bool32 BattleTypeAllowsExp(void) static u32 GetMonHoldEffect(struct Pokemon *mon) { - u32 holdEffect; + enum ItemHoldEffect holdEffect; u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); if (item == ITEM_ENIGMA_BERRY_E_READER) @@ -5099,7 +5100,7 @@ static void Cmd_getexp(void) { CMD_ARGS(u8 battler); - u32 holdEffect; + enum ItemHoldEffect holdEffect; s32 i; // also used as stringId u8 *expMonId = &gBattleStruct->expGetterMonId; u32 currLvl; @@ -6249,7 +6250,7 @@ static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent) return battler; } -static inline bool32 IsProtectivePadsProtected(u32 battler, u32 holdEffect) +static inline bool32 IsProtectivePadsProtected(u32 battler, enum ItemHoldEffect holdEffect) { if (holdEffect != HOLD_EFFECT_PROTECTIVE_PADS) return FALSE; @@ -6260,7 +6261,7 @@ static inline bool32 IsProtectivePadsProtected(u32 battler, u32 holdEffect) static inline bool32 IsProtectEffectAffected(u32 battler, u32 move) { - u32 holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); if (IsProtectivePadsProtected(battler, holdEffect)) return TRUE; @@ -6441,7 +6442,7 @@ static void Cmd_moveend(void) s32 i; bool32 effect = FALSE; u32 moveType = 0; - u32 holdEffectAtk = 0; + enum ItemHoldEffect holdEffectAtk = HOLD_EFFECT_NONE; u32 endMode, endState; u32 originallyUsedMove; @@ -12427,7 +12428,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr { bool32 certain = FALSE; bool32 notProtectAffected = FALSE; - u32 index, battler, battlerAbility, battlerHoldEffect; + u32 index, battler, battlerAbility; + enum ItemHoldEffect battlerHoldEffect; bool32 affectsUser = (flags & MOVE_EFFECT_AFFECTS_USER); bool32 mirrorArmored = (flags & STAT_CHANGE_MIRROR_ARMOR); @@ -13110,7 +13112,7 @@ static void Cmd_tryKO(void) CMD_ARGS(const u8 *failInstr); bool32 lands = FALSE; - u32 holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget, TRUE); u16 targetAbility = GetBattlerAbility(gBattlerTarget); u32 rand = Random() % 100; u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget); @@ -17135,7 +17137,7 @@ u8 GetFirstFaintedPartyIndex(u8 battler) void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler) { - u32 holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); + enum ItemHoldEffect holdEffect = GetMonHoldEffect(&gPlayerParty[expGetterMonId]); if (IsTradedMon(&gPlayerParty[expGetterMonId])) *expAmount = (*expAmount * 150) / 100; @@ -17494,7 +17496,7 @@ void BS_SetRemoveTerrain(void) } else { - u32 atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); + enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(gBattlerAttacker, TRUE); gFieldStatuses &= ~STATUS_FIELD_TERRAIN_ANY; gFieldStatuses |= statusFlag; diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 0c29d20f27..c87eb094bd 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -61,7 +61,7 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) // Returns whether a battler can Terastallize. bool32 CanTerastallize(u32 battler) { - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; diff --git a/src/battle_util.c b/src/battle_util.c index 8b5d32afef..c6235497f5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -1281,7 +1281,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u32 limitations = 0; u8 moveId = gBattleResources->bufferB[battler][2] & ~RET_GIMMICK; u32 move = gBattleMons[battler].moves[moveId]; - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; u32 moveEffect = GetMoveEffect(move); @@ -1524,7 +1524,7 @@ u32 TrySetCantSelectMoveBattleScript(u32 battler) u8 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check) { u32 move, moveEffect; - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; @@ -6086,7 +6086,7 @@ u32 RestoreWhiteHerbStats(u32 battler) return effect; } -static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect) +static u8 ItemEffectMoveEnd(u32 battler, enum ItemHoldEffect holdEffect) { u8 effect = 0; @@ -6301,6 +6301,8 @@ static u8 ItemEffectMoveEnd(u32 battler, u16 holdEffect) case HOLD_EFFECT_MIRROR_HERB: effect = TryConsumeMirrorHerb(battler, ITEMEFFECT_NONE); break; + default: + break; } return effect; @@ -6370,7 +6372,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { u32 moveType = 0; enum ItemEffect effect = ITEM_NO_EFFECT; - u32 battlerHoldEffect = 0, atkHoldEffect = 0; + enum ItemHoldEffect battlerHoldEffect = 0, atkHoldEffect = 0; u32 atkHoldEffectParam = 0; u32 atkItem = 0; @@ -6590,6 +6592,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_BOOSTER_ENERGY: effect = TryBoosterEnergy(battler, caseID); break; + default: + break; } if (effect != 0) { @@ -6806,6 +6810,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_BOOSTER_ENERGY: effect = TryBoosterEnergy(battler, caseID); break; + default: + break; } if (effect != 0) @@ -6887,6 +6893,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; } break; + default: + break; } break; case ITEMEFFECT_LIFEORB_SHELLBELL: @@ -6945,6 +6953,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) gBattlescriptCurrInstr = BattleScript_AttackerItemStatRaise; } break; + default: + break; } break; case ITEMEFFECT_TARGET: @@ -7111,6 +7121,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) effect = ITEM_EFFECT_OTHER; } break; + default: + break; } } break; @@ -7149,6 +7161,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) PREPARE_ITEM_BUFFER(gBattleTextBuff1, gLastUsedItem); } break; + default: + break; } if (effect == ITEM_STATUS_CHANGE) @@ -7172,6 +7186,8 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_EJECT_PACK: effect = TryEjectPack(battler, ITEMEFFECT_ON_SWITCH_IN); break; + default: + break; } break; } @@ -7414,17 +7430,17 @@ u8 GetAttackerObedienceForAction() } } -u32 GetBattlerHoldEffect(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffect(u32 battler, bool32 checkNegating) { return GetBattlerHoldEffectInternal(battler, checkNegating, TRUE); } -u32 GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating) +enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler, bool32 checkNegating) { return GetBattlerHoldEffectInternal(battler, checkNegating, FALSE); } -u32 GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility) +enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, bool32 checkNegating, bool32 checkAbility) { if (checkNegating) { @@ -7462,7 +7478,7 @@ u32 GetBattlerHoldEffectParam(u32 battler) bool32 IsMoveMakingContact(u32 move, u32 battlerAtk) { - u32 atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); + enum ItemHoldEffect atkHoldEffect = GetBattlerHoldEffect(battlerAtk, TRUE); if (!MoveMakesContact(move)) { @@ -7569,7 +7585,7 @@ u32 GetProtectType(enum ProtectMethod method) // Only called directly when calculating damage type effectiveness static bool32 IsBattlerGroundedInverseCheck(u32 battler, bool32 considerInverse) { - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); if (holdEffect == HOLD_EFFECT_IRON_BALL) return TRUE; @@ -7614,7 +7630,7 @@ u32 GetBattlerWeight(u32 battler) u32 i; u32 weight = GetSpeciesWeight(gBattleMons[battler].species); u32 ability = GetBattlerAbility(battler); - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); if (ability == ABILITY_HEAVY_METAL) weight *= 2; @@ -8068,7 +8084,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData return basePower; } -static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, u32 holdEffectAtk, u32 weather) +static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) { u32 i; u32 holdEffectParamAtk; @@ -8383,6 +8399,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * if (GET_BASE_SPECIES_ID(gBattleMons[battlerAtk].species) == SPECIES_OGERPON) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; + default: + break; } // Terastallization boosts weak, non-priority, non-multi hit moves after modifiers to 60 BP. @@ -8403,7 +8421,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * return uq4_12_multiply_by_int_half_down(modifier, basePower); } -static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, u32 holdEffectAtk, u32 weather) +static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) { u8 atkStage; u32 atkStat; @@ -8656,6 +8674,8 @@ static inline u32 CalcAttackStat(struct DamageCalculationData *damageCalcData, u if (IsBattleMoveSpecial(move) && GetActiveGimmick(battlerAtk) != GIMMICK_DYNAMAX) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + default: + break; } // The offensive stats of a Player's Pokémon are boosted by x1.1 (+10%) if they have the 1st badge and 7th badges. @@ -8685,7 +8705,7 @@ static bool32 CanEvolve(u32 species) return FALSE; } -static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, u32 holdEffectDef, u32 weather) +static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectDef, u32 weather) { bool32 usesDefStat; u8 defStage; @@ -8822,6 +8842,8 @@ static inline u32 CalcDefenseStat(struct DamageCalculationData *damageCalcData, && !usesDefStat) modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5)); break; + default: + break; } // sandstorm sp.def boost for rock types @@ -8877,7 +8899,7 @@ static inline uq4_12_t GetSameTypeAttackBonusModifier(struct DamageCalculationDa } // Utility Umbrella holders take normal damage from what would be rain- and sun-weakened attacks. -static uq4_12_t GetWeatherDamageModifier(struct DamageCalculationData *damageCalcData, u32 holdEffectAtk, u32 holdEffectDef, u32 weather) +static uq4_12_t GetWeatherDamageModifier(struct DamageCalculationData *damageCalcData, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 weather) { u32 move = damageCalcData->move; u32 moveType = damageCalcData->moveType; @@ -9061,7 +9083,7 @@ static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef return UQ_4_12(1.0); } -static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, u32 holdEffectAtk) +static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, enum ItemHoldEffect holdEffectAtk) { u32 metronomeTurns; uq4_12_t metronomeBoostBase; @@ -9081,11 +9103,13 @@ static inline uq4_12_t GetAttackerItemsModifier(u32 battlerAtk, uq4_12_t typeEff case HOLD_EFFECT_LIFE_ORB: return UQ_4_12_FLOORED(1.3); break; + default: + break; } return UQ_4_12(1.0); } -static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityDef, u32 holdEffectDef) +static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityDef, enum ItemHoldEffect holdEffectDef) { u32 battlerDef = damageCalcData->battlerDef; u32 moveType = damageCalcData->moveType; @@ -9105,6 +9129,8 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *da return (abilityDef == ABILITY_RIPEN) ? UQ_4_12(0.25) : UQ_4_12(0.5); } break; + default: + break; } return UQ_4_12(1.0); } @@ -9120,7 +9146,7 @@ static inline uq4_12_t GetDefenderItemsModifier(struct DamageCalculationData *da // Please Note: Fixed Point Multiplication is not associative. // The order of operations is relevant. static inline uq4_12_t GetOtherModifiers(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk, u32 holdEffectDef) + u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) { u32 battlerAtk = damageCalcData->battlerAtk; u32 battlerDef = damageCalcData->battlerDef; @@ -9166,7 +9192,7 @@ static inline uq4_12_t GetOtherModifiers(struct DamageCalculationData *damageCal } while (0) static inline s32 DoMoveDamageCalcVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather, - u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef) + enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) { s32 dmg; u32 userFinalAttack; @@ -9208,7 +9234,7 @@ static inline s32 DoMoveDamageCalcVars(struct DamageCalculationData *damageCalcD return dmg; } -s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, u32 holdEffectAtk, u32 holdEffectDef) +s32 ApplyModifiersAfterDmgRoll(s32 dmg, struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef) { if (GetActiveGimmick(damageCalcData->battlerAtk) == GIMMICK_TERA) DAMAGE_APPLY_MODIFIER(GetTeraMultiplier(damageCalcData->battlerAtk, damageCalcData->moveType)); @@ -9256,7 +9282,8 @@ static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalc static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, u32 weather) { - u32 holdEffectAtk, holdEffectDef, abilityAtk, abilityDef; + enum ItemHoldEffect holdEffectAtk, holdEffectDef; + u32 abilityAtk, abilityDef; if (typeEffectivenessModifier == UQ_4_12(0.0)) return 0; @@ -9274,7 +9301,7 @@ static inline s32 DoMoveDamageCalc(struct DamageCalculationData *damageCalcData, } static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, - u32 weather, u32 holdEffectDef, u32 abilityDef) + u32 weather, enum ItemHoldEffect holdEffectDef, u32 abilityDef) { s32 dmg; u32 userFinalAttack; @@ -9323,7 +9350,8 @@ static inline s32 DoFutureSightAttackDamageCalcVars(struct DamageCalculationData static inline s32 DoFutureSightAttackDamageCalc(struct DamageCalculationData *damageCalcData, uq4_12_t typeEffectivenessModifier, u32 weather) { - u32 holdEffectDef, abilityDef; + enum ItemHoldEffect holdEffectDef; + u32 abilityDef; if (typeEffectivenessModifier == UQ_4_12(0.0)) return 0; @@ -9371,7 +9399,7 @@ s32 CalculateMoveDamage(struct DamageCalculationData *damageCalcData, u32 fixedB // for AI so that typeEffectivenessModifier, weather, abilities and holdEffects are calculated only once s32 CalculateMoveDamageVars(struct DamageCalculationData *damageCalcData, u32 fixedBasePower, uq4_12_t typeEffectivenessModifier, - u32 weather, u32 holdEffectAtk, u32 holdEffectDef, u32 abilityAtk, u32 abilityDef) + u32 weather, enum ItemHoldEffect holdEffectAtk, enum ItemHoldEffect holdEffectDef, u32 abilityAtk, u32 abilityDef) { s32 dmg = DoFixedDamageMoveCalc(damageCalcData); if (dmg != INT32_MAX) @@ -9719,7 +9747,7 @@ bool32 DoesSpeciesUseHoldItemToChangeForm(u16 species, u16 heldItemId) bool32 CanMegaEvolve(u32 battler) { - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); // Check if Player has a Mega Ring. if (!TESTING @@ -9757,7 +9785,7 @@ bool32 CanMegaEvolve(u32 battler) bool32 CanUltraBurst(u32 battler) { - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); // Check if Player has a Z-Ring if (!TESTING && (GetBattlerPosition(battler) == B_POSITION_PLAYER_LEFT @@ -10041,7 +10069,7 @@ bool32 DoBattlersShareType(u32 battler1, u32 battler2) bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) { u16 species = gBattleMons[battler].species; - u16 holdEffect = ItemId_GetHoldEffect(itemId); + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(itemId); // Mail can be stolen now if (itemId == ITEM_ENIGMA_BERRY_E_READER) @@ -10416,7 +10444,7 @@ void TrySaveExchangedItem(u32 battler, u16 stolenItem) bool32 IsBattlerAffectedByHazards(u32 battler, bool32 toxicSpikes) { bool32 ret = TRUE; - u32 holdEffect = GetBattlerHoldEffect(battler, TRUE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, TRUE); if (toxicSpikes && holdEffect == HOLD_EFFECT_HEAVY_DUTY_BOOTS && !IS_BATTLER_OF_TYPE(battler, TYPE_POISON)) { ret = FALSE; diff --git a/src/battle_z_move.c b/src/battle_z_move.c index dda776d8ad..01f2069304 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -113,7 +113,7 @@ bool32 IsZMove(u32 move) bool32 CanUseZMove(u32 battler) { - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); // Check if Player has Z-Power Ring. if (!TESTING && (battler == B_POSITION_PLAYER_LEFT @@ -144,7 +144,7 @@ bool32 CanUseZMove(u32 battler) u32 GetUsableZMove(u32 battler, u32 move) { u32 item = gBattleMons[battler].item; - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); if (holdEffect == HOLD_EFFECT_Z_CRYSTAL) { @@ -168,7 +168,7 @@ void ActivateZMove(u32 battler) bool32 IsViableZMove(u32 battler, u32 move) { u32 item; - u32 holdEffect = GetBattlerHoldEffect(battler, FALSE); + enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); int moveSlotIndex; item = gBattleMons[battler].item; diff --git a/src/pokemon.c b/src/pokemon.c index 29407b8961..e094764478 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4472,7 +4472,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u16 friendship; u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u16 upperPersonality = personality >> 16; - u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; + enum ItemHoldEffect holdEffect; + u32 currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; u16 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); const struct Evolution *evolutions = GetSpeciesEvolutions(species); diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index dde8549284..b0619505f6 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2116,7 +2116,7 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitGimmick && ctx->gimmick != GIMMICK_NONE) { u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); - u32 holdEffect = ItemId_GetHoldEffect(item); + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(item); u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 side = battlerId & BIT_SIDE;