feat: change defines in constants/abilities.h to an enum (#7006)

Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com>
This commit is contained in:
khbsd 2025-09-29 14:35:09 -05:00 committed by GitHub
parent f856f0cb66
commit e385c7f59f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
138 changed files with 1130 additions and 953 deletions

View File

@ -2,6 +2,7 @@
#define GUARD_BATTLE_H
// should they be included here or included individually by every file?
#include "constants/abilities.h"
#include "constants/battle.h"
#include "constants/form_change_types.h"
#include "battle_main.h"
@ -264,7 +265,7 @@ struct WishFutureKnock
struct AI_SavedBattleMon
{
u16 ability;
enum Ability ability;
u16 moves[MAX_MON_MOVES];
u16 heldItem;
u16 species:15;
@ -277,7 +278,7 @@ struct AiPartyMon
u16 species;
u16 item;
u16 heldEffect;
u16 ability;
enum Ability ability;
u16 level;
u16 moves[MAX_MON_MOVES];
u32 status;
@ -310,7 +311,7 @@ struct SimulatedDamage
// Ai Data used when deciding which move to use, computed only once before each turn's start.
struct AiLogicData
{
u16 abilities[MAX_BATTLERS_COUNT];
enum Ability abilities[MAX_BATTLERS_COUNT];
u16 items[MAX_BATTLERS_COUNT];
u16 holdEffects[MAX_BATTLERS_COUNT];
u8 holdEffectParams[MAX_BATTLERS_COUNT];
@ -354,7 +355,7 @@ struct AiThinkingStruct
struct BattleHistory
{
u16 abilities[MAX_BATTLERS_COUNT];
enum Ability abilities[MAX_BATTLERS_COUNT];
u8 itemEffects[MAX_BATTLERS_COUNT];
u16 usedMoves[MAX_BATTLERS_COUNT][MAX_MON_MOVES];
u16 moveHistory[MAX_BATTLERS_COUNT][AI_MOVE_HISTORY_COUNT]; // 3 last used moves for each battler
@ -714,7 +715,7 @@ struct BattleStruct
enum BattleIntroStates introState:8;
u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages
u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct
u16 tracedAbility[MAX_BATTLERS_COUNT];
enum Ability tracedAbility[MAX_BATTLERS_COUNT];
u16 hpBefore[MAX_BATTLERS_COUNT]; // Hp of battlers before using a move. For Berserk and Anger Shell.
struct Illusion illusion[MAX_BATTLERS_COUNT];
u8 soulheartBattlerId;
@ -1048,7 +1049,7 @@ extern u16 gChosenMove;
extern u16 gCalledMove;
extern s32 gBideDmg[MAX_BATTLERS_COUNT];
extern u16 gLastUsedItem;
extern u16 gLastUsedAbility;
extern enum Ability gLastUsedAbility;
extern u8 gBattlerAttacker;
extern u8 gBattlerTarget;
extern u8 gBattlerFainted;

View File

@ -45,7 +45,7 @@ void GetAIPartyIndexes(u32 battlerId, s32 *firstId, s32 *lastId);
void AI_TrySwitchOrUseItem(u32 battler);
u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType);
bool32 ShouldSwitch(u32 battler);
bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2);
bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2);
void ModifySwitchAfterMoveScoring(u32 battler);
#endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H

View File

@ -92,7 +92,7 @@ void ClearBattlerMoveHistory(u32 battlerId);
void RecordLastUsedMoveBy(u32 battlerId, u32 move);
void RecordAllMoves(u32 battler);
void RecordKnownMove(u32 battlerId, u32 move);
void RecordAbilityBattle(u32 battlerId, u32 abilityId);
void RecordAbilityBattle(u32 battlerId, enum Ability abilityId);
void ClearBattlerAbilityHistory(u32 battlerId);
void RecordItemEffectBattle(u32 battlerId, u32 itemEffect);
void ClearBattlerItemEffectHistory(u32 battlerId);
@ -114,9 +114,9 @@ u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcCon
u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext);
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);
enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId);
enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId);
bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move);
bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move);
u32 AI_GetWeather(void);
u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon);
enum WeatherState IsWeatherActive(u32 flags);
@ -125,21 +125,21 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, enum D
bool32 HasDamagingMove(u32 battler);
bool32 HasDamagingMoveOfType(u32 battler, u32 type);
u32 GetBattlerSecondaryDamage(u32 battlerId);
bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability);
bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability);
bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move);
bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability);
bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability);
bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move);
bool32 ShouldUseRecoilMove(u32 battlerAtk, u32 battlerDef, u32 recoilDmg, u32 moveIndex);
bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage);
bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent);
bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects moveEffect);
enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex);
enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex);
bool32 IsRecycleEncouragedItem(u32 item);
bool32 ShouldRestoreHpBerry(u32 battlerAtk, u32 item);
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, enum ItemHoldEffect holdEffect, u32 move);
bool32 IsAbilityOfRating(enum Ability ability, s8 rating);
bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability);
bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move);
bool32 IsConsideringZMove(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove);
void SetAIUsingGimmick(u32 battler, enum AIConsiderGimmick use);
@ -150,14 +150,14 @@ bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move);
// stat stage checks
bool32 AnyStatIsRaised(u32 battlerId);
bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData, u32 stat);
bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat);
bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat);
bool32 AreBattlersStatsMaxed(u32 battler);
u32 CountPositiveStatStages(u32 battlerId);
u32 CountNegativeStatStages(u32 battlerId);
// move checks
bool32 Ai_IsPriorityBlocked(u32 battlerAtk, u32 battlerDef, u32 move, struct AiLogicData *aiData);
bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect);
bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect);
bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, enum DamageCategory category);
enum MoveComparisonResult 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, enum AIConsiderGimmick considerGimmickAtk, enum AIConsiderGimmick considerGimmickDef);
@ -192,7 +192,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool
bool32 HasAnyKnownMove(u32 battlerId);
bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect);
bool32 IsNonVolatileStatusMove(u32 moveEffect);
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility);
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility);
bool32 IsHazardMove(u32 move);
bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move);
bool32 IsBattlerDamagedByStatus(u32 battler);
@ -223,32 +223,32 @@ bool32 IsHazardClearingMove(u32 move);
bool32 IsSubstituteEffect(enum BattleMoveEffects effect);
// status checks
bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability);
bool32 IsBattlerIncapacitated(u32 battler, u32 ability);
bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove);
bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability ability);
bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability);
bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove);
bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef);
bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove);
bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove);
bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility);
bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove);
bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove);
bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove);
bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility);
bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof);
u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move);
u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move);
bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 IsWakeupTurn(u32 battler);
bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId);
// ability logic
bool32 IsMoxieTypeAbility(u32 ability);
bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability);
bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability);
bool32 IsMoxieTypeAbility(enum Ability ability);
bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability);
bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability);
bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct AiLogicData *aiData);
void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData);
s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData);
s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData);
// partner logic
bool32 IsTargetingPartner(u32 battlerAtk, u32 battlerDef);
@ -305,7 +305,7 @@ bool32 IsBattlerItemEnabled(u32 battler);
bool32 IsBattlerPredictedToSwitch(u32 battler);
u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData);
u32 GetIncomingMoveSpeedCheck(u32 battler, u32 opposingBattler, struct AiLogicData *aiData);
bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData);
bool32 HasBattlerSideAbility(u32 battlerDef, enum Ability ability, struct AiLogicData *aiData);
bool32 IsNaturalEnemy(u32 speciesAttacker, u32 speciesTarget);
// These are for the purpose of not doubling up on moves during double battles.

View File

@ -126,7 +126,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 unused);
u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale);
u8 GetHPBarLevel(s16 hp, s16 maxhp);
void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle);
void CreateAbilityPopUp(u8 battlerId, enum Ability ability, bool32 isDoubleBattle);
void DestroyAbilityPopUp(u8 battlerId);
bool32 CanThrowLastUsedBall(void);
void TryHideLastUsedBall(void);

View File

@ -96,11 +96,11 @@ u8 IsRunningFromBattleImpossible(u32 battler);
void SwitchTwoBattlersInParty(u32 battler, u32 battler2);
void SwitchPartyOrder(u32 battler);
void SwapTurnOrder(u8 id1, u8 id2);
u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect holdEffect);
u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability 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,
s32 GetChosenMovePriority(u32 battler, enum Ability ability);
s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move);
s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2,
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);

View File

@ -1,6 +1,7 @@
#ifndef GUARD_BATTLE_MESSAGE_H
#define GUARD_BATTLE_MESSAGE_H
#include "constants/abilities.h"
#include "constants/battle.h"
#include "constants/battle_string_ids.h"
@ -238,13 +239,13 @@ struct BattleMsgData
u16 currentMove;
u16 originallyUsedMove;
u16 lastItem;
u16 lastAbility;
enum Ability lastAbility;
u8 scrActive;
u8 bakScriptPartyIdx;
u8 hpScale;
u8 itemEffectBattler;
u8 moveType;
u16 abilities[MAX_BATTLERS_COUNT];
enum Ability abilities[MAX_BATTLERS_COUNT];
u8 textBuffs[3][TEXT_BUFF_ARRAY_COUNT];
};

View File

@ -40,10 +40,10 @@ union TRANSPARENT StatChangeFlags
};
};
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 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk);
s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk);
s32 GetCritHitOdds(s32 critChanceIndex);
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect);
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect);
bool32 HasBattlerActedThisTurn(u32 battler);
u32 GetBattlerTurnOrderNum(u32 battler);
bool32 NoAliveMonsForBattlerSide(u32 battler);
@ -60,15 +60,15 @@ bool32 DoesSubstituteBlockMove(u32 battlerAtk, u32 battlerDef, u32 move);
bool32 DoesDisguiseBlockMove(u32 battler, u32 move);
bool32 CanUseLastResort(u8 battlerId);
u32 IsFlowerVeilProtected(u32 battler);
u32 IsLeafGuardProtected(u32 battler, u32 ability);
bool32 IsShieldsDownProtected(u32 battler, u32 ability);
u32 IsAbilityStatusProtected(u32 battler, u32 ability);
u32 IsLeafGuardProtected(u32 battler, enum Ability ability);
bool32 IsShieldsDownProtected(u32 battler, enum Ability ability);
u32 IsAbilityStatusProtected(u32 battler, enum Ability ability);
bool32 TryResetBattlerStatChanges(u8 battler);
bool32 CanCamouflage(u8 battlerId);
void StealTargetItem(u8 battlerStealer, u8 battlerItem);
u8 GetCatchingBattler(void);
u32 GetHighestStatId(u32 battlerId);
bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType);
bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, u32 moveType);
bool32 IsMoveNotAllowedInSkyBattles(u32 move);
bool32 DoSwitchInAbilities(u32 battlerId);
u8 GetFirstFaintedPartyIndex(u8 battlerId);

View File

@ -181,8 +181,8 @@ struct DamageContext
u32 fixedBasePower:8;
u32 padding2:8;
uq4_12_t typeEffectivenessModifier;
u32 abilityAtk:16;
u32 abilityDef:16;
enum Ability abilityAtk;
enum Ability abilityDef;
enum ItemHoldEffect holdEffectAtk:16;
enum ItemHoldEffect holdEffectDef:16;
};
@ -193,7 +193,7 @@ struct BattleContext
u32 battlerDef:3;
u32 currentMove:16;
enum BattleMoveEffects moveEffect:10;
u16 ability[MAX_BATTLERS_COUNT];
enum Ability ability[MAX_BATTLERS_COUNT];
};
enum SleepClauseBlock
@ -240,7 +240,7 @@ void MarkBattlerForControllerExec(u32 battler);
void MarkBattlerReceivedLinkData(u32 battler);
const u8 *CancelMultiTurnMoves(u32 battler, enum SkyDropState skyDropState);
bool32 WasUnableToUseMove(u32 battler);
bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability);
bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability);
void PrepareStringBattle(enum StringID stringId, u32 battler);
void ResetSentPokesToOpponentValue(void);
void OpponentSwitchInResetSentPokesToOpponentValue(u32 battler);
@ -254,27 +254,27 @@ u32 CheckMoveLimitations(u32 battler, u8 unusableMoves, u16 check);
bool32 AreAllMovesUnusable(u32 battler);
u8 GetImprisonedMovesCount(u32 battler, u16 move);
s32 GetDrainedBigRootHp(u32 battler, s32 hp);
bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck);
bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck);
u32 DoEndTurnEffects(void);
bool32 HandleFaintedMonActions(void);
void TryClearRageAndFuryCutter(void);
enum MoveCanceller AtkCanceller_MoveSuccessOrder(struct BattleContext *ctx);
bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2);
bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility);
bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option);
bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option);
u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg);
bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option);
bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option);
enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg);
bool32 TryPrimalReversion(u32 battler);
bool32 IsNeutralizingGasOnField(void);
bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability);
bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability);
u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler);
u32 GetBattlerAbilityNoAbilityShield(u32 battler);
u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityShield);
u32 GetBattlerAbility(u32 battler);
u32 IsAbilityOnSide(u32 battler, u32 ability);
u32 IsAbilityOnOpposingSide(u32 battler, u32 ability);
u32 IsAbilityOnField(u32 ability);
u32 IsAbilityOnFieldExcept(u32 battler, u32 ability);
enum Ability GetBattlerAbility(u32 battler);
u32 IsAbilityOnSide(u32 battler, enum Ability ability);
u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability);
u32 IsAbilityOnField(enum Ability ability);
u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability);
u32 IsAbilityPreventingEscape(u32 battler);
bool32 IsBattlerProtected(u32 battlerAtk, u32 battlerDef, u32 move);
u32 GetProtectType(enum ProtectMethod method);
@ -292,9 +292,9 @@ enum ItemHoldEffect GetBattlerHoldEffectIgnoreAbility(u32 battler);
enum ItemHoldEffect GetBattlerHoldEffectIgnoreNegation(u32 battler);
enum ItemHoldEffect GetBattlerHoldEffectInternal(u32 battler, u32 ability);
u32 GetBattlerHoldEffectParam(u32 battler);
bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move);
bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move);
bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect);
bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move);
bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move);
bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect);
u32 GetMoveSlot(u16 *moves, u32 move);
u32 GetBattlerWeight(u32 battler);
u32 CalcRolloutBasePower(u32 battlerAtk, u32 basePower, u32 rolloutTimer);
@ -304,7 +304,7 @@ s32 CalculateMoveDamageVars(struct DamageContext *ctx);
s32 DoFixedDamageMoveCalc(struct DamageContext *ctx);
s32 ApplyModifiersAfterDmgRoll(struct DamageContext *ctx, s32 dmg);
uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx);
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef);
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef);
uq4_12_t GetTypeModifier(u32 atkType, u32 defType);
uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType);
void UpdateMoveResultFlags(uq4_12_t modifier, u16 *resultFlags);
@ -371,15 +371,15 @@ bool32 TargetFullyImmuneToCurrMove(u32 battlerAtk, u32 battlerDef);
bool32 MoodyCantRaiseStat(u32 stat);
bool32 MoodyCantLowerStat(u32 stat);
bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause);
bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef);
bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 ability);
bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef);
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option);
bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause);
bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef);
bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability ability);
bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef);
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect secondaryMoveEffect, enum FunctionCallOption option);
bool32 CanBeConfused(u32 battler);
bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag);
bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag);
u32 GetBattlerAffectionHearts(u32 battler);
void TryToRevertMimicryAndFlags(void);
bool32 BattleArenaTurnEnd(void);
@ -389,8 +389,8 @@ void RemoveConfusionStatus(u32 battler);
u8 GetBattlerGender(u32 battler);
bool32 AreBattlersOfOppositeGender(u32 battler1, u32 battler2);
bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2);
u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect);
bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect);
u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect);
bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect);
void GetBattlerTypes(u32 battler, bool32 ignoreTera, u32 types[static 3]);
u32 GetBattlerType(u32 battler, u32 typeIndex, bool32 ignoreTera);
bool8 CanMonParticipateInSkyBattle(struct Pokemon *mon);
@ -403,7 +403,7 @@ bool32 IsSleepClauseActiveForSide(u32 battlerSide);
bool32 IsSleepClauseEnabled();
void ClearDamageCalcResults(void);
u32 DoesDestinyBondFail(u32 battler);
bool32 IsMoveEffectBlockedByTarget(u32 ability);
bool32 IsMoveEffectBlockedByTarget(enum Ability ability);
bool32 IsPursuitTargetSet(void);
void ClearPursuitValuesIfSet(u32 battler);
void ClearPursuitValues(void);
@ -416,7 +416,7 @@ bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId);
bool32 TrySwitchInEjectPack(enum ItemCaseId caseID);
u32 GetBattlerVolatile(u32 battler, enum Volatile _volatile);
void SetMonVolatile(u32 battler, enum Volatile _volatile, u32 newValue);
u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID);
u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID);
bool32 ItemHealMonVolatile(u32 battler, u16 itemId);
void PushHazardTypeToQueue(u32 side, enum Hazards hazardType);
bool32 IsHazardOnSide(u32 side, enum Hazards hazardType);
@ -424,13 +424,13 @@ bool32 AreAnyHazardsOnSide(u32 side);
void RemoveAllHazardsFromField(u32 side);
bool32 IsHazardOnSideAndClear(u32 side, enum Hazards hazardType);
void RemoveHazardFromField(u32 side, enum Hazards hazardType);
bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option);
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect);
bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option);
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect);
bool32 IsSemiInvulnerable(u32 battler, enum SemiInvulnerableExclusion excludeCommander);
bool32 BreaksThroughSemiInvulnerablity(u32 battler, u32 move);
u32 GetNaturePowerMove(u32 battler);
u32 GetNaturePowerMove(u32 battler);
void RemoveAbilityFlags(u32 battler);
bool32 IsDazzlingAbility(u32 ability);
bool32 IsDazzlingAbility(enum Ability ability);
#endif // GUARD_BATTLE_UTIL_H

View File

