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:
parent
f856f0cb66
commit
e385c7f59f
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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];
|
||||
};
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -64,7 +64,7 @@ struct TrainerMon
|
||||
u16 moves[4];
|
||||
u16 species;
|
||||
u16 heldItem;
|
||||
u16 ability;
|
||||
enum Ability ability;
|
||||
u8 lvl;
|
||||
u8 ball;
|
||||
u8 friendship;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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]);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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
87
src/battle_script_commands.c
Executable file → Normal 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)
|
||||
®enerate);
|
||||
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))
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
const struct Ability gAbilitiesInfo[ABILITIES_COUNT] =
|
||||
const struct AbilityInfo gAbilitiesInfo[ABILITIES_COUNT] =
|
||||
{
|
||||
[ABILITY_NONE] =
|
||||
{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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))))
|
||||
{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 ; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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; }
|
||||
@ -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; }
|
||||
|
||||
|
||||
@ -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,
|
||||
@ -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,
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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; }
|
||||
|
||||
@ -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
Loading…
x
Reference in New Issue
Block a user