replace gBattleMons[x].ability w GetBattlerAbility

This commit is contained in:
ghoulslash 2021-10-31 17:19:30 -04:00
parent ae0260fa62
commit a2b8f3f169
5 changed files with 40 additions and 33 deletions

View file

@ -82,7 +82,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler)); opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD) if (GetBattlerAbility(GetBattlerAtPosition(opposingPosition)) != ABILITY_WONDER_GUARD)
return FALSE; return FALSE;
// Check if Pokemon has a super effective move. // Check if Pokemon has a super effective move.
@ -176,7 +176,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
else else
return FALSE; return FALSE;
if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) if (AI_GetAbility(gActiveBattler) == absorbingTypeAbility)
return FALSE; return FALSE;
GetAIPartyIndexes(gActiveBattler, &firstId, &lastId); GetAIPartyIndexes(gActiveBattler, &firstId, &lastId);
@ -228,7 +228,7 @@ static bool8 ShouldSwitchIfNaturalCure(void)
{ {
if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)) if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
return FALSE; return FALSE;
if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE) if (AI_GetAbility(gActiveBattler) != ABILITY_NATURAL_CURE)
return FALSE; return FALSE;
if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2) if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2)
return FALSE; return FALSE;

View file

@ -1068,19 +1068,24 @@ bool32 CanTargetFaintAiWithMod(u8 battlerDef, u8 battlerAtk, s32 hpMod, s32 dmgM
// does NOT include ability suppression checks // does NOT include ability suppression checks
s32 AI_GetAbility(u32 battlerId) s32 AI_GetAbility(u32 battlerId)
{ {
u32 knownAbility = GetBattlerAbility(battlerId);
// The AI knows its own ability. // The AI knows its own ability.
if (IsBattlerAIControlled(battlerId)) if (IsBattlerAIControlled(battlerId))
return gBattleMons[battlerId].ability; return knownAbility;
// Check neutralizing gas, gastro acid
if (knownAbility == ABILITY_NONE)
return knownAbility;
if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE)
return BATTLE_HISTORY->abilities[battlerId]; return BATTLE_HISTORY->abilities[battlerId];
// Abilities that prevent fleeing. // Abilities that prevent fleeing - treat as always known
if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG if (knownAbility == ABILITY_SHADOW_TAG || knownAbility == ABILITY_MAGNET_PULL || knownAbility == ABILITY_ARENA_TRAP)
|| gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL return knownAbility;
|| gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
return gBattleMons[battlerId].ability;
// Else, guess the ability
if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) if (gBaseStats[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE)
{ {
if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) if (gBaseStats[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE)
@ -1093,6 +1098,7 @@ s32 AI_GetAbility(u32 battlerId)
return gBaseStats[gBattleMons[battlerId].species].abilities[0]; // It's definitely ability 1. return gBaseStats[gBattleMons[battlerId].species].abilities[0]; // It's definitely ability 1.
} }
} }
return ABILITY_NONE; // Unknown. return ABILITY_NONE; // Unknown.
} }

View file

