Revert "Bug fixes"

This reverts commit 76fdc51440.
This commit is contained in:
W1serV1ser committed 2022-07-06 09:02:35 -07:00
1 parent 76fdc51440
commit 143b2a51e2
4 files changed
+134 -442

No files matched your search

+61 -350
View File
@@ -25,7 +25,6 @@
#include "trainer_see.h" #include "trainer_see.h"
#include "trainer_hill.h" #include "trainer_hill.h"
#include "util.h" #include "util.h"
#include "follow_me.h"
#include "constants/event_object_movement.h" #include "constants/event_object_movement.h"
#include "constants/event_objects.h" #include "constants/event_objects.h"
#include "constants/field_effects.h" #include "constants/field_effects.h"
@@ -33,7 +32,6 @@
#include "constants/mauville_old_man.h" #include "constants/mauville_old_man.h"
#include "constants/trainer_types.h" #include "constants/trainer_types.h"
#include "constants/union_room.h" #include "constants/union_room.h"
#include "constants/metatile_behaviors.h"
// this file was known as evobjmv.c in Game Freak's original source // this file was known as evobjmv.c in Game Freak's original source
@@ -82,8 +80,6 @@ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprit
static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0};
extern void PlaySE(u16);
extern void PlaySE12WithPanning(u16, s8);
static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16);
static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *);
static void SetMovementDelay(struct Sprite *, s16); static void SetMovementDelay(struct Sprite *, s16);
@@ -119,9 +115,6 @@ static void InitObjectPriorityByElevation(struct Sprite *, u8);
static void ObjectEventUpdateSubpriority(struct ObjectEvent*, struct Sprite*); static void ObjectEventUpdateSubpriority(struct ObjectEvent*, struct Sprite*);
static void DoTracksGroundEffect_None(struct ObjectEvent*, struct Sprite*, u8); static void DoTracksGroundEffect_None(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_Footprints(struct ObjectEvent*, struct Sprite*, u8); static void DoTracksGroundEffect_Footprints(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_FootprintsBug(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_FootprintsSpot(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_SlitherTracks(struct ObjectEvent*, struct Sprite*, u8);
static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent*, struct Sprite*, u8); static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent*, struct Sprite*, u8);
static void DoRippleFieldEffect(struct ObjectEvent*, struct Sprite*); static void DoRippleFieldEffect(struct ObjectEvent*, struct Sprite*);
static void DoGroundEffects_OnSpawn(struct ObjectEvent*, struct Sprite*); static void DoGroundEffects_OnSpawn(struct ObjectEvent*, struct Sprite*);
@@ -146,7 +139,7 @@ static void SpawnObjectEventOnReturnToField(u8, s16, s16);
static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8);
static void ResetObjectEventFldEffData(struct ObjectEvent *); static void ResetObjectEventFldEffData(struct ObjectEvent *);
static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *); static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *);
static u16 FindObjectEventPaletteIndexByTag(u16); static u8 FindObjectEventPaletteIndexByTag(u16);
static void _PatchObjectPalette(u16, u8); static void _PatchObjectPalette(u16, u8);
static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8);
static void SpriteCB_CameraObject(struct Sprite *); static void SpriteCB_CameraObject(struct Sprite *);
@@ -276,7 +269,6 @@ static void (*const sMovementTypeCallbacks[])(struct Sprite *) =
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = MovementType_WalkSlowlyInPlace, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = MovementType_WalkSlowlyInPlace,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = MovementType_WalkSlowlyInPlace, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = MovementType_WalkSlowlyInPlace,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = MovementType_WalkSlowlyInPlace, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = MovementType_WalkSlowlyInPlace,
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = MovementType_FollowingPokemon,
}; };
static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = { static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = {
@@ -321,7 +313,6 @@ static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = {
[MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE,
[MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE,
[MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE,
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = FALSE,
}; };
const u8 gInitialMovementTypeFacingDirections[] = { const u8 gInitialMovementTypeFacingDirections[] = {
@@ -406,7 +397,6 @@ const u8 gInitialMovementTypeFacingDirections[] = {
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = DIR_NORTH, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = DIR_NORTH,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = DIR_WEST, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = DIR_WEST,
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = DIR_EAST, [MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = DIR_EAST,
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = DIR_SOUTH,
}; };
#define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100 #define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100
@@ -1741,9 +1731,7 @@ u8 GetFirstInactiveObjectEventId(void)
u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)
{ {
if (localId == OBJ_EVENT_ID_FOLLOWER) if (localId < OBJ_EVENT_ID_PLAYER)
return GetFollowerObjectId();
else if (localId < OBJ_EVENT_ID_PLAYER)
return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId);
return GetObjectEventIdByLocalId(localId); return GetObjectEventIdByLocalId(localId);
@@ -1890,7 +1878,7 @@ static bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 *
return FALSE; return FALSE;
} }
void RemoveObjectEvent(struct ObjectEvent *objectEvent) static void RemoveObjectEvent(struct ObjectEvent *objectEvent)
{ {
objectEvent->active = FALSE; objectEvent->active = FALSE;
RemoveObjectEventInternal(objectEvent); RemoveObjectEventInternal(objectEvent);
@@ -1908,13 +1896,10 @@ void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent) static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent)
{ {
u8 paletteNum;
struct SpriteFrameImage image; struct SpriteFrameImage image;
image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size; image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size;
gSprites[objectEvent->spriteId].images = &image; gSprites[objectEvent->spriteId].images = &image;
paletteNum = gSprites[objectEvent->spriteId].oam.paletteNum;
DestroySprite(&gSprites[objectEvent->spriteId]); DestroySprite(&gSprites[objectEvent->spriteId]);
FieldEffectFreePaletteIfUnused(paletteNum);
} }
void RemoveAllObjectEventsExceptPlayer(void) void RemoveAllObjectEventsExceptPlayer(void)
@@ -1952,6 +1937,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE)
objectEvent->invisible = TRUE; objectEvent->invisible = TRUE;
*(u16 *)&spriteTemplate->paletteTag = TAG_NONE;
spriteId = CreateSprite(spriteTemplate, 0, 0, 0); spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
if (spriteId == MAX_SPRITES) if (spriteId == MAX_SPRITES)
{ {
@@ -1978,7 +1964,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
return objectEventId; return objectEventId;
} }
u8 TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) static u8 TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
{ {
u8 objectEventId; u8 objectEventId;
struct SpriteTemplate spriteTemplate; struct SpriteTemplate spriteTemplate;
@@ -2189,7 +2175,7 @@ void RemoveObjectEventsOutsideView(void)
{ {
struct ObjectEvent *objectEvent = &gObjectEvents[i]; struct ObjectEvent *objectEvent = &gObjectEvents[i];
if (objectEvent->active && !objectEvent->isPlayer && i != GetFollowerObjectId()) if (objectEvent->active && !objectEvent->isPlayer)
RemoveObjectEventIfOutsideView(objectEvent); RemoveObjectEventIfOutsideView(objectEvent);
} }
} }
@@ -2227,6 +2213,7 @@ void SpawnObjectEventsOnReturnToField(s16 x, s16 y)
static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
{ {
u8 i; u8 i;
u8 paletteSlot;
struct Sprite *sprite; struct Sprite *sprite;
struct ObjectEvent *objectEvent; struct ObjectEvent *objectEvent;
struct SpriteTemplate spriteTemplate; struct SpriteTemplate spriteTemplate;
@@ -2251,6 +2238,16 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
LoadObjectEventPalette(spriteTemplate.paletteTag); LoadObjectEventPalette(spriteTemplate.paletteTag);
UpdatePaletteGammaType(IndexOfSpritePaletteTag(spriteTemplate.paletteTag), GAMMA_ALT); UpdatePaletteGammaType(IndexOfSpritePaletteTag(spriteTemplate.paletteTag), GAMMA_ALT);
} }
else if (paletteSlot == 10)
{
LoadSpecialObjectReflectionPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot);
}
else if (paletteSlot >= 16)
{
paletteSlot -= 16;
_PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot);
}
*(u16 *)&spriteTemplate.paletteTag = TAG_NONE;
i = CreateSprite(&spriteTemplate, 0, 0, 0); i = CreateSprite(&spriteTemplate, 0, 0, 0);
if (i != MAX_SPRITES) if (i != MAX_SPRITES)
@@ -2303,7 +2300,7 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI
SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE); SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE);
} }
void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u16 graphicsId) void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
{ {
const struct ObjectEventGraphicsInfo *graphicsInfo; const struct ObjectEventGraphicsInfo *graphicsInfo;
struct Sprite *sprite; struct Sprite *sprite;
@@ -2333,7 +2330,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u16 graphicsId)
CameraObjectReset1(); CameraObjectReset1();
} }
void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u16 graphicsId) void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
{ {
u8 objectEventId; u8 objectEventId;
@@ -2390,7 +2387,7 @@ static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite
} }
} }
const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId) const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId)
{ {
u8 bard; u8 bard;
@@ -2517,7 +2514,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette
void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) void PatchObjectPalette(u16 paletteTag, u8 paletteSlot)
{ {
u16 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag);
LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20); LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20);
} }
@@ -2532,9 +2529,9 @@ void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot)
} }
} }
static u16 FindObjectEventPaletteIndexByTag(u16 tag) static u8 FindObjectEventPaletteIndexByTag(u16 tag)
{ {
u16 i; u8 i;
for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++) for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)
{ {
@@ -2880,7 +2877,7 @@ u8 GetObjectEventBerryTreeId(u8 objectEventId)
return gObjectEvents[objectEventId].trainerRange_berryTreeId; return gObjectEvents[objectEventId].trainerRange_berryTreeId;
} }
struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{ {
struct ObjectEventTemplate *templates; struct ObjectEventTemplate *templates;
const struct MapHeader *mapHeader; const struct MapHeader *mapHeader;
@@ -3263,38 +3260,6 @@ u8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementT
return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy); return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy);
} }
movement_type_def(MovementType_FollowingPokemon, gMovementTypeFuncs_FollowingPokemon)
bool8 MovementType_FollowingPokemon_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ClearObjectEventMovement(objectEvent, sprite);
sprite->data[1] = 1;
return TRUE;
}
bool8 MovementType_FollowingPokemon_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_FOLLOWING_POKEMON);
sprite->data[1] = 2;
return TRUE;
}
bool8 MovementType_FollowingPokemon_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
if (ObjectEventExecSingleMovementAction(objectEvent, sprite))
{
objectEvent->singleMovementActive = FALSE;
sprite->data[1] = 3;
}
return FALSE;
}
bool8 MovementType_FollowingPokemon_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{
sprite->data[1] = 1;
return TRUE;
}
movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround) movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround)
bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
@@ -5183,9 +5148,8 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
for (i = 0; i < OBJECT_EVENTS_COUNT; i++) for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
{ {
curObject = &gObjectEvents[i]; curObject = &gObjectEvents[i];
if (curObject->active && curObject != objectEvent && !FollowMe_IsCollisionExempt(curObject, objectEvent)) if (curObject->active && curObject != objectEvent)
{ {
// check for collision if curObject is active, not the object in question, and not exempt from collisions
if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y)) if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y))
{ {
if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation)) if (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation))
@@ -5333,7 +5297,6 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct
objectEvent->heldMovementActive = TRUE; objectEvent->heldMovementActive = TRUE;
objectEvent->heldMovementFinished = FALSE; objectEvent->heldMovementFinished = FALSE;
gSprites[objectEvent->spriteId].sActionFuncId = 0; gSprites[objectEvent->spriteId].sActionFuncId = 0;
FollowMe(objectEvent, movementActionId, FALSE);
return FALSE; return FALSE;
} }
@@ -5434,41 +5397,6 @@ bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direc
return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction))); return ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(GetOppositeDirection(direction)));
} }
bool8 ObjectEventPokemonFacePlayer(struct ObjectEvent *follower, struct ObjectEvent *player)
{
if(follower->currentCoords.x == player->currentCoords.x)
{
// Follower is south of player
if(follower->currentCoords.y > player->currentCoords.y)
{
gSprites[follower->spriteId].animNum = 5;
follower->facingDirection = DIR_NORTH;
}
// Follower is north of player
else
{
gSprites[follower->spriteId].animNum = 4;
follower->facingDirection = DIR_SOUTH;
}
}
else
{
// Follower is east of player
if(follower->currentCoords.x > player->currentCoords.x)
{
gSprites[follower->spriteId].animNum = 6;
follower->facingDirection = DIR_WEST;
}
// Follower is west of player
else
{
gSprites[follower->spriteId].animNum = 7;
follower->facingDirection = DIR_EAST;
}
}
return ObjectEventSetHeldMovement(follower, MOVEMENT_ACTION_FOLLOWING_POKEMON);
}
dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gAcroWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gAcroWheelieFaceDirectionMovementActions);
dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions);
dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions); dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions);
@@ -5611,8 +5539,7 @@ static bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite
{ {
ShiftStillObjectEventCoords(objectEvent); ShiftStillObjectEventCoords(objectEvent);
objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->triggerGroundEffectsOnStop = TRUE;
if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])) sprite->animPaused = TRUE;
sprite->animPaused = TRUE;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
@@ -5846,19 +5773,7 @@ bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objec
bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL);
{
if(sprite->data[7] != 2)
{
sprite->data[7] = 2;
sprite->animNum = 4;
sprite->x2 = 0;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_SOUTH, 0);
}
else
InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL);
return MovementAction_WalkNormalDown_Step1(objectEvent, sprite); return MovementAction_WalkNormalDown_Step1(objectEvent, sprite);
} }
@@ -5874,19 +5789,7 @@ bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struc
bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL);
{
if(sprite->data[7] != 3)
{
sprite->data[7] = 3;
sprite->animNum = 5;
sprite->x2 = 0;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_NORTH, 0);
}
else
InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL);
return MovementAction_WalkNormalUp_Step1(objectEvent, sprite); return MovementAction_WalkNormalUp_Step1(objectEvent, sprite);
} }
@@ -5902,19 +5805,7 @@ bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct
bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL);
{
if(sprite->data[7] != 4)
{
sprite->data[7] = 4;
sprite->animNum = 6;
sprite->x2 = 8;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_WEST, 0);
}
else
InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL);
return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite);
} }
@@ -5930,19 +5821,7 @@ bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struc
bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL);
{
if(sprite->data[7] != 5)
{
sprite->data[7] = 5;
sprite->animNum = 7;
sprite->x2 = -8;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_EAST, 0);
}
else
InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL);
return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite);
} }
@@ -6016,8 +5895,7 @@ static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite,
ShiftStillObjectEventCoords(objectEvent); ShiftStillObjectEventCoords(objectEvent);
objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->triggerGroundEffectsOnStop = TRUE;
objectEvent->landingJump = TRUE; objectEvent->landingJump = TRUE;
if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])) sprite->animPaused = TRUE;
sprite->animPaused = TRUE;
} }
return result; return result;
} }
@@ -6066,11 +5944,6 @@ static bool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *s
bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
{
sprite->x2 = 0;
sprite->data[7] = 10;
}
InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); InitJumpRegular(objectEvent, sprite, DIR_SOUTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);
return MovementAction_Jump2Down_Step1(objectEvent, sprite); return MovementAction_Jump2Down_Step1(objectEvent, sprite);
} }
@@ -6088,11 +5961,6 @@ bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Spr
bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
{
sprite->x2 = 0;
sprite->data[7] = 10;
}
InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); InitJumpRegular(objectEvent, sprite, DIR_NORTH, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);
return MovementAction_Jump2Up_Step1(objectEvent, sprite); return MovementAction_Jump2Up_Step1(objectEvent, sprite);
} }
@@ -6110,11 +5978,6 @@ bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprit
bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
{
sprite->x2 = 8;
sprite->data[7] = 10;
}
InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); InitJumpRegular(objectEvent, sprite, DIR_WEST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);
return MovementAction_Jump2Left_Step1(objectEvent, sprite); return MovementAction_Jump2Left_Step1(objectEvent, sprite);
} }
@@ -6132,11 +5995,6 @@ bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Spr
bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
{
sprite->x2 = -8;
sprite->data[7] = 10;
}
InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH); InitJumpRegular(objectEvent, sprite, DIR_EAST, JUMP_DISTANCE_FAR, JUMP_TYPE_HIGH);
return MovementAction_Jump2Right_Step1(objectEvent, sprite); return MovementAction_Jump2Right_Step1(objectEvent, sprite);
} }
@@ -6200,19 +6058,7 @@ bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprit
bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);
{
if(sprite->data[7] != 6)
{
sprite->data[7] = 6;
sprite->animNum = 20;
sprite->x2 = 0;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_SOUTH, 1);
}
else
InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);
return MovementAction_WalkFastDown_Step1(objectEvent, sprite); return MovementAction_WalkFastDown_Step1(objectEvent, sprite);
} }
@@ -6228,19 +6074,7 @@ bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct
bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);
{
if(sprite->data[7] != 7)
{
sprite->data[7] = 7;
sprite->animNum = 21;
sprite->x2 = 0;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_NORTH, 1);
}
else
InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);
return MovementAction_WalkFastUp_Step1(objectEvent, sprite); return MovementAction_WalkFastUp_Step1(objectEvent, sprite);
} }
@@ -6256,19 +6090,7 @@ bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sp
bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);
{
if(sprite->data[7] != 8)
{
sprite->data[7] = 8;
sprite->animNum = 22;
sprite->x2 = 8;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_WEST, 1);
}
else
InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);
return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); return MovementAction_WalkFastLeft_Step1(objectEvent, sprite);
} }
@@ -6284,19 +6106,7 @@ bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct
bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]) InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);
{
if(sprite->data[7] != 9)
{
sprite->data[7] = 9;
sprite->animNum = 23;
sprite->x2 = -8;
SeekSpriteAnim(sprite, ++sprite->animCmdIndex);
}
InitNpcForMovement(objectEvent, sprite, DIR_EAST, 1);
}
else
InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);
return MovementAction_WalkFastRight_Step1(objectEvent, sprite); return MovementAction_WalkFastRight_Step1(objectEvent, sprite);
} }
@@ -8480,9 +8290,6 @@ static void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, st
[TRACKS_NONE] = DoTracksGroundEffect_None, [TRACKS_NONE] = DoTracksGroundEffect_None,
[TRACKS_FOOT] = DoTracksGroundEffect_Footprints, [TRACKS_FOOT] = DoTracksGroundEffect_Footprints,
[TRACKS_BIKE_TIRE] = DoTracksGroundEffect_BikeTireTracks, [TRACKS_BIKE_TIRE] = DoTracksGroundEffect_BikeTireTracks,
[TRACKS_SLITHER] = DoTracksGroundEffect_SlitherTracks,
[TRACKS_BUG] = DoTracksGroundEffect_FootprintsBug,
[TRACKS_SPOT] = DoTracksGroundEffect_FootprintsSpot,
}; };
void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite) void GroundEffect_SandTracks(struct ObjectEvent *objEvent, struct Sprite *sprite)
@@ -8517,73 +8324,6 @@ static void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct
FieldEffectStart(sandFootprints_FieldEffectData[isDeepSand]); FieldEffectStart(sandFootprints_FieldEffectData[isDeepSand]);
} }
static void DoTracksGroundEffect_FootprintsSpot(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)
{
// First half-word is a Field Effect script id. (gFieldEffectScriptPointers)
u16 otherFootprintsA_FieldEffectData[2] = {
FLDEFF_TRACKS_SPOT,
FLDEFF_TRACKS_SPOT
};
gFieldEffectArguments[0] = objEvent->previousCoords.x;
gFieldEffectArguments[1] = objEvent->previousCoords.y;
gFieldEffectArguments[2] = 149;
gFieldEffectArguments[3] = 2;
gFieldEffectArguments[4] = objEvent->facingDirection;
if (Random() % 2 == 0)
PlaySE(159);
if (Random() % 2 == 1)
PlaySE12WithPanning(159, 1);
FieldEffectStart(otherFootprintsA_FieldEffectData[a]);
}
static void DoTracksGroundEffect_FootprintsBug(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)
{
// First half-word is a Field Effect script id. (gFieldEffectScriptPointers)
u16 otherFootprintsB_FieldEffectData[2] = {
FLDEFF_TRACKS_BUG,
FLDEFF_TRACKS_BUG
};
gFieldEffectArguments[0] = objEvent->previousCoords.x;
gFieldEffectArguments[1] = objEvent->previousCoords.y;
gFieldEffectArguments[2] = 149;
gFieldEffectArguments[3] = 2;
gFieldEffectArguments[4] = objEvent->facingDirection;
if (Random() % 2 == 0)
PlaySE(159);
if (Random() % 2 == 1)
PlaySE12WithPanning(159, 1);
FieldEffectStart(otherFootprintsB_FieldEffectData[a]);
}
static void DoTracksGroundEffect_SlitherTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, u8 a)
{
// Specifies which bike track shape to show next.
// For example, when the bike turns from up to right, it will show
// a track that curves to the right.
// Each 4-byte row corresponds to the initial direction of the bike, and
// each byte in that row is for the next direction of the bike in the order
// of down, up, left, right.
static const u8 slitherTracks_Transitions[4][4] = {
1, 2, 7, 8,
1, 2, 6, 5,
5, 8, 3, 4,
6, 7, 3, 4,
};
if (objEvent->currentCoords.x != objEvent->previousCoords.x || objEvent->currentCoords.y != objEvent->previousCoords.y)
{
gFieldEffectArguments[0] = objEvent->previousCoords.x;
gFieldEffectArguments[1] = objEvent->previousCoords.y;
gFieldEffectArguments[2] = 149;
gFieldEffectArguments[3] = 2;
gFieldEffectArguments[4] =
slitherTracks_Transitions[objEvent->previousMovementDirection][objEvent->facingDirection - 5];
FieldEffectStart(FLDEFF_TRACKS_SLITHER);
}
}
static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand) static void DoTracksGroundEffect_BikeTireTracks(struct ObjectEvent *objEvent, struct Sprite *sprite, bool8 isDeepSand)
{ {
// Specifies which bike track shape to show next. // Specifies which bike track shape to show next.
@@ -8729,9 +8469,6 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *
if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent)) if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent))
return; return;
if (gSaveBlock2Ptr->follower.inProgress && objEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId] && objEvent->invisible == TRUE)
return;
for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1)
if (flags & 1) if (flags & 1)
@@ -9302,7 +9039,7 @@ void TurnVirtualObject(u8 virtualObjId, u8 direction)
StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction)); StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction));
} }
void SetVirtualObjectGraphics(u8 virtualObjId, u16 graphicsId) void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId)
{ {
int spriteId = GetVirtualObjectSpriteId(virtualObjId); int spriteId = GetVirtualObjectSpriteId(virtualObjId);
@@ -9778,16 +9515,16 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
s16 y = objectEvent->currentCoords.y; s16 y = objectEvent->currentCoords.y;
u8 spriteId; u8 spriteId;
bool8 playerPriority; bool8 playerPriority;
sprite->data[7] = 1; sprite->data[7] = 1;
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
InitSpriteAffineAnim(sprite); InitSpriteAffineAnim(sprite);
if (objectEvent->facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY) if (objectEvent->facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY)
StartSpriteAffineAnim(sprite, 2); StartSpriteAffineAnim(sprite, 2);
else else
StartSpriteAffineAnim(sprite, 0); StartSpriteAffineAnim(sprite, 0);
if (y == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y) // If follower is to the east or west of player if (y == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y) // If follower is to the east or west of player
{ {
SetSpritePosToOffsetMapCoords(&x, &y, 8, 8); SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
@@ -9894,17 +9631,17 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
gSprites[spriteId].oam.priority = 2; gSprites[spriteId].oam.priority = 2;
gSprites[spriteId].data[0] = 0; gSprites[spriteId].data[0] = 0;
} }
if (playerPriority) if (playerPriority)
{ {
gSprites[gPlayerAvatar.spriteId].oam.priority = 1; gSprites[gPlayerAvatar.spriteId].oam.priority = 1;
gSprites[gPlayerAvatar.spriteId].subpriority = 1; gSprites[gPlayerAvatar.spriteId].subpriority = 1;
gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = TRUE; gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = TRUE;
} }
sprite->oam.priority = 1; sprite->oam.priority = 1;
sprite->subpriority = 1; sprite->subpriority = 1;
sprite->data[2]++; sprite->data[2]++;
return FALSE; return FALSE;
} }
@@ -9912,7 +9649,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
sprite->data[7]++; sprite->data[7]++;
if (objectEvent->currentCoords.x > gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x) // east side if (objectEvent->currentCoords.x > gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x) // east side
{ {
switch(objectEvent->facingDirection) switch(objectEvent->facingDirection)
@@ -9937,7 +9674,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
sprite->x2 += 1 - sprite->data[7]; sprite->x2 += 1 - sprite->data[7];
break; break;
} }
// Adjust the height of the 64x64 sprites differently // Adjust the height of the 64x64 sprites differently
if (IsBigSprite(objectEvent->graphicsId)) if (IsBigSprite(objectEvent->graphicsId))
{ {
@@ -9986,7 +9723,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
sprite->x2 -= 8; sprite->x2 -= 8;
break; break;
} }
// Adjust the height of the 64x64 sprites differently // Adjust the height of the 64x64 sprites differently
if (IsBigSprite(objectEvent->graphicsId)) if (IsBigSprite(objectEvent->graphicsId))
{ {
@@ -10028,7 +9765,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
sprite->x2 -= 7; sprite->x2 -= 7;
break; break;
} }
// Adjust the height of the 64x64 sprites differently // Adjust the height of the 64x64 sprites differently
if (IsBigSprite(objectEvent->graphicsId)) if (IsBigSprite(objectEvent->graphicsId))
{ {
@@ -10065,7 +9802,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
sprite->x2 -= 7; sprite->x2 -= 7;
break; break;
} }
// Adjust the height of the 64x64 sprites differently // Adjust the height of the 64x64 sprites differently
if (IsBigSprite(objectEvent->graphicsId)) if (IsBigSprite(objectEvent->graphicsId))
{ {
@@ -10084,12 +9821,11 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
sprite->y2 = 6; sprite->y2 = 6;
} }
} }
if (sprite->data[7] >= 11) if (sprite->data[7] >= 11)
{ {
FreeSpriteOamMatrix(sprite); FreeSpriteOamMatrix(sprite);
gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = FALSE; gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = FALSE;
gPlayerAvatar.preventStep = FALSE;
objectEvent->invisible = TRUE; objectEvent->invisible = TRUE;
sprite->data[2]++; sprite->data[2]++;
} }
@@ -10102,12 +9838,12 @@ u8 MovementAction_FollowingPokemon_Grow_Step0(struct ObjectEvent *objectEvent, s
sprite->data[7] = 11; sprite->data[7] = 11;
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
InitSpriteAffineAnim(sprite); InitSpriteAffineAnim(sprite);
if (gObjectEvents[gPlayerAvatar.objectEventId].facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY) if (gObjectEvents[gPlayerAvatar.objectEventId].facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY)
StartSpriteAffineAnim(sprite, 3); StartSpriteAffineAnim(sprite, 3);
else else
StartSpriteAffineAnim(sprite, 1); StartSpriteAffineAnim(sprite, 1);
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection) switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
{ {
case DIR_SOUTH: case DIR_SOUTH:
@@ -10134,10 +9870,10 @@ u8 MovementAction_FollowingPokemon_Grow_Step0(struct ObjectEvent *objectEvent, s
u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
sprite->data[7]--; sprite->data[7]--;
if (sprite->data[7] == 10) if (sprite->data[7] == 10)
gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible = FALSE; gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible = FALSE;
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection) switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
{ {
case DIR_SOUTH: case DIR_SOUTH:
@@ -10161,12 +9897,12 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
sprite->x2 += -5; sprite->x2 += -5;
else else
sprite->x2 += 1 - sprite->data[7]; sprite->x2 += 1 - sprite->data[7];
if (sprite->data[7] >= 10) if (sprite->data[7] >= 10)
sprite->y2 = 10; sprite->y2 = 10;
else else
sprite->y2 = sprite->data[7]; sprite->y2 = sprite->data[7];
break; break;
case DIR_EAST: case DIR_EAST:
if (sprite->data[7] <= 5) if (sprite->data[7] <= 5)
@@ -10180,15 +9916,15 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
sprite->x2 -= -4; sprite->x2 -= -4;
else else
sprite->x2 -= 2 - sprite->data[7]; sprite->x2 -= 2 - sprite->data[7];
if (sprite->data[7] >= 10) if (sprite->data[7] >= 10)
sprite->y2 = 10; sprite->y2 = 10;
else else
sprite->y2 = sprite->data[7]; sprite->y2 = sprite->data[7];
break; break;
} }
// Adjust the height of the 64x64 sprites differently // Adjust the height of the 64x64 sprites differently
if (IsBigSprite(objectEvent->graphicsId)) if (IsBigSprite(objectEvent->graphicsId))
{ {
@@ -10205,7 +9941,7 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
else else
sprite->y2 -= (11 - sprite->data[7]) + 7; sprite->y2 -= (11 - sprite->data[7]) + 7;
} }
if (sprite->data[7] <= 1) if (sprite->data[7] <= 1)
{ {
// Set y2 of the 64x64 sprites back to 0, and compensate with y. // Set y2 of the 64x64 sprites back to 0, and compensate with y.
@@ -10214,7 +9950,7 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
sprite->y -= 16; sprite->y -= 16;
sprite->y2 = 0; sprite->y2 = 0;
} }
FreeSpriteOamMatrix(sprite); FreeSpriteOamMatrix(sprite);
// Make sure water ripples at the feet of the follower if they are appearing on top of shallow water. // Make sure water ripples at the feet of the follower if they are appearing on top of shallow water.
@@ -10223,10 +9959,10 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
objectEvent->inShallowFlowingWater = TRUE; objectEvent->inShallowFlowingWater = TRUE;
StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objectEvent); StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objectEvent);
} }
gPlayerAvatar.preventStep = FALSE;
sprite->data[2]++; sprite->data[2]++;
} }
return FALSE; return FALSE;
} }
@@ -10235,28 +9971,3 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr
{ {
return TRUE; return TRUE;
} }
// NEW
u16 GetMiniStepCount(u8 speed)
{
return (u16)sStepTimes[speed];
}
void RunMiniStep(struct Sprite *sprite, u8 speed, u8 currentFrame)
{
sNpcStepFuncTables[speed][currentFrame](sprite, sprite->data[3]);
}
bool8 PlayerIsUnderWaterfall(struct ObjectEvent *objectEvent)
{
s16 x;
s16 y;
x = objectEvent->currentCoords.x;
y = objectEvent->currentCoords.y;
MoveCoordsInDirection(DIR_NORTH, &x, &y, 0, 1);
if (MetatileBehavior_IsWaterfall(MapGridGetMetatileBehaviorAt(x, y)))
return TRUE;
return FALSE;
}
+10 -12
View File
@@ -20,7 +20,6 @@
#include "strings.h" #include "strings.h"
#include "task.h" #include "task.h"
#include "tv.h" #include "tv.h"
#include "follow_me.h"
#include "wild_encounter.h" #include "wild_encounter.h"
#include "constants/abilities.h" #include "constants/abilities.h"
#include "constants/event_objects.h" #include "constants/event_objects.h"
@@ -1218,32 +1217,32 @@ void StopPlayerAvatar(void)
} }
} }
u16 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
{ {
return sRivalAvatarGfxIds[state][gender]; return sRivalAvatarGfxIds[state][gender];
} }
u16 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
{ {
return sPlayerAvatarGfxIds[state][gender]; return sPlayerAvatarGfxIds[state][gender];
} }
u16 GetFRLGAvatarGraphicsIdByGender(u8 gender) u8 GetFRLGAvatarGraphicsIdByGender(u8 gender)
{ {
return sFRLGAvatarGfxIds[gender]; return sFRLGAvatarGfxIds[gender];
} }
u16 GetRSAvatarGraphicsIdByGender(u8 gender) u8 GetRSAvatarGraphicsIdByGender(u8 gender)
{ {
return sRSAvatarGfxIds[gender]; return sRSAvatarGfxIds[gender];
} }
u16 GetPlayerAvatarGraphicsIdByStateId(u8 state) u8 GetPlayerAvatarGraphicsIdByStateId(u8 state)
{ {
return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender);
} }
u8 unref_GetRivalAvatarGenderByGraphicsId(u16 gfxId) u8 unref_GetRivalAvatarGenderByGraphicsId(u8 gfxId)
{ {
switch (gfxId) switch (gfxId)
{ {
@@ -1261,7 +1260,7 @@ u8 unref_GetRivalAvatarGenderByGraphicsId(u16 gfxId)
} }
} }
u8 GetPlayerAvatarGenderByGraphicsId(u16 gfxId) u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId)
{ {
switch (gfxId) switch (gfxId)
{ {
@@ -1330,7 +1329,7 @@ void SetPlayerAvatarStateMask(u8 flags)
gPlayerAvatar.flags |= flags; gPlayerAvatar.flags |= flags;
} }
static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender) static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender)
{ {
u8 i; u8 i;
@@ -1342,7 +1341,7 @@ static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender)
return PLAYER_AVATAR_FLAG_ON_FOOT; return PLAYER_AVATAR_FLAG_ON_FOOT;
} }
u16 GetPlayerAvatarGraphicsIdByCurrentState(void) u8 GetPlayerAvatarGraphicsIdByCurrentState(void)
{ {
u8 i; u8 i;
u8 flags = gPlayerAvatar.flags; u8 flags = gPlayerAvatar.flags;
@@ -1355,7 +1354,7 @@ u16 GetPlayerAvatarGraphicsIdByCurrentState(void)
return 0; return 0;
} }
void SetPlayerAvatarExtraStateTransition(u16 graphicsId, u8 transitionFlag) void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 transitionFlag)
{ {
u8 stateFlag = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender); u8 stateFlag = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender);
@@ -1393,7 +1392,6 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)
gPlayerAvatar.spriteId = objectEvent->spriteId; gPlayerAvatar.spriteId = objectEvent->spriteId;
gPlayerAvatar.gender = gender; gPlayerAvatar.gender = gender;
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT);
CreateFollowerAvatar();
} }
void SetPlayerInvisibility(bool8 invisible) void SetPlayerInvisibility(bool8 invisible)
+8 -13
View File
@@ -251,25 +251,20 @@ void FollowMe(struct ObjectEvent* npc, u8 state, bool8 ignoreScriptActive)
if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 1) if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 1)
{ {
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)) gPlayerAvatar.preventStep = TRUE;
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0; taskId = CreateTask(Task_FollowerOutOfDoor, 1);
else gTasks[taskId].data[0] = 0;
{ gTasks[taskId].data[2] = follower->currentCoords.x;
gPlayerAvatar.preventStep = TRUE; gTasks[taskId].data[3] = follower->currentCoords.y;
taskId = CreateTask(Task_FollowerOutOfDoor, 1); goto RESET;
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[2] = follower->currentCoords.x;
gTasks[taskId].data[3] = follower->currentCoords.y;
goto RESET;
}
} }
else if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 2) else if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 2)
{ {
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0; gSaveBlock2Ptr->follower.comeOutDoorStairs = 0;
} }
// This makes sure the follower is still invisible after diving or surfacing or exiting a door while player is on a bike // This makes sure the follower is still invisible after diving or surfacing
if(!(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE))) if(!(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)))
follower->invisible = FALSE; follower->invisible = FALSE;
MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y); MoveObjectEventToMapCoords(follower, player->currentCoords.x, player->currentCoords.y);
ObjectEventTurn(follower, player->facingDirection); //The follower should be facing the same direction as the player when it comes out of hiding ObjectEventTurn(follower, player->facingDirection); //The follower should be facing the same direction as the player when it comes out of hiding
+55 -67
View File
@@ -39,6 +39,7 @@
#include "new_game.h" #include "new_game.h"
#include "palette.h" #include "palette.h"
#include "play_time.h" #include "play_time.h"
#include "pokemon.h"
#include "random.h" #include "random.h"
#include "roamer.h" #include "roamer.h"
#include "rotating_gate.h" #include "rotating_gate.h"
@@ -60,7 +61,6 @@
#include "scanline_effect.h" #include "scanline_effect.h"
#include "wild_encounter.h" #include "wild_encounter.h"
#include "frontier_util.h" #include "frontier_util.h"
#include "follow_me.h"
#include "constants/abilities.h" #include "constants/abilities.h"
#include "constants/layouts.h" #include "constants/layouts.h"
#include "constants/map_types.h" #include "constants/map_types.h"
@@ -877,7 +877,6 @@ void DoWhiteOut(void)
HealPlayerParty(); HealPlayerParty();
Overworld_ResetStateAfterWhiteOut(); Overworld_ResetStateAfterWhiteOut();
SetWarpDestinationToLastHealLocation(); SetWarpDestinationToLastHealLocation();
UpdateFollowerPokemonGraphic();
WarpIntoMap(); WarpIntoMap();
} }
@@ -927,8 +926,6 @@ static void Overworld_ResetStateAfterWhiteOut(void)
VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 0); VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 0);
VarSet(VAR_ABNORMAL_WEATHER_LOCATION, ABNORMAL_WEATHER_NONE); VarSet(VAR_ABNORMAL_WEATHER_LOCATION, ABNORMAL_WEATHER_NONE);
} }
FollowMe_TryRemoveFollowerOnWhiteOut();
} }
static void UpdateMiscOverworldStates(void) static void UpdateMiscOverworldStates(void)
@@ -1959,10 +1956,6 @@ static void DoCB1_Overworld(u16 newKeys, u16 heldKeys)
PlayerStep(inputStruct.dpadDirection, newKeys, heldKeys); PlayerStep(inputStruct.dpadDirection, newKeys, heldKeys);
} }
} }
// if stop running but keep holding B -> fix follower frame
if (PlayerHasFollower() && IsPlayerOnFoot() && IsPlayerStandingStill())
ObjectEventSetHeldMovement(&gObjectEvents[GetFollowerObjectId()], GetFaceDirectionAnimNum(gObjectEvents[GetFollowerObjectId()].facingDirection));
} }
void CB1_Overworld(void) void CB1_Overworld(void)
@@ -1998,20 +1991,6 @@ void CB2_Overworld(void)
OverworldBasic(); OverworldBasic();
if (fading) if (fading)
SetFieldVBlankCallback(); SetFieldVBlankCallback();
// Make sure follower's sprite is properly positioned when map reloads.
if (gSaveBlock2Ptr->follower.inProgress)
{
switch(gObjectEvents[gSaveBlock2Ptr->follower.objId].facingDirection)
{
case DIR_EAST:
gSprites[gObjectEvents[gSaveBlock2Ptr->follower.objId].spriteId].x2 = -8;
break;
case DIR_WEST:
gSprites[gObjectEvents[gSaveBlock2Ptr->follower.objId].spriteId].x2 = 8;
break;
}
}
} }
void SetMainCallback1(MainCallback cb) void SetMainCallback1(MainCallback cb)
@@ -2194,7 +2173,6 @@ void CB2_ReturnToFieldWithOpenMenu(void)
{ {
FieldClearVBlankHBlankCallbacks(); FieldClearVBlankHBlankCallbacks();
gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu; gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu;
UpdateFollowerPokemonGraphic();
CB2_ReturnToField(); CB2_ReturnToField();
} }
@@ -2661,7 +2639,10 @@ static void ResumeMap(bool32 a1)
ResetAllPicSprites(); ResetAllPicSprites();
ResetCameraUpdateInfo(); ResetCameraUpdateInfo();
InstallCameraPanAheadCallback(); InstallCameraPanAheadCallback();
FreeAllSpritePalettes(); if (!a1)
InitObjectEventPalettes(0);
else
InitObjectEventPalettes(1);
FieldEffectActiveListClear(); FieldEffectActiveListClear();
StartWeather(); StartWeather();
@@ -2696,7 +2677,6 @@ static void InitObjectEventsLocal(void)
ResetInitialPlayerAvatarState(); ResetInitialPlayerAvatarState();
TrySpawnObjectEvents(0, 0); TrySpawnObjectEvents(0, 0);
TryRunOnWarpIntoMapScript(); TryRunOnWarpIntoMapScript();
FollowMe_HandleSprite();
} }
static void InitObjectEventsReturnToField(void) static void InitObjectEventsReturnToField(void)
@@ -3756,6 +3736,15 @@ void UpdateFollowerPokemonGraphic(void)
u16 leadMonGraphicId = GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_SPECIES, NULL) + OBJ_EVENT_GFX_BULBASAUR - 1; u16 leadMonGraphicId = GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_SPECIES, NULL) + OBJ_EVENT_GFX_BULBASAUR - 1;
struct ObjectEvent *follower = &gObjectEvents[gSaveBlock2Ptr->follower.objId]; struct ObjectEvent *follower = &gObjectEvents[gSaveBlock2Ptr->follower.objId];
// If the lead Pokemon is Unown, use the correct sprite
if (leadMonGraphicId == 439)
{
u8 unownLetter = GET_UNOWN_LETTER(GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_PERSONALITY));
if (unownLetter)
leadMonGraphicId = 652 + unownLetter;
}
if(gSaveBlock2Ptr->follower.inProgress && leadMonGraphicId != gSaveBlock2Ptr->follower.graphicsId) if(gSaveBlock2Ptr->follower.inProgress && leadMonGraphicId != gSaveBlock2Ptr->follower.graphicsId)
{ {
// Sets the follower's graphic data to the proper following Pokemon graphic data // Sets the follower's graphic data to the proper following Pokemon graphic data
@@ -3851,7 +3840,7 @@ static void BigSparkleCallback(struct Sprite *sprite)
break; break;
} }
} }
if (++sprite->data[0] >= 19) if (++sprite->data[0] >= 19)
{ {
FreeSpriteOamMatrix(sprite); FreeSpriteOamMatrix(sprite);
@@ -3876,7 +3865,7 @@ bool8 IsBigSprite(u16 graphicsId)
static void SparklePokeballCallback(struct Sprite *sprite) static void SparklePokeballCallback(struct Sprite *sprite)
{ {
sprite->data[0]++; sprite->data[0]++;
if (sprite->data[0] >= 10) if (sprite->data[0] >= 10)
{ {
struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId]; struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId];
@@ -3885,58 +3874,60 @@ static void SparklePokeballCallback(struct Sprite *sprite)
s16 y = gSprites[follower->spriteId].y; s16 y = gSprites[follower->spriteId].y;
u8 spriteId; u8 spriteId;
u16 graphicsId; u16 graphicsId;
DestroySprite(sprite); DestroySprite(sprite);
gSprites[follower->spriteId].oam.priority = ElevationToPriority(follower->previousElevation); gSprites[follower->spriteId].oam.priority = ElevationToPriority(follower->previousElevation);
gSprites[gPlayerAvatar.spriteId].oam.priority = ElevationToPriority(player->previousElevation); gSprites[gPlayerAvatar.spriteId].oam.priority = ElevationToPriority(player->previousElevation);
player->fixedPriority = FALSE; player->fixedPriority = FALSE;
// Shift the location of the sparkle, depending on which way the follower will be facing // Shift the location of the sparkle, depending on which way the follower will be facing
// Account for the other Unown forms
if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_DEOXYS_SPEED)
graphicsId = 200;
#ifndef POKEMON_EXPANSION #ifndef POKEMON_EXPANSION
// Gen 3+ OBJ_EVENT_GFX constants are 25 too high due to OLD_UNOWN constants. else if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_CELEBI) // Gen 3+ OBJ_EVENT_GFX constants are 25 too high due to OLD_UNOWN constants.
if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_CELEBI)
graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR - 25; graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR - 25;
else
#endif #endif
else
graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR; graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR;
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection) switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
{ {
case DIR_SOUTH: case DIR_SOUTH:
x -= 16 - FollowerSparkleCoords[graphicsId][0]; x -= 16 - FollowerSparkleCoords[graphicsId][0];
if (IsBigSprite(follower->graphicsId)) if (IsBigSprite(follower->graphicsId))
x -= 16; x -= 16;
y += 16 - FollowerSparkleCoords[graphicsId][1]; y += 16 - FollowerSparkleCoords[graphicsId][1];
break; break;
case DIR_NORTH: case DIR_NORTH:
x -= 16 - FollowerSparkleCoords[graphicsId][2]; x -= 16 - FollowerSparkleCoords[graphicsId][2];
if (IsBigSprite(follower->graphicsId)) if (IsBigSprite(follower->graphicsId))
x -= 16; x -= 16;
y += 16 - FollowerSparkleCoords[graphicsId][3]; y += 16 - FollowerSparkleCoords[graphicsId][3];
break; break;
case DIR_EAST: case DIR_EAST:
x += 7 - FollowerSparkleCoords[graphicsId][4]; // 7 looks better than 8 x += 7 - FollowerSparkleCoords[graphicsId][4]; // 7 looks better than 8
if (IsBigSprite(follower->graphicsId)) if (IsBigSprite(follower->graphicsId))
x += 16; x += 16;
y += 16 - FollowerSparkleCoords[graphicsId][5]; y += 16 - FollowerSparkleCoords[graphicsId][5];
break; break;
case DIR_WEST: case DIR_WEST:
x -= 8 - FollowerSparkleCoords[graphicsId][4]; x -= 8 - FollowerSparkleCoords[graphicsId][4];
if (IsBigSprite(follower->graphicsId)) if (IsBigSprite(follower->graphicsId))
x -= 16; x -= 16;
y += 16 - FollowerSparkleCoords[graphicsId][5]; y += 16 - FollowerSparkleCoords[graphicsId][5];
break; break;
} }
if (IsBigSprite(follower->graphicsId)) if (IsBigSprite(follower->graphicsId))
{ {
// North sparkle // North sparkle
@@ -3951,7 +3942,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 0); StartSpriteAffineAnim(&gSprites[spriteId], 0);
} }
// NorthEast sparkle // NorthEast sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -3964,7 +3955,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 1); StartSpriteAffineAnim(&gSprites[spriteId], 1);
} }
// East sparkle // East sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -3977,7 +3968,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 2); StartSpriteAffineAnim(&gSprites[spriteId], 2);
} }
// SouthEast sparkle // SouthEast sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -3990,7 +3981,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 3); StartSpriteAffineAnim(&gSprites[spriteId], 3);
} }
// South sparkle // South sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4003,7 +3994,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 4); StartSpriteAffineAnim(&gSprites[spriteId], 4);
} }
// SouthWest sparkle // SouthWest sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4016,7 +4007,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 5); StartSpriteAffineAnim(&gSprites[spriteId], 5);
} }
// West sparkle // West sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4029,7 +4020,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 6); StartSpriteAffineAnim(&gSprites[spriteId], 6);
} }
// NorthWest sparkle // NorthWest sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4056,7 +4047,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 0); StartSpriteAffineAnim(&gSprites[spriteId], 0);
} }
// NorthEast sparkle // NorthEast sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4068,7 +4059,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 1); StartSpriteAffineAnim(&gSprites[spriteId], 1);
} }
// East sparkle // East sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4080,7 +4071,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 2); StartSpriteAffineAnim(&gSprites[spriteId], 2);
} }
// SouthEast sparkle // SouthEast sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4092,7 +4083,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 3); StartSpriteAffineAnim(&gSprites[spriteId], 3);
} }
// South sparkle // South sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4104,7 +4095,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 4); StartSpriteAffineAnim(&gSprites[spriteId], 4);
} }
// SouthWest sparkle // SouthWest sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4116,7 +4107,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 5); StartSpriteAffineAnim(&gSprites[spriteId], 5);
} }
// West sparkle // West sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4128,7 +4119,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
InitSpriteAffineAnim(&gSprites[spriteId]); InitSpriteAffineAnim(&gSprites[spriteId]);
StartSpriteAffineAnim(&gSprites[spriteId], 6); StartSpriteAffineAnim(&gSprites[spriteId], 6);
} }
// NorthWest sparkle // NorthWest sparkle
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
@@ -4153,7 +4144,7 @@ void FollowerPokeballSparkle(void)
s16 x = player->currentCoords.x; s16 x = player->currentCoords.x;
s16 y = player->currentCoords.y; s16 y = player->currentCoords.y;
u8 spriteId; u8 spriteId;
switch(player->facingDirection) switch(player->facingDirection)
{ {
case DIR_SOUTH: case DIR_SOUTH:
@@ -4171,7 +4162,7 @@ void FollowerPokeballSparkle(void)
break; break;
} }
gSprites[follower->spriteId].x = x; gSprites[follower->spriteId].x = x;
switch(GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_POKEBALL)) switch(GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_POKEBALL))
{ {
case ITEM_MASTER_BALL: case ITEM_MASTER_BALL:
@@ -4255,20 +4246,20 @@ void FollowerPokeballSparkle(void)
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_ITEM_BALL, &SparklePokeballCallback, x, y, 2); spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_ITEM_BALL, &SparklePokeballCallback, x, y, 2);
break; break;
} }
if (spriteId != MAX_SPRITES) if (spriteId != MAX_SPRITES)
{ {
gSprites[spriteId].coordOffsetEnabled = TRUE; gSprites[spriteId].coordOffsetEnabled = TRUE;
gSprites[spriteId].oam.priority = 2; gSprites[spriteId].oam.priority = 2;
gSprites[spriteId].data[0] = 0; gSprites[spriteId].data[0] = 0;
} }
follower->currentCoords.x = player->currentCoords.x; follower->currentCoords.x = player->currentCoords.x;
follower->currentCoords.y = player->currentCoords.y; follower->currentCoords.y = player->currentCoords.y;
follower->facingDirection = player->facingDirection; follower->facingDirection = player->facingDirection;
gSprites[follower->spriteId].animNum = player->facingDirection - 1; gSprites[follower->spriteId].animNum = player->facingDirection - 1;
if (player->facingDirection == DIR_NORTH) if (player->facingDirection == DIR_NORTH)
{ {
gSprites[follower->spriteId].oam.priority = 0; gSprites[follower->spriteId].oam.priority = 0;
@@ -4284,8 +4275,7 @@ void FollowerPokeballSparkle(void)
gSprites[gPlayerAvatar.spriteId].subpriority = 0; gSprites[gPlayerAvatar.spriteId].subpriority = 0;
} }
player->fixedPriority = TRUE; player->fixedPriority = TRUE;
gPlayerAvatar.preventStep = TRUE;
SeekSpriteAnim(&gSprites[follower->spriteId], 0); SeekSpriteAnim(&gSprites[follower->spriteId], 0);
ObjectEventForceSetHeldMovement(follower, MOVEMENT_ACTION_FOLLOWING_POKEMON_GROW); ObjectEventForceSetHeldMovement(follower, MOVEMENT_ACTION_FOLLOWING_POKEMON_GROW);
} }
@@ -4293,10 +4283,8 @@ void FollowerPokeballSparkle(void)
void FollowerIntoPokeball(void) void FollowerIntoPokeball(void)
{ {
if (gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible == FALSE && gSaveBlock2Ptr->follower.inProgress) if (gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible == FALSE && gSaveBlock2Ptr->follower.comeOutDoorStairs == 0 && gSaveBlock2Ptr->follower.inProgress)
{ {
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0;
gPlayerAvatar.preventStep = TRUE;
ObjectEventForceSetHeldMovement(&gObjectEvents[gSaveBlock2Ptr->follower.objId], MOVEMENT_ACTION_FOLLOWING_POKEMON_SHRINK); ObjectEventForceSetHeldMovement(&gObjectEvents[gSaveBlock2Ptr->follower.objId], MOVEMENT_ACTION_FOLLOWING_POKEMON_SHRINK);
gSpecialVar_Unused_0x8014 = 1; gSpecialVar_Unused_0x8014 = 1;
} }