From 234f3290c34b78e64b8e821487849361d617701d Mon Sep 17 00:00:00 2001 From: LOuroboros Date: Sat, 25 Sep 2021 20:16:30 -0300 Subject: [PATCH] Added a day time exclusive equivalent to `FORM_USE_ITEM` Primarily for Shaymin, since it can only change its form with the Gracidea during the day. Special thanks to AsparagusEduardo. --- include/constants/pokemon.h | 1 + src/data/pokemon/form_change_tables.h | 6 +++++- src/party_menu.c | 4 +++- src/pokemon.c | 14 ++++++++++++-- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 5fc78df332..edec3a9db3 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -354,6 +354,7 @@ #define FORM_ITEM_USE 2 #define FORM_MOVE 3 #define FORM_WITHDRAW 4 +#define FORM_ITEM_USE_DAY 5 // Evolution 'modes,' for GetEvolutionTargetSpecies #define EVO_MODE_NORMAL 0 diff --git a/src/data/pokemon/form_change_tables.h b/src/data/pokemon/form_change_tables.h index 737a05ee87..f58b69b547 100644 --- a/src/data/pokemon/form_change_tables.h +++ b/src/data/pokemon/form_change_tables.h @@ -17,6 +17,10 @@ FORM_MOVE: FORM_WITHDRAW: Form change activates when the Pokemon is withdrawn from the PC or Daycare. no parameters + +FORM_ITEM_USE_DAY: + Same as FORM_ITEM_USE, but only works during day time. + Used by Shaymin's Gracidea-based form change. */ #define WHEN_LEARNED FALSE @@ -28,7 +32,7 @@ static const struct FormChange sGiratinaFormChangeTable[] = { }; static const struct FormChange sShayminFormChangeTable[] = { - {FORM_ITEM_USE, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA}, + {FORM_ITEM_USE_DAY, SPECIES_SHAYMIN_SKY, ITEM_GRACIDEA}, {FORM_CHANGE_END}, }; diff --git a/src/party_menu.c b/src/party_menu.c index a88e07be5e..46c5283024 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5171,7 +5171,9 @@ bool32 TryItemUseFormChange(u8 taskId, TaskFunc task) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); - u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_USE, gSpecialVar_ItemId); + u16 targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_USE_DAY, gSpecialVar_ItemId); + if (targetSpecies == SPECIES_NONE) + targetSpecies = GetFormChangeTargetSpecies(mon, FORM_ITEM_USE, gSpecialVar_ItemId); if (targetSpecies != SPECIES_NONE) { gPartyMenuUseExitCallback = TRUE; diff --git a/src/pokemon.c b/src/pokemon.c index c5bb10d70c..bc04c42f9c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -8056,16 +8056,20 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) u16 targetSpecies = SPECIES_NONE; u16 originalSpecies = GetMonData(mon, MON_DATA_SPECIES, NULL); const struct FormChange *formChanges = gFormChangeTablePointers[originalSpecies]; + if (formChanges == NULL) return SPECIES_NONE; - for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++) { - if (method == formChanges[i].method) { + for (i = 0; formChanges[i].method != FORM_CHANGE_END; i++) + { + if (method == formChanges[i].method) + { u32 ability = GetAbilityBySpecies(originalSpecies, GetMonData(mon, MON_DATA_ABILITY_NUM, NULL)); switch (method) { case FORM_ITEM_HOLD: if (GetMonData(mon, MON_DATA_HELD_ITEM, NULL) == formChanges[i].param1 && (ability == formChanges[i].param2 || formChanges[i].param2 == ABILITY_NONE)) + targetSpecies = formChanges[i].targetSpecies; break; case FORM_ITEM_USE: if (arg == formChanges[i].param1 && (ability == formChanges[i].param2 || formChanges[i].param2 == ABILITY_NONE)) @@ -8075,6 +8079,12 @@ u16 GetFormChangeTargetSpecies(struct Pokemon *mon, u16 method, u32 arg) if (MonKnowsMove(mon, formChanges[i].param1) != formChanges[i].param2) targetSpecies = formChanges[i].targetSpecies; break; + case FORM_ITEM_USE_DAY: + RtcCalcLocalTime(); + if (arg == formChanges[i].param1 && (ability == formChanges[i].param2 || formChanges[i].param2 == ABILITY_NONE) + && (gLocalTime.hours >= 12 && gLocalTime.hours < 24)) + targetSpecies = formChanges[i].targetSpecies; + break; default: targetSpecies = formChanges[i].targetSpecies; break;