Add type checking for hold item effects (#6619)

This commit is contained in:
Bassoonian 2025-04-15 23:33:00 +02:00 committed by GitHub
parent 446521f200
commit 512368fd03
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 150 additions and 110 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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];

View File

@ -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)

View File

@ -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))

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;