mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
Optimized battle gender checks (#3020)
* Optimized battle gender checks * Apply suggestions from code review Co-authored-by: AgustinGDLV <103095241+AgustinGDLV@users.noreply.github.com> --------- Co-authored-by: AgustinGDLV <103095241+AgustinGDLV@users.noreply.github.com>
This commit is contained in:
parent
05895c5308
commit
d0e6ea7612
@ -143,7 +143,7 @@ bool32 AI_CanConfuse(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 battlerAtk
|
||||
bool32 ShouldBurnSelf(u8 battler, u16 ability);
|
||||
bool32 AI_CanBurn(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 battlerAtkPartner, u16 move, u16 partnerMove);
|
||||
bool32 AI_CanGiveFrostbite(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 battlerAtkPartner, u16 move, u16 partnerMove);
|
||||
bool32 AI_CanBeInfatuated(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 atkGender, u8 defGender);
|
||||
bool32 AI_CanBeInfatuated(u8 battlerAtk, u8 battlerDef, u16 defAbility);
|
||||
bool32 AnyPartyMemberStatused(u8 battlerId, bool32 checkSoundproof);
|
||||
u32 ShouldTryToFlinch(u8 battlerAtk, u8 battlerDef, u16 atkAbility, u16 defAbility, u16 move);
|
||||
bool32 ShouldTrap(u8 battlerAtk, u8 battlerDef, u16 move);
|
||||
|
@ -234,5 +234,7 @@ u32 CountBattlerStatIncreases(u8 battlerId, bool32 countEvasionAcc);
|
||||
bool32 IsMyceliumMightOnField(void);
|
||||
bool8 ChangeTypeBasedOnTerrain(u8 battlerId);
|
||||
void RemoveConfusionStatus(u8 battlerId);
|
||||
u8 GetBattlerGender(u8 battlerId);
|
||||
bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2);
|
||||
|
||||
#endif // GUARD_BATTLE_UTIL_H
|
||||
|
@ -248,7 +248,7 @@ static void CopyBattlerDataToAIParty(u32 bPosition, u32 side)
|
||||
aiMon->species = bMon->species;
|
||||
aiMon->level = bMon->level;
|
||||
aiMon->status = bMon->status1;
|
||||
aiMon->gender = GetGenderFromSpeciesAndPersonality(bMon->species, bMon->personality);
|
||||
aiMon->gender = GetBattlerGender(battler);
|
||||
aiMon->isFainted = FALSE;
|
||||
aiMon->wasSentInBattle = TRUE;
|
||||
aiMon->switchInCount++;
|
||||
@ -1287,12 +1287,8 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
||||
score -= 8;
|
||||
break;
|
||||
case EFFECT_CAPTIVATE:
|
||||
{
|
||||
u8 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality);
|
||||
u8 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality);
|
||||
if (atkGender == MON_GENDERLESS || defGender == MON_GENDERLESS || atkGender == defGender)
|
||||
score -= 10;
|
||||
}
|
||||
if (!AreBattlersOfOppositeGender(battlerAtk, battlerDef))
|
||||
score -= 10;
|
||||
break;
|
||||
// other
|
||||
case EFFECT_HAZE:
|
||||
@ -1592,9 +1588,7 @@ static s16 AI_CheckBadMove(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
||||
score -= 2; // mainly to prevent looping between hail and snow
|
||||
break;
|
||||
case EFFECT_ATTRACT:
|
||||
if (!AI_CanBeInfatuated(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef],
|
||||
GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality),
|
||||
GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality)))
|
||||
if (!AI_CanBeInfatuated(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef]))
|
||||
score -= 10;
|
||||
break;
|
||||
case EFFECT_SAFEGUARD:
|
||||
|
@ -2967,14 +2967,12 @@ bool32 AI_CanGiveFrostbite(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 batt
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool32 AI_CanBeInfatuated(u8 battlerAtk, u8 battlerDef, u16 defAbility, u8 atkGender, u8 defGender)
|
||||
bool32 AI_CanBeInfatuated(u8 battlerAtk, u8 battlerDef, u16 defAbility)
|
||||
{
|
||||
if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION)
|
||||
|| AI_GetMoveEffectiveness(AI_THINKING_STRUCT->moveConsidered, battlerAtk, battlerDef) == AI_EFFECTIVENESS_x0
|
||||
|| defAbility == ABILITY_OBLIVIOUS
|
||||
|| atkGender == defGender
|
||||
|| atkGender == MON_GENDERLESS
|
||||
|| defGender == MON_GENDERLESS
|
||||
|| !AreBattlersOfOppositeGender(battlerAtk, battlerDef)
|
||||
|| AI_IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
|
@ -12758,26 +12758,6 @@ static void Cmd_tryinfatuating(void)
|
||||
{
|
||||
CMD_ARGS(const u8 *failInstr);
|
||||
|
||||
struct Pokemon *monAttacker, *monTarget;
|
||||
u16 speciesAttacker, speciesTarget;
|
||||
u32 personalityAttacker, personalityTarget;
|
||||
|
||||
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
|
||||
monAttacker = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]];
|
||||
else
|
||||
monAttacker = &gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]];
|
||||
|
||||
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
|
||||
monTarget = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]];
|
||||
else
|
||||
monTarget = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]];
|
||||
|
||||
speciesAttacker = GetMonData(monAttacker, MON_DATA_SPECIES);
|
||||
personalityAttacker = GetMonData(monAttacker, MON_DATA_PERSONALITY);
|
||||
|
||||
speciesTarget = GetMonData(monTarget, MON_DATA_SPECIES);
|
||||
personalityTarget = GetMonData(monTarget, MON_DATA_PERSONALITY);
|
||||
|
||||
if (GetBattlerAbility(gBattlerTarget) == ABILITY_OBLIVIOUS)
|
||||
{
|
||||
gBattlescriptCurrInstr = BattleScript_NotAffectedAbilityPopUp;
|
||||
@ -12786,10 +12766,8 @@ static void Cmd_tryinfatuating(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget)
|
||||
|| gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION
|
||||
|| GetGenderFromSpeciesAndPersonality(speciesAttacker, personalityAttacker) == MON_GENDERLESS
|
||||
|| GetGenderFromSpeciesAndPersonality(speciesTarget, personalityTarget) == MON_GENDERLESS)
|
||||
if (gBattleMons[gBattlerTarget].status2 & STATUS2_INFATUATION
|
||||
|| !AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget))
|
||||
{
|
||||
gBattlescriptCurrInstr = cmd->failInstr;
|
||||
}
|
||||
@ -16103,10 +16081,7 @@ static void Cmd_jumpifoppositegenders(void)
|
||||
{
|
||||
CMD_ARGS(const u8 *jumpInstr);
|
||||
|
||||
u32 atkGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerAttacker].species, gBattleMons[gBattlerAttacker].personality);
|
||||
u32 defGender = GetGenderFromSpeciesAndPersonality(gBattleMons[gBattlerTarget].species, gBattleMons[gBattlerTarget].personality);
|
||||
|
||||
if ((atkGender == MON_MALE && defGender == MON_FEMALE) || (atkGender == MON_FEMALE && defGender == MON_MALE))
|
||||
if (AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget))
|
||||
gBattlescriptCurrInstr = cmd->jumpInstr;
|
||||
else
|
||||
gBattlescriptCurrInstr = cmd->nextInstr;
|
||||
|
@ -4183,7 +4183,6 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
{
|
||||
u8 effect = 0;
|
||||
u32 speciesAtk, speciesDef;
|
||||
u32 pidAtk, pidDef;
|
||||
u32 moveType, move;
|
||||
u32 i, j;
|
||||
|
||||
@ -4194,10 +4193,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
gBattlerAttacker = battler;
|
||||
|
||||
speciesAtk = gBattleMons[gBattlerAttacker].species;
|
||||
pidAtk = gBattleMons[gBattlerAttacker].personality;
|
||||
|
||||
speciesDef = gBattleMons[gBattlerTarget].species;
|
||||
pidDef = gBattleMons[gBattlerTarget].personality;
|
||||
|
||||
if (special)
|
||||
gLastUsedAbility = special;
|
||||
@ -5515,16 +5511,14 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
|
||||
if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT)
|
||||
&& gBattleMons[gBattlerAttacker].hp != 0
|
||||
&& !gProtectStructs[gBattlerAttacker].confusionSelfDmg
|
||||
&& (IsMoveMakingContact(move, gBattlerAttacker))
|
||||
&& TARGET_TURN_DAMAGED
|
||||
&& gBattleMons[gBattlerTarget].hp != 0
|
||||
&& RandomWeighted(RNG_CUTE_CHARM, 2, 1)
|
||||
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_OBLIVIOUS
|
||||
&& !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL)
|
||||
&& GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != GetGenderFromSpeciesAndPersonality(speciesDef, pidDef)
|
||||
&& !(gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION)
|
||||
&& GetGenderFromSpeciesAndPersonality(speciesAtk, pidAtk) != MON_GENDERLESS
|
||||
&& GetGenderFromSpeciesAndPersonality(speciesDef, pidDef) != MON_GENDERLESS)
|
||||
&& AreBattlersOfOppositeGender(gBattlerAttacker, gBattlerTarget)
|
||||
&& GetBattlerAbility(gBattlerAttacker) != ABILITY_OBLIVIOUS
|
||||
&& IsMoveMakingContact(move, gBattlerAttacker)
|
||||
&& !IsAbilityOnSide(gBattlerAttacker, ABILITY_AROMA_VEIL))
|
||||
{
|
||||
gBattleMons[gBattlerAttacker].status2 |= STATUS2_INFATUATED_WITH(gBattlerTarget);
|
||||
BattleScriptPushCursor();
|
||||
@ -8753,15 +8747,10 @@ static u32 CalcMoveBasePowerAfterModifiers(u16 move, u8 battlerAtk, u8 battlerDe
|
||||
MulModifier(&modifier, UQ_4_12(1.3));
|
||||
break;
|
||||
case ABILITY_RIVALRY:
|
||||
if (GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality) != MON_GENDERLESS
|
||||
&& GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality) != MON_GENDERLESS)
|
||||
{
|
||||
if (GetGenderFromSpeciesAndPersonality(gBattleMons[battlerAtk].species, gBattleMons[battlerAtk].personality)
|
||||
== GetGenderFromSpeciesAndPersonality(gBattleMons[battlerDef].species, gBattleMons[battlerDef].personality))
|
||||
MulModifier(&modifier, UQ_4_12(1.25));
|
||||
else
|
||||
MulModifier(&modifier, UQ_4_12(0.75));
|
||||
}
|
||||
if (AreBattlersOfOppositeGender(battlerAtk, battlerDef))
|
||||
MulModifier(&modifier, UQ_4_12(1.25));
|
||||
else
|
||||
MulModifier(&modifier, UQ_4_12(0.75));
|
||||
break;
|
||||
case ABILITY_ANALYTIC:
|
||||
if (GetBattlerTurnOrderNum(battlerAtk) == gBattlersCount - 1 && move != MOVE_FUTURE_SIGHT && move != MOVE_DOOM_DESIRE)
|
||||
@ -10923,3 +10912,16 @@ static bool8 CanBeInfinitelyConfused(u8 battlerId)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
u8 GetBattlerGender(u8 battlerId)
|
||||
{
|
||||
return GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species,
|
||||
gBattleMons[battlerId].personality);
|
||||
}
|
||||
|
||||
bool8 AreBattlersOfOppositeGender(u8 battler1, u8 battler2)
|
||||
{
|
||||
u8 gender1 = GetBattlerGender(battler1);
|
||||
u8 gender2 = GetBattlerGender(battler2);
|
||||
|
||||
return (gender1 != MON_GENDERLESS && gender2 != MON_GENDERLESS && gender1 != gender2);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user