From 01f73f54e1567e4045ed8664306eddb82f3aa0b0 Mon Sep 17 00:00:00 2001
From: Ariel A <24759293+aarant@users.noreply.github.com>
Date: Tue, 17 May 2022 00:54:08 -0400
Subject: [PATCH] Added follower transform effect and Castform forms. Credit:
larryturbo Castform forms from
https://www.deviantart.com/larryturbo/art/351-Castform-Froms-830190053
---
.../pics/pokemon/castform_rainy.png | Bin 0 -> 8049 bytes
.../pics/pokemon/castform_snowy.png | Bin 0 -> 8615 bytes
.../pics/pokemon/castform_sunny.png | Bin 0 -> 8332 bytes
.../castform/anim_front_sunny_form.png | Bin 656 -> 11155 bytes
.../pokemon/castform/normal_sunny_form.pal | 2 +-
include/event_object_movement.h | 7 +
spritesheet_rules.mk | 9 +
.../object_events/object_event_graphics.h | 6 +
.../object_event_graphics_info_followers.h | 8 +
.../object_events/object_event_pic_tables.h | 24 +++
src/event_object_movement.c | 156 ++++++++++++++++--
src/field_effect.c | 6 +-
src/field_screen_effect.c | 6 +-
13 files changed, 202 insertions(+), 22 deletions(-)
create mode 100644 graphics/object_events/pics/pokemon/castform_rainy.png
create mode 100644 graphics/object_events/pics/pokemon/castform_snowy.png
create mode 100644 graphics/object_events/pics/pokemon/castform_sunny.png
diff --git a/graphics/object_events/pics/pokemon/castform_rainy.png b/graphics/object_events/pics/pokemon/castform_rainy.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2d279c212019346f1fb668152aa9b3c87506e4c
GIT binary patch
literal 8049
zcmeHLXH-*Lx1~yxjz}j21r!2FAcRDE6A+LpO_7iU2oMrTqy%ZwkuD;rG^K-xh;#(0
zqV#6LLN9^^rHaA}=)K>)<9&bb81MbN8RI19tUcFUd(FM}9%m)i%=9!ns}L&<4Gp`Y
zfvyGhx0QMU80e|rH8t)vRQoN8l`Yu<
XCC~X>p@_yx(=?
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
literal 0
HcmV?d00001
diff --git a/graphics/object_events/pics/pokemon/castform_snowy.png b/graphics/object_events/pics/pokemon/castform_snowy.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cf4ca0026a998fe7aaf0a0733a1cb4cb82fddde
GIT binary patch
literal 8615
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
literal 0
HcmV?d00001
diff --git a/graphics/pokemon/castform/anim_front_sunny_form.png b/graphics/pokemon/castform/anim_front_sunny_form.png
index 7e14f9892e79d668cfb1f273db8ebe363c6c69a1..399e6eeb8698be276778e05ba55f140ccdaedde4 100644
GIT binary patch
literal 11155
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
delta 607
zcmV-l0-*hqSC9peBNzZMP)t-s#l@6jF)7VjO743~|C~Vp005IADIR|WSg|4i0004W
zQchCmVCE7JqQGckM)_sVeO
z$w5pP7xlFthOc=A7y@8|_tED_^nBBpge#dC@P7a?DxZlw5BVVH{g)(wJ1BC_^Mbz(
zdPGPZlz5Nzi{jlS0>mtzGjVnq@WIbv5cJ?hbCxU?=Rt5b99ls5<^AC#*%)R&g2MVi
zhR54jr#pq&c@ck9%GjoPQl7sPwT%(*w35a?-5t#K1*(&2F1!O`UjSn2VjO1&%KG@f
z8T;~q06LH;rM}4t+;vLAcTRrET2y(f^=(Z|A8G%@nA;Nl^0)rp25fa%mRc`vNMdbn
zkg&pE6tOmIW3|;QqvuqMxwRJtUA=715ywyii-lg2zT-PQ+Shu!rQh2gHsBn;7Toam.paletteNum);
sprite->inUse = TRUE;
sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny);
- }
+ } else if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog
+ UpdateSpritePaletteWithWeather(gSprites[objEvent->spriteId].oam.paletteNum);
+}
+
+// Like FollowerSetGraphics, but does not reposition sprite; intended to be used for mid-movement form changes, etc.
+// TODO: Reposition sprite if size changes
+static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) {
+ u16 species = objEvent->extra.mon.species;
+ u8 form = objEvent->extra.mon.form;
+ u8 shiny = objEvent->extra.mon.shiny;
+ const struct ObjectEventGraphicsInfo *graphicsInfo = SpeciesToGraphicsInfo(species, form);
+ struct Sprite *sprite = &gSprites[objEvent->spriteId];
+ u8 i = FindObjectEventPaletteIndexByTag(graphicsInfo->paletteTag);
+
+ sprite->oam.shape = graphicsInfo->oam->shape;
+ sprite->oam.size = graphicsInfo->oam->size;
+ sprite->images = graphicsInfo->images;
+ sprite->anims = graphicsInfo->anims;
+ sprite->subspriteTables = graphicsInfo->subspriteTables;
+ objEvent->inanimate = graphicsInfo->inanimate;
+ sprite->centerToCornerVecX = -(graphicsInfo->width >> 1);
+ sprite->centerToCornerVecY = -(graphicsInfo->height >> 1);
+
+ if (graphicsInfo->paletteTag == OBJ_EVENT_PAL_TAG_DYNAMIC) {
+ sprite->inUse = FALSE;
+ FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum);
+ sprite->inUse = TRUE;
+ sprite->oam.paletteNum = LoadDynamicFollowerPalette(species, form, shiny);
+ } else if (i != 0xFF) {
+ UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite);
+ if (gWeatherPtr->currWeather != WEATHER_FOG_HORIZONTAL) // don't want to weather blend in fog
+ UpdateSpritePaletteWithWeather(sprite->oam.paletteNum);
+ }
+}
+
+// Like CastformDataTypeChange, but for overworld weather
+static u8 GetOverworldCastformForm(void) {
+ switch (GetCurrentWeather())
+ {
+ case WEATHER_SUNNY_CLOUDS:
+ case WEATHER_DROUGHT:
+ return CASTFORM_FIRE;
+ case WEATHER_RAIN:
+ case WEATHER_RAIN_THUNDERSTORM:
+ case WEATHER_DOWNPOUR:
+ return CASTFORM_WATER;
+ case WEATHER_SNOW:
+ return CASTFORM_ICE;
+ }
+ return CASTFORM_NORMAL;
}
// Retrieve graphic information about the following pokemon, if any
@@ -1753,7 +1813,16 @@ static bool8 GetFollowerInfo(u16 *species, u8 *form, u8 *shiny) {
}
*species = GetMonData(mon, MON_DATA_SPECIES);
*shiny = IsMonShiny(mon);
- *form = *species == SPECIES_UNOWN ? GET_UNOWN_LETTER(mon->box.personality) : 0;
+ *form = 0; // default
+ switch (*species)
+ {
+ case SPECIES_UNOWN:
+ *form = GET_UNOWN_LETTER(mon->box.personality);
+ break;
+ case SPECIES_CASTFORM: // form is based on overworld weather
+ *form = GetOverworldCastformForm();
+ break;
+ }
return TRUE;
}
@@ -1764,7 +1833,7 @@ void UpdateFollowingPokemon(void) { // Update following pokemon if any
bool8 shiny;
u8 form;
// Avoid spawning large (64x64) follower pokemon inside buildings
- if (GetFollowerInfo(&species, &form, &shiny) && !(gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->width == 64)) {
+ if (GetFollowerInfo(&species, &form, &shiny) && !(gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->height == 64)) {
if (objEvent == NULL) { // Spawn follower
struct ObjectEventTemplate template = {
.localId = OBJ_EVENT_ID_FOLLOWER,
@@ -2242,13 +2311,7 @@ static u8 UpdateSpritePalette(const struct SpritePalette * spritePalette, struct
sprite->inUse = FALSE;
FieldEffectFreePaletteIfUnused(sprite->oam.paletteNum);
sprite->inUse = TRUE;
- if (IndexOfSpritePaletteTag(spritePalette->tag) == 0xFF) {
- sprite->oam.paletteNum = LoadSpritePalette(spritePalette);
- } else {
- sprite->oam.paletteNum = LoadSpritePalette(spritePalette);
- }
-
- return sprite->oam.paletteNum;
+ return sprite->oam.paletteNum = LoadSpritePalette(spritePalette);
}
// Find and update based on template's paletteTag
@@ -4803,6 +4866,73 @@ bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *objectEvent, struct Sprit
return TRUE;
}
+static bool8 EndFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
+ if (!sprite)
+ return FALSE;
+ SetGpuReg(REG_OFFSET_MOSAIC, 0);
+ if (!sprite->data[7])
+ return FALSE;
+ sprite->oam.mosaic = FALSE;
+ sprite->data[7] = 0;
+ return FALSE;
+}
+
+static bool8 TryStartFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
+ u32 multi;
+ if (objectEvent->extra.mon.species == SPECIES_CASTFORM && objectEvent->extra.mon.form != (multi = GetOverworldCastformForm())) {
+ sprite->data[7] = TRANSFORM_TYPE_PERMANENT << 8;
+ objectEvent->extra.mon.form = multi;
+ return TRUE;
+ } else if ((gRngValue >> 16) < 18 && GetLocalWildMon(FALSE)
+ && (objectEvent->extra.mon.species == SPECIES_MEW || objectEvent->extra.mon.species == SPECIES_DITTO)) {
+ sprite->data[7] = TRANSFORM_TYPE_RANDOM_WILD << 8;
+ PlaySE(SE_M_MINIMIZE);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool8 UpdateFollowerTransformEffect(struct ObjectEvent *objectEvent, struct Sprite *sprite) {
+ u8 type = sprite->data[7] >> 8;
+ u8 frames = sprite->data[7] & 0xFF;
+ u8 stretch;
+ u32 multi;
+ if (!type)
+ return TryStartFollowerTransformEffect(objectEvent, sprite);
+ sprite->oam.mosaic = TRUE;
+ if (frames < 8)
+ stretch = frames >> 1;
+ else if (frames < 16)
+ stretch = (16 - frames) >> 1;
+ else {
+ return EndFollowerTransformEffect(objectEvent, sprite);
+ }
+ if (frames == 8) {
+ switch (type)
+ {
+ case TRANSFORM_TYPE_PERMANENT:
+ RefreshFollowerGraphics(objectEvent);
+ break;
+ case TRANSFORM_TYPE_RANDOM_WILD:
+ multi = objectEvent->extra.asU16;
+ objectEvent->extra.mon.species = GetLocalWildMon(FALSE);
+ if (!objectEvent->extra.mon.species) {
+ objectEvent->extra.asU16 = multi;
+ break;
+ }
+ objectEvent->extra.mon.form = 0;
+ RefreshFollowerGraphics(objectEvent);
+ objectEvent->extra.asU16 = multi;
+ break;
+ }
+ }
+
+ SetGpuReg(REG_OFFSET_MOSAIC, (stretch << 12) | (stretch << 8));
+ frames++;
+ sprite->data[7] = (sprite->data[7] & 0xFF00) | frames;
+ return TRUE;
+}
+
movement_type_def(MovementType_FollowPlayer, gMovementTypeFuncs_FollowPlayer)
bool8 MovementType_FollowPlayer_Shadow(struct ObjectEvent *objectEvent, struct Sprite *sprite)
@@ -4859,6 +4989,8 @@ bool8 MovementType_FollowPlayer_Moving(struct ObjectEvent *objectEvent, struct S
if (sprite->data[1]) { // restore nonzero state
sprite->data[1] = 1;
}
+ } else if (objectEvent->movementActionId != MOVEMENT_ACTION_EXIT_POKEBALL) {
+ UpdateFollowerTransformEffect(objectEvent, sprite);
}
return FALSE;
}
@@ -4874,6 +5006,7 @@ bool8 FollowablePlayerMovement_Idle(struct ObjectEvent *objectEvent, struct Spri
} else if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { // finish movement action
objectEvent->singleMovementActive = 0;
}
+ UpdateFollowerTransformEffect(objectEvent, sprite);
return FALSE;
}
@@ -6542,6 +6675,7 @@ bool8 MovementAction_EnterPokeball_Step0(struct ObjectEvent *objectEvent, struct
u8 direction = objectEvent->facingDirection;
InitMoveInPlace(objectEvent, sprite, direction, GetMoveDirectionFasterAnimNum(direction), 16);
sprite->data[6] = direction == DIR_EAST ? 3 : 2; // affine animation number
+ EndFollowerTransformEffect(objectEvent, sprite);
return MovementAction_EnterPokeball_Step1(objectEvent, sprite);
}
diff --git a/src/field_effect.c b/src/field_effect.c
index 021aca6df3..46491db268 100644
--- a/src/field_effect.c
+++ b/src/field_effect.c
@@ -2998,12 +2998,8 @@ static void SurfFieldEffect_Init(struct Task *task)
FreezeObjectEvents();
// Put follower into pokeball before using Surf
if (followerObject && !followerObject->invisible) {
- // TODO: ClearObjectEventMovement (
- followerObject->singleMovementActive = 0;
- ObjectEventClearHeldMovement(followerObject);
- gSprites[followerObject->spriteId].data[1] = 0;
+ ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]);
gSprites[followerObject->spriteId].animCmdIndex = 0; // Needed because of weird animCmdIndex stuff
- // )
ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL);
}
gPlayerAvatar.preventStep = TRUE;
diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c
index dc792f2ddb..4eb861c8c1 100644
--- a/src/field_screen_effect.c
+++ b/src/field_screen_effect.c
@@ -688,12 +688,8 @@ static void Task_DoDoorWarp(u8 taskId)
PlayerGetDestCoords(x, y);
PlaySE(GetDoorSoundEffect(*x, *y - 1));
if (followerObject) { // Put follower into pokeball
- // TODO: ClearObjectEventMovement (
- followerObject->singleMovementActive = 0;
- ObjectEventClearHeldMovement(followerObject);
- gSprites[followerObject->spriteId].data[1] = 0;
+ ClearObjectEventMovement(followerObject, &gSprites[followerObject->spriteId]);
gSprites[followerObject->spriteId].animCmdIndex = 0; // Needed because of weird animCmdIndex stuff
- // )
ObjectEventSetHeldMovement(followerObject, MOVEMENT_ACTION_ENTER_POKEBALL);
}
task->data[1] = FieldAnimateDoorOpen(*x, *y - 1);