From e1c819a8639a7f79d8d378b2d0cc0580859d94ec Mon Sep 17 00:00:00 2001 From: AgustinGDLV Date: Sat, 25 Mar 2023 19:26:55 -0700 Subject: [PATCH] opponents properly revert Gigantamax + understand Max Guard --- include/battle.h | 1 + src/battle_ai_main.c | 4 ++++ src/battle_dynamax.c | 2 +- src/battle_util.c | 12 ++++++++++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/include/battle.h b/include/battle.h index 3f5cd92c34..3e20ee565c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -533,6 +533,7 @@ struct DynamaxData u16 baseMove[MAX_BATTLERS_COUNT]; // base move of Max Move u16 lastUsedBaseMove; u16 levelUpHP; + u16 opponentBaseForm; // changedSpecies isn't used for opposing Pokemon }; struct StolenItem diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index c21ad18ba2..9dc682df3b 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -3080,6 +3080,10 @@ static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score) // We only check for moves that have a 20% chance or more for their secondary effect to happen because moves with a smaller chance are rather worthless. We don't want the AI to use those. bool32 sereneGraceBoost = (AI_DATA->abilities[battlerAtk] == ABILITY_SERENE_GRACE && (gBattleMoves[move].secondaryEffectChance >= 20 && gBattleMoves[move].secondaryEffectChance < 100)); + // The AI should understand that while Dynamaxed, status moves function like Protect. + if (IsDynamaxed(battlerAtk) && gBattleMoves[move].split == SPLIT_STATUS) + moveEffect = EFFECT_PROTECT; + // Targeting partner, check benefits of doing that instead if (IsTargetingPartner(battlerAtk, battlerDef)) return score; diff --git a/src/battle_dynamax.c b/src/battle_dynamax.c index 6191960f94..dc1b509cd6 100644 --- a/src/battle_dynamax.c +++ b/src/battle_dynamax.c @@ -115,7 +115,7 @@ bool32 CanDynamax(u16 battlerId) #if B_FLAG_DYNAMAX_BATTLE != 0 if (!FlagGet(B_FLAG_DYNAMAX_BATTLE)) #endif - return FALSE; + //return FALSE; // Check if Player has a Dynamax Band. diff --git a/src/battle_util.c b/src/battle_util.c index 8d72452773..d24e03941f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -10268,6 +10268,10 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) // Saves the original species on the first form change for the player. if (side == B_SIDE_PLAYER && gBattleStruct->changedSpecies[monId] == SPECIES_NONE) gBattleStruct->changedSpecies[monId] = gBattleMons[battlerId].species; + + // Saves the original species for Gigantamax forms for the opponent. + if (side == B_SIDE_OPPONENT && gBattleStruct->dynamax.opponentBaseForm == SPECIES_NONE) + gBattleStruct->dynamax.opponentBaseForm = gBattleMons[battlerId].species; TryToSetBattleFormChangeMoves(&party[monId], method); SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); @@ -10275,7 +10279,8 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) RecalcBattlerStats(battlerId, &party[monId]); return TRUE; } - else if (gBattleStruct->changedSpecies[monId] != SPECIES_NONE) + else if (gBattleStruct->changedSpecies[monId] != SPECIES_NONE + || gBattleStruct->dynamax.opponentBaseForm != SPECIES_NONE) { bool8 restoreSpecies = FALSE; @@ -10295,7 +10300,10 @@ bool32 TryBattleFormChange(u8 battlerId, u16 method) { // Reverts the original species TryToSetBattleFormChangeMoves(&party[monId], method); - SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[monId]); + if (side == B_SIDE_PLAYER) + SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->changedSpecies[monId]); + else + SetMonData(&party[monId], MON_DATA_SPECIES, &gBattleStruct->dynamax.opponentBaseForm); RecalcBattlerStats(battlerId, &party[monId]); return TRUE; }