Bug fixes
Fixed quick movement bugs, bike out of door bugs, running bugs, and sand/water effects bugs, all relating to followers. Very nervous that a lot of the changes in this commit seem to be things that I assumed were already in this repository.
This commit is contained in:
1 parent
63b2bd9a44
commit
76fdc51440
4 files changed
+442
-134
No files matched your search
+350
-61
@@ -25,6 +25,7 @@
|
||||
#include "trainer_see.h"
|
||||
#include "trainer_hill.h"
|
||||
#include "util.h"
|
||||
#include "follow_me.h"
|
||||
#include "constants/event_object_movement.h"
|
||||
#include "constants/event_objects.h"
|
||||
#include "constants/field_effects.h"
|
||||
@@ -32,6 +33,7 @@
|
||||
#include "constants/mauville_old_man.h"
|
||||
#include "constants/trainer_types.h"
|
||||
#include "constants/union_room.h"
|
||||
#include "constants/metatile_behaviors.h"
|
||||
|
||||
// this file was known as evobjmv.c in Game Freak's original source
|
||||
|
||||
@@ -80,6 +82,8 @@ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprit
|
||||
|
||||
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 bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *);
|
||||
static void SetMovementDelay(struct Sprite *, s16);
|
||||
@@ -115,6 +119,9 @@ static void InitObjectPriorityByElevation(struct Sprite *, u8);
|
||||
static void ObjectEventUpdateSubpriority(struct ObjectEvent*, struct Sprite*);
|
||||
static void DoTracksGroundEffect_None(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 DoRippleFieldEffect(struct ObjectEvent*, struct Sprite*);
|
||||
static void DoGroundEffects_OnSpawn(struct ObjectEvent*, struct Sprite*);
|
||||
@@ -139,7 +146,7 @@ static void SpawnObjectEventOnReturnToField(u8, s16, s16);
|
||||
static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8);
|
||||
static void ResetObjectEventFldEffData(struct ObjectEvent *);
|
||||
static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *);
|
||||
static u8 FindObjectEventPaletteIndexByTag(u16);
|
||||
static u16 FindObjectEventPaletteIndexByTag(u16);
|
||||
static void _PatchObjectPalette(u16, u8);
|
||||
static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8);
|
||||
static void SpriteCB_CameraObject(struct Sprite *);
|
||||
@@ -269,6 +276,7 @@ static void (*const sMovementTypeCallbacks[])(struct Sprite *) =
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = MovementType_WalkSlowlyInPlace,
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = MovementType_WalkSlowlyInPlace,
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = MovementType_WalkSlowlyInPlace,
|
||||
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = MovementType_FollowingPokemon,
|
||||
};
|
||||
|
||||
static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = {
|
||||
@@ -313,6 +321,7 @@ static const bool8 sMovementTypeHasRange[NUM_MOVEMENT_TYPES] = {
|
||||
[MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = TRUE,
|
||||
[MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = TRUE,
|
||||
[MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = TRUE,
|
||||
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = FALSE,
|
||||
};
|
||||
|
||||
const u8 gInitialMovementTypeFacingDirections[] = {
|
||||
@@ -397,6 +406,7 @@ const u8 gInitialMovementTypeFacingDirections[] = {
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP] = DIR_NORTH,
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT] = DIR_WEST,
|
||||
[MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT] = DIR_EAST,
|
||||
[MOVEMENT_TYPE_FOLLOWING_POKEMON] = DIR_SOUTH,
|
||||
};
|
||||
|
||||
#define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100
|
||||
@@ -1731,7 +1741,9 @@ u8 GetFirstInactiveObjectEventId(void)
|
||||
|
||||
u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId)
|
||||
{
|
||||
if (localId < OBJ_EVENT_ID_PLAYER)
|
||||
if (localId == OBJ_EVENT_ID_FOLLOWER)
|
||||
return GetFollowerObjectId();
|
||||
else if (localId < OBJ_EVENT_ID_PLAYER)
|
||||
return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId);
|
||||
|
||||
return GetObjectEventIdByLocalId(localId);
|
||||
@@ -1878,7 +1890,7 @@ static bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 *
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void RemoveObjectEvent(struct ObjectEvent *objectEvent)
|
||||
void RemoveObjectEvent(struct ObjectEvent *objectEvent)
|
||||
{
|
||||
objectEvent->active = FALSE;
|
||||
RemoveObjectEventInternal(objectEvent);
|
||||
@@ -1896,10 +1908,13 @@ void RemoveObjectEventByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
|
||||
|
||||
static void RemoveObjectEventInternal(struct ObjectEvent *objectEvent)
|
||||
{
|
||||
u8 paletteNum;
|
||||
struct SpriteFrameImage image;
|
||||
image.size = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->size;
|
||||
gSprites[objectEvent->spriteId].images = ℑ
|
||||
paletteNum = gSprites[objectEvent->spriteId].oam.paletteNum;
|
||||
DestroySprite(&gSprites[objectEvent->spriteId]);
|
||||
FieldEffectFreePaletteIfUnused(paletteNum);
|
||||
}
|
||||
|
||||
void RemoveAllObjectEventsExceptPlayer(void)
|
||||
@@ -1937,7 +1952,6 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
|
||||
if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE)
|
||||
objectEvent->invisible = TRUE;
|
||||
|
||||
*(u16 *)&spriteTemplate->paletteTag = TAG_NONE;
|
||||
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
|
||||
if (spriteId == MAX_SPRITES)
|
||||
{
|
||||
@@ -1964,7 +1978,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl
|
||||
return objectEventId;
|
||||
}
|
||||
|
||||
static u8 TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
|
||||
u8 TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY)
|
||||
{
|
||||
u8 objectEventId;
|
||||
struct SpriteTemplate spriteTemplate;
|
||||
@@ -2175,7 +2189,7 @@ void RemoveObjectEventsOutsideView(void)
|
||||
{
|
||||
struct ObjectEvent *objectEvent = &gObjectEvents[i];
|
||||
|
||||
if (objectEvent->active && !objectEvent->isPlayer)
|
||||
if (objectEvent->active && !objectEvent->isPlayer && i != GetFollowerObjectId())
|
||||
RemoveObjectEventIfOutsideView(objectEvent);
|
||||
}
|
||||
}
|
||||
@@ -2213,7 +2227,6 @@ void SpawnObjectEventsOnReturnToField(s16 x, s16 y)
|
||||
static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
|
||||
{
|
||||
u8 i;
|
||||
u8 paletteSlot;
|
||||
struct Sprite *sprite;
|
||||
struct ObjectEvent *objectEvent;
|
||||
struct SpriteTemplate spriteTemplate;
|
||||
@@ -2238,16 +2251,6 @@ static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y)
|
||||
LoadObjectEventPalette(spriteTemplate.paletteTag);
|
||||
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);
|
||||
if (i != MAX_SPRITES)
|
||||
@@ -2300,7 +2303,7 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI
|
||||
SetPlayerAvatarExtraStateTransition(gObjectEvents[objectEventId].graphicsId, PLAYER_AVATAR_FLAG_CONTROLLABLE);
|
||||
}
|
||||
|
||||
void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
|
||||
void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u16 graphicsId)
|
||||
{
|
||||
const struct ObjectEventGraphicsInfo *graphicsInfo;
|
||||
struct Sprite *sprite;
|
||||
@@ -2330,7 +2333,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId)
|
||||
CameraObjectReset1();
|
||||
}
|
||||
|
||||
void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId)
|
||||
void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u16 graphicsId)
|
||||
{
|
||||
u8 objectEventId;
|
||||
|
||||
@@ -2387,7 +2390,7 @@ static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite
|
||||
}
|
||||
}
|
||||
|
||||
const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId)
|
||||
const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u16 graphicsId)
|
||||
{
|
||||
u8 bard;
|
||||
|
||||
@@ -2514,7 +2517,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette
|
||||
|
||||
void PatchObjectPalette(u16 paletteTag, u8 paletteSlot)
|
||||
{
|
||||
u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag);
|
||||
u16 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag);
|
||||
|
||||
LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20);
|
||||
}
|
||||
@@ -2529,9 +2532,9 @@ void PatchObjectPaletteRange(const u16 *paletteTags, u8 minSlot, u8 maxSlot)
|
||||
}
|
||||
}
|
||||
|
||||
static u8 FindObjectEventPaletteIndexByTag(u16 tag)
|
||||
static u16 FindObjectEventPaletteIndexByTag(u16 tag)
|
||||
{
|
||||
u8 i;
|
||||
u16 i;
|
||||
|
||||
for (i = 0; sObjectEventSpritePalettes[i].tag != OBJ_EVENT_PAL_TAG_NONE; i++)
|
||||
{
|
||||
@@ -2877,7 +2880,7 @@ u8 GetObjectEventBerryTreeId(u8 objectEventId)
|
||||
return gObjectEvents[objectEventId].trainerRange_berryTreeId;
|
||||
}
|
||||
|
||||
static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
|
||||
struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
|
||||
{
|
||||
struct ObjectEventTemplate *templates;
|
||||
const struct MapHeader *mapHeader;
|
||||
@@ -3260,6 +3263,38 @@ u8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementT
|
||||
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)
|
||||
|
||||
bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
@@ -5148,8 +5183,9 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16
|
||||
for (i = 0; i < OBJECT_EVENTS_COUNT; i++)
|
||||
{
|
||||
curObject = &gObjectEvents[i];
|
||||
if (curObject->active && curObject != objectEvent)
|
||||
if (curObject->active && curObject != objectEvent && !FollowMe_IsCollisionExempt(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 (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation))
|
||||
@@ -5297,6 +5333,7 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct
|
||||
objectEvent->heldMovementActive = TRUE;
|
||||
objectEvent->heldMovementFinished = FALSE;
|
||||
gSprites[objectEvent->spriteId].sActionFuncId = 0;
|
||||
FollowMe(objectEvent, movementActionId, FALSE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -5397,6 +5434,41 @@ bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direc
|
||||
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(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions);
|
||||
dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions);
|
||||
@@ -5539,7 +5611,8 @@ static bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite
|
||||
{
|
||||
ShiftStillObjectEventCoords(objectEvent);
|
||||
objectEvent->triggerGroundEffectsOnStop = TRUE;
|
||||
sprite->animPaused = TRUE;
|
||||
if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]))
|
||||
sprite->animPaused = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
@@ -5773,7 +5846,19 @@ bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objec
|
||||
|
||||
bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -5789,7 +5874,19 @@ bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struc
|
||||
|
||||
bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -5805,7 +5902,19 @@ bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct
|
||||
|
||||
bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -5821,7 +5930,19 @@ bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struc
|
||||
|
||||
bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -5895,7 +6016,8 @@ static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite,
|
||||
ShiftStillObjectEventCoords(objectEvent);
|
||||
objectEvent->triggerGroundEffectsOnStop = TRUE;
|
||||
objectEvent->landingJump = TRUE;
|
||||
sprite->animPaused = TRUE;
|
||||
if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId]))
|
||||
sprite->animPaused = TRUE;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -5944,6 +6066,11 @@ static bool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *s
|
||||
|
||||
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);
|
||||
return MovementAction_Jump2Down_Step1(objectEvent, sprite);
|
||||
}
|
||||
@@ -5961,6 +6088,11 @@ bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Spr
|
||||
|
||||
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);
|
||||
return MovementAction_Jump2Up_Step1(objectEvent, sprite);
|
||||
}
|
||||
@@ -5978,6 +6110,11 @@ bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprit
|
||||
|
||||
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);
|
||||
return MovementAction_Jump2Left_Step1(objectEvent, sprite);
|
||||
}
|
||||
@@ -5995,6 +6132,11 @@ bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Spr
|
||||
|
||||
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);
|
||||
return MovementAction_Jump2Right_Step1(objectEvent, sprite);
|
||||
}
|
||||
@@ -6058,7 +6200,19 @@ bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprit
|
||||
|
||||
bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -6074,7 +6228,19 @@ bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct
|
||||
|
||||
bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -6090,7 +6256,19 @@ bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sp
|
||||
|
||||
bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -6106,7 +6284,19 @@ bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct
|
||||
|
||||
bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1);
|
||||
if(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -8290,6 +8480,9 @@ static void (*const sGroundEffectTracksFuncs[])(struct ObjectEvent *objEvent, st
|
||||
[TRACKS_NONE] = DoTracksGroundEffect_None,
|
||||
[TRACKS_FOOT] = DoTracksGroundEffect_Footprints,
|
||||
[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)
|
||||
@@ -8324,6 +8517,73 @@ static void DoTracksGroundEffect_Footprints(struct ObjectEvent *objEvent, struct
|
||||
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)
|
||||
{
|
||||
// Specifies which bike track shape to show next.
|
||||
@@ -8469,6 +8729,9 @@ static void DoFlaggedGroundEffects(struct ObjectEvent *objEvent, struct Sprite *
|
||||
|
||||
if (ObjectEventIsFarawayIslandMew(objEvent) == TRUE && !ShouldMewShakeGrass(objEvent))
|
||||
return;
|
||||
|
||||
if (gSaveBlock2Ptr->follower.inProgress && objEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId] && objEvent->invisible == TRUE)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1)
|
||||
if (flags & 1)
|
||||
@@ -9039,7 +9302,7 @@ void TurnVirtualObject(u8 virtualObjId, u8 direction)
|
||||
StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction));
|
||||
}
|
||||
|
||||
void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId)
|
||||
void SetVirtualObjectGraphics(u8 virtualObjId, u16 graphicsId)
|
||||
{
|
||||
int spriteId = GetVirtualObjectSpriteId(virtualObjId);
|
||||
|
||||
@@ -9515,16 +9778,16 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
|
||||
s16 y = objectEvent->currentCoords.y;
|
||||
u8 spriteId;
|
||||
bool8 playerPriority;
|
||||
|
||||
|
||||
sprite->data[7] = 1;
|
||||
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
|
||||
InitSpriteAffineAnim(sprite);
|
||||
|
||||
|
||||
if (objectEvent->facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY)
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
else
|
||||
StartSpriteAffineAnim(sprite, 0);
|
||||
|
||||
|
||||
if (y == gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y) // If follower is to the east or west of player
|
||||
{
|
||||
SetSpritePosToOffsetMapCoords(&x, &y, 8, 8);
|
||||
@@ -9631,17 +9894,17 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
|
||||
gSprites[spriteId].oam.priority = 2;
|
||||
gSprites[spriteId].data[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
if (playerPriority)
|
||||
{
|
||||
gSprites[gPlayerAvatar.spriteId].oam.priority = 1;
|
||||
gSprites[gPlayerAvatar.spriteId].subpriority = 1;
|
||||
gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = TRUE;
|
||||
}
|
||||
|
||||
|
||||
sprite->oam.priority = 1;
|
||||
sprite->subpriority = 1;
|
||||
|
||||
|
||||
sprite->data[2]++;
|
||||
return FALSE;
|
||||
}
|
||||
@@ -9649,7 +9912,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step0(struct ObjectEvent *objectEvent,
|
||||
u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[7]++;
|
||||
|
||||
|
||||
if (objectEvent->currentCoords.x > gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x) // east side
|
||||
{
|
||||
switch(objectEvent->facingDirection)
|
||||
@@ -9674,7 +9937,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
|
||||
sprite->x2 += 1 - sprite->data[7];
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Adjust the height of the 64x64 sprites differently
|
||||
if (IsBigSprite(objectEvent->graphicsId))
|
||||
{
|
||||
@@ -9723,7 +9986,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
|
||||
sprite->x2 -= 8;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Adjust the height of the 64x64 sprites differently
|
||||
if (IsBigSprite(objectEvent->graphicsId))
|
||||
{
|
||||
@@ -9765,7 +10028,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
|
||||
sprite->x2 -= 7;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Adjust the height of the 64x64 sprites differently
|
||||
if (IsBigSprite(objectEvent->graphicsId))
|
||||
{
|
||||
@@ -9802,7 +10065,7 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
|
||||
sprite->x2 -= 7;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Adjust the height of the 64x64 sprites differently
|
||||
if (IsBigSprite(objectEvent->graphicsId))
|
||||
{
|
||||
@@ -9821,11 +10084,12 @@ u8 MovementAction_FollowingPokemon_Shrink_Step1(struct ObjectEvent *objectEvent,
|
||||
sprite->y2 = 6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (sprite->data[7] >= 11)
|
||||
{
|
||||
FreeSpriteOamMatrix(sprite);
|
||||
gObjectEvents[gPlayerAvatar.objectEventId].fixedPriority = FALSE;
|
||||
gPlayerAvatar.preventStep = FALSE;
|
||||
objectEvent->invisible = TRUE;
|
||||
sprite->data[2]++;
|
||||
}
|
||||
@@ -9838,12 +10102,12 @@ u8 MovementAction_FollowingPokemon_Grow_Step0(struct ObjectEvent *objectEvent, s
|
||||
sprite->data[7] = 11;
|
||||
sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL;
|
||||
InitSpriteAffineAnim(sprite);
|
||||
|
||||
|
||||
if (gObjectEvents[gPlayerAvatar.objectEventId].facingDirection == DIR_EAST && GetObjectEventGraphicsInfo(objectEvent->graphicsId)->anims != gObjectEventImageAnimTable_FollowingPokemon_UniqueEast && objectEvent->graphicsId != OBJ_EVENT_GFX_KRABBY)
|
||||
StartSpriteAffineAnim(sprite, 3);
|
||||
else
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
|
||||
|
||||
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
|
||||
{
|
||||
case DIR_SOUTH:
|
||||
@@ -9870,10 +10134,10 @@ u8 MovementAction_FollowingPokemon_Grow_Step0(struct ObjectEvent *objectEvent, s
|
||||
u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[7]--;
|
||||
|
||||
|
||||
if (sprite->data[7] == 10)
|
||||
gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible = FALSE;
|
||||
|
||||
|
||||
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
|
||||
{
|
||||
case DIR_SOUTH:
|
||||
@@ -9897,12 +10161,12 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
sprite->x2 += -5;
|
||||
else
|
||||
sprite->x2 += 1 - sprite->data[7];
|
||||
|
||||
|
||||
if (sprite->data[7] >= 10)
|
||||
sprite->y2 = 10;
|
||||
else
|
||||
sprite->y2 = sprite->data[7];
|
||||
|
||||
|
||||
break;
|
||||
case DIR_EAST:
|
||||
if (sprite->data[7] <= 5)
|
||||
@@ -9916,15 +10180,15 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
sprite->x2 -= -4;
|
||||
else
|
||||
sprite->x2 -= 2 - sprite->data[7];
|
||||
|
||||
|
||||
if (sprite->data[7] >= 10)
|
||||
sprite->y2 = 10;
|
||||
else
|
||||
sprite->y2 = sprite->data[7];
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Adjust the height of the 64x64 sprites differently
|
||||
if (IsBigSprite(objectEvent->graphicsId))
|
||||
{
|
||||
@@ -9941,7 +10205,7 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
else
|
||||
sprite->y2 -= (11 - sprite->data[7]) + 7;
|
||||
}
|
||||
|
||||
|
||||
if (sprite->data[7] <= 1)
|
||||
{
|
||||
// Set y2 of the 64x64 sprites back to 0, and compensate with y.
|
||||
@@ -9950,7 +10214,7 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
sprite->y -= 16;
|
||||
sprite->y2 = 0;
|
||||
}
|
||||
|
||||
|
||||
FreeSpriteOamMatrix(sprite);
|
||||
|
||||
// Make sure water ripples at the feet of the follower if they are appearing on top of shallow water.
|
||||
@@ -9959,10 +10223,10 @@ u8 MovementAction_FollowingPokemon_Grow_Step1(struct ObjectEvent *objectEvent, s
|
||||
objectEvent->inShallowFlowingWater = TRUE;
|
||||
StartFieldEffectForObjectEvent(FLDEFF_FEET_IN_FLOWING_WATER, objectEvent);
|
||||
}
|
||||
|
||||
gPlayerAvatar.preventStep = FALSE;
|
||||
sprite->data[2]++;
|
||||
}
|
||||
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -9971,3 +10235,28 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr
|
||||
{
|
||||
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;
|
||||
}
|
||||
+12
-10
@@ -20,6 +20,7 @@
|
||||
#include "strings.h"
|
||||
#include "task.h"
|
||||
#include "tv.h"
|
||||
#include "follow_me.h"
|
||||
#include "wild_encounter.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/event_objects.h"
|
||||
@@ -1217,32 +1218,32 @@ void StopPlayerAvatar(void)
|
||||
}
|
||||
}
|
||||
|
||||
u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
|
||||
u16 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
|
||||
{
|
||||
return sRivalAvatarGfxIds[state][gender];
|
||||
}
|
||||
|
||||
u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
|
||||
u16 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender)
|
||||
{
|
||||
return sPlayerAvatarGfxIds[state][gender];
|
||||
}
|
||||
|
||||
u8 GetFRLGAvatarGraphicsIdByGender(u8 gender)
|
||||
u16 GetFRLGAvatarGraphicsIdByGender(u8 gender)
|
||||
{
|
||||
return sFRLGAvatarGfxIds[gender];
|
||||
}
|
||||
|
||||
u8 GetRSAvatarGraphicsIdByGender(u8 gender)
|
||||
u16 GetRSAvatarGraphicsIdByGender(u8 gender)
|
||||
{
|
||||
return sRSAvatarGfxIds[gender];
|
||||
}
|
||||
|
||||
u8 GetPlayerAvatarGraphicsIdByStateId(u8 state)
|
||||
u16 GetPlayerAvatarGraphicsIdByStateId(u8 state)
|
||||
{
|
||||
return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender);
|
||||
}
|
||||
|
||||
u8 unref_GetRivalAvatarGenderByGraphicsId(u8 gfxId)
|
||||
u8 unref_GetRivalAvatarGenderByGraphicsId(u16 gfxId)
|
||||
{
|
||||
switch (gfxId)
|
||||
{
|
||||
@@ -1260,7 +1261,7 @@ u8 unref_GetRivalAvatarGenderByGraphicsId(u8 gfxId)
|
||||
}
|
||||
}
|
||||
|
||||
u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId)
|
||||
u8 GetPlayerAvatarGenderByGraphicsId(u16 gfxId)
|
||||
{
|
||||
switch (gfxId)
|
||||
{
|
||||
@@ -1329,7 +1330,7 @@ void SetPlayerAvatarStateMask(u8 flags)
|
||||
gPlayerAvatar.flags |= flags;
|
||||
}
|
||||
|
||||
static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender)
|
||||
static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
@@ -1341,7 +1342,7 @@ static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender)
|
||||
return PLAYER_AVATAR_FLAG_ON_FOOT;
|
||||
}
|
||||
|
||||
u8 GetPlayerAvatarGraphicsIdByCurrentState(void)
|
||||
u16 GetPlayerAvatarGraphicsIdByCurrentState(void)
|
||||
{
|
||||
u8 i;
|
||||
u8 flags = gPlayerAvatar.flags;
|
||||
@@ -1354,7 +1355,7 @@ u8 GetPlayerAvatarGraphicsIdByCurrentState(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 transitionFlag)
|
||||
void SetPlayerAvatarExtraStateTransition(u16 graphicsId, u8 transitionFlag)
|
||||
{
|
||||
u8 stateFlag = GetPlayerAvatarStateTransitionByGraphicsId(graphicsId, gPlayerAvatar.gender);
|
||||
|
||||
@@ -1392,6 +1393,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender)
|
||||
gPlayerAvatar.spriteId = objectEvent->spriteId;
|
||||
gPlayerAvatar.gender = gender;
|
||||
SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT);
|
||||
CreateFollowerAvatar();
|
||||
}
|
||||
|
||||
void SetPlayerInvisibility(bool8 invisible)
|
||||
|
||||
+13
-8
@@ -251,20 +251,25 @@ void FollowMe(struct ObjectEvent* npc, u8 state, bool8 ignoreScriptActive)
|
||||
|
||||
if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 1)
|
||||
{
|
||||
gPlayerAvatar.preventStep = TRUE;
|
||||
taskId = CreateTask(Task_FollowerOutOfDoor, 1);
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[2] = follower->currentCoords.x;
|
||||
gTasks[taskId].data[3] = follower->currentCoords.y;
|
||||
goto RESET;
|
||||
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE))
|
||||
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0;
|
||||
else
|
||||
{
|
||||
gPlayerAvatar.preventStep = TRUE;
|
||||
taskId = CreateTask(Task_FollowerOutOfDoor, 1);
|
||||
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)
|
||||
{
|
||||
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0;
|
||||
}
|
||||
|
||||
// This makes sure the follower is still invisible after diving or surfacing
|
||||
if(!(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)))
|
||||
// This makes sure the follower is still invisible after diving or surfacing or exiting a door while player is on a bike
|
||||
if(!(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_BIKE)))
|
||||
follower->invisible = FALSE;
|
||||
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
|
||||
|
||||
+67
-55
@@ -39,7 +39,6 @@
|
||||
#include "new_game.h"
|
||||
#include "palette.h"
|
||||
#include "play_time.h"
|
||||
#include "pokemon.h"
|
||||
#include "random.h"
|
||||
#include "roamer.h"
|
||||
#include "rotating_gate.h"
|
||||
@@ -61,6 +60,7 @@
|
||||
#include "scanline_effect.h"
|
||||
#include "wild_encounter.h"
|
||||
#include "frontier_util.h"
|
||||
#include "follow_me.h"
|
||||
#include "constants/abilities.h"
|
||||
#include "constants/layouts.h"
|
||||
#include "constants/map_types.h"
|
||||
@@ -877,6 +877,7 @@ void DoWhiteOut(void)
|
||||
HealPlayerParty();
|
||||
Overworld_ResetStateAfterWhiteOut();
|
||||
SetWarpDestinationToLastHealLocation();
|
||||
UpdateFollowerPokemonGraphic();
|
||||
WarpIntoMap();
|
||||
}
|
||||
|
||||
@@ -926,6 +927,8 @@ static void Overworld_ResetStateAfterWhiteOut(void)
|
||||
VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 0);
|
||||
VarSet(VAR_ABNORMAL_WEATHER_LOCATION, ABNORMAL_WEATHER_NONE);
|
||||
}
|
||||
|
||||
FollowMe_TryRemoveFollowerOnWhiteOut();
|
||||
}
|
||||
|
||||
static void UpdateMiscOverworldStates(void)
|
||||
@@ -1956,6 +1959,10 @@ static void DoCB1_Overworld(u16 newKeys, u16 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)
|
||||
@@ -1991,6 +1998,20 @@ void CB2_Overworld(void)
|
||||
OverworldBasic();
|
||||
if (fading)
|
||||
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)
|
||||
@@ -2173,6 +2194,7 @@ void CB2_ReturnToFieldWithOpenMenu(void)
|
||||
{
|
||||
FieldClearVBlankHBlankCallbacks();
|
||||
gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu;
|
||||
UpdateFollowerPokemonGraphic();
|
||||
CB2_ReturnToField();
|
||||
}
|
||||
|
||||
@@ -2639,10 +2661,7 @@ static void ResumeMap(bool32 a1)
|
||||
ResetAllPicSprites();
|
||||
ResetCameraUpdateInfo();
|
||||
InstallCameraPanAheadCallback();
|
||||
if (!a1)
|
||||
InitObjectEventPalettes(0);
|
||||
else
|
||||
InitObjectEventPalettes(1);
|
||||
FreeAllSpritePalettes();
|
||||
|
||||
FieldEffectActiveListClear();
|
||||
StartWeather();
|
||||
@@ -2677,6 +2696,7 @@ static void InitObjectEventsLocal(void)
|
||||
ResetInitialPlayerAvatarState();
|
||||
TrySpawnObjectEvents(0, 0);
|
||||
TryRunOnWarpIntoMapScript();
|
||||
FollowMe_HandleSprite();
|
||||
}
|
||||
|
||||
static void InitObjectEventsReturnToField(void)
|
||||
@@ -3736,15 +3756,6 @@ void UpdateFollowerPokemonGraphic(void)
|
||||
u16 leadMonGraphicId = GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_SPECIES, NULL) + OBJ_EVENT_GFX_BULBASAUR - 1;
|
||||
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)
|
||||
{
|
||||
// Sets the follower's graphic data to the proper following Pokemon graphic data
|
||||
@@ -3840,7 +3851,7 @@ static void BigSparkleCallback(struct Sprite *sprite)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (++sprite->data[0] >= 19)
|
||||
{
|
||||
FreeSpriteOamMatrix(sprite);
|
||||
@@ -3865,7 +3876,7 @@ bool8 IsBigSprite(u16 graphicsId)
|
||||
static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[0]++;
|
||||
|
||||
|
||||
if (sprite->data[0] >= 10)
|
||||
{
|
||||
struct ObjectEvent *player = &gObjectEvents[gPlayerAvatar.objectEventId];
|
||||
@@ -3874,60 +3885,58 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
s16 y = gSprites[follower->spriteId].y;
|
||||
u8 spriteId;
|
||||
u16 graphicsId;
|
||||
|
||||
|
||||
DestroySprite(sprite);
|
||||
|
||||
gSprites[follower->spriteId].oam.priority = ElevationToPriority(follower->previousElevation);
|
||||
gSprites[gPlayerAvatar.spriteId].oam.priority = ElevationToPriority(player->previousElevation);
|
||||
player->fixedPriority = FALSE;
|
||||
|
||||
|
||||
// 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
|
||||
else if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_CELEBI) // Gen 3+ OBJ_EVENT_GFX constants are 25 too high due to OLD_UNOWN constants.
|
||||
// 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;
|
||||
#endif
|
||||
else
|
||||
#endif
|
||||
graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR;
|
||||
|
||||
|
||||
switch(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)
|
||||
{
|
||||
case DIR_SOUTH:
|
||||
x -= 16 - FollowerSparkleCoords[graphicsId][0];
|
||||
if (IsBigSprite(follower->graphicsId))
|
||||
x -= 16;
|
||||
|
||||
|
||||
y += 16 - FollowerSparkleCoords[graphicsId][1];
|
||||
|
||||
|
||||
break;
|
||||
case DIR_NORTH:
|
||||
x -= 16 - FollowerSparkleCoords[graphicsId][2];
|
||||
if (IsBigSprite(follower->graphicsId))
|
||||
x -= 16;
|
||||
|
||||
|
||||
y += 16 - FollowerSparkleCoords[graphicsId][3];
|
||||
|
||||
|
||||
break;
|
||||
case DIR_EAST:
|
||||
x += 7 - FollowerSparkleCoords[graphicsId][4]; // 7 looks better than 8
|
||||
if (IsBigSprite(follower->graphicsId))
|
||||
x += 16;
|
||||
|
||||
|
||||
y += 16 - FollowerSparkleCoords[graphicsId][5];
|
||||
|
||||
|
||||
break;
|
||||
case DIR_WEST:
|
||||
x -= 8 - FollowerSparkleCoords[graphicsId][4];
|
||||
if (IsBigSprite(follower->graphicsId))
|
||||
x -= 16;
|
||||
|
||||
|
||||
y += 16 - FollowerSparkleCoords[graphicsId][5];
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (IsBigSprite(follower->graphicsId))
|
||||
{
|
||||
// North sparkle
|
||||
@@ -3942,7 +3951,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 0);
|
||||
}
|
||||
|
||||
|
||||
// NorthEast sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -3955,7 +3964,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 1);
|
||||
}
|
||||
|
||||
|
||||
// East sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -3968,7 +3977,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 2);
|
||||
}
|
||||
|
||||
|
||||
// SouthEast sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -3981,7 +3990,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 3);
|
||||
}
|
||||
|
||||
|
||||
// South sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -3994,7 +4003,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 4);
|
||||
}
|
||||
|
||||
|
||||
// SouthWest sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4007,7 +4016,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 5);
|
||||
}
|
||||
|
||||
|
||||
// West sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4020,7 +4029,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 6);
|
||||
}
|
||||
|
||||
|
||||
// NorthWest sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &BigSparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4047,7 +4056,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 0);
|
||||
}
|
||||
|
||||
|
||||
// NorthEast sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4059,7 +4068,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 1);
|
||||
}
|
||||
|
||||
|
||||
// East sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4071,7 +4080,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 2);
|
||||
}
|
||||
|
||||
|
||||
// SouthEast sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4083,7 +4092,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 3);
|
||||
}
|
||||
|
||||
|
||||
// South sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4095,7 +4104,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 4);
|
||||
}
|
||||
|
||||
|
||||
// SouthWest sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4107,7 +4116,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 5);
|
||||
}
|
||||
|
||||
|
||||
// West sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4119,7 +4128,7 @@ static void SparklePokeballCallback(struct Sprite *sprite)
|
||||
InitSpriteAffineAnim(&gSprites[spriteId]);
|
||||
StartSpriteAffineAnim(&gSprites[spriteId], 6);
|
||||
}
|
||||
|
||||
|
||||
// NorthWest sparkle
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_EXPANDING_SPARKLE, &SparkleCallback, x, y, 0);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
@@ -4144,7 +4153,7 @@ void FollowerPokeballSparkle(void)
|
||||
s16 x = player->currentCoords.x;
|
||||
s16 y = player->currentCoords.y;
|
||||
u8 spriteId;
|
||||
|
||||
|
||||
switch(player->facingDirection)
|
||||
{
|
||||
case DIR_SOUTH:
|
||||
@@ -4162,7 +4171,7 @@ void FollowerPokeballSparkle(void)
|
||||
break;
|
||||
}
|
||||
gSprites[follower->spriteId].x = x;
|
||||
|
||||
|
||||
switch(GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_POKEBALL))
|
||||
{
|
||||
case ITEM_MASTER_BALL:
|
||||
@@ -4246,20 +4255,20 @@ void FollowerPokeballSparkle(void)
|
||||
spriteId = CreateObjectGraphicsSprite(OBJ_EVENT_GFX_ITEM_BALL, &SparklePokeballCallback, x, y, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
gSprites[spriteId].coordOffsetEnabled = TRUE;
|
||||
gSprites[spriteId].oam.priority = 2;
|
||||
gSprites[spriteId].data[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
follower->currentCoords.x = player->currentCoords.x;
|
||||
follower->currentCoords.y = player->currentCoords.y;
|
||||
follower->facingDirection = player->facingDirection;
|
||||
|
||||
|
||||
gSprites[follower->spriteId].animNum = player->facingDirection - 1;
|
||||
|
||||
|
||||
if (player->facingDirection == DIR_NORTH)
|
||||
{
|
||||
gSprites[follower->spriteId].oam.priority = 0;
|
||||
@@ -4275,7 +4284,8 @@ void FollowerPokeballSparkle(void)
|
||||
gSprites[gPlayerAvatar.spriteId].subpriority = 0;
|
||||
}
|
||||
player->fixedPriority = TRUE;
|
||||
|
||||
gPlayerAvatar.preventStep = TRUE;
|
||||
|
||||
SeekSpriteAnim(&gSprites[follower->spriteId], 0);
|
||||
ObjectEventForceSetHeldMovement(follower, MOVEMENT_ACTION_FOLLOWING_POKEMON_GROW);
|
||||
}
|
||||
@@ -4283,8 +4293,10 @@ void FollowerPokeballSparkle(void)
|
||||
|
||||
void FollowerIntoPokeball(void)
|
||||
{
|
||||
if (gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible == FALSE && gSaveBlock2Ptr->follower.comeOutDoorStairs == 0 && gSaveBlock2Ptr->follower.inProgress)
|
||||
if (gObjectEvents[gSaveBlock2Ptr->follower.objId].invisible == FALSE && gSaveBlock2Ptr->follower.inProgress)
|
||||
{
|
||||
gSaveBlock2Ptr->follower.comeOutDoorStairs = 0;
|
||||
gPlayerAvatar.preventStep = TRUE;
|
||||
ObjectEventForceSetHeldMovement(&gObjectEvents[gSaveBlock2Ptr->follower.objId], MOVEMENT_ACTION_FOLLOWING_POKEMON_SHRINK);
|
||||
gSpecialVar_Unused_0x8014 = 1;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user