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.
This commit is contained in:
LOuroboros 2021-09-25 20:16:30 -03:00
parent 082dd1cb23
commit 234f3290c3
4 changed files with 21 additions and 4 deletions

View file

@ -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

View file

@ -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},
};

View file

@ -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;

View file

@ -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;