@ -1,344 +1,339 @@
#ifndef GUARD_CONSTANTS_ABILITIES_H
#define GUARD_CONSTANTS_ABILITIES_H
#define ABILITY_NONE 0
#define ABILITY_STENCH 1
#define ABILITY_DRIZZLE 2
#define ABILITY_SPEED_BOOST 3
#define ABILITY_BATTLE_ARMOR 4
#define ABILITY_STURDY 5
#define ABILITY_DAMP 6
#define ABILITY_LIMBER 7
#define ABILITY_SAND_VEIL 8
#define ABILITY_STATIC 9
#define ABILITY_VOLT_ABSORB 10
#define ABILITY_WATER_ABSORB 11
#define ABILITY_OBLIVIOUS 12
#define ABILITY_CLOUD_NINE 13
#define ABILITY_COMPOUND_EYES 14
#define ABILITY_INSOMNIA 15
#define ABILITY_COLOR_CHANGE 16
#define ABILITY_IMMUNITY 17
#define ABILITY_FLASH_FIRE 18
#define ABILITY_SHIELD_DUST 19
#define ABILITY_OWN_TEMPO 20
#define ABILITY_SUCTION_CUPS 21
#define ABILITY_INTIMIDATE 22
#define ABILITY_SHADOW_TAG 23
#define ABILITY_ROUGH_SKIN 24
#define ABILITY_WONDER_GUARD 25
#define ABILITY_LEVITATE 26
#define ABILITY_EFFECT_SPORE 27
#define ABILITY_SYNCHRONIZE 28
#define ABILITY_CLEAR_BODY 29
#define ABILITY_NATURAL_CURE 30
#define ABILITY_LIGHTNING_ROD 31
#define ABILITY_SERENE_GRACE 32
#define ABILITY_SWIFT_SWIM 33
#define ABILITY_CHLOROPHYLL 34
#define ABILITY_ILLUMINATE 35
#define ABILITY_TRACE 36
#define ABILITY_HUGE_POWER 37
#define ABILITY_POISON_POINT 38
#define ABILITY_INNER_FOCUS 39
#define ABILITY_MAGMA_ARMOR 40
#define ABILITY_WATER_VEIL 41
#define ABILITY_MAGNET_PULL 42
#define ABILITY_SOUNDPROOF 43
#define ABILITY_RAIN_DISH 44
#define ABILITY_SAND_STREAM 45
#define ABILITY_PRESSURE 46
#define ABILITY_THICK_FAT 47
#define ABILITY_EARLY_BIRD 48
#define ABILITY_FLAME_BODY 49
#define ABILITY_RUN_AWAY 50
#define ABILITY_KEEN_EYE 51
#define ABILITY_HYPER_CUTTER 52
#define ABILITY_PICKUP 53
#define ABILITY_TRUANT 54
#define ABILITY_HUSTLE 55
#define ABILITY_CUTE_CHARM 56
#define ABILITY_PLUS 57
#define ABILITY_MINUS 58
#define ABILITY_FORECAST 59
#define ABILITY_STICKY_HOLD 60
#define ABILITY_SHED_SKIN 61
#define ABILITY_GUTS 62
#define ABILITY_MARVEL_SCALE 63
#define ABILITY_LIQUID_OOZE 64
#define ABILITY_OVERGROW 65
#define ABILITY_BLAZE 66
#define ABILITY_TORRENT 67
#define ABILITY_SWARM 68
#define ABILITY_ROCK_HEAD 69
#define ABILITY_DROUGHT 70
#define ABILITY_ARENA_TRAP 71
#define ABILITY_VITAL_SPIRIT 72
#define ABILITY_WHITE_SMOKE 73
#define ABILITY_PURE_POWER 74
#define ABILITY_SHELL_ARMOR 75
#define ABILITY_AIR_LOCK 76
enum __attribute__((packed)) Ability
{
ABILITY_NONE = 0,
ABILITY_STENCH = 1,
ABILITY_DRIZZLE = 2,
ABILITY_SPEED_BOOST = 3,
ABILITY_BATTLE_ARMOR = 4,
ABILITY_STURDY = 5,
ABILITY_DAMP = 6,
ABILITY_LIMBER = 7,
ABILITY_SAND_VEIL = 8,
ABILITY_STATIC = 9,
ABILITY_VOLT_ABSORB = 10,
ABILITY_WATER_ABSORB = 11,
ABILITY_OBLIVIOUS = 12,
ABILITY_CLOUD_NINE = 13,
ABILITY_COMPOUND_EYES = 14,
ABILITY_INSOMNIA = 15,
ABILITY_COLOR_CHANGE = 16,
ABILITY_IMMUNITY = 17,
ABILITY_FLASH_FIRE = 18,
ABILITY_SHIELD_DUST = 19,
ABILITY_OWN_TEMPO = 20,
ABILITY_SUCTION_CUPS = 21,
ABILITY_INTIMIDATE = 22,
ABILITY_SHADOW_TAG = 23,
ABILITY_ROUGH_SKIN = 24,
ABILITY_WONDER_GUARD = 25,
ABILITY_LEVITATE = 26,
ABILITY_EFFECT_SPORE = 27,
ABILITY_SYNCHRONIZE = 28,
ABILITY_CLEAR_BODY = 29,
ABILITY_NATURAL_CURE = 30,
ABILITY_LIGHTNING_ROD = 31,
ABILITY_SERENE_GRACE = 32,
ABILITY_SWIFT_SWIM = 33,
ABILITY_CHLOROPHYLL = 34,
ABILITY_ILLUMINATE = 35,
ABILITY_TRACE = 36,
ABILITY_HUGE_POWER = 37,
ABILITY_POISON_POINT = 38,
ABILITY_INNER_FOCUS = 39,
ABILITY_MAGMA_ARMOR = 40,
ABILITY_WATER_VEIL = 41,
ABILITY_MAGNET_PULL = 42,
ABILITY_SOUNDPROOF = 43,
ABILITY_RAIN_DISH = 44,
ABILITY_SAND_STREAM = 45,
ABILITY_PRESSURE = 46,
ABILITY_THICK_FAT = 47,
ABILITY_EARLY_BIRD = 48,
ABILITY_FLAME_BODY = 49,
ABILITY_RUN_AWAY = 50,
ABILITY_KEEN_EYE = 51,
ABILITY_HYPER_CUTTER = 52,
ABILITY_PICKUP = 53,
ABILITY_TRUANT = 54,
ABILITY_HUSTLE = 55,
ABILITY_CUTE_CHARM = 56,
ABILITY_PLUS = 57,
ABILITY_MINUS = 58,
ABILITY_FORECAST = 59,
ABILITY_STICKY_HOLD = 60,
ABILITY_SHED_SKIN = 61,
ABILITY_GUTS = 62,
ABILITY_MARVEL_SCALE = 63,
ABILITY_LIQUID_OOZE = 64,
ABILITY_OVERGROW = 65,
ABILITY_BLAZE = 66,
ABILITY_TORRENT = 67,
ABILITY_SWARM = 68,
ABILITY_ROCK_HEAD = 69,
ABILITY_DROUGHT = 70,
ABILITY_ARENA_TRAP = 71,
ABILITY_VITAL_SPIRIT = 72,
ABILITY_WHITE_SMOKE = 73,
ABILITY_PURE_POWER = 74,
ABILITY_SHELL_ARMOR = 75,
ABILITY_AIR_LOCK = 76,
ABILITIES_COUNT_GEN3,
#define ABILITIES_COUNT_GEN3 77
// Gen 4
ABILITY_TANGLED_FEET = ABILITIES_COUNT_GEN3,
ABILITY_MOTOR_DRIVE = 78,
ABILITY_RIVALRY = 79,
ABILITY_STEADFAST = 80,
ABILITY_SNOW_CLOAK = 81,
ABILITY_GLUTTONY = 82,
ABILITY_ANGER_POINT = 83,
ABILITY_UNBURDEN = 84,
ABILITY_HEATPROOF = 85,
ABILITY_SIMPLE = 86,
ABILITY_DRY_SKIN = 87,
ABILITY_DOWNLOAD = 88,
ABILITY_IRON_FIST = 89,
ABILITY_POISON_HEAL = 90,
ABILITY_ADAPTABILITY = 91,
ABILITY_SKILL_LINK = 92,
ABILITY_HYDRATION = 93,
ABILITY_SOLAR_POWER = 94,
ABILITY_QUICK_FEET = 95,
ABILITY_NORMALIZE = 96,
ABILITY_SNIPER = 97,
ABILITY_MAGIC_GUARD = 98,
ABILITY_NO_GUARD = 99,
ABILITY_STALL = 100,
ABILITY_TECHNICIAN = 101,
ABILITY_LEAF_GUARD = 102,
ABILITY_KLUTZ = 103,
ABILITY_MOLD_BREAKER = 104,
ABILITY_SUPER_LUCK = 105,
ABILITY_AFTERMATH = 106,
ABILITY_ANTICIPATION = 107,
ABILITY_FOREWARN = 108,
ABILITY_UNAWARE = 109,
ABILITY_TINTED_LENS = 110,
ABILITY_FILTER = 111,
ABILITY_SLOW_START = 112,
ABILITY_SCRAPPY = 113,
ABILITY_STORM_DRAIN = 114,
ABILITY_ICE_BODY = 115,
ABILITY_SOLID_ROCK = 116,
ABILITY_SNOW_WARNING = 117,
ABILITY_HONEY_GATHER = 118,
ABILITY_FRISK = 119,
ABILITY_RECKLESS = 120,
ABILITY_MULTITYPE = 121,
ABILITY_FLOWER_GIFT = 122,
ABILITY_BAD_DREAMS = 123,
ABILITIES_COUNT_GEN4,
// Gen 4
#define ABILITY_TANGLED_FEET 77
#define ABILITY_MOTOR_DRIVE 78
#define ABILITY_RIVALRY 79
#define ABILITY_STEADFAST 80
#define ABILITY_SNOW_CLOAK 81
#define ABILITY_GLUTTONY 82
#define ABILITY_ANGER_POINT 83
#define ABILITY_UNBURDEN 84
#define ABILITY_HEATPROOF 85
#define ABILITY_SIMPLE 86
#define ABILITY_DRY_SKIN 87
#define ABILITY_DOWNLOAD 88
#define ABILITY_IRON_FIST 89
#define ABILITY_POISON_HEAL 90
#define ABILITY_ADAPTABILITY 91
#define ABILITY_SKILL_LINK 92
#define ABILITY_HYDRATION 93
#define ABILITY_SOLAR_POWER 94
#define ABILITY_QUICK_FEET 95
#define ABILITY_NORMALIZE 96
#define ABILITY_SNIPER 97
#define ABILITY_MAGIC_GUARD 98
#define ABILITY_NO_GUARD 99
#define ABILITY_STALL 100
#define ABILITY_TECHNICIAN 101
#define ABILITY_LEAF_GUARD 102
#define ABILITY_KLUTZ 103
#define ABILITY_MOLD_BREAKER 104
#define ABILITY_SUPER_LUCK 105
#define ABILITY_AFTERMATH 106
#define ABILITY_ANTICIPATION 107
#define ABILITY_FOREWARN 108
#define ABILITY_UNAWARE 109
#define ABILITY_TINTED_LENS 110
#define ABILITY_FILTER 111
#define ABILITY_SLOW_START 112
#define ABILITY_SCRAPPY 113
#define ABILITY_STORM_DRAIN 114
#define ABILITY_ICE_BODY 115
#define ABILITY_SOLID_ROCK 116
#define ABILITY_SNOW_WARNING 117
#define ABILITY_HONEY_GATHER 118
#define ABILITY_FRISK 119
#define ABILITY_RECKLESS 120
#define ABILITY_MULTITYPE 121
#define ABILITY_FLOWER_GIFT 122
#define ABILITY_BAD_DREAMS 123
// Gen 5
ABILITY_PICKPOCKET = ABILITIES_COUNT_GEN4,
ABILITY_SHEER_FORCE = 125,
ABILITY_CONTRARY = 126,
ABILITY_UNNERVE = 127,
ABILITY_DEFIANT = 128,
ABILITY_DEFEATIST = 129,
ABILITY_CURSED_BODY = 130,
ABILITY_HEALER = 131,
ABILITY_FRIEND_GUARD = 132,
ABILITY_WEAK_ARMOR = 133,
ABILITY_HEAVY_METAL = 134,
ABILITY_LIGHT_METAL = 135,
ABILITY_MULTISCALE = 136,
ABILITY_TOXIC_BOOST = 137,
ABILITY_FLARE_BOOST = 138,
ABILITY_HARVEST = 139,
ABILITY_TELEPATHY = 140,
ABILITY_MOODY = 141,
ABILITY_OVERCOAT = 142,
ABILITY_POISON_TOUCH = 143,
ABILITY_REGENERATOR = 144,
ABILITY_BIG_PECKS = 145,
ABILITY_SAND_RUSH = 146,
ABILITY_WONDER_SKIN = 147,
ABILITY_ANALYTIC = 148,
ABILITY_ILLUSION = 149,
ABILITY_IMPOSTER = 150,
ABILITY_INFILTRATOR = 151,
ABILITY_MUMMY = 152,
ABILITY_MOXIE = 153,
ABILITY_JUSTIFIED = 154,
ABILITY_RATTLED = 155,
ABILITY_MAGIC_BOUNCE = 156,
ABILITY_SAP_SIPPER = 157,
ABILITY_PRANKSTER = 158,
ABILITY_SAND_FORCE = 159,
ABILITY_IRON_BARBS = 160,
ABILITY_ZEN_MODE = 161,
ABILITY_VICTORY_STAR = 162,
ABILITY_TURBOBLAZE = 163,
ABILITY_TERAVOLT = 164,
ABILITIES_COUNT_GEN5,
#define ABILITIES_COUNT_GEN4 124
// Gen 6
ABILITY_AROMA_VEIL = ABILITIES_COUNT_GEN5,
ABILITY_FLOWER_VEIL = 166,
ABILITY_CHEEK_POUCH = 167,
ABILITY_PROTEAN = 168,
ABILITY_FUR_COAT = 169,
ABILITY_MAGICIAN = 170,
ABILITY_BULLETPROOF = 171,
ABILITY_COMPETITIVE = 172,
ABILITY_STRONG_JAW = 173,
ABILITY_REFRIGERATE = 174,
ABILITY_SWEET_VEIL = 175,
ABILITY_STANCE_CHANGE = 176,
ABILITY_GALE_WINGS = 177,
ABILITY_MEGA_LAUNCHER = 178,
ABILITY_GRASS_PELT = 179,
ABILITY_SYMBIOSIS = 180,
ABILITY_TOUGH_CLAWS = 181,
ABILITY_PIXILATE = 182,
ABILITY_GOOEY = 183,
ABILITY_AERILATE = 184,
ABILITY_PARENTAL_BOND = 185,
ABILITY_DARK_AURA = 186,
ABILITY_FAIRY_AURA = 187,
ABILITY_AURA_BREAK = 188,
ABILITY_PRIMORDIAL_SEA = 189,
ABILITY_DESOLATE_LAND = 190,
ABILITY_DELTA_STREAM = 191,
ABILITIES_COUNT_GEN6,
// Gen 5
#define ABILITY_PICKPOCKET 124
#define ABILITY_SHEER_FORCE 125
#define ABILITY_CONTRARY 126
#define ABILITY_UNNERVE 127
#define ABILITY_DEFIANT 128
#define ABILITY_DEFEATIST 129
#define ABILITY_CURSED_BODY 130
#define ABILITY_HEALER 131
#define ABILITY_FRIEND_GUARD 132
#define ABILITY_WEAK_ARMOR 133
#define ABILITY_HEAVY_METAL 134
#define ABILITY_LIGHT_METAL 135
#define ABILITY_MULTISCALE 136
#define ABILITY_TOXIC_BOOST 137
#define ABILITY_FLARE_BOOST 138
#define ABILITY_HARVEST 139
#define ABILITY_TELEPATHY 140
#define ABILITY_MOODY 141
#define ABILITY_OVERCOAT 142
#define ABILITY_POISON_TOUCH 143
#define ABILITY_REGENERATOR 144
#define ABILITY_BIG_PECKS 145
#define ABILITY_SAND_RUSH 146
#define ABILITY_WONDER_SKIN 147
#define ABILITY_ANALYTIC 148
#define ABILITY_ILLUSION 149
#define ABILITY_IMPOSTER 150
#define ABILITY_INFILTRATOR 151
#define ABILITY_MUMMY 152
#define ABILITY_MOXIE 153
#define ABILITY_JUSTIFIED 154
#define ABILITY_RATTLED 155
#define ABILITY_MAGIC_BOUNCE 156
#define ABILITY_SAP_SIPPER 157
#define ABILITY_PRANKSTER 158
#define ABILITY_SAND_FORCE 159
#define ABILITY_IRON_BARBS 160
#define ABILITY_ZEN_MODE 161
#define ABILITY_VICTORY_STAR 162
#define ABILITY_TURBOBLAZE 163
#define ABILITY_TERAVOLT 164
// Gen 7
ABILITY_STAMINA = ABILITIES_COUNT_GEN6,
ABILITY_WIMP_OUT = 193,
ABILITY_EMERGENCY_EXIT = 194,
ABILITY_WATER_COMPACTION = 195,
ABILITY_MERCILESS = 196,
ABILITY_SHIELDS_DOWN = 197,
ABILITY_STAKEOUT = 198,
ABILITY_WATER_BUBBLE = 199,
ABILITY_STEELWORKER = 200,
ABILITY_BERSERK = 201,
ABILITY_SLUSH_RUSH = 202,
ABILITY_LONG_REACH = 203,
ABILITY_LIQUID_VOICE = 204,
ABILITY_TRIAGE = 205,
ABILITY_GALVANIZE = 206,
ABILITY_SURGE_SURFER = 207,
ABILITY_SCHOOLING = 208,
ABILITY_DISGUISE = 209,
ABILITY_BATTLE_BOND = 210,
ABILITY_POWER_CONSTRUCT = 211,
ABILITY_CORROSION = 212,
ABILITY_COMATOSE = 213,
ABILITY_QUEENLY_MAJESTY = 214,
ABILITY_INNARDS_OUT = 215,
ABILITY_DANCER = 216,
ABILITY_BATTERY = 217,
ABILITY_FLUFFY = 218,
ABILITY_DAZZLING = 219,
ABILITY_SOUL_HEART = 220,
ABILITY_TANGLING_HAIR = 221,
ABILITY_RECEIVER = 222,
ABILITY_POWER_OF_ALCHEMY = 223,
ABILITY_BEAST_BOOST = 224,
ABILITY_RKS_SYSTEM = 225,
ABILITY_ELECTRIC_SURGE = 226,
ABILITY_PSYCHIC_SURGE = 227,
ABILITY_MISTY_SURGE = 228,
ABILITY_GRASSY_SURGE = 229,
ABILITY_FULL_METAL_BODY = 230,
ABILITY_SHADOW_SHIELD = 231,
ABILITY_PRISM_ARMOR = 232,
ABILITY_NEUROFORCE = 233,
ABILITIES_COUNT_GEN7,
#define ABILITIES_COUNT_GEN5 165
// Gen 8
ABILITY_INTREPID_SWORD = ABILITIES_COUNT_GEN7,
ABILITY_DAUNTLESS_SHIELD = 235,
ABILITY_LIBERO = 236,
ABILITY_BALL_FETCH = 237,
ABILITY_COTTON_DOWN = 238,
ABILITY_PROPELLER_TAIL = 239,
ABILITY_MIRROR_ARMOR = 240,
ABILITY_GULP_MISSILE = 241,
ABILITY_STALWART = 242,
ABILITY_STEAM_ENGINE = 243,
ABILITY_PUNK_ROCK = 244,
ABILITY_SAND_SPIT = 245,
ABILITY_ICE_SCALES = 246,
ABILITY_RIPEN = 247,
ABILITY_ICE_FACE = 248,
ABILITY_POWER_SPOT = 249,
ABILITY_MIMICRY = 250,
ABILITY_SCREEN_CLEANER = 251,
ABILITY_STEELY_SPIRIT = 252,
ABILITY_PERISH_BODY = 253,
ABILITY_WANDERING_SPIRIT = 254,
ABILITY_GORILLA_TACTICS = 255,
ABILITY_NEUTRALIZING_GAS = 256,
ABILITY_PASTEL_VEIL = 257,
ABILITY_HUNGER_SWITCH = 258,
ABILITY_QUICK_DRAW = 259,
ABILITY_UNSEEN_FIST = 260,
ABILITY_CURIOUS_MEDICINE = 261,
ABILITY_TRANSISTOR = 262,
ABILITY_DRAGONS_MAW = 263,
ABILITY_CHILLING_NEIGH = 264,
ABILITY_GRIM_NEIGH = 265,
ABILITY_AS_ONE_ICE_RIDER = 266,
ABILITY_AS_ONE_SHADOW_RIDER = 267,
ABILITIES_COUNT_GEN8,
// Gen 6
#define ABILITY_AROMA_VEIL 165
#define ABILITY_FLOWER_VEIL 166
#define ABILITY_CHEEK_POUCH 167
#define ABILITY_PROTEAN 168
#define ABILITY_FUR_COAT 169
#define ABILITY_MAGICIAN 170
#define ABILITY_BULLETPROOF 171
#define ABILITY_COMPETITIVE 172
#define ABILITY_STRONG_JAW 173
#define ABILITY_REFRIGERATE 174
#define ABILITY_SWEET_VEIL 175
#define ABILITY_STANCE_CHANGE 176
#define ABILITY_GALE_WINGS 177
#define ABILITY_MEGA_LAUNCHER 178
#define ABILITY_GRASS_PELT 179
#define ABILITY_SYMBIOSIS 180
#define ABILITY_TOUGH_CLAWS 181
#define ABILITY_PIXILATE 182
#define ABILITY_GOOEY 183
#define ABILITY_AERILATE 184
#define ABILITY_PARENTAL_BOND 185
#define ABILITY_DARK_AURA 186
#define ABILITY_FAIRY_AURA 187
#define ABILITY_AURA_BREAK 188
#define ABILITY_PRIMORDIAL_SEA 189
#define ABILITY_DESOLATE_LAND 190
#define ABILITY_DELTA_STREAM 191
#define ABILITIES_COUNT_GEN6 192
// Gen 7
#define ABILITY_STAMINA 192
#define ABILITY_WIMP_OUT 193
#define ABILITY_EMERGENCY_EXIT 194
#define ABILITY_WATER_COMPACTION 195
#define ABILITY_MERCILESS 196
#define ABILITY_SHIELDS_DOWN 197
#define ABILITY_STAKEOUT 198
#define ABILITY_WATER_BUBBLE 199
#define ABILITY_STEELWORKER 200
#define ABILITY_BERSERK 201
#define ABILITY_SLUSH_RUSH 202
#define ABILITY_LONG_REACH 203
#define ABILITY_LIQUID_VOICE 204
#define ABILITY_TRIAGE 205
#define ABILITY_GALVANIZE 206
#define ABILITY_SURGE_SURFER 207
#define ABILITY_SCHOOLING 208
#define ABILITY_DISGUISE 209
#define ABILITY_BATTLE_BOND 210
#define ABILITY_POWER_CONSTRUCT 211
#define ABILITY_CORROSION 212
#define ABILITY_COMATOSE 213
#define ABILITY_QUEENLY_MAJESTY 214
#define ABILITY_INNARDS_OUT 215
#define ABILITY_DANCER 216
#define ABILITY_BATTERY 217
#define ABILITY_FLUFFY 218
#define ABILITY_DAZZLING 219
#define ABILITY_SOUL_HEART 220
#define ABILITY_TANGLING_HAIR 221
#define ABILITY_RECEIVER 222
#define ABILITY_POWER_OF_ALCHEMY 223
#define ABILITY_BEAST_BOOST 224
#define ABILITY_RKS_SYSTEM 225
#define ABILITY_ELECTRIC_SURGE 226
#define ABILITY_PSYCHIC_SURGE 227
#define ABILITY_MISTY_SURGE 228
#define ABILITY_GRASSY_SURGE 229
#define ABILITY_FULL_METAL_BODY 230
#define ABILITY_SHADOW_SHIELD 231
#define ABILITY_PRISM_ARMOR 232
#define ABILITY_NEUROFORCE 233
#define ABILITIES_COUNT_GEN7 234
// Gen 8
#define ABILITY_INTREPID_SWORD 234
#define ABILITY_DAUNTLESS_SHIELD 235
#define ABILITY_LIBERO 236
#define ABILITY_BALL_FETCH 237
#define ABILITY_COTTON_DOWN 238
#define ABILITY_PROPELLER_TAIL 239
#define ABILITY_MIRROR_ARMOR 240
#define ABILITY_GULP_MISSILE 241
#define ABILITY_STALWART 242
#define ABILITY_STEAM_ENGINE 243
#define ABILITY_PUNK_ROCK 244
#define ABILITY_SAND_SPIT 245
#define ABILITY_ICE_SCALES 246
#define ABILITY_RIPEN 247
#define ABILITY_ICE_FACE 248
#define ABILITY_POWER_SPOT 249
#define ABILITY_MIMICRY 250
#define ABILITY_SCREEN_CLEANER 251
#define ABILITY_STEELY_SPIRIT 252
#define ABILITY_PERISH_BODY 253
#define ABILITY_WANDERING_SPIRIT 254
#define ABILITY_GORILLA_TACTICS 255
#define ABILITY_NEUTRALIZING_GAS 256
#define ABILITY_PASTEL_VEIL 257
#define ABILITY_HUNGER_SWITCH 258
#define ABILITY_QUICK_DRAW 259
#define ABILITY_UNSEEN_FIST 260
#define ABILITY_CURIOUS_MEDICINE 261
#define ABILITY_TRANSISTOR 262
#define ABILITY_DRAGONS_MAW 263
#define ABILITY_CHILLING_NEIGH 264
#define ABILITY_GRIM_NEIGH 265
#define ABILITY_AS_ONE_ICE_RIDER 266
#define ABILITY_AS_ONE_SHADOW_RIDER 267
#define ABILITIES_COUNT_GEN8 268
// Gen 9
#define ABILITY_LINGERING_AROMA 268
#define ABILITY_SEED_SOWER 269
#define ABILITY_THERMAL_EXCHANGE 270
#define ABILITY_ANGER_SHELL 271
#define ABILITY_PURIFYING_SALT 272
#define ABILITY_WELL_BAKED_BODY 273
#define ABILITY_WIND_RIDER 274
#define ABILITY_GUARD_DOG 275
#define ABILITY_ROCKY_PAYLOAD 276
#define ABILITY_WIND_POWER 277
#define ABILITY_ZERO_TO_HERO 278
#define ABILITY_COMMANDER 279
#define ABILITY_ELECTROMORPHOSIS 280
#define ABILITY_PROTOSYNTHESIS 281
#define ABILITY_QUARK_DRIVE 282
#define ABILITY_GOOD_AS_GOLD 283
#define ABILITY_VESSEL_OF_RUIN 284
#define ABILITY_SWORD_OF_RUIN 285
#define ABILITY_TABLETS_OF_RUIN 286
#define ABILITY_BEADS_OF_RUIN 287
#define ABILITY_ORICHALCUM_PULSE 288
#define ABILITY_HADRON_ENGINE 289
#define ABILITY_OPPORTUNIST 290
#define ABILITY_CUD_CHEW 291
#define ABILITY_SHARPNESS 292
#define ABILITY_SUPREME_OVERLORD 293
#define ABILITY_COSTAR 294
#define ABILITY_TOXIC_DEBRIS 295
#define ABILITY_ARMOR_TAIL 296
#define ABILITY_EARTH_EATER 297
#define ABILITY_MYCELIUM_MIGHT 298
#define ABILITY_HOSPITALITY 299
#define ABILITY_MINDS_EYE 300
#define ABILITY_EMBODY_ASPECT_TEAL_MASK 301
#define ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK 302
#define ABILITY_EMBODY_ASPECT_WELLSPRING_MASK 303
#define ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK 304
#define ABILITY_TOXIC_CHAIN 305
#define ABILITY_SUPERSWEET_SYRUP 306
#define ABILITY_TERA_SHIFT 307
#define ABILITY_TERA_SHELL 308
#define ABILITY_TERAFORM_ZERO 309
#define ABILITY_POISON_PUPPETEER 310
#define ABILITIES_COUNT_GEN9 311
#define ABILITIES_COUNT ABILITIES_COUNT_GEN9
// Gen 9
ABILITY_LINGERING_AROMA = ABILITIES_COUNT_GEN8,
ABILITY_SEED_SOWER = 269,
ABILITY_THERMAL_EXCHANGE = 270,
ABILITY_ANGER_SHELL = 271,
ABILITY_PURIFYING_SALT = 272,
ABILITY_WELL_BAKED_BODY = 273,
ABILITY_WIND_RIDER = 274,
ABILITY_GUARD_DOG = 275,
ABILITY_ROCKY_PAYLOAD = 276,
ABILITY_WIND_POWER = 277,
ABILITY_ZERO_TO_HERO = 278,
ABILITY_COMMANDER = 279,
ABILITY_ELECTROMORPHOSIS = 280,
ABILITY_PROTOSYNTHESIS = 281,
ABILITY_QUARK_DRIVE = 282,
ABILITY_GOOD_AS_GOLD = 283,
ABILITY_VESSEL_OF_RUIN = 284,
ABILITY_SWORD_OF_RUIN = 285,
ABILITY_TABLETS_OF_RUIN = 286,
ABILITY_BEADS_OF_RUIN = 287,
ABILITY_ORICHALCUM_PULSE = 288,
ABILITY_HADRON_ENGINE = 289,
ABILITY_OPPORTUNIST = 290,
ABILITY_CUD_CHEW = 291,
ABILITY_SHARPNESS = 292,
ABILITY_SUPREME_OVERLORD = 293,
ABILITY_COSTAR = 294,
ABILITY_TOXIC_DEBRIS = 295,
ABILITY_ARMOR_TAIL = 296,
ABILITY_EARTH_EATER = 297,
ABILITY_MYCELIUM_MIGHT = 298,
ABILITY_HOSPITALITY = 299,
ABILITY_MINDS_EYE = 300,
ABILITY_EMBODY_ASPECT_TEAL_MASK = 301,
ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK = 302,
ABILITY_EMBODY_ASPECT_WELLSPRING_MASK = 303,
ABILITY_EMBODY_ASPECT_CORNERSTONE_MASK = 304,
ABILITY_TOXIC_CHAIN = 305,
ABILITY_SUPERSWEET_SYRUP = 306,
ABILITY_TERA_SHIFT = 307,
ABILITY_TERA_SHELL = 308,
ABILITY_TERAFORM_ZERO = 309,
ABILITY_POISON_PUPPETEER = 310,
ABILITIES_COUNT_GEN9,
ABILITIES_COUNT = ABILITIES_COUNT_GEN9,
};
#endif // GUARD_CONSTANTS_ABILITIES_H

View File

@ -64,7 +64,7 @@ struct TrainerMon
u16 moves[4];
u16 species;
u16 heldItem;
u16 ability;
enum Ability ability;
u8 lvl;
u8 ball;
u8 friendship;
@ -82,7 +82,7 @@ struct TrainerMon
#define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray)
enum TrainerBattleType
enum TrainerBattleType
{
TRAINER_BATTLE_TYPE_SINGLES,
TRAINER_BATTLE_TYPE_DOUBLES,

View File

@ -10,6 +10,10 @@
#include "constants/map_groups.h"
#include "constants/regions.h"
#include "constants/region_map_sections.h"
#include "constants/map_groups.h"
#include "constants/battle.h"
#include "constants/abilities.h"
#include "contest_effect.h"
#include "constants/trainers.h"
#define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0))
@ -367,7 +371,7 @@ struct BattlePokemon
/*0x17*/ u32 spDefenseIV:5;
/*0x17*/ u32 abilityNum:2;
/*0x18*/ s8 statStages[NUM_BATTLE_STATS];
/*0x20*/ u16 ability;
/*0x20*/ enum Ability ability;
/*0x22*/ u8 types[3];
/*0x25*/ u8 pp[MAX_MON_MOVES];
/*0x29*/ u16 hp;
@ -429,7 +433,7 @@ struct SpeciesInfo /*0xC4*/
u8 friendship;
u8 growthRate;
u8 eggGroups[2];
u16 abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now.
enum Ability abilities[NUM_ABILITY_SLOTS]; // 3 abilities, no longer u8 because we have over 255 abilities now.
u8 safariZoneFleeRate;
// Pokédex data
@ -533,7 +537,7 @@ struct SpeciesInfo /*0xC4*/
#endif //OW_POKEMON_OBJECT_EVENTS
};
struct Ability
struct AbilityInfo
{
u8 name[ABILITY_NAME_LENGTH + 1];
const u8 *description;
@ -676,7 +680,7 @@ extern const u8 gStatStageRatios[MAX_STAT_STAGE + 1][2];
extern const u16 gUnionRoomFacilityClasses[];
extern const struct SpriteTemplate gBattlerSpriteTemplates[];
extern const u32 sExpCandyExperienceTable[];
extern const struct Ability gAbilitiesInfo[];
extern const struct AbilityInfo gAbilitiesInfo[];
extern const struct NatureInfo gNaturesInfo[];
#if P_TUTOR_MOVES_ARRAY
extern const u16 gTutorMoves[];
@ -751,8 +755,8 @@ u8 CalculateEnemyPartyCount(void);
u8 CalculateEnemyPartyCountInSide(u32 battler);
u8 GetMonsStateToDoubles(void);
u8 GetMonsStateToDoubles_2(void);
u16 GetAbilityBySpecies(u16 species, u8 abilityNum);
u16 GetMonAbility(struct Pokemon *mon);
enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum);
enum Ability GetMonAbility(struct Pokemon *mon);
void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord);
u8 GetSecretBaseTrainerPicIndex(void);
enum TrainerClassID GetSecretBaseTrainerClass(void);
@ -764,7 +768,7 @@ const u8 *GetSpeciesPokedexDescription(u16 species);
u32 GetSpeciesHeight(u16 species);
u32 GetSpeciesWeight(u16 species);
u32 GetSpeciesType(u16 species, u8 slot);
u32 GetSpeciesAbility(u16 species, u8 slot);
enum Ability GetSpeciesAbility(u16 species, u8 slot);
u32 GetSpeciesBaseHP(u16 species);
u32 GetSpeciesBaseAttack(u16 species);
u32 GetSpeciesBaseDefense(u16 species);

View File

@ -566,7 +566,7 @@ enum
struct QueuedAbilityEvent
{
u8 battlerId;
u16 ability;
enum Ability ability;
};
struct QueuedAnimationEvent
@ -698,7 +698,7 @@ struct BattleTestData
u8 gender;
u8 nature;
bool8 isShiny;
u16 forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE];
enum Ability forcedAbilities[NUM_BATTLE_SIDES][PARTY_SIZE];
u8 chosenGimmick[NUM_BATTLE_SIDES][PARTY_SIZE];
u8 currentMonIndexes[MAX_BATTLERS_COUNT];
@ -896,7 +896,7 @@ void AIFlags_(u32 sourceLine, u64 flags);
void AILogScores(u32 sourceLine);
void Gender_(u32 sourceLine, u32 gender);
void Nature_(u32 sourceLine, u32 nature);
void Ability_(u32 sourceLine, u32 ability);
void Ability_(u32 sourceLine, enum Ability ability);
void Level_(u32 sourceLine, u32 level);
void MaxHP_(u32 sourceLine, u32 maxHP);
void HP_(u32 sourceLine, u32 hp);
@ -1070,7 +1070,7 @@ enum QueueGroupType
struct AbilityEventContext
{
u16 ability;
enum Ability ability;
};
struct AnimationEventContext

View File

@ -9,7 +9,7 @@ extern const bool8 gTestRunnerSkipIsFail;
enum Gimmick;
void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, u32 ability);
void TestRunner_Battle_RecordAbilityPopUp(u32 battlerId, enum Ability ability);
void TestRunner_Battle_RecordAnimation(u32 animType, u32 animId);
void TestRunner_Battle_RecordHP(u32 battlerId, u32 oldHP, u32 newHP);
void TestRunner_Battle_RecordExp(u32 battlerId, u32 oldExp, u32 newExp);

View File

