From d3d29d7cb565aeb39952c4b4c0945cabb4d304c9 Mon Sep 17 00:00:00 2001 From: Evan Date: Fri, 19 Jun 2020 23:40:12 -0600 Subject: [PATCH] cherry pick 0cccbfd0ba608287d5f2b642ea613d9674cd919d --- include/constants/event_object_movement.h | 18 +- include/constants/global.h | 2 - include/event_object_movement.h | 16 +- include/field_player_avatar.h | 4 - include/global.fieldmap.h | 3 +- include/metatile_behavior.h | 1 - src/bike.c | 95 +-- .../movement_action_func_tables.h | 130 ---- src/event_object_movement.c | 693 +++++++++--------- src/field_control_avatar.c | 46 +- src/field_player_avatar.c | 127 +--- src/metatile_behavior.c | 7 - 12 files changed, 451 insertions(+), 691 deletions(-) diff --git a/include/constants/event_object_movement.h b/include/constants/event_object_movement.h index 5172e12d51..7a02b2b976 100755 --- a/include/constants/event_object_movement.h +++ b/include/constants/event_object_movement.h @@ -241,27 +241,11 @@ #define MOVEMENT_ACTION_FIGURE_8 0x9B #define MOVEMENT_ACTION_FLY_UP 0x9C #define MOVEMENT_ACTION_FLY_DOWN 0x9D -// slow running (for stairs) +// slow running #define MOVEMENT_ACTION_RUN_DOWN_SLOW 0x9E #define MOVEMENT_ACTION_RUN_UP_SLOW 0x9F #define MOVEMENT_ACTION_RUN_LEFT_SLOW 0xA0 #define MOVEMENT_ACTION_RUN_RIGHT_SLOW 0xA1 -// sideways stairs - walking -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT 0xA2 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT 0xA3 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT 0xA4 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT 0xA5 -// sideways stairs - running -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT_RUNNING 0xA6 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT_RUNNING 0xA7 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT_RUNNING 0xA8 -#define MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT_RUNNING 0xA9 -// sideways stairs - acro bike -#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_LEFT 0xAA -#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_RIGHT 0xAB -#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_LEFT 0xAC -#define MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_RIGHT 0xAD -//sideways stairs - mach bike #define MOVEMENT_ACTION_STEP_END 0xFE diff --git a/include/constants/global.h b/include/constants/global.h index 4a3f0618a8..213ccca5b5 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -118,6 +118,4 @@ #define DIR_NORTHWEST 7 #define DIR_NORTHEAST 8 -#define SLOW_MOVEMENT_ON_STAIRS TRUE // change to false to keep emerald's normal movement speed on outdoor stairs - #endif // GUARD_CONSTANTS_GLOBAL_H diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 84c89a85d3..61e7c5d6c2 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -82,6 +82,7 @@ bool8 TryGetObjectEventIdByLocalIdAndMap(u8, u8, u8, u8 *); u8 GetObjectEventIdByXY(s16, s16); void SetObjectEventDirection(struct ObjectEvent *, u8); u8 GetFirstInactiveObjectEventId(void); +void RemoveObjectEvent(struct ObjectEvent *objectEvent); void RemoveObjectEventByLocalIdAndMap(u8, u8, u8); void LoadPlayerObjectReflectionPalette(u16, u8); void LoadSpecialObjectReflectionPalette(u16, u8); @@ -125,6 +126,7 @@ u8 GetWalkInPlaceFastMovementAction(u32); u8 GetWalkInPlaceNormalMovementAction(u32); u8 GetWalkInPlaceSlowMovementAction(u32); u8 GetCollisionAtCoords(struct ObjectEvent *, s16, s16, u32); +u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction); void MoveCoords(u8, s16 *, s16 *); bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *); u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); @@ -205,6 +207,8 @@ void CameraObjectReset2(void); u8 GetObjectEventBerryTreeId(u8 objectEventId); void SetBerryTreeJustPicked(u8 mapId, u8 mapNumber, u8 mapGroup); bool8 IsBerryTreeSparkling(u8, u8, u8); +struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup); +u8 TrySpawnObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY); void MovementType_None(struct Sprite *); void MovementType_LookAround(struct Sprite *); @@ -422,21 +426,23 @@ u8 MovementType_RunInPlace_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *); + void SetObjectEventSpriteInvisibility(u8 objectEventId, bool32 invisible); bool32 IsObjectEventSpriteInvisible(u8 objectEventId); void SetObjectEventSpriteGraphics(u8 objectEventId, u8 graphicsId); void SetObjectEventSpriteAnim(u8 objectEventId, u8 animNum); bool32 IsObjectEventSpriteAnimating(u8 objectEventId); +// NEW +u16 GetMiniStepCount(u8 speed); +void RunMiniStep(struct Sprite *sprite, u8 speed, u8 currentFrame); +bool8 PlayerIsUnderWaterfall(struct ObjectEvent *objectEvent); + // run slow u8 GetPlayerRunSlowMovementAction(u32); //sideways stairs u8 GetSidewaysStairsToRightDirection(s16, s16, u8); u8 GetSidewaysStairsToLeftDirection(s16, s16, u8); -u8 GetDiagonalRightStairsMovement(u32); -u8 GetDiagonalLeftStairsMovement(u32); -u8 GetDiagonalRightStairsRunningMovement(u32); -u8 GetDiagonalLeftStairsRunningMovement(u32); -extern u8 gSidewaysStairsDirection; +u8 GetSidewaysStairsCollision(struct ObjectEvent *objectEvent, u8 dir, u8 currentBehavior, u8 nextBehavior, u8 collision); #endif //GUARD_EVENT_OBJECT_MOVEMENT_H diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index f9cdfa838d..0f53e0b28d 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -68,9 +68,5 @@ bool32 PlayerIsMovingOnRockStairs(u8 direction); //sideways stairs u8 GetRightSideStairsDirection(u8 direction); u8 GetLeftSideStairsDirection(u8 direction); -void PlayerSidewaysStairsRightSide(u8 direction); -void PlayerSidewaysStairsLeftSide(u8 direction); -void PlayerSidewaysStairsRightSideRunning(u8 direction); -void PlayerSidewaysStairsLeftSideRunning(u8 direction); #endif // GUARD_FIELD_PLAYER_AVATAR_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index a4c486c960..234bf9f914 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -205,7 +205,8 @@ struct ObjectEvent /*0x1D*/ u8 trainerRange_berryTreeId; /*0x1E*/ u8 currentMetatileBehavior; /*0x1F*/ u8 previousMetatileBehavior; - /*0x20*/ u8 previousMovementDirection; + /*0x20*/ u8 previousMovementDirection:4; + u8 directionOverwrite:4; /*0x21*/ u8 directionSequenceIndex; /*0x22*/ u8 playerCopyableMovement; /*size = 0x24*/ diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index 715f9ef127..128978cae6 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -145,7 +145,6 @@ bool8 MetatileBehavior_IsQuestionnaire(u8); bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); bool8 MetatileBehavior_IsTrainerHillTimer(u8); -bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior); //sideways stairs bool8 MetatileBehavior_IsSidewaysStairsRightSide(u8); bool8 MetatileBehavior_IsSidewaysStairsLeftSide(u8); diff --git a/src/bike.c b/src/bike.c index a21dcb33e1..1fe5b58b43 100644 --- a/src/bike.c +++ b/src/bike.c @@ -142,6 +142,19 @@ static u8 GetMachBikeTransition(u8 *dirTraveling) { // if the dir updated before this function, get the relevent new direction to check later. u8 direction = GetPlayerMovementDirection(); + + // fix direction when moving on sideways stairs + switch (direction) + { + case DIR_SOUTHWEST: + case DIR_NORTHWEST: + direction = DIR_WEST; + break; + case DIR_SOUTHEAST: + case DIR_NORTHEAST: + direction = DIR_EAST; + break; + } // is the player standing still? if (*dirTraveling == 0) @@ -178,7 +191,7 @@ static u8 GetMachBikeTransition(u8 *dirTraveling) // the difference between face direction and turn direction is that one changes direction while the other does the animation of turning as well as changing direction. static void MachBikeTransition_FaceDirection(u8 direction) -{ +{ PlayerFaceDirection(direction); Bike_SetBikeStill(); } @@ -231,41 +244,8 @@ static void MachBikeTransition_TrySpeedUp(u8 direction) PlayerOnBikeCollide(direction); } } - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - { - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - PlayerGoSpeed2(GetLeftSideStairsDirection(direction)); - return; - #else - gPlayerAvatar.bikeFrameCounter = 2; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - PlayerGoSpeed2(GetLeftSideStairsDirection(direction)); - return; - #endif - - } - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - { - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - gPlayerAvatar.bikeFrameCounter = 0; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - PlayerGoSpeed2(GetRightSideStairsDirection(direction)); - return; - #else - gPlayerAvatar.bikeFrameCounter = 2; - gPlayerAvatar.bikeSpeed = SPEED_STANDING; - PlayerGoSpeed2(GetRightSideStairsDirection(direction)); - return; - #endif - - } else { - if (PlayerIsMovingOnRockStairs(direction)) - gPlayerAvatar.bikeFrameCounter--; - sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); gPlayerAvatar.bikeSpeed = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1 if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array @@ -300,13 +280,6 @@ static void MachBikeTransition_TrySlowDown(u8 direction) } else { - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - return PlayerGoSpeed2(GetLeftSideStairsDirection(direction)); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - return PlayerGoSpeed2(GetRightSideStairsDirection(direction)); - #endif - sMachBikeSpeedCallbacks[gPlayerAvatar.bikeFrameCounter](direction); } } @@ -314,13 +287,11 @@ static void MachBikeTransition_TrySlowDown(u8 direction) // the acro bike requires the input handler to be executed before the transition can. static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) { - gSidewaysStairsDirection = newDirection; sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); } static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys) { - gSidewaysStairsDirection = *newDirection; return sAcroBikeInputHandlers[gPlayerAvatar.acroBikeState](newDirection, newKeys, heldKeys); } @@ -409,7 +380,7 @@ static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 struct ObjectEvent *playerObjEvent; direction = GetPlayerMovementDirection(); - gSidewaysStairsDirection = direction; + //gSidewaysStairsDirection = direction; playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; gPlayerAvatar.runningState = NOT_MOVING; @@ -606,15 +577,7 @@ static void AcroBikeTransition_Moving(u8 direction) } else { - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - return PlayerGoSpeed2(GetRightSideStairsDirection(direction)); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - return PlayerGoSpeed2(GetLeftSideStairsDirection(direction)); - - if (PlayerIsMovingOnRockStairs(direction)) - PlayerGoSpeed2(direction); - else - PlayerRideWaterCurrent(direction); + PlayerRideWaterCurrent(direction); } } @@ -683,11 +646,6 @@ static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) else { derp: - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - gSidewaysStairsDirection = GetLeftSideStairsDirection(direction); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - gSidewaysStairsDirection = GetRightSideStairsDirection(direction); - PlayerMovingHoppingWheelie(direction); } } @@ -756,11 +714,6 @@ static void AcroBikeTransition_WheelieMoving(u8 direction) return; } - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - gSidewaysStairsDirection = GetLeftSideStairsDirection(direction); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - gSidewaysStairsDirection = GetRightSideStairsDirection(direction); - PlayerWheelieMove(direction); gPlayerAvatar.runningState = MOVING; } @@ -795,12 +748,7 @@ static void AcroBikeTransition_WheelieRisingMoving(u8 direction) } return; } - - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - gSidewaysStairsDirection = GetLeftSideStairsDirection(direction); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - gSidewaysStairsDirection = GetRightSideStairsDirection(direction); - + PlayerPopWheelieWhileMoving(direction); gPlayerAvatar.runningState = MOVING; } @@ -824,12 +772,7 @@ static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) PlayerEndWheelie(direction); return; } - - if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - gSidewaysStairsDirection = GetLeftSideStairsDirection(direction); - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - gSidewaysStairsDirection = GetRightSideStairsDirection(direction); - + PlayerEndWheelieWhileMoving(direction); } @@ -1090,7 +1033,7 @@ void Bike_UpdateBikeCounterSpeed(u8 counter) static void Bike_SetBikeStill(void) { - gSidewaysStairsDirection = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; + //gSidewaysStairsDirection = gObjectEvents[gPlayerAvatar.objectEventId].facingDirection; gPlayerAvatar.bikeFrameCounter = 0; gPlayerAvatar.bikeSpeed = SPEED_STANDING; } diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 30c1fac2aa..ffc0611a1d 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -267,20 +267,6 @@ u8 MovementActionFunc_RunSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sp u8 MovementActionFunc_RunSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementActionFunc_RunSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); -//sideways stairs -u8 MovementAction_WalkStairDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_WalkStairDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_WalkStairDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_WalkStairDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_RunStairDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_RunStairDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_RunStairDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_RunStairDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_RunStairDiagonal_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_AcroBikeDiagonalUpLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_AcroBikeDiagonalDownLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_AcroBikeDiagonalUpRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_AcroBikeDiagonalDownRight_Step0(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FaceUp[])(struct ObjectEvent *, struct Sprite *); @@ -445,19 +431,6 @@ u8 (*const gMovementActionFuncs_RunDownSlow[])(struct ObjectEvent *, struct Spri u8 (*const gMovementActionFuncs_RunUpSlow[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_RunLeftSlow[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_RunRightSlow[])(struct ObjectEvent *, struct Sprite *); -//sideways stairs -u8 (*const gMovementActionFuncs_WalkStairDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_WalkStairDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_WalkStairDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_WalkStairDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_RunStairDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_RunStairDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_RunStairDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_RunStairDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_AcroBikeDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_AcroBikeDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_AcroBikeDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_AcroBikeDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *); u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) = { [MOVEMENT_ACTION_FACE_DOWN] = gMovementActionFuncs_FaceDown, @@ -623,19 +596,6 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_RUN_UP_SLOW] = gMovementActionFuncs_RunUpSlow, [MOVEMENT_ACTION_RUN_LEFT_SLOW] = gMovementActionFuncs_RunLeftSlow, [MOVEMENT_ACTION_RUN_RIGHT_SLOW] = gMovementActionFuncs_RunRightSlow, - //sideways stairs - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT] = gMovementActionFuncs_WalkStairDiagonalUpLeft, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT] = gMovementActionFuncs_WalkStairDiagonalUpRight, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT] = gMovementActionFuncs_WalkStairDiagonalDownLeft, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT] = gMovementActionFuncs_WalkStairDiagonalDownRight, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT_RUNNING] = gMovementActionFuncs_RunStairDiagonalUpLeft, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT_RUNNING] = gMovementActionFuncs_RunStairDiagonalUpRight, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT_RUNNING] = gMovementActionFuncs_RunStairDiagonalDownLeft, - [MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT_RUNNING] = gMovementActionFuncs_RunStairDiagonalDownRight, - [MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_LEFT] = gMovementActionFuncs_AcroBikeDiagonalUpLeft, - [MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_RIGHT] = gMovementActionFuncs_AcroBikeDiagonalUpRight, - [MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_LEFT] = gMovementActionFuncs_AcroBikeDiagonalDownLeft, - [MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_RIGHT] = gMovementActionFuncs_AcroBikeDiagonalDownRight, }; u8 (*const gMovementActionFuncs_FaceDown[])(struct ObjectEvent *, struct Sprite *) = { @@ -1593,93 +1553,3 @@ u8 (*const gMovementActionFuncs_RunRightSlow[])(struct ObjectEvent *, struct Spr MovementAction_PauseSpriteAnim, }; -//sideways stairs -u8 (*const gMovementActionFuncs_WalkStairDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_WalkStairDiagonalUpLeft_Step0, - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - MovementAction_WalkSlowDiagonalUpLeft_Step1, - #else - MovementAction_WalkNormalDiagonalUpLeft_Step1, - #endif - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_WalkStairDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_WalkStairDiagonalUpRight_Step0, - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - MovementAction_WalkSlowDiagonalUpRight_Step1, - #else - MovementAction_WalkNormalDiagonalUpRight_Step1, - #endif - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_WalkStairDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_WalkStairDiagonalDownLeft_Step0, - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - MovementAction_WalkSlowDiagonalDownLeft_Step1, - #else - MovementAction_WalkNormalDiagonalDownLeft_Step1, - #endif - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_WalkStairDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_WalkStairDiagonalDownRight_Step0, - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - MovementAction_WalkSlowDiagonalDownRight_Step1, - #else - MovementAction_WalkNormalDiagonalDownRight_Step1, - #endif - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_RunStairDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_RunStairDiagonalUpLeft_Step0, - MovementAction_RunStairDiagonal_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_RunStairDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_RunStairDiagonalUpRight_Step0, - MovementAction_RunStairDiagonal_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_RunStairDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_RunStairDiagonalDownLeft_Step0, - MovementAction_RunStairDiagonal_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_RunStairDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_RunStairDiagonalDownRight_Step0, - MovementAction_RunStairDiagonal_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_AcroBikeDiagonalUpLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_AcroBikeDiagonalUpLeft_Step0, - MovementAction_RideWaterCurrentLeft_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_AcroBikeDiagonalDownLeft[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_AcroBikeDiagonalDownLeft_Step0, - MovementAction_RideWaterCurrentLeft_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_AcroBikeDiagonalUpRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_AcroBikeDiagonalUpRight_Step0, - MovementAction_RideWaterCurrentRight_Step1, - MovementAction_PauseSpriteAnim, -}; - -u8 (*const gMovementActionFuncs_AcroBikeDiagonalDownRight[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_AcroBikeDiagonalDownRight_Step0, - MovementAction_RideWaterCurrentRight_Step1, - MovementAction_PauseSpriteAnim, -}; - - diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 9e02edfef4..ebfc902ca3 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -22,11 +22,13 @@ #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" #include "constants/items.h" #include "constants/mauville_old_man.h" +#include "constants/metatile_behaviors.h" #include "constants/trainer_types.h" #include "constants/union_room.h" @@ -57,13 +59,11 @@ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprit EWRAM_DATA u8 sCurrentReflectionType = 0; EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; EWRAM_DATA struct LockedAnimObjectEvents *gLockedAnimObjectEvents = {0}; -EWRAM_DATA u8 gSidewaysStairsDirection = 0; static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); static void SetMovementDelay(struct Sprite *, s16); static bool8 WaitForMovementDelay(struct Sprite *); -static u8 GetCollisionInDirection(struct ObjectEvent *, u8); static u32 state_to_direction(u8, u32, u32); static void TryEnableObjectEventAnim(struct ObjectEvent *, struct Sprite *); static void ObjectEventExecHeldMovementAction(struct ObjectEvent *, struct Sprite *); @@ -113,7 +113,7 @@ static u16 GetObjectEventFlagIdByObjectEventId(u8); static void UpdateObjectEventVisibility(struct ObjectEvent *, struct Sprite *); static void MakeObjectTemplateFromObjectEventTemplate(struct ObjectEventTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); static void GetObjectEventMovingCameraOffset(s16 *, s16 *); -static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); +//static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); static void sub_808E1B8(u8, s16, s16); @@ -135,6 +135,9 @@ static void InitSpriteForFigure8Anim(struct Sprite *sprite); static bool8 AnimateSpriteInFigure8(struct Sprite *sprite); static void UpdateObjectEventSprite(struct Sprite *); +static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction); +static bool8 npc_obj_ministep_stop_on_arrival_slow(struct ObjectEvent *objectEvent, struct Sprite *sprite); + const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; const struct SpriteTemplate gCameraSpriteTemplate = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; @@ -693,10 +696,10 @@ const u8 gMoveDirectionAnimNums[] = { [DIR_NORTH] = 5, [DIR_WEST] = 6, [DIR_EAST] = 7, - [DIR_SOUTHWEST] = 4, - [DIR_SOUTHEAST] = 4, - [DIR_NORTHWEST] = 5, - [DIR_NORTHEAST] = 5, + [DIR_SOUTHWEST] = 6, + [DIR_SOUTHEAST] = 7, + [DIR_NORTHWEST] = 6, + [DIR_NORTHEAST] = 7, }; const u8 gMoveDirectionFastAnimNums[] = { [DIR_NONE] = 8, @@ -704,10 +707,10 @@ const u8 gMoveDirectionFastAnimNums[] = { [DIR_NORTH] = 9, [DIR_WEST] = 10, [DIR_EAST] = 11, - [DIR_SOUTHWEST] = 8, - [DIR_SOUTHEAST] = 8, - [DIR_NORTHWEST] = 9, - [DIR_NORTHEAST] = 9, + [DIR_SOUTHWEST] = 10, + [DIR_SOUTHEAST] = 11, + [DIR_NORTHWEST] = 10, + [DIR_NORTHEAST] = 11, }; const u8 gMoveDirectionFasterAnimNums[] = { [DIR_NONE] = 12, @@ -715,10 +718,10 @@ const u8 gMoveDirectionFasterAnimNums[] = { [DIR_NORTH] = 13, [DIR_WEST] = 14, [DIR_EAST] = 15, - [DIR_SOUTHWEST] = 12, - [DIR_SOUTHEAST] = 12, - [DIR_NORTHWEST] = 13, - [DIR_NORTHEAST] = 13, + [DIR_SOUTHWEST] = 14, + [DIR_SOUTHEAST] = 15, + [DIR_NORTHWEST] = 14, + [DIR_NORTHEAST] = 15, }; const u8 gMoveDirectionFastestAnimNums[] = { [DIR_NONE] = 16, @@ -726,10 +729,10 @@ const u8 gMoveDirectionFastestAnimNums[] = { [DIR_NORTH] = 17, [DIR_WEST] = 18, [DIR_EAST] = 19, - [DIR_SOUTHWEST] = 16, - [DIR_SOUTHEAST] = 16, - [DIR_NORTHWEST] = 17, - [DIR_NORTHEAST] = 17, + [DIR_SOUTHWEST] = 18, + [DIR_SOUTHEAST] = 19, + [DIR_NORTHWEST] = 18, + [DIR_NORTHEAST] = 19, }; const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon [DIR_NONE] = 20, @@ -831,18 +834,6 @@ const u8 gFishingBiteDirectionAnimNums[] = { [DIR_NORTHEAST] = 9, }; const u8 gRunningDirectionAnimNums[] = { - [DIR_NONE] = 20, - [DIR_SOUTH] = 20, - [DIR_NORTH] = 21, - [DIR_WEST] = 22, - [DIR_EAST] = 23, - [DIR_SOUTHWEST] = 20, - [DIR_SOUTHEAST] = 20, - [DIR_NORTHWEST] = 21, - [DIR_NORTHEAST] = 21, -}; - -const u8 gStairsRunningDirectionAnimNums[] = { [DIR_NONE] = 20, [DIR_SOUTH] = 20, [DIR_NORTH] = 21, @@ -913,10 +904,6 @@ const u8 gWalkSlowMovementActions[] = { [DIR_NORTH] = MOVEMENT_ACTION_WALK_SLOW_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_SLOW_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_SLOW_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_RIGHT }; const u8 gWalkNormalMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, @@ -924,10 +911,6 @@ const u8 gWalkNormalMovementActions[] = { [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_NORMAL_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_NORMAL_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT }; const u8 gWalkFastMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_FAST_DOWN, @@ -935,10 +918,6 @@ const u8 gWalkFastMovementActions[] = { [DIR_NORTH] = MOVEMENT_ACTION_WALK_FAST_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_FAST_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_FAST_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_RIGHT, }; const u8 gRideWaterCurrentMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, @@ -946,10 +925,6 @@ const u8 gRideWaterCurrentMovementActions[] = { [DIR_NORTH] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, [DIR_WEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, [DIR_EAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_RIGHT }; const u8 gWalkFastestMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_WALK_FASTEST_DOWN, @@ -957,24 +932,20 @@ const u8 gWalkFastestMovementActions[] = { [DIR_NORTH] = MOVEMENT_ACTION_WALK_FASTEST_UP, [DIR_WEST] = MOVEMENT_ACTION_WALK_FASTEST_LEFT, [DIR_EAST] = MOVEMENT_ACTION_WALK_FASTEST_RIGHT, - [DIR_SOUTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_LEFT, - [DIR_SOUTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN_RIGHT, - [DIR_NORTHWEST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_LEFT, - [DIR_NORTHEAST] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP_RIGHT }; const u8 gSlideMovementActions[] = { - MOVEMENT_ACTION_SLIDE_DOWN, - MOVEMENT_ACTION_SLIDE_DOWN, - MOVEMENT_ACTION_SLIDE_UP, - MOVEMENT_ACTION_SLIDE_LEFT, - MOVEMENT_ACTION_SLIDE_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_SLIDE_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_SLIDE_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_SLIDE_UP, + [DIR_WEST] = MOVEMENT_ACTION_SLIDE_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_SLIDE_RIGHT, }; const u8 gPlayerRunMovementActions[] = { - MOVEMENT_ACTION_PLAYER_RUN_DOWN, - MOVEMENT_ACTION_PLAYER_RUN_DOWN, - MOVEMENT_ACTION_PLAYER_RUN_UP, - MOVEMENT_ACTION_PLAYER_RUN_LEFT, - MOVEMENT_ACTION_PLAYER_RUN_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, + [DIR_WEST] = MOVEMENT_ACTION_PLAYER_RUN_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_PLAYER_RUN_RIGHT, }; const u8 gJump2MovementActions[] = { MOVEMENT_ACTION_JUMP_2_DOWN, @@ -1012,32 +983,48 @@ const u8 gJumpSpecialMovementActions[] = { MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, }; const u8 gWalkInPlaceSlowMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT }; const u8 gWalkInPlaceNormalMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT }; const u8 gWalkInPlaceFastMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT }; const u8 gWalkInPlaceFastestMovementActions[] = { - MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT, - MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT, + [DIR_NONE] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, + [DIR_SOUTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, + [DIR_NORTH] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP, + [DIR_WEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT, + [DIR_EAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT, + [DIR_SOUTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT, + [DIR_NORTHWEST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT, + [DIR_NORTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT, + [DIR_SOUTHEAST] = MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT }; const u8 gAcroWheelieFaceDirectionMovementActions[] = { [DIR_NONE] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, @@ -1158,36 +1145,6 @@ const u8 gRunSlowMovementActions[] = { [DIR_EAST] = MOVEMENT_ACTION_RUN_RIGHT_SLOW, }; -// sideways stairs -const u8 gDiagonalStairLeftSideMovementActions[] = { //movement actions for stairs on left side of a wall (southwest and northeast) - [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT, -}; -const u8 gDiagonalStairRightSideMovementActions[] = { //movement actions for stairs on right side of a wall (southeast and northwest) - [DIR_NONE] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_WALK_NORMAL_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_WALK_NORMAL_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT, - [DIR_EAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT, -}; -const u8 gDiagonalStairRightSideRunningMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_LEFT_RUNNING, - [DIR_EAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_RIGHT_RUNNING, -}; -const u8 gDiagonalStairLeftSideRunningMovementActions[] = { - [DIR_NONE] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_SOUTH] = MOVEMENT_ACTION_PLAYER_RUN_DOWN, - [DIR_NORTH] = MOVEMENT_ACTION_PLAYER_RUN_UP, - [DIR_WEST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_DOWN_LEFT_RUNNING, - [DIR_EAST] = MOVEMENT_ACTION_WALK_STAIRS_DIAGONAL_UP_RIGHT_RUNNING, -}; - const u8 gOppositeDirections[] = { DIR_NORTH, DIR_SOUTH, @@ -1271,10 +1228,11 @@ u8 GetFirstInactiveObjectEventId(void) u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) { - if (localId < OBJ_EVENT_ID_PLAYER) - { + if (localId == 0xFE) + return GetFollowerObjectId(); + else if (localId < OBJ_EVENT_ID_PLAYER) return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); - } + return GetObjectEventIdByLocalId(localId); } @@ -1430,7 +1388,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); @@ -1525,7 +1483,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; @@ -2457,7 +2415,10 @@ void SetObjectEventDirection(struct ObjectEvent *objectEvent, u8 direction) static const u8 *GetObjectEventScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; + if (GetFollowerLocalId() == 0 || GetFollowerLocalId() != localId) + return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; + else + return GetFollowerScriptPointer(); } const u8 *GetObjectEventScriptPointerByObjectEventId(u8 objectEventId) @@ -2516,7 +2477,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; @@ -4860,7 +4821,7 @@ u8 GetTrainerFacingDirectionMovementType(u8 direction) return gTrainerFacingDirectionMovementTypes[direction]; } -static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) +u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) { s16 x; s16 y; @@ -4870,11 +4831,101 @@ static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) return GetCollisionAtCoords(objectEvent, x, y, direction); } +u8 GetSidewaysStairsCollision(struct ObjectEvent *objectEvent, u8 dir, u8 currentBehavior, u8 nextBehavior, u8 collision) +{ + if ((dir == DIR_SOUTH || dir == DIR_NORTH) && collision != COLLISION_NONE) + return collision; + + if (MetatileBehavior_IsSidewaysStairsLeftSide(nextBehavior)) + { + //moving ONTO left side stair + if (dir == DIR_WEST && currentBehavior != nextBehavior) + return collision; //moving onto top part of left-stair going left, so no diagonal + else + return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; // move diagonally + } + else if (MetatileBehavior_IsSidewaysStairsRightSide(nextBehavior)) + { + //moving ONTO right side stair + if (dir == DIR_EAST && currentBehavior != nextBehavior) + return collision; //moving onto top part of right-stair going right, so no diagonal + else + return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; + } + else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currentBehavior)) + { + //moving OFF of any left side stair + if (dir == DIR_WEST && nextBehavior != currentBehavior) + return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; //moving off of left stairs onto non-stair -> move diagonal + else + return collision; //moving off of left side stair to east -> move east + } + else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currentBehavior)) + { + //moving OFF of any right side stair + if (dir == DIR_EAST && nextBehavior != currentBehavior) + return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; //moving off right stair onto non-stair -> move diagonal + else + return collision; + } + + return collision; +} + +static u8 GetVanillaCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ + if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) + return COLLISION_OUTSIDE_RANGE; + else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) + return COLLISION_IMPASSABLE; + else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)) + return COLLISION_IMPASSABLE; + else if (IsZCoordMismatchAt(objectEvent->currentElevation, x, y)) + return COLLISION_ELEVATION_MISMATCH; + else if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) + return COLLISION_OBJECT_EVENT; + + return COLLISION_NONE; +} + +static bool8 ObjectEventOnLeftSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ + switch (direction) + { + case DIR_EAST: + MoveCoords(DIR_NORTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + case DIR_WEST: + MoveCoords(DIR_SOUTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + default: + return FALSE; //north/south taken care of in GetVanillaCollision + } +} + +static bool8 ObjectEventOnRightSideStair(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) +{ + switch (direction) + { + case DIR_EAST: + MoveCoords(DIR_SOUTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + case DIR_WEST: + MoveCoords(DIR_NORTH, &x, &y); + return DoesObjectCollideWithObjectAt(objectEvent, x, y); + default: + return FALSE; //north/south taken care of in GetVanillaCollision + } +} + u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) { u8 direction = dir; u8 currentBehavior = MapGridGetMetatileBehaviorAt(objectEvent->currentCoords.x, objectEvent->currentCoords.y); u8 nextBehavior = MapGridGetMetatileBehaviorAt(x, y); + u8 collision; + + objectEvent->directionOverwrite = DIR_NONE; //sideways stairs checks if (MetatileBehavior_IsSidewaysStairsLeftSideTop(nextBehavior) && dir == DIR_EAST) @@ -4895,17 +4946,26 @@ u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir) && dir == DIR_NORTH && (MetatileBehavior_IsSidewaysStairsLeftSideBottom(nextBehavior) || MetatileBehavior_IsSidewaysStairsRightSideBottom(nextBehavior))) return COLLISION_IMPASSABLE; //trying to move north onto top stair tile at same level from non-stair -> no - if (IsCoordOutsideObjectEventMovementRange(objectEvent, x, y)) - return COLLISION_OUTSIDE_RANGE; - else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(objectEvent, x, y, direction)) - return COLLISION_IMPASSABLE; - else if (objectEvent->trackedByCamera && !CanCameraMoveInDirection(direction)) - return COLLISION_IMPASSABLE; - else if (IsZCoordMismatchAt(objectEvent->currentElevation, x, y)) - return COLLISION_ELEVATION_MISMATCH; - else if (DoesObjectCollideWithObjectAt(objectEvent, x, y)) - return COLLISION_OBJECT_EVENT; - return COLLISION_NONE; + // regular checks + collision = GetVanillaCollision(objectEvent, x, y, dir); + + //sideways stairs checks + collision = GetSidewaysStairsCollision(objectEvent, dir, currentBehavior, nextBehavior, collision); + switch (collision) + { + case COLLISION_SIDEWAYS_STAIRS_TO_LEFT: + if (ObjectEventOnLeftSideStair(objectEvent, x, y, dir)) + return COLLISION_OBJECT_EVENT; + objectEvent->directionOverwrite = GetLeftSideStairsDirection(dir); + return COLLISION_NONE; + case COLLISION_SIDEWAYS_STAIRS_TO_RIGHT: + if (ObjectEventOnRightSideStair(objectEvent, x, y, dir)) + return COLLISION_OBJECT_EVENT; + objectEvent->directionOverwrite = GetRightSideStairsDirection(dir); + return COLLISION_NONE; + } + + return collision; } u8 GetCollisionFlagsAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u8 direction) @@ -4969,8 +5029,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 (AreZCoordsCompatible(objectEvent->currentElevation, curObject->currentElevation)) @@ -5124,6 +5185,9 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct objectEvent->heldMovementActive = TRUE; objectEvent->heldMovementFinished = FALSE; gSprites[objectEvent->spriteId].data[2] = 0; + + FollowMe(objectEvent, movementActionId, FALSE); + return FALSE; } @@ -5203,12 +5267,6 @@ u8 name(u32 idx)\ return animIds[direction];\ } -//sideways stairs -dirn_to_anim(GetDiagonalRightStairsMovement, gDiagonalStairRightSideMovementActions); -dirn_to_anim(GetDiagonalLeftStairsMovement, gDiagonalStairLeftSideMovementActions); -dirn_to_anim(GetDiagonalRightStairsRunningMovement, gDiagonalStairRightSideRunningMovementActions); -dirn_to_anim(GetDiagonalLeftStairsRunningMovement, gDiagonalStairLeftSideRunningMovementActions); - dirn_to_anim(GetFaceDirectionMovementAction, gFaceDirectionMovementActions); dirn_to_anim(GetWalkSlowMovementAction, gWalkSlowMovementActions); dirn_to_anim(GetPlayerRunSlowMovementAction, gRunSlowMovementActions); @@ -5514,7 +5572,10 @@ bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_WEST); + if (objectEvent->directionOverwrite) + sub_8093B60(objectEvent, sprite, objectEvent->directionOverwrite); + else + sub_8093B60(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite); } @@ -5530,7 +5591,10 @@ bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_EAST); + if (objectEvent->directionOverwrite) + sub_8093B60(objectEvent, sprite, objectEvent->directionOverwrite); + else + sub_8093B60(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowRight_Step1(objectEvent, sprite); } @@ -5642,7 +5706,10 @@ bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 0); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 0); + else + do_go_anim(objectEvent, sprite, DIR_WEST, 0); return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); } @@ -5658,7 +5725,10 @@ bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 0); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 0); + else + do_go_anim(objectEvent, sprite, DIR_EAST, 0); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); } @@ -5917,7 +5987,10 @@ bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 1); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + do_go_anim(objectEvent, sprite, DIR_WEST, 1); return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); } @@ -5933,7 +6006,10 @@ bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 1); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + do_go_anim(objectEvent, sprite, DIR_EAST, 1); return MovementAction_WalkFastRight_Step1(objectEvent, sprite); } @@ -6063,13 +6139,19 @@ bool8 MovementAction_WalkInPlaceFastestUp_Step0(struct ObjectEvent *objectEvent, bool8 MovementAction_WalkInPlaceFastestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + if (objectEvent->directionOverwrite) + sub_8094554(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + else + sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); + if (objectEvent->directionOverwrite) + sub_8094554(objectEvent, sprite, objectEvent->directionOverwrite, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + else + sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } @@ -6107,7 +6189,10 @@ bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 2); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 2); + else + do_go_anim(objectEvent, sprite, DIR_WEST, 2); return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); } @@ -6123,7 +6208,10 @@ bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 2); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 2); + else + do_go_anim(objectEvent, sprite, DIR_EAST, 2); return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); } @@ -6171,7 +6259,10 @@ bool8 MovementAction_WalkFastestUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 3); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 3); + else + do_go_anim(objectEvent, sprite, DIR_WEST, 3); return MovementAction_WalkFastestLeft_Step1(objectEvent, sprite); } @@ -6187,7 +6278,10 @@ bool8 MovementAction_WalkFastestLeft_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_WalkFastestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 3); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 3); + else + do_go_anim(objectEvent, sprite, DIR_EAST, 3); return MovementAction_WalkFastestRight_Step1(objectEvent, sprite); } @@ -6235,7 +6329,10 @@ bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 4); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 4); + else + do_go_anim(objectEvent, sprite, DIR_WEST, 4); return MovementAction_SlideLeft_Step1(objectEvent, sprite); } @@ -6251,7 +6348,10 @@ bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 4); + if (objectEvent->directionOverwrite) + do_go_anim(objectEvent, sprite, objectEvent->directionOverwrite, 4); + else + do_go_anim(objectEvent, sprite, DIR_EAST, 4); return MovementAction_SlideRight_Step1(objectEvent, sprite); } @@ -6299,7 +6399,10 @@ bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct S bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartRunningAnim(objectEvent, sprite, DIR_WEST); + if (objectEvent->directionOverwrite) + StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartRunningAnim(objectEvent, sprite, DIR_WEST); return MovementAction_PlayerRunLeft_Step1(objectEvent, sprite); } @@ -6315,7 +6418,10 @@ bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartRunningAnim(objectEvent, sprite, DIR_EAST); + if (objectEvent->directionOverwrite) + StartRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartRunningAnim(objectEvent, sprite, DIR_EAST); return MovementAction_PlayerRunRight_Step1(objectEvent, sprite); } @@ -7165,7 +7271,7 @@ bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEve bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 1, 1); + sub_8095B84(objectEvent, sprite, DIR_SOUTH, 1, 1); return MovementAction_AcroWheelieHopDown_Step1(objectEvent, sprite); } @@ -7182,7 +7288,7 @@ bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 1, 1); + sub_8095B84(objectEvent, sprite, DIR_NORTH, 1, 1); return MovementAction_AcroWheelieHopUp_Step1(objectEvent, sprite); } @@ -7199,7 +7305,10 @@ bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, str bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 1, 1); + if (objectEvent->directionOverwrite) + sub_8095B84(objectEvent, sprite, objectEvent->directionOverwrite, 1, 1); + else + sub_8095B84(objectEvent, sprite, DIR_WEST, 1, 1); return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite); } @@ -7216,7 +7325,10 @@ bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 1, 1); + if (objectEvent->directionOverwrite) + sub_8095B84(objectEvent, sprite, objectEvent->directionOverwrite, 1, 1); + else + sub_8095B84(objectEvent, sprite, DIR_EAST, 1, 1); return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite); } @@ -7233,7 +7345,7 @@ bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 2, 0); + sub_8095B84(objectEvent, sprite, DIR_SOUTH, 2, 0); return MovementAction_AcroWheelieJumpDown_Step1(objectEvent, sprite); } @@ -7250,7 +7362,7 @@ bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 2, 0); + sub_8095B84(objectEvent, sprite, DIR_NORTH, 2, 0); return MovementAction_AcroWheelieJumpUp_Step1(objectEvent, sprite); } @@ -7267,7 +7379,10 @@ bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 2, 0); + if (objectEvent->directionOverwrite) + sub_8095B84(objectEvent, sprite, objectEvent->directionOverwrite, 2, 0); + else + sub_8095B84(objectEvent, sprite, DIR_WEST, 2, 0); return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite); } @@ -7284,7 +7399,10 @@ bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, gSidewaysStairsDirection, 2, 0); + if (objectEvent->directionOverwrite) + sub_8095B84(objectEvent, sprite, objectEvent->directionOverwrite, 2, 0); + else + sub_8095B84(objectEvent, sprite, DIR_EAST, 2, 0); return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite); } @@ -7301,25 +7419,31 @@ bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, gSidewaysStairsDirection, GetAcroWheeliePedalDirectionAnimNum(gSidewaysStairsDirection), 8); + sub_8094554(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, gSidewaysStairsDirection, GetAcroWheeliePedalDirectionAnimNum(gSidewaysStairsDirection), 8); + sub_8094554(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, gSidewaysStairsDirection, GetAcroWheeliePedalDirectionAnimNum(gSidewaysStairsDirection), 8); + if (objectEvent->directionOverwrite) + sub_8094554(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); + else + sub_8094554(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, gSidewaysStairsDirection, GetAcroWheeliePedalDirectionAnimNum(gSidewaysStairsDirection), 8); + if (objectEvent->directionOverwrite) + sub_8094554(objectEvent, sprite, objectEvent->directionOverwrite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->directionOverwrite), 8); + else + sub_8094554(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } @@ -7332,7 +7456,7 @@ void sub_80960C8(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_80960C8(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroPopWheelieMoveDown_Step1(objectEvent, sprite); } @@ -7348,7 +7472,7 @@ bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_80960C8(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroPopWheelieMoveUp_Step1(objectEvent, sprite); } @@ -7364,7 +7488,10 @@ bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_80960C8(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_80960C8(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -7380,7 +7507,10 @@ bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_80960C8(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_80960C8(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite); } @@ -7402,7 +7532,7 @@ void sub_8096200(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_8096200(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroWheelieMoveDown_Step1(objectEvent, sprite); } @@ -7418,7 +7548,7 @@ bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_8096200(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroWheelieMoveUp_Step1(objectEvent, sprite); } @@ -7434,7 +7564,10 @@ bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_8096200(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_8096200(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -7450,7 +7583,10 @@ bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_8096200(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_8096200(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite); } @@ -7473,7 +7609,7 @@ void sub_8096330(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire bool8 MovementAction_AcroEndWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_8096330(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroEndWheelieMoveDown_Step1(objectEvent, sprite); } @@ -7489,7 +7625,7 @@ bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroEndWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, gSidewaysStairsDirection, 1); + sub_8096330(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroEndWheelieMoveUp_Step1(objectEvent, sprite); } @@ -7505,7 +7641,10 @@ bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_8096330(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_8096330(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroEndWheelieMoveLeft_Step1(objectEvent, sprite); } @@ -7521,7 +7660,10 @@ bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, gSidewaysStairsDirection, 1); + if (objectEvent->directionOverwrite) + sub_8096330(objectEvent, sprite, objectEvent->directionOverwrite, 1); + else + sub_8096330(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroEndWheelieMoveRight_Step1(objectEvent, sprite); } @@ -9193,6 +9335,31 @@ u8 MovementAction_Fly_Finish(struct ObjectEvent *objectEvent, struct Sprite *spr return TRUE; } +// NEW +u16 GetMiniStepCount(u8 speed) +{ + return (u16)gUnknown_0850E768[speed]; +} + +void RunMiniStep(struct Sprite *sprite, u8 speed, u8 currentFrame) +{ + gUnknown_0850E754[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; +} + // running slow static void StartSlowRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { @@ -9248,13 +9415,19 @@ bool8 MovementActionFunc_RunSlowUp_Step0(struct ObjectEvent *objectEvent, struct bool8 MovementActionFunc_RunSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartSlowRunningAnim(objectEvent, sprite, DIR_WEST); + if (objectEvent->directionOverwrite) + StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartSlowRunningAnim(objectEvent, sprite, DIR_WEST); return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); } bool8 MovementActionFunc_RunSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - StartSlowRunningAnim(objectEvent, sprite, DIR_EAST); + if (objectEvent->directionOverwrite) + StartSlowRunningAnim(objectEvent, sprite, objectEvent->directionOverwrite); + else + StartSlowRunningAnim(objectEvent, sprite, DIR_EAST); return MovementActionFunc_RunSlow_Step1(objectEvent, sprite); } @@ -9267,163 +9440,3 @@ bool8 MovementActionFunc_RunSlow_Step1(struct ObjectEvent *objectEvent, struct S } return FALSE; } - -//sideways stairs -bool8 MovementAction_WalkStairDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - sub_8093B60(objectEvent, sprite, DIR_NORTHWEST); - return MovementAction_WalkSlowDiagonalUpLeft_Step1(objectEvent, sprite); - #else - do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 0); - return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); - #endif -} - -bool8 MovementAction_WalkStairDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - sub_8093B60(objectEvent, sprite, DIR_NORTHEAST); - return MovementAction_WalkSlowDiagonalUpRight_Step1(objectEvent, sprite); - #else - do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 0); - return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); - #endif -} - -bool8 MovementAction_WalkStairDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - sub_8093B60(objectEvent, sprite, DIR_SOUTHWEST); - return MovementAction_WalkSlowDiagonalDownLeft_Step1(objectEvent, sprite); - #else - do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 0); - return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); - #endif -} - -bool8 MovementAction_WalkStairDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - sub_8093B60(objectEvent, sprite, DIR_SOUTHEAST); - return MovementAction_WalkSlowDiagonalDownRight_Step1(objectEvent, sprite); - #else - do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 0); - return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); - #endif -} - -bool8 MovementAction_RunStairDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - StartSlowRunningAnim(objectEvent, sprite, DIR_NORTHWEST); - #else - StartRunningAnim(objectEvent, sprite, DIR_NORTHWEST); - #endif - return MovementAction_RunStairDiagonal_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RunStairDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - StartSlowRunningAnim(objectEvent, sprite, DIR_NORTHEAST); - #else - StartRunningAnim(objectEvent, sprite, DIR_NORTHEAST); - #endif - return MovementAction_RunStairDiagonal_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RunStairDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - StartSlowRunningAnim(objectEvent, sprite, DIR_SOUTHWEST); - #else - StartRunningAnim(objectEvent, sprite, DIR_SOUTHWEST); - #endif - return MovementAction_RunStairDiagonal_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RunStairDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - StartSlowRunningAnim(objectEvent, sprite, DIR_SOUTHEAST); - #else - StartRunningAnim(objectEvent, sprite, DIR_SOUTHEAST); - #endif - return MovementAction_RunStairDiagonal_Step1(objectEvent, sprite); -} - -bool8 MovementAction_RunStairDiagonal_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 MovementAction_AcroBikeDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 0); - #else - do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 2); - #endif - return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroBikeDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_WEST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 0); - #else - do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 2); - #endif - return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroBikeDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 0); - #else - do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 2); - #endif - return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); -} - -bool8 MovementAction_AcroBikeDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) -{ - objectEvent->facingDirection = DIR_EAST; - objectEvent->facingDirectionLocked = TRUE; - #if SLOW_MOVEMENT_ON_STAIRS == TRUE - do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 0); - #else - do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 2); - #endif - return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); -} - diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 6ec280fd0d..f0a7f708f8 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -28,6 +28,7 @@ #include "trainer_see.h" #include "trainer_hill.h" #include "wild_encounter.h" +#include "follow_me.h" #include "constants/event_bg.h" #include "constants/event_objects.h" #include "constants/field_poison.h" @@ -288,8 +289,39 @@ static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 { u8 objectEventId; const u8 *script; - - objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + s16 currX = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.x; + s16 currY = gObjectEvents[gPlayerAvatar.objectEventId].currentCoords.y; + u8 currBehavior = MapGridGetMetatileBehaviorAt(currX, currY); + + switch (direction) + { + case DIR_EAST: + if (MetatileBehavior_IsSidewaysStairsLeftSideAny(metatileBehavior)) + // sideways stairs left-side to your right -> check northeast + objectEventId = GetObjectEventIdByXYZ(currX + 1, currY - 1, position->height); + else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currBehavior)) + // on top of right-side stairs -> check southeast + objectEventId = GetObjectEventIdByXYZ(currX + 1, currY + 1, position->height); + else + // check in front of player + objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + break; + case DIR_WEST: + if (MetatileBehavior_IsSidewaysStairsRightSideAny(metatileBehavior)) + // facing sideways stairs right side -> check northwest + objectEventId = GetObjectEventIdByXYZ(currX - 1, currY - 1, position->height); + else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currBehavior)) + // on top of left-side stairs -> check southwest + objectEventId = GetObjectEventIdByXYZ(currX - 1, currY + 1, position->height); + else + // check in front of player + objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + break; + default: + objectEventId = GetObjectEventIdByXYZ(position->x, position->y, position->height); + break; + } + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) { if (MetatileBehavior_IsCounter(metatileBehavior) != TRUE) @@ -448,10 +480,10 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { - if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE && CheckFollowerFlag(FOLLOWER_FLAG_CAN_SURF)) return EventScript_UseSurf; - if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE) + if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE && CheckFollowerFlag(FOLLOWER_FLAG_CAN_WATERFALL)) { if (FlagGet(FLAG_BADGE08_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) return EventScript_UseWaterfall; @@ -463,6 +495,9 @@ static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metati static bool32 TrySetupDiveDownScript(void) { + if (!CheckFollowerFlag(FOLLOWER_FLAG_CAN_DIVE)) + return FALSE; + if (FlagGet(FLAG_BADGE07_GET) && TrySetDiveWarp() == 2) { ScriptContext1_SetupScript(EventScript_UseDive); @@ -473,6 +508,9 @@ static bool32 TrySetupDiveDownScript(void) static bool32 TrySetupDiveEmergeScript(void) { + if (!CheckFollowerFlag(FOLLOWER_FLAG_CAN_DIVE)) + return FALSE; + if (FlagGet(FLAG_BADGE07_GET) && gMapHeader.mapType == MAP_TYPE_UNDERWATER && TrySetDiveWarp() == 1) { ScriptContext1_SetupScript(EventScript_UseDiveUnderwater); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index dd52e3a612..f74b4f5a98 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -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" @@ -624,22 +625,6 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) PlayerNotOnBikeCollideWithFarawayIslandMew(direction); return; } - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_RIGHT) - { - if (heldKeys & B_BUTTON && FlagGet(FLAG_SYS_B_DASH)) - PlayerSidewaysStairsRightSideRunning(direction); - else - PlayerSidewaysStairsRightSide(direction); - return; - } - else if (collision == COLLISION_SIDEWAYS_STAIRS_TO_LEFT) - { - if (heldKeys & B_BUTTON && FlagGet(FLAG_SYS_B_DASH)) - return PlayerSidewaysStairsLeftSideRunning(direction); - else - return PlayerSidewaysStairsLeftSide(direction); - return; - } else { u8 adjustedCollision = collision - COLLISION_STOP_SURFING; @@ -659,45 +644,16 @@ static void PlayerNotOnBikeMoving(u8 direction, u16 heldKeys) if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_UNDERWATER) && (heldKeys & B_BUTTON) && FlagGet(FLAG_SYS_B_DASH) && IsRunningDisallowed(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) == 0) { - if (PlayerIsMovingOnRockStairs(direction)) - PlayerRunSlow(direction); - else - PlayerRun(direction); - + PlayerRun(direction); gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH; return; } else { - if (PlayerIsMovingOnRockStairs(direction)) - PlayerGoSlow(direction); - else - PlayerGoSpeed1(direction); + PlayerGoSpeed1(direction); } } -bool32 PlayerIsMovingOnRockStairs(u8 direction) -{ - #if SLOW_MOVEMENT_ON_STAIRS - struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - s16 x = objectEvent->currentCoords.x; - s16 y = objectEvent->currentCoords.y; - - switch (direction) - { - case DIR_NORTH: - return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y)); - case DIR_SOUTH: - MoveCoords(DIR_SOUTH, &x, &y); - return MetatileBehavior_IsRockStairs(MapGridGetMetatileBehaviorAt(x, y)); - default: - return FALSE; - } - #else - return FALSE; - #endif -} - static u8 CheckForPlayerAvatarCollision(u8 direction) { s16 x, y; @@ -745,42 +701,20 @@ u8 CheckForObjectEventCollision(struct ObjectEvent *objectEvent, s16 x, s16 y, u } //sideways stairs logic - if (direction == DIR_WEST || direction == DIR_EAST) - { - if (MetatileBehavior_IsSidewaysStairsLeftSide(metatileBehavior)) - { - //moving ONTO left side stair - if (direction == DIR_WEST && currentBehavior != metatileBehavior) - return collision; //moving onto top part of left-stair going left, so no diagonal - else - return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; // move diagonally - } - else if (MetatileBehavior_IsSidewaysStairsRightSide(metatileBehavior)) - { - //moving ONTO right side stair - if (direction == DIR_EAST && currentBehavior != metatileBehavior) - return collision; //moving onto top part of right-stair going right, so no diagonal - else - return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; - } - else if (MetatileBehavior_IsSidewaysStairsLeftSideAny(currentBehavior)) - { - //moving OFF of any left side stair - if (direction == DIR_WEST && metatileBehavior != currentBehavior) - return COLLISION_SIDEWAYS_STAIRS_TO_LEFT; //moving off of left stairs onto non-stair -> move diagonal - else - return collision; //moving off of left side stair to east -> move east - } - else if (MetatileBehavior_IsSidewaysStairsRightSideAny(currentBehavior)) - { - //moving OFF of any right side stair - if (direction == DIR_EAST && metatileBehavior != currentBehavior) - return COLLISION_SIDEWAYS_STAIRS_TO_RIGHT; //moving off right stair onto non-stair -> move diagonal - else - return collision; - } - } - + /* + if (MetatileBehavior_IsSidewaysStairsLeftSideTop(metatileBehavior) && direction == DIR_EAST) + return COLLISION_IMPASSABLE; //moving onto left-side top edge east from ground -> cannot move + else if (MetatileBehavior_IsSidewaysStairsRightSideTop(metatileBehavior) && direction == DIR_WEST) + return COLLISION_IMPASSABLE; //moving onto left-side top edge east from ground -> cannot move + else if (MetatileBehavior_IsSidewaysStairsRightSideBottom(metatileBehavior) && (direction == DIR_EAST || direction == DIR_SOUTH)) + return COLLISION_IMPASSABLE; + else if (MetatileBehavior_IsSidewaysStairsLeftSideBottom(metatileBehavior) && (direction == DIR_WEST || direction == DIR_SOUTH)) + return COLLISION_IMPASSABLE; + else if ((MetatileBehavior_IsSidewaysStairsLeftSideTop(currentBehavior) || MetatileBehavior_IsSidewaysStairsRightSideTop(currentBehavior)) + && direction == DIR_NORTH && collision == COLLISION_NONE) + return COLLISION_IMPASSABLE; //trying to move north off of top-most tile onto same level doesn't work + */ + return collision; } @@ -961,7 +895,7 @@ static void PlayerAvatarTransition_Underwater(struct ObjectEvent *objEvent) ObjectEventSetGraphicsId(objEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_UNDERWATER)); ObjectEventTurn(objEvent, objEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_UNDERWATER); - objEvent->fieldEffectSpriteId = sub_8155800(objEvent->spriteId); + objEvent->fieldEffectSpriteId = DoBobbingFieldEffect(objEvent->spriteId); } static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent *objEvent) @@ -1491,6 +1425,8 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) gPlayerAvatar.spriteId = objectEvent->spriteId; gPlayerAvatar.gender = gender; SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_5 | PLAYER_AVATAR_FLAG_ON_FOOT); + + CreateFollowerAvatar(); } void SetPlayerInvisibility(bool8 invisible) @@ -1730,12 +1666,14 @@ static void CreateStopSurfingTask(u8 direction) ScriptContext2_Enable(); Overworld_ClearSavedMusic(); Overworld_ChangeMusicToDefault(); - gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_SURFING; + gPlayerAvatar.flags ^= PLAYER_AVATAR_FLAG_SURFING; gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_ON_FOOT; gPlayerAvatar.preventStep = TRUE; taskId = CreateTask(Task_StopSurfingInit, 0xFF); gTasks[taskId].data[0] = direction; Task_StopSurfingInit(taskId); + + PrepareFollowerDismountSurf(); } static void Task_StopSurfingInit(u8 taskId) @@ -2350,22 +2288,3 @@ u8 GetLeftSideStairsDirection(u8 direction) } } -void PlayerSidewaysStairsRightSide(u8 direction) -{ - PlayerSetAnimId(GetDiagonalRightStairsMovement(direction), 8); -} - -void PlayerSidewaysStairsLeftSide(u8 direction) -{ - PlayerSetAnimId(GetDiagonalLeftStairsMovement(direction), 8); -} - -void PlayerSidewaysStairsRightSideRunning(u8 direction) -{ - PlayerSetAnimId(GetDiagonalRightStairsRunningMovement(direction), 8); -} - -void PlayerSidewaysStairsLeftSideRunning(u8 direction) -{ - PlayerSetAnimId(GetDiagonalLeftStairsRunningMovement(direction), 8); -} diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 86e4ec98b3..ab5d6f288d 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -1564,10 +1564,3 @@ bool8 MetatileBehavior_IsSidewaysStairsLeftSideAny(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsRockStairs(u8 metatileBehavior) -{ - if (metatileBehavior == MB_ROCK_STAIRS) - return TRUE; - else - return FALSE; -}