diff --git a/src/event_object_movement.c b/src/event_object_movement.c index ad259841c..6b2742c92 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -25,7 +25,6 @@ #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" @@ -33,7 +32,6 @@ #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 @@ -82,8 +80,6 @@ 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); @@ -119,9 +115,6 @@ 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*); @@ -146,7 +139,7 @@ static void SpawnObjectEventOnReturnToField(u8, s16, s16); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); static void ResetObjectEventFldEffData(struct ObjectEvent *); static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *); -static u16 FindObjectEventPaletteIndexByTag(u16); +static u8 FindObjectEventPaletteIndexByTag(u16); static void _PatchObjectPalette(u16, u8); static bool8 ObjectEventDoesElevationMatch(struct ObjectEvent *, u8); 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_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] = { @@ -321,7 +313,6 @@ 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[] = { @@ -406,7 +397,6 @@ 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 @@ -1741,9 +1731,7 @@ u8 GetFirstInactiveObjectEventId(void) u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) { - if (localId == OBJ_EVENT_ID_FOLLOWER) - return GetFollowerObjectId(); - else if (localId < OBJ_EVENT_ID_PLAYER) + if (localId < OBJ_EVENT_ID_PLAYER) return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); return GetObjectEventIdByLocalId(localId); @@ -1890,7 +1878,7 @@ static bool8 GetAvailableObjectEventId(u16 localId, u8 mapNum, u8 mapGroup, u8 * return FALSE; } -void RemoveObjectEvent(struct ObjectEvent *objectEvent) +static void RemoveObjectEvent(struct ObjectEvent *objectEvent) { objectEvent->active = FALSE; RemoveObjectEventInternal(objectEvent); @@ -1908,13 +1896,10 @@ 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) @@ -1952,6 +1937,7 @@ 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) { @@ -1978,7 +1964,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl 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; struct SpriteTemplate spriteTemplate; @@ -2189,7 +2175,7 @@ void RemoveObjectEventsOutsideView(void) { struct ObjectEvent *objectEvent = &gObjectEvents[i]; - if (objectEvent->active && !objectEvent->isPlayer && i != GetFollowerObjectId()) + if (objectEvent->active && !objectEvent->isPlayer) RemoveObjectEventIfOutsideView(objectEvent); } } @@ -2227,6 +2213,7 @@ 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; @@ -2251,6 +2238,16 @@ 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) @@ -2303,7 +2300,7 @@ static void SetPlayerAvatarObjectEventIdAndObjectId(u8 objectEventId, u8 spriteI 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; struct Sprite *sprite; @@ -2333,7 +2330,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u16 graphicsId) CameraObjectReset1(); } -void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u16 graphicsId) +void ObjectEventSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) { 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; @@ -2517,7 +2514,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) { - u16 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); + u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); 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++) { @@ -2880,7 +2877,7 @@ u8 GetObjectEventBerryTreeId(u8 objectEventId) 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; const struct MapHeader *mapHeader; @@ -3263,38 +3260,6 @@ 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) @@ -5183,9 +5148,8 @@ static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *objectEvent, s16 for (i = 0; i < OBJECT_EVENTS_COUNT; 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 (AreElevationsCompatible(objectEvent->currentElevation, curObject->currentElevation)) @@ -5333,7 +5297,6 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct objectEvent->heldMovementActive = TRUE; objectEvent->heldMovementFinished = FALSE; gSprites[objectEvent->spriteId].sActionFuncId = 0; - FollowMe(objectEvent, movementActionId, FALSE); return FALSE; } @@ -5434,41 +5397,6 @@ 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); @@ -5611,8 +5539,7 @@ static bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; - if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])) - sprite->animPaused = TRUE; + sprite->animPaused = TRUE; return TRUE; } return FALSE; @@ -5846,19 +5773,7 @@ bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objec bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_NORMAL); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_NORMAL); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_NORMAL); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_NORMAL); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); } @@ -6016,8 +5895,7 @@ static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; objectEvent->landingJump = TRUE; - if (!(gSaveBlock2Ptr->follower.inProgress && objectEvent == &gObjectEvents[gSaveBlock2Ptr->follower.objId])) - sprite->animPaused = TRUE; + sprite->animPaused = TRUE; } 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) { - 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); } @@ -6088,11 +5961,6 @@ 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); } @@ -6110,11 +5978,6 @@ 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); } @@ -6132,11 +5995,6 @@ 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); } @@ -6200,19 +6058,7 @@ bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, MOVE_SPEED_FAST_1); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, MOVE_SPEED_FAST_1); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_WEST, MOVE_SPEED_FAST_1); 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) { - 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); + InitMovementNormal(objectEvent, sprite, DIR_EAST, MOVE_SPEED_FAST_1); return MovementAction_WalkFastRight_Step1(objectEvent, sprite); } @@ -8480,9 +8290,6 @@ 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) @@ -8517,73 +8324,6 @@ 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. @@ -8729,9 +8469,6 @@ 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) @@ -9302,7 +9039,7 @@ void TurnVirtualObject(u8 virtualObjId, u8 direction) StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(direction)); } -void SetVirtualObjectGraphics(u8 virtualObjId, u16 graphicsId) +void SetVirtualObjectGraphics(u8 virtualObjId, u8 graphicsId) { int spriteId = GetVirtualObjectSpriteId(virtualObjId); @@ -9778,16 +9515,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); @@ -9894,17 +9631,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; } @@ -9912,7 +9649,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) @@ -9937,7 +9674,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)) { @@ -9986,7 +9723,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)) { @@ -10028,7 +9765,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)) { @@ -10065,7 +9802,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)) { @@ -10084,12 +9821,11 @@ 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]++; } @@ -10102,12 +9838,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: @@ -10134,10 +9870,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: @@ -10161,12 +9897,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) @@ -10180,15 +9916,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)) { @@ -10205,7 +9941,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. @@ -10214,7 +9950,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. @@ -10223,10 +9959,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; } @@ -10235,28 +9971,3 @@ 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; -} diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 60b23ced8..a3a6ed342 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -20,7 +20,6 @@ #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" @@ -1218,32 +1217,32 @@ void StopPlayerAvatar(void) } } -u16 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return sRivalAvatarGfxIds[state][gender]; } -u16 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) +u8 GetPlayerAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender) { return sPlayerAvatarGfxIds[state][gender]; } -u16 GetFRLGAvatarGraphicsIdByGender(u8 gender) +u8 GetFRLGAvatarGraphicsIdByGender(u8 gender) { return sFRLGAvatarGfxIds[gender]; } -u16 GetRSAvatarGraphicsIdByGender(u8 gender) +u8 GetRSAvatarGraphicsIdByGender(u8 gender) { return sRSAvatarGfxIds[gender]; } -u16 GetPlayerAvatarGraphicsIdByStateId(u8 state) +u8 GetPlayerAvatarGraphicsIdByStateId(u8 state) { return GetPlayerAvatarGraphicsIdByStateIdAndGender(state, gPlayerAvatar.gender); } -u8 unref_GetRivalAvatarGenderByGraphicsId(u16 gfxId) +u8 unref_GetRivalAvatarGenderByGraphicsId(u8 gfxId) { switch (gfxId) { @@ -1261,7 +1260,7 @@ u8 unref_GetRivalAvatarGenderByGraphicsId(u16 gfxId) } } -u8 GetPlayerAvatarGenderByGraphicsId(u16 gfxId) +u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId) { switch (gfxId) { @@ -1330,7 +1329,7 @@ void SetPlayerAvatarStateMask(u8 flags) gPlayerAvatar.flags |= flags; } -static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender) +static u8 GetPlayerAvatarStateTransitionByGraphicsId(u8 graphicsId, u8 gender) { u8 i; @@ -1342,7 +1341,7 @@ static u8 GetPlayerAvatarStateTransitionByGraphicsId(u16 graphicsId, u8 gender) return PLAYER_AVATAR_FLAG_ON_FOOT; } -u16 GetPlayerAvatarGraphicsIdByCurrentState(void) +u8 GetPlayerAvatarGraphicsIdByCurrentState(void) { u8 i; u8 flags = gPlayerAvatar.flags; @@ -1355,7 +1354,7 @@ u16 GetPlayerAvatarGraphicsIdByCurrentState(void) return 0; } -void SetPlayerAvatarExtraStateTransition(u16 graphicsId, u8 transitionFlag) +void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 transitionFlag) { 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.gender = gender; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_CONTROLLABLE | PLAYER_AVATAR_FLAG_ON_FOOT); - CreateFollowerAvatar(); } void SetPlayerInvisibility(bool8 invisible) diff --git a/src/follow_me.c b/src/follow_me.c index f6d26100f..c1bd932c6 100644 --- a/src/follow_me.c +++ b/src/follow_me.c @@ -251,25 +251,20 @@ void FollowMe(struct ObjectEvent* npc, u8 state, bool8 ignoreScriptActive) if (gSaveBlock2Ptr->follower.comeOutDoorStairs == 1) { - 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; - } + 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 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))) + // This makes sure the follower is still invisible after diving or surfacing + if(!(TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_UNDERWATER) || TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))) 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 diff --git a/src/overworld.c b/src/overworld.c index b37f7e665..d4fbaf29d 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -39,6 +39,7 @@ #include "new_game.h" #include "palette.h" #include "play_time.h" +#include "pokemon.h" #include "random.h" #include "roamer.h" #include "rotating_gate.h" @@ -60,7 +61,6 @@ #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,7 +877,6 @@ void DoWhiteOut(void) HealPlayerParty(); Overworld_ResetStateAfterWhiteOut(); SetWarpDestinationToLastHealLocation(); - UpdateFollowerPokemonGraphic(); WarpIntoMap(); } @@ -927,8 +926,6 @@ 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) @@ -1959,10 +1956,6 @@ 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) @@ -1998,20 +1991,6 @@ 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) @@ -2194,7 +2173,6 @@ void CB2_ReturnToFieldWithOpenMenu(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback2 = FieldCB_ReturnToFieldOpenStartMenu; - UpdateFollowerPokemonGraphic(); CB2_ReturnToField(); } @@ -2661,7 +2639,10 @@ static void ResumeMap(bool32 a1) ResetAllPicSprites(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); - FreeAllSpritePalettes(); + if (!a1) + InitObjectEventPalettes(0); + else + InitObjectEventPalettes(1); FieldEffectActiveListClear(); StartWeather(); @@ -2696,7 +2677,6 @@ static void InitObjectEventsLocal(void) ResetInitialPlayerAvatarState(); TrySpawnObjectEvents(0, 0); TryRunOnWarpIntoMapScript(); - FollowMe_HandleSprite(); } 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; 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 @@ -3851,7 +3840,7 @@ static void BigSparkleCallback(struct Sprite *sprite) break; } } - + if (++sprite->data[0] >= 19) { FreeSpriteOamMatrix(sprite); @@ -3876,7 +3865,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]; @@ -3885,58 +3874,60 @@ 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 - // Gen 3+ OBJ_EVENT_GFX constants are 25 too high due to OLD_UNOWN constants. - if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_CELEBI) + else if (gSaveBlock2Ptr->follower.graphicsId > OBJ_EVENT_GFX_CELEBI) // Gen 3+ OBJ_EVENT_GFX constants are 25 too high due to OLD_UNOWN constants. graphicsId = gSaveBlock2Ptr->follower.graphicsId - OBJ_EVENT_GFX_BULBASAUR - 25; - else #endif + else 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 @@ -3951,7 +3942,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) @@ -3964,7 +3955,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) @@ -3977,7 +3968,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) @@ -3990,7 +3981,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) @@ -4003,7 +3994,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) @@ -4016,7 +4007,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) @@ -4029,7 +4020,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) @@ -4056,7 +4047,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) @@ -4068,7 +4059,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) @@ -4080,7 +4071,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) @@ -4092,7 +4083,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) @@ -4104,7 +4095,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) @@ -4116,7 +4107,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) @@ -4128,7 +4119,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) @@ -4153,7 +4144,7 @@ void FollowerPokeballSparkle(void) s16 x = player->currentCoords.x; s16 y = player->currentCoords.y; u8 spriteId; - + switch(player->facingDirection) { case DIR_SOUTH: @@ -4171,7 +4162,7 @@ void FollowerPokeballSparkle(void) break; } gSprites[follower->spriteId].x = x; - + switch(GetMonData(&gPlayerParty[GetLeadMonNotFaintedIndex()], MON_DATA_POKEBALL)) { case ITEM_MASTER_BALL: @@ -4255,20 +4246,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; @@ -4284,8 +4275,7 @@ 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); } @@ -4293,10 +4283,8 @@ void FollowerPokeballSparkle(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); gSpecialVar_Unused_0x8014 = 1; }