@ -24,8 +24,8 @@
#include "constants/moves.h"
#include "constants/items.h"
static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather);
static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus);
static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather);
static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus);
// A move is light sensitive if it is boosted by Sunny Day and weakened by low light weathers.
static bool32 IsLightSensitiveMove(u32 move);
static bool32 HasLightSensitiveMove(u32 battler);
@ -128,7 +128,7 @@ bool32 FieldStatusChecker(u32 battler, u32 fieldStatus, enum FieldEffectOutcome
return (result == desiredResult);
}
static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather)
static bool32 DoesAbilityBenefitFromWeather(enum Ability ability, u32 weather)
{
switch (ability)
{
@ -166,7 +166,7 @@ static bool32 DoesAbilityBenefitFromWeather(u32 ability, u32 weather)
return FALSE;
}
static bool32 DoesAbilityBenefitFromFieldStatus(u32 ability, u32 fieldStatus)
static bool32 DoesAbilityBenefitFromFieldStatus(enum Ability ability, u32 fieldStatus)
{
switch (ability)
{
@ -220,7 +220,7 @@ static bool32 HasLightSensitiveMove(u32 battler)
// Utility Umbrella does NOT block Ancient Pokemon from their stat boosts.
static enum FieldEffectOutcome BenefitsFromSun(u32 battler)
{
u32 ability = gAiLogicData->abilities[battler];
enum Ability ability = gAiLogicData->abilities[battler];
if (gAiLogicData->holdEffects[battler] == HOLD_EFFECT_UTILITY_UMBRELLA)
{

View File

@ -549,7 +549,9 @@ void RecordStatusMoves(u32 battler)
void SetBattlerAiData(u32 battler, struct AiLogicData *aiData)
{
u32 ability, holdEffect;
enum Ability ability;
u32 holdEffect;
ability = aiData->abilities[battler] = AI_DecideKnownAbilityForTurn(battler);
aiData->items[battler] = gBattleMons[battler].item;
holdEffect = aiData->holdEffects[battler] = AI_DecideHoldEffectForTurn(battler);
@ -570,8 +572,8 @@ void SetBattlerAiData(u32 battler, struct AiLogicData *aiData)
static u32 Ai_SetMoveAccuracy(struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef, u32 move)
{
u32 accuracy;
u32 abilityAtk = aiData->abilities[battlerAtk];
u32 abilityDef = aiData->abilities[battlerDef];
enum Ability abilityAtk = aiData->abilities[battlerAtk];
enum Ability abilityDef = aiData->abilities[battlerDef];
if (CanMoveSkipAccuracyCalc(battlerAtk, battlerDef, abilityAtk, abilityDef, move, AI_CHECK))
{
accuracy = BYPASSES_ACCURACY_CALC;
@ -691,7 +693,7 @@ u32 GetPartyMonAbility(struct Pokemon *mon)
{
// Doesn't have any special handling yet
u32 species = GetMonData(mon, MON_DATA_SPECIES);
u32 ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM));
enum Ability ability = GetSpeciesAbility(species, GetMonData(mon, MON_DATA_ABILITY_NUM));
return ability;
}
@ -711,8 +713,8 @@ static u32 PpStallReduction(u32 move, u32 battlerAtk)
continue;
PokemonToBattleMon(&gPlayerParty[partyIndex], &gBattleMons[tempBattleMonIndex]);
u32 species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES);
u32 abilityAtk = ABILITY_NONE;
u32 abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]);
enum Ability abilityAtk = ABILITY_NONE;
enum Ability abilityDef = GetPartyMonAbility(&gPlayerParty[partyIndex]);
u32 moveType = GetBattleMoveType(move); // Probably doesn't handle dynamic types right now
if (CanAbilityAbsorbMove(battlerAtk, tempBattleMonIndex, abilityDef, move, moveType, CHECK_TRIGGER)
|| CanAbilityBlockMove(battlerAtk, tempBattleMonIndex, abilityAtk, abilityDef, move, CHECK_TRIGGER)
@ -1082,8 +1084,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
u32 weather;
u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData);
u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData);
u32 abilityAtk = aiData->abilities[battlerAtk];
u32 abilityDef = aiData->abilities[battlerDef];
enum Ability abilityAtk = aiData->abilities[battlerAtk];
enum Ability abilityDef = aiData->abilities[battlerDef];
s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move);
SetTypeBeforeUsingMove(move, battlerAtk);
@ -1224,6 +1226,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
&& IsNonVolatileStatusMove(move))
RETURN_SCORE_MINUS(10);
break;
default:
break;
} // def ability checks
// target partner ability checks & not attacking partner
@ -1255,6 +1259,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
if (IsAromaVeilProtectedEffect(moveEffect))
RETURN_SCORE_MINUS(10);
break;
default:
break;
}
} // def partner ability checks
@ -4935,6 +4941,8 @@ static s32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move, stru
if (AI_GetWeather() & B_WEATHER_SUN)
ADJUST_SCORE(DECENT_EFFECT); // Slow 'em down
break;
default:
break;
}
}
break;
@ -6530,7 +6538,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score)
{
u32 i;
u32 unmodifiedScore = score;
u32 ability = gBattleMons[battlerAtk].ability;
enum Ability ability = gBattleMons[battlerAtk].ability;
bool32 opposingHazardFlags = DoesSideHaveDamagingHazards(GetBattlerSide(battlerDef));
bool32 aiHazardFlags = AreAnyHazardsOnSide(GetBattlerSide(battlerAtk));
enum BattleMoveEffects moveEffect = GetMoveEffect(move);

View File

@ -29,7 +29,7 @@ static bool32 AiExpectsToFaintPlayer(u32 battler);
static bool32 AI_ShouldHeal(u32 battler, u32 healAmount);
static bool32 AI_OpponentCanFaintAiWithMod(u32 battler, u32 healAmount);
static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon);
static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent);
static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent);
static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon);
static u32 GetBattleMonTypeMatchup(struct BattlePokemon opposingBattleMon, struct BattlePokemon battleMon);
@ -476,7 +476,8 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler)
s32 firstId;
s32 lastId;
struct Pokemon *party;
u16 monAbility, aiMove;
enum Ability monAbility;
u16 aiMove;
u32 opposingBattler = GetOppositeBattler(battler);
u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData);
u32 incomingType = CheckDynamicMoveType(GetBattlerMon(opposingBattler), incomingMove, opposingBattler, MON_IN_BATTLE);
@ -631,7 +632,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler)
s32 lastId;
struct Pokemon *party;
s32 i;
u16 monAbility;
enum Ability monAbility;
s32 opposingBattler = GetOppositeBattler(battler);
// Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer
@ -666,7 +667,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler)
static bool32 ShouldSwitchIfBadlyStatused(u32 battler)
{
bool32 switchMon = FALSE;
u16 monAbility = gAiLogicData->abilities[battler];
enum Ability monAbility = gAiLogicData->abilities[battler];
enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler];
u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler));
u8 opposingBattler = GetBattlerAtPosition(opposingPosition);
@ -894,7 +895,8 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc
for (i = firstId; i < lastId; i++)
{
u16 species, monAbility;
u16 species;
enum Ability monAbility;
uq4_12_t typeMultiplier;
u16 moveFlags = 0;
@ -938,7 +940,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler)
{
u32 battlerIn1, battlerIn2;
u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp;
u32 ability = gAiLogicData->abilities[battler], aiMove;
enum Ability ability = gAiLogicData->abilities[battler], aiMove;
s32 firstId, lastId, i, j;
struct Pokemon *party;
@ -1534,7 +1536,7 @@ static u32 GetFirstNonIvalidMon(u32 firstId, u32 lastId, u32 invalidMons, u32 ba
return PARTY_SIZE;
}
bool32 IsMonGrounded(u16 heldItemEffect, u32 ability, u8 type1, u8 type2)
bool32 IsMonGrounded(u16 heldItemEffect, enum Ability ability, u8 type1, u8 type2)
{
// List that makes mon not grounded
if (type1 == TYPE_FLYING || type2 == TYPE_FLYING || ability == ABILITY_LEVITATE
@ -1555,7 +1557,8 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon
{
u8 defType1 = battleMon->types[0], defType2 = battleMon->types[1], tSpikesLayers;
u16 heldItemEffect = GetItemHoldEffect(battleMon->item);
u32 maxHP = battleMon->maxHP, ability = battleMon->ability, status = battleMon->status1;
u32 maxHP = battleMon->maxHP;
enum Ability ability = battleMon->ability, status = battleMon->status1;
u32 spikesDamage = 0, tSpikesDamage = 0, hazardDamage = 0;
u32 side = GetBattlerSide(battler);
@ -1611,7 +1614,8 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon
// Gets damage / healing from weather
static s32 GetSwitchinWeatherImpact(void)
{
s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability;
s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP;
enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability;
enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item);
if (HasWeatherEffect())
@ -1675,7 +1679,8 @@ static s32 GetSwitchinWeatherImpact(void)
// Gets one turn of recurring healing
static u32 GetSwitchinRecurringHealing(void)
{
u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability;
u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP;
enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability;
enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item);
// Items
@ -1709,7 +1714,8 @@ static u32 GetSwitchinRecurringHealing(void)
// Gets one turn of recurring damage
static u32 GetSwitchinRecurringDamage(void)
{
u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability;
u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP;
enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability;
enum ItemHoldEffect holdEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item);
// Items
@ -1743,7 +1749,8 @@ static u32 GetSwitchinStatusDamage(u32 battler)
u8 defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1];
u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount;
u16 heldItemEffect = GetItemHoldEffect(gAiLogicData->switchinCandidate.battleMon.item);
u32 status = gAiLogicData->switchinCandidate.battleMon.status1, ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP;
u32 status = gAiLogicData->switchinCandidate.battleMon.status1;
enum Ability ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP;
u32 statusDamage = 0;
// Status condition damage
@ -1823,7 +1830,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler)
u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = GetItemHoldEffect(item);
u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = GetItemHoldEffectParam(item);
u32 opposingBattler = GetOppositeBattler(battler);
u32 opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability;
enum Ability opposingAbility = gAiLogicData->abilities[opposingBattler], ability = gAiLogicData->switchinCandidate.battleMon.ability;
bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility);
s32 currentHP = startingHP, singleUseItemHeal = 0;
@ -2027,7 +2034,7 @@ static s32 GetMaxPriorityDamagePlayerCouldDealToSwitchin(u32 battler, u32 opposi
return maxDamageTaken;
}
static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent)
static bool32 CanAbilityTrapOpponent(enum Ability ability, u32 opponent)
{
if ((B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(opponent, TYPE_GHOST)))
return FALSE;
@ -2059,7 +2066,7 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi
return TRUE;
if (gAiLogicData->ejectPackSwitch)
{
u32 opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler);
enum Ability opposingAbility = GetBattlerAbilityIgnoreMoldBreaker(opposingBattler);
// If faster, not a free switch; likely lowered own stats
if (!movedSecond && opposingAbility != ABILITY_INTIMIDATE && opposingAbility != ABILITY_SUPERSWEET_SYRUP) // Intimidate triggers switches before turn starts
return FALSE;

View File

@ -28,7 +28,7 @@ static u32 GetAIEffectGroup(enum BattleMoveEffects effect);
static u32 GetAIEffectGroupFromMove(u32 battler, u32 move);
// Functions
static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, u32 abilityAtk, u32 abilityDef, u32 holdEffectDef, u32 move)
static u32 AI_GetMoldBreakerSanitizedAbility(u32 battlerAtk, enum Ability abilityAtk, enum Ability abilityDef, u32 holdEffectDef, u32 move)
{
if (MoveIgnoresTargetAbility(move))
return ABILITY_NONE;
@ -261,7 +261,7 @@ void RecordAllMoves(u32 battler)
memcpy(gAiPartyData->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].moves, gBattleMons[battler].moves, MAX_MON_MOVES * sizeof(u16));
}
void RecordAbilityBattle(u32 battlerId, u32 abilityId)
void RecordAbilityBattle(u32 battlerId, enum Ability abilityId)
{
gBattleHistory->abilities[battlerId] = abilityId;
gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability = abilityId;
@ -542,7 +542,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler)
}
// move checks
bool32 IsAffectedByPowder(u32 battler, u32 ability, enum ItemHoldEffect holdEffect)
bool32 IsAffectedByPowder(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect)
{
if (ability == ABILITY_OVERCOAT
|| (B_POWDER_GRASS >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GRASS))
@ -643,8 +643,8 @@ static inline s32 DmgRoll(s32 dmg)
bool32 IsDamageMoveUnusable(struct DamageContext *ctx)
{
u32 battlerDefAbility;
u32 partnerDefAbility;
enum Ability battlerDefAbility;
enum Ability partnerDefAbility;
struct AiLogicData *aiData = gAiLogicData;
if (ctx->typeEffectivenessModifier == UQ_4_12(0.0))
@ -1016,7 +1016,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u
bool32 AI_IsDamagedByRecoil(u32 battler)
{
u32 ability = gAiLogicData->abilities[battler];
enum Ability ability = gAiLogicData->abilities[battler];
if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_ROCK_HEAD)
return FALSE;
return TRUE;
@ -1026,8 +1026,8 @@ bool32 AI_IsDamagedByRecoil(u32 battler)
static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo)
{
u32 i;
u32 abilityDef = gAiLogicData->abilities[battlerDef];
u32 abilityAtk = gAiLogicData->abilities[battlerAtk];
enum Ability abilityDef = gAiLogicData->abilities[battlerDef];
enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk];
switch (GetMoveEffect(move))
{
@ -1158,8 +1158,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3
static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo)
{
u32 abilityAtk = gAiLogicData->abilities[battlerAtk];
u32 abilityDef = gAiLogicData->abilities[battlerDef];
enum Ability abilityAtk = gAiLogicData->abilities[battlerAtk];
enum Ability abilityDef = gAiLogicData->abilities[battlerDef];
u8 i;
switch (GetMoveEffect(move))
@ -1239,8 +1239,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s
enum MoveComparisonResult AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo)
{
bool32 effect1, effect2;
u32 defAbility = gAiLogicData->abilities[battlerDef];
u32 atkAbility = gAiLogicData->abilities[battlerAtk];
enum Ability defAbility = gAiLogicData->abilities[battlerDef];
enum Ability atkAbility = gAiLogicData->abilities[battlerAtk];
// Check if physical moves hurt.
if (gAiLogicData->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH
@ -1361,8 +1361,8 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 aiMoveConsidered, u32 pla
u32 speedBattlerAI, speedBattler;
enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI];
enum ItemHoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler];
u32 abilityAI = gAiLogicData->abilities[battlerAI];
u32 abilityPlayer = gAiLogicData->abilities[battler];
enum Ability abilityAI = gAiLogicData->abilities[battlerAI];
enum Ability abilityPlayer = gAiLogicData->abilities[battler];
if (considerPriority == CONSIDER_PRIORITY)
{
@ -1641,7 +1641,7 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm
return FALSE;
}
bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability)
bool32 AI_IsAbilityOnSide(u32 battlerId, enum Ability ability)
{
if (IsBattlerAlive(battlerId) && gAiLogicData->abilities[battlerId] == ability)
return TRUE;
@ -1652,13 +1652,13 @@ bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability)
}
// does NOT include ability suppression checks
s32 AI_DecideKnownAbilityForTurn(u32 battlerId)
enum Ability AI_DecideKnownAbilityForTurn(u32 battlerId)
{
u32 validAbilities[NUM_ABILITY_SLOTS];
u8 i, numValidAbilities = 0;
u32 knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId); // during ai checking for mold breaker could lead to inaccuracies
u32 indexAbility;
u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0};
enum Ability knownAbility = GetBattlerAbilityIgnoreMoldBreaker(battlerId);
enum Ability indexAbility;
enum Ability abilityAiRatings[NUM_ABILITY_SLOTS] = {0};
// We've had ability overwritten by e.g. Worry Seed. It is not part of gAiPartyData in case of switching
if (gDisableStructs[battlerId].overwrittenAbility)
@ -1720,7 +1720,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId)
return holdEffect;
}
bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move)
bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, enum Ability atkAbility, u32 move)
{
if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE)
return FALSE; // AI handicap flag: doesn't understand ability suppression concept
@ -1754,7 +1754,7 @@ u32 AI_GetWeather(void)
u32 AI_GetSwitchinWeather(struct BattlePokemon battleMon)
{
u32 ability = battleMon.ability;
enum Ability ability = battleMon.ability;
// Forced weather behaviour
if (!AI_WeatherHasEffect())
return B_WEATHER_NONE;
@ -1940,7 +1940,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove)
}
}
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility)
bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, enum Ability atkAbility)
{
if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE)
return FALSE;
@ -1954,7 +1954,7 @@ bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility)
return FALSE;
}
bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move)
bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move)
{
enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef];
u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex];
@ -2106,7 +2106,7 @@ bool32 CanLowerStat(u32 battlerAtk, u32 battlerDef, struct AiLogicData *aiData,
return FALSE;
u32 move = gAiThinkingStruct->moveConsidered;
u32 abilityAtk = aiData->abilities[battlerAtk];
enum Ability abilityAtk = aiData->abilities[battlerAtk];
if (gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_MIST && abilityAtk != ABILITY_INFILTRATOR)
return FALSE;
@ -2235,7 +2235,7 @@ u32 IncreaseStatDownScore(u32 battlerAtk, u32 battlerDef, u32 stat)
return (tempScore > BEST_EFFECT) ? BEST_EFFECT : tempScore; // don't inflate score so only max +4
}
bool32 BattlerStatCanRise(u32 battler, u32 battlerAbility, u32 stat)
bool32 BattlerStatCanRise(u32 battler, enum Ability battlerAbility, u32 stat)
{
if ((gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE && battlerAbility != ABILITY_CONTRARY)
|| (battlerAbility == ABILITY_CONTRARY && gBattleMons[battler].statStages[stat] > MIN_STAT_STAGE))
@ -3093,7 +3093,7 @@ static u32 GetPoisonDamage(u32 battlerId)
return damage;
}
static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability)
static bool32 BattlerAffectedBySandstorm(u32 battlerId, enum Ability ability)
{
if (!IS_BATTLER_ANY_TYPE(battlerId, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL)
&& ability != ABILITY_SAND_VEIL
@ -3104,7 +3104,7 @@ static bool32 BattlerAffectedBySandstorm(u32 battlerId, u32 ability)
return FALSE;
}
static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability)
static bool32 BattlerAffectedByHail(u32 battlerId, enum Ability ability)
{
if (!IS_BATTLER_OF_TYPE(battlerId, TYPE_ICE)
&& ability != ABILITY_SNOW_CLOAK
@ -3116,7 +3116,7 @@ static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability)
static u32 GetWeatherDamage(u32 battlerId)
{
u32 ability = gAiLogicData->abilities[battlerId];
enum Ability ability = gAiLogicData->abilities[battlerId];
enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerId];
u32 damage = 0;
u32 weather = AI_GetWeather();
@ -3167,7 +3167,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId)
return secondaryDamage;
}
bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability)
bool32 BattlerWillFaintFromWeather(u32 battler, enum Ability ability)
{
if ((BattlerAffectedBySandstorm(battler, ability) || BattlerAffectedByHail(battler, ability))
&& gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16))
@ -3176,7 +3176,7 @@ bool32 BattlerWillFaintFromWeather(u32 battler, u32 ability)
return FALSE;
}
bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, u32 ability)
bool32 BattlerWillFaintFromSecondaryDamage(u32 battler, enum Ability ability)
{
if (GetBattlerSecondaryDamage(battler) != 0
&& gBattleMons[battler].hp <= max(1, gBattleMons[battler].maxHP / 16))
@ -3214,7 +3214,7 @@ static bool32 AnyUsefulStatIsRaised(u32 battler)
static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler)
{
struct Pokemon *mon = &GetBattlerParty(currBattler)[switchBattler];
u32 ability = GetMonAbility(mon); // we know our own party data
enum Ability ability = GetMonAbility(mon); // we know our own party data
enum ItemHoldEffect holdEffect;
u32 species = GetMonData(mon, MON_DATA_SPECIES);
s32 hazardDamage = 0;
@ -3255,7 +3255,7 @@ static bool32 PartyBattlerShouldAvoidHazards(u32 currBattler, u32 switchBattler)
return FALSE;
}
enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 moveIndex)
enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 moveIndex)
{
bool32 hasStatBoost = AnyUsefulStatIsRaised(battlerAtk) || gBattleMons[battlerDef].statStages[STAT_EVASION] >= 9; //Significant boost in evasion for any class
u32 battlerToSwitch;
@ -3455,7 +3455,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item)
}
// status checks
bool32 IsBattlerIncapacitated(u32 battler, u32 ability)
bool32 IsBattlerIncapacitated(u32 battler, enum Ability ability)
{
if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler))
return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected
@ -3469,7 +3469,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability)
return FALSE;
}
bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove)
bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove)
{
if (!CanBeSlept(battlerAtk, battlerDef, defAbility, BLOCKED_BY_SLEEP_CLAUSE)
|| DoesSubstituteBlockMove(battlerAtk, battlerDef, move)
@ -3478,7 +3478,7 @@ bool32 AI_CanPutToSleep(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move
return TRUE;
}
static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ability)
static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, enum Ability ability)
{
if (ability == ABILITY_MARVEL_SCALE
|| ability == ABILITY_QUICK_FEET
@ -3492,7 +3492,7 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab
bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef)
{
u32 abilityDef = gAiLogicData->abilities[battlerDef];
enum Ability abilityDef = gAiLogicData->abilities[battlerDef];
// Battler can be poisoned and has move/ability that synergizes with being poisoned
if (CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], abilityDef) && (
DoesBattlerBenefitFromAllVolatileStatus(battlerDef, abilityDef)
@ -3510,7 +3510,7 @@ bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef)
return TRUE;
}
bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
// Battler can be burned and has move/ability that synergizes with being burned
if (CanBeBurned(battlerAtk, battlerDef, abilityDef) && (
@ -3530,7 +3530,7 @@ bool32 ShouldBurn(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return TRUE;
}
bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
if (!B_USE_FROSTBITE)
{
@ -3562,7 +3562,7 @@ bool32 ShouldFreezeOrFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
}
}
bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
// Battler can be paralyzed and has move/ability that synergizes with being paralyzed
if (CanBeParalyzed(battlerAtk, battlerDef, abilityDef) && (
@ -3579,7 +3579,7 @@ bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return TRUE;
}
bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove)
bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove)
{
if (!CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], defAbility)
|| gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0)
@ -3590,7 +3590,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3
return TRUE;
}
bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove)
bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 move, u32 partnerMove)
{
if (!CanBeParalyzed(battlerAtk, battlerDef, defAbility)
|| gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0)
@ -3600,7 +3600,7 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move,
return TRUE;
}
bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef)
bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability abilityDef)
{
if (gBattleMons[battlerDef].volatiles.confusionTurns > 0
|| (abilityDef == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move))
@ -3611,7 +3611,7 @@ bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 abilityDef
return TRUE;
}
bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
{
if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY
&& AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility)
@ -3625,7 +3625,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battler
return TRUE;
}
bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
{
if (!CanBeBurned(battlerAtk, battlerDef, defAbility)
|| gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0)
@ -3637,7 +3637,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk
return TRUE;
}
bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove)
{
if (!CanBeFrozen(battlerAtk, battlerDef, defAbility)
|| gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0)
@ -3649,7 +3649,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b
return TRUE;
}
bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility)
bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, enum Ability defAbility)
{
if (gBattleMons[battlerDef].volatiles.infatuation
|| gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0)
@ -3660,7 +3660,7 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility)
return TRUE;
}
u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move)
u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, enum Ability atkAbility, enum Ability defAbility, u32 move)
{
u32 predictedMoveSpeedCheck = GetIncomingMoveSpeedCheck(battlerAtk, battlerDef, gAiLogicData);
if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS))
@ -3737,7 +3737,7 @@ bool32 IsFlinchGuaranteed(u32 battlerAtk, u32 battlerDef, u32 move)
bool32 HasChoiceEffect(u32 battler)
{
u32 ability = gAiLogicData->abilities[battler];
enum Ability ability = gAiLogicData->abilities[battler];
if (ability == ABILITY_GORILLA_TACTICS)
return TRUE;
@ -4487,7 +4487,7 @@ bool32 SideHasMoveCategory(u32 battlerId, enum DamageCategory category)
return FALSE;
}
bool32 IsAbilityOfRating(u32 ability, s8 rating)
bool32 IsAbilityOfRating(enum Ability ability, s8 rating)
{
if (gAbilitiesInfo[ability].aiRating >= rating)
return TRUE;
@ -4924,7 +4924,7 @@ void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score
}
}
bool32 AI_MoveMakesContact(u32 ability, enum ItemHoldEffect holdEffect, u32 move)
bool32 AI_MoveMakesContact(enum Ability ability, enum ItemHoldEffect holdEffect, u32 move)
{
if (MoveMakesContact(move)
&& ability != ABILITY_LONG_REACH
@ -5449,7 +5449,7 @@ void IncreaseTidyUpScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score)
bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, struct AiLogicData *aiData)
{
u32 preventsStatLoss;
u32 partnerAbility = aiData->abilities[battlerAtkPartner];
enum Ability partnerAbility = aiData->abilities[battlerAtkPartner];
u32 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battlerAtk));
u32 opposingBattler = GetBattlerAtPosition(opposingPosition);
@ -5532,7 +5532,7 @@ bool32 IsBattlerItemEnabled(u32 battler)
return TRUE;
}
bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiData)
bool32 HasBattlerSideAbility(u32 battler, enum Ability ability, struct AiLogicData *aiData)
{
if (aiData->abilities[battler] == ability)
return TRUE;
@ -5553,7 +5553,7 @@ u32 GetFriendlyFireKOThreshold(u32 battler)
return FRIENDLY_FIRE_NORMAL_THRESHOLD;
}
bool32 IsMoxieTypeAbility(u32 ability)
bool32 IsMoxieTypeAbility(enum Ability ability)
{
switch (ability)
{
@ -5569,7 +5569,7 @@ bool32 IsMoxieTypeAbility(u32 ability)
}
}
bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability)
bool32 DoesAbilityRaiseStatsWhenLowered(enum Ability ability)
{
switch (ability)
{
@ -5582,7 +5582,7 @@ bool32 DoesAbilityRaiseStatsWhenLowered(u32 ability)
}
}
bool32 DoesIntimidateRaiseStats(u32 ability)
bool32 DoesIntimidateRaiseStats(enum Ability ability)
{
switch (ability)
{
@ -5598,7 +5598,7 @@ bool32 DoesIntimidateRaiseStats(u32 ability)
}
// TODO: work out when to attack into the player's contextually 'beneficial' ability
bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, u32 ability)
bool32 ShouldTriggerAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability)
{
if (IsTargetingPartner(battlerAtk, battlerDef))
{
@ -5671,8 +5671,8 @@ bool32 CanEffectChangeAbility(u32 battlerAtk, u32 battlerDef, u32 effect, struct
if (gBattleMons[battlerDef].volatiles.gastroAcid)
return FALSE;
u32 atkAbility = aiData->abilities[battlerAtk];
u32 defAbility = aiData->abilities[battlerDef];
enum Ability atkAbility = aiData->abilities[battlerAtk];
enum Ability defAbility = aiData->abilities[battlerDef];
bool32 hasSameAbility = (atkAbility == defAbility);
if (defAbility == ABILITY_NONE)
@ -5794,8 +5794,8 @@ bool32 DoesEffectReplaceTargetAbility(u32 effect)
void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score, struct AiLogicData *aiData)
{
bool32 isTargetingPartner = IsTargetingPartner(battlerAtk, battlerDef);
u32 abilityAtk = aiData->abilities[battlerAtk];
u32 abilityDef = aiData->abilities[battlerDef];
enum Ability abilityAtk = aiData->abilities[battlerAtk];
enum Ability abilityDef = aiData->abilities[battlerDef];
bool32 partnerHasBadAbility = FALSE;
u32 partnerAbility = ABILITY_NONE;
bool32 attackerHasBadAbility = (gAbilitiesInfo[abilityAtk].aiRating < 0);
@ -5865,7 +5865,7 @@ void AbilityChangeScore(u32 battlerAtk, u32 battlerDef, u32 effect, s32 *score,
}
}
s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData *aiData)
s32 BattlerBenefitsFromAbilityScore(u32 battler, enum Ability ability, struct AiLogicData *aiData)
{
if (gAbilitiesInfo[ability].aiRating < 0)
return WORST_EFFECT;
@ -5916,7 +5916,7 @@ s32 BattlerBenefitsFromAbilityScore(u32 battler, u32 ability, struct AiLogicData
break;
case ABILITY_INTIMIDATE:
{
u32 abilityDef = aiData->abilities[LEFT_FOE(battler)];
enum Ability abilityDef = aiData->abilities[LEFT_FOE(battler)];
if (DoesIntimidateRaiseStats(abilityDef))
{
return AWFUL_EFFECT;

View File

@ -6964,7 +6964,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId)
// For Snipe Shot and abilities Stalwart/Propeller Tail - keep the original target.
for (i = 0; i < gBattlersCount; i++)
{
u16 ability = GetBattlerAbility(i);
enum Ability ability = GetBattlerAbility(i);
// if not targeting a slot that got switched, continue
if (!IsBattlerAlly(gBattleStruct->moveTarget[i], battlerAtk))
continue;

View File

@ -759,7 +759,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data)
AddTextPrinterParameterized3(data->aiMovesWindowId, FONT_NORMAL, 103 + count * 54, (i * 15) + 15, sTextColorTable[COLORID_RED], 0, COMPOUND_STRING("/"));
else
AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, COMPOUND_STRING("/"), 103 + count * 54, (i * 15) + 15, 0, NULL);
ConvertIntToDecimalStringN(text,
AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, gAiLogicData),
STR_CONV_MODE_LEADING_ZEROS, 3);
@ -920,7 +920,7 @@ static void PutAiInfoText(struct BattleDebugMenu *data)
{
if (IsOnPlayerSide(i) && IsBattlerAlive(i))
{
u16 ability = gAiLogicData->abilities[i];
enum Ability ability = gAiLogicData->abilities[i];
enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[i];
u16 item = gAiLogicData->items[i];
u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75;

View File

@ -2393,8 +2393,9 @@ static int SelectOpponentMonsFromParty(int *partyMovePoints, bool8 allowRandom)
static int GetTypeEffectivenessPoints(int move, int targetSpecies, int mode)
{
int defType1, defType2, defAbility, moveType;
int defType1, defType2, moveType;
int typePower = TYPE_x1;
enum Ability defAbility;
if (move == MOVE_NONE || move == MOVE_UNAVAILABLE || IsBattleMoveStatus(move))
return 0;
@ -5141,7 +5142,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun
{
u32 personality = 0;
u32 targetSpecies = 0;
u32 targetAbility = 0;
enum Ability targetAbility = 0;
uq4_12_t typeMultiplier = 0;
do
{

View File

@ -188,7 +188,7 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
u32 currBattleWeather = GetCurrentBattleWeather();
if (currBattleWeather == 0xFF)
@ -294,7 +294,7 @@ static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler)
static bool32 HandleEndTurnEmergencyExit(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattleStruct->turnEffectsBattlerId++;
@ -505,7 +505,7 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
break;
case FIRST_EVENT_BLOCK_ABILITIES:
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
switch (ability)
{
case ABILITY_HEALER:
@ -514,6 +514,8 @@ static bool32 HandleEndTurnFirstEventBlock(u32 battler)
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))
effect = TRUE;
break;
default:
break;
}
gBattleStruct->eventBlockCounter++;
break;
@ -609,7 +611,7 @@ static bool32 HandleEndTurnPoison(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattleStruct->turnEffectsBattlerId++;
@ -657,7 +659,7 @@ static bool32 HandleEndTurnBurn(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattleStruct->turnEffectsBattlerId++;
@ -1004,7 +1006,7 @@ static bool32 HandleEndTurnYawn(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattleStruct->turnEffectsBattlerId++;
@ -1406,7 +1408,7 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
break;
case THIRD_EVENT_BLOCK_ABILITIES:
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
switch (ability)
{
case ABILITY_TRUANT: // Not fully accurate but it has to be handled somehow. TODO: Find a better way.
@ -1421,6 +1423,8 @@ static bool32 HandleEndTurnThirdEventBlock(u32 battler)
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))
effect = TRUE;
break;
default:
break;
}
gBattleStruct->eventBlockCounter++;
break;
@ -1456,7 +1460,7 @@ static bool32 HandleEndTurnAbilities(u32 battler)
{
bool32 effect = FALSE;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattleStruct->turnEffectsBattlerId++;
@ -1468,6 +1472,8 @@ static bool32 HandleEndTurnAbilities(u32 battler)
case ABILITY_ZEN_MODE:
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))
effect = TRUE;
default:
break;
}
return effect;
@ -1481,7 +1487,7 @@ static bool32 HandleEndTurnFourthEventBlock(u32 battler)
{
case FOURTH_EVENT_BLOCK_HUNGER_SWITCH:
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (ability == ABILITY_HUNGER_SWITCH)
{
if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, battler, ability, 0, MOVE_NONE))

View File

@ -2603,7 +2603,7 @@ static void PrintBattlerOnAbilityPopUp(u8 battler, u8 spriteId1, u8 spriteId2)
TRUE, gSprites[spriteId1].sBattlerId);
}
static void PrintAbilityOnAbilityPopUp(u32 ability, u8 spriteId1, u8 spriteId2)
static void PrintAbilityOnAbilityPopUp(enum Ability ability, u8 spriteId1, u8 spriteId2)
{
PrintOnAbilityPopUp(COMPOUND_STRING(" "),
(void *)(OBJ_VRAM0) + TILE_OFFSET_4BPP(gSprites[spriteId1].oam.tileNum) + TILE_OFFSET_4BPP(8),
@ -2631,7 +2631,7 @@ static inline bool32 IsAnyAbilityPopUpActive(void)
return activeAbilityPopUps;
}
void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle)
void CreateAbilityPopUp(u8 battler, enum Ability ability, bool32 isDoubleBattle)
{
u8 *spriteIds;
u32 xSlide, tileTag, battlerPosition = GetBattlerPosition(battler);
@ -2696,7 +2696,7 @@ void CreateAbilityPopUp(u8 battler, u32 ability, bool32 isDoubleBattle)
void UpdateAbilityPopup(u8 battler)
{
u8 *spriteIds = gBattleStruct->abilityPopUpSpriteIds[battler];
u16 ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite
enum Ability ability = (gBattleScripting.abilityPopupOverwrite) ? gBattleScripting.abilityPopupOverwrite
: gBattleMons[battler].ability;
PrintAbilityOnAbilityPopUp(ability, spriteIds[0], spriteIds[1]);
}

View File

@ -167,7 +167,7 @@ EWRAM_DATA u16 gChosenMove = 0;
EWRAM_DATA u16 gCalledMove = 0;
EWRAM_DATA s32 gBideDmg[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u16 gLastUsedItem = 0;
EWRAM_DATA u16 gLastUsedAbility = 0;
EWRAM_DATA enum Ability gLastUsedAbility = 0;
EWRAM_DATA u8 gBattlerAttacker = 0;
EWRAM_DATA u8 gBattlerTarget = 0;
EWRAM_DATA u8 gBattlerFainted = 0;
@ -3417,7 +3417,7 @@ const u8* FaintClearSetData(u32 battler)
// If the released mon can be confused, do so.
// Don't use CanBeConfused here, since it can cause issues in edge cases.
u32 ability = GetBattlerAbility(otherSkyDropper);
enum Ability ability = GetBattlerAbility(otherSkyDropper);
if (!(ability == ABILITY_OWN_TEMPO
|| gBattleMons[otherSkyDropper].volatiles.confusionTurns
|| IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN)))
@ -4742,7 +4742,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, enum ItemHoldEffect holdEffect)
u32 GetBattlerTotalSpeedStatArgs(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect)
{
u32 speed = gBattleMons[battler].speed;
@ -4811,12 +4811,12 @@ u32 GetBattlerTotalSpeedStatArgs(u32 battler, u32 ability, enum ItemHoldEffect h
u32 GetBattlerTotalSpeedStat(u32 battler)
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler);
return GetBattlerTotalSpeedStatArgs(battler, ability, holdEffect);
}
s32 GetChosenMovePriority(u32 battler, u32 ability)
s32 GetChosenMovePriority(u32 battler, enum Ability ability)
{
u16 move;
@ -4829,7 +4829,7 @@ s32 GetChosenMovePriority(u32 battler, u32 ability)
return GetBattleMovePriority(battler, ability, move);
}
s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move)
s32 GetBattleMovePriority(u32 battler, enum Ability ability, u32 move)
{
s32 priority = 0;
@ -4869,7 +4869,7 @@ s32 GetBattleMovePriority(u32 battler, u32 ability, u32 move)
return priority;
}
s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, u32 ability1, u32 ability2,
s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMoves, enum Ability ability1, enum Ability ability2,
enum ItemHoldEffect holdEffectBattler1, enum ItemHoldEffect holdEffectBattler2, u32 speedBattler1, u32 speedBattler2, s32 priority1, s32 priority2)
{
u32 strikesFirst = 0;
@ -4935,12 +4935,12 @@ s32 GetWhichBattlerFasterArgs(u32 battler1, u32 battler2, bool32 ignoreChosenMov
s32 GetWhichBattlerFasterOrTies(u32 battler1, u32 battler2, bool32 ignoreChosenMoves)
{
s32 priority1 = 0, priority2 = 0;
u32 ability1 = GetBattlerAbility(battler1);
enum Ability ability1 = GetBattlerAbility(battler1);
u32 speedBattler1 = GetBattlerTotalSpeedStat(battler1);
enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1);
u32 speedBattler2 = GetBattlerTotalSpeedStat(battler2);
enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2);
u32 ability2 = GetBattlerAbility(battler2);
enum Ability ability2 = GetBattlerAbility(battler2);
if (!ignoreChosenMoves)
{
@ -5276,10 +5276,10 @@ static void TryChangeTurnOrder(void)
static void TryChangingTurnOrderEffects(u32 battler1, u32 battler2, u32 *quickClawRandom, u32 *quickDrawRandom)
{
u32 ability1 = GetBattlerAbility(battler1);
enum Ability ability1 = GetBattlerAbility(battler1);
enum ItemHoldEffect holdEffectBattler1 = GetBattlerHoldEffect(battler1);
enum ItemHoldEffect holdEffectBattler2 = GetBattlerHoldEffect(battler2);
u32 ability2 = GetBattlerAbility(battler2);
enum Ability ability2 = GetBattlerAbility(battler2);
// Battler 1
// Quick Draw
@ -5795,7 +5795,7 @@ void RunBattleScriptCommands(void)
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
u32 TrySetAteType(u32 move, u32 battlerAtk, enum Ability attackerAbility)
{
u32 ateType = TYPE_NONE;
@ -5847,7 +5847,8 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState
{
u32 moveType = GetMoveType(move);
enum BattleMoveEffects moveEffect = GetMoveEffect(move);
u32 species, heldItem, ability, type1, type2, type3;
u32 species, heldItem, type1, type2, type3;
enum Ability ability;
enum ItemHoldEffect holdEffect;
enum Gimmick gimmick = GetActiveGimmick(battler);

View File

@ -811,7 +811,7 @@ static void HealMon(struct Pokemon *mon)
static bool8 DoesAbilityPreventStatus(struct Pokemon *mon, u32 status)
{
u16 ability = GetMonAbility(mon);
enum Ability ability = GetMonAbility(mon);
bool8 ret = FALSE;
if (ability == ABILITY_COMATOSE)
@ -1623,7 +1623,7 @@ static bool8 CanEncounterWildMon(u8 enemyMonLevel)
{
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u16 monAbility = GetMonAbility(&gPlayerParty[0]);
enum Ability monAbility = GetMonAbility(&gPlayerParty[0]);
if (monAbility == ABILITY_KEEN_EYE || monAbility == ABILITY_INTIMIDATE)
{
u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL);

87
src/battle_script_commands.c Executable file → Normal file
View File

@ -328,7 +328,7 @@ static bool32 SetTargetToNextPursuiter(u32 battlerDef);
void ApplyExperienceMultipliers(s32 *expAmount, u8 expGetterMonId, u8 faintedBattler);
static void RemoveAllWeather(void);
static void RemoveAllTerrains(void);
static bool32 CanAbilityPreventStatLoss(u32 abilityDef);
static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef);
static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent);
static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove);
static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move);
@ -1008,7 +1008,7 @@ static bool32 NoTargetPresent(u8 battler, u32 move)
return FALSE;
}
bool32 ProteanTryChangeType(u32 battler, u32 ability, u32 move, u32 moveType)
bool32 ProteanTryChangeType(u32 battler, enum Ability ability, u32 move, u32 moveType)
{
if ((ability == ABILITY_PROTEAN || ability == ABILITY_LIBERO)
&& !gDisableStructs[gBattlerAttacker].usedProteanLibero
@ -1089,7 +1089,7 @@ bool32 IsMovePowderBlocked(struct BattleContext *ctx)
bool32 EmergencyExitCanBeTriggered(u32 battler)
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (ability != ABILITY_EMERGENCY_EXIT && ability != ABILITY_WIMP_OUT)
return FALSE;
@ -1364,7 +1364,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u
move = gCurrentMove;
enum BattleMoveEffects effect = GetMoveEffect(move);
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker);
if (move == NO_ACC_CALC_CHECK_LOCK_ON)
@ -1416,7 +1416,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u
continue;
numTargets++;
u32 abilityDef = GetBattlerAbility(battlerDef);
enum Ability abilityDef = GetBattlerAbility(battlerDef);
if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr)
|| CanMoveSkipAccuracyCalc(gBattlerAttacker, battlerDef, abilityAtk, abilityDef, move, RUN_SCRIPT))
continue;
@ -1562,7 +1562,7 @@ static inline u32 GetHoldEffectCritChanceIncrease(u32 battler, enum ItemHoldEffe
return critStageIncrease;
}
s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, u32 abilityAtk, u32 abilityDef, enum ItemHoldEffect holdEffectAtk)
s32 CalcCritChanceStage(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk)
{
s32 critChance = 0;
@ -1611,7 +1611,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, enum ItemHoldEffect holdEffectAtk)
s32 CalcCritChanceStageGen1(u32 battlerAtk, u32 battlerDef, u32 move, bool32 recordAbility, enum Ability abilityAtk, enum Ability abilityDef, enum ItemHoldEffect holdEffectAtk)
{
s32 critChance = 0;
s32 moveCritStage = GetMoveCriticalHitStage(gCurrentMove);
@ -1677,7 +1677,6 @@ static void Cmd_critcalc(void)
u32 partySlot = gBattlerPartyIndexes[gBattlerAttacker],
moveTarget = GetBattlerMoveTargetType(gBattlerAttacker, gCurrentMove),
abilityAtk = GetBattlerAbility(gBattlerAttacker),
battlerDef;
bool32 calcSpreadMoveDamage = IsSpreadMove(moveTarget) && !IsBattleMoveStatus(gCurrentMove);
enum ItemHoldEffect holdEffectAtk = GetBattlerHoldEffect(gBattlerAttacker);
@ -1696,7 +1695,8 @@ static void Cmd_critcalc(void)
|| gBattleStruct->moveResultFlags[battlerDef] & MOVE_RESULT_NO_EFFECT)
continue;
u32 abilityDef = GetBattlerAbility(battlerDef);
enum Ability abilityDef = GetBattlerAbility(battlerDef);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
if (GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1)
gBattleStruct->critChance[battlerDef] = CalcCritChanceStageGen1(gBattlerAttacker, battlerDef, gCurrentMove, TRUE, abilityAtk, abilityDef, holdEffectAtk);
@ -1960,7 +1960,7 @@ static void Cmd_multihitresultmessage(void)
static inline bool32 DoesBattlerNegateDamage(u32 battler)
{
u32 species = gBattleMons[battler].species;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (gBattleMons[battler].volatiles.transformed)
return FALSE;
@ -4061,7 +4061,7 @@ static void SetToxicChainPriority(void)
if (gBattleStruct->toxicChainPriority)
return;
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
if (abilityAtk == ABILITY_TOXIC_CHAIN
&& IsBattlerAlive(gBattlerTarget)
&& CanBePoisoned(gBattlerAttacker, gBattlerTarget, abilityAtk, GetBattlerAbility(gBattlerTarget))
@ -4330,11 +4330,11 @@ static void Cmd_jumpifvolatile(void)
static void Cmd_jumpifability(void)
{
CMD_ARGS(u8 battler, u16 ability, const u8 *jumpInstr);
CMD_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr);
u32 battler;
bool32 hasAbility = FALSE;
u32 ability = cmd->ability;
enum Ability ability = cmd->ability;
switch (cmd->battler)
{
@ -5360,10 +5360,10 @@ static void Cmd_setroost(void)
static void Cmd_jumpifabilitypresent(void)
{
CMD_ARGS(u16 ability, const u8 *jumpInstr);
CMD_ARGS(enum Ability ability, const u8 *jumpInstr);
u16 ability = cmd->ability;
u32 abilityBattler = IsAbilityOnField(ability);
enum Ability ability = cmd->ability;
enum Ability abilityBattler = IsAbilityOnField(ability);
if (abilityBattler)
{
gBattlerAbility = abilityBattler - 1;
@ -5532,7 +5532,7 @@ static inline bool32 CanEjectPackTrigger(u32 battlerAtk, u32 battlerDef, enum Ba
static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move)
{
bool32 effect = FALSE;
u32 abilityAtk = GetBattlerAbility(battlerAtk);
enum Ability abilityAtk = GetBattlerAbility(battlerAtk);
switch (abilityAtk)
{
@ -5643,6 +5643,8 @@ static bool32 HandleMoveEndAbilityBlock(u32 battlerAtk, u32 battlerDef, u32 move
}
}
break;
default:
break;
}
return effect;
@ -7657,7 +7659,7 @@ void TryHazardsOnSwitchIn(u32 battler, u32 side, enum Hazards hazardType)
break;
case HAZARDS_SPIKES:
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (ability != ABILITY_MAGIC_GUARD
&& IsBattlerAffectedByHazards(battler, FALSE)
&& IsBattlerGrounded(battler, ability, GetBattlerHoldEffect(battler)))
@ -7781,7 +7783,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
}
else
{
u32 battlerAbility = GetBattlerAbility(battler);
enum Ability battlerAbility = GetBattlerAbility(battler);
// There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts.
// The truant counter is not updated in the case where a mon switches in after a lost judgment in the battle arena.
if (battlerAbility == ABILITY_TRUANT
@ -7799,7 +7801,7 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
if (i == battler)
continue;
u32 ability = GetBattlerAbility(i);
enum Ability ability = GetBattlerAbility(i);
switch (ability)
{
case ABILITY_TRACE:
@ -7813,6 +7815,8 @@ static bool32 DoSwitchInEffectsForBattler(u32 battler)
if (AbilityBattleEffects(ABILITYEFFECT_ON_WEATHER, i, ability, 0, 0))
return TRUE;
break;
default:
break;
}
if (TryClearIllusion(i, ABILITYEFFECT_ON_SWITCHIN))
return TRUE;
@ -9256,7 +9260,7 @@ u32 IsFlowerVeilProtected(u32 battler)
return 0;
}
u32 IsLeafGuardProtected(u32 battler, u32 ability)
u32 IsLeafGuardProtected(u32 battler, enum Ability ability)
{
if (IsBattlerWeatherAffected(battler, B_WEATHER_SUN))
return ability == ABILITY_LEAF_GUARD;
@ -9264,13 +9268,13 @@ u32 IsLeafGuardProtected(u32 battler, u32 ability)
return 0;
}
bool32 IsShieldsDownProtected(u32 battler, u32 ability)
bool32 IsShieldsDownProtected(u32 battler, enum Ability ability)
{
return (ability == ABILITY_SHIELDS_DOWN
&& GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form
}
u32 IsAbilityStatusProtected(u32 battler, u32 ability)
u32 IsAbilityStatusProtected(u32 battler, enum Ability ability)
{
return IsLeafGuardProtected(battler, ability)
|| IsShieldsDownProtected(battler, ability)
@ -9311,7 +9315,7 @@ static bool32 IsRototillerAffected(u32 battler)
return TRUE;
}
static bool32 IsElectricAbilityAffected(u32 battler, u32 ability)
static bool32 IsElectricAbilityAffected(u32 battler, enum Ability ability)
{
u32 moveType;
@ -9737,7 +9741,7 @@ static void Cmd_trysetrest(void)
gBattlerTarget = gBattlerAttacker;
gBattleStruct->moveDamage[gBattlerTarget] = gBattleMons[gBattlerTarget].maxHP * (-1);
u32 ability = GetBattlerAbility(gBattlerTarget);
enum Ability ability = GetBattlerAbility(gBattlerTarget);
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget);
if (IsBattlerTerrainAffected(gBattlerTarget, ability, holdEffect, STATUS_FIELD_ELECTRIC_TERRAIN))
@ -9975,7 +9979,7 @@ static u16 ReverseStatChangeMoveEffect(u16 moveEffect)
}
}
static void TryPlayStatChangeAnimation(u32 battler, u32 ability, u32 stats, s32 statValue, u32 statId, bool32 certain)
static void TryPlayStatChangeAnimation(u32 battler, enum Ability ability, u32 stats, s32 statValue, u32 statId, bool32 certain)
{
u32 currStat = 0;
u32 changeableStatsCount = 1; // current stat is counted automatically
@ -10768,7 +10772,7 @@ static void Cmd_tryKO(void)
enum BattleMoveEffects effect = GetMoveEffect(gCurrentMove);
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget);
u16 targetAbility = GetBattlerAbility(gBattlerTarget);
enum Ability targetAbility = GetBattlerAbility(gBattlerTarget);
u32 rand = Random() % 100;
u32 affectionScore = GetBattlerAffectionHearts(gBattlerTarget);
u32 endured = NOT_ENDURED;
@ -11700,7 +11704,7 @@ static void Cmd_healpartystatus(void)
if (species != SPECIES_NONE && species != SPECIES_EGG)
{
u16 ability;
enum Ability ability;
bool32 isAttacker = gBattlerPartyIndexes[gBattlerAttacker] == i;
bool32 isDoublesPartner = gBattlerPartyIndexes[partner] == i && IsBattlerAlive(partner);
@ -12682,7 +12686,7 @@ static void Cmd_trycopyability(void)
u32 battler = GetBattlerForBattleScript(cmd->battler);
u32 partner = BATTLE_PARTNER(battler);
u16 defAbility = gBattleMons[gBattlerTarget].ability;
enum Ability defAbility = gBattleMons[gBattlerTarget].ability;
bool32 shouldConsiderPartner = IsBattlerAlive(partner) && GetMoveEffect(gCurrentMove) == EFFECT_DOODLE;
if (gBattleMons[battler].ability == defAbility
@ -12772,7 +12776,7 @@ static void Cmd_setgastroacid(void)
static void Cmd_setyawn(void)
{
CMD_ARGS(const u8 *failInstr);
u32 ability = GetBattlerAbility(gBattlerTarget);
enum Ability ability = GetBattlerAbility(gBattlerTarget);
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(gBattlerTarget);
if (gBattleMons[gBattlerTarget].volatiles.yawn
@ -13056,6 +13060,8 @@ static void Cmd_switchoutabilities(void)
&regenerate);
MarkBattlerForControllerExec(battler);
break;
default:
break;
}
}
@ -13084,8 +13090,9 @@ static void Cmd_pickup(void)
CMD_ARGS();
u32 i, j;
u16 species, heldItem, ability;
u16 species, heldItem;
u8 lvlDivBy10;
enum Ability ability;
if (!InBattlePike()) // No items in Battle Pike.
{
@ -14531,7 +14538,7 @@ static bool8 IsFinalStrikeEffect(enum BattleMoveEffects moveEffect)
return FALSE;
}
static bool32 CanAbilityPreventStatLoss(u32 abilityDef)
static bool32 CanAbilityPreventStatLoss(enum Ability abilityDef)
{
switch (abilityDef)
{
@ -14539,6 +14546,8 @@ static bool32 CanAbilityPreventStatLoss(u32 abilityDef)
case ABILITY_FULL_METAL_BODY:
case ABILITY_WHITE_SMOKE:
return TRUE;
default:
break;
}
return FALSE;
}
@ -14951,7 +14960,7 @@ void BS_JumpIfShellTrap(void)
void BS_JumpIfElectricAbilityAffected(void)
{
NATIVE_ARGS(u8 battler, u16 ability, const u8 *jumpInstr);
NATIVE_ARGS(u8 battler, enum Ability ability, const u8 *jumpInstr);
u32 battler = GetBattlerForBattleScript(cmd->battler);
if (IsElectricAbilityAffected(battler, cmd->ability))
@ -15277,7 +15286,7 @@ void BS_TryUpperHand(void)
{
NATIVE_ARGS(const u8 *failInstr);
u32 abilityDef = GetBattlerAbility(gBattlerTarget);
enum Ability abilityDef = GetBattlerAbility(gBattlerTarget);
u32 prio = GetChosenMovePriority(gBattlerTarget, abilityDef);
if (HasBattlerActedThisTurn(gBattlerTarget)
@ -15689,7 +15698,7 @@ void BS_TryWindRiderPower(void)
NATIVE_ARGS(u8 battler, const u8 *failInstr);
u32 battler = GetBattlerForBattleScript(cmd->battler);
u16 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (IsBattlerAlly(battler, gBattlerAttacker)
&& (ability == ABILITY_WIND_RIDER || ability == ABILITY_WIND_POWER))
{
@ -16229,7 +16238,7 @@ void BS_JumpIfIntimidateAbilityPrevented(void)
NATIVE_ARGS();
u32 hasAbility = FALSE;
u32 ability = GetBattlerAbility(gBattlerTarget);
enum Ability ability = GetBattlerAbility(gBattlerTarget);
switch (ability)
{
@ -16306,7 +16315,7 @@ void BS_TryBoosterEnergy(void)
if (GetBattlerHoldEffect(battlerByTurnOrder) != HOLD_EFFECT_BOOSTER_ENERGY)
continue;
u32 ability = GetBattlerAbility(battlerByTurnOrder);
enum Ability ability = GetBattlerAbility(battlerByTurnOrder);
if (!(ability == ABILITY_PROTOSYNTHESIS && cmd->onFieldStatus != ON_TERRAIN)
&& !(ability == ABILITY_QUARK_DRIVE && cmd->onFieldStatus != ON_WEATHER))
continue;
@ -16333,7 +16342,7 @@ void BS_TryActivateAbilityShield(void)
{
NATIVE_ARGS(u8 battler);
u32 battler = GetBattlerForBattleScript(cmd->battler);
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
gBattlescriptCurrInstr = cmd->nextInstr;
@ -17689,7 +17698,7 @@ void BS_TryToClearPrimalWeather(void)
for (u32 i = 0; i < gBattlersCount; i++)
{
u32 ability = GetBattlerAbility(i);
enum Ability ability = GetBattlerAbility(i);
if (((ability == ABILITY_DESOLATE_LAND && gBattleWeather & B_WEATHER_SUN_PRIMAL)
|| (ability == ABILITY_PRIMORDIAL_SEA && gBattleWeather & B_WEATHER_RAIN_PRIMAL)
|| (ability == ABILITY_DELTA_STREAM && gBattleWeather & B_WEATHER_STRONG_WINDS))

View File

@ -1569,7 +1569,8 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32
{
u8 ball = (fmon->ball == 0xFF) ? Random() % POKEBALL_COUNT : fmon->ball;
u16 move;
u32 personality = 0, ability, friendship, j;
u32 personality = 0, friendship, j;
enum Ability ability;
if (fmon->gender == TRAINER_MON_MALE)
{

View File

@ -67,7 +67,7 @@ static void SetRandomMultiHitCounter();
static u32 GetBattlerItemHoldEffectParam(u32 battler, u32 item);
static bool32 CanBeInfinitelyConfused(u32 battler);
static bool32 IsAnyTargetAffected(u32 battlerAtk);
static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option);
static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option);
static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum FunctionCallOption option);
// Submoves
@ -215,7 +215,7 @@ static const struct BattleWeatherInfo sBattleWeatherInfo[BATTLE_WEATHER_COUNT] =
// Helper function for actual dmg calcs during battle. For simulated AI dmg, CalcTypeEffectivenessMultiplier should be used directly
// This should stay a static function. Ideally everything else is handled through CalcTypeEffectivenessMultiplier just like AI
static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, bool32 recordAbilities)
static uq4_12_t CalcTypeEffectivenessMultiplierHelper(u32 move, u32 moveType, u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, bool32 recordAbilities)
{
struct DamageContext ctx = {0};
ctx.battlerAtk = battlerAtk;
@ -280,7 +280,7 @@ static u32 CalcBeatUpPower(void)
return (GetSpeciesBaseAttack(species) / 10) + 5;
}
static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, u32 abilityDef)
static bool32 ShouldTeraShellDistortTypeMatchups(u32 move, u32 battlerDef, enum Ability abilityDef)
{
if (!gSpecialStatuses[battlerDef].distortedTypeMatchups
&& gBattleMons[battlerDef].species == SPECIES_TERAPAGOS_TERASTAL
@ -305,7 +305,7 @@ static inline bool32 IsDragonDartsSecondHit(u32 effect)
bool32 IsAffectedByFollowMe(u32 battlerAtk, u32 defSide, u32 move)
{
u32 ability = GetBattlerAbility(battlerAtk);
enum Ability ability = GetBattlerAbility(battlerAtk);
enum BattleMoveEffects effect = GetMoveEffect(move);
if (gSideTimers[defSide].followmeTimer == 0
@ -332,7 +332,7 @@ bool32 HandleMoveTargetRedirection(void)
u32 moveType = GetBattleMoveType(gCurrentMove);
enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove);
u32 side = BATTLE_OPPOSITE(GetBattlerSide(gBattlerAttacker));
u32 ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]);
enum Ability ability = GetBattlerAbility(gBattleStruct->moveTarget[gBattlerAttacker]);
if (IsAffectedByFollowMe(gBattlerAttacker, side, gCurrentMove)
&& moveTarget == MOVE_TARGET_SELECTED
@ -348,7 +348,7 @@ bool32 HandleMoveTargetRedirection(void)
|| (ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER)))
{
// Find first battler that redirects the move (in turn order)
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
u32 battler;
for (battler = 0; battler < gBattlersCount; battler++)
{
@ -369,7 +369,7 @@ bool32 HandleMoveTargetRedirection(void)
}
if (redirectorOrderNum != MAX_BATTLERS_COUNT && gCurrentMove != MOVE_TEATIME)
{
u16 battlerAbility;
enum Ability battlerAbility;
battler = gBattlerByTurnOrder[redirectorOrderNum];
battlerAbility = GetBattlerAbility(battler);
RecordAbilityBattle(battler, battlerAbility);
@ -1071,7 +1071,7 @@ const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState)
// If the target can be confused, confuse them.
// Don't use CanBeConfused, can cause issues in edge cases.
u32 ability = GetBattlerAbility(otherSkyDropper);
enum Ability ability = GetBattlerAbility(otherSkyDropper);
if (!(gBattleMons[otherSkyDropper].volatiles.confusionTurns > 0
|| IsAbilityAndRecord(otherSkyDropper, ability, ABILITY_OWN_TEMPO)
|| IsBattlerTerrainAffected(otherSkyDropper, ability, GetBattlerHoldEffect(otherSkyDropper), STATUS_FIELD_MISTY_TERRAIN)))
@ -1152,7 +1152,7 @@ bool32 WasUnableToUseMove(u32 battler)
return FALSE;
}
bool32 ShouldDefiantCompetitiveActivate(u32 battler, u32 ability)
bool32 ShouldDefiantCompetitiveActivate(u32 battler, enum Ability ability)
{
u32 side = GetBattlerSide(battler);
if (ability != ABILITY_DEFIANT && ability != ABILITY_COMPETITIVE)
@ -1779,7 +1779,7 @@ s32 GetDrainedBigRootHp(u32 battler, s32 hp)
}
// Should always be the last check. Otherwise the ability might be wrongly recorded.
bool32 IsAbilityAndRecord(u32 battler, u32 battlerAbility, u32 abilityToCheck)
bool32 IsAbilityAndRecord(u32 battler, enum Ability battlerAbility, enum Ability abilityToCheck)
{
if (battlerAbility != abilityToCheck)
return FALSE;
@ -2705,7 +2705,7 @@ static enum MoveCanceller CancellerPowderStatus(struct BattleContext *ctx)
return MOVE_STEP_SUCCESS;
}
bool32 IsDazzlingAbility(u32 ability)
bool32 IsDazzlingAbility(enum Ability ability)
{
switch (ability)
{
@ -2790,7 +2790,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx)
{
if (GetMoveEffect(ctx->currentMove) == EFFECT_MULTI_HIT)
{
u32 ability = ctx->ability[ctx->battlerAtk];
enum Ability ability = ctx->ability[ctx->battlerAtk];
if (ability == ABILITY_SKILL_LINK)
{
@ -2861,7 +2861,7 @@ static enum MoveCanceller CancellerMultihitMoves(struct BattleContext *ctx)
static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx)
{
u32 moveTarget = GetBattlerMoveTargetType(ctx->battlerAtk, ctx->currentMove);
u32 abilityAtk = ctx->ability[ctx->battlerAtk];
enum Ability abilityAtk = ctx->ability[ctx->battlerAtk];
if (IsSpreadMove(moveTarget))
{
@ -2870,7 +2870,7 @@ static enum MoveCanceller CancellerMultiTargetMoves(struct BattleContext *ctx)
if (gBattleStruct->bouncedMoveIsUsed && !IsOnPlayerSide(battlerDef))
continue;
u32 abilityDef = GetBattlerAbility(battlerDef);
enum Ability abilityDef = GetBattlerAbility(battlerDef);
if (ctx->battlerAtk == battlerDef
|| !IsBattlerAlive(battlerDef)
@ -3126,7 +3126,7 @@ bool32 HasNoMonsToSwitch(u32 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2
bool32 TryChangeBattleWeather(u32 battler, u32 battleWeatherId, bool32 viaAbility)
{
u16 battlerAbility = GetBattlerAbility(battler);
enum Ability battlerAbility = GetBattlerAbility(battler);
if (gBattleWeather & sBattleWeatherInfo[battleWeatherId].flag)
{
@ -3334,7 +3334,7 @@ static void ChooseStatBoostAnimation(u32 battler)
#undef ANIM_STAT_ACC
#undef ANIM_STAT_EVASION
bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option)
bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option)
{
const u8 *battleScriptBlocksMove = NULL;
@ -3355,6 +3355,8 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a
battleScriptBlocksMove = BattleScript_GoodAsGoldActivates;
}
break;
default:
break;
}
if (battleScriptBlocksMove == NULL)
@ -3409,7 +3411,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a
return TRUE;
}
bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 move, u32 moveType, enum FunctionCallOption option)
bool32 CanAbilityAbsorbMove(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, u32 move, u32 moveType, enum FunctionCallOption option)
{
enum MoveAbsorbed effect = MOVE_ABSORBED_BY_NO_ABILITY;
const u8 *battleScript = NULL;
@ -3584,7 +3586,7 @@ static inline u32 SetStartingSideStatus(u32 flag, u32 side, u32 message, u32 ani
return 0;
}
u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 moveArg)
enum Ability AbilityBattleEffects(u32 caseID, u32 battler, enum Ability ability, u32 special, u32 moveArg)
{
u32 effect = 0;
u32 moveType = 0, move = 0;
@ -4489,6 +4491,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_ENDTURN:
@ -4724,6 +4728,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
gDisableStructs[battler].cudChew = TRUE;
}
break;
default:
break;
}
}
break;
@ -4767,6 +4773,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_MOVE_END: // Think contact abilities.
@ -4991,7 +4999,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
break;
case ABILITY_EFFECT_SPORE:
{
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
if ((!IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_GRASS) || B_POWDER_GRASS < GEN_6)
&& abilityAtk != ABILITY_OVERCOAT
&& GetBattlerHoldEffect(gBattlerAttacker) != HOLD_EFFECT_SAFETY_GOGGLES)
@ -5040,7 +5048,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
POISON_POINT:
{
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
if (IsBattlerAlive(gBattlerAttacker)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& IsBattlerTurnDamaged(gBattlerTarget)
@ -5062,7 +5070,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
{
STATIC:
{
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
if (IsBattlerAlive(gBattlerAttacker)
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
&& IsBattlerTurnDamaged(gBattlerTarget)
@ -5253,6 +5261,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_MOVE_END_ATTACKER: // Same as above, but for attacker
@ -5323,6 +5333,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_MOVE_END_OTHER: // Abilities that activate on *another* battler's moveend: Dancer, Soul-Heart, Receiver, Symbiosis
@ -5350,6 +5362,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_OPPORTUNIST:
@ -5369,6 +5383,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect = 1;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_IMMUNITY:
@ -5430,6 +5446,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
else if (gDisableStructs[battler].tauntTimer != 0)
effect = 4;
break;
default:
break;
}
if (effect != 0)
@ -5591,6 +5609,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
case ABILITYEFFECT_ON_TERRAIN: // For ability effects that activate when the field terrain changes.
@ -5620,6 +5640,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32
effect++;
}
break;
default:
break;
}
break;
}
@ -5657,7 +5679,7 @@ bool32 IsNeutralizingGasOnField(void)
return FALSE;
}
bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability)
bool32 IsMoldBreakerTypeAbility(u32 battler, enum Ability ability)
{
if (gBattleMons[battler].volatiles.gastroAcid)
return FALSE;
@ -5674,7 +5696,7 @@ bool32 IsMoldBreakerTypeAbility(u32 battler, u32 ability)
return FALSE;
}
static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, u32 ability, u32 hasAbilityShield, u32 ignoreMoldBreaker)
static inline bool32 CanBreakThroughAbility(u32 battlerAtk, u32 battlerDef, enum Ability ability, u32 hasAbilityShield, u32 ignoreMoldBreaker)
{
if (hasAbilityShield || ignoreMoldBreaker)
return FALSE;
@ -5697,7 +5719,7 @@ u32 GetBattlerAbilityIgnoreMoldBreaker(u32 battler)
return GetBattlerAbilityInternal(battler, TRUE, FALSE);
}
u32 GetBattlerAbility(u32 battler)
enum Ability GetBattlerAbility(u32 battler)
{
return GetBattlerAbilityInternal(battler, FALSE, FALSE);
}
@ -5735,7 +5757,7 @@ u32 GetBattlerAbilityInternal(u32 battler, u32 ignoreMoldBreaker, u32 noAbilityS
return gBattleMons[battler].ability;
}
u32 IsAbilityOnSide(u32 battler, u32 ability)
u32 IsAbilityOnSide(u32 battler, enum Ability ability)
{
if (IsBattlerAlive(battler) && GetBattlerAbility(battler) == ability)
return battler + 1;
@ -5745,12 +5767,12 @@ u32 IsAbilityOnSide(u32 battler, u32 ability)
return 0;
}
u32 IsAbilityOnOpposingSide(u32 battler, u32 ability)
u32 IsAbilityOnOpposingSide(u32 battler, enum Ability ability)
{
return IsAbilityOnSide(BATTLE_OPPOSITE(battler), ability);
}
u32 IsAbilityOnField(u32 ability)
u32 IsAbilityOnField(enum Ability ability)
{
u32 i;
@ -5763,7 +5785,7 @@ u32 IsAbilityOnField(u32 ability)
return 0;
}
u32 IsAbilityOnFieldExcept(u32 battler, u32 ability)
u32 IsAbilityOnFieldExcept(u32 battler, enum Ability ability)
{
u32 i;
@ -5787,7 +5809,7 @@ u32 IsAbilityPreventingEscape(u32 battler)
if (battler == battlerDef || IsBattlerAlly(battler, battlerDef))
continue;
u32 ability = GetBattlerAbility(battlerDef);
enum Ability ability = GetBattlerAbility(battlerDef);
if (ability == ABILITY_SHADOW_TAG && (B_SHADOW_TAG_ESCAPE <= GEN_3 || GetBattlerAbility(battler) != ABILITY_SHADOW_TAG))
return battlerDef + 1;
@ -5839,7 +5861,7 @@ void BattleScriptPushCursorAndCallback(const u8 *BS_ptr)
gBattleMainFunc = RunBattleScriptCommands;
}
bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, u32 terrainFlag)
bool32 IsBattlerTerrainAffected(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, u32 terrainFlag)
{
if (!(gFieldStatuses & terrainFlag))
return FALSE;
@ -5849,7 +5871,7 @@ bool32 IsBattlerTerrainAffected(u32 battler, u32 ability, enum ItemHoldEffect ho
return IsBattlerGrounded(battler, ability, holdEffect);
}
bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClauseBlock isBlockedBySleepClause)
bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef, enum SleepClauseBlock isBlockedBySleepClause)
{
if (IsSleepClauseActiveForSide(GetBattlerSide(battlerDef)) && isBlockedBySleepClause != NOT_BLOCKED_BY_SLEEP_CLAUSE)
return FALSE;
@ -5871,7 +5893,7 @@ bool32 CanBeSlept(u32 battlerAtk, u32 battlerDef, u32 abilityDef, enum SleepClau
return effect;
}
bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef)
bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef)
{
if (CanSetNonVolatileStatus(
battlerAtk,
@ -5885,7 +5907,7 @@ bool32 CanBePoisoned(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 ability
}
// TODO: check order of battlerAtk and battlerDef
bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
if (CanSetNonVolatileStatus(
battlerAtk,
@ -5898,7 +5920,7 @@ bool32 CanBeBurned(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return FALSE;
}
bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
if (CanSetNonVolatileStatus(
battlerAtk,
@ -5911,7 +5933,7 @@ bool32 CanBeParalyzed(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return FALSE;
}
bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
if (CanSetNonVolatileStatus(
battlerAtk,
@ -5923,9 +5945,8 @@ bool32 CanBeFrozen(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return TRUE;
return FALSE;
}
// Unused, technically also redundant because it is just a copy of CanBeFrozen
bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, enum Ability abilityDef)
{
if (CanSetNonVolatileStatus(
battlerAtk,
@ -5938,7 +5959,7 @@ bool32 CanGetFrostbite(u32 battlerAtk, u32 battlerDef, u32 abilityDef)
return FALSE;
}
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, enum MoveEffect effect, enum FunctionCallOption option)
bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, enum MoveEffect effect, enum FunctionCallOption option)
{
const u8 *battleScript = NULL;
u32 sideBattler = ABILITY_NONE;
@ -6103,7 +6124,7 @@ bool32 CanSetNonVolatileStatus(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u
return TRUE;
}
static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, u32 abilityDef, u32 abilityAffected, const u8 *battleScript, enum FunctionCallOption option)
static bool32 IsNonVolatileStatusBlocked(u32 battlerDef, enum Ability abilityDef, enum Ability abilityAffected, const u8 *battleScript, enum FunctionCallOption option)
{
if (battleScript != NULL)
{
@ -6149,7 +6170,7 @@ static bool32 CanSleepDueToSleepClause(u32 battlerAtk, u32 battlerDef, enum Func
bool32 CanBeConfused(u32 battler)
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (gBattleMons[battler].volatiles.confusionTurns > 0
|| IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN)
|| IsAbilityAndRecord(battler, ability, ABILITY_OWN_TEMPO))
@ -6251,7 +6272,7 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa
}
if (stat != NUM_STATS && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId))
{
u16 battlerAbility = GetBattlerAbility(battler);
enum Ability battlerAbility = GetBattlerAbility(battler);
u32 savedAttacker = gBattlerAttacker;
// MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker
gBattlerAttacker = gBattleScripting.battler = battler;
@ -6531,7 +6552,7 @@ static u32 TryConsumeMirrorHerb(u32 battler, enum ItemCaseId caseID)
return effect;
}
u32 TryBoosterEnergy(u32 battler, u32 ability, enum ItemCaseId caseID)
u32 TryBoosterEnergy(u32 battler, enum Ability ability, enum ItemCaseId caseID)
{
if (gDisableStructs[battler].boosterEnergyActivated || gBattleMons[battler].volatiles.transformed)
return ITEM_NO_EFFECT;
@ -7334,7 +7355,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
{
case HOLD_EFFECT_FLINCH:
{
u16 ability = GetBattlerAbility(gBattlerAttacker);
enum Ability ability = GetBattlerAbility(gBattlerAttacker);
if (B_SERENE_GRACE_BOOST >= GEN_5 && ability == ABILITY_SERENE_GRACE)
atkHoldEffectParam *= 2;
if (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW && gCurrentMove != MOVE_SECRET_POWER)
@ -7571,7 +7592,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler)
break;
case ITEMEFFECT_ORBS:
{
u16 battlerAbility = GetBattlerAbility(battler);
enum Ability battlerAbility = GetBattlerAbility(battler);
switch (battlerHoldEffect)
{
case HOLD_EFFECT_TOXIC_ORB:
@ -7712,7 +7733,7 @@ u32 GetBattleMoveTarget(u16 move, u8 setTarget)
}
else
{
u32 battlerAbilityOnField = 0;
enum Ability battlerAbilityOnField = 0;
targetBattler = SetRandomTarget(gBattlerAttacker);
if (moveType == TYPE_ELECTRIC && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD)
@ -7936,7 +7957,7 @@ u32 GetBattlerHoldEffectParam(u32 battler)
return GetItemHoldEffectParam(gBattleMons[battler].item);
}
bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move)
bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move)
{
if (holdEffectAtk == HOLD_EFFECT_PROTECTIVE_PADS)
{
@ -7947,7 +7968,7 @@ bool32 CanBattlerAvoidContactEffects(u32 battlerAtk, u32 battlerDef, u32 ability
return !IsMoveMakingContact(battlerAtk, battlerDef, abilityAtk, holdEffectAtk, move);
}
bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move)
bool32 IsMoveMakingContact(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum ItemHoldEffect holdEffectAtk, u32 move)
{
if (!(MoveMakesContact(move) || (GetMoveEffect(move) == EFFECT_SHELL_SIDE_ARM
&& gBattleStruct->shellSideArmCategory[battlerAtk][battlerDef] == DAMAGE_CATEGORY_PHYSICAL)))
@ -8065,7 +8086,7 @@ enum IronBallCheck
};
// Only called directly when calculating damage type effectiveness, and Iron Ball's type effectiveness mechanics
bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse)
bool32 IsBattlerGroundedInverseCheck(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect, enum InverseBattleCheck checkInverse)
{
if (holdEffect == HOLD_EFFECT_IRON_BALL)
return TRUE;
@ -8088,7 +8109,7 @@ bool32 IsBattlerGroundedInverseCheck(u32 battler, u32 ability, enum ItemHoldEffe
return TRUE;
}
bool32 IsBattlerGrounded(u32 battler, u32 ability, enum ItemHoldEffect holdEffect)
bool32 IsBattlerGrounded(u32 battler, enum Ability ability, enum ItemHoldEffect holdEffect)
{
return IsBattlerGroundedInverseCheck(battler, ability, holdEffect, NOT_INVERSE_BATTLE);
}
@ -8109,7 +8130,7 @@ u32 GetBattlerWeight(u32 battler)
{
u32 i;
u32 weight = GetSpeciesWeight(gBattleMons[battler].species);
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler);
if (ability == ABILITY_HEAVY_METAL)
@ -8778,6 +8799,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx)
case ABILITY_SUPREME_OVERLORD:
modifier = uq4_12_multiply(modifier, GetSupremeOverlordModifier(battlerAtk));
break;
default:
break;
}
// field abilities
@ -8806,6 +8829,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx)
if (moveType == TYPE_STEEL)
modifier = uq4_12_multiply(modifier, UQ_4_12(1.5));
break;
default:
break;
}
}
@ -8843,6 +8868,8 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageContext *ctx)
modifier = uq4_12_multiply(modifier, UQ_4_12(0.7));
}
break;
default:
break;
}
holdEffectParamAtk = GetBattlerHoldEffectParam(battlerAtk);
@ -9043,7 +9070,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
case ABILITY_PLUS:
if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))
{
u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk));
enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk));
if (partnerAbility == ABILITY_MINUS
|| (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_PLUS))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
@ -9052,7 +9079,7 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
case ABILITY_MINUS:
if (IsBattleMoveSpecial(move) && IsBattlerAlive(BATTLE_PARTNER(battlerAtk)))
{
u32 partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk));
enum Ability partnerAbility = GetBattlerAbility(BATTLE_PARTNER(battlerAtk));
if (partnerAbility == ABILITY_PLUS
|| (B_PLUS_MINUS_INTERACTION >= GEN_5 && partnerAbility == ABILITY_MINUS))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
@ -9125,6 +9152,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN && IsBattleMoveSpecial(move))
modifier = uq4_12_multiply(modifier, UQ_4_12(1.3333));
break;
default:
break;
}
// target's abilities
@ -9146,6 +9175,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
RecordAbilityBattle(battlerDef, ABILITY_PURIFYING_SALT);
}
break;
default:
break;
}
// ally's abilities
@ -9157,6 +9188,8 @@ static inline u32 CalcAttackStat(struct DamageContext *ctx)
if (gBattleMons[BATTLE_PARTNER(battlerAtk)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerAtk), B_WEATHER_SUN) && IsBattleMovePhysical(move))
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
break;
default:
break;
}
}
@ -9314,6 +9347,8 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx)
if (gBattleMons[battlerDef].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && !usesDefStat)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
break;
default:
break;
}
// ally's abilities
@ -9325,6 +9360,8 @@ static inline u32 CalcDefenseStat(struct DamageContext *ctx)
if (gBattleMons[BATTLE_PARTNER(battlerDef)].species == SPECIES_CHERRIM_SUNSHINE && IsBattlerWeatherAffected(BATTLE_PARTNER(battlerDef), B_WEATHER_SUN) && !usesDefStat)
modifier = uq4_12_multiply_half_down(modifier, UQ_4_12(1.5));
break;
default:
break;
}
}
@ -9537,7 +9574,7 @@ static inline uq4_12_t GetCollisionCourseElectroDriftModifier(u32 move, uq4_12_t
return UQ_4_12(1.0);
}
static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, u32 abilityAtk)
static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typeEffectivenessModifier, bool32 isCrit, enum Ability abilityAtk)
{
switch (abilityAtk)
{
@ -9553,6 +9590,8 @@ static inline uq4_12_t GetAttackerAbilitiesModifier(u32 battlerAtk, uq4_12_t typ
if (typeEffectivenessModifier <= UQ_4_12(0.5))
return UQ_4_12(2.0);
break;
default:
break;
}
return UQ_4_12(1.0);
}
@ -9607,6 +9646,8 @@ static inline uq4_12_t GetDefenderAbilitiesModifier(struct DamageContext *ctx)
recordAbility = TRUE;
}
break;
default:
break;
}
if (recordAbility && ctx->updateFlags)
@ -9625,6 +9666,8 @@ static inline uq4_12_t GetDefenderPartnerAbilitiesModifier(u32 battlerPartnerDef
case ABILITY_FRIEND_GUARD:
return UQ_4_12(0.75);
break;
default:
break;
}
return UQ_4_12(1.0);
}
@ -10135,7 +10178,7 @@ uq4_12_t CalcTypeEffectivenessMultiplier(struct DamageContext *ctx)
return modifier;
}
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, u16 abilityDef)
uq4_12_t CalcPartyMonTypeEffectivenessMultiplier(u16 move, u16 speciesDef, enum Ability abilityDef)
{
uq4_12_t modifier = UQ_4_12(1.0);
u32 moveType = GetBattleMoveType(move);
@ -10179,7 +10222,7 @@ static uq4_12_t GetInverseTypeMultiplier(uq4_12_t multiplier)
uq4_12_t GetOverworldTypeEffectiveness(struct Pokemon *mon, u8 moveType)
{
uq4_12_t modifier = UQ_4_12(1.0);
u16 abilityDef = GetMonAbility(mon);
enum Ability abilityDef = GetMonAbility(mon);
u16 speciesDef = GetMonData(mon, MON_DATA_SPECIES);
u8 type1 = GetSpeciesType(speciesDef, 0);
u8 type2 = GetSpeciesType(speciesDef, 1);
@ -10588,7 +10631,7 @@ bool32 TryBattleFormChange(u32 battler, enum FormChanges method)
if (restoreSpecies)
{
u32 abilityForm = gBattleMons[battler].ability;
enum Ability abilityForm = gBattleMons[battler].ability;
// Reverts the original species
TryToSetBattleFormChangeMoves(&party[monId], method);
u32 changedSpecies = GetBattlerPartyState(battler)->changedSpecies;
@ -10862,13 +10905,15 @@ static bool32 IsUnnerveAbilityOnOpposingSide(u32 battler)
if (!IsBattlerAlive(battlerDef))
continue;
u32 ability = GetBattlerAbility(battlerDef);
enum Ability ability = GetBattlerAbility(battlerDef);
switch (ability)
{
case ABILITY_UNNERVE:
case ABILITY_AS_ONE_ICE_RIDER:
case ABILITY_AS_ONE_SHADOW_RIDER:
return TRUE;
default:
break;
}
}
@ -11280,7 +11325,7 @@ void RemoveConfusionStatus(u32 battler)
static bool32 CanBeInfinitelyConfused(u32 battler)
{
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
if (ability == ABILITY_OWN_TEMPO
|| IsBattlerTerrainAffected(battler, ability, GetBattlerHoldEffect(battler), STATUS_FIELD_MISTY_TERRAIN)
|| gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_SAFEGUARD)
@ -11310,7 +11355,7 @@ bool32 AreBattlersOfSameGender(u32 battler1, u32 battler2)
return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 == gender2);
}
u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect)
u32 CalcSecondaryEffectChance(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect)
{
bool8 hasSereneGrace = (battlerAbility == ABILITY_SERENE_GRACE);
bool8 hasRainbow = (gSideStatuses[GetBattlerSide(battler)] & SIDE_STATUS_RAINBOW) != 0;
@ -11327,7 +11372,7 @@ u32 CalcSecondaryEffectChance(u32 battler, u32 battlerAbility, const struct Addi
return secondaryEffectChance;
}
bool32 MoveEffectIsGuaranteed(u32 battler, u32 battlerAbility, const struct AdditionalEffect *additionalEffect)
bool32 MoveEffectIsGuaranteed(u32 battler, enum Ability battlerAbility, const struct AdditionalEffect *additionalEffect)
{
return additionalEffect->chance == 0 || CalcSecondaryEffectChance(battler, battlerAbility, additionalEffect) >= 100;
}
@ -11574,7 +11619,7 @@ bool32 CanTargetPartner(u32 battlerAtk, u32 battlerDef)
static inline bool32 DoesBattlerHaveAbilityImmunity(u32 battlerAtk, u32 battlerDef, u32 moveType)
{
u32 abilityDef = GetBattlerAbility(battlerDef);
enum Ability abilityDef = GetBattlerAbility(battlerDef);
return CanAbilityBlockMove(battlerAtk, battlerDef, GetBattlerAbility(battlerAtk), abilityDef, gCurrentMove, CHECK_TRIGGER)
|| CanAbilityAbsorbMove(battlerAtk, battlerDef, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER);
@ -11663,7 +11708,7 @@ bool32 DoesDestinyBondFail(u32 battler)
}
// This check has always to be the last in a condtion statement because of the recording of AI data.
bool32 IsMoveEffectBlockedByTarget(u32 ability)
bool32 IsMoveEffectBlockedByTarget(enum Ability ability)
{
if (ability == ABILITY_SHIELD_DUST)
{
@ -11709,12 +11754,14 @@ bool32 HasWeatherEffect(void)
if (!IsBattlerAlive(battler))
continue;
u32 ability = GetBattlerAbility(battler);
enum Ability ability = GetBattlerAbility(battler);
switch (ability)
{
case ABILITY_CLOUD_NINE:
case ABILITY_AIR_LOCK:
return FALSE;
default:
break;
}
}
@ -11741,8 +11788,8 @@ void UpdateStallMons(void)
if (!IsDoubleBattle() || gMovesInfo[gCurrentMove].target == MOVE_TARGET_SELECTED)
{
u32 moveType = GetBattleMoveType(gCurrentMove); // Probably doesn't handle dynamic move types right now
u32 abilityAtk = GetBattlerAbility(gBattlerAttacker);
u32 abilityDef = GetBattlerAbility(gBattlerTarget);
enum Ability abilityAtk = GetBattlerAbility(gBattlerAttacker);
enum Ability abilityDef = GetBattlerAbility(gBattlerTarget);
if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, abilityDef, gCurrentMove, moveType, CHECK_TRIGGER))
{
gAiBattleData->playerStallMons[gBattlerPartyIndexes[gBattlerTarget]]++;
@ -11960,10 +12007,10 @@ void RemoveHazardFromField(u32 side, enum Hazards hazardType)
}
}
bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 abilityDef, u32 move, enum FunctionCallOption option)
bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, enum Ability abilityAtk, enum Ability abilityDef, u32 move, enum FunctionCallOption option)
{
bool32 effect = FALSE;
u32 ability = ABILITY_NONE;
enum Ability ability = ABILITY_NONE;
enum BattleMoveEffects moveEffect = GetMoveEffect(move);
u32 nonVolatileStatus = GetMoveNonVolatileStatus(move);
@ -12044,7 +12091,7 @@ bool32 CanMoveSkipAccuracyCalc(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u
return effect;
}
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect)
u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, enum Ability atkAbility, enum Ability defAbility, u32 atkHoldEffect, u32 defHoldEffect)
{
u32 calc, moveAcc;
s8 buff, accStage, evasionStage;
@ -12096,6 +12143,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u
if (IsBattleMovePhysical(move))
calc = (calc * 80) / 100; // 1.2 hustle loss
break;
default:
break;
}
// Target's ability
@ -12113,6 +12162,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u
if (gBattleMons[battlerDef].volatiles.confusionTurns)
calc = (calc * 50) / 100; // 1.5 tangled feet loss
break;
default:
break;
}
// Attacker's ally's ability
@ -12123,6 +12174,8 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u
if (IsBattlerAlive(atkAlly))
calc = (calc * 110) / 100; // 1.1 ally's victory star boost
break;
default:
break;
}
// Attacker's hold effect

