Fixed Castform

This commit is contained in:
Eduardo Quezada 2023-06-16 22:57:00 -04:00
parent db5e3342ac
commit ab6c7a1df0
3 changed files with 41 additions and 18 deletions

View File

@ -53,6 +53,7 @@ enum FollowerTransformTypes
TRANSFORM_TYPE_NONE,
TRANSFORM_TYPE_PERMANENT,
TRANSFORM_TYPE_RANDOM_WILD,
TRANSFORM_TYPE_WEATHER,
};
#define FIGURE_8_LENGTH 72

View File

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

View File

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