Skip to content

Commit

Permalink
Merge pull request #2355 from ghoulslash/be/aiparty
Browse files Browse the repository at this point in the history
Add overwrittenAbilities field
  • Loading branch information
AsparagusEduardo authored Sep 24, 2022
2 parents 0f743c4 + c22671d commit 38df216
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 14 deletions.
1 change: 1 addition & 0 deletions include/battle.h
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,7 @@ struct BattleStruct
// When using a move which hits multiple opponents which is then bounced by a target, we need to make sure, the move hits both opponents, the one with bounce, and the one without.
u8 attackerBeforeBounce:2;
u8 targetsDone[MAX_BATTLERS_COUNT]; // Each battler as a bit.
u16 overwrittenAbilities[MAX_BATTLERS_COUNT]; // abilities overwritten during battle (keep separate from battle history in case of switching)
};

#define F_DYNAMIC_TYPE_1 (1 << 6)
Expand Down
4 changes: 4 additions & 0 deletions src/battle_ai_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -1163,6 +1163,10 @@ s32 AI_GetAbility(u32 battlerId)
{
u32 knownAbility = GetBattlerAbility(battlerId);

// We've had ability overwritten by e.g. Worry Seed. It is not part of AI_PARTY in case of switching
if (gBattleStruct->overwrittenAbilities[battlerId])
return gBattleStruct->overwrittenAbilities[battlerId];

// The AI knows its own ability.
if (IsBattlerAIControlled(battlerId))
return knownAbility;
Expand Down
5 changes: 5 additions & 0 deletions src/battle_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2940,6 +2940,7 @@ static void BattleStartClearSetData(void)
gBattleStruct->lastTakenMoveFrom[i][3] = MOVE_NONE;
gBattleStruct->AI_monToSwitchIntoId[i] = PARTY_SIZE;
gBattleStruct->skyDropTargets[i] = 0xFF;
gBattleStruct->overwrittenAbilities[i] = ABILITY_NONE;
}

gLastUsedMove = 0;
Expand Down Expand Up @@ -3126,6 +3127,8 @@ void SwitchInClearSetData(void)
// Reset damage to prevent things like red card activating if the switched-in mon is holding it
gSpecialStatuses[gActiveBattler].physicalDmg = 0;
gSpecialStatuses[gActiveBattler].specialDmg = 0;

gBattleStruct->overwrittenAbilities[gActiveBattler] = ABILITY_NONE;

Ai_UpdateSwitchInData(gActiveBattler);
}
Expand Down Expand Up @@ -3228,6 +3231,8 @@ void FaintClearSetData(void)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
UndoMegaEvolution(gBattlerPartyIndexes[gActiveBattler]);

gBattleStruct->overwrittenAbilities[gActiveBattler] = ABILITY_NONE;

// If the fainted mon was involved in a Sky Drop
if (gBattleStruct->skyDropTargets[gActiveBattler] != 0xFF)
{
Expand Down
18 changes: 9 additions & 9 deletions src/battle_script_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -8152,8 +8152,7 @@ static void Cmd_various(void)
gBattlescriptCurrInstr += 8;
return;
case VARIOUS_TRACE_ABILITY:
gBattleMons[gActiveBattler].ability = gBattleStruct->tracedAbility[gActiveBattler];
RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability);
gBattleMons[gActiveBattler].ability = gBattleStruct->overwrittenAbilities[gActiveBattler] = gBattleStruct->tracedAbility[gActiveBattler];
break;
case VARIOUS_TRY_ILLUSION_OFF:
if (GetIllusionMonPtr(gActiveBattler) != NULL)
Expand Down Expand Up @@ -8628,7 +8627,7 @@ static void Cmd_various(void)
if (gBattleMons[gBattlerTarget].ability == ABILITY_NEUTRALIZING_GAS)
gSpecialStatuses[gBattlerTarget].neutralizingGasRemoved = TRUE;

gBattleMons[gBattlerTarget].ability = ABILITY_SIMPLE;
gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = ABILITY_SIMPLE;
gBattlescriptCurrInstr += 7;
}
return;
Expand All @@ -8646,7 +8645,7 @@ static void Cmd_various(void)
}
else
{
gBattleMons[gBattlerTarget].ability = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = gBattleMons[gBattlerAttacker].ability;
gBattlescriptCurrInstr += 7;
}
return;
Expand Down Expand Up @@ -11458,7 +11457,8 @@ static void Cmd_transformdataexecution(void)

for (i = 0; i < offsetof(struct BattlePokemon, pp); i++)
battleMonAttacker[i] = battleMonTarget[i];


gBattleStruct->overwrittenAbilities[gBattlerAttacker] = GetBattlerAbility(gBattlerTarget);
for (i = 0; i < MAX_MON_MOVES; i++)
{
if (gBattleMoves[gBattleMons[gBattlerAttacker].moves[i]].pp < 5)
Expand Down Expand Up @@ -12982,7 +12982,7 @@ static void Cmd_trycopyability(void)
else
{
gBattleScripting.abilityPopupOverwrite = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerAttacker].ability = defAbility;
gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = defAbility;
gLastUsedAbility = defAbility;
gBattlescriptCurrInstr += 5;
}
Expand Down Expand Up @@ -13148,8 +13148,8 @@ static void Cmd_tryswapabilities(void)
else
{
u16 abilityAtk = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
gBattleMons[gBattlerTarget].ability = abilityAtk;
gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability;
gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = abilityAtk;

gBattlescriptCurrInstr += 5;
}
Expand Down Expand Up @@ -14527,7 +14527,7 @@ static void Cmd_tryworryseed(void)
}
else
{
gBattleMons[gBattlerTarget].ability = ABILITY_INSOMNIA;
gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = ABILITY_INSOMNIA;
gBattlescriptCurrInstr += 5;
}
}
Expand Down
8 changes: 3 additions & 5 deletions src/battle_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -5294,7 +5294,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
case ABILITY_STANCE_CHANGE:
break;
default:
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = ABILITY_MUMMY;
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = ABILITY_MUMMY;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MummyActivates;
effect++;
Expand Down Expand Up @@ -5326,10 +5326,8 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u16 ability, u8 special, u16 move
break;
default:
gLastUsedAbility = gBattleMons[gBattlerAttacker].ability;
gBattleMons[gBattlerAttacker].ability = gBattleMons[gBattlerTarget].ability;
gBattleMons[gBattlerTarget].ability = gLastUsedAbility;
RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability);
RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability);
gBattleMons[gBattlerAttacker].ability = gBattleStruct->overwrittenAbilities[gBattlerAttacker] = gBattleMons[gBattlerTarget].ability;
gBattleMons[gBattlerTarget].ability = gBattleStruct->overwrittenAbilities[gBattlerTarget] = gLastUsedAbility;
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_WanderingSpiritActivates;
effect++;
Expand Down

0 comments on commit 38df216

Please sign in to comment.