From df88317a9890a23521e09632d1fc345b720210d6 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sun, 28 Aug 2022 11:48:39 -0300 Subject: [PATCH 1/6] Introduced FORM_BATTLE form changes For species such as Xerneas and Zacian. --- include/constants/pokemon.h | 2 ++ src/battle_main.c | 14 ++++++++++ src/battle_util.c | 17 +++++++++++- src/data/pokemon/form_change_table_pointers.h | 8 +++++- src/data/pokemon/form_change_tables.h | 26 +++++++++++++++++++ src/pokemon.c | 6 +++-- 6 files changed, 69 insertions(+), 4 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 98075a9425..8e8b31543d 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -324,6 +324,8 @@ #define FORM_WITHDRAW 4 #define FORM_ITEM_HOLD_ABILITY 5 #define FORM_ITEM_USE_TIME 6 +#define FORM_BATTLE_BEGIN 7 +#define FORM_BATTLE_END 8 #define NUM_MALE_LINK_FACILITY_CLASSES 8 #define NUM_FEMALE_LINK_FACILITY_CLASSES 8 diff --git a/src/battle_main.c b/src/battle_main.c index 25a0b06135..f75a7ae80b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -481,6 +481,7 @@ void CB2_InitBattle(void) static void CB2_InitBattleInternal(void) { s32 i; + u16 targetSpecies; SetHBlankCallback(NULL); SetVBlankCallback(NULL); @@ -571,6 +572,19 @@ static void CB2_InitBattleInternal(void) for (i = 0; i < PARTY_SIZE; i++) AdjustFriendship(&gPlayerParty[i], FRIENDSHIP_EVENT_LEAGUE_BATTLE); + // Apply party-wide start-of-battle form changes + for (i = 0; i < PARTY_SIZE; i++) + { + // Player's side + targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_BEGIN, 0); + if (targetSpecies != SPECIES_NONE) + SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies); + // Opponent's side + targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_BEGIN, 0); + if (targetSpecies != SPECIES_NONE) + SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies); + } + gBattleCommunication[MULTIUSE_STATE] = 0; } diff --git a/src/battle_util.c b/src/battle_util.c index f38d80a69c..dff9d71da5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9588,7 +9588,7 @@ void UndoMegaEvolution(u32 monId) void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) { - u32 i, currSpecies; + u32 i, currSpecies, targetSpecies; struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; static const u16 species[][3] = { @@ -9622,6 +9622,21 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) break; } } + if (!isSwitchingOut) + { + // Apply party-wide end-of-battle form changes + for (i = 0; i < PARTY_SIZE; i++) + { + // Player's side + targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_END, 0); + if (targetSpecies != SPECIES_NONE) + SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies); + // Opponent's side + targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_END, 0); + if (targetSpecies != SPECIES_NONE) + SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies); + } + } } bool32 DoBattlersShareType(u32 battler1, u32 battler2) diff --git a/src/data/pokemon/form_change_table_pointers.h b/src/data/pokemon/form_change_table_pointers.h index 3fdbff7a6e..58a6c899fc 100644 --- a/src/data/pokemon/form_change_table_pointers.h +++ b/src/data/pokemon/form_change_table_pointers.h @@ -31,11 +31,13 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_LANDORUS_THERIAN] = sLandorusTherianFormChangeTable, [SPECIES_KELDEO] = sKeldeoFormChangeTable, [SPECIES_KELDEO_RESOLUTE] = sKeldeoResoluteFormChangeTable, - [SPECIES_GENESECT] = sGenesectFormChangeTable, + [SPECIES_GENESECT] = sGenesectFormChangeTable, [SPECIES_GENESECT_DOUSE_DRIVE] = sGenesectFormChangeTable, [SPECIES_GENESECT_SHOCK_DRIVE] = sGenesectFormChangeTable, [SPECIES_GENESECT_BURN_DRIVE] = sGenesectFormChangeTable, [SPECIES_GENESECT_CHILL_DRIVE] = sGenesectFormChangeTable, + [SPECIES_XERNEAS] = sXerneasFormChangeTable, + [SPECIES_XERNEAS_ACTIVE] = sXerneasFormChangeTable, [SPECIES_HOOPA] = sHoopaFormChangeTable, [SPECIES_HOOPA_UNBOUND] = sHoopaUnboundFormChangeTable, [SPECIES_ORICORIO] = sOricorioFormChangeTable, @@ -60,5 +62,9 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_SILVALLY_ROCK] = sSilvallyFormChangeTable, [SPECIES_SILVALLY_STEEL] = sSilvallyFormChangeTable, [SPECIES_SILVALLY_WATER] = sSilvallyFormChangeTable, + [SPECIES_ZACIAN] = sZacianFormChangeTable, + [SPECIES_ZACIAN_CROWNED_SWORD] = sZacianFormChangeTable, + [SPECIES_ZAMAZENTA] = sZamazentaFormChangeTable, + [SPECIES_ZAMAZENTA_CROWNED_SHIELD] = sZamazentaFormChangeTable, #endif }; diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 15cb8cdecd..be76cc9956 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -33,6 +33,14 @@ FORM_ITEM_USE_TIME: param1 = item to use param2 = DAY if form change activates in the daytime NIGHT if form change activates at nighttime + +FORM_BATTLE_BEGIN: + Form change activates when the Pokémon is sent out at the beginning of a battle + param1 = item to hold, optional + +FORM_BATTLE_END: + Form change activates at the end of a battle + param1 = item to hold, optional */ // FORM_MOVE param2 Arguments @@ -185,5 +193,23 @@ static const struct FormChange sSilvallyFormChangeTable[] = { }; #endif +static const struct FormChange sXerneasFormChangeTable[] = { + {FORM_BATTLE_BEGIN, SPECIES_XERNEAS_ACTIVE, ITEM_NONE}, + {FORM_BATTLE_END, SPECIES_XERNEAS, ITEM_NONE}, + {FORM_CHANGE_END}, +}; + +static const struct FormChange sZacianFormChangeTable[] = { + {FORM_BATTLE_BEGIN, SPECIES_ZACIAN_CROWNED_SWORD, ITEM_RUSTED_SWORD}, + {FORM_BATTLE_END, SPECIES_ZACIAN, ITEM_RUSTED_SWORD}, + {FORM_CHANGE_END}, +}; + +static const struct FormChange sZamazentaFormChangeTable[] = { + {FORM_BATTLE_BEGIN, SPECIES_ZAMAZENTA_CROWNED_SHIELD, ITEM_RUSTED_SHIELD}, + {FORM_BATTLE_END, SPECIES_ZAMAZENTA, ITEM_RUSTED_SHIELD}, + {FORM_CHANGE_END}, +}; + #undef WHEN_LEARNED #undef WHEN_FORGOTTEN diff --git a/src/pokemon.c b/src/pokemon.c index 92bd923f08..06e75dbc3b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8237,13 +8237,13 @@ u8 GetFormIdFromFormSpeciesId(u16 formSpeciesId) return targetFormId; } -u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) +u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) { return GetFormChangeTargetSpeciesBoxMon(&mon->box, method, arg); } // Returns SPECIES_NONE if no form change is possible -u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg) +u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg) { u32 i; u16 targetSpecies = SPECIES_NONE; @@ -8264,6 +8264,8 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg switch (method) { case FORM_ITEM_HOLD: + case FORM_BATTLE_BEGIN: + case FORM_BATTLE_END: if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) targetSpecies = formChanges[i].targetSpecies; break; From bb290d5ab0f0e27466a71078a4f8b75f135863c4 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Thu, 1 Sep 2022 14:57:58 -0300 Subject: [PATCH 2/6] Updates -Removed the pointless param1 setting in sXerneasFormChangeTable -Updated the descriptions of Behemoth Blade and Behemoth Bash -Added a new parameter to the struct FormChange -Allowed FORM_BATTLE_BEGIN and FORM_BATTLE_END to replace a move through a new function called "TryToSetBattleFormChangeMoves". -Added missing calls to "CalculateMonStats". -Renamed BoxPokemon pointer in GetFormChangeTargetSpeciesBoxMon for consistency's sake -Optimized check inside UndoFormChange (even though the plan is to get rid of that func entirely.) Special thanks to Blecoutre who fixed my TryToSetBattleFormChangeMoves function. It just wasn't working correctly at all. --- include/pokemon.h | 5 ++- src/battle_main.c | 8 ++++ src/battle_util.c | 15 +++---- src/data/pokemon/form_change_tables.h | 16 ++++--- src/data/text/move_descriptions.h | 8 ++-- src/pokemon.c | 62 ++++++++++++++++++++++----- 6 files changed, 83 insertions(+), 31 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index c05628a598..9ebaa52a0d 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -366,11 +366,13 @@ struct Evolution u16 targetSpecies; }; -struct FormChange { +struct FormChange +{ u16 method; u16 targetSpecies; u16 param1; u16 param2; + u16 param3; }; #define NUM_UNOWN_FORMS 28 @@ -559,5 +561,6 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg); u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg); u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove); bool32 ShouldShowFemaleDifferences(u16 species, u32 personality); +void TryToSetBattleFormChangeMoves(struct Pokemon *mon); #endif // GUARD_POKEMON_H diff --git a/src/battle_main.c b/src/battle_main.c index f75a7ae80b..84af5ae748 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -578,11 +578,19 @@ static void CB2_InitBattleInternal(void) // Player's side targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_BEGIN, 0); if (targetSpecies != SPECIES_NONE) + { SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies); + CalculateMonStats(&gPlayerParty[i]); + TryToSetBattleFormChangeMoves(&gPlayerParty[i]); + } // Opponent's side targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_BEGIN, 0); if (targetSpecies != SPECIES_NONE) + { SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies); + CalculateMonStats(&gEnemyParty[i]); + TryToSetBattleFormChangeMoves(&gEnemyParty[i]); + } } gBattleCommunication[MULTIUSE_STATE] = 0; diff --git a/src/battle_util.c b/src/battle_util.c index dff9d71da5..c9b4435f4c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9624,17 +9624,12 @@ void UndoFormChange(u32 monId, u32 side, bool32 isSwitchingOut) } if (!isSwitchingOut) { - // Apply party-wide end-of-battle form changes - for (i = 0; i < PARTY_SIZE; i++) + targetSpecies = GetFormChangeTargetSpecies(&party[monId], FORM_BATTLE_END, 0); + if (targetSpecies != SPECIES_NONE) { - // Player's side - targetSpecies = GetFormChangeTargetSpecies(&gPlayerParty[i], FORM_BATTLE_END, 0); - if (targetSpecies != SPECIES_NONE) - SetMonData(&gPlayerParty[i], MON_DATA_SPECIES, &targetSpecies); - // Opponent's side - targetSpecies = GetFormChangeTargetSpecies(&gEnemyParty[i], FORM_BATTLE_END, 0); - if (targetSpecies != SPECIES_NONE) - SetMonData(&gEnemyParty[i], MON_DATA_SPECIES, &targetSpecies); + SetMonData(&party[monId], MON_DATA_SPECIES, &targetSpecies); + CalculateMonStats(&party[monId]); + TryToSetBattleFormChangeMoves(&party[monId]); } } } diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index be76cc9956..914ca6d994 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -37,10 +37,14 @@ FORM_ITEM_USE_TIME: FORM_BATTLE_BEGIN: Form change activates when the Pokémon is sent out at the beginning of a battle param1 = item to hold, optional + param2 = a move that will be replaced, optional + param3 = a new move to replace it with, optional FORM_BATTLE_END: Form change activates at the end of a battle param1 = item to hold, optional + param2 = a move that will be replaced, optional + param3 = a new move to replace it with, optional */ // FORM_MOVE param2 Arguments @@ -194,20 +198,20 @@ static const struct FormChange sSilvallyFormChangeTable[] = { #endif static const struct FormChange sXerneasFormChangeTable[] = { - {FORM_BATTLE_BEGIN, SPECIES_XERNEAS_ACTIVE, ITEM_NONE}, - {FORM_BATTLE_END, SPECIES_XERNEAS, ITEM_NONE}, + {FORM_BATTLE_BEGIN, SPECIES_XERNEAS_ACTIVE}, + {FORM_BATTLE_END, SPECIES_XERNEAS, }, {FORM_CHANGE_END}, }; static const struct FormChange sZacianFormChangeTable[] = { - {FORM_BATTLE_BEGIN, SPECIES_ZACIAN_CROWNED_SWORD, ITEM_RUSTED_SWORD}, - {FORM_BATTLE_END, SPECIES_ZACIAN, ITEM_RUSTED_SWORD}, + {FORM_BATTLE_BEGIN, SPECIES_ZACIAN_CROWNED_SWORD, ITEM_RUSTED_SWORD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BLADE}, + {FORM_BATTLE_END, SPECIES_ZACIAN, ITEM_RUSTED_SWORD, MOVE_BEHEMOTH_BLADE, MOVE_IRON_HEAD}, {FORM_CHANGE_END}, }; static const struct FormChange sZamazentaFormChangeTable[] = { - {FORM_BATTLE_BEGIN, SPECIES_ZAMAZENTA_CROWNED_SHIELD, ITEM_RUSTED_SHIELD}, - {FORM_BATTLE_END, SPECIES_ZAMAZENTA, ITEM_RUSTED_SHIELD}, + {FORM_BATTLE_BEGIN, SPECIES_ZAMAZENTA_CROWNED_SHIELD, ITEM_RUSTED_SHIELD, MOVE_IRON_HEAD, MOVE_BEHEMOTH_BASH}, + {FORM_BATTLE_END, SPECIES_ZAMAZENTA, ITEM_RUSTED_SHIELD, MOVE_BEHEMOTH_BASH, MOVE_IRON_HEAD}, {FORM_CHANGE_END}, }; diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h index 7d890b1d3d..0a1d385042 100644 --- a/src/data/text/move_descriptions.h +++ b/src/data/text/move_descriptions.h @@ -2791,12 +2791,12 @@ static const u8 sPyroBallDescription[] = _( "target. It may cause a burn."); static const u8 sBehemothBladeDescription[] = _( - "Strikes as a sword. It deals\n" - "2x damage to Dynamaxed foes."); + "Strikes as a sword. Deals 2x\n" + "damage to Dynamaxed foes."); static const u8 sBehemothBashDescription[] = _( - "Attacks as a shield. Deals\n" - "2x damage to Dynamaxed foes."); + "Attacks as a shield. Deals 2x\n" + "damage to Dynamaxed foes."); static const u8 sAuraWheelDescription[] = _( "Raises Speed to attack. The\n" diff --git a/src/pokemon.c b/src/pokemon.c index 06e75dbc3b..d1aa0abb07 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8243,19 +8243,19 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) } // Returns SPECIES_NONE if no form change is possible -u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg) +u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 arg) { - u32 i; + u32 i, j; u16 targetSpecies = SPECIES_NONE; - u16 species = GetBoxMonData(mon, MON_DATA_SPECIES, NULL); + u16 species = GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL); const struct FormChange *formChanges = gFormChangeTablePointers[species]; u16 heldItem; u32 ability; if (formChanges != NULL) { - heldItem = GetBoxMonData(mon, MON_DATA_HELD_ITEM, NULL); - ability = GetAbilityBySpecies(species, GetBoxMonData(mon, MON_DATA_ABILITY_NUM, NULL)); + heldItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM, NULL); + ability = GetAbilityBySpecies(species, GetBoxMonData(boxMon, MON_DATA_ABILITY_NUM, NULL)); for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++) { @@ -8264,8 +8264,6 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg switch (method) { case FORM_ITEM_HOLD: - case FORM_BATTLE_BEGIN: - case FORM_BATTLE_END: if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) targetSpecies = formChanges[i].targetSpecies; break; @@ -8274,7 +8272,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg targetSpecies = formChanges[i].targetSpecies; break; case FORM_MOVE: - if (BoxMonKnowsMove(mon, formChanges[i].param1) != formChanges[i].param2) + if (BoxMonKnowsMove(boxMon, formChanges[i].param1) != formChanges[i].param2) targetSpecies = formChanges[i].targetSpecies; break; case FORM_ITEM_HOLD_ABILITY: @@ -8299,6 +8297,10 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *mon, u16 method, u32 arg } } break; + case FORM_BATTLE_BEGIN: + case FORM_BATTLE_END: + if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) + targetSpecies = formChanges[i].targetSpecies; } } } @@ -8358,7 +8360,7 @@ void TrySpecialOverworldEvo(void) u8 i; u8 evoMethod = gSpecialVar_0x8000; u16 canStopEvo = gSpecialVar_0x8001; - u16 tryMultiple = gSpecialVar_0x8002; + u16 tryMultiple = gSpecialVar_0x8002; for (i = 0; i < PARTY_SIZE; i++) { @@ -8375,7 +8377,7 @@ void TrySpecialOverworldEvo(void) else gCB2_AfterEvolution = CB2_ReturnToField; return; - } + } } sTriedEvolving = 0; @@ -8386,3 +8388,43 @@ bool32 ShouldShowFemaleDifferences(u16 species, u32 personality) { return (gBaseStats[species].flags & FLAG_GENDER_DIFFERENCE) && GetGenderFromSpeciesAndPersonality(species, personality) == MON_FEMALE; } + +void TryToSetBattleFormChangeMoves(struct Pokemon *mon) +{ + int i, j; + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + const struct FormChange *formChanges = gFormChangeTablePointers[species]; + u8 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + + if (formChanges == NULL) + return; + + for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++) + { + if ((formChanges[i].method == FORM_BATTLE_BEGIN || formChanges[i].method == FORM_BATTLE_END) + && formChanges[i].param2 && formChanges[i].param3 && formChanges[i].targetSpecies == species) + { + u16 originalMove = formChanges[i].param2; + u16 newMove = formChanges[i].param3; + + for (j = 0; j < MAX_MON_MOVES; j++) + { + u16 currMove = GetMonData(mon, MON_DATA_MOVE1 + j, NULL); + u8 totalPp = gBattleMoves[currMove].pp; // Get current move's max PP + u8 currPp = GetMonData(mon, MON_DATA_PP1 + j, NULL); // Get current move's remaining PP + u8 diffPp = totalPp - currPp; // Current move's PP difference + u8 finalPp = gBattleMoves[newMove].pp - diffPp; // Apply the PP difference to the new move + + if (currMove == originalMove) + { + if (finalPp > gBattleMoves[newMove].pp) + finalPp = 0; + SetMonMoveSlot(mon, newMove, j); + SetMonData(mon, MON_DATA_PP1 + j, &finalPp); + } + } + SetMonData(mon, MON_DATA_PP_BONUSES, &ppBonuses); + break; + } + } +} From 7a0838a0f2c45cae4a418f9513266daa02237796 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 1 Sep 2022 14:03:37 -0400 Subject: [PATCH 3/6] Adjusted `GetFormChangeTargetSpeciesBoxMon` to allow having form changes of the same method in the same table --- src/data/pokemon/form_change_table_pointers.h | 12 ++--- src/data/pokemon/form_change_tables.h | 50 ++++--------------- src/pokemon.c | 4 +- 3 files changed, 19 insertions(+), 47 deletions(-) diff --git a/src/data/pokemon/form_change_table_pointers.h b/src/data/pokemon/form_change_table_pointers.h index 7bf249fcbe..85685e50ef 100644 --- a/src/data/pokemon/form_change_table_pointers.h +++ b/src/data/pokemon/form_change_table_pointers.h @@ -24,15 +24,15 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_ARCEUS_DARK] = sArceusFormChangeTable, [SPECIES_ARCEUS_FAIRY] = sArceusFormChangeTable, [SPECIES_TORNADUS] = sTornadusFormChangeTable, - [SPECIES_TORNADUS_THERIAN] = sTornadusTherianFormChangeTable, + [SPECIES_TORNADUS_THERIAN] = sTornadusFormChangeTable, [SPECIES_THUNDURUS] = sThundurusFormChangeTable, - [SPECIES_THUNDURUS_THERIAN] = sThundurusTherianFormChangeTable, + [SPECIES_THUNDURUS_THERIAN] = sThundurusFormChangeTable, [SPECIES_LANDORUS] = sLandorusFormChangeTable, - [SPECIES_LANDORUS_THERIAN] = sLandorusTherianFormChangeTable, + [SPECIES_LANDORUS_THERIAN] = sLandorusFormChangeTable, [SPECIES_ENAMORUS] = sEnamorusFormChangeTable, - [SPECIES_ENAMORUS_THERIAN] = sEnamorusTherianFormChangeTable, + [SPECIES_ENAMORUS_THERIAN] = sEnamorusFormChangeTable, [SPECIES_KELDEO] = sKeldeoFormChangeTable, - [SPECIES_KELDEO_RESOLUTE] = sKeldeoResoluteFormChangeTable, + [SPECIES_KELDEO_RESOLUTE] = sKeldeoFormChangeTable, [SPECIES_GENESECT] = sGenesectFormChangeTable, [SPECIES_GENESECT_DOUSE_DRIVE] = sGenesectFormChangeTable, [SPECIES_GENESECT_SHOCK_DRIVE] = sGenesectFormChangeTable, @@ -41,7 +41,7 @@ const struct FormChange *const gFormChangeTablePointers[NUM_SPECIES] = [SPECIES_XERNEAS] = sXerneasFormChangeTable, [SPECIES_XERNEAS_ACTIVE] = sXerneasFormChangeTable, [SPECIES_HOOPA] = sHoopaFormChangeTable, - [SPECIES_HOOPA_UNBOUND] = sHoopaUnboundFormChangeTable, + [SPECIES_HOOPA_UNBOUND] = sHoopaFormChangeTable, [SPECIES_ORICORIO] = sOricorioFormChangeTable, [SPECIES_ORICORIO_POM_POM] = sOricorioFormChangeTable, [SPECIES_ORICORIO_PAU] = sOricorioFormChangeTable, diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index ba24b14371..3a97f4efe6 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -1,8 +1,4 @@ /* -For cycling between forms with the same method and parameters but different target species (eg. Tornadus using the -Reveal Glass to change between its two forms), a separate form change table is required for each form. -Otherwise, only the last form change on the table will trigger. - FORM_ITEM_HOLD: Form change activates when the item is given to or taken from the selected Pokémon. param1 = item to hold @@ -64,7 +60,7 @@ static const struct FormChange sGiratinaFormChangeTable[] = { static const struct FormChange sShayminFormChangeTable[] = { {FORM_ITEM_USE_TIME, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA, DAY}, - {FORM_WITHDRAW, SPECIES_SHAYMIN}, + // {FORM_WITHDRAW, SPECIES_SHAYMIN}, {FORM_CHANGE_END}, }; @@ -109,51 +105,25 @@ static const struct FormChange sArceusFormChangeTable[] = { static const struct FormChange sTornadusFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_TORNADUS_THERIAN, ITEM_REVEAL_GLASS}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sTornadusTherianFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_TORNADUS, ITEM_REVEAL_GLASS}, {FORM_CHANGE_END}, }; static const struct FormChange sThundurusFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_THUNDURUS_THERIAN, ITEM_REVEAL_GLASS}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sThundurusTherianFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_THUNDURUS, ITEM_REVEAL_GLASS}, {FORM_CHANGE_END}, }; static const struct FormChange sLandorusFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_LANDORUS_THERIAN, ITEM_REVEAL_GLASS}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sLandorusTherianFormChangeTable[] = { {FORM_ITEM_USE, SPECIES_LANDORUS, ITEM_REVEAL_GLASS}, {FORM_CHANGE_END}, }; -static const struct FormChange sEnamorusFormChangeTable[] = { - {FORM_ITEM_USE, SPECIES_ENAMORUS, ITEM_REVEAL_GLASS}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sEnamorusTherianFormChangeTable[] = { - {FORM_ITEM_USE, SPECIES_ENAMORUS_THERIAN, ITEM_REVEAL_GLASS}, - {FORM_CHANGE_END}, -}; - static const struct FormChange sKeldeoFormChangeTable[] = { - {FORM_MOVE, SPECIES_KELDEO_RESOLUTE, MOVE_SECRET_SWORD, WHEN_LEARNED}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sKeldeoResoluteFormChangeTable[] = { - {FORM_MOVE, SPECIES_KELDEO, MOVE_SECRET_SWORD, WHEN_FORGOTTEN}, + // {FORM_MOVE, SPECIES_KELDEO_RESOLUTE, MOVE_SECRET_SWORD, WHEN_LEARNED}, + // {FORM_MOVE, SPECIES_KELDEO, MOVE_SECRET_SWORD, WHEN_FORGOTTEN}, {FORM_CHANGE_END}, }; @@ -167,12 +137,8 @@ static const struct FormChange sGenesectFormChangeTable[] = { }; static const struct FormChange sHoopaFormChangeTable[] = { - // {FORM_ITEM_USE, SPECIES_HOOPA_UNBOUND, ITEM_PRISON_BOTTLE, SPECIES_HOOPA}, - {FORM_CHANGE_END}, -}; - -static const struct FormChange sHoopaUnboundFormChangeTable[] = { - {FORM_WITHDRAW, SPECIES_HOOPA}, + {FORM_ITEM_USE, SPECIES_HOOPA_UNBOUND, ITEM_PRISON_BOTTLE, SPECIES_HOOPA}, + // {FORM_WITHDRAW, SPECIES_HOOPA}, {FORM_CHANGE_END}, }; @@ -225,5 +191,11 @@ static const struct FormChange sZamazentaFormChangeTable[] = { {FORM_CHANGE_END}, }; +static const struct FormChange sEnamorusFormChangeTable[] = { + {FORM_ITEM_USE, SPECIES_ENAMORUS, ITEM_REVEAL_GLASS}, + {FORM_ITEM_USE, SPECIES_ENAMORUS_THERIAN, ITEM_REVEAL_GLASS}, + {FORM_CHANGE_END}, +}; + #undef WHEN_LEARNED #undef WHEN_FORGOTTEN diff --git a/src/pokemon.c b/src/pokemon.c index f88f7dab2d..99a82ec130 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8277,7 +8277,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++) { - if (method == formChanges[i].method) + if (method == formChanges[i].method && species != formChanges[i].targetSpecies) { switch (method) { @@ -8324,7 +8324,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 } } - return species != targetSpecies ? targetSpecies : SPECIES_NONE; + return targetSpecies; } u16 MonTryLearningNewMoveEvolution(struct Pokemon *mon, bool8 firstMove) From f1c153e469be4040eb4fb7882c5893f571713fe2 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 6 Sep 2022 18:37:16 -0300 Subject: [PATCH 4/6] Merged FORM_ITEM_HOLD_ABILITY into FORM_ITEM_HOLD There was never a reason not to. --- include/constants/pokemon.h | 7 +- src/data/pokemon/form_change_tables.h | 115 +++++++++++++------------- src/party_menu.c | 5 +- src/pokemon.c | 8 +- src/pokemon_storage_system.c | 4 +- src/script_pokemon_util.c | 4 +- 6 files changed, 64 insertions(+), 79 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index c7101cfaca..6912cfe6bb 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -322,10 +322,9 @@ #define FORM_ITEM_USE 2 #define FORM_MOVE 3 #define FORM_WITHDRAW 4 -#define FORM_ITEM_HOLD_ABILITY 5 -#define FORM_ITEM_USE_TIME 6 -#define FORM_BATTLE_BEGIN 7 -#define FORM_BATTLE_END 8 +#define FORM_ITEM_USE_TIME 5 +#define FORM_BATTLE_BEGIN 6 +#define FORM_BATTLE_END 7 #define NUM_MALE_LINK_FACILITY_CLASSES 8 #define NUM_FEMALE_LINK_FACILITY_CLASSES 8 diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 3a97f4efe6..f24fe4d850 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -1,7 +1,10 @@ /* FORM_ITEM_HOLD: Form change activates when the item is given to or taken from the selected Pokémon. + Alternatively, form change activates when the item is used on the selected Pokémon + that has a particular ability. param1 = item to hold + param2 = ability to check for, optional FORM_ITEM_USE: Form change activates when the item is used on the selected Pokémon. @@ -17,12 +20,6 @@ FORM_WITHDRAW: Form change activates when the Pokémon is withdrawn from the PC or Daycare. no parameters -FORM_ITEM_HOLD_ABILITY: - Form change activates when the item is used on the selected Pokémon that has - a particular ability. - param1 = item to use - param2 = ability to check for - FORM_ITEM_USE_TIME: Form change activates when the item is used on the selected Pokémon at the appropriate time of day. @@ -65,41 +62,41 @@ static const struct FormChange sShayminFormChangeTable[] = { }; static const struct FormChange sArceusFormChangeTable[] = { - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS, ITEM_NONE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FIGHTING, ITEM_FIST_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FIGHTING, ITEM_FIGHTINIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FLYING, ITEM_SKY_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FLYING, ITEM_FLYINIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_POISON, ITEM_TOXIC_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_POISON, ITEM_POISONIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ROCK, ITEM_STONE_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ROCK, ITEM_ROCKIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GROUND, ITEM_EARTH_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GROUND, ITEM_GROUNDIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_BUG, ITEM_INSECT_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_BUG, ITEM_BUGINIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GHOST, ITEM_SPOOKY_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GHOST, ITEM_GHOSTIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_STEEL, ITEM_IRON_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_STEEL, ITEM_STEELIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FIRE, ITEM_FLAME_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FIRE, ITEM_FIRIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_WATER, ITEM_SPLASH_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_WATER, ITEM_WATERIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GRASS, ITEM_MEADOW_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_GRASS, ITEM_GRASSIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ELECTRIC, ITEM_ZAP_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ELECTRIC, ITEM_ELECTRIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_PSYCHIC, ITEM_MIND_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_PSYCHIC, ITEM_PSYCHIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ICE, ITEM_ICICLE_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_ICE, ITEM_ICIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_DRAGON, ITEM_DRACO_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_DRAGON, ITEM_DRAGONIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_DARK, ITEM_DREAD_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_DARK, ITEM_DARKINIUM_Z, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FAIRY, ITEM_PIXIE_PLATE, ABILITY_MULTITYPE}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_ARCEUS_FAIRY, ITEM_FAIRIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS, ITEM_NONE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FIGHTING, ITEM_FIST_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FIGHTING, ITEM_FIGHTINIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FLYING, ITEM_SKY_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FLYING, ITEM_FLYINIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_POISON, ITEM_TOXIC_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_POISON, ITEM_POISONIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ROCK, ITEM_STONE_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ROCK, ITEM_ROCKIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GROUND, ITEM_EARTH_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GROUND, ITEM_GROUNDIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_BUG, ITEM_INSECT_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_BUG, ITEM_BUGINIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GHOST, ITEM_SPOOKY_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GHOST, ITEM_GHOSTIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_STEEL, ITEM_IRON_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_STEEL, ITEM_STEELIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FIRE, ITEM_FLAME_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FIRE, ITEM_FIRIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_WATER, ITEM_SPLASH_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_WATER, ITEM_WATERIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GRASS, ITEM_MEADOW_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_GRASS, ITEM_GRASSIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ELECTRIC, ITEM_ZAP_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ELECTRIC, ITEM_ELECTRIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_PSYCHIC, ITEM_MIND_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_PSYCHIC, ITEM_PSYCHIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ICE, ITEM_ICICLE_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_ICE, ITEM_ICIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_DRAGON, ITEM_DRACO_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_DRAGON, ITEM_DRAGONIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_DARK, ITEM_DREAD_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_DARK, ITEM_DARKINIUM_Z, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FAIRY, ITEM_PIXIE_PLATE, ABILITY_MULTITYPE}, + {FORM_ITEM_HOLD, SPECIES_ARCEUS_FAIRY, ITEM_FAIRIUM_Z, ABILITY_MULTITYPE}, {FORM_CHANGE_END}, }; @@ -151,24 +148,24 @@ static const struct FormChange sOricorioFormChangeTable[] = { }; static const struct FormChange sSilvallyFormChangeTable[] = { - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY, ITEM_NONE, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_FIGHTING, ITEM_FIGHTING_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_FLYING, ITEM_FLYING_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_POISON, ITEM_POISON_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_GROUND, ITEM_GROUND_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_ROCK, ITEM_ROCK_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_BUG, ITEM_BUG_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_GHOST, ITEM_GHOST_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_STEEL, ITEM_STEEL_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_FIRE, ITEM_FIRE_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_WATER, ITEM_WATER_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_GRASS, ITEM_GRASS_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_ELECTRIC, ITEM_ELECTRIC_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_PSYCHIC, ITEM_PSYCHIC_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_ICE, ITEM_ICE_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_DRAGON, ITEM_DRAGON_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_DARK, ITEM_DARK_MEMORY, ABILITY_RKS_SYSTEM}, - {FORM_ITEM_HOLD_ABILITY, SPECIES_SILVALLY_FAIRY, ITEM_FAIRY_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY, ITEM_NONE, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_FIGHTING, ITEM_FIGHTING_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_FLYING, ITEM_FLYING_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_POISON, ITEM_POISON_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_GROUND, ITEM_GROUND_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_ROCK, ITEM_ROCK_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_BUG, ITEM_BUG_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_GHOST, ITEM_GHOST_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_STEEL, ITEM_STEEL_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_FIRE, ITEM_FIRE_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_WATER, ITEM_WATER_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_GRASS, ITEM_GRASS_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_ELECTRIC, ITEM_ELECTRIC_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_PSYCHIC, ITEM_PSYCHIC_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_ICE, ITEM_ICE_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_DRAGON, ITEM_DRAGON_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_DARK, ITEM_DARK_MEMORY, ABILITY_RKS_SYSTEM}, + {FORM_ITEM_HOLD, SPECIES_SILVALLY_FAIRY, ITEM_FAIRY_MEMORY, ABILITY_RKS_SYSTEM}, {FORM_CHANGE_END}, }; #endif diff --git a/src/party_menu.c b/src/party_menu.c index 00224f6bd6..03e4a5826d 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5596,10 +5596,7 @@ void ItemUseCB_FormChange_ConsumedOnUse(u8 taskId, TaskFunc task) } void TryItemHoldFormChange(struct Pokemon *mon) { - u16 species = GetMonData(mon, MON_DATA_SPECIES); - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_HOLD_ABILITY, 0); - if (targetSpecies == SPECIES_NONE) - targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_HOLD, 0); + u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_HOLD, 0); if (targetSpecies != SPECIES_NONE) { PlayCry_NormalNoDucking(targetSpecies, 0, CRY_VOLUME_RS, CRY_VOLUME_RS); diff --git a/src/pokemon.c b/src/pokemon.c index 99a82ec130..4fbce67d1e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8282,7 +8282,8 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 switch (method) { case FORM_ITEM_HOLD: - if (heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) + if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) + || ability == formChanges[i].param2) targetSpecies = formChanges[i].targetSpecies; break; case FORM_ITEM_USE: @@ -8293,11 +8294,6 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 if (BoxMonKnowsMove(boxMon, formChanges[i].param1) != formChanges[i].param2) targetSpecies = formChanges[i].targetSpecies; break; - case FORM_ITEM_HOLD_ABILITY: - if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) - && ability == formChanges[i].param2) - targetSpecies = formChanges[i].targetSpecies; - break; case FORM_ITEM_USE_TIME: RtcCalcLocalTime(); if (arg == formChanges[i].param1) diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index d3f5d433f4..fba5bbcda9 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -6893,9 +6893,7 @@ static void ReshowDisplayMon(void) void SetMonFormPSS(struct BoxPokemon *boxMon) { - u16 targetSpecies = GetFormChangeTargetSpeciesBoxMon(boxMon, FORM_ITEM_HOLD_ABILITY, 0); - if (targetSpecies == SPECIES_NONE) - targetSpecies = GetFormChangeTargetSpeciesBoxMon(boxMon, FORM_ITEM_HOLD, 0); + u16 targetSpecies = GetFormChangeTargetSpeciesBoxMon(boxMon, FORM_ITEM_HOLD, 0); if (targetSpecies != SPECIES_NONE) { SetBoxMonData(boxMon, MON_DATA_SPECIES, &targetSpecies); diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index 8a9e65ff8f..e33c8ffcad 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -72,9 +72,7 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); // In case a mon with a form changing item is given. Eg: SPECIES_ARCEUS with ITEM_SPLASH_PLATE will transform into SPECIES_ARCEUS_WATER upon gifted. - targetSpecies = GetFormChangeTargetSpecies(&mon, FORM_ITEM_HOLD_ABILITY, 0); - if (targetSpecies == SPECIES_NONE) - targetSpecies = GetFormChangeTargetSpecies(&mon, FORM_ITEM_HOLD, 0); + targetSpecies = GetFormChangeTargetSpecies(&mon, FORM_ITEM_HOLD, 0); if (targetSpecies != SPECIES_NONE) { SetMonData(&mon, MON_DATA_SPECIES, &targetSpecies); From a7a1ab9aeb5b965c31046601a874a2e3cebab286 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Tue, 6 Sep 2022 18:37:16 -0300 Subject: [PATCH 5/6] Merged FORM_ITEM_HOLD_ABILITY into FORM_ITEM_HOLD There was never a reason not to. --- src/data/pokemon/form_change_tables.h | 6 +++--- src/pokemon.c | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index f24fe4d850..ddcb4d9cbd 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -1,8 +1,8 @@ /* FORM_ITEM_HOLD: - Form change activates when the item is given to or taken from the selected Pokémon. - Alternatively, form change activates when the item is used on the selected Pokémon - that has a particular ability. + Form change activates when the specified item is given to or taken from the selected Pokémon. + Alternatively, form change activates when the specified item is is given to or taken from + the selected Pokémon that has a particular ability. param1 = item to hold param2 = ability to check for, optional diff --git a/src/pokemon.c b/src/pokemon.c index 4fbce67d1e..63b3dae9dc 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8285,6 +8285,8 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) || ability == formChanges[i].param2) targetSpecies = formChanges[i].targetSpecies; + if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) && ability == formChanges[i].param2) + targetSpecies = formChanges[i].targetSpecies; break; case FORM_ITEM_USE: if (arg == formChanges[i].param1) From e8832a265523d52149849f74298202aa89aed856 Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Fri, 9 Sep 2022 14:56:12 -0300 Subject: [PATCH 6/6] Updated FORM_ITEM_HOLD check in GetFormChangeTargetSpeciesBoxMon --- src/pokemon.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 63b3dae9dc..4dcec70b06 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8283,9 +8283,7 @@ u16 GetFormChangeTargetSpeciesBoxMon(struct BoxPokemon *boxMon, u16 method, u32 { case FORM_ITEM_HOLD: if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) - || ability == formChanges[i].param2) - targetSpecies = formChanges[i].targetSpecies; - if ((heldItem == formChanges[i].param1 || formChanges[i].param1 == ITEM_NONE) && ability == formChanges[i].param2) + && (ability == formChanges[i].param2 || formChanges[i].param2 == ABILITY_NONE)) targetSpecies = formChanges[i].targetSpecies; break; case FORM_ITEM_USE: