Add type checking for hold item effects (#6619)
This commit is contained in:
parent
446521f200
commit
512368fd03
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user