diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 2336955bb3..3edfd36ecb 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -53,6 +53,7 @@ enum FollowerTransformTypes TRANSFORM_TYPE_NONE, TRANSFORM_TYPE_PERMANENT, TRANSFORM_TYPE_RANDOM_WILD, + TRANSFORM_TYPE_WEATHER, }; #define FIGURE_8_LENGTH 72 diff --git a/src/data/object_events/object_event_graphics_info_followers.h b/src/data/object_events/object_event_graphics_info_followers.h index 851dfbe889..f8c4ca1bfe 100644 --- a/src/data/object_events/object_event_graphics_info_followers.h +++ b/src/data/object_events/object_event_graphics_info_followers.h @@ -378,6 +378,9 @@ const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { [SPECIES_FEEBAS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SPOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Feebas, gDummySpriteAffineAnimTable}, [SPECIES_MILOTIC] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_SLITHER, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Milotic, gDummySpriteAffineAnimTable}, [SPECIES_CASTFORM] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, + [SPECIES_CASTFORM_SUNNY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, + [SPECIES_CASTFORM_RAINY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, + [SPECIES_CASTFORM_SNOWY] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, [SPECIES_KECLEON] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Kecleon, gDummySpriteAffineAnimTable}, [SPECIES_SHUPPET] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Shuppet, gDummySpriteAffineAnimTable}, [SPECIES_BANETTE] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Banette, gDummySpriteAffineAnimTable}, @@ -415,10 +418,3 @@ const struct ObjectEventGraphicsInfo gPokemonObjectGraphics[] = { [SPECIES_DEOXYS] = {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Deoxys, gDummySpriteAffineAnimTable}, }; -// Normal, sunny, rainy, snowy -const struct ObjectEventGraphicsInfo gCastformObjectGraphics[] = { - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_Castform, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSunny, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformRainy, gDummySpriteAffineAnimTable}, - {0xFFFF, OBJ_EVENT_PAL_TAG_DYNAMIC, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Following, sPicTable_CastformSnowy, gDummySpriteAffineAnimTable}, -}; diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 14afcf1215..497874e944 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1732,9 +1732,6 @@ static const struct ObjectEventGraphicsInfo * SpeciesToGraphicsInfo(u16 species, form %= NUM_UNOWN_FORMS; graphicsInfo = &gPokemonObjectGraphics[form ? SPECIES_UNOWN_B + form - 1 : species]; break; - case SPECIES_CASTFORM: // Sunny, rainy, snowy forms stored separately - graphicsInfo = &gCastformObjectGraphics[form % NUM_CASTFORM_FORMS]; - break; default: graphicsInfo = &gPokemonObjectGraphics[species]; break; @@ -1806,7 +1803,7 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) { } } -// Like CastformDataTypeChange, but for overworld weather +// Like vanilla's CastformDataTypeChange, but for overworld weather static u8 GetOverworldCastformForm(void) { switch (GetCurrentWeather()) { @@ -1823,6 +1820,23 @@ static u8 GetOverworldCastformForm(void) { return CASTFORM_NORMAL; } +static u16 GetOverworldCastformSpecies(void) +{ + switch(GetOverworldCastformForm()) + { + case CASTFORM_FIRE: + return SPECIES_CASTFORM_SUNNY; + break; + case CASTFORM_WATER: + return SPECIES_CASTFORM_RAINY; + break; + case CASTFORM_ICE: + return SPECIES_CASTFORM_SNOWY; + break; + } + return SPECIES_CASTFORM; +} + static bool8 GetMonInfo(struct Pokemon * mon, u16 *species, u8 *form, u8 *shiny) { if (!mon) { *species = SPECIES_NONE; @@ -1839,7 +1853,7 @@ static bool8 GetMonInfo(struct Pokemon * mon, u16 *species, u8 *form, u8 *shiny) *form = GET_UNOWN_LETTER(mon->box.personality); break; case SPECIES_CASTFORM: // form is based on overworld weather - *form = GetOverworldCastformForm(); + *species = GetOverworldCastformSpecies(); break; } return TRUE; @@ -4909,13 +4923,15 @@ static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct static bool8 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u32 multi; - if (OW_SPECIES(objectEvent) == SPECIES_CASTFORM && OW_FORM(objectEvent) != (multi = GetOverworldCastformForm())) { - sprite->data[7] = TRANSFORM_TYPE_PERMANENT << 8; - objectEvent->graphicsId &= OBJ_EVENT_GFX_SPECIES_MASK; - objectEvent->graphicsId |= multi << OBJ_EVENT_GFX_SPECIES_BITS; + if (GET_BASE_SPECIES_ID(OW_SPECIES(objectEvent)) == SPECIES_CASTFORM + && OW_SPECIES(objectEvent) != GetOverworldCastformSpecies()) + { + sprite->data[7] = TRANSFORM_TYPE_WEATHER << 8; return TRUE; - } else if ((gRngValue >> 16) < 18 && GetLocalWildMon(FALSE) - && (OW_SPECIES(objectEvent) == SPECIES_MEW || OW_SPECIES(objectEvent) == SPECIES_DITTO)) { + } + else if ((gRngValue >> 16) < 18 && GetLocalWildMon(FALSE) + && (OW_SPECIES(objectEvent) == SPECIES_MEW || OW_SPECIES(objectEvent) == SPECIES_DITTO)) + { sprite->data[7] = TRANSFORM_TYPE_RANDOM_WILD << 8; PlaySE(SE_M_MINIMIZE); return TRUE; @@ -4944,6 +4960,16 @@ static bool8 UpdateFollowerTransformEffect(struct ObjectEvent *objectEvent, stru case TRANSFORM_TYPE_PERMANENT: RefreshFollowerGraphics(objectEvent); break; + case TRANSFORM_TYPE_WEATHER: + multi = objectEvent->graphicsId; + objectEvent->graphicsId = GetOverworldCastformSpecies(); + if (!objectEvent->graphicsId) { + objectEvent->graphicsId = multi; + break; + } + objectEvent->graphicsId += OBJ_EVENT_GFX_MON_BASE; + RefreshFollowerGraphics(objectEvent); + break; case TRANSFORM_TYPE_RANDOM_WILD: multi = objectEvent->graphicsId; objectEvent->graphicsId = GetLocalWildMon(FALSE);