@ -6161,7 +6161,7 @@ static void Cmd_switchineffects(void)
{ {
// There is a hack here to ensure the truant counter will be 0 when the battler's next turn starts. // 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 judgement in the battle arena. // The truant counter is not updated in the case where a mon switches in after a lost judgement in the battle arena.
if (gBattleMons[gActiveBattler].ability == ABILITY_TRUANT if (GetBattlerAbility(gActiveBattler) == ABILITY_TRUANT
&& gCurrentActionFuncId != B_ACTION_USE_MOVE && gCurrentActionFuncId != B_ACTION_USE_MOVE
&& !gDisableStructs[gActiveBattler].truantSwitchInHack) && !gDisableStructs[gActiveBattler].truantSwitchInHack)
gDisableStructs[gActiveBattler].truantCounter = 1; gDisableStructs[gActiveBattler].truantCounter = 1;
@ -7353,7 +7353,7 @@ u32 IsLeafGuardProtected(u32 battler)
bool32 IsShieldsDownProtected(u32 battler) bool32 IsShieldsDownProtected(u32 battler)
{ {
return (gBattleMons[battler].ability == ABILITY_SHIELDS_DOWN return (GetBattlerAbility(battler) == ABILITY_SHIELDS_DOWN
&& GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form && GetFormIdFromFormSpeciesId(gBattleMons[battler].species) < GetFormIdFromFormSpeciesId(SPECIES_MINIOR_CORE_RED)); // Minior is not in core form
} }
@ -7821,6 +7821,7 @@ static void Cmd_various(void)
break; break;
case VARIOUS_SWITCHIN_ABILITIES: case VARIOUS_SWITCHIN_ABILITIES:
gBattlescriptCurrInstr += 3; gBattlescriptCurrInstr += 3;
AbilityBattleEffects(ABILITYEFFECT_NEUTRALIZINGGAS, gActiveBattler, 0, 0, 0);
AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0); AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gActiveBattler, 0, 0, 0);
AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE2, gActiveBattler, 0, 0, 0); AbilityBattleEffects(ABILITYEFFECT_INTIMIDATE2, gActiveBattler, 0, 0, 0);
AbilityBattleEffects(ABILITYEFFECT_TRACE2, gActiveBattler, 0, 0, 0); AbilityBattleEffects(ABILITYEFFECT_TRACE2, gActiveBattler, 0, 0, 0);
@ -11060,11 +11061,11 @@ static void Cmd_healpartystatus(void)
u16 ability; u16 ability;
if (gBattlerPartyIndexes[gBattlerAttacker] == i) if (gBattlerPartyIndexes[gBattlerAttacker] == i)
ability = gBattleMons[gBattlerAttacker].ability; ability = GetBattlerAbility(gBattlerAttacker);
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE
&& gBattlerPartyIndexes[gActiveBattler] == i && gBattlerPartyIndexes[gActiveBattler] == i
&& !(gAbsentBattlerFlags & gBitTable[gActiveBattler])) && !(gAbsentBattlerFlags & gBitTable[gActiveBattler]))
ability = gBattleMons[gActiveBattler].ability; ability = GetBattlerAbility(gBattlerAttacker);
else else
ability = GetAbilityBySpecies(species, abilityNum); ability = GetAbilityBySpecies(species, abilityNum);

View file