View File

@ -1,4 +1,4 @@
const struct Ability gAbilitiesInfo[ABILITIES_COUNT] =
const struct AbilityInfo gAbilitiesInfo[ABILITIES_COUNT] =
{
[ABILITY_NONE] =
{

View File

@ -5,7 +5,7 @@
struct BattlePyramidRequirement {
const u16 *moves; /* use moves instead of effects so we don't need to find moves with said effect in our loop */
u16 abilities[10];
enum Ability abilities[10];
u8 nAbilities;
u8 type;
u8 nMoves;

View File

@ -741,10 +741,10 @@ static void InheritPokeball(struct Pokemon *egg, struct BoxPokemon *father, stru
static void InheritAbility(struct Pokemon *egg, struct BoxPokemon *father, struct BoxPokemon *mother)
{
u16 fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM);
u16 motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM);
enum Ability fatherAbility = GetBoxMonData(father, MON_DATA_ABILITY_NUM);
enum Ability motherAbility = GetBoxMonData(mother, MON_DATA_ABILITY_NUM);
u16 motherSpecies = GetBoxMonData(mother, MON_DATA_SPECIES);
u16 inheritAbility = motherAbility;
enum Ability inheritAbility = motherAbility;
if (motherSpecies == SPECIES_DITTO)
{

View File

@ -2385,7 +2385,7 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId)
}
}
static void Debug_Display_Ability(u32 abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId)
static void Debug_Display_Ability(enum Ability abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId)
{
StringCopy(gStringVar2, gText_DigitIndicator[digit]);
ConvertIntToDecimalStringN(gStringVar3, abilityId, STR_CONV_MODE_LEADING_ZEROS, 2);
@ -2424,7 +2424,7 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId)
gTasks[taskId].tInput = 0;
gTasks[taskId].tDigit = 0;
u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, 0);
enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, 0);
Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId);
gTasks[taskId].func = DebugAction_Give_Pokemon_SelectAbility;
@ -2473,7 +2473,7 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId)
{
i++;
}
u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i);
enum Ability abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i);
Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId);
}

View File

@ -931,7 +931,7 @@ u8 GetEggCyclesToSubtract(void)
{
if (!GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_EGG))
{
u16 ability = GetMonAbility(&gPlayerParty[i]);
enum Ability ability = GetMonAbility(&gPlayerParty[i]);
if (ability == ABILITY_MAGMA_ARMOR
|| ability == ABILITY_FLAME_BODY
|| ability == ABILITY_STEAM_ENGINE)

View File

@ -5500,7 +5500,7 @@ static bool32 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, s
{
u32 multi;
struct Pokemon *mon;
u32 ability;
enum Ability ability;
if (DoesSpeciesHaveFormChangeMethod(OW_SPECIES(objectEvent), FORM_CHANGE_OVERWORLD_WEATHER)
&& OW_SPECIES(objectEvent) != (multi = GetOverworldWeatherSpecies(OW_SPECIES(objectEvent))))
{

View File

@ -2349,7 +2349,7 @@ static bool32 DoesFishingMinigameAllowCancel(void)
static bool32 Fishing_DoesFirstMonInPartyHaveSuctionCupsOrStickyHold(void)
{
u32 ability;
enum Ability ability;
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return FALSE;

View File

@ -140,7 +140,7 @@ bool32 SetUpFieldMove_Cut(void)
s16 x, y;
u8 i, j;
u8 tileBehavior;
u16 userAbility;
enum Ability userAbility;
bool8 cutTiles[CUT_NORMAL_AREA];
bool8 ret;

View File

@ -360,9 +360,9 @@ struct PokemonStats
u8 eggCycles;
u16 expYield;
u8 friendship;
u16 ability0;
u16 ability1;
u16 abilityHidden;
enum Ability ability0;
enum Ability ability1;
enum Ability abilityHidden;
};
struct EvoScreenData
@ -5866,9 +5866,9 @@ static void PrintStatsScreen_Abilities(u8 taskId)
{
u8 abilities_x = 5;
u8 abilities_y = 3;
u16 ability0;
u16 ability1;
u16 abilityHidden;
enum Ability ability0;
enum Ability ability1;
enum Ability abilityHidden;
//Abilitie(s)

View File

@ -3392,7 +3392,7 @@ u8 GetMonsStateToDoubles_2(void)
return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON;
}
u16 GetAbilityBySpecies(u16 species, u8 abilityNum)
enum Ability GetAbilityBySpecies(u16 species, u8 abilityNum)
{
int i;
@ -3417,7 +3417,7 @@ u16 GetAbilityBySpecies(u16 species, u8 abilityNum)
return gLastUsedAbility;
}
u16 GetMonAbility(struct Pokemon *mon)
enum Ability GetMonAbility(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL);
u8 abilityNum = GetMonData(mon, MON_DATA_ABILITY_NUM, NULL);
@ -3533,7 +3533,7 @@ u32 GetSpeciesType(u16 species, u8 slot)
return gSpeciesInfo[SanitizeSpeciesId(species)].types[slot];
}
u32 GetSpeciesAbility(u16 species, u8 slot)
enum Ability GetSpeciesAbility(u16 species, u8 slot)
{
return gSpeciesInfo[SanitizeSpeciesId(species)].abilities[slot];
}
@ -6062,7 +6062,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species)
static inline bool32 CanFirstMonBoostHeldItemRarity(void)
{
u32 ability;
enum Ability ability;
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return FALSE;
@ -6594,7 +6594,7 @@ u32 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, enum FormChanges
u32 targetSpecies = species;
const struct FormChange *formChanges = GetSpeciesFormChanges(species);
u16 heldItem;
u32 ability;
enum Ability ability;
if (formChanges != NULL)
{

View File

@ -3466,13 +3466,13 @@ static void PrintMonOTID(void)
static void PrintMonAbilityName(void)
{
u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].name, 0, 1, 0, 1);
}
static void PrintMonAbilityDescription(void)
{
u16 ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
enum Ability ability = GetAbilityBySpecies(sMonSummaryScreen->summary.species, sMonSummaryScreen->summary.abilityNum);
PrintTextOnWindow(AddWindowFromTemplateList(sPageInfoTemplate, PSS_DATA_WINDOW_INFO_ABILITY), gAbilitiesInfo[ability].description, 0, 17, 0, 0);
}

View File

@ -21,7 +21,7 @@ struct RHHRomHeader
/*0x0A*/ u16 movesCount;
/*0x0C*/ u16 numSpecies;
/*0x0E*/ u16 abilitiesCount;
/*0x10*/ const struct Ability *abilities;
/*0x10*/ const struct AbilityInfo *abilities;
/*0x14*/ u16 itemsCount;
/*0x16*/ u8 itemNameLength;
/*0x17*/ u8 padding;

View File

@ -49,9 +49,9 @@ static void ApplyFluteEncounterRateMod(u32 *encRate);
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, enum WildPokemonArea area);
#ifdef BUGFIX
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size);
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex, u32 size);
#else
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex);
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex);
#endif
static bool8 IsAbilityAllowingEncounter(u8 level);
@ -350,7 +350,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon, u8 wildMonIn
// check ability for max level mon
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u16 ability = GetMonAbility(&gPlayerParty[0]);
enum Ability ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
{
if (Random() % 2 == 0)
@ -634,7 +634,7 @@ static bool8 WildEncounterCheck(u32 encounterRate, bool8 ignoreAbility)
encounterRate *= 2;
if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u32 ability = GetMonAbility(&gPlayerParty[0]);
enum Ability ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR)
encounterRate = encounterRate * 3 / 4;
@ -1123,7 +1123,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 wildLevel)
static bool8 IsAbilityAllowingEncounter(u8 level)
{
u16 ability;
enum Ability ability;
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
return TRUE;
@ -1193,9 +1193,9 @@ static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16
}
#ifdef BUGFIX
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size)
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex, u32 size)
#else
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex)
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, enum Ability ability, u8 *monIndex)
#endif
{
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Adaptability increases same-type attack bonus from x1.5 to x2", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; }
PARAMETRIZE { ability = ABILITY_ADAPTABILITY; }
GIVEN {

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Battle Armor and Shell Armor block critical hits")
{
u32 species;
u32 ability;
enum Ability ability;
PARAMETRIZE { species = SPECIES_KINGLER; ability = ABILITY_SHELL_ARMOR; }
PARAMETRIZE { species = SPECIES_ARMALDO; ability = ABILITY_BATTLE_ARMOR; }

View File

@ -5,7 +5,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid
{
s16 turnOneHit;
s16 turnTwoHit;
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
@ -40,7 +41,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent intimid
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat stage reduction from moves")
{
u16 move = MOVE_NONE;
u32 j, species = SPECIES_NONE, ability = ABILITY_NONE;
u32 j, species = SPECIES_NONE;
enum Ability ability = ABILITY_NONE;
static const u16 statReductionMoves[] = {
MOVE_GROWL,
MOVE_LEER,
@ -86,7 +88,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent stat st
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky Web effect on switchin")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
@ -114,7 +117,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke prevent Sticky
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent stat stage reduction from moves used by the user")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
PARAMETRIZE{ species = SPECIES_TORKOAL; ability = ABILITY_WHITE_SMOKE; }
@ -137,8 +141,9 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent s
SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and White Smoke, but not Full Metal Body")
{
u32 j, k, species = SPECIES_NONE, ability = ABILITY_NONE;
u16 breakerAbility = ABILITY_NONE;
u32 j, k, species = SPECIES_NONE;
enum Ability ability = ABILITY_NONE;
enum Ability breakerAbility = ABILITY_NONE;
u16 move = ABILITY_NONE;
static const u16 breakerAbilities[] = {
ABILITY_MOLD_BREAKER,
@ -197,7 +202,8 @@ SINGLE_BATTLE_TEST("Mold Breaker, Teravolt, and Turboblaze ignore Clear Body and
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from Iron Ball")
{
u32 j, species = SPECIES_NONE, ability = ABILITY_NONE;
u32 j, species = SPECIES_NONE;
enum Ability ability = ABILITY_NONE;
u16 heldItem = ITEM_NONE;
static const u16 heldItems[] = {
ITEM_NONE,
@ -239,7 +245,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Speed reduction from paralysis")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
@ -276,7 +283,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent S
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Attack reduction from burn", s16 damage)
{
bool32 burned = FALSE;
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = FALSE; }
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; burned = TRUE; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; burned = FALSE; }
@ -299,7 +307,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent A
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent receiving negative stat changes from Baton Pass")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
@ -329,7 +338,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent r
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Topsy-Turvy")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
@ -370,7 +380,8 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent T
SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke don't prevent Spectral Thief from resetting positive stat changes")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE{ species = SPECIES_METANG; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE{ species = SPECIES_SOLGALEO; ability = ABILITY_FULL_METAL_BODY; }
@ -417,7 +428,7 @@ SINGLE_BATTLE_TEST("Clear Body, Full Metal Body, and White Smoke protect from Pr
{
u32 move = MOVE_NONE;
u32 species = SPECIES_NONE;
u32 ability = ABILITY_NONE;
enum Ability ability = ABILITY_NONE;
static const u32 moves[] = {
MOVE_SPIKY_SHIELD,

View File

@ -3,7 +3,8 @@
SINGLE_BATTLE_TEST("Cloud Nine/Air Lock prevent basic weather effects, but without them disappearing - Sandstorm")
{
u32 species = 0, ability = 0;
u32 species = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
GIVEN {

View File

@ -8,7 +8,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CONTRARY; }
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
GIVEN {
@ -35,7 +35,7 @@ SINGLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a single battle",
DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle", s16 damageLeft, s16 damageRight)
{
u32 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; }
PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; }
@ -78,7 +78,7 @@ DOUBLE_BATTLE_TEST("Contrary raises Attack when Intimidated in a double battle",
SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normally lower them: Overheat", s16 damageBefore, s16 damageAfter)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CONTRARY; }
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
GIVEN {
@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Contrary raises stats after using a move which would normall
SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Swords Dance", s16 damageBefore, s16 damageAfter)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CONTRARY; }
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
GIVEN {
@ -159,7 +159,7 @@ SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normal
SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normally lower it: Growl", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CONTRARY; }
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
GIVEN {
@ -190,7 +190,7 @@ SINGLE_BATTLE_TEST("Contrary raises a stat after using a move which would normal
SINGLE_BATTLE_TEST("Contrary lowers a stat after using a move which would normally raise it: Belly Drum", s16 damageBefore, s16 damageAfter)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CONTRARY; }
PARAMETRIZE { ability = ABILITY_TANGLED_FEET; }
GIVEN {

View File

@ -3,7 +3,7 @@
DOUBLE_BATTLE_TEST("Curious Medicine resets ally's stat stages upon entering battle")
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CURIOUS_MEDICINE; }
PARAMETRIZE { ability = ABILITY_OWN_TEMPO; }

View File

@ -9,7 +9,8 @@ ASSUMPTIONS
DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user from priority moves")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; }
PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; }
@ -31,7 +32,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect the user fr
DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partner from priority moves")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; }
PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; }
@ -53,7 +55,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect users partn
DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the user from negative priority")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; }
PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; }
@ -74,7 +77,8 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the u
SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all multi hit hits with one activation")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; }
PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; }

View File

@ -3,7 +3,7 @@
DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate")
{
u32 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; }
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; }
@ -61,7 +61,7 @@ DOUBLE_BATTLE_TEST("Defiant sharply raises player's Attack after Intimidate")
// Same as above, but for opponent.
DOUBLE_BATTLE_TEST("Defiant sharply raises opponent's Attack after Intimidate")
{
u32 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_VITAL_SPIRIT; }
PARAMETRIZE { abilityLeft = ABILITY_VITAL_SPIRIT; abilityRight = ABILITY_DEFIANT; }

View File

@ -9,7 +9,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_TRACE; }
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
GIVEN {
@ -32,7 +32,7 @@ SINGLE_BATTLE_TEST("Download raises Attack if player has lower Def than Sp. Def"
SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than Def", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_TRACE; }
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
GIVEN {
@ -55,7 +55,7 @@ SINGLE_BATTLE_TEST("Download raises Sp.Attack if enemy has lower Sp. Def than De
SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet", s16 damagePhysical, s16 damageSpecial)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_TRACE; }
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
@ -97,7 +97,7 @@ SINGLE_BATTLE_TEST("Download doesn't activate if target hasn't been sent out yet
DOUBLE_BATTLE_TEST("Download raises Sp.Attack if enemies have lower total Sp. Def than Def", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_TRACE; }
PARAMETRIZE { ability = ABILITY_DOWNLOAD; }
GIVEN {

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Dragon's Maw increases Dragon-type move damage", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; }
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_DRAGONS_MAW; }

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Drizzle summons rain", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_DRIZZLE; }
PARAMETRIZE { ability = ABILITY_DAMP; }

View File

@ -35,7 +35,7 @@ TO_DO_BATTLE_TEST("Dry Skin doesn't heal in Rain if Cloud Nine/Air Lock is on th
SINGLE_BATTLE_TEST("Dry Skin increases damage taken from Fire-type moves by 25%", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_EFFECT_SPORE; }
PARAMETRIZE { ability = ABILITY_DRY_SKIN; }
GIVEN {

View File

@ -4,7 +4,8 @@
SINGLE_BATTLE_TEST("Embody Aspect raises a stat depending on the users form by one stage")
{
u16 species, ability;
u16 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_OGERPON_TEAL_TERA; ability = ABILITY_EMBODY_ASPECT_TEAL_MASK; }
PARAMETRIZE { species = SPECIES_OGERPON_HEARTHFLAME_TERA; ability = ABILITY_EMBODY_ASPECT_HEARTHFLAME_MASK; }

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Filter reduces damage to Super Effective moves by 0.75", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SOUNDPROOF; }
PARAMETRIZE { ability = ABILITY_FILTER; }
GIVEN {

View File

@ -65,7 +65,8 @@ SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal when its abili
SINGLE_BATTLE_TEST("Flower Gift transforms Cherrim back to normal under Cloud Nine/Air Lock")
{
u32 species = 0, ability = 0;
u32 species = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
GIVEN {

View File

@ -12,7 +12,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_KLUTZ; }
PARAMETRIZE { ability = ABILITY_FLUFFY; }
GIVEN {
@ -30,7 +30,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta
SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_KLUTZ; }
PARAMETRIZE { ability = ABILITY_FLUFFY; }
GIVEN {
@ -48,7 +48,7 @@ SINGLE_BATTLE_TEST("Fluffy doubles damage taken from fire type moves", s16 damag
SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make direct contact", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_KLUTZ; }
PARAMETRIZE { ability = ABILITY_FLUFFY; }
GIVEN {
@ -66,7 +66,7 @@ SINGLE_BATTLE_TEST("Fluffy does not alter damage of fire-type moves that make di
SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct contact even if protected by Protective Pads", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_KLUTZ; }
PARAMETRIZE { ability = ABILITY_FLUFFY; }
GIVEN {
@ -84,7 +84,7 @@ SINGLE_BATTLE_TEST("Fluffy halves damage taken from moves that make direct conta
SINGLE_BATTLE_TEST("Fluffy does not halve damage taken from moves that make direct contact but are ignored by Punching Glove", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_KLUTZ; }
PARAMETRIZE { ability = ABILITY_FLUFFY; }
GIVEN {

View File

@ -157,7 +157,8 @@ DOUBLE_BATTLE_TEST("Forecast transforms all Castforms present in weather")
SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_DRIZZLE; }
PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DROUGHT; }
PARAMETRIZE { species = SPECIES_ABOMASNOW; ability = ABILITY_SNOW_WARNING; }
@ -183,13 +184,16 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in weather from an ability")
case ABILITY_SNOW_WARNING:
EXPECT_EQ(player->species, SPECIES_CASTFORM_SNOWY);
break;
default:
break;
}
}
}
SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather")
{
u32 species, item, ability;
u32 species, item;
enum Ability ability;
PARAMETRIZE { species = SPECIES_KYOGRE; ability = ABILITY_PRIMORDIAL_SEA; item = ITEM_BLUE_ORB; }
PARAMETRIZE { species = SPECIES_GROUDON; ability = ABILITY_DESOLATE_LAND; item = ITEM_RED_ORB; }
GIVEN {
@ -212,6 +216,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform in primal weather")
case ABILITY_PRIMORDIAL_SEA:
EXPECT_EQ(player->species, SPECIES_CASTFORM_RAINY);
break;
default:
break;
}
}
}
@ -266,7 +272,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal when Sandstorm i
SINGLE_BATTLE_TEST("Forecast transforms Castform back to normal under Cloud Nine/Air Lock")
{
u32 species = 0, ability = 0;
u32 species = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
GIVEN {
@ -400,7 +407,8 @@ SINGLE_BATTLE_TEST("Forecast transforms Castform back when it uses a move that f
SINGLE_BATTLE_TEST("Forecast transforms Castform when Cloud Nine ability user leaves the field")
{
u32 species = 0, ability = 0;
u32 species = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }

View File

@ -44,7 +44,8 @@ SINGLE_BATTLE_TEST("Galvanize can not turn certain moves into Electric type move
SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
{
u32 ability, genConfig;
enum Ability ability;
u32 genConfig;
PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_7; }
PARAMETRIZE { ability = ABILITY_STURDY; genConfig = GEN_6; }
PARAMETRIZE { ability = ABILITY_GALVANIZE; genConfig = GEN_7; }
@ -68,7 +69,8 @@ SINGLE_BATTLE_TEST("Galvanize boosts power of affected moves by 20% (Gen7+) or 3
SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage)
{
u16 move, ability;
u16 move;
enum Ability ability;
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; }
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; }
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_GALVANIZE; }
@ -96,7 +98,7 @@ SINGLE_BATTLE_TEST("Galvanize doesn't affect Weather Ball's type", s16 damage)
SINGLE_BATTLE_TEST("Galvanize doesn't affect Natural Gift's type")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_STURDY; }
PARAMETRIZE { ability = ABILITY_GALVANIZE; }
GIVEN {

View File

@ -3,7 +3,8 @@
DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly causing a Pokemon to faint")
{
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }
GIVEN {
@ -33,7 +34,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh raises Sp. Attack by one stage after directly cau
DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon")
{
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }
GIVEN {
@ -70,7 +72,8 @@ DOUBLE_BATTLE_TEST("Grim Neigh does not trigger if Pokemon faint to indirect dam
DOUBLE_BATTLE_TEST("Grim Neigh does not increase damage done by the same move that causes another Pokemon to faint")
{
s16 damage[2];
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = 0;
PARAMETRIZE { species = SPECIES_SPECTRIER; ability = ABILITY_GRIM_NEIGH; abilityPopUp = ABILITY_GRIM_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_SHADOW; ability = ABILITY_AS_ONE_SHADOW_RIDER; abilityPopUp = ABILITY_GRIM_NEIGH; }

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Guard Dog raises Attack when intimidated", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_INTIMIDATE; }
PARAMETRIZE { ability = ABILITY_SHED_SKIN; }
GIVEN {

View File

@ -137,7 +137,8 @@ SINGLE_BATTLE_TEST("(Gulp Missile) triggers even if the user is fainted by oppos
SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense but is prevented by stat reduction preventing abilities")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_METAGROSS; ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE { species = SPECIES_CORVIKNIGHT; ability = ABILITY_MIRROR_ARMOR; }
PARAMETRIZE { species = SPECIES_CHATOT; ability = ABILITY_BIG_PECKS; }
@ -163,7 +164,7 @@ SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense
SINGLE_BATTLE_TEST("(Gulp Missile) Transformed Cramorant Gulping lowers defense and still triggers other effects after")
{
// Make sure attacker and target are correct after triggering the ability
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_INFILTRATOR; }
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
GIVEN {

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Ice Scales halves the damage from special moves", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYCHIC; }
PARAMETRIZE { ability = ABILITY_ICE_SCALES; move = MOVE_PSYCHIC; }
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; move = MOVE_PSYSHOCK; }

View File

@ -8,7 +8,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch out", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_INTIMIDATE; }
PARAMETRIZE { ability = ABILITY_SHED_SKIN; }
GIVEN {
@ -33,7 +33,7 @@ SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after switch ou
SINGLE_BATTLE_TEST("Intimidate (opponent) lowers player's attack after KO", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_INTIMIDATE; }
PARAMETRIZE { ability = ABILITY_SHED_SKIN; }
GIVEN {

View File

@ -9,7 +9,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stage reduction from moves")
{
u16 ability;
enum Ability ability;
u32 species;
PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; }
@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye prevent accuracy stag
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasion stat")
{
u16 ability;
enum Ability ability;
u32 species;
PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; }
@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye ignore target's evasi
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold Breaker abilities")
{
u16 abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE;
enum Ability abilityPlayer = ABILITY_NONE, abilityOpponent = ABILITY_NONE;
u16 speciesPlayer = SPECIES_NONE, speciesOpponent = SPECIES_NONE;
u32 j;
@ -96,7 +96,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye are ignored by Mold B
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-Turvy")
{
u16 ability;
enum Ability ability;
u32 species;
PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; }
@ -137,7 +137,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent Topsy-T
SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receiving negative Attack stage changes from Baton Pass")
{
u16 ability;
enum Ability ability;
u32 species;
PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; }
PARAMETRIZE { species = SPECIES_STARYU; ability = ABILITY_ILLUMINATE; }
@ -170,7 +170,7 @@ SINGLE_BATTLE_TEST("Keen Eye, Gen9+ Illuminate & Minds Eye don't prevent receivi
SINGLE_BATTLE_TEST("Keen Eye & Gen9+ Illuminate don't prevent Spectral Thief from resetting positive accuracy stage changes")
{
u16 ability;
enum Ability ability;
u32 species;
PARAMETRIZE { species = SPECIES_HITMONCHAN; ability = ABILITY_KEEN_EYE; }

View File

@ -92,7 +92,7 @@ DOUBLE_BATTLE_TEST("Levitate does not cause single remaining target to take high
AI_SINGLE_BATTLE_TEST("Levitate is seen correctly by switch AI")
{
u32 ability = ABILITY_NONE, item = ITEM_NONE;
enum Ability ability = ABILITY_NONE, item = ITEM_NONE;
PARAMETRIZE { ability = ABILITY_OWN_TEMPO, item = ITEM_NONE ; }
PARAMETRIZE { ability = ABILITY_MOLD_BREAKER, item = ITEM_NONE ; }

View File

@ -113,7 +113,7 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Strength Sap users to lose HP instead of
*/
SINGLE_BATTLE_TEST("Liquid Ooze causes leech seed victim to faint before seeder")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CLEAR_BODY; }
PARAMETRIZE { ability = ABILITY_LIQUID_OOZE; }
GIVEN {

View File

@ -44,7 +44,7 @@ SINGLE_BATTLE_TEST("Mind's Eye doesn't bypass a Ghost-type's Wonder Guard")
AI_SINGLE_BATTLE_TEST("AI doesn't use accuracy-lowering moves if it knows that the foe has Mind's Eye")
{
u32 abilityAI = ABILITY_NONE;
enum Ability abilityAI = ABILITY_NONE;
PARAMETRIZE { abilityAI = ABILITY_SWIFT_SWIM; }
PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; }

View File

@ -3,7 +3,8 @@
DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after directly causing a Pokemon to faint")
{
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = ABILITY_NONE;
PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; }
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
@ -36,7 +37,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh raises Attack by one stage after direct
DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to indirect damage or damage from other Pokemon")
{
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = ABILITY_NONE;
PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; }
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
@ -73,7 +75,8 @@ DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger if Pokemon faint to in
SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximum Attack stage")
{
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = ABILITY_NONE;
PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; }
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }
@ -111,7 +114,8 @@ SINGLE_BATTLE_TEST("Moxie/Chilling Neigh does not trigger when already at maximu
DOUBLE_BATTLE_TEST("Moxie/Chilling Neigh does not increase damage done by the same move that causes another Pokemon to faint")
{
s16 damage[2];
u32 species = 0, ability = 0, abilityPopUp = 0;
u32 species = 0, abilityPopUp = 0;
enum Ability ability = ABILITY_NONE;
PARAMETRIZE { species = SPECIES_SALAMENCE; ability = ABILITY_MOXIE; abilityPopUp = ABILITY_MOXIE; }
PARAMETRIZE { species = SPECIES_GLASTRIER; ability = ABILITY_CHILLING_NEIGH; abilityPopUp = ABILITY_CHILLING_NEIGH; }
PARAMETRIZE { species = SPECIES_CALYREX_ICE; ability = ABILITY_AS_ONE_ICE_RIDER; abilityPopUp = ABILITY_CHILLING_NEIGH; }

View File

@ -3,7 +3,8 @@
SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on contact")
{
u32 move, ability, species;
u32 move, species;
enum Ability ability;
PARAMETRIZE { move = MOVE_AQUA_JET; ability = ABILITY_MUMMY; species = SPECIES_YAMASK; }
PARAMETRIZE { move = MOVE_WATER_GUN; ability = ABILITY_MUMMY; species = SPECIES_YAMASK;}
@ -37,7 +38,7 @@ SINGLE_BATTLE_TEST("Mummy/Lingering Aroma replace the attacker's ability on cont
SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other")
{
u32 ability1, species1, ability2, species2;
enum Ability ability1, species1, ability2, species2;
PARAMETRIZE { ability1 = ability2 = ABILITY_MUMMY; species1 = species2 = SPECIES_YAMASK; }
PARAMETRIZE { ability1 = ABILITY_MUMMY; species1 = SPECIES_YAMASK; ability2 = ABILITY_LINGERING_AROMA; species2 = SPECIES_OINKOLOGNE; }
@ -66,7 +67,8 @@ SINGLE_BATTLE_TEST("Mummy and Lingering Aroma don't replace each other")
SINGLE_BATTLE_TEST("Mummy doesn't replace abilities that can't be suppressed")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_ARCEUS; ability = ABILITY_MULTITYPE; }
PARAMETRIZE { species = SPECIES_AEGISLASH; ability = ABILITY_STANCE_CHANGE; }

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Neuroforce increases the strength of super-effective moves by 25%", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SHADOW_BALL; }
PARAMETRIZE { ability = ABILITY_KLUTZ; move = MOVE_SHADOW_BALL; }
PARAMETRIZE { ability = ABILITY_NEUROFORCE; move = MOVE_SCRATCH; }

View File

@ -83,7 +83,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores all battlers' ability effects")
SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }
GIVEN {
@ -102,7 +102,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from attacker's ability
SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }
GIVEN {
@ -122,7 +122,7 @@ SINGLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ability",
DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ability", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }
GIVEN {
@ -142,7 +142,7 @@ DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from target's ally's ab
DOUBLE_BATTLE_TEST("Neutralizing Gas ignores multipliers from ally's ability", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }
GIVEN {

View File

@ -11,7 +11,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {
@ -36,7 +36,7 @@ SINGLE_BATTLE_TEST("Normalize turns a move into a Normal-type move")
SINGLE_BATTLE_TEST("Normalize affects status moves")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {
@ -62,7 +62,7 @@ SINGLE_BATTLE_TEST("Normalize affects status moves")
SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage to Water-type Pokémon", s16 damage)
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {
@ -82,7 +82,7 @@ SINGLE_BATTLE_TEST("Normalize still makes Freeze-Dry do super effective damage t
SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (< Gen7)", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
@ -101,7 +101,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of unaffected moves by 20% (<
SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
@ -120,7 +120,7 @@ SINGLE_BATTLE_TEST("Normalize boosts power of unaffected moves by 20% (Gen7+)",
SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Gen7)", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
@ -139,7 +139,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't boost power of affected moves by 20% (< Ge
SINGLE_BATTLE_TEST("Normalize boosts power of affected moves by 20% (Gen7+)", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
@ -184,7 +184,8 @@ SINGLE_BATTLE_TEST("Normalize-affected moves become Electric-type under Ion Delu
SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage)
{
u16 move, ability;
u16 move;
enum Ability ability;
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_NORMALIZE; }
@ -212,7 +213,7 @@ SINGLE_BATTLE_TEST("Normalize doesn't affect Weather Ball's type", s16 damage)
SINGLE_BATTLE_TEST("Normalize doesn't affect Natural Gift's type")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_NORMALIZE; }
GIVEN {

View File

@ -8,7 +8,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a turn", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_FRISK; }
PARAMETRIZE { ability = ABILITY_OPPORTUNIST; }
GIVEN {
@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Opportunist only copies foe's positive stat changes in a tur
DOUBLE_BATTLE_TEST("Opportunist raises Attack only once when partner has Intimidate against Contrary foe in a double battle", s16 damageLeft, s16 damageRight)
{
u32 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE { abilityLeft = ABILITY_CONTRARY; abilityRight = ABILITY_CONTRARY; }
PARAMETRIZE { abilityLeft = ABILITY_TANGLED_FEET; abilityRight = ABILITY_TANGLED_FEET; }

View File

@ -105,7 +105,8 @@ DOUBLE_BATTLE_TEST("Parental Bond does not convert multi-target moves into a two
SINGLE_BATTLE_TEST("Parental Bond-converted moves only hit once on Lightning Rod/Storm Drain mons")
{
u16 move, species, ability, type;
u16 move, species, type;
enum Ability ability;
PARAMETRIZE { move = MOVE_THUNDERBOLT; ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; type = TYPE_ELECTRIC; }
PARAMETRIZE { move = MOVE_SURF; ability = ABILITY_STORM_DRAIN; species = SPECIES_LILEEP; type = TYPE_WATER; }
GIVEN {

View File

@ -23,7 +23,8 @@ SINGLE_BATTLE_TEST("Pixilate turns a Normal-type move into a Fairy-type move")
SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
{
u32 ability, genConfig;
enum Ability ability;
u32 genConfig;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_7; }
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; genConfig = GEN_6; }
PARAMETRIZE { ability = ABILITY_PIXILATE; genConfig = GEN_7; }
@ -47,7 +48,8 @@ SINGLE_BATTLE_TEST("Pixilate boosts power of affected moves by 20% (Gen7+) or 30
SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage)
{
u16 move, ability;
u16 move;
enum Ability ability;
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_STURDY; }
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_STURDY; }
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_PIXILATE; }
@ -75,7 +77,7 @@ SINGLE_BATTLE_TEST("Pixilate doesn't affect Weather Ball's type", s16 damage)
SINGLE_BATTLE_TEST("Pixilate doesn't affect Natural Gift's type")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CUTE_CHARM; }
PARAMETRIZE { ability = ABILITY_PIXILATE; }
GIVEN {

View File

@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Prankster-affected moves can still be bounced back by Dark-t
SINGLE_BATTLE_TEST("Prankster-affected moves which are reflected by Magic Coat can affect Dark-type Pokémon, unless the Pokémon that bounced the move also has Prankster")
{
u16 sableyeAbility;
enum Ability sableyeAbility;
PARAMETRIZE { sableyeAbility = ABILITY_PRANKSTER; }
PARAMETRIZE { sableyeAbility = ABILITY_KEEN_EYE; }

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Prism Armor reduces damage to Super Effective moves by 0.75", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }
GIVEN {

View File

@ -184,7 +184,8 @@ SINGLE_BATTLE_TEST("Protosynthesis activates even if the Pokémon is holding an
SINGLE_BATTLE_TEST("Protosynthesis doesn't activate if Cloud Nine/Air Lock is on the field")
{
u32 species, ability;
u32 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_RAYQUAZA; ability = ABILITY_AIR_LOCK; }
PARAMETRIZE { species = SPECIES_GOLDUCK; ability = ABILITY_CLOUD_NINE; }

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 damage)
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_STURDY; }
PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; }
GIVEN {
@ -21,7 +21,7 @@ SINGLE_BATTLE_TEST("Purifying Salt halves damage from Ghost-type moves", s16 dam
SINGLE_BATTLE_TEST("Purifying Salt halves damage from dynamic Ghost-type moves", s16 damage)
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_STURDY; }
PARAMETRIZE { ability = ABILITY_PURIFYING_SALT; }
GIVEN {

View File

@ -22,7 +22,8 @@ SINGLE_BATTLE_TEST("Refrigerate turns a Normal-type move into a Ice-type move")
SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or 30% (Gen1-6)", s16 damage)
{
u32 ability, genConfig;
enum Ability ability;
u32 genConfig;
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_7; }
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; genConfig = GEN_6; }
PARAMETRIZE { ability = ABILITY_REFRIGERATE; genConfig = GEN_7; }
@ -46,7 +47,8 @@ SINGLE_BATTLE_TEST("Refrigerate boosts power of affected moves by 20% (Gen7+) or
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage)
{
u16 move, ability;
u16 move;
enum Ability ability;
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_SNOW_WARNING; }
PARAMETRIZE { move = MOVE_SUNNY_DAY; ability = ABILITY_SNOW_WARNING; }
PARAMETRIZE { move = MOVE_CELEBRATE; ability = ABILITY_REFRIGERATE; }
@ -74,7 +76,7 @@ SINGLE_BATTLE_TEST("Refrigerate doesn't affect Weather Ball's type", s16 damage)
SINGLE_BATTLE_TEST("Refrigerate doesn't affect Natural Gift's type")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SNOW_WARNING; }
PARAMETRIZE { ability = ABILITY_REFRIGERATE; }
GIVEN {

View File

@ -10,7 +10,8 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards Pokémon of the same gender", s16 damage)
{
u16 species, ability;
u16 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; }
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; }
PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; }
@ -32,7 +33,8 @@ SINGLE_BATTLE_TEST("Rivalry increases power by x1.25 towards Pokémon of the sam
SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards Pokémon of different gender", s16 damage)
{
u16 species1, species2, ability;
u16 species1, species2;
enum Ability ability;
PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; }
PARAMETRIZE { species1 = SPECIES_NIDOKING; species2 = SPECIES_NIDOQUEEN; ability = ABILITY_RIVALRY; }
PARAMETRIZE { species1 = SPECIES_NIDOQUEEN; species2 = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; }
@ -54,7 +56,8 @@ SINGLE_BATTLE_TEST("Rivalry decreases power by x0.75 towards Pokémon of differe
SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless", s16 damage)
{
u16 species, ability;
u16 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; }
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; }
PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; }
@ -78,7 +81,8 @@ SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the attacker is genderless",
SINGLE_BATTLE_TEST("Rivalry doesn't modify power if the target is genderless", s16 damage)
{
u16 species, ability;
u16 species;
enum Ability ability;
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_POISON_POINT; }
PARAMETRIZE { species = SPECIES_NIDOKING; ability = ABILITY_RIVALRY; }
PARAMETRIZE { species = SPECIES_NIDOQUEEN; ability = ABILITY_POISON_POINT; }

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Rocky Payload increases Rock-type move damage", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_BIG_PECKS; }
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_ROCKY_PAYLOAD; }

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Sharpness increases the power of slicing moves", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_SHARPNESS; }
PARAMETRIZE { move = MOVE_AERIAL_ACE; ability = ABILITY_STEADFAST; }
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_SHARPNESS; }

View File

@ -8,7 +8,7 @@ ASSUMPTIONS
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -25,7 +25,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Magnitude", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Eruption", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Water Spout", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Present", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -95,7 +95,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Psywave", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -112,7 +112,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Round", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -129,7 +129,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Gyro Ball", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -146,7 +146,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Electro Ball", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -163,7 +163,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Dragon Energy", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -180,7 +180,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Belch", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -197,7 +197,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Shell Trap", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Burn Up", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ZEN_MODE; }
GIVEN {
@ -231,7 +231,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Double Shock", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -248,7 +248,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Steel Roller", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Synchronoise", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -299,7 +299,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Hyperspace Fury", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -316,7 +316,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Bolt Beak", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -333,7 +333,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Fishious Rend", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {
@ -350,7 +350,7 @@ SINGLE_BATTLE_TEST("Sheer Force doesn't boost Comeuppance", s16 damage)
}
SINGLE_BATTLE_TEST("Sheer Force doesn't boost Payback", s16 damage)
{
u16 ability = 0;
enum Ability ability = 0;
PARAMETRIZE { ability = ABILITY_SHEER_FORCE; }
PARAMETRIZE { ability = ABILITY_ANGER_POINT; }
GIVEN {

View File

@ -3,7 +3,7 @@
SINGLE_BATTLE_TEST("Solid Rock reduces damage to Super Effective moves by 0.75", s16 damage)
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_STURDY; }
PARAMETRIZE { ability = ABILITY_SOLID_ROCK; }
GIVEN {

View File

@ -20,7 +20,8 @@ DOUBLE_BATTLE_TEST("Stalwart ignores redirection from Follow-Me")
DOUBLE_BATTLE_TEST("Stalwart stops Lightning Rod and Storm Drain from redirecting moves")
{
u32 ability, species;
enum Ability ability;
u32 species;
PARAMETRIZE { ability = ABILITY_STORM_DRAIN; species = SPECIES_LUMINEON; }
PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; species = SPECIES_RAICHU; }
GIVEN {

View File

@ -49,7 +49,7 @@ SINGLE_BATTLE_TEST("Stamina raises Defense by 1 when hit by a move")
DOUBLE_BATTLE_TEST("Stamina activates correctly for every battler with the ability when hit by a multi target move")
{
u16 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_STAMINA; }
PARAMETRIZE {abilityLeft = ABILITY_STAMINA, abilityRight = ABILITY_NONE; }

View File

@ -4,7 +4,7 @@
SINGLE_BATTLE_TEST("Steelworker increases Steel-type move damage", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; }
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_STEELWORKER; }

View File

@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Trace copies opponents ability on switch-in even if opponent
DOUBLE_BATTLE_TEST("Trace copies opponents ability randomly")
{
u16 ability1, ability2;
enum Ability ability1, ability2;
PARAMETRIZE { ability1 = ABILITY_SPEED_BOOST; ability2 = ABILITY_BLAZE;}
PARAMETRIZE { ability1 = ABILITY_BLAZE; ability2 = ABILITY_SPEED_BOOST; }

View File

@ -7,7 +7,7 @@
SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack", s16 damage)
{
u32 move;
u16 ability;
enum Ability ability;
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_KLUTZ; }
PARAMETRIZE { move = MOVE_SCRATCH; ability = ABILITY_TRANSISTOR; }
@ -38,7 +38,7 @@ SINGLE_BATTLE_TEST("Transistor increases Electric-type attack / special attack",
SINGLE_BATTLE_TEST("Transistor is blocked by neutralizing gas", s16 damage)
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NEUTRALIZING_GAS; }
PARAMETRIZE { ability = ABILITY_LEVITATE; }

View File

@ -5,7 +5,7 @@
SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own berries")
{
u16 mon;
u16 ability;
enum Ability ability;
PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; }
PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; }
GIVEN {
@ -24,7 +24,7 @@ SINGLE_BATTLE_TEST("Unnerve prevents opposing Pokémon from eating their own ber
SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural Gift")
{
u16 mon;
u16 ability;
enum Ability ability;
PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; }
PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; }
GIVEN {
@ -42,7 +42,7 @@ SINGLE_BATTLE_TEST("Unnerve doesn't prevent opposing Pokémon from using Natural
SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)")
{
u16 mon;
u16 ability;
enum Ability ability;
PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; }
PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; }
GIVEN {
@ -59,7 +59,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (player)")
SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)")
{
u16 mon;
u16 ability;
enum Ability ability;
PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; }
PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; }
GIVEN {
@ -76,7 +76,7 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)")
SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in")
{
u16 mon;
u16 ability;
enum Ability ability;
PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; }
PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; }
GIVEN {

View File

@ -43,7 +43,7 @@ SINGLE_BATTLE_TEST("Water Compaction raises Defense 2 stages on each hit of a mu
SINGLE_BATTLE_TEST("Water Compaction does not affect damage taken from Water type moves", s16 damage)
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SAND_VEIL; }
PARAMETRIZE { ability = ABILITY_WATER_COMPACTION; }
GIVEN {

View File

@ -107,7 +107,7 @@ SINGLE_BATTLE_TEST("Wind Power sets up Charge for opponent when hit by a wind mo
DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 2/3 target move")
{
u16 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER;}
PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; }
@ -148,7 +148,7 @@ DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ab
DOUBLE_BATTLE_TEST("Wind Power activates correctly for every battler with the ability when hit by a 3 target move")
{
u16 abilityLeft, abilityRight;
enum Ability abilityLeft, abilityRight;
PARAMETRIZE {abilityLeft = ABILITY_NONE, abilityRight = ABILITY_WIND_POWER; }
PARAMETRIZE {abilityLeft = ABILITY_WIND_POWER, abilityRight = ABILITY_NONE; }

View File

@ -29,7 +29,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Bubble over Water Gun if it's slower")
AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has Contrary")
{
u32 abilityAI;
enum Ability abilityAI;
PARAMETRIZE { abilityAI = ABILITY_MOXIE; }
PARAMETRIZE { abilityAI = ABILITY_MOLD_BREAKER; } // Mold Breaker ignores Contrary.
@ -52,7 +52,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has
AI_SINGLE_BATTLE_TEST("AI prefers moves with better accuracy, but only if they both require the same number of hits to ko")
{
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
u16 hp, expectedMove, turns, abilityAtk, expectedMove2;
u16 hp, expectedMove, turns, expectedMove2;
enum Ability abilityAtk;
abilityAtk = ABILITY_NONE;
expectedMove2 = MOVE_NONE;
@ -136,7 +137,8 @@ AI_SINGLE_BATTLE_TEST("AI prefers moves which deal more damage instead of moves
{
u8 turns = 0;
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
u16 expectedMove, abilityAtk, abilityDef;
u16 expectedMove;
enum Ability abilityAtk, abilityDef;
abilityAtk = ABILITY_NONE;
@ -258,7 +260,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking
{
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
u16 expectedMove, expectedMove2 = MOVE_NONE;
u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE;
enum Ability abilityAtk = ABILITY_NONE;
u32 holdItemAtk = ITEM_NONE;
// Psychic is not very effective, but always hits. Solarbeam requires a charging turn, Double Edge has recoil and Focus Blast can miss;
PARAMETRIZE { abilityAtk = ABILITY_STURDY; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SOLAR_BEAM; move3 = MOVE_PSYCHIC; move4 = MOVE_DOUBLE_EDGE; expectedMove = MOVE_PSYCHIC; }
@ -295,7 +298,8 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking
{
u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE;
u16 expectedMove, expectedMove2 = MOVE_NONE;
u16 abilityAtk = ABILITY_NONE, holdItemAtk = ITEM_NONE;
enum Ability abilityAtk = ABILITY_NONE;
u32 holdItemAtk = ITEM_NONE;
// Fiery Dance and Skull Bash are chosen because user is holding Power Herb
PARAMETRIZE { abilityAtk = ABILITY_STURDY; holdItemAtk = ITEM_POWER_HERB; move1 = MOVE_FOCUS_BLAST; move2 = MOVE_SKULL_BASH; move3 = MOVE_FIERY_DANCE; move4 = MOVE_DOUBLE_EDGE;
@ -322,7 +326,7 @@ AI_SINGLE_BATTLE_TEST("AI chooses the safest option to faint the target, taking
AI_SINGLE_BATTLE_TEST("AI won't use Solar Beam if there is no Sun up or the user is not holding Power Herb")
{
u16 abilityAtk = ABILITY_NONE;
enum Ability abilityAtk = ABILITY_NONE;
u16 holdItemAtk = ITEM_NONE;
PARAMETRIZE { abilityAtk = ABILITY_DROUGHT; }
@ -442,7 +446,7 @@ AI_SINGLE_BATTLE_TEST("First Impression is preferred on the first turn of the sp
AI_SINGLE_BATTLE_TEST("First Impression is not chosen if it's blocked by certain abilities")
{
u16 species;
u16 ability;
enum Ability ability;
PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; }
PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; }
@ -509,7 +513,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Thunderbolt then Surf 2/3 times if the opp
AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary")
{
u32 ability;
enum Ability ability;
PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; }
PARAMETRIZE {ability = ABILITY_CONTRARY; }
@ -535,7 +539,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Scratch over Power-up Punch with Contrary"
AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary")
{
u32 ability;
enum Ability ability;
PARAMETRIZE {ability = ABILITY_SUCTION_CUPS; }
PARAMETRIZE {ability = ABILITY_CONTRARY; }
@ -561,7 +565,7 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary")
AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical immunity")
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SWIFT_SWIM; }
PARAMETRIZE { ability = ABILITY_SHELL_ARMOR; }
@ -638,7 +642,8 @@ AI_SINGLE_BATTLE_TEST("AI uses a guaranteed KO move instead of the move with the
AI_SINGLE_BATTLE_TEST("AI stays choice locked into moves in spite of the player's ability disabling them")
{
u32 playerMon, ability, aiMove;
u32 playerMon, aiMove;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_DAZZLING; playerMon = SPECIES_BRUXISH; aiMove = MOVE_QUICK_ATTACK; }
PARAMETRIZE { ability = ABILITY_QUEENLY_MAJESTY; playerMon = SPECIES_TSAREENA; aiMove = MOVE_QUICK_ATTACK; }
PARAMETRIZE { ability = ABILITY_ARMOR_TAIL; playerMon = SPECIES_FARIGIRAF; aiMove = MOVE_QUICK_ATTACK; }
@ -847,7 +852,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability")
AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect")
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_CLOUD_NINE; }
PARAMETRIZE { ability = ABILITY_DAMP; }

View File

@ -176,7 +176,7 @@ AI_SINGLE_BATTLE_TEST("AI can choose Counter or Mirror Coat if the predicted mov
AI_SINGLE_BATTLE_TEST("AI chooses moves with secondary effect that have a 100% chance to trigger")
{
u16 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NONE; }
PARAMETRIZE { ability = ABILITY_SERENE_GRACE; }
@ -199,18 +199,18 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner")
{
u32 status1_0, status1_1, partnerAbility, move;
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SCRAPPY; }
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_PARALYSIS;
move = MOVE_HEAL_BELL; partnerAbility = ABILITY_SOUNDPROOF; }
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
PARAMETRIZE { status1_0 = STATUS1_NONE; status1_1 = STATUS1_NONE;
move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; }
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
PARAMETRIZE { status1_0 = STATUS1_TOXIC_POISON; status1_1 = STATUS1_NONE;
move = MOVE_REFRESH; partnerAbility = ABILITY_SCRAPPY; }
@ -232,7 +232,8 @@ AI_DOUBLE_BATTLE_TEST("AI chooses moves that cure self or partner")
AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members")
{
u32 status, ability, config;
u32 status, config;
enum Ability ability;
PARAMETRIZE { status = STATUS1_TOXIC_POISON; ability = ABILITY_SCRAPPY; }
PARAMETRIZE { status = STATUS1_NONE; ability = ABILITY_SCRAPPY; }
@ -312,7 +313,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Worry Seed against Rest")
AI_SINGLE_BATTLE_TEST("AI uses Simple Beam against Contrary Leaf Storm")
{
u32 ability, move;
enum Ability ability, move;
PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_LEAF_STORM; }
PARAMETRIZE { ability = ABILITY_CONTRARY; move = MOVE_CHARGE_BEAM; }
PARAMETRIZE { ability = ABILITY_OVERGROW; move = MOVE_CHARGE_BEAM; }
@ -394,7 +395,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Wide Guard against Earthquake when opponent would
AI_SINGLE_BATTLE_TEST("AI sees Shield Dust immunity to additional effects")
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_SHIELD_DUST; }
PARAMETRIZE { ability = ABILITY_TINTED_LENS; }

View File

@ -10,7 +10,8 @@ ASSUMPTIONS
AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move once")
{
u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE;
u32 j, heldItem = ITEM_NONE;
enum Ability ability = ABILITY_NONE;
static const u32 choiceItems[] = {
ITEM_CHOICE_SPECS,
@ -46,7 +47,7 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon switch out after using a status move onc
AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves when determining if they should switch")
{
GIVEN
GIVEN
{
AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_RISKY | AI_FLAG_SMART_SWITCHING | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_MON_CHOICES);
PLAYER(SPECIES_ZIGZAGOON) { Speed(4); Moves(MOVE_TAIL_WHIP, MOVE_SCRATCH); }
@ -61,7 +62,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon only consider their own status moves whe
AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves")
{
// Moves defined by MOVE_TARGET_USER (with exceptions?)
u32 j, ability = ABILITY_NONE, heldItem = ITEM_NONE;
u32 j, heldItem = ITEM_NONE;
enum Ability ability = ABILITY_NONE;
static const u32 choiceItems[] = {
ITEM_CHOICE_SPECS,
@ -93,8 +95,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use stat boosting moves")
AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the only party member")
{
u32 j, ability = ABILITY_NONE, isAlive = 0, heldItem = ITEM_NONE;
u32 j, isAlive = 0, heldItem = ITEM_NONE;
enum Ability ability = ABILITY_NONE;
static const u32 choiceItems[] = {
ITEM_CHOICE_SPECS,
ITEM_CHOICE_BAND,
@ -128,8 +130,8 @@ AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they are the on
AI_SINGLE_BATTLE_TEST("Choiced Pokémon won't use status move if they don't have a good switchin")
{
u32 j, ability = ABILITY_NONE, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE;
u32 j, move = MOVE_NONE, species = SPECIES_NONE, heldItem = ITEM_NONE;
enum Ability ability = ABILITY_NONE;
static const u32 choiceItems[] = {
ITEM_CHOICE_SPECS,
ITEM_CHOICE_BAND,

View File

@ -186,7 +186,8 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability
ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND);
ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1));
u32 species, ability, currentHP;
u32 species, currentHP;
enum Ability ability;
PARAMETRIZE { species = SPECIES_KINGAMBIT; ability = ABILITY_DEFIANT; currentHP = 400; }
PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 400; }
@ -213,7 +214,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Beat Up on an ally with Justified if it wi
ASSUME(GetMoveEffect(MOVE_BEAT_UP) == EFFECT_BEAT_UP);
ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK);
u32 defAbility, atkAbility, currentHP;
enum Ability defAbility, atkAbility, currentHP;
PARAMETRIZE { defAbility = ABILITY_FLASH_FIRE; atkAbility = ABILITY_SCRAPPY; currentHP = 400; }
PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_SCRAPPY; currentHP = 400; }
@ -373,7 +374,8 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners")
ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND);
u32 ability, move, species;
enum Ability ability;
u32 move, species;
PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; move = MOVE_DISCHARGE; }
PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; }
@ -410,7 +412,8 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (ge
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER);
u32 ability, move, species;
enum Ability ability;
u32 move, species;
PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; }
PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; }
@ -434,7 +437,8 @@ AI_DOUBLE_BATTLE_TEST("AI treats an ally's redirection ability appropriately (ge
ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY);
ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER);
u32 ability, move, species;
enum Ability ability;
u32 move, species;
PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; }
PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; }
@ -495,15 +499,15 @@ AI_DOUBLE_BATTLE_TEST("AI sets up weather for its ally")
PARAMETRIZE { goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
PARAMETRIZE { goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
PARAMETRIZE { goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodWeather = MOVE_SUNNY_DAY; badWeather = MOVE_RAIN_DANCE; weatherTrigger = MOVE_SOLAR_BEAM; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodWeather = MOVE_RAIN_DANCE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_THUNDER; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodWeather = MOVE_HAIL; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodWeather = MOVE_SNOWSCAPE; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_BLIZZARD; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodWeather = MOVE_SANDSTORM; badWeather = MOVE_SUNNY_DAY; weatherTrigger = MOVE_SHORE_UP; }
GIVEN {
@ -526,13 +530,13 @@ AI_DOUBLE_BATTLE_TEST("AI sets up terrain for its ally")
PARAMETRIZE { goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; }
PARAMETRIZE { goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; }
PARAMETRIZE { goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodTerrain = MOVE_ELECTRIC_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_RISING_VOLTAGE; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodTerrain = MOVE_GRASSY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_GRASSY_GLIDE; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodTerrain = MOVE_MISTY_TERRAIN; badTerrain = MOVE_PSYCHIC_TERRAIN; terrainTrigger = MOVE_MISTY_EXPLOSION; }
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
PARAMETRIZE { aiFlags |= AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PP_STALL_PREVENTION;
goodTerrain = MOVE_PSYCHIC_TERRAIN; badTerrain = MOVE_ELECTRIC_TERRAIN; terrainTrigger = MOVE_EXPANDING_FORCE; }
GIVEN {
@ -612,7 +616,7 @@ AI_DOUBLE_BATTLE_TEST("AI uses Trick Room with both battlers on the turn it expi
TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); NOT_EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
TURN { EXPECT_MOVE(opponentLeft, MOVE_TRICK_ROOM); EXPECT_MOVE(opponentRight, MOVE_TRICK_ROOM); }
}
}
}
AI_DOUBLE_BATTLE_TEST("AI uses Helping Hand if it's about to die")

View File

@ -825,7 +825,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if player's m
AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an absorber")
{
u32 aiMon; u32 move; u32 absorbingAbility;
u32 aiMon; u32 move;
enum Ability absorbingAbility;
PARAMETRIZE { aiMon = SPECIES_NINETALES; absorbingAbility = ABILITY_FLASH_FIRE; move = MOVE_FLAMETHROWER;}
PARAMETRIZE { aiMon = SPECIES_MANTINE; absorbingAbility = ABILITY_WATER_ABSORB; move = MOVE_SURF;}
PARAMETRIZE { aiMon = SPECIES_TOXICROAK; absorbingAbility = ABILITY_DRY_SKIN; move = MOVE_SURF;}
@ -1286,7 +1287,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: AI sees Echoed Voice damage co
AI_SINGLE_BATTLE_TEST("AI_SMART_MON_CHOICES: AI sees its own weather setting ability when considering switchin candidates")
{
u32 ability = ABILITY_NONE;
enum Ability ability = ABILITY_NONE;
PARAMETRIZE { ability = ABILITY_WATER_ABSORB; }
PARAMETRIZE { ability = ABILITY_DRIZZLE; }
GIVEN {

View File

@ -4,7 +4,8 @@
AI_SINGLE_BATTLE_TEST("AI will not try to lower opposing stats if target is protected by it's ability")
{
u16 ability, species, move;
enum Ability ability;
u32 species, move;
PARAMETRIZE { ability = ABILITY_SPEED_BOOST; species = SPECIES_TORCHIC; move = MOVE_SCARY_FACE; }
PARAMETRIZE { ability = ABILITY_HYPER_CUTTER; species = SPECIES_KRABBY; move = MOVE_GROWL; }

View File

@ -59,7 +59,7 @@ AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- 10,000,000 Volt Thunderbolt")
}
AI_SINGLE_BATTLE_TEST("AI uses Z-Moves -- Z-Conversion")
{
u32 ability;
enum Ability ability;
PARAMETRIZE { ability = ABILITY_NONE; }
PARAMETRIZE { ability = ABILITY_OPPORTUNIST; }

Some files were not shown because too many files have changed in this diff Show More