@ -317,8 +317,8 @@ void HandleAction_UseMove(void)
else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE) else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& gSideTimers[side].followmeTimer == 0 && gSideTimers[side].followmeTimer == 0
&& (gBattleMoves[gCurrentMove].power != 0 || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER) && (gBattleMoves[gCurrentMove].power != 0 || gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER)
&& ((gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC) && ((GetBattlerAbility(*(gBattleStruct->moveTarget + gBattlerAttacker)) != ABILITY_LIGHTNING_ROD && moveType == TYPE_ELECTRIC)
|| (gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_STORM_DRAIN && moveType == TYPE_WATER))) || (GetBattlerAbility(*(gBattleStruct->moveTarget + gBattlerAttacker)) != ABILITY_STORM_DRAIN && moveType == TYPE_WATER)))
{ {
side = GetBattlerSide(gBattlerAttacker); side = GetBattlerSide(gBattlerAttacker);
for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++)
@ -387,9 +387,9 @@ void HandleAction_UseMove(void)
{ {
gActiveBattler = gBattlerByTurnOrder[var]; gActiveBattler = gBattlerByTurnOrder[var];
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
if (gBattleMons[gActiveBattler].ability == ABILITY_LIGHTNING_ROD) if (GetBattlerAbility(gActiveBattler) == ABILITY_LIGHTNING_ROD)
gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1;
else if (gBattleMons[gActiveBattler].ability == ABILITY_STORM_DRAIN) else if (GetBattlerAbility(gActiveBattler) == ABILITY_STORM_DRAIN)
gSpecialStatuses[gActiveBattler].stormDrainRedirected = 1; gSpecialStatuses[gActiveBattler].stormDrainRedirected = 1;
gBattlerTarget = gActiveBattler; gBattlerTarget = gActiveBattler;
} }
@ -2641,7 +2641,7 @@ u8 DoBattlerEndTurnEffects(void)
for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++)
{ {
if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)
&& gBattleMons[gBattlerAttacker].ability != ABILITY_SOUNDPROOF) && GetBattlerAbility(gBattlerAttacker) != ABILITY_SOUNDPROOF)
{ {
gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP);
gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE);
@ -3225,7 +3225,7 @@ u8 AtkCanceller_UnableToUseMove(void)
gBattleStruct->atkCancellerTracker++; gBattleStruct->atkCancellerTracker++;
break; break;
case CANCELLER_TRUANT: // truant case CANCELLER_TRUANT: // truant
if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) if (GetBattlerAbility(gBattlerAttacker) == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter)
{ {
CancelMultiTurnMoves(gBattlerAttacker); CancelMultiTurnMoves(gBattlerAttacker);
gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE;
@ -3665,7 +3665,7 @@ u8 TryWeatherFormChange(u8 battler)
if (gBattleMons[battler].species == SPECIES_CASTFORM) if (gBattleMons[battler].species == SPECIES_CASTFORM)
{ {
if (gBattleMons[battler].ability != ABILITY_FORECAST || gBattleMons[battler].hp == 0) if (GetBattlerAbility(battler) != ABILITY_FORECAST || gBattleMons[battler].hp == 0)
{ {
ret = 0; ret = 0;
} }
@ -3701,7 +3701,7 @@ u8 TryWeatherFormChange(u8 battler)
} }
else if (gBattleMons[battler].species == SPECIES_CHERRIM) else if (gBattleMons[battler].species == SPECIES_CHERRIM)
{ {
if (gBattleMons[battler].ability != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0) if (GetBattlerAbility(battler) != ABILITY_FLOWER_GIFT || gBattleMons[battler].hp == 0)
ret = 0; ret = 0;
else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY) else if (gBattleMonForms[battler] == 0 && weatherEffect && gBattleWeather & WEATHER_SUN_ANY)
ret = 2; ret = 2;
@ -3791,7 +3791,7 @@ static bool32 ShouldChangeFormHpBased(u32 battler)
for (i = 0; i < ARRAY_COUNT(forms); i++) for (i = 0; i < ARRAY_COUNT(forms); i++)
{ {
if (gBattleMons[battler].ability == forms[i][0]) if (GetBattlerAbility(battler) == forms[i][0])
{ {
if (gBattleMons[battler].species == forms[i][2] if (gBattleMons[battler].species == forms[i][2]
&& gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3]) && gBattleMons[battler].hp > gBattleMons[battler].maxHP / forms[i][3])
@ -5220,7 +5220,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITYEFFECT_IMMUNITY: // 5 case ABILITYEFFECT_IMMUNITY: // 5
for (battler = 0; battler < gBattlersCount; battler++) for (battler = 0; battler < gBattlersCount; battler++)
{ {
switch (gBattleMons[battler].ability) switch (GetBattlerAbility(battler))
{ {
case ABILITY_IMMUNITY: case ABILITY_IMMUNITY:
if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER)) if (gBattleMons[battler].status1 & (STATUS1_POISON | STATUS1_TOXIC_POISON | STATUS1_TOXIC_COUNTER))
@ -5310,7 +5310,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITYEFFECT_FORECAST: // 6 case ABILITYEFFECT_FORECAST: // 6
for (battler = 0; battler < gBattlersCount; battler++) for (battler = 0; battler < gBattlersCount; battler++)
{ {
if (gBattleMons[battler].ability == ABILITY_FORECAST || gBattleMons[battler].ability == ABILITY_FLOWER_GIFT) if (GetBattlerAbility(battler) == ABILITY_FORECAST || GetBattlerAbility(battler) == ABILITY_FLOWER_GIFT)
{ {
effect = TryWeatherFormChange(battler); effect = TryWeatherFormChange(battler);
if (effect) if (effect)
@ -5369,7 +5369,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITYEFFECT_INTIMIDATE2: case ABILITYEFFECT_INTIMIDATE2:
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
if (gBattleMons[i].ability == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED) if (GetBattlerAbility(i) == ABILITY_INTIMIDATE && gBattleResources->flags->flags[i] & RESOURCE_FLAG_INTIMIDATED)
{ {
gLastUsedAbility = ABILITY_INTIMIDATE; gLastUsedAbility = ABILITY_INTIMIDATE;
gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED); gBattleResources->flags->flags[i] &= ~(RESOURCE_FLAG_INTIMIDATED);
@ -5437,7 +5437,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
} }
break; break;
case ABILITYEFFECT_NEUTRALIZINGGAS: case ABILITYEFFECT_NEUTRALIZINGGAS:
// for the start of battle only. The switch-in message plays in Cmd_switchineffects because it comes before the hazards // Prints message only. separate from ABILITYEFFECT_ON_SWITCHIN bc activates before entry hazards
for (i = 0; i < gBattlersCount; i++) for (i = 0; i < gBattlersCount; i++)
{ {
if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !(gBattleResources->flags->flags[i] & RESOURCE_FLAG_NEUTRALIZING_GAS)) if (gBattleMons[i].ability == ABILITY_NEUTRALIZING_GAS && !(gBattleResources->flags->flags[i] & RESOURCE_FLAG_NEUTRALIZING_GAS))
@ -5460,7 +5460,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
return effect; return effect;
} }
static bool32 IsNeutralizingGasBannedAbility(u32 ability) bool32 IsNeutralizingGasBannedAbility(u32 ability)
{ {
switch (ability) switch (ability)
{ {
@ -5483,7 +5483,7 @@ static bool32 IsNeutralizingGasBannedAbility(u32 ability)
} }
} }
static bool32 IsNeutralizingGasOnField(void) bool32 IsNeutralizingGasOnField(void)
{ {
u32 i; u32 i;
@ -5567,7 +5567,7 @@ u32 IsAbilityPreventingEscape(u32 battlerId)
return 0; return 0;
#endif #endif
#if B_SHADOW_TAG_ESCAPE >= GEN_4 #if B_SHADOW_TAG_ESCAPE >= GEN_4
if ((id = IsAbilityOnOpposingSide(battlerId, ABILITY_SHADOW_TAG)) && gBattleMons[battlerId].ability != ABILITY_SHADOW_TAG) if ((id = IsAbilityOnOpposingSide(battlerId, ABILITY_SHADOW_TAG)) && GetBattlerAbility(battlerId) != ABILITY_SHADOW_TAG)
#else #else
if (id = IsAbilityOnOpposingSide(battlerId, ABILITY_SHADOW_TAG)) if (id = IsAbilityOnOpposingSide(battlerId, ABILITY_SHADOW_TAG))
#endif #endif
@ -7113,7 +7113,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget)
targetBattler = SetRandomTarget(gBattlerAttacker); targetBattler = SetRandomTarget(gBattlerAttacker);
if (gBattleMoves[move].type == TYPE_ELECTRIC if (gBattleMoves[move].type == TYPE_ELECTRIC
&& IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD) && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_LIGHTNING_ROD)
&& gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) && GetBattlerAbility(targetBattler) != ABILITY_LIGHTNING_ROD)
{ {
targetBattler ^= BIT_FLANK; targetBattler ^= BIT_FLANK;
RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability);
@ -7121,7 +7121,7 @@ u32 GetMoveTarget(u16 move, u8 setTarget)
} }
else if (gBattleMoves[move].type == TYPE_WATER else if (gBattleMoves[move].type == TYPE_WATER
&& IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN) && IsAbilityOnOpposingSide(gBattlerAttacker, ABILITY_STORM_DRAIN)
&& gBattleMons[targetBattler].ability != ABILITY_STORM_DRAIN) && GetBattlerAbility(targetBattler) != ABILITY_STORM_DRAIN)
{ {
targetBattler ^= BIT_FLANK; targetBattler ^= BIT_FLANK;
RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability);
@ -7299,7 +7299,7 @@ u32 GetBattlerHoldEffect(u8 battlerId, bool32 checkNegating)
return HOLD_EFFECT_NONE; return HOLD_EFFECT_NONE;
if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM)
return HOLD_EFFECT_NONE; return HOLD_EFFECT_NONE;
if (gBattleMons[battlerId].ability == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) if (GetBattlerAbility(battlerId) == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID))
return HOLD_EFFECT_NONE; return HOLD_EFFECT_NONE;
} }

View file

@ -142,7 +142,7 @@ u32 sub_805725C(u8 battlerId)
{ {
u32 toSub; u32 toSub;
if (gBattleMons[battlerId].ability == ABILITY_EARLY_BIRD) if (GetBattlerAbility(battlerId) == ABILITY_EARLY_BIRD)
toSub = 2; toSub = 2;
else else
toSub = 1; toSub = 1;