2017-09-06 14:35:16 +02:00
# include "global.h"
2019-09-09 03:07:54 +02:00
# include "malloc.h"
2019-02-08 00:41:44 +01:00
# include "battle_pyramid.h"
2017-09-08 20:05:45 +02:00
# include "berry.h"
2018-06-12 01:17:31 +02:00
# include "decoration.h"
# include "event_data.h"
2018-06-14 00:51:26 +02:00
# include "event_object_movement.h"
2018-06-12 01:17:31 +02:00
# include "event_scripts.h"
2019-03-22 20:16:26 +01:00
# include "faraway_island.h"
2018-06-12 01:17:31 +02:00
# include "field_camera.h"
# include "field_effect.h"
# include "field_effect_helpers.h"
2017-09-06 15:29:59 +02:00
# include "field_player_avatar.h"
2017-09-16 19:54:33 +02:00
# include "fieldmap.h"
2017-09-08 20:16:44 +02:00
# include "mauville_old_man.h"
2017-09-16 22:40:00 +02:00
# include "metatile_behavior.h"
2018-06-12 01:17:31 +02:00
# include "overworld.h"
# include "palette.h"
# include "random.h"
# include "sprite.h"
2018-11-13 15:19:04 +01:00
# include "task.h"
2018-06-12 01:17:31 +02:00
# include "trainer_see.h"
2019-01-13 20:58:42 +01:00
# include "trainer_hill.h"
2018-06-11 17:34:51 +02:00
# include "util.h"
2019-11-21 20:03:35 +01:00
# include "constants/event_object_movement.h"
2018-06-12 02:11:48 +02:00
# include "constants/event_objects.h"
2018-11-13 15:19:04 +01:00
# include "constants/field_effects.h"
2019-04-14 13:22:37 +02:00
# include "constants/items.h"
2019-10-20 22:11:07 +02:00
# include "constants/mauville_old_man.h"
2020-06-20 07:40:12 +02:00
# include "constants/metatile_behaviors.h"
2020-04-21 21:53:48 +02:00
# include "constants/trainer_types.h"
2020-06-01 16:23:12 +02:00
# include "constants/union_room.h"
2017-09-06 14:35:16 +02:00
2018-06-12 01:17:31 +02:00
// this file was known as evobjmv.c in Game Freak's original source
2017-09-06 14:35:16 +02:00
2018-12-02 18:58:33 +01:00
# define movement_type_def(setup, table) \
2019-11-21 04:55:44 +01:00
static u8 setup # # _callback ( struct ObjectEvent * , struct Sprite * ) ; \
2018-12-02 18:58:33 +01:00
void setup ( struct Sprite * sprite ) \
{ \
2019-11-21 04:55:44 +01:00
UpdateObjectEventCurrentMovement ( & gObjectEvents [ sprite - > data [ 0 ] ] , sprite , setup # # _callback ) ; \
2018-12-02 18:58:33 +01:00
} \
2019-11-21 04:55:44 +01:00
static u8 setup # # _callback ( struct ObjectEvent * objectEvent , struct Sprite * sprite ) \
2018-12-02 18:58:33 +01:00
{ \
2019-11-21 04:55:44 +01:00
return table [ sprite - > data [ 1 ] ] ( objectEvent , sprite ) ; \
2018-12-02 18:58:33 +01:00
}
# define movement_type_empty_callback(setup) \
2019-11-21 04:55:44 +01:00
static u8 setup # # _callback ( struct ObjectEvent * , struct Sprite * ) ; \
2018-12-02 18:58:33 +01:00
void setup ( struct Sprite * sprite ) \
{ \
2019-11-21 04:55:44 +01:00
UpdateObjectEventCurrentMovement ( & gObjectEvents [ sprite - > data [ 0 ] ] , sprite , setup # # _callback ) ; \
2018-12-02 18:58:33 +01:00
} \
2019-11-21 04:55:44 +01:00
static u8 setup # # _callback ( struct ObjectEvent * objectEvent , struct Sprite * sprite ) \
2018-12-02 18:58:33 +01:00
{ \
return 0 ; \
}
2018-09-03 00:20:45 +02:00
EWRAM_DATA u8 sCurrentReflectionType = 0 ;
EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0 ;
2019-11-21 04:55:44 +01:00
EWRAM_DATA struct LockedAnimObjectEvents * gLockedAnimObjectEvents = { 0 } ;
2017-09-08 23:58:41 +02:00
2018-06-14 00:51:26 +02:00
static void MoveCoordsInDirection ( u32 , s16 * , s16 * , s16 , s16 ) ;
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventExecSingleMovementAction ( struct ObjectEvent * , struct Sprite * ) ;
2018-06-14 00:51:26 +02:00
static void SetMovementDelay ( struct Sprite * , s16 ) ;
static bool8 WaitForMovementDelay ( struct Sprite * ) ;
2017-09-17 14:05:33 +02:00
static u32 state_to_direction ( u8 , u32 , u32 ) ;
2019-11-21 04:55:44 +01:00
static void TryEnableObjectEventAnim ( struct ObjectEvent * , struct Sprite * ) ;
static void ObjectEventExecHeldMovementAction ( struct ObjectEvent * , struct Sprite * ) ;
static void UpdateObjectEventSpriteAnimPause ( struct ObjectEvent * , struct Sprite * ) ;
static bool8 IsCoordOutsideObjectEventMovementRange ( struct ObjectEvent * , s16 , s16 ) ;
static bool8 IsMetatileDirectionallyImpassable ( struct ObjectEvent * , s16 , s16 , u8 ) ;
static bool8 DoesObjectCollideWithObjectAt ( struct ObjectEvent * , s16 , s16 ) ;
static void sub_8096530 ( struct ObjectEvent * , struct Sprite * ) ;
2019-11-21 06:14:40 +01:00
static void UpdateObjEventSpriteVisibility ( struct ObjectEvent * , struct Sprite * ) ;
2019-11-21 04:55:44 +01:00
static void ObjectEventUpdateMetatileBehaviors ( struct ObjectEvent * ) ;
static void GetGroundEffectFlags_Reflection ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_TallGrassOnSpawn ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_LongGrassOnSpawn ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_SandHeap ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_ShallowFlowingWater ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_ShortGrass ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_HotSprings ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_TallGrassOnBeginStep ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_LongGrassOnBeginStep ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_Tracks ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_Puddle ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_Ripple ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_Seaweed ( struct ObjectEvent * , u32 * ) ;
static void GetGroundEffectFlags_JumpLanding ( struct ObjectEvent * , u32 * ) ;
2021-01-20 23:32:04 +01:00
static u8 ObjectEventGetNearbyReflectionType ( struct ObjectEvent * ) ;
2018-06-11 17:23:14 +02:00
static u8 GetReflectionTypeByMetatileBehavior ( u32 ) ;
static void InitObjectPriorityByZCoord ( struct Sprite * sprite , u8 z ) ;
2019-11-21 04:55:44 +01:00
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_BikeTireTracks ( struct ObjectEvent * , struct Sprite * , u8 ) ;
static void DoRippleFieldEffect ( struct ObjectEvent * , struct Sprite * ) ;
static void DoGroundEffects_OnSpawn ( struct ObjectEvent * , struct Sprite * ) ;
static void DoGroundEffects_OnBeginStep ( struct ObjectEvent * , struct Sprite * ) ;
static void DoGroundEffects_OnFinishStep ( struct ObjectEvent * , struct Sprite * ) ;
2020-06-01 16:23:12 +02:00
static void UpdateObjectEventSpritePosition ( struct Sprite * ) ;
2018-06-14 00:51:26 +02:00
static void ApplyLevitateMovement ( u8 ) ;
2019-11-21 04:55:44 +01:00
static bool8 MovementType_Disguise_Callback ( struct ObjectEvent * , struct Sprite * ) ;
2021-02-14 20:25:23 +01:00
static bool8 MovementType_Buried_Callback ( struct ObjectEvent * , struct Sprite * ) ;
2018-10-17 02:11:44 +02:00
static void CreateReflectionEffectSprites ( void ) ;
2019-11-21 04:55:44 +01:00
static u8 GetObjectEventIdByLocalId ( u8 ) ;
static u8 GetObjectEventIdByLocalIdAndMapInternal ( u8 , u8 , u8 ) ;
static bool8 GetAvailableObjectEventId ( u16 , u8 , u8 , u8 * ) ;
static void SetObjectEventDynamicGraphicsId ( struct ObjectEvent * ) ;
static void RemoveObjectEventInternal ( struct ObjectEvent * ) ;
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 * ) ;
2020-06-20 07:40:12 +02:00
//static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8);
2019-11-21 04:55:44 +01:00
static void LoadObjectEventPalette ( u16 ) ;
static void RemoveObjectEventIfOutsideView ( struct ObjectEvent * ) ;
2018-06-14 00:51:26 +02:00
static void sub_808E1B8 ( u8 , s16 , s16 ) ;
2019-11-21 04:55:44 +01:00
static void SetPlayerAvatarObjectEventIdAndObjectId ( u8 , u8 ) ;
static void sub_808E38C ( struct ObjectEvent * ) ;
2018-06-14 00:51:26 +02:00
static u8 sub_808E8F4 ( const struct SpritePalette * ) ;
2019-11-21 04:55:44 +01:00
static u8 FindObjectEventPaletteIndexByTag ( u16 ) ;
2018-06-14 00:51:26 +02:00
static void sub_808EAB0 ( u16 , u8 ) ;
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventDoesZCoordMatch ( struct ObjectEvent * , u8 ) ;
2018-06-14 00:51:26 +02:00
static void ObjectCB_CameraObject ( struct Sprite * ) ;
static void CameraObject_0 ( struct Sprite * ) ;
static void CameraObject_1 ( struct Sprite * ) ;
static void CameraObject_2 ( struct Sprite * ) ;
2019-11-21 04:55:44 +01:00
static struct ObjectEventTemplate * FindObjectEventTemplateByLocalId ( u8 localId , struct ObjectEventTemplate * templates , u8 count ) ;
static void ClearObjectEventMovement ( struct ObjectEvent * , struct Sprite * ) ;
static void ObjectEventSetSingleMovement ( struct ObjectEvent * , struct Sprite * , u8 ) ;
2018-10-20 22:01:45 +02:00
static void oamt_npc_ministep_reset ( struct Sprite * , u8 , u8 ) ;
2020-06-24 22:27:00 +02:00
static void InitSpriteForFigure8Anim ( struct Sprite * sprite ) ;
static bool8 AnimateSpriteInFigure8 ( struct Sprite * sprite ) ;
2020-06-01 16:23:12 +02:00
static void UpdateObjectEventSprite ( struct Sprite * ) ;
2018-06-11 15:34:19 +02:00
2020-06-20 07:40:12 +02:00
static void StartSlowRunningAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction ) ;
2018-09-03 00:20:45 +02:00
const u8 gReflectionEffectPaletteMap [ ] = { 1 , 1 , 6 , 7 , 8 , 9 , 6 , 7 , 8 , 9 , 11 , 11 , 0 , 0 , 0 , 0 } ;
2018-06-12 00:33:50 +02:00
2018-12-05 15:31:01 +01:00
const struct SpriteTemplate gCameraSpriteTemplate = { 0 , 0xFFFF , & gDummyOamData , gDummySpriteAnimTable , NULL , gDummySpriteAffineAnimTable , ObjectCB_CameraObject } ;
2018-06-12 00:33:50 +02:00
void ( * const gCameraObjectFuncs [ ] ) ( struct Sprite * ) = {
CameraObject_0 ,
CameraObject_1 ,
CameraObject_2 ,
} ;
2020-02-13 00:32:51 +01:00
# include "data/object_events/object_event_graphics.h"
2018-06-12 00:33:50 +02:00
// movement type callbacks
2018-06-14 00:51:26 +02:00
static void ( * const sMovementTypeCallbacks [ ] ) ( struct Sprite * ) =
{
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_NONE ] = MovementType_None ,
[ MOVEMENT_TYPE_LOOK_AROUND ] = MovementType_LookAround ,
[ MOVEMENT_TYPE_WANDER_AROUND ] = MovementType_WanderAround ,
[ MOVEMENT_TYPE_WANDER_UP_AND_DOWN ] = MovementType_WanderUpAndDown ,
[ MOVEMENT_TYPE_WANDER_DOWN_AND_UP ] = MovementType_WanderUpAndDown ,
[ MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT ] = MovementType_WanderLeftAndRight ,
[ MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT ] = MovementType_WanderLeftAndRight ,
[ MOVEMENT_TYPE_FACE_UP ] = MovementType_FaceDirection ,
[ MOVEMENT_TYPE_FACE_DOWN ] = MovementType_FaceDirection ,
[ MOVEMENT_TYPE_FACE_LEFT ] = MovementType_FaceDirection ,
[ MOVEMENT_TYPE_FACE_RIGHT ] = MovementType_FaceDirection ,
[ MOVEMENT_TYPE_PLAYER ] = MovementType_Player ,
[ MOVEMENT_TYPE_BERRY_TREE_GROWTH ] = MovementType_BerryTreeGrowth ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_UP ] = MovementType_FaceDownAndUp ,
[ MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT ] = MovementType_FaceLeftAndRight ,
[ MOVEMENT_TYPE_FACE_UP_AND_LEFT ] = MovementType_FaceUpAndLeft ,
[ MOVEMENT_TYPE_FACE_UP_AND_RIGHT ] = MovementType_FaceUpAndRight ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_LEFT ] = MovementType_FaceDownAndLeft ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT ] = MovementType_FaceDownAndRight ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT ] = MovementType_FaceDownUpAndLeft ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT ] = MovementType_FaceDownUpAndRight ,
[ MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT ] = MovementType_FaceUpRightAndLeft ,
[ MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT ] = MovementType_FaceDownRightAndLeft ,
[ MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE ] = MovementType_RotateCounterclockwise ,
[ MOVEMENT_TYPE_ROTATE_CLOCKWISE ] = MovementType_RotateClockwise ,
[ MOVEMENT_TYPE_WALK_UP_AND_DOWN ] = MovementType_WalkBackAndForth ,
[ MOVEMENT_TYPE_WALK_DOWN_AND_UP ] = MovementType_WalkBackAndForth ,
[ MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT ] = MovementType_WalkBackAndForth ,
[ MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT ] = MovementType_WalkBackAndForth ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN ] = MovementType_WalkSequenceUpRightLeftDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP ] = MovementType_WalkSequenceRightLeftDownUp ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT ] = MovementType_WalkSequenceDownUpRightLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT ] = MovementType_WalkSequenceLeftDownUpRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN ] = MovementType_WalkSequenceUpLeftRightDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP ] = MovementType_WalkSequenceLeftRightDownUp ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT ] = MovementType_WalkSequenceDownUpLeftRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT ] = MovementType_WalkSequenceRightDownUpLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT ] = MovementType_WalkSequenceLeftUpDownRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT ] = MovementType_WalkSequenceUpDownRightLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN ] = MovementType_WalkSequenceRightLeftUpDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP ] = MovementType_WalkSequenceDownRightLeftUp ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT ] = MovementType_WalkSequenceRightUpDownLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT ] = MovementType_WalkSequenceUpDownLeftRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN ] = MovementType_WalkSequenceLeftRightUpDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP ] = MovementType_WalkSequenceDownLeftRightUp ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT ] = MovementType_WalkSequenceUpLeftDownRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT ] = MovementType_WalkSequenceDownRightUpLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP ] = MovementType_WalkSequenceLeftDownRightUp ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN ] = MovementType_WalkSequenceRightUpLeftDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT ] = MovementType_WalkSequenceUpRightDownLeft ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT ] = MovementType_WalkSequenceDownLeftUpRight ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN ] = MovementType_WalkSequenceLeftUpRightDown ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP ] = MovementType_WalkSequenceRightDownLeftUp ,
[ MOVEMENT_TYPE_COPY_PLAYER ] = MovementType_CopyPlayer ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE ] = MovementType_CopyPlayer ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE ] = MovementType_CopyPlayer ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE ] = MovementType_CopyPlayer ,
[ MOVEMENT_TYPE_TREE_DISGUISE ] = MovementType_TreeDisguise ,
[ MOVEMENT_TYPE_MOUNTAIN_DISGUISE ] = MovementType_MountainDisguise ,
[ MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS ] = MovementType_CopyPlayerInGrass ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS ] = MovementType_CopyPlayerInGrass ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS ] = MovementType_CopyPlayerInGrass ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS ] = MovementType_CopyPlayerInGrass ,
2021-02-14 20:25:23 +01:00
[ MOVEMENT_TYPE_BURIED ] = MovementType_Buried ,
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_WALK_IN_PLACE_DOWN ] = MovementType_WalkInPlace ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_UP ] = MovementType_WalkInPlace ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_LEFT ] = MovementType_WalkInPlace ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT ] = MovementType_WalkInPlace ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_DOWN ] = MovementType_JogInPlace ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_UP ] = MovementType_JogInPlace ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_LEFT ] = MovementType_JogInPlace ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT ] = MovementType_JogInPlace ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_DOWN ] = MovementType_RunInPlace ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_UP ] = MovementType_RunInPlace ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_LEFT ] = MovementType_RunInPlace ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT ] = MovementType_RunInPlace ,
[ MOVEMENT_TYPE_INVISIBLE ] = MovementType_Invisible ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN ] = MovementType_WalkSlowlyInPlace ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP ] = MovementType_WalkSlowlyInPlace ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT ] = MovementType_WalkSlowlyInPlace ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT ] = MovementType_WalkSlowlyInPlace ,
2018-06-12 00:33:50 +02:00
} ;
const u8 gRangedMovementTypes [ ] = {
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_NONE ] = 0 ,
[ MOVEMENT_TYPE_LOOK_AROUND ] = 0 ,
[ MOVEMENT_TYPE_WANDER_AROUND ] = 1 ,
[ MOVEMENT_TYPE_WANDER_UP_AND_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WANDER_DOWN_AND_UP ] = 1 ,
[ MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT ] = 1 ,
[ MOVEMENT_TYPE_FACE_UP ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN ] = 0 ,
[ MOVEMENT_TYPE_FACE_LEFT ] = 0 ,
[ MOVEMENT_TYPE_FACE_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_PLAYER ] = 0 ,
[ MOVEMENT_TYPE_BERRY_TREE_GROWTH ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_UP ] = 0 ,
[ MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_FACE_UP_AND_LEFT ] = 0 ,
[ MOVEMENT_TYPE_FACE_UP_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_LEFT ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE ] = 0 ,
[ MOVEMENT_TYPE_ROTATE_CLOCKWISE ] = 0 ,
[ MOVEMENT_TYPE_WALK_UP_AND_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_DOWN_AND_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN ] = 1 ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE ] = 1 ,
[ MOVEMENT_TYPE_TREE_DISGUISE ] = 0 ,
[ MOVEMENT_TYPE_MOUNTAIN_DISGUISE ] = 0 ,
[ MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS ] = 1 ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS ] = 1 ,
2021-02-14 20:25:23 +01:00
[ MOVEMENT_TYPE_BURIED ] = 0 ,
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_WALK_IN_PLACE_DOWN ] = 0 ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_UP ] = 0 ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_LEFT ] = 0 ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_DOWN ] = 0 ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_UP ] = 0 ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_LEFT ] = 0 ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_DOWN ] = 0 ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_UP ] = 0 ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_LEFT ] = 0 ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT ] = 0 ,
[ MOVEMENT_TYPE_INVISIBLE ] = 0 ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN ] = 0 ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP ] = 0 ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT ] = 0 ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT ] = 0 ,
2018-06-12 00:33:50 +02:00
} ;
const u8 gInitialMovementTypeFacingDirections [ ] = {
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_NONE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_LOOK_AROUND ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WANDER_AROUND ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WANDER_UP_AND_DOWN ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WANDER_DOWN_AND_UP ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT ] = DIR_WEST ,
[ MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT ] = DIR_EAST ,
[ MOVEMENT_TYPE_FACE_UP ] = DIR_NORTH ,
[ MOVEMENT_TYPE_FACE_DOWN ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_LEFT ] = DIR_WEST ,
[ MOVEMENT_TYPE_FACE_RIGHT ] = DIR_EAST ,
[ MOVEMENT_TYPE_PLAYER ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_BERRY_TREE_GROWTH ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_UP ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT ] = DIR_WEST ,
[ MOVEMENT_TYPE_FACE_UP_AND_LEFT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_FACE_UP_AND_RIGHT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_LEFT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_ROTATE_CLOCKWISE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_UP_AND_DOWN ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_DOWN_AND_UP ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN ] = DIR_EAST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP ] = DIR_EAST ,
[ MOVEMENT_TYPE_COPY_PLAYER ] = DIR_NORTH ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE ] = DIR_WEST ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE ] = DIR_EAST ,
[ MOVEMENT_TYPE_TREE_DISGUISE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_MOUNTAIN_DISGUISE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS ] = DIR_NORTH ,
[ MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS ] = DIR_WEST ,
[ MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS ] = DIR_EAST ,
2021-02-14 20:25:23 +01:00
[ MOVEMENT_TYPE_BURIED ] = DIR_SOUTH ,
2018-12-05 15:31:01 +01:00
[ MOVEMENT_TYPE_WALK_IN_PLACE_DOWN ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_UP ] = DIR_NORTH ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_LEFT ] = DIR_WEST ,
[ MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT ] = DIR_EAST ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_DOWN ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_UP ] = DIR_NORTH ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_LEFT ] = DIR_WEST ,
[ MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT ] = DIR_EAST ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_DOWN ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_UP ] = DIR_NORTH ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_LEFT ] = DIR_WEST ,
[ MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT ] = DIR_EAST ,
[ MOVEMENT_TYPE_INVISIBLE ] = DIR_SOUTH ,
[ MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN ] = DIR_SOUTH ,
[ 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 ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
# define OBJ_EVENT_PAL_TAG_BRENDAN 0x1100
# define OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION 0x1101
# define OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION 0x1102
# define OBJ_EVENT_PAL_TAG_NPC_1 0x1103
# define OBJ_EVENT_PAL_TAG_NPC_2 0x1104
# define OBJ_EVENT_PAL_TAG_NPC_3 0x1105
# define OBJ_EVENT_PAL_TAG_NPC_4 0x1106
# define OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION 0x1107
# define OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION 0x1108
# define OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION 0x1109
# define OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION 0x110A
# define OBJ_EVENT_PAL_TAG_QUINTY_PLUMP 0x110B
# define OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION 0x110C
# define OBJ_EVENT_PAL_TAG_TRUCK 0x110D
# define OBJ_EVENT_PAL_TAG_VIGOROTH 0x110E
# define OBJ_EVENT_PAL_TAG_ZIGZAGOON 0x110F
# define OBJ_EVENT_PAL_TAG_MAY 0x1110
# define OBJ_EVENT_PAL_TAG_MAY_REFLECTION 0x1111
# define OBJ_EVENT_PAL_TAG_MOVING_BOX 0x1112
# define OBJ_EVENT_PAL_TAG_CABLE_CAR 0x1113
# define OBJ_EVENT_PAL_TAG_SSTIDAL 0x1114
# define OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER 0x1115
# define OBJ_EVENT_PAL_TAG_KYOGRE 0x1116
# define OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION 0x1117
# define OBJ_EVENT_PAL_TAG_GROUDON 0x1118
# define OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION 0x1119
# define OBJ_EVENT_PAL_TAG_UNUSED 0x111A
# define OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW 0x111B
# define OBJ_EVENT_PAL_TAG_POOCHYENA 0x111C
# define OBJ_EVENT_PAL_TAG_RED_LEAF 0x111D
# define OBJ_EVENT_PAL_TAG_DEOXYS 0x111E
# define OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE 0x111F
# define OBJ_EVENT_PAL_TAG_HO_OH 0x1120
# define OBJ_EVENT_PAL_TAG_LUGIA 0x1121
# define OBJ_EVENT_PAL_TAG_RS_BRENDAN 0x1122
# define OBJ_EVENT_PAL_TAG_RS_MAY 0x1123
# define OBJ_EVENT_PAL_TAG_NONE 0x11FF
2018-09-08 06:52:11 +02:00
2020-02-13 00:32:51 +01:00
# include "data/object_events/object_event_graphics_info_pointers.h"
# include "data/field_effects/field_effect_object_template_pointers.h"
# include "data/object_events/object_event_pic_tables.h"
# include "data/object_events/object_event_anims.h"
# include "data/object_events/base_oam.h"
# include "data/object_events/object_event_subsprites.h"
# include "data/object_events/object_event_graphics_info.h"
2019-11-21 04:55:44 +01:00
2020-11-23 20:12:07 +01:00
static const struct SpritePalette sObjectEventSpritePalettes [ ] = {
{ gObjectEventPal_Npc1 , OBJ_EVENT_PAL_TAG_NPC_1 } ,
{ gObjectEventPal_Npc2 , OBJ_EVENT_PAL_TAG_NPC_2 } ,
{ gObjectEventPal_Npc3 , OBJ_EVENT_PAL_TAG_NPC_3 } ,
{ gObjectEventPal_Npc4 , OBJ_EVENT_PAL_TAG_NPC_4 } ,
{ gObjectEventPal_Npc1Reflection , OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION } ,
{ gObjectEventPal_Npc2Reflection , OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION } ,
{ gObjectEventPal_Npc3Reflection , OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION } ,
{ gObjectEventPal_Npc4Reflection , OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION } ,
{ gObjectEventPal_Brendan , OBJ_EVENT_PAL_TAG_BRENDAN } ,
{ gObjectEventPal_BrendanReflection , OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION } ,
{ gObjectEventPal_BridgeReflection , OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION } ,
{ gObjectEventPal_PlayerUnderwater , OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER } ,
{ gObjectEventPal_QuintyPlump , OBJ_EVENT_PAL_TAG_QUINTY_PLUMP } ,
{ gObjectEventPal_QuintyPlumpReflection , OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION } ,
{ gObjectEventPal_Truck , OBJ_EVENT_PAL_TAG_TRUCK } ,
{ gObjectEventPal_Vigoroth , OBJ_EVENT_PAL_TAG_VIGOROTH } ,
{ gObjectEventPal_EnemyZigzagoon , OBJ_EVENT_PAL_TAG_ZIGZAGOON } ,
{ gObjectEventPal_May , OBJ_EVENT_PAL_TAG_MAY } ,
{ gObjectEventPal_MayReflection , OBJ_EVENT_PAL_TAG_MAY_REFLECTION } ,
{ gObjectEventPal_MovingBox , OBJ_EVENT_PAL_TAG_MOVING_BOX } ,
{ gObjectEventPal_CableCar , OBJ_EVENT_PAL_TAG_CABLE_CAR } ,
{ gObjectEventPal_SSTidal , OBJ_EVENT_PAL_TAG_SSTIDAL } ,
{ gObjectEventPal_Kyogre , OBJ_EVENT_PAL_TAG_KYOGRE } ,
{ gObjectEventPal_KyogreReflection , OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION } ,
{ gObjectEventPal_Groudon , OBJ_EVENT_PAL_TAG_GROUDON } ,
{ gObjectEventPal_GroudonReflection , OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION } ,
{ gObjectEventPal_SubmarineShadow , OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW } ,
{ gObjectEventPal_Poochyena , OBJ_EVENT_PAL_TAG_POOCHYENA } ,
{ gObjectEventPal_RedLeaf , OBJ_EVENT_PAL_TAG_RED_LEAF } ,
{ gObjectEventPal_Deoxys , OBJ_EVENT_PAL_TAG_DEOXYS } ,
{ gObjectEventPal_BirthIslandStone , OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE } ,
{ gObjectEventPal_HoOh , OBJ_EVENT_PAL_TAG_HO_OH } ,
{ gObjectEventPal_Lugia , OBJ_EVENT_PAL_TAG_LUGIA } ,
{ gObjectEventPal_RubySapphireBrendan , OBJ_EVENT_PAL_TAG_RS_BRENDAN } ,
{ gObjectEventPal_RubySapphireMay , OBJ_EVENT_PAL_TAG_RS_MAY } ,
{ NULL , 0x0000 } ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_Brendan [ ] = {
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_May [ ] = {
OBJ_EVENT_PAL_TAG_MAY_REFLECTION ,
OBJ_EVENT_PAL_TAG_MAY_REFLECTION ,
OBJ_EVENT_PAL_TAG_MAY_REFLECTION ,
OBJ_EVENT_PAL_TAG_MAY_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_PlayerUnderwater [ ] = {
OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER ,
OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER ,
OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER ,
OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const struct PairedPalettes sPlayerReflectionPaletteSets [ ] = {
{ OBJ_EVENT_PAL_TAG_BRENDAN , sReflectionPaletteTags_Brendan } ,
{ OBJ_EVENT_PAL_TAG_MAY , sReflectionPaletteTags_May } ,
{ OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER , sReflectionPaletteTags_PlayerUnderwater } ,
{ OBJ_EVENT_PAL_TAG_NONE , NULL } ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_QuintyPlump [ ] = {
OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION ,
OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION ,
OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION ,
OBJ_EVENT_PAL_TAG_QUINTY_PLUMP_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_Truck [ ] = {
OBJ_EVENT_PAL_TAG_TRUCK ,
OBJ_EVENT_PAL_TAG_TRUCK ,
OBJ_EVENT_PAL_TAG_TRUCK ,
OBJ_EVENT_PAL_TAG_TRUCK ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_VigorothMover [ ] = {
OBJ_EVENT_PAL_TAG_VIGOROTH ,
OBJ_EVENT_PAL_TAG_VIGOROTH ,
OBJ_EVENT_PAL_TAG_VIGOROTH ,
OBJ_EVENT_PAL_TAG_VIGOROTH ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_MovingBox [ ] = {
OBJ_EVENT_PAL_TAG_MOVING_BOX ,
OBJ_EVENT_PAL_TAG_MOVING_BOX ,
OBJ_EVENT_PAL_TAG_MOVING_BOX ,
OBJ_EVENT_PAL_TAG_MOVING_BOX ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_CableCar [ ] = {
OBJ_EVENT_PAL_TAG_CABLE_CAR ,
OBJ_EVENT_PAL_TAG_CABLE_CAR ,
OBJ_EVENT_PAL_TAG_CABLE_CAR ,
OBJ_EVENT_PAL_TAG_CABLE_CAR ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_SSTidal [ ] = {
OBJ_EVENT_PAL_TAG_SSTIDAL ,
OBJ_EVENT_PAL_TAG_SSTIDAL ,
OBJ_EVENT_PAL_TAG_SSTIDAL ,
OBJ_EVENT_PAL_TAG_SSTIDAL ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_SubmarineShadow [ ] = {
OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW ,
OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW ,
OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW ,
OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_Kyogre [ ] = {
OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION ,
OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION ,
OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION ,
OBJ_EVENT_PAL_TAG_KYOGRE_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_Groudon [ ] = {
OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION ,
OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION ,
OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION ,
OBJ_EVENT_PAL_TAG_GROUDON_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_Npc3 [ ] = { // Only used by the Route 120 bridge Kecleon
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sReflectionPaletteTags_RedLeaf [ ] = {
OBJ_EVENT_PAL_TAG_RED_LEAF ,
OBJ_EVENT_PAL_TAG_RED_LEAF ,
OBJ_EVENT_PAL_TAG_RED_LEAF ,
OBJ_EVENT_PAL_TAG_RED_LEAF ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const struct PairedPalettes sSpecialObjectReflectionPaletteSets [ ] = {
{ OBJ_EVENT_PAL_TAG_BRENDAN , sReflectionPaletteTags_Brendan } ,
{ OBJ_EVENT_PAL_TAG_MAY , sReflectionPaletteTags_May } ,
{ OBJ_EVENT_PAL_TAG_QUINTY_PLUMP , sReflectionPaletteTags_QuintyPlump } ,
{ OBJ_EVENT_PAL_TAG_TRUCK , sReflectionPaletteTags_Truck } ,
{ OBJ_EVENT_PAL_TAG_VIGOROTH , sReflectionPaletteTags_VigorothMover } ,
{ OBJ_EVENT_PAL_TAG_MOVING_BOX , sReflectionPaletteTags_MovingBox } ,
{ OBJ_EVENT_PAL_TAG_CABLE_CAR , sReflectionPaletteTags_CableCar } ,
{ OBJ_EVENT_PAL_TAG_SSTIDAL , sReflectionPaletteTags_SSTidal } ,
{ OBJ_EVENT_PAL_TAG_KYOGRE , sReflectionPaletteTags_Kyogre } ,
{ OBJ_EVENT_PAL_TAG_GROUDON , sReflectionPaletteTags_Groudon } ,
{ OBJ_EVENT_PAL_TAG_NPC_3 , sReflectionPaletteTags_Npc3 } ,
{ OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW , sReflectionPaletteTags_SubmarineShadow } ,
{ OBJ_EVENT_PAL_TAG_RED_LEAF , sReflectionPaletteTags_RedLeaf } ,
{ OBJ_EVENT_PAL_TAG_NONE , NULL } ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sObjectPaletteTags0 [ ] = {
OBJ_EVENT_PAL_TAG_BRENDAN ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_1 ,
OBJ_EVENT_PAL_TAG_NPC_2 ,
OBJ_EVENT_PAL_TAG_NPC_3 ,
OBJ_EVENT_PAL_TAG_NPC_4 ,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sObjectPaletteTags1 [ ] = {
OBJ_EVENT_PAL_TAG_BRENDAN ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_1 ,
OBJ_EVENT_PAL_TAG_NPC_2 ,
OBJ_EVENT_PAL_TAG_NPC_3 ,
OBJ_EVENT_PAL_TAG_NPC_4 ,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sObjectPaletteTags2 [ ] = {
OBJ_EVENT_PAL_TAG_BRENDAN ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_1 ,
OBJ_EVENT_PAL_TAG_NPC_2 ,
OBJ_EVENT_PAL_TAG_NPC_3 ,
OBJ_EVENT_PAL_TAG_NPC_4 ,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 sObjectPaletteTags3 [ ] = {
OBJ_EVENT_PAL_TAG_BRENDAN ,
OBJ_EVENT_PAL_TAG_BRENDAN_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_1 ,
OBJ_EVENT_PAL_TAG_NPC_2 ,
OBJ_EVENT_PAL_TAG_NPC_3 ,
OBJ_EVENT_PAL_TAG_NPC_4 ,
OBJ_EVENT_PAL_TAG_NPC_1_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_2_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_3_REFLECTION ,
OBJ_EVENT_PAL_TAG_NPC_4_REFLECTION ,
2018-06-12 00:33:50 +02:00
} ;
2020-11-23 20:12:07 +01:00
static const u16 * const sObjectPaletteTagSets [ ] = {
sObjectPaletteTags0 ,
sObjectPaletteTags1 ,
sObjectPaletteTags2 ,
sObjectPaletteTags3 ,
2018-06-12 00:33:50 +02:00
} ;
2020-02-13 00:32:51 +01:00
# include "data/object_events/berry_tree_graphics_tables.h"
# include "data/field_effects/field_effect_objects.h"
2018-06-12 00:33:50 +02:00
const s16 gMovementDelaysMedium [ ] = { 32 , 64 , 96 , 128 } ;
const s16 gMovementDelaysLong [ ] = { 32 , 64 , 128 , 192 } ;
const s16 gMovementDelaysShort [ ] = { 32 , 48 , 64 , 80 } ;
2020-02-13 00:32:51 +01:00
# include "data/object_events/movement_type_func_tables.h"
2018-06-12 00:33:50 +02:00
2018-06-14 00:51:26 +02:00
const u8 gFaceDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 0 ,
[ DIR_SOUTH ] = 0 ,
[ DIR_NORTH ] = 1 ,
[ DIR_WEST ] = 2 ,
[ DIR_EAST ] = 3 ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = 2 , //0,
[ DIR_SOUTHEAST ] = 3 , //0,
[ DIR_NORTHWEST ] = 2 , //1,
[ DIR_NORTHEAST ] = 3 , //1,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gMoveDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 4 ,
[ DIR_SOUTH ] = 4 ,
[ DIR_NORTH ] = 5 ,
[ DIR_WEST ] = 6 ,
[ DIR_EAST ] = 7 ,
2020-06-20 07:40:12 +02:00
[ DIR_SOUTHWEST ] = 6 ,
[ DIR_SOUTHEAST ] = 7 ,
[ DIR_NORTHWEST ] = 6 ,
[ DIR_NORTHEAST ] = 7 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gMoveDirectionFastAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 8 ,
[ DIR_SOUTH ] = 8 ,
[ DIR_NORTH ] = 9 ,
[ DIR_WEST ] = 10 ,
[ DIR_EAST ] = 11 ,
2020-06-20 07:40:12 +02:00
[ DIR_SOUTHWEST ] = 10 ,
[ DIR_SOUTHEAST ] = 11 ,
[ DIR_NORTHWEST ] = 10 ,
[ DIR_NORTHEAST ] = 11 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gMoveDirectionFasterAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 12 ,
[ DIR_SOUTH ] = 12 ,
[ DIR_NORTH ] = 13 ,
[ DIR_WEST ] = 14 ,
[ DIR_EAST ] = 15 ,
2020-06-20 07:40:12 +02:00
[ DIR_SOUTHWEST ] = 14 ,
[ DIR_SOUTHEAST ] = 15 ,
[ DIR_NORTHWEST ] = 14 ,
[ DIR_NORTHEAST ] = 15 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gMoveDirectionFastestAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 16 ,
[ DIR_SOUTH ] = 16 ,
[ DIR_NORTH ] = 17 ,
[ DIR_WEST ] = 18 ,
[ DIR_EAST ] = 19 ,
2020-06-20 07:40:12 +02:00
[ DIR_SOUTHWEST ] = 18 ,
[ DIR_SOUTHEAST ] = 19 ,
[ DIR_NORTHWEST ] = 18 ,
[ DIR_NORTHEAST ] = 19 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJumpSpecialDirectionAnimNums [ ] = { // used for jumping onto surf mon
2018-12-05 15:31:01 +01:00
[ 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 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 20 ,
[ DIR_SOUTH ] = 20 ,
[ DIR_NORTH ] = 21 ,
[ DIR_WEST ] = 22 ,
[ DIR_EAST ] = 23 ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = 22 , //20,
[ DIR_SOUTHEAST ] = 23 , //20,
[ DIR_NORTHWEST ] = 22 , //21,
[ DIR_NORTHEAST ] = 23 , //21,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gUnrefAnimNums_08375633 [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 24 ,
[ DIR_SOUTH ] = 24 ,
[ DIR_NORTH ] = 25 ,
[ DIR_WEST ] = 26 ,
[ DIR_EAST ] = 27 ,
[ DIR_SOUTHWEST ] = 24 ,
[ DIR_SOUTHEAST ] = 24 ,
[ DIR_NORTHWEST ] = 25 ,
[ DIR_NORTHEAST ] = 25 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroEndWheelieDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 28 ,
[ DIR_SOUTH ] = 28 ,
[ DIR_NORTH ] = 29 ,
[ DIR_WEST ] = 30 ,
[ DIR_EAST ] = 31 ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = 30 , //28,
[ DIR_SOUTHEAST ] = 31 , //28,
[ DIR_NORTHWEST ] = 30 , //29,
[ DIR_NORTHEAST ] = 31 , //29,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroUnusedActionDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 32 ,
[ DIR_SOUTH ] = 32 ,
[ DIR_NORTH ] = 33 ,
[ DIR_WEST ] = 34 ,
[ DIR_EAST ] = 35 ,
[ DIR_SOUTHWEST ] = 32 ,
[ DIR_SOUTHEAST ] = 32 ,
[ DIR_NORTHWEST ] = 33 ,
[ DIR_NORTHEAST ] = 33 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheeliePedalDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 36 ,
[ DIR_SOUTH ] = 36 ,
[ DIR_NORTH ] = 37 ,
[ DIR_WEST ] = 38 ,
[ DIR_EAST ] = 39 ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = 38 , //36,
[ DIR_SOUTHEAST ] = 39 , //36,
[ DIR_NORTHWEST ] = 38 , //37,
[ DIR_NORTHEAST ] = 39 , //37,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gFishingDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 0 ,
[ DIR_SOUTH ] = 0 ,
[ DIR_NORTH ] = 1 ,
[ DIR_WEST ] = 2 ,
[ DIR_EAST ] = 3 ,
[ DIR_SOUTHWEST ] = 0 ,
[ DIR_SOUTHEAST ] = 0 ,
[ DIR_NORTHWEST ] = 1 ,
[ DIR_NORTHEAST ] = 1 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gFishingNoCatchDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 4 ,
[ DIR_SOUTH ] = 4 ,
[ DIR_NORTH ] = 5 ,
[ DIR_WEST ] = 6 ,
[ DIR_EAST ] = 7 ,
[ DIR_SOUTHWEST ] = 4 ,
[ DIR_SOUTHEAST ] = 4 ,
[ DIR_NORTHWEST ] = 5 ,
[ DIR_NORTHEAST ] = 5 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gFishingBiteDirectionAnimNums [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = 8 ,
[ DIR_SOUTH ] = 8 ,
[ DIR_NORTH ] = 9 ,
[ DIR_WEST ] = 10 ,
[ DIR_EAST ] = 11 ,
[ DIR_SOUTHWEST ] = 8 ,
[ DIR_SOUTHEAST ] = 8 ,
[ DIR_NORTHWEST ] = 9 ,
[ DIR_NORTHEAST ] = 9 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gRunningDirectionAnimNums [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = 20 ,
[ DIR_SOUTH ] = 20 ,
[ DIR_NORTH ] = 21 ,
[ DIR_WEST ] = 22 ,
[ DIR_EAST ] = 23 ,
[ DIR_SOUTHWEST ] = 22 ,
[ DIR_SOUTHEAST ] = 23 ,
[ DIR_NORTHWEST ] = 22 ,
[ DIR_NORTHEAST ] = 23 ,
} ;
2018-06-14 00:51:26 +02:00
const u8 gTrainerFacingDirectionMovementTypes [ ] = {
2018-12-05 15:31:01 +01:00
[ DIR_NONE ] = MOVEMENT_TYPE_FACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_TYPE_FACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_TYPE_FACE_UP ,
[ DIR_WEST ] = MOVEMENT_TYPE_FACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_TYPE_FACE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_TYPE_FACE_DOWN ,
[ DIR_SOUTHEAST ] = MOVEMENT_TYPE_FACE_DOWN ,
[ DIR_NORTHWEST ] = MOVEMENT_TYPE_FACE_UP ,
[ DIR_NORTHEAST ] = MOVEMENT_TYPE_FACE_UP ,
2018-06-12 00:33:50 +02:00
} ;
bool8 ( * const gOppositeDirectionBlockedMetatileFuncs [ ] ) ( u8 ) = {
MetatileBehavior_IsSouthBlocked ,
MetatileBehavior_IsNorthBlocked ,
MetatileBehavior_IsWestBlocked ,
MetatileBehavior_IsEastBlocked
} ;
bool8 ( * const gDirectionBlockedMetatileFuncs [ ] ) ( u8 ) = {
MetatileBehavior_IsNorthBlocked ,
MetatileBehavior_IsSouthBlocked ,
MetatileBehavior_IsEastBlocked ,
MetatileBehavior_IsWestBlocked
} ;
2018-09-05 00:31:37 +02:00
static const struct Coords16 sDirectionToVectors [ ] = {
2018-06-12 00:33:50 +02:00
{ 0 , 0 } ,
{ 0 , 1 } ,
{ 0 , - 1 } ,
{ - 1 , 0 } ,
{ 1 , 0 } ,
{ - 1 , 1 } ,
{ 1 , 1 } ,
{ - 1 , - 1 } ,
2020-06-03 22:23:28 +02:00
{ 1 , - 1 } ,
{ - 2 , 1 } ,
{ 2 , 1 } ,
{ - 2 , - 1 } ,
{ 2 , - 1 }
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gFaceDirectionMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_FACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_FACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_FACE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_FACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_FACE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_FACE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_FACE_RIGHT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_FACE_LEFT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_FACE_RIGHT
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkSlowMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_WALK_SLOW_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_WALK_SLOW_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_WALK_SLOW_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_WALK_SLOW_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_WALK_SLOW_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkNormalMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ 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_NORMAL_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_WALK_NORMAL_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkFastMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_WALK_FAST_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_WALK_FAST_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_WALK_FAST_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_WALK_FAST_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_WALK_FAST_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gRideWaterCurrentMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkFastestMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_WALK_FASTEST_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_WALK_FASTEST_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_WALK_FASTEST_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_WALK_FASTEST_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_WALK_FASTEST_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gSlideMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gPlayerRunMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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 ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJump2MovementActions [ ] = {
MOVEMENT_ACTION_JUMP_2_DOWN ,
MOVEMENT_ACTION_JUMP_2_DOWN ,
MOVEMENT_ACTION_JUMP_2_UP ,
MOVEMENT_ACTION_JUMP_2_LEFT ,
MOVEMENT_ACTION_JUMP_2_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJumpInPlaceMovementActions [ ] = {
MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN ,
MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN ,
MOVEMENT_ACTION_JUMP_IN_PLACE_UP ,
MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT ,
MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJumpInPlaceTurnAroundMovementActions [ ] = {
MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN ,
MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN ,
MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP ,
MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT ,
MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJumpMovementActions [ ] = {
MOVEMENT_ACTION_JUMP_DOWN ,
MOVEMENT_ACTION_JUMP_DOWN ,
MOVEMENT_ACTION_JUMP_UP ,
MOVEMENT_ACTION_JUMP_LEFT ,
MOVEMENT_ACTION_JUMP_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gJumpSpecialMovementActions [ ] = {
MOVEMENT_ACTION_JUMP_SPECIAL_DOWN ,
MOVEMENT_ACTION_JUMP_SPECIAL_DOWN ,
MOVEMENT_ACTION_JUMP_SPECIAL_UP ,
MOVEMENT_ACTION_JUMP_SPECIAL_LEFT ,
MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkInPlaceSlowMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkInPlaceNormalMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkInPlaceFastMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gWalkInPlaceFastestMovementActions [ ] = {
2020-06-20 07:40:12 +02:00
[ 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
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieFaceDirectionMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroPopWheelieFaceDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroEndWheelieFaceDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieHopFaceDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieHopDirectionMovementActions [ ] = {
2020-06-03 22:23:28 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT ,
2020-06-03 22:23:28 +02:00
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT ,
2020-06-05 06:56:25 +02:00
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieJumpDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieInPlaceDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroPopWheelieMoveDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroWheelieMoveDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2018-06-14 00:51:26 +02:00
const u8 gAcroEndWheelieMoveDirectionMovementActions [ ] = {
2020-06-05 06:56:25 +02:00
[ DIR_NONE ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN ,
[ DIR_NORTH ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP ,
[ DIR_WEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT ,
[ DIR_EAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT ,
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT ,
2018-06-12 00:33:50 +02:00
} ;
2020-06-03 22:23:28 +02:00
// run slow
const u8 gRunSlowMovementActions [ ] = {
[ DIR_NONE ] = MOVEMENT_ACTION_RUN_DOWN_SLOW ,
[ DIR_SOUTH ] = MOVEMENT_ACTION_RUN_DOWN_SLOW ,
[ DIR_NORTH ] = MOVEMENT_ACTION_RUN_UP_SLOW ,
[ DIR_WEST ] = MOVEMENT_ACTION_RUN_LEFT_SLOW ,
[ DIR_EAST ] = MOVEMENT_ACTION_RUN_RIGHT_SLOW ,
2020-07-14 22:28:02 +02:00
[ DIR_SOUTHWEST ] = MOVEMENT_ACTION_RUN_LEFT_SLOW ,
[ DIR_SOUTHEAST ] = MOVEMENT_ACTION_RUN_RIGHT_SLOW ,
[ DIR_NORTHWEST ] = MOVEMENT_ACTION_RUN_LEFT_SLOW ,
[ DIR_NORTHEAST ] = MOVEMENT_ACTION_RUN_RIGHT_SLOW ,
2020-06-03 22:23:28 +02:00
} ;
2018-06-12 00:33:50 +02:00
const u8 gOppositeDirections [ ] = {
DIR_NORTH ,
DIR_SOUTH ,
DIR_EAST ,
DIR_WEST ,
DIR_NORTHEAST ,
DIR_NORTHWEST ,
DIR_SOUTHEAST ,
DIR_SOUTHWEST ,
} ;
const u8 gUnknown_0850DC2F [ ] [ 4 ] = {
{ 2 , 1 , 4 , 3 } ,
{ 1 , 2 , 3 , 4 } ,
{ 3 , 4 , 2 , 1 } ,
{ 4 , 3 , 1 , 2 }
} ;
const u8 gUnknown_0850DC3F [ ] [ 4 ] = {
{ 2 , 1 , 4 , 3 } ,
{ 1 , 2 , 3 , 4 } ,
{ 4 , 3 , 1 , 2 } ,
{ 3 , 4 , 2 , 1 }
} ;
2020-02-13 00:32:51 +01:00
# include "data/object_events/movement_action_func_tables.h"
2018-06-11 15:34:19 +02:00
2017-09-06 14:35:16 +02:00
// Code
2019-11-21 04:55:44 +01:00
static void ClearObjectEvent ( struct ObjectEvent * objectEvent )
2017-09-06 14:46:47 +02:00
{
2019-11-21 04:55:44 +01:00
* objectEvent = ( struct ObjectEvent ) { } ;
objectEvent - > localId = 0xFF ;
objectEvent - > mapNum = 0xFF ;
objectEvent - > mapGroup = 0xFF ;
objectEvent - > movementActionId = 0xFF ;
2017-09-06 14:46:47 +02:00
}
2017-09-06 15:25:16 +02:00
2019-11-21 04:55:44 +01:00
static void ClearAllObjectEvents ( void )
2017-09-06 15:25:16 +02:00
{
u8 i ;
2017-09-06 15:42:10 +02:00
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2019-11-21 04:55:44 +01:00
ClearObjectEvent ( & gObjectEvents [ i ] ) ;
2017-09-06 15:25:16 +02:00
}
2017-09-06 15:29:59 +02:00
2019-11-21 04:55:44 +01:00
void ResetObjectEvents ( void )
2017-09-06 15:29:59 +02:00
{
2019-11-21 04:55:44 +01:00
ClearLinkPlayerObjectEvents ( ) ;
ClearAllObjectEvents ( ) ;
2017-09-06 15:29:59 +02:00
ClearPlayerAvatarInfo ( ) ;
2018-10-17 02:11:44 +02:00
CreateReflectionEffectSprites ( ) ;
2017-09-06 15:29:59 +02:00
}
2017-09-06 15:38:38 +02:00
2018-10-17 02:11:44 +02:00
static void CreateReflectionEffectSprites ( void )
2017-09-06 15:38:38 +02:00
{
2020-06-20 01:58:56 +02:00
u8 spriteId = CreateSpriteAtEnd ( gFieldEffectObjectTemplatePointers [ FLDEFFOBJ_REFLECTION_DISTORTION ] , 0 , 0 , 31 ) ;
2019-12-05 03:00:45 +01:00
gSprites [ spriteId ] . oam . affineMode = ST_OAM_AFFINE_NORMAL ;
2018-06-14 00:51:26 +02:00
InitSpriteAffineAnim ( & gSprites [ spriteId ] ) ;
StartSpriteAffineAnim ( & gSprites [ spriteId ] , 0 ) ;
2018-09-10 17:25:58 +02:00
gSprites [ spriteId ] . invisible = TRUE ;
2017-09-06 15:38:38 +02:00
2020-06-20 01:58:56 +02:00
spriteId = CreateSpriteAtEnd ( gFieldEffectObjectTemplatePointers [ FLDEFFOBJ_REFLECTION_DISTORTION ] , 0 , 0 , 31 ) ;
2019-12-05 03:00:45 +01:00
gSprites [ spriteId ] . oam . affineMode = ST_OAM_AFFINE_NORMAL ;
2018-06-14 00:51:26 +02:00
InitSpriteAffineAnim ( & gSprites [ spriteId ] ) ;
StartSpriteAffineAnim ( & gSprites [ spriteId ] , 1 ) ;
2018-09-10 17:25:58 +02:00
gSprites [ spriteId ] . invisible = TRUE ;
2017-09-06 15:38:38 +02:00
}
2017-09-06 15:42:10 +02:00
2019-11-21 04:55:44 +01:00
u8 GetFirstInactiveObjectEventId ( void )
2017-09-06 15:42:10 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-06 15:42:10 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! gObjectEvents [ i ] . active )
2017-09-06 15:42:10 +02:00
break ;
}
2018-06-14 00:51:26 +02:00
2017-09-06 15:42:10 +02:00
return i ;
}
2017-09-06 15:49:51 +02:00
2019-11-21 04:55:44 +01:00
u8 GetObjectEventIdByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroupId )
2017-09-06 15:49:51 +02:00
{
2020-06-29 01:22:59 +02:00
if ( localId < OBJ_EVENT_ID_PLAYER )
{
2019-11-21 04:55:44 +01:00
return GetObjectEventIdByLocalIdAndMapInternal ( localId , mapNum , mapGroupId ) ;
2020-06-29 01:22:59 +02:00
}
2019-11-21 04:55:44 +01:00
return GetObjectEventIdByLocalId ( localId ) ;
2017-09-06 15:49:51 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 TryGetObjectEventIdByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroupId , u8 * objectEventId )
2017-09-06 15:49:51 +02:00
{
2019-11-21 04:55:44 +01:00
* objectEventId = GetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroupId ) ;
2019-11-21 05:12:51 +01:00
if ( * objectEventId = = OBJECT_EVENTS_COUNT )
2017-09-06 15:49:51 +02:00
return TRUE ;
2018-06-14 00:51:26 +02:00
else
return FALSE ;
2017-09-06 15:49:51 +02:00
}
2017-09-06 15:52:31 +02:00
2019-11-21 04:55:44 +01:00
u8 GetObjectEventIdByXY ( s16 x , s16 y )
2017-09-06 15:52:31 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-06 15:52:31 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active & & gObjectEvents [ i ] . currentCoords . x = = x & & gObjectEvents [ i ] . currentCoords . y = = y )
2017-09-06 15:52:31 +02:00
break ;
}
2018-06-14 00:51:26 +02:00
2017-09-06 15:52:31 +02:00
return i ;
}
2017-09-06 16:48:51 +02:00
2019-11-21 04:55:44 +01:00
static u8 GetObjectEventIdByLocalIdAndMapInternal ( u8 localId , u8 mapNum , u8 mapGroupId )
2017-09-06 16:48:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-06 16:48:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active & & gObjectEvents [ i ] . localId = = localId & & gObjectEvents [ i ] . mapNum = = mapNum & & gObjectEvents [ i ] . mapGroup = = mapGroupId )
2017-09-06 16:48:51 +02:00
return i ;
}
2018-06-14 00:51:26 +02:00
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2017-09-06 16:48:51 +02:00
}
2017-09-06 20:25:17 +02:00
2019-11-21 04:55:44 +01:00
static u8 GetObjectEventIdByLocalId ( u8 localId )
2017-09-06 20:25:17 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-06 20:25:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active & & gObjectEvents [ i ] . localId = = localId )
2017-09-06 20:25:17 +02:00
return i ;
}
2018-06-14 00:51:26 +02:00
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2017-09-06 20:25:17 +02:00
}
2019-11-21 04:55:44 +01:00
static u8 InitObjectEventStateFromTemplate ( struct ObjectEventTemplate * template , u8 mapNum , u8 mapGroup )
2017-09-06 20:25:17 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
u8 objectEventId ;
2017-09-17 17:39:49 +02:00
s16 x ;
s16 y ;
2017-09-06 20:25:17 +02:00
2019-11-21 04:55:44 +01:00
if ( GetAvailableObjectEventId ( template - > localId , mapNum , mapGroup , & objectEventId ) )
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
ClearObjectEvent ( objectEvent ) ;
2017-09-06 20:25:17 +02:00
x = template - > x + 7 ;
y = template - > y + 7 ;
2019-11-21 04:55:44 +01:00
objectEvent - > active = TRUE ;
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
objectEvent - > graphicsId = template - > graphicsId ;
objectEvent - > movementType = template - > movementType ;
objectEvent - > localId = template - > localId ;
objectEvent - > mapNum = mapNum ;
objectEvent - > mapGroup = mapGroup ;
objectEvent - > initialCoords . x = x ;
objectEvent - > initialCoords . y = y ;
objectEvent - > currentCoords . x = x ;
objectEvent - > currentCoords . y = y ;
objectEvent - > previousCoords . x = x ;
objectEvent - > previousCoords . y = y ;
objectEvent - > currentElevation = template - > elevation ;
objectEvent - > previousElevation = template - > elevation ;
2020-09-18 00:24:11 +02:00
objectEvent - > rangeX = template - > movementRangeX ;
objectEvent - > rangeY = template - > movementRangeY ;
2019-11-21 04:55:44 +01:00
objectEvent - > trainerType = template - > trainerType ;
2020-10-19 12:19:21 +02:00
objectEvent - > mapNum = mapNum ;
2019-11-21 04:55:44 +01:00
objectEvent - > trainerRange_berryTreeId = template - > trainerRange_berryTreeId ;
objectEvent - > previousMovementDirection = gInitialMovementTypeFacingDirections [ template - > movementType ] ;
SetObjectEventDirection ( objectEvent , objectEvent - > previousMovementDirection ) ;
SetObjectEventDynamicGraphicsId ( objectEvent ) ;
if ( gRangedMovementTypes [ objectEvent - > movementType ] )
2017-09-06 20:25:17 +02:00
{
2020-09-18 00:24:11 +02:00
if ( objectEvent - > rangeX = = 0 )
2017-09-06 20:25:17 +02:00
{
2020-09-18 00:24:11 +02:00
objectEvent - > rangeX + + ;
2017-09-06 20:25:17 +02:00
}
2020-09-18 00:24:11 +02:00
if ( objectEvent - > rangeY = = 0 )
2017-09-06 20:25:17 +02:00
{
2020-09-18 00:24:11 +02:00
objectEvent - > rangeY + + ;
2017-09-06 20:25:17 +02:00
}
}
2019-11-21 04:55:44 +01:00
return objectEventId ;
2017-09-06 20:25:17 +02:00
}
2017-09-06 22:14:55 +02:00
2019-11-21 04:55:44 +01:00
u8 Unref_TryInitLocalObjectEvent ( u8 localId )
2017-09-06 22:14:55 +02:00
{
u8 i ;
2019-11-21 04:55:44 +01:00
u8 objectEventCount ;
struct ObjectEventTemplate * template ;
2017-09-06 22:14:55 +02:00
if ( gMapHeader . events ! = NULL )
{
if ( InBattlePyramid ( ) )
{
2019-11-21 04:55:44 +01:00
objectEventCount = GetNumBattlePyramidObjectEvents ( ) ;
2017-09-06 22:14:55 +02:00
}
else if ( InTrainerHill ( ) )
{
2019-11-21 04:55:44 +01:00
objectEventCount = 2 ;
2017-09-06 22:14:55 +02:00
}
else
{
2019-11-21 04:55:44 +01:00
objectEventCount = gMapHeader . events - > objectEventCount ;
2017-09-06 22:14:55 +02:00
}
2019-11-21 04:55:44 +01:00
for ( i = 0 ; i < objectEventCount ; i + + )
2017-09-06 22:14:55 +02:00
{
2019-11-21 04:55:44 +01:00
template = & gSaveBlock1Ptr - > objectEventTemplates [ i ] ;
2017-09-06 22:14:55 +02:00
if ( template - > localId = = localId & & ! FlagGet ( template - > flagId ) )
{
2019-11-21 04:55:44 +01:00
return InitObjectEventStateFromTemplate ( template , gSaveBlock1Ptr - > location . mapNum , gSaveBlock1Ptr - > location . mapGroup ) ;
2017-09-06 22:14:55 +02:00
}
}
}
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2017-09-06 22:14:55 +02:00
}
2017-09-06 23:25:20 +02:00
2019-11-21 04:55:44 +01:00
static bool8 GetAvailableObjectEventId ( u16 localId , u8 mapNum , u8 mapGroup , u8 * objectEventId )
2017-09-06 23:29:13 +02:00
// Looks for an empty slot.
// Returns FALSE and the location of the available slot
2019-11-21 04:55:44 +01:00
// in *objectEventId.
2017-09-06 23:29:13 +02:00
// If no slots are available, or if the object is already
// loaded, returns TRUE.
2017-09-06 23:25:20 +02:00
{
u8 i = 0 ;
2020-09-17 01:27:55 +02:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT & & gObjectEvents [ i ] . active ; i + + )
2017-09-06 23:25:20 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . localId = = localId & & gObjectEvents [ i ] . mapNum = = mapNum & & gObjectEvents [ i ] . mapGroup = = mapGroup )
2017-09-06 23:25:20 +02:00
return TRUE ;
}
2019-11-21 05:12:51 +01:00
if ( i > = OBJECT_EVENTS_COUNT )
2017-09-06 23:25:20 +02:00
return TRUE ;
2019-11-21 04:55:44 +01:00
* objectEventId = i ;
2020-09-17 01:27:55 +02:00
for ( ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-06 23:25:20 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active & & gObjectEvents [ i ] . localId = = localId & & gObjectEvents [ i ] . mapNum = = mapNum & & gObjectEvents [ i ] . mapGroup = = mapGroup )
2017-09-06 23:25:20 +02:00
return TRUE ;
2020-09-17 01:27:55 +02:00
}
2017-09-06 23:25:20 +02:00
return FALSE ;
}
2017-09-06 23:55:36 +02:00
2020-06-20 07:40:12 +02:00
void RemoveObjectEvent ( struct ObjectEvent * objectEvent )
2017-09-06 23:55:36 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > active = FALSE ;
RemoveObjectEventInternal ( objectEvent ) ;
2017-09-06 23:55:36 +02:00
}
2017-09-07 00:12:44 +02:00
2019-11-21 04:55:44 +01:00
void RemoveObjectEventByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-07 00:12:44 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-07 00:12:44 +02:00
{
2019-11-21 04:55:44 +01:00
FlagSet ( GetObjectEventFlagIdByObjectEventId ( objectEventId ) ) ;
RemoveObjectEvent ( & gObjectEvents [ objectEventId ] ) ;
2017-09-07 00:12:44 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void RemoveObjectEventInternal ( struct ObjectEvent * objectEvent )
2017-09-07 00:12:44 +02:00
{
struct SpriteFrameImage image ;
2019-11-21 04:55:44 +01:00
image . size = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) - > size ;
gSprites [ objectEvent - > spriteId ] . images = & image ;
DestroySprite ( & gSprites [ objectEvent - > spriteId ] ) ;
2017-09-07 00:12:44 +02:00
}
2017-09-07 00:26:37 +02:00
2019-11-21 04:55:44 +01:00
void RemoveAllObjectEventsExceptPlayer ( void )
2017-09-07 00:26:37 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-07 00:26:37 +02:00
{
2019-11-21 04:55:44 +01:00
if ( i ! = gPlayerAvatar . objectEventId )
RemoveObjectEvent ( & gObjectEvents [ i ] ) ;
2017-09-07 00:26:37 +02:00
}
}
2017-09-07 02:28:36 +02:00
2019-11-21 04:55:44 +01:00
static u8 TrySetupObjectEventSprite ( struct ObjectEventTemplate * objectEventTemplate , struct SpriteTemplate * spriteTemplate , u8 mapNum , u8 mapGroup , s16 cameraX , s16 cameraY )
2017-09-07 02:28:36 +02:00
{
2018-10-20 22:01:45 +02:00
u8 spriteId ;
u8 paletteSlot ;
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2018-10-20 22:01:45 +02:00
struct Sprite * sprite ;
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-07 02:28:36 +02:00
2019-11-21 04:55:44 +01:00
objectEventId = InitObjectEventStateFromTemplate ( objectEventTemplate , mapNum , mapGroup ) ;
2019-11-21 05:12:51 +01:00
if ( objectEventId = = OBJECT_EVENTS_COUNT )
return OBJECT_EVENTS_COUNT ;
2018-06-14 00:51:26 +02:00
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
graphicsInfo = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) ;
2017-09-07 02:28:36 +02:00
paletteSlot = graphicsInfo - > paletteSlot ;
if ( paletteSlot = = 0 )
{
2020-11-23 20:12:07 +01:00
LoadPlayerObjectReflectionPalette ( graphicsInfo - > paletteTag , 0 ) ;
2017-09-07 02:28:36 +02:00
}
else if ( paletteSlot = = 10 )
{
2020-11-23 20:12:07 +01:00
LoadSpecialObjectReflectionPalette ( graphicsInfo - > paletteTag , 10 ) ;
2017-09-07 02:28:36 +02:00
}
else if ( paletteSlot > = 16 )
{
paletteSlot - = 16 ;
2020-11-23 20:12:07 +01:00
sub_808EAB0 ( graphicsInfo - > paletteTag , paletteSlot ) ;
2017-09-07 02:28:36 +02:00
}
2019-04-05 23:11:24 +02:00
2019-11-21 04:55:44 +01:00
if ( objectEvent - > movementType = = MOVEMENT_TYPE_INVISIBLE )
objectEvent - > invisible = TRUE ;
2019-04-05 23:11:24 +02:00
2018-12-05 15:31:01 +01:00
* ( u16 * ) & spriteTemplate - > paletteTag = 0xFFFF ;
2017-09-07 02:28:36 +02:00
spriteId = CreateSprite ( spriteTemplate , 0 , 0 , 0 ) ;
if ( spriteId = = MAX_SPRITES )
{
2019-11-21 04:55:44 +01:00
gObjectEvents [ objectEventId ] . active = FALSE ;
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2017-09-07 02:28:36 +02:00
}
2019-04-05 23:11:24 +02:00
2017-09-07 02:28:36 +02:00
sprite = & gSprites [ spriteId ] ;
2019-11-21 04:55:44 +01:00
sub_8092FF0 ( objectEvent - > currentCoords . x + cameraX , objectEvent - > currentCoords . y + cameraY , & sprite - > pos1 . x , & sprite - > pos1 . y ) ;
2017-09-07 02:28:36 +02:00
sprite - > centerToCornerVecX = - ( graphicsInfo - > width > > 1 ) ;
sprite - > centerToCornerVecY = - ( graphicsInfo - > height > > 1 ) ;
sprite - > pos1 . x + = 8 ;
sprite - > pos1 . y + = 16 + sprite - > centerToCornerVecY ;
sprite - > oam . paletteNum = paletteSlot ;
sprite - > coordOffsetEnabled = TRUE ;
2019-11-21 04:55:44 +01:00
sprite - > data [ 0 ] = objectEventId ;
objectEvent - > spriteId = spriteId ;
objectEvent - > inanimate = graphicsInfo - > inanimate ;
if ( ! objectEvent - > inanimate )
StartSpriteAnim ( sprite , GetFaceDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2019-04-05 23:11:24 +02:00
2019-11-21 04:55:44 +01:00
SetObjectSubpriorityByZCoord ( objectEvent - > previousElevation , sprite , 1 ) ;
UpdateObjectEventVisibility ( objectEvent , sprite ) ;
return objectEventId ;
2017-09-07 02:28:36 +02:00
}
2017-09-07 03:46:53 +02:00
2020-06-20 07:40:12 +02:00
u8 TrySpawnObjectEventTemplate ( struct ObjectEventTemplate * objectEventTemplate , u8 mapNum , u8 mapGroup , s16 cameraX , s16 cameraY )
2017-09-07 03:46:53 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-07 03:46:53 +02:00
struct SpriteTemplate spriteTemplate ;
struct SpriteFrameImage spriteFrameImage ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2018-10-20 22:01:45 +02:00
const struct SubspriteTable * subspriteTables = NULL ;
2017-09-07 03:46:53 +02:00
2019-11-21 04:55:44 +01:00
graphicsInfo = GetObjectEventGraphicsInfo ( objectEventTemplate - > graphicsId ) ;
MakeObjectTemplateFromObjectEventTemplate ( objectEventTemplate , & spriteTemplate , & subspriteTables ) ;
2017-09-07 03:46:53 +02:00
spriteFrameImage . size = graphicsInfo - > size ;
spriteTemplate . images = & spriteFrameImage ;
2019-11-21 04:55:44 +01:00
objectEventId = TrySetupObjectEventSprite ( objectEventTemplate , & spriteTemplate , mapNum , mapGroup , cameraX , cameraY ) ;
2019-11-21 05:12:51 +01:00
if ( objectEventId = = OBJECT_EVENTS_COUNT )
return OBJECT_EVENTS_COUNT ;
2019-04-05 23:11:24 +02:00
2019-11-21 04:55:44 +01:00
gSprites [ gObjectEvents [ objectEventId ] . spriteId ] . images = graphicsInfo - > images ;
2019-04-05 23:11:24 +02:00
if ( subspriteTables )
2019-11-21 04:55:44 +01:00
SetSubspriteTables ( & gSprites [ gObjectEvents [ objectEventId ] . spriteId ] , subspriteTables ) ;
2019-04-05 23:11:24 +02:00
2019-11-21 04:55:44 +01:00
return objectEventId ;
2017-09-07 03:46:53 +02:00
}
2017-09-07 04:00:51 +02:00
2019-11-21 04:55:44 +01:00
u8 SpawnSpecialObjectEvent ( struct ObjectEventTemplate * objectEventTemplate )
2017-09-07 04:00:51 +02:00
{
s16 cameraX ;
s16 cameraY ;
2019-11-21 04:55:44 +01:00
GetObjectEventMovingCameraOffset ( & cameraX , & cameraY ) ;
return TrySpawnObjectEventTemplate ( objectEventTemplate , gSaveBlock1Ptr - > location . mapNum , gSaveBlock1Ptr - > location . mapGroup , cameraX , cameraY ) ;
2017-09-07 04:00:51 +02:00
}
2017-09-07 04:33:11 +02:00
2019-11-21 04:55:44 +01:00
u8 SpawnSpecialObjectEventParameterized ( u8 graphicsId , u8 movementBehavior , u8 localId , s16 x , s16 y , u8 z )
2017-09-07 04:33:11 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate objectEventTemplate ;
2017-09-07 04:33:11 +02:00
x - = 7 ;
y - = 7 ;
2019-11-21 04:55:44 +01:00
objectEventTemplate . localId = localId ;
objectEventTemplate . graphicsId = graphicsId ;
2020-05-14 23:11:18 +02:00
objectEventTemplate . inConnection = 0 ;
2019-11-21 04:55:44 +01:00
objectEventTemplate . x = x ;
objectEventTemplate . y = y ;
objectEventTemplate . elevation = z ;
objectEventTemplate . movementType = movementBehavior ;
objectEventTemplate . movementRangeX = 0 ;
objectEventTemplate . movementRangeY = 0 ;
2020-04-21 21:53:48 +02:00
objectEventTemplate . trainerType = TRAINER_TYPE_NONE ;
2019-11-21 04:55:44 +01:00
objectEventTemplate . trainerRange_berryTreeId = 0 ;
return SpawnSpecialObjectEvent ( & objectEventTemplate ) ;
}
u8 TrySpawnObjectEvent ( u8 localId , u8 mapNum , u8 mapGroup )
{
struct ObjectEventTemplate * objectEventTemplate ;
2019-04-05 23:11:24 +02:00
s16 cameraX , cameraY ;
2017-09-07 04:33:11 +02:00
2019-11-21 04:55:44 +01:00
objectEventTemplate = GetObjectEventTemplateByLocalIdAndMap ( localId , mapNum , mapGroup ) ;
if ( ! objectEventTemplate )
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2019-04-05 23:11:24 +02:00
2019-11-21 04:55:44 +01:00
GetObjectEventMovingCameraOffset ( & cameraX , & cameraY ) ;
return TrySpawnObjectEventTemplate ( objectEventTemplate , mapNum , mapGroup , cameraX , cameraY ) ;
2017-09-07 04:33:11 +02:00
}
2019-11-21 04:55:44 +01:00
static void MakeObjectTemplateFromObjectEventGraphicsInfo ( u16 graphicsId , void ( * callback ) ( struct Sprite * ) , struct SpriteTemplate * spriteTemplate , const struct SubspriteTable * * subspriteTables )
2017-09-07 04:33:11 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo = GetObjectEventGraphicsInfo ( graphicsId ) ;
2017-09-07 04:33:11 +02:00
2018-10-20 22:01:45 +02:00
spriteTemplate - > tileTag = graphicsInfo - > tileTag ;
2020-11-23 20:12:07 +01:00
spriteTemplate - > paletteTag = graphicsInfo - > paletteTag ;
2018-10-20 22:01:45 +02:00
spriteTemplate - > oam = graphicsInfo - > oam ;
spriteTemplate - > anims = graphicsInfo - > anims ;
spriteTemplate - > images = graphicsInfo - > images ;
spriteTemplate - > affineAnims = graphicsInfo - > affineAnims ;
spriteTemplate - > callback = callback ;
* subspriteTables = graphicsInfo - > subspriteTables ;
2017-09-07 04:33:11 +02:00
}
2017-09-07 04:46:44 +02:00
2019-11-21 04:55:44 +01:00
static void MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex ( u16 graphicsId , u16 callbackIndex , struct SpriteTemplate * spriteTemplate , const struct SubspriteTable * * subspriteTables )
2017-09-07 04:46:44 +02:00
{
2019-11-21 04:55:44 +01:00
MakeObjectTemplateFromObjectEventGraphicsInfo ( graphicsId , sMovementTypeCallbacks [ callbackIndex ] , spriteTemplate , subspriteTables ) ;
2017-09-07 04:46:44 +02:00
}
2017-09-07 20:16:30 +02:00
2019-11-21 04:55:44 +01:00
static void MakeObjectTemplateFromObjectEventTemplate ( struct ObjectEventTemplate * objectEventTemplate , struct SpriteTemplate * spriteTemplate , const struct SubspriteTable * * subspriteTables )
2017-09-07 20:16:30 +02:00
{
2019-11-21 04:55:44 +01:00
MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex ( objectEventTemplate - > graphicsId , objectEventTemplate - > movementType , spriteTemplate , subspriteTables ) ;
2017-09-07 20:16:30 +02:00
}
2017-09-07 20:31:23 +02:00
2019-11-21 04:55:44 +01:00
u8 AddPseudoObjectEvent ( u16 graphicsId , void ( * callback ) ( struct Sprite * ) , s16 x , s16 y , u8 subpriority )
2017-09-07 20:31:23 +02:00
{
struct SpriteTemplate * spriteTemplate ;
const struct SubspriteTable * subspriteTables ;
struct Sprite * sprite ;
2018-10-20 22:01:45 +02:00
u8 spriteId ;
2017-09-07 20:31:23 +02:00
spriteTemplate = malloc ( sizeof ( struct SpriteTemplate ) ) ;
2019-11-21 04:55:44 +01:00
MakeObjectTemplateFromObjectEventGraphicsInfo ( graphicsId , callback , spriteTemplate , & subspriteTables ) ;
2018-12-05 15:31:01 +01:00
if ( spriteTemplate - > paletteTag ! = 0xFFFF )
2017-09-07 20:31:23 +02:00
{
2019-11-21 04:55:44 +01:00
LoadObjectEventPalette ( spriteTemplate - > paletteTag ) ;
2017-09-07 20:31:23 +02:00
}
2018-10-20 22:01:45 +02:00
spriteId = CreateSprite ( spriteTemplate , x , y , subpriority ) ;
2017-09-07 20:31:23 +02:00
free ( spriteTemplate ) ;
2018-10-20 22:01:45 +02:00
if ( spriteId ! = MAX_SPRITES & & subspriteTables ! = NULL )
2017-09-07 20:31:23 +02:00
{
2018-10-20 22:01:45 +02:00
sprite = & gSprites [ spriteId ] ;
2017-09-07 20:31:23 +02:00
SetSubspriteTables ( sprite , subspriteTables ) ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_IGNORE_PRIORITY ;
2017-09-07 20:31:23 +02:00
}
2018-10-20 22:01:45 +02:00
return spriteId ;
2017-09-07 20:31:23 +02:00
}
2017-09-07 21:50:49 +02:00
2020-06-01 16:23:12 +02:00
// Used to create sprite object events instead of a full object event
// Used when resources are limiting, e.g. for the audience in contests or group members in Union Room
u8 CreateObjectSprite ( u8 graphicsId , u8 a1 , s16 x , s16 y , u8 z , u8 direction )
2017-09-07 21:50:49 +02:00
{
u8 spriteId ;
struct Sprite * sprite ;
2018-10-20 22:01:45 +02:00
struct SpriteTemplate spriteTemplate ;
const struct SubspriteTable * subspriteTables ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-07 21:50:49 +02:00
2019-11-21 04:55:44 +01:00
graphicsInfo = GetObjectEventGraphicsInfo ( graphicsId ) ;
2020-06-01 16:23:12 +02:00
MakeObjectTemplateFromObjectEventGraphicsInfo ( graphicsId , UpdateObjectEventSprite , & spriteTemplate , & subspriteTables ) ;
2018-12-05 15:31:01 +01:00
* ( u16 * ) & spriteTemplate . paletteTag = 0xFFFF ;
2017-09-07 21:50:49 +02:00
x + = 7 ;
y + = 7 ;
2020-06-01 16:23:12 +02:00
SetSpritePosToOffsetMapCoords ( & x , & y , 8 , 16 ) ;
2017-09-07 21:50:49 +02:00
spriteId = CreateSpriteAtEnd ( & spriteTemplate , x , y , 0 ) ;
if ( spriteId ! = MAX_SPRITES )
{
sprite = & gSprites [ spriteId ] ;
sprite - > centerToCornerVecX = - ( graphicsInfo - > width > > 1 ) ;
sprite - > centerToCornerVecY = - ( graphicsInfo - > height > > 1 ) ;
sprite - > pos1 . y + = sprite - > centerToCornerVecY ;
sprite - > oam . paletteNum = graphicsInfo - > paletteSlot ;
if ( sprite - > oam . paletteNum > = 16 )
{
sprite - > oam . paletteNum - = 16 ;
}
sprite - > coordOffsetEnabled = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 0 ] = a1 ;
sprite - > data [ 1 ] = z ;
2017-09-07 21:50:49 +02:00
if ( graphicsInfo - > paletteSlot = = 10 )
{
2020-11-23 20:12:07 +01:00
LoadSpecialObjectReflectionPalette ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot ) ;
2017-09-07 21:50:49 +02:00
}
else if ( graphicsInfo - > paletteSlot > = 16 )
{
2020-11-23 20:12:07 +01:00
sub_808EAB0 ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot | 0xf0 ) ;
2017-09-07 21:50:49 +02:00
}
if ( subspriteTables ! = NULL )
{
SetSubspriteTables ( sprite , subspriteTables ) ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_IGNORE_PRIORITY ;
2017-09-07 21:50:49 +02:00
}
InitObjectPriorityByZCoord ( sprite , z ) ;
SetObjectSubpriorityByZCoord ( z , sprite , 1 ) ;
2018-06-14 00:51:26 +02:00
StartSpriteAnim ( sprite , GetFaceDirectionAnimNum ( direction ) ) ;
2017-09-07 21:50:49 +02:00
}
return spriteId ;
}
2017-09-07 21:58:38 +02:00
2019-11-21 04:55:44 +01:00
void TrySpawnObjectEvents ( s16 cameraX , s16 cameraY )
2017-09-07 21:58:38 +02:00
{
u8 i ;
u8 objectCount ;
if ( gMapHeader . events ! = NULL )
{
2018-10-20 22:01:45 +02:00
s16 left = gSaveBlock1Ptr - > pos . x - 2 ;
s16 right = gSaveBlock1Ptr - > pos . x + 17 ;
s16 top = gSaveBlock1Ptr - > pos . y ;
s16 bottom = gSaveBlock1Ptr - > pos . y + 16 ;
2017-09-07 21:58:38 +02:00
if ( InBattlePyramid ( ) )
{
2019-11-21 04:55:44 +01:00
objectCount = GetNumBattlePyramidObjectEvents ( ) ;
2017-09-07 21:58:38 +02:00
}
else if ( InTrainerHill ( ) )
{
objectCount = 2 ;
}
else
{
2019-11-21 04:55:44 +01:00
objectCount = gMapHeader . events - > objectEventCount ;
2017-09-07 21:58:38 +02:00
}
for ( i = 0 ; i < objectCount ; i + + )
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * template = & gSaveBlock1Ptr - > objectEventTemplates [ i ] ;
2018-10-20 22:01:45 +02:00
s16 npcX = template - > x + 7 ;
s16 npcY = template - > y + 7 ;
2017-09-07 21:58:38 +02:00
if ( top < = npcY & & bottom > = npcY & & left < = npcX & & right > = npcX
& & ! FlagGet ( template - > flagId ) )
2019-11-21 04:55:44 +01:00
TrySpawnObjectEventTemplate ( template , gSaveBlock1Ptr - > location . mapNum , gSaveBlock1Ptr - > location . mapGroup , cameraX , cameraY ) ;
2017-09-07 21:58:38 +02:00
}
}
}
2017-09-07 22:09:59 +02:00
2019-11-21 04:55:44 +01:00
void RemoveObjectEventsOutsideView ( void )
2017-09-07 22:09:59 +02:00
{
2018-10-20 22:01:45 +02:00
u8 i , j ;
2017-09-07 22:09:59 +02:00
bool8 isActiveLinkPlayer ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-07 22:09:59 +02:00
{
2019-11-21 04:55:44 +01:00
for ( j = 0 , isActiveLinkPlayer = FALSE ; j < ARRAY_COUNT ( gLinkPlayerObjectEvents ) ; j + + )
2017-09-07 22:09:59 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gLinkPlayerObjectEvents [ j ] . active & & i = = gLinkPlayerObjectEvents [ j ] . objEventId )
2017-09-07 22:09:59 +02:00
isActiveLinkPlayer = TRUE ;
}
if ( ! isActiveLinkPlayer )
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent = & gObjectEvents [ i ] ;
2017-09-07 22:09:59 +02:00
2019-11-21 04:55:44 +01:00
if ( objectEvent - > active & & ! objectEvent - > isPlayer )
RemoveObjectEventIfOutsideView ( objectEvent ) ;
2017-09-07 22:09:59 +02:00
}
}
}
2017-09-07 23:41:56 +02:00
2019-11-21 04:55:44 +01:00
static void RemoveObjectEventIfOutsideView ( struct ObjectEvent * objectEvent )
2017-09-07 23:41:56 +02:00
{
2018-10-17 14:52:26 +02:00
s16 left = gSaveBlock1Ptr - > pos . x - 2 ;
s16 right = gSaveBlock1Ptr - > pos . x + 17 ;
s16 top = gSaveBlock1Ptr - > pos . y ;
s16 bottom = gSaveBlock1Ptr - > pos . y + 16 ;
2017-09-08 03:17:55 +02:00
2019-11-21 04:55:44 +01:00
if ( objectEvent - > currentCoords . x > = left & & objectEvent - > currentCoords . x < = right
& & objectEvent - > currentCoords . y > = top & & objectEvent - > currentCoords . y < = bottom )
2017-09-07 23:41:56 +02:00
return ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > initialCoords . x > = left & & objectEvent - > initialCoords . x < = right
& & objectEvent - > initialCoords . y > = top & & objectEvent - > initialCoords . y < = bottom )
2017-09-07 23:41:56 +02:00
return ;
2019-11-21 04:55:44 +01:00
RemoveObjectEvent ( objectEvent ) ;
2017-09-07 23:41:56 +02:00
}
2017-09-08 00:54:51 +02:00
void sub_808E16C ( s16 x , s16 y )
{
u8 i ;
ClearPlayerAvatarInfo ( ) ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-08 00:54:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active )
2017-09-08 00:54:51 +02:00
{
sub_808E1B8 ( i , x , y ) ;
}
}
2018-10-17 02:11:44 +02:00
CreateReflectionEffectSprites ( ) ;
2017-09-08 00:54:51 +02:00
}
2017-09-08 01:28:46 +02:00
2019-11-21 04:55:44 +01:00
static void sub_808E1B8 ( u8 objectEventId , s16 x , s16 y )
2017-09-08 01:28:46 +02:00
{
u8 spriteId ;
u8 paletteSlot ;
2018-10-20 22:01:45 +02:00
struct Sprite * sprite ;
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2018-10-20 22:01:45 +02:00
struct SpriteTemplate spriteTemplate ;
struct SpriteFrameImage spriteFrameImage ;
2017-09-08 01:28:46 +02:00
const struct SubspriteTable * subspriteTables ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-08 01:28:46 +02:00
# define i spriteId
2019-11-21 04:55:44 +01:00
for ( i = 0 ; i < ARRAY_COUNT ( gLinkPlayerObjectEvents ) ; i + + )
2017-09-08 01:28:46 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gLinkPlayerObjectEvents [ i ] . active & & objectEventId = = gLinkPlayerObjectEvents [ i ] . objEventId )
2017-09-08 01:28:46 +02:00
{
return ;
}
}
# undef i
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
2017-09-08 01:28:46 +02:00
subspriteTables = NULL ;
2019-11-21 04:55:44 +01:00
graphicsInfo = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) ;
2017-09-08 01:28:46 +02:00
spriteFrameImage . size = graphicsInfo - > size ;
2019-11-21 04:55:44 +01:00
MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex ( objectEvent - > graphicsId , objectEvent - > movementType , & spriteTemplate , & subspriteTables ) ;
2017-09-08 01:28:46 +02:00
spriteTemplate . images = & spriteFrameImage ;
2018-12-05 15:31:01 +01:00
* ( u16 * ) & spriteTemplate . paletteTag = 0xFFFF ;
2017-09-08 01:28:46 +02:00
paletteSlot = graphicsInfo - > paletteSlot ;
if ( paletteSlot = = 0 )
{
2020-11-23 20:12:07 +01:00
LoadPlayerObjectReflectionPalette ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot ) ;
2017-09-08 01:28:46 +02:00
}
else if ( paletteSlot = = 10 )
{
2020-11-23 20:12:07 +01:00
LoadSpecialObjectReflectionPalette ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot ) ;
2017-09-08 01:28:46 +02:00
}
else if ( paletteSlot > = 16 )
{
paletteSlot - = 16 ;
2020-11-23 20:12:07 +01:00
sub_808EAB0 ( graphicsInfo - > paletteTag , paletteSlot ) ;
2017-09-08 01:28:46 +02:00
}
2018-12-05 15:31:01 +01:00
* ( u16 * ) & spriteTemplate . paletteTag = 0xFFFF ;
2017-09-08 01:28:46 +02:00
spriteId = CreateSprite ( & spriteTemplate , 0 , 0 , 0 ) ;
if ( spriteId ! = MAX_SPRITES )
{
sprite = & gSprites [ spriteId ] ;
2019-11-21 04:55:44 +01:00
sub_8092FF0 ( x + objectEvent - > currentCoords . x , y + objectEvent - > currentCoords . y , & sprite - > pos1 . x , & sprite - > pos1 . y ) ;
2017-09-08 01:28:46 +02:00
sprite - > centerToCornerVecX = - ( graphicsInfo - > width > > 1 ) ;
sprite - > centerToCornerVecY = - ( graphicsInfo - > height > > 1 ) ;
sprite - > pos1 . x + = 8 ;
sprite - > pos1 . y + = 16 + sprite - > centerToCornerVecY ;
sprite - > images = graphicsInfo - > images ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > movementType = = MOVEMENT_TYPE_PLAYER )
2017-09-08 01:28:46 +02:00
{
2019-11-21 04:55:44 +01:00
SetPlayerAvatarObjectEventIdAndObjectId ( objectEventId , spriteId ) ;
objectEvent - > warpArrowSpriteId = CreateWarpArrowSprite ( ) ;
2017-09-08 01:28:46 +02:00
}
if ( subspriteTables ! = NULL )
{
SetSubspriteTables ( sprite , subspriteTables ) ;
}
sprite - > oam . paletteNum = paletteSlot ;
sprite - > coordOffsetEnabled = TRUE ;
2019-11-21 04:55:44 +01:00
sprite - > data [ 0 ] = objectEventId ;
objectEvent - > spriteId = spriteId ;
if ( ! objectEvent - > inanimate & & objectEvent - > movementType ! = MOVEMENT_TYPE_PLAYER )
2017-09-08 01:28:46 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnim ( sprite , GetFaceDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-08 01:28:46 +02:00
}
2019-11-21 04:55:44 +01:00
sub_808E38C ( objectEvent ) ;
SetObjectSubpriorityByZCoord ( objectEvent - > previousElevation , sprite , 1 ) ;
2017-09-08 01:28:46 +02:00
}
}
2017-09-08 01:45:30 +02:00
2019-11-21 04:55:44 +01:00
static void sub_808E38C ( struct ObjectEvent * objectEvent )
2017-09-08 01:45:30 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = FALSE ;
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
objectEvent - > hasShadow = FALSE ;
objectEvent - > hasReflection = FALSE ;
objectEvent - > inShortGrass = FALSE ;
objectEvent - > inShallowFlowingWater = FALSE ;
objectEvent - > inSandPile = FALSE ;
objectEvent - > inHotSprings = FALSE ;
ObjectEventClearHeldMovement ( objectEvent ) ;
2017-09-08 01:45:30 +02:00
}
2017-09-08 02:04:59 +02:00
2019-11-21 04:55:44 +01:00
static void SetPlayerAvatarObjectEventIdAndObjectId ( u8 objectEventId , u8 spriteId )
2017-09-08 02:04:59 +02:00
{
2019-11-21 04:55:44 +01:00
gPlayerAvatar . objectEventId = objectEventId ;
2017-09-08 02:04:59 +02:00
gPlayerAvatar . spriteId = spriteId ;
2019-11-21 04:55:44 +01:00
gPlayerAvatar . gender = GetPlayerAvatarGenderByGraphicsId ( gObjectEvents [ objectEventId ] . graphicsId ) ;
2020-04-01 08:54:26 +02:00
SetPlayerAvatarExtraStateTransition ( gObjectEvents [ objectEventId ] . graphicsId , PLAYER_AVATAR_FLAG_5 ) ;
2017-09-08 02:04:59 +02:00
}
2017-09-08 03:04:32 +02:00
2019-11-21 04:55:44 +01:00
void ObjectEventSetGraphicsId ( struct ObjectEvent * objectEvent , u8 graphicsId )
2017-09-08 03:04:32 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-08 03:04:32 +02:00
struct Sprite * sprite ;
u8 paletteSlot ;
2019-11-21 04:55:44 +01:00
graphicsInfo = GetObjectEventGraphicsInfo ( graphicsId ) ;
sprite = & gSprites [ objectEvent - > spriteId ] ;
2017-09-08 03:04:32 +02:00
paletteSlot = graphicsInfo - > paletteSlot ;
if ( paletteSlot = = 0 )
{
2020-11-23 20:12:07 +01:00
PatchObjectPalette ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot ) ;
2017-09-08 03:04:32 +02:00
}
else if ( paletteSlot = = 10 )
{
2020-11-23 20:12:07 +01:00
LoadSpecialObjectReflectionPalette ( graphicsInfo - > paletteTag , graphicsInfo - > paletteSlot ) ;
2017-09-08 03:04:32 +02:00
}
else if ( paletteSlot > = 16 )
{
paletteSlot - = 16 ;
2020-11-23 20:12:07 +01:00
sub_808EAB0 ( graphicsInfo - > paletteTag , paletteSlot ) ;
2017-09-08 03:04:32 +02:00
}
sprite - > oam . shape = graphicsInfo - > oam - > shape ;
sprite - > oam . size = graphicsInfo - > oam - > size ;
sprite - > images = graphicsInfo - > images ;
sprite - > anims = graphicsInfo - > anims ;
sprite - > subspriteTables = graphicsInfo - > subspriteTables ;
sprite - > oam . paletteNum = paletteSlot ;
2019-11-21 04:55:44 +01:00
objectEvent - > inanimate = graphicsInfo - > inanimate ;
objectEvent - > graphicsId = graphicsId ;
SetSpritePosToMapCoords ( objectEvent - > currentCoords . x , objectEvent - > currentCoords . y , & sprite - > pos1 . x , & sprite - > pos1 . y ) ;
2017-09-08 03:04:32 +02:00
sprite - > centerToCornerVecX = - ( graphicsInfo - > width > > 1 ) ;
sprite - > centerToCornerVecY = - ( graphicsInfo - > height > > 1 ) ;
sprite - > pos1 . x + = 8 ;
sprite - > pos1 . y + = 16 + sprite - > centerToCornerVecY ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > trackedByCamera )
2017-09-08 03:04:32 +02:00
{
CameraObjectReset1 ( ) ;
}
}
2017-09-08 03:17:55 +02:00
2019-11-21 04:55:44 +01:00
void ObjectEventSetGraphicsIdByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup , u8 graphicsId )
2017-09-08 03:17:55 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-08 03:17:55 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 03:17:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetGraphicsId ( & gObjectEvents [ objectEventId ] , graphicsId ) ;
2017-09-08 03:17:55 +02:00
}
}
2017-09-08 19:41:55 +02:00
2019-11-21 04:55:44 +01:00
void ObjectEventTurn ( struct ObjectEvent * objectEvent , u8 direction )
2017-09-08 19:41:55 +02:00
{
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
if ( ! objectEvent - > inanimate )
2017-09-08 19:41:55 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnim ( & gSprites [ objectEvent - > spriteId ] , GetFaceDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
SeekSpriteAnim ( & gSprites [ objectEvent - > spriteId ] , 0 ) ;
2017-09-08 19:41:55 +02:00
}
}
2019-11-21 04:55:44 +01:00
void ObjectEventTurnByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup , u8 direction )
2017-09-08 19:41:55 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-08 19:41:55 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 19:41:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventTurn ( & gObjectEvents [ objectEventId ] , direction ) ;
2017-09-08 19:41:55 +02:00
}
}
2017-09-08 19:46:21 +02:00
void PlayerObjectTurn ( struct PlayerAvatar * playerAvatar , u8 direction )
{
2019-11-21 04:55:44 +01:00
ObjectEventTurn ( & gObjectEvents [ playerAvatar - > objectEventId ] , direction ) ;
2017-09-08 19:46:21 +02:00
}
2017-09-08 20:05:45 +02:00
2021-01-26 11:16:01 +01:00
static void SetBerryTreeGraphics ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-08 20:05:45 +02:00
{
u8 berryStage ;
u8 berryId ;
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = TRUE ;
2017-09-08 20:05:45 +02:00
sprite - > invisible = TRUE ;
2019-11-21 04:55:44 +01:00
berryStage = GetStageByBerryTreeId ( objectEvent - > trainerRange_berryTreeId ) ;
2021-01-26 11:16:01 +01:00
if ( berryStage ! = BERRY_STAGE_NO_BERRY )
2017-09-08 20:05:45 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = FALSE ;
2017-09-08 20:05:45 +02:00
sprite - > invisible = FALSE ;
2019-11-21 04:55:44 +01:00
berryId = GetBerryTypeByBerryTreeId ( objectEvent - > trainerRange_berryTreeId ) - 1 ;
2018-10-20 22:01:45 +02:00
berryStage - - ;
2019-04-14 13:22:37 +02:00
if ( berryId > ITEM_TO_BERRY ( LAST_BERRY_INDEX ) )
2017-09-08 20:05:45 +02:00
berryId = 0 ;
2019-04-14 13:22:37 +02:00
2019-11-21 04:55:44 +01:00
ObjectEventSetGraphicsId ( objectEvent , gBerryTreeObjectEventGraphicsIdTablePointers [ berryId ] [ berryStage ] ) ;
2017-09-08 20:05:45 +02:00
sprite - > images = gBerryTreePicTablePointers [ berryId ] ;
sprite - > oam . paletteNum = gBerryTreePaletteSlotTablePointers [ berryId ] [ berryStage ] ;
StartSpriteAnim ( sprite , berryStage ) ;
}
}
2017-09-08 20:16:44 +02:00
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * GetObjectEventGraphicsInfo ( u8 graphicsId )
2017-09-08 20:16:44 +02:00
{
u8 bard ;
2020-01-18 00:34:37 +01:00
if ( graphicsId > = OBJ_EVENT_GFX_VARS )
2017-09-08 20:16:44 +02:00
{
2020-01-20 02:21:53 +01:00
graphicsId = VarGetObjectEventGraphicsId ( graphicsId - OBJ_EVENT_GFX_VARS ) ;
2017-09-08 20:16:44 +02:00
}
2019-11-21 05:12:51 +01:00
if ( graphicsId = = OBJ_EVENT_GFX_BARD )
2017-09-08 20:16:44 +02:00
{
2018-05-08 00:11:20 +02:00
bard = GetCurrentMauvilleOldMan ( ) ;
2017-09-08 20:16:44 +02:00
return gMauvilleOldManGraphicsInfoPointers [ bard ] ;
}
2020-01-18 00:34:37 +01:00
if ( graphicsId > = NUM_OBJ_EVENT_GFX )
2017-09-08 20:16:44 +02:00
{
2019-11-21 05:12:51 +01:00
graphicsId = OBJ_EVENT_GFX_NINJA_BOY ;
2017-09-08 20:16:44 +02:00
}
2020-01-18 00:34:37 +01:00
2019-11-21 04:55:44 +01:00
return gObjectEventGraphicsInfoPointers [ graphicsId ] ;
2017-09-08 20:16:44 +02:00
}
2017-09-08 20:20:13 +02:00
2019-11-21 04:55:44 +01:00
static void SetObjectEventDynamicGraphicsId ( struct ObjectEvent * objectEvent )
2017-09-08 20:20:13 +02:00
{
2020-01-20 02:21:53 +01:00
if ( objectEvent - > graphicsId > = OBJ_EVENT_GFX_VARS )
2017-09-08 20:20:13 +02:00
{
2020-01-20 02:21:53 +01:00
objectEvent - > graphicsId = VarGetObjectEventGraphicsId ( objectEvent - > graphicsId - OBJ_EVENT_GFX_VARS ) ;
2017-09-08 20:20:13 +02:00
}
}
2017-09-08 20:36:58 +02:00
2021-01-26 08:16:26 +01:00
void SetObjectInvisibility ( u8 localId , u8 mapNum , u8 mapGroup , bool8 invisible )
2017-09-08 20:36:58 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-08 20:36:58 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 20:36:58 +02:00
{
2021-01-26 08:16:26 +01:00
gObjectEvents [ objectEventId ] . invisible = invisible ;
2017-09-08 20:36:58 +02:00
}
}
2017-09-08 20:40:34 +02:00
2019-11-21 04:55:44 +01:00
void ObjectEventGetLocalIdAndMap ( struct ObjectEvent * objectEvent , void * localId , void * mapNum , void * mapGroup )
2017-09-08 20:40:34 +02:00
{
2019-11-21 04:55:44 +01:00
* ( u8 * ) ( localId ) = objectEvent - > localId ;
* ( u8 * ) ( mapNum ) = objectEvent - > mapNum ;
* ( u8 * ) ( mapGroup ) = objectEvent - > mapGroup ;
2017-09-08 20:40:34 +02:00
}
2017-09-08 20:53:00 +02:00
void sub_808E75C ( s16 x , s16 y )
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
struct ObjectEvent * objectEvent ;
2017-09-08 20:53:00 +02:00
2019-11-21 04:55:44 +01:00
objectEventId = GetObjectEventIdByXY ( x , y ) ;
2019-11-21 05:12:51 +01:00
if ( objectEventId ! = OBJECT_EVENTS_COUNT )
2017-09-08 20:53:00 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
2017-09-08 20:53:00 +02:00
}
}
2017-09-08 20:58:17 +02:00
2021-01-26 08:16:26 +01:00
void SetObjectPriority ( u8 localId , u8 mapNum , u8 mapGroup , u8 subpriority )
2017-09-08 20:58:17 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
struct ObjectEvent * objectEvent ;
2017-09-08 20:58:17 +02:00
struct Sprite * sprite ;
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 20:58:17 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
sprite = & gSprites [ objectEvent - > spriteId ] ;
objectEvent - > fixedPriority = TRUE ;
2017-09-08 20:58:17 +02:00
sprite - > subpriority = subpriority ;
}
}
2017-09-08 21:05:04 +02:00
2021-01-26 08:16:26 +01:00
void ResetObjectPriority ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-08 21:05:04 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
struct ObjectEvent * objectEvent ;
2017-09-08 21:05:04 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 21:05:04 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ objectEventId ] ;
objectEvent - > fixedPriority = FALSE ;
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
2017-09-08 21:05:04 +02:00
}
}
2017-09-08 21:08:10 +02:00
2020-07-02 10:59:52 +02:00
void SetObjectEventSpritePosByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup , s16 x , s16 y )
2017-09-08 21:08:10 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-08 21:08:10 +02:00
struct Sprite * sprite ;
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-08 21:08:10 +02:00
{
2019-11-21 04:55:44 +01:00
sprite = & gSprites [ gObjectEvents [ objectEventId ] . spriteId ] ;
2017-09-08 21:08:10 +02:00
sprite - > pos2 . x = x ;
sprite - > pos2 . y = y ;
}
}
2017-09-08 21:11:29 +02:00
2018-09-03 00:20:45 +02:00
void FreeAndReserveObjectSpritePalettes ( void )
2017-09-08 21:11:29 +02:00
{
FreeAllSpritePalettes ( ) ;
gReservedSpritePaletteCount = 12 ;
}
2017-09-08 21:18:03 +02:00
2019-11-21 04:55:44 +01:00
static void LoadObjectEventPalette ( u16 paletteTag )
2017-09-08 21:18:03 +02:00
{
2019-11-21 04:55:44 +01:00
u16 i = FindObjectEventPaletteIndexByTag ( paletteTag ) ;
2017-09-08 21:18:03 +02:00
2019-11-21 05:12:51 +01:00
if ( i ! = OBJ_EVENT_PAL_TAG_NONE ) // always true
2017-09-08 21:18:03 +02:00
{
2019-11-21 04:55:44 +01:00
sub_808E8F4 ( & sObjectEventSpritePalettes [ i ] ) ;
2017-09-08 21:18:03 +02:00
}
}
2017-09-08 21:21:32 +02:00
2019-11-21 04:55:44 +01:00
void Unused_LoadObjectEventPaletteSet ( u16 * paletteTags )
2017-09-08 21:21:32 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; paletteTags [ i ] ! = OBJ_EVENT_PAL_TAG_NONE ; i + + )
2017-09-08 21:21:32 +02:00
{
2019-11-21 04:55:44 +01:00
LoadObjectEventPalette ( paletteTags [ i ] ) ;
2017-09-08 21:21:32 +02:00
}
}
2017-09-08 21:27:08 +02:00
2017-09-08 23:34:12 +02:00
static u8 sub_808E8F4 ( const struct SpritePalette * spritePalette )
2017-09-08 21:27:08 +02:00
{
2018-12-05 15:31:01 +01:00
if ( IndexOfSpritePaletteTag ( spritePalette - > tag ) ! = 0xFF )
2017-09-08 21:27:08 +02:00
{
2018-12-05 15:31:01 +01:00
return 0xFF ;
2017-09-08 21:27:08 +02:00
}
return LoadSpritePalette ( spritePalette ) ;
}
2017-09-08 23:17:03 +02:00
2018-09-03 00:20:45 +02:00
void PatchObjectPalette ( u16 paletteTag , u8 paletteSlot )
2017-09-08 23:17:03 +02:00
{
2019-11-21 04:55:44 +01:00
u8 paletteIndex = FindObjectEventPaletteIndexByTag ( paletteTag ) ;
2017-09-08 23:17:03 +02:00
2019-11-21 04:55:44 +01:00
LoadPalette ( sObjectEventSpritePalettes [ paletteIndex ] . data , 16 * paletteSlot + 0x100 , 0x20 ) ;
2017-09-08 23:17:03 +02:00
}
2017-09-08 23:21:58 +02:00
2018-09-03 00:20:45 +02:00
void PatchObjectPaletteRange ( const u16 * paletteTags , u8 minSlot , u8 maxSlot )
2017-09-08 23:21:58 +02:00
{
while ( minSlot < maxSlot )
{
2018-09-03 00:20:45 +02:00
PatchObjectPalette ( * paletteTags , minSlot ) ;
2018-06-14 00:51:26 +02:00
paletteTags + + ;
minSlot + + ;
2017-09-08 23:21:58 +02:00
}
}
2017-09-08 23:34:12 +02:00
2019-11-21 04:55:44 +01:00
static u8 FindObjectEventPaletteIndexByTag ( u16 tag )
2017-09-08 23:34:12 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; sObjectEventSpritePalettes [ i ] . tag ! = OBJ_EVENT_PAL_TAG_NONE ; i + + )
2017-09-08 23:34:12 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sObjectEventSpritePalettes [ i ] . tag = = tag )
2017-09-08 23:34:12 +02:00
{
return i ;
}
}
2018-12-05 15:31:01 +01:00
return 0xFF ;
2017-09-08 23:34:12 +02:00
}
2017-09-08 23:58:41 +02:00
2018-09-03 00:20:45 +02:00
void LoadPlayerObjectReflectionPalette ( u16 tag , u8 slot )
2017-09-08 23:58:41 +02:00
{
u8 i ;
2018-09-03 00:20:45 +02:00
PatchObjectPalette ( tag , slot ) ;
2020-11-23 20:12:07 +01:00
for ( i = 0 ; sPlayerReflectionPaletteSets [ i ] . tag ! = OBJ_EVENT_PAL_TAG_NONE ; i + + )
2017-09-08 23:58:41 +02:00
{
2020-11-23 20:12:07 +01:00
if ( sPlayerReflectionPaletteSets [ i ] . tag = = tag )
2017-09-08 23:58:41 +02:00
{
2020-11-23 20:12:07 +01:00
PatchObjectPalette ( sPlayerReflectionPaletteSets [ i ] . data [ sCurrentReflectionType ] , gReflectionEffectPaletteMap [ slot ] ) ;
2017-09-08 23:58:41 +02:00
return ;
}
}
}
2017-09-09 00:04:23 +02:00
2018-09-03 00:20:45 +02:00
void LoadSpecialObjectReflectionPalette ( u16 tag , u8 slot )
2017-09-09 00:04:23 +02:00
{
u8 i ;
2018-09-03 00:20:45 +02:00
sCurrentSpecialObjectPaletteTag = tag ;
PatchObjectPalette ( tag , slot ) ;
2020-11-23 20:12:07 +01:00
for ( i = 0 ; sSpecialObjectReflectionPaletteSets [ i ] . tag ! = OBJ_EVENT_PAL_TAG_NONE ; i + + )
2017-09-09 00:04:23 +02:00
{
2020-11-23 20:12:07 +01:00
if ( sSpecialObjectReflectionPaletteSets [ i ] . tag = = tag )
2017-09-09 00:04:23 +02:00
{
2020-11-23 20:12:07 +01:00
PatchObjectPalette ( sSpecialObjectReflectionPaletteSets [ i ] . data [ sCurrentReflectionType ] , gReflectionEffectPaletteMap [ slot ] ) ;
2017-09-09 00:04:23 +02:00
return ;
}
}
}
2017-09-09 00:12:27 +02:00
static void sub_808EAB0 ( u16 tag , u8 slot )
{
2018-09-03 00:20:45 +02:00
PatchObjectPalette ( tag , slot ) ;
2017-09-09 00:12:27 +02:00
}
2017-09-09 03:25:20 +02:00
2019-11-21 04:55:44 +01:00
void unref_sub_808EAC4 ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-09 03:25:20 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > previousCoords . x = objectEvent - > currentCoords . x ;
objectEvent - > previousCoords . y = objectEvent - > currentCoords . y ;
objectEvent - > currentCoords . x + = x ;
objectEvent - > currentCoords . y + = y ;
2017-09-09 03:25:20 +02:00
}
2017-09-09 03:27:02 +02:00
2019-11-21 04:55:44 +01:00
void ShiftObjectEventCoords ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-09 03:27:02 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > previousCoords . x = objectEvent - > currentCoords . x ;
objectEvent - > previousCoords . y = objectEvent - > currentCoords . y ;
objectEvent - > currentCoords . x = x ;
objectEvent - > currentCoords . y = y ;
2017-09-09 03:27:02 +02:00
}
2019-11-21 04:55:44 +01:00
static void SetObjectEventCoords ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-09 03:28:22 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > previousCoords . x = x ;
objectEvent - > previousCoords . y = y ;
objectEvent - > currentCoords . x = x ;
objectEvent - > currentCoords . y = y ;
2017-09-09 03:28:22 +02:00
}
2019-11-21 04:55:44 +01:00
void MoveObjectEventToMapCoords ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-09 03:35:46 +02:00
{
struct Sprite * sprite ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-09 03:35:46 +02:00
2019-11-21 04:55:44 +01:00
sprite = & gSprites [ objectEvent - > spriteId ] ;
graphicsInfo = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) ;
SetObjectEventCoords ( objectEvent , x , y ) ;
SetSpritePosToMapCoords ( objectEvent - > currentCoords . x , objectEvent - > currentCoords . y , & sprite - > pos1 . x , & sprite - > pos1 . y ) ;
2017-09-09 03:35:46 +02:00
sprite - > centerToCornerVecX = - ( graphicsInfo - > width > > 1 ) ;
sprite - > centerToCornerVecY = - ( graphicsInfo - > height > > 1 ) ;
sprite - > pos1 . x + = 8 ;
sprite - > pos1 . y + = 16 + sprite - > centerToCornerVecY ;
2019-11-21 04:55:44 +01:00
sub_808E38C ( objectEvent ) ;
if ( objectEvent - > trackedByCamera )
2017-09-09 03:35:46 +02:00
CameraObjectReset1 ( ) ;
}
2019-11-21 04:55:44 +01:00
void TryMoveObjectEventToMapCoords ( u8 localId , u8 mapNum , u8 mapGroup , s16 x , s16 y )
2017-09-10 21:12:48 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-10 21:12:48 +02:00
{
x + = 7 ;
y + = 7 ;
2019-11-21 04:55:44 +01:00
MoveObjectEventToMapCoords ( & gObjectEvents [ objectEventId ] , x , y ) ;
2017-09-10 21:12:48 +02:00
}
}
2019-11-21 04:55:44 +01:00
void ShiftStillObjectEventCoords ( struct ObjectEvent * objectEvent )
2017-09-10 21:14:46 +02:00
{
2019-11-21 04:55:44 +01:00
ShiftObjectEventCoords ( objectEvent , objectEvent - > currentCoords . x , objectEvent - > currentCoords . y ) ;
2017-09-10 21:14:46 +02:00
}
2019-11-21 04:55:44 +01:00
void UpdateObjectEventCoordsForCameraUpdate ( void )
2017-09-10 21:35:21 +02:00
{
u8 i ;
s16 dx ;
s16 dy ;
if ( gCamera . active )
{
dx = gCamera . x ;
dy = gCamera . y ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-10 21:35:21 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active )
2017-09-10 21:35:21 +02:00
{
2019-11-21 04:55:44 +01:00
gObjectEvents [ i ] . initialCoords . x - = dx ;
gObjectEvents [ i ] . initialCoords . y - = dy ;
gObjectEvents [ i ] . currentCoords . x - = dx ;
gObjectEvents [ i ] . currentCoords . y - = dy ;
gObjectEvents [ i ] . previousCoords . x - = dx ;
gObjectEvents [ i ] . previousCoords . y - = dy ;
2017-09-10 21:35:21 +02:00
}
}
}
}
2019-11-21 04:55:44 +01:00
u8 GetObjectEventIdByXYZ ( u16 x , u16 y , u8 z )
2017-09-10 21:54:41 +02:00
{
u8 i ;
2018-10-20 22:01:45 +02:00
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-10 21:54:41 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active )
2017-09-10 21:54:41 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . currentCoords . x = = x & & gObjectEvents [ i ] . currentCoords . y = = y & & ObjectEventDoesZCoordMatch ( & gObjectEvents [ i ] , z ) )
2017-09-10 21:54:41 +02:00
{
return i ;
}
}
}
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2017-09-10 21:54:41 +02:00
}
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventDoesZCoordMatch ( struct ObjectEvent * objectEvent , u8 z )
2017-09-10 21:54:41 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > currentElevation ! = 0 & & z ! = 0 & & objectEvent - > currentElevation ! = z )
2017-09-10 21:54:41 +02:00
{
return FALSE ;
}
return TRUE ;
}
2017-09-10 21:56:03 +02:00
2019-11-21 04:55:44 +01:00
void UpdateObjectEventsForCameraUpdate ( s16 x , s16 y )
2017-09-10 21:56:03 +02:00
{
2019-11-21 04:55:44 +01:00
UpdateObjectEventCoordsForCameraUpdate ( ) ;
TrySpawnObjectEvents ( x , y ) ;
RemoveObjectEventsOutsideView ( ) ;
2017-09-10 21:56:03 +02:00
}
2017-09-10 22:02:20 +02:00
2017-09-10 22:13:19 +02:00
u8 AddCameraObject ( u8 linkedSpriteId )
2017-09-10 22:02:20 +02:00
{
2018-10-20 22:01:45 +02:00
u8 spriteId = CreateSprite ( & gCameraSpriteTemplate , 0 , 0 , 4 ) ;
2017-09-10 22:02:20 +02:00
gSprites [ spriteId ] . invisible = TRUE ;
2017-12-02 21:44:50 +01:00
gSprites [ spriteId ] . data [ 0 ] = linkedSpriteId ;
2017-09-10 22:02:20 +02:00
return spriteId ;
}
2017-09-10 22:13:19 +02:00
2018-06-12 00:33:50 +02:00
static void ObjectCB_CameraObject ( struct Sprite * sprite )
2017-09-10 22:13:19 +02:00
{
2018-06-12 00:33:50 +02:00
void ( * callbacks [ ARRAY_COUNT ( gCameraObjectFuncs ) ] ) ( struct Sprite * ) ;
2017-09-10 22:13:19 +02:00
2018-06-12 00:33:50 +02:00
memcpy ( callbacks , gCameraObjectFuncs , sizeof gCameraObjectFuncs ) ;
2017-12-02 21:44:50 +01:00
callbacks [ sprite - > data [ 1 ] ] ( sprite ) ;
2017-09-10 22:13:19 +02:00
}
2018-06-12 00:33:50 +02:00
static void CameraObject_0 ( struct Sprite * sprite )
2017-09-10 22:13:19 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > pos1 . x = gSprites [ sprite - > data [ 0 ] ] . pos1 . x ;
sprite - > pos1 . y = gSprites [ sprite - > data [ 0 ] ] . pos1 . y ;
2017-09-10 22:13:19 +02:00
sprite - > invisible = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-10 22:13:19 +02:00
CameraObject_1 ( sprite ) ;
}
2018-06-12 00:33:50 +02:00
static void CameraObject_1 ( struct Sprite * sprite )
2017-09-10 22:13:19 +02:00
{
2018-10-20 22:01:45 +02:00
s16 x = gSprites [ sprite - > data [ 0 ] ] . pos1 . x ;
s16 y = gSprites [ sprite - > data [ 0 ] ] . pos1 . y ;
2017-09-10 22:13:19 +02:00
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = x - sprite - > pos1 . x ;
sprite - > data [ 3 ] = y - sprite - > pos1 . y ;
2017-09-10 22:13:19 +02:00
sprite - > pos1 . x = x ;
sprite - > pos1 . y = y ;
}
2018-06-12 00:33:50 +02:00
static void CameraObject_2 ( struct Sprite * sprite )
2017-09-10 22:13:19 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > pos1 . x = gSprites [ sprite - > data [ 0 ] ] . pos1 . x ;
sprite - > pos1 . y = gSprites [ sprite - > data [ 0 ] ] . pos1 . y ;
sprite - > data [ 2 ] = 0 ;
sprite - > data [ 3 ] = 0 ;
2017-09-10 22:13:19 +02:00
}
2017-09-10 22:32:26 +02:00
2017-09-10 22:36:19 +02:00
static struct Sprite * FindCameraObject ( void )
2017-09-10 22:32:26 +02:00
{
2018-10-20 22:01:45 +02:00
u8 i ;
2017-09-10 22:32:26 +02:00
2018-10-20 22:01:45 +02:00
for ( i = 0 ; i < MAX_SPRITES ; i + + )
2017-09-10 22:32:26 +02:00
{
2018-10-20 22:01:45 +02:00
if ( gSprites [ i ] . inUse & & gSprites [ i ] . callback = = ObjectCB_CameraObject )
2017-09-10 22:32:26 +02:00
{
2018-10-20 22:01:45 +02:00
return & gSprites [ i ] ;
2017-09-10 22:32:26 +02:00
}
}
return NULL ;
}
2017-09-10 22:36:19 +02:00
void CameraObjectReset1 ( void )
{
struct Sprite * cameraObject ;
cameraObject = FindCameraObject ( ) ;
if ( cameraObject ! = NULL )
{
2017-12-02 21:44:50 +01:00
cameraObject - > data [ 1 ] = 0 ;
2017-09-10 22:36:19 +02:00
cameraObject - > callback ( cameraObject ) ;
}
}
void CameraObjectSetFollowedObjectId ( u8 objectId )
{
struct Sprite * cameraObject ;
cameraObject = FindCameraObject ( ) ;
if ( cameraObject ! = NULL )
{
2017-12-02 21:44:50 +01:00
cameraObject - > data [ 0 ] = objectId ;
2017-09-10 22:36:19 +02:00
CameraObjectReset1 ( ) ;
}
}
u8 CameraObjectGetFollowedObjectId ( void )
{
struct Sprite * cameraObject ;
cameraObject = FindCameraObject ( ) ;
if ( cameraObject = = NULL )
{
return MAX_SPRITES ;
}
2017-12-02 21:44:50 +01:00
return cameraObject - > data [ 0 ] ;
2017-09-10 22:36:19 +02:00
}
void CameraObjectReset2 ( void )
{
2020-12-27 02:23:36 +01:00
// UB: Possible null dereference
# ifdef UBFIX
struct Sprite * cameraObject ;
cameraObject = FindCameraObject ( ) ;
if ( cameraObject ! = NULL )
{
cameraObject - > data [ 1 ] = 2 ;
}
# else
2017-12-02 21:44:50 +01:00
FindCameraObject ( ) - > data [ 1 ] = 2 ;
2020-12-27 02:23:36 +01:00
# endif // UBFIX
2017-09-10 22:36:19 +02:00
}
2017-09-10 22:53:08 +02:00
u8 CopySprite ( struct Sprite * sprite , s16 x , s16 y , u8 subpriority )
{
u8 i ;
2018-06-14 00:51:26 +02:00
for ( i = 0 ; i < MAX_SPRITES ; i + + )
2017-09-10 22:53:08 +02:00
{
if ( ! gSprites [ i ] . inUse )
{
gSprites [ i ] = * sprite ;
gSprites [ i ] . pos1 . x = x ;
gSprites [ i ] . pos1 . y = y ;
gSprites [ i ] . subpriority = subpriority ;
break ;
}
}
return i ;
}
2017-09-10 22:57:08 +02:00
2018-09-03 00:20:45 +02:00
u8 CreateCopySpriteAt ( struct Sprite * sprite , s16 x , s16 y , u8 subpriority )
2017-09-10 22:57:08 +02:00
{
s16 i ;
2018-10-20 22:01:45 +02:00
for ( i = MAX_SPRITES - 1 ; i > - 1 ; i - - )
2017-09-10 22:57:08 +02:00
{
if ( ! gSprites [ i ] . inUse )
{
gSprites [ i ] = * sprite ;
gSprites [ i ] . pos1 . x = x ;
gSprites [ i ] . pos1 . y = y ;
gSprites [ i ] . subpriority = subpriority ;
return i ;
}
}
return MAX_SPRITES ;
}
2017-09-10 23:04:37 +02:00
2019-11-21 04:55:44 +01:00
void SetObjectEventDirection ( struct ObjectEvent * objectEvent , u8 direction )
2017-09-10 23:04:37 +02:00
{
s8 d2 ;
2019-11-21 04:55:44 +01:00
objectEvent - > previousMovementDirection = objectEvent - > facingDirection ;
if ( ! objectEvent - > facingDirectionLocked )
2017-09-10 23:04:37 +02:00
{
d2 = direction ;
2019-11-21 04:55:44 +01:00
objectEvent - > facingDirection = d2 ;
2017-09-10 23:04:37 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > movementDirection = direction ;
2017-09-10 23:04:37 +02:00
}
2017-09-10 23:11:03 +02:00
2019-11-21 04:55:44 +01:00
static const u8 * GetObjectEventScriptPointerByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-10 23:11:03 +02:00
{
2020-06-29 01:22:59 +02:00
return GetObjectEventTemplateByLocalIdAndMap ( localId , mapNum , mapGroup ) - > script ;
2017-09-10 23:11:03 +02:00
}
2019-11-21 04:55:44 +01:00
const u8 * GetObjectEventScriptPointerByObjectEventId ( u8 objectEventId )
2017-09-10 23:11:03 +02:00
{
2019-11-21 04:55:44 +01:00
return GetObjectEventScriptPointerByLocalIdAndMap ( gObjectEvents [ objectEventId ] . localId , gObjectEvents [ objectEventId ] . mapNum , gObjectEvents [ objectEventId ] . mapGroup ) ;
2017-09-10 23:11:03 +02:00
}
2019-11-21 04:55:44 +01:00
static u16 GetObjectEventFlagIdByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-10 23:11:03 +02:00
{
2020-08-02 15:04:55 +02:00
struct ObjectEventTemplate * obj = GetObjectEventTemplateByLocalIdAndMap ( localId , mapNum , mapGroup ) ;
2020-08-02 15:37:04 +02:00
# ifdef UBFIX
2020-08-02 15:04:55 +02:00
// BUG: The function may return NULL, and attempting to read from NULL may freeze the game using modern compilers.
if ( obj = = NULL )
return 0 ;
# endif // UBFIX
return obj - > flagId ;
2017-09-10 23:11:03 +02:00
}
2019-11-21 04:55:44 +01:00
static u16 GetObjectEventFlagIdByObjectEventId ( u8 objectEventId )
2017-09-10 23:11:03 +02:00
{
2019-11-21 04:55:44 +01:00
return GetObjectEventFlagIdByLocalIdAndMap ( gObjectEvents [ objectEventId ] . localId , gObjectEvents [ objectEventId ] . mapNum , gObjectEvents [ objectEventId ] . mapGroup ) ;
2017-09-10 23:11:03 +02:00
}
2017-09-10 23:47:37 +02:00
2020-04-21 21:53:48 +02:00
// Unused
static u8 GetObjectTrainerTypeByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-10 23:47:37 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-10 23:47:37 +02:00
2019-11-21 04:55:44 +01:00
if ( TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-10 23:47:37 +02:00
{
2018-12-05 15:31:01 +01:00
return 0xFF ;
2017-09-10 23:47:37 +02:00
}
2019-11-21 04:55:44 +01:00
return gObjectEvents [ objectEventId ] . trainerType ;
2017-09-10 23:47:37 +02:00
}
2017-09-11 16:19:03 +02:00
2020-04-21 21:53:48 +02:00
// Unused
static u8 GetObjectTrainerTypeByObjectEventId ( u8 objectEventId )
2017-09-11 16:19:03 +02:00
{
2019-11-21 04:55:44 +01:00
return gObjectEvents [ objectEventId ] . trainerType ;
2017-09-11 16:19:03 +02:00
}
2020-06-01 16:23:12 +02:00
// Unused
u8 GetObjectEventBerryTreeIdByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-11 16:19:03 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-11 16:19:03 +02:00
2019-11-21 04:55:44 +01:00
if ( TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-11 16:19:03 +02:00
{
2018-12-05 15:31:01 +01:00
return 0xFF ;
2017-09-11 16:19:03 +02:00
}
2019-11-21 04:55:44 +01:00
return gObjectEvents [ objectEventId ] . trainerRange_berryTreeId ;
2017-09-11 16:19:03 +02:00
}
2020-06-01 16:23:12 +02:00
u8 GetObjectEventBerryTreeId ( u8 objectEventId )
2017-09-11 16:19:03 +02:00
{
2019-11-21 04:55:44 +01:00
return gObjectEvents [ objectEventId ] . trainerRange_berryTreeId ;
2017-09-11 16:19:03 +02:00
}
2020-06-20 07:40:12 +02:00
struct ObjectEventTemplate * GetObjectEventTemplateByLocalIdAndMap ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-11 16:29:00 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * templates ;
2017-09-11 16:29:00 +02:00
const struct MapHeader * mapHeader ;
u8 count ;
if ( gSaveBlock1Ptr - > location . mapNum = = mapNum & & gSaveBlock1Ptr - > location . mapGroup = = mapGroup )
{
2019-11-21 04:55:44 +01:00
templates = gSaveBlock1Ptr - > objectEventTemplates ;
count = gMapHeader . events - > objectEventCount ;
2017-09-11 16:29:00 +02:00
}
else
{
2018-02-12 15:01:43 +01:00
mapHeader = Overworld_GetMapHeaderByGroupAndId ( mapGroup , mapNum ) ;
2019-11-21 04:55:44 +01:00
templates = mapHeader - > events - > objectEvents ;
count = mapHeader - > events - > objectEventCount ;
2017-09-11 16:29:00 +02:00
}
2019-11-21 04:55:44 +01:00
return FindObjectEventTemplateByLocalId ( localId , templates , count ) ;
2017-09-11 16:29:00 +02:00
}
2019-11-21 04:55:44 +01:00
static struct ObjectEventTemplate * FindObjectEventTemplateByLocalId ( u8 localId , struct ObjectEventTemplate * templates , u8 count )
2017-09-11 16:31:09 +02:00
{
u8 i ;
2018-06-14 00:51:26 +02:00
for ( i = 0 ; i < count ; i + + )
2017-09-11 16:31:09 +02:00
{
if ( templates [ i ] . localId = = localId )
{
return & templates [ i ] ;
}
}
return NULL ;
}
2017-09-11 16:40:34 +02:00
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * GetBaseTemplateForObjectEvent ( const struct ObjectEvent * objectEvent )
2017-09-11 16:40:34 +02:00
{
int i ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > mapNum ! = gSaveBlock1Ptr - > location . mapNum | | objectEvent - > mapGroup ! = gSaveBlock1Ptr - > location . mapGroup )
2017-09-11 16:40:34 +02:00
{
return NULL ;
}
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENT_TEMPLATES_COUNT ; i + + )
2017-09-11 16:40:34 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > localId = = gSaveBlock1Ptr - > objectEventTemplates [ i ] . localId )
2017-09-11 16:40:34 +02:00
{
2019-11-21 04:55:44 +01:00
return & gSaveBlock1Ptr - > objectEventTemplates [ i ] ;
2017-09-11 16:40:34 +02:00
}
}
return NULL ;
}
2017-09-11 16:46:26 +02:00
2019-11-21 04:55:44 +01:00
void OverrideTemplateCoordsForObjectEvent ( const struct ObjectEvent * objectEvent )
2017-09-11 16:46:26 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * objectEventTemplate ;
2017-09-11 16:46:26 +02:00
2019-11-21 04:55:44 +01:00
objectEventTemplate = GetBaseTemplateForObjectEvent ( objectEvent ) ;
if ( objectEventTemplate ! = NULL )
2017-09-11 16:46:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEventTemplate - > x = objectEvent - > currentCoords . x - 7 ;
objectEventTemplate - > y = objectEvent - > currentCoords . y - 7 ;
2017-09-11 16:46:26 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void OverrideObjectEventTemplateScript ( const struct ObjectEvent * objectEvent , const u8 * script )
2017-09-11 16:46:26 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * objectEventTemplate ;
2017-09-11 16:46:26 +02:00
2019-11-21 04:55:44 +01:00
objectEventTemplate = GetBaseTemplateForObjectEvent ( objectEvent ) ;
if ( objectEventTemplate )
objectEventTemplate - > script = script ;
2017-09-11 16:46:26 +02:00
}
2019-11-21 04:55:44 +01:00
void TryOverrideTemplateCoordsForObjectEvent ( const struct ObjectEvent * objectEvent , u8 movementType )
2017-09-11 16:46:26 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEventTemplate * objectEventTemplate ;
2017-09-11 16:46:26 +02:00
2019-11-21 04:55:44 +01:00
objectEventTemplate = GetBaseTemplateForObjectEvent ( objectEvent ) ;
if ( objectEventTemplate ! = NULL )
2017-09-11 16:46:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEventTemplate - > movementType = movementType ;
2017-09-11 16:46:26 +02:00
}
}
2017-09-12 22:17:52 +02:00
2019-11-21 04:55:44 +01:00
void TryOverrideObjectEventTemplateCoords ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-12 22:17:52 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
OverrideTemplateCoordsForObjectEvent ( & gObjectEvents [ objectEventId ] ) ;
2017-09-12 22:17:52 +02:00
}
2017-09-12 22:47:51 +02:00
2019-04-05 23:11:24 +02:00
void OverrideSecretBaseDecorationSpriteScript ( u8 localId , u8 mapNum , u8 mapGroup , u8 decorationCategory )
2017-09-12 22:47:51 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-12 22:47:51 +02:00
{
2019-04-05 23:11:24 +02:00
switch ( decorationCategory )
2017-09-12 22:47:51 +02:00
{
2019-04-05 23:11:24 +02:00
case DECORCAT_DOLL :
2019-11-21 04:55:44 +01:00
OverrideObjectEventTemplateScript ( & gObjectEvents [ objectEventId ] , SecretBase_EventScript_DollInteract ) ;
2019-04-05 23:11:24 +02:00
break ;
case DECORCAT_CUSHION :
2019-11-21 04:55:44 +01:00
OverrideObjectEventTemplateScript ( & gObjectEvents [ objectEventId ] , SecretBase_EventScript_CushionInteract ) ;
2019-04-05 23:11:24 +02:00
break ;
2017-09-12 22:47:51 +02:00
}
}
}
2019-11-21 04:55:44 +01:00
void InitObjectEventPalettes ( u8 palSlot )
2017-09-12 22:47:51 +02:00
{
2018-09-03 00:20:45 +02:00
FreeAndReserveObjectSpritePalettes ( ) ;
2019-11-21 05:12:51 +01:00
sCurrentSpecialObjectPaletteTag = OBJ_EVENT_PAL_TAG_NONE ;
2018-09-03 00:20:45 +02:00
sCurrentReflectionType = palSlot ;
2017-09-12 23:35:08 +02:00
if ( palSlot = = 1 )
2017-09-12 22:47:51 +02:00
{
2020-11-23 20:12:07 +01:00
PatchObjectPaletteRange ( sObjectPaletteTagSets [ sCurrentReflectionType ] , 0 , 6 ) ;
2017-09-12 22:47:51 +02:00
gReservedSpritePaletteCount = 8 ;
}
else
{
2020-11-23 20:12:07 +01:00
PatchObjectPaletteRange ( sObjectPaletteTagSets [ sCurrentReflectionType ] , 0 , 10 ) ;
2017-09-12 22:47:51 +02:00
}
}
2017-09-12 23:35:08 +02:00
2018-09-03 00:20:45 +02:00
u16 GetObjectPaletteTag ( u8 palSlot )
2017-09-12 23:35:08 +02:00
{
u8 i ;
if ( palSlot < 10 )
{
2020-11-23 20:12:07 +01:00
return sObjectPaletteTagSets [ sCurrentReflectionType ] [ palSlot ] ;
2017-09-12 23:35:08 +02:00
}
2020-11-23 20:12:07 +01:00
for ( i = 0 ; sSpecialObjectReflectionPaletteSets [ i ] . tag ! = OBJ_EVENT_PAL_TAG_NONE ; i + + )
2017-09-12 23:35:08 +02:00
{
2020-11-23 20:12:07 +01:00
if ( sSpecialObjectReflectionPaletteSets [ i ] . tag = = sCurrentSpecialObjectPaletteTag )
2017-09-12 23:35:08 +02:00
{
2020-11-23 20:12:07 +01:00
return sSpecialObjectReflectionPaletteSets [ i ] . data [ sCurrentReflectionType ] ;
2017-09-12 23:35:08 +02:00
}
}
2019-11-21 05:12:51 +01:00
return OBJ_EVENT_PAL_TAG_NONE ;
2017-09-12 23:35:08 +02:00
}
2017-09-13 15:41:11 +02:00
2018-06-14 00:51:26 +02:00
movement_type_empty_callback ( MovementType_None )
movement_type_def ( MovementType_WanderAround , gMovementTypeFuncs_WanderAround )
2017-09-13 15:41:11 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-13 16:59:25 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-13 16:59:25 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-13 16:59:25 +02:00
{
return FALSE ;
}
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-13 16:59:25 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2018-06-14 00:51:26 +02:00
if ( WaitForMovementDelay ( sprite ) )
2017-09-13 16:59:25 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-13 16:59:25 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
u8 directions [ 4 ] ;
u8 chosenDirection ;
2018-06-14 00:51:26 +02:00
memcpy ( directions , gStandardDirections , sizeof directions ) ;
chosenDirection = directions [ Random ( ) & 3 ] ;
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , chosenDirection ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 5 ;
2019-11-21 04:55:44 +01:00
if ( GetCollisionInDirection ( objectEvent , chosenDirection ) )
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2019-10-06 22:40:10 +02:00
2017-09-13 16:59:25 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step5 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 6 ;
2017-09-13 16:59:25 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderAround_Step6 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-13 16:59:25 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-13 16:59:25 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-13 16:59:25 +02:00
}
return FALSE ;
}
2017-09-14 01:13:44 +02:00
2019-11-21 04:55:44 +01:00
bool8 ObjectEventIsTrainerAndCloseToPlayer ( struct ObjectEvent * objectEvent )
2017-09-14 01:13:44 +02:00
{
s16 playerX ;
s16 playerY ;
s16 objX ;
s16 objY ;
s16 minX ;
s16 maxX ;
s16 minY ;
s16 maxY ;
2018-06-14 00:51:26 +02:00
if ( ! TestPlayerAvatarFlags ( PLAYER_AVATAR_FLAG_DASH ) )
2017-09-14 01:13:44 +02:00
{
return FALSE ;
}
2020-04-21 21:53:48 +02:00
if ( objectEvent - > trainerType ! = TRAINER_TYPE_NORMAL & & objectEvent - > trainerType ! = TRAINER_TYPE_BURIED )
2017-09-14 01:13:44 +02:00
{
return FALSE ;
}
PlayerGetDestCoords ( & playerX , & playerY ) ;
2019-11-21 04:55:44 +01:00
objX = objectEvent - > currentCoords . x ;
objY = objectEvent - > currentCoords . y ;
minX = objX - objectEvent - > trainerRange_berryTreeId ;
minY = objY - objectEvent - > trainerRange_berryTreeId ;
maxX = objX + objectEvent - > trainerRange_berryTreeId ;
maxY = objY + objectEvent - > trainerRange_berryTreeId ;
2017-09-14 01:13:44 +02:00
if ( minX > playerX | | maxX < playerX | | minY > playerY | | maxY < playerY )
{
return FALSE ;
}
return TRUE ;
}
2017-09-14 01:21:05 +02:00
2018-06-14 00:51:26 +02:00
u8 GetVectorDirection ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 01:21:05 +02:00
{
2017-09-14 01:54:43 +02:00
u8 direction ;
2017-09-14 01:21:05 +02:00
2017-09-14 02:34:25 +02:00
if ( absdx > absdy )
2017-09-14 01:21:05 +02:00
{
2017-09-14 01:54:43 +02:00
direction = DIR_EAST ;
2017-09-14 02:34:25 +02:00
if ( dx < 0 )
2017-09-14 01:21:05 +02:00
{
2017-09-14 01:54:43 +02:00
direction = DIR_WEST ;
2017-09-14 01:21:05 +02:00
}
}
else
{
2017-09-14 01:54:43 +02:00
direction = DIR_SOUTH ;
2017-09-14 02:34:25 +02:00
if ( dy < 0 )
2017-09-14 01:21:05 +02:00
{
2017-09-14 01:54:43 +02:00
direction = DIR_NORTH ;
2017-09-14 01:21:05 +02:00
}
}
2017-09-14 01:54:43 +02:00
return direction ;
2017-09-14 01:21:05 +02:00
}
2017-09-14 01:45:59 +02:00
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_SouthNorth ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 01:45:59 +02:00
{
2017-09-14 01:54:43 +02:00
u8 direction ;
2017-09-14 01:45:59 +02:00
2017-09-14 01:54:43 +02:00
direction = DIR_SOUTH ;
2017-09-14 02:34:25 +02:00
if ( dy < 0 )
2017-09-14 01:45:59 +02:00
{
2017-09-14 01:54:43 +02:00
direction = DIR_NORTH ;
2017-09-14 01:45:59 +02:00
}
2017-09-14 01:54:43 +02:00
return direction ;
2017-09-14 01:45:59 +02:00
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_WestEast ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 01:45:59 +02:00
{
2017-09-14 01:54:43 +02:00
u8 direction ;
2017-09-14 01:45:59 +02:00
2017-09-14 01:54:43 +02:00
direction = DIR_EAST ;
2017-09-14 02:34:25 +02:00
if ( dx < 0 )
2017-09-14 01:45:59 +02:00
{
2017-09-14 01:54:43 +02:00
direction = DIR_WEST ;
2017-09-14 01:45:59 +02:00
}
2017-09-14 01:54:43 +02:00
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_WestNorth ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 01:54:43 +02:00
{
u8 direction ;
2017-09-15 20:26:01 +02:00
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 01:54:43 +02:00
if ( direction = = DIR_SOUTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 01:54:43 +02:00
if ( direction = = DIR_EAST )
{
direction = DIR_NORTH ;
}
}
else if ( direction = = DIR_EAST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 01:54:43 +02:00
if ( direction = = DIR_SOUTH )
{
direction = DIR_NORTH ;
}
}
return direction ;
2017-09-14 01:45:59 +02:00
}
2017-09-14 02:22:38 +02:00
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_EastNorth ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:22:38 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_SOUTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_WEST )
{
direction = DIR_NORTH ;
}
}
else if ( direction = = DIR_WEST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_SOUTH )
{
direction = DIR_NORTH ;
}
}
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_WestSouth ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:22:38 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_NORTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_EAST )
{
direction = DIR_SOUTH ;
}
}
else if ( direction = = DIR_EAST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_NORTH )
{
direction = DIR_SOUTH ;
}
}
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_EastSouth ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:22:38 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_NORTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_WEST )
{
direction = DIR_SOUTH ;
}
}
else if ( direction = = DIR_WEST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 02:22:38 +02:00
if ( direction = = DIR_NORTH )
{
direction = DIR_SOUTH ;
}
}
return direction ;
}
2017-09-14 02:26:08 +02:00
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_SouthNorthWest ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:26:08 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
if ( direction = = DIR_EAST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
}
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_SouthNorthEast ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:26:08 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
if ( direction = = DIR_WEST )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_SouthNorth ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
}
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_NorthWestEast ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:26:08 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
if ( direction = = DIR_SOUTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
}
return direction ;
}
2018-06-14 00:51:26 +02:00
u8 GetLimitedVectorDirection_SouthWestEast ( s16 dx , s16 dy , s16 absdx , s16 absdy )
2017-09-14 02:26:08 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
direction = GetVectorDirection ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
if ( direction = = DIR_NORTH )
{
2018-06-14 00:51:26 +02:00
direction = GetLimitedVectorDirection_WestEast ( dx , dy , absdx , absdy ) ;
2017-09-14 02:26:08 +02:00
}
return direction ;
}
2017-09-14 02:34:25 +02:00
2019-11-21 04:55:44 +01:00
u8 TryGetTrainerEncounterDirection ( struct ObjectEvent * objectEvent , u8 movementType )
2017-09-14 02:34:25 +02:00
{
2018-10-20 22:01:45 +02:00
s16 dx , dy ;
s16 absdx , absdy ;
2017-09-14 02:34:25 +02:00
2019-11-21 04:55:44 +01:00
if ( ! ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-14 02:34:25 +02:00
{
return 0 ;
}
PlayerGetDestCoords ( & dx , & dy ) ;
2019-11-21 04:55:44 +01:00
dx - = objectEvent - > currentCoords . x ;
dy - = objectEvent - > currentCoords . y ;
2017-09-14 02:34:25 +02:00
absdx = dx ;
absdy = dy ;
if ( absdx < 0 )
{
absdx = - absdx ;
}
if ( absdy < 0 )
{
absdy = - absdy ;
}
2018-06-14 00:51:26 +02:00
return gGetVectorDirectionFuncs [ movementType ] ( dx , dy , absdx , absdy ) ;
2017-09-14 02:34:25 +02:00
}
2017-09-14 02:36:58 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_LookAround , gMovementTypeFuncs_LookAround )
2017-09-14 03:11:59 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_LookAround_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-14 03:11:59 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-14 03:11:59 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_LookAround_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-14 03:11:59 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-14 03:11:59 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_LookAround_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-14 03:11:59 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-14 03:11:59 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-14 03:11:59 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_LookAround_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-14 03:11:59 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-14 03:11:59 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-14 03:11:59 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_LookAround_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-14 03:11:59 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 4 ] ;
memcpy ( directions , gStandardDirections , sizeof directions ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_ANY ) ;
2018-06-14 00:51:26 +02:00
if ( direction = = DIR_NONE )
direction = directions [ Random ( ) & 3 ] ;
2017-09-14 03:11:59 +02:00
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-14 03:11:59 +02:00
return TRUE ;
}
2017-09-15 03:22:14 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WanderUpAndDown , gMovementTypeFuncs_WanderUpAndDown )
2017-09-15 03:22:14 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 03:22:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 03:22:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 03:22:14 +02:00
{
return FALSE ;
}
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 03:22:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2018-06-14 00:51:26 +02:00
if ( WaitForMovementDelay ( sprite ) )
2017-09-15 03:22:14 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 03:22:14 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gUpAndDownDirections , sizeof directions ) ;
direction = directions [ Random ( ) & 1 ] ;
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 5 ;
2019-11-21 04:55:44 +01:00
if ( GetCollisionInDirection ( objectEvent , direction ) )
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2019-10-06 22:40:10 +02:00
2017-09-15 03:22:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step5 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 6 ;
2017-09-15 03:22:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderUpAndDown_Step6 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:22:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 03:22:14 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 03:22:14 +02:00
}
return FALSE ;
}
2017-09-15 03:25:30 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WanderLeftAndRight , gMovementTypeFuncs_WanderLeftAndRight )
2017-09-15 03:25:30 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 03:25:30 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 03:25:30 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 03:25:30 +02:00
{
return FALSE ;
}
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 03:25:30 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2018-06-14 00:51:26 +02:00
if ( WaitForMovementDelay ( sprite ) )
2017-09-15 03:25:30 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 03:25:30 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gLeftAndRightDirections , sizeof directions ) ;
direction = directions [ Random ( ) & 1 ] ;
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 5 ;
2019-11-21 04:55:44 +01:00
if ( GetCollisionInDirection ( objectEvent , direction ) )
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2019-10-06 22:40:10 +02:00
2017-09-15 03:25:30 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step5 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 6 ;
2017-09-15 03:25:30 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WanderLeftAndRight_Step6 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:25:30 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 03:25:30 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 03:25:30 +02:00
}
return FALSE ;
}
2017-09-15 03:30:14 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDirection , gMovementTypeFuncs_FaceDirection )
2017-09-15 03:30:14 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDirection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:30:14 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 03:30:14 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDirection_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:30:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 03:30:14 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 03:30:14 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDirection_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 03:30:14 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-09-15 03:30:14 +02:00
return FALSE ;
}
2017-09-15 20:26:01 +02:00
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventCB2_BerryTree ( struct ObjectEvent * objectEvent , struct Sprite * sprite ) ;
extern bool8 ( * const gMovementTypeFuncs_BerryTreeGrowth [ ] ) ( struct ObjectEvent * objectEvent , struct Sprite * sprite ) ;
2021-01-26 11:16:01 +01:00
enum {
BERRYTREEFUNC_NORMAL ,
BERRYTREEFUNC_MOVE ,
BERRYTREEFUNC_SPARKLE_START ,
BERRYTREEFUNC_SPARKLE ,
BERRYTREEFUNC_SPARKLE_END ,
} ;
# define sObjEventId data[0]
# define sFuncId data[1]
# define sTimer data[2]
# define sBerryTreeFlags data[7]
# define BERRY_FLAG_SET_GFX (1 << 0)
# define BERRY_FLAG_SPARKLING (1 << 1)
# define BERRY_FLAG_JUST_PICKED (1 << 2)
2018-06-14 00:51:26 +02:00
void MovementType_BerryTreeGrowth ( struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2017-09-15 20:26:01 +02:00
2021-01-26 11:16:01 +01:00
objectEvent = & gObjectEvents [ sprite - > sObjEventId ] ;
if ( ! ( sprite - > sBerryTreeFlags & BERRY_FLAG_SET_GFX ) )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
SetBerryTreeGraphics ( objectEvent , sprite ) ;
sprite - > sBerryTreeFlags | = BERRY_FLAG_SET_GFX ;
2017-09-15 20:26:01 +02:00
}
2019-11-21 04:55:44 +01:00
UpdateObjectEventCurrentMovement ( objectEvent , sprite , ObjectEventCB2_BerryTree ) ;
2017-09-15 20:26:01 +02:00
}
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventCB2_BerryTree ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
return gMovementTypeFuncs_BerryTreeGrowth [ sprite - > sFuncId ] ( objectEvent , sprite ) ;
2017-09-15 20:26:01 +02:00
}
2021-01-26 11:16:01 +01:00
// BERRYTREEFUNC_NORMAL
bool8 MovementType_BerryTreeGrowth_Normal ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
u8 berryStage ;
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
objectEvent - > invisible = TRUE ;
2017-09-15 20:26:01 +02:00
sprite - > invisible = TRUE ;
2019-11-21 04:55:44 +01:00
berryStage = GetStageByBerryTreeId ( objectEvent - > trainerRange_berryTreeId ) ;
2021-01-26 11:16:01 +01:00
if ( berryStage = = BERRY_STAGE_NO_BERRY )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
if ( ! ( sprite - > sBerryTreeFlags & BERRY_FLAG_JUST_PICKED ) & & sprite - > animNum = = BERRY_STAGE_FLOWERING )
2017-09-15 20:26:01 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objectEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objectEvent - > currentCoords . y ;
2017-10-12 09:06:19 +02:00
gFieldEffectArguments [ 2 ] = sprite - > subpriority - 1 ;
gFieldEffectArguments [ 3 ] = sprite - > oam . priority ;
2017-09-15 20:26:01 +02:00
FieldEffectStart ( FLDEFF_BERRY_TREE_GROWTH_SPARKLE ) ;
sprite - > animNum = berryStage ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = FALSE ;
2017-09-15 20:26:01 +02:00
sprite - > invisible = FALSE ;
2021-01-26 11:16:01 +01:00
berryStage - - ;
2017-09-15 20:26:01 +02:00
if ( sprite - > animNum ! = berryStage )
{
2021-01-26 11:16:01 +01:00
sprite - > sFuncId = BERRYTREEFUNC_SPARKLE_START ;
2017-09-15 20:26:01 +02:00
return TRUE ;
}
2021-01-26 11:16:01 +01:00
SetBerryTreeGraphics ( objectEvent , sprite ) ;
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , MOVEMENT_ACTION_START_ANIM_IN_DIRECTION ) ;
2021-01-26 11:16:01 +01:00
sprite - > sFuncId = BERRYTREEFUNC_MOVE ;
2017-09-15 20:26:01 +02:00
return TRUE ;
}
2021-01-26 11:16:01 +01:00
// BERRYTREEFUNC_MOVE
bool8 MovementType_BerryTreeGrowth_Move ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
sprite - > sFuncId = BERRYTREEFUNC_NORMAL ;
2017-09-15 20:26:01 +02:00
return TRUE ;
}
return FALSE ;
}
2021-01-26 11:16:01 +01:00
// BERRYTREEFUNC_SPARKLE_START
bool8 MovementType_BerryTreeGrowth_SparkleStart ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
sprite - > sFuncId = BERRYTREEFUNC_SPARKLE ;
sprite - > sTimer = 0 ;
sprite - > sBerryTreeFlags | = BERRY_FLAG_SPARKLING ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objectEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objectEvent - > currentCoords . y ;
2017-10-12 09:06:19 +02:00
gFieldEffectArguments [ 2 ] = sprite - > subpriority - 1 ;
gFieldEffectArguments [ 3 ] = sprite - > oam . priority ;
2017-09-15 20:26:01 +02:00
FieldEffectStart ( FLDEFF_BERRY_TREE_GROWTH_SPARKLE ) ;
return TRUE ;
}
2021-01-26 11:16:01 +01:00
// BERRYTREEFUNC_SPARKLE
bool8 MovementType_BerryTreeGrowth_Sparkle ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
sprite - > sTimer + + ;
objectEvent - > invisible = ( sprite - > sTimer & 2 ) > > 1 ;
2017-09-15 20:26:01 +02:00
sprite - > animPaused = TRUE ;
2021-01-26 11:16:01 +01:00
if ( sprite - > sTimer > 64 )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
SetBerryTreeGraphics ( objectEvent , sprite ) ;
sprite - > sFuncId = BERRYTREEFUNC_SPARKLE_END ;
sprite - > sTimer = 0 ;
2017-09-15 20:26:01 +02:00
return TRUE ;
}
return FALSE ;
}
2021-01-26 11:16:01 +01:00
// BERRYTREEFUNC_SPARKLE_END
bool8 MovementType_BerryTreeGrowth_SparkleEnd ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
sprite - > sTimer + + ;
objectEvent - > invisible = ( sprite - > sTimer & 2 ) > > 1 ;
2017-09-15 20:26:01 +02:00
sprite - > animPaused = TRUE ;
2021-01-26 11:16:01 +01:00
if ( sprite - > sTimer > 64 )
2017-09-15 20:26:01 +02:00
{
2021-01-26 11:16:01 +01:00
sprite - > sFuncId = BERRYTREEFUNC_NORMAL ;
sprite - > sBerryTreeFlags & = ~ BERRY_FLAG_SPARKLING ;
2017-09-15 20:26:01 +02:00
return TRUE ;
}
return FALSE ;
}
2017-09-15 20:36:54 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownAndUp , gMovementTypeFuncs_FaceDownAndUp )
2017-09-15 20:36:54 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:36:54 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 20:36:54 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:36:54 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 20:36:54 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndUp_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:36:54 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 20:36:54 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 20:36:54 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndUp_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:36:54 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 20:36:54 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 20:36:54 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndUp_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:36:54 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gUpAndDownDirections , sizeof gUpAndDownDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_SOUTH ) ;
2017-09-15 20:36:54 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 20:36:54 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 20:36:54 +02:00
return TRUE ;
}
2017-09-15 20:42:54 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceLeftAndRight , gMovementTypeFuncs_FaceLeftAndRight )
2017-09-15 20:42:54 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceLeftAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:42:54 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 20:42:54 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceLeftAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:42:54 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 20:42:54 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceLeftAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:42:54 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 20:42:54 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysMedium [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 20:42:54 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceLeftAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:42:54 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 20:42:54 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 20:42:54 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceLeftAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 20:42:54 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gLeftAndRightDirections , sizeof gLeftAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_EAST_WEST ) ;
2017-09-15 20:42:54 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 20:42:54 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 20:42:54 +02:00
return TRUE ;
}
2017-09-15 21:26:51 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceUpAndLeft , gMovementTypeFuncs_FaceUpAndLeft )
2017-09-15 21:26:51 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:26:51 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:26:51 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:26:51 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 21:26:51 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndLeft_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:26:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 21:26:51 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 21:26:51 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndLeft_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:26:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 21:26:51 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 21:26:51 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndLeft_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:26:51 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gUpAndLeftDirections , sizeof gUpAndLeftDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_WEST ) ;
2017-09-15 21:53:07 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 21:53:07 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:53:07 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceUpAndRight , gMovementTypeFuncs_FaceUpAndRight )
2017-09-15 21:53:07 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:53:07 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:53:07 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:53:07 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 21:53:07 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:53:07 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 21:53:07 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 21:53:07 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:53:07 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 21:53:07 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 21:53:07 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:53:07 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gUpAndRightDirections , sizeof gUpAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_EAST ) ;
2017-09-15 21:26:51 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 21:26:51 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:26:51 +02:00
return TRUE ;
}
2017-09-15 21:57:38 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownAndLeft , gMovementTypeFuncs_FaceDownAndLeft )
2017-09-15 21:57:38 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:57:38 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:57:38 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:57:38 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 21:57:38 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndLeft_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:57:38 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 21:57:38 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 21:57:38 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndLeft_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:57:38 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 21:57:38 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 21:57:38 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndLeft_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 21:57:38 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gDownAndLeftDirections , sizeof gDownAndLeftDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_SOUTH_WEST ) ;
2017-09-15 21:57:38 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 21:57:38 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 21:57:38 +02:00
return TRUE ;
}
2017-09-15 22:00:39 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownAndRight , gMovementTypeFuncs_FaceDownAndRight )
2017-09-15 22:00:39 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:00:39 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:00:39 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:00:39 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:00:39 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:00:39 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:00:39 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:00:39 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:00:39 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:00:39 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 22:00:39 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:00:39 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 2 ] ;
memcpy ( directions , gDownAndRightDirections , sizeof gDownAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_SOUTH_EAST ) ;
2017-09-15 22:00:39 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 1 ] ;
2017-09-15 22:00:39 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:00:39 +02:00
return TRUE ;
}
2017-09-15 22:08:01 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownUpAndLeft , gMovementTypeFuncs_FaceDownUpAndLeft )
2017-09-15 22:08:01 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndLeft_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:08:01 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:08:01 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndLeft_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:08:01 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndLeft_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 4 ] ;
memcpy ( directions , gDownUpAndLeftDirections , sizeof gDownUpAndLeftDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_SOUTH_WEST ) ;
2017-09-15 22:08:01 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 3 ] ;
2017-09-15 22:08:01 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownUpAndRight , gMovementTypeFuncs_FaceDownUpAndRight )
2017-09-15 22:08:01 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:08:01 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:08:01 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:08:01 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownUpAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 4 ] ;
memcpy ( directions , gDownUpAndRightDirections , sizeof gDownUpAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_SOUTH_EAST ) ;
2017-09-15 22:08:01 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 3 ] ;
2017-09-15 22:08:01 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceUpRightAndLeft , gMovementTypeFuncs_FaceUpLeftAndRight )
2017-09-15 22:08:01 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpLeftAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpLeftAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpLeftAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:08:01 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:08:01 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpLeftAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:08:01 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceUpLeftAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 4 ] ;
memcpy ( directions , gUpLeftAndRightDirections , sizeof gUpLeftAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_NORTH_EAST_WEST ) ;
2017-09-15 22:08:01 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 3 ] ;
2017-09-15 22:08:01 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_FaceDownRightAndLeft , gMovementTypeFuncs_FaceDownLeftAndRight )
2017-09-15 22:08:01 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownLeftAndRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownLeftAndRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownLeftAndRight_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:08:01 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , gMovementDelaysShort [ Random ( ) & 3 ] ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:08:01 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownLeftAndRight_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:08:01 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 4 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_FaceDownLeftAndRight_Step4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:08:01 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 4 ] ;
memcpy ( directions , gDownLeftAndRightDirections , sizeof gDownLeftAndRightDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_SOUTH_EAST_WEST ) ;
2017-09-15 22:08:01 +02:00
if ( direction = = 0 )
{
2018-06-14 00:51:26 +02:00
direction = directions [ Random ( ) & 3 ] ;
2017-09-15 22:08:01 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:08:01 +02:00
return TRUE ;
}
2017-09-15 22:34:03 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_RotateCounterclockwise , gMovementTypeFuncs_RotateCounterclockwise )
2017-09-15 22:34:03 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateCounterclockwise_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:34:03 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateCounterclockwise_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:34:03 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , 48 ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:34:03 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateCounterclockwise_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:34:03 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:34:03 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateCounterclockwise_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 5 ] ;
memcpy ( directions , gCounterclockwiseDirections , sizeof gCounterclockwiseDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_ANY ) ;
2017-09-15 22:34:03 +02:00
if ( direction = = 0 )
{
2019-11-21 04:55:44 +01:00
direction = directions [ objectEvent - > facingDirection ] ;
2017-09-15 22:34:03 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 0 ;
2017-09-15 22:34:03 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_RotateClockwise , gMovementTypeFuncs_RotateClockwise )
2017-09-15 22:34:03 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateClockwise_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-15 22:34:03 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateClockwise_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-15 22:34:03 +02:00
{
2018-06-14 00:51:26 +02:00
SetMovementDelay ( sprite , 48 ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-15 22:34:03 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateClockwise_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
2019-11-21 04:55:44 +01:00
if ( WaitForMovementDelay ( sprite ) | | ObjectEventIsTrainerAndCloseToPlayer ( objectEvent ) )
2017-09-15 22:34:03 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-15 22:34:03 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_RotateClockwise_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-15 22:34:03 +02:00
{
u8 direction ;
2018-06-14 00:51:26 +02:00
u8 directions [ 5 ] ;
memcpy ( directions , gClockwiseDirections , sizeof gClockwiseDirections ) ;
2019-11-21 04:55:44 +01:00
direction = TryGetTrainerEncounterDirection ( objectEvent , RUNFOLLOW_ANY ) ;
2017-09-15 22:34:03 +02:00
if ( direction = = 0 )
{
2019-11-21 04:55:44 +01:00
direction = directions [ objectEvent - > facingDirection ] ;
2017-09-15 22:34:03 +02:00
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 0 ;
2017-09-15 22:34:03 +02:00
return TRUE ;
}
2017-09-16 03:26:56 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WalkBackAndForth , gMovementTypeFuncs_WalkBackAndForth )
2017-09-16 03:26:56 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkBackAndForth_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 03:26:56 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 03:26:56 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkBackAndForth_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 03:26:56 +02:00
{
u8 direction ;
2019-11-21 04:55:44 +01:00
direction = gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] ;
if ( objectEvent - > directionSequenceIndex )
2017-09-16 03:26:56 +02:00
{
direction = GetOppositeDirection ( direction ) ;
}
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 03:26:56 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkBackAndForth_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 03:26:56 +02:00
{
2019-10-06 22:40:10 +02:00
bool8 collision ;
2018-06-14 00:51:26 +02:00
u8 movementActionId ;
2017-09-16 03:26:56 +02:00
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2017-09-16 03:26:56 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 0 ;
SetObjectEventDirection ( objectEvent , GetOppositeDirection ( objectEvent - > movementDirection ) ) ;
2017-09-16 03:26:56 +02:00
}
2019-11-21 04:55:44 +01:00
collision = GetCollisionInDirection ( objectEvent , objectEvent - > movementDirection ) ;
movementActionId = GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ;
2019-10-06 22:40:10 +02:00
if ( collision = = COLLISION_OUTSIDE_RANGE )
2017-09-16 03:26:56 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex + + ;
SetObjectEventDirection ( objectEvent , GetOppositeDirection ( objectEvent - > movementDirection ) ) ;
movementActionId = GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ;
collision = GetCollisionInDirection ( objectEvent , objectEvent - > movementDirection ) ;
2017-09-16 03:26:56 +02:00
}
2019-10-06 22:40:10 +02:00
if ( collision )
2019-11-21 04:55:44 +01:00
movementActionId = GetWalkInPlaceNormalMovementAction ( objectEvent - > facingDirection ) ;
2019-10-06 22:40:10 +02:00
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , movementActionId ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 3 ;
2017-09-16 03:26:56 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkBackAndForth_Step3 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 03:26:56 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-16 03:26:56 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 03:26:56 +02:00
}
return FALSE ;
}
2017-09-16 03:39:24 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkSequence_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 03:39:24 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 03:39:24 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MoveNextDirectionInSequence ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 * route )
2017-09-16 03:39:24 +02:00
{
2019-10-06 22:40:10 +02:00
u8 collision ;
2018-06-14 00:51:26 +02:00
u8 movementActionId ;
2017-09-16 03:39:24 +02:00
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 3 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
objectEvent - > directionSequenceIndex = 0 ;
2019-10-06 22:40:10 +02:00
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , route [ objectEvent - > directionSequenceIndex ] ) ;
movementActionId = GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ;
collision = GetCollisionInDirection ( objectEvent , objectEvent - > movementDirection ) ;
2019-10-06 22:40:10 +02:00
if ( collision = = COLLISION_OUTSIDE_RANGE )
2017-09-16 03:39:24 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex + + ;
SetObjectEventDirection ( objectEvent , route [ objectEvent - > directionSequenceIndex ] ) ;
movementActionId = GetWalkNormalMovementAction ( objectEvent - > movementDirection ) ;
collision = GetCollisionInDirection ( objectEvent , objectEvent - > movementDirection ) ;
2017-09-16 03:39:24 +02:00
}
2019-10-06 22:40:10 +02:00
if ( collision )
2019-11-21 04:55:44 +01:00
movementActionId = GetWalkInPlaceNormalMovementAction ( objectEvent - > facingDirection ) ;
2019-10-06 22:40:10 +02:00
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , movementActionId ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 03:39:24 +02:00
return TRUE ;
}
2017-09-16 14:13:37 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkSequence_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 14:13:37 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-16 14:13:37 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 14:13:37 +02:00
}
return FALSE ;
}
2017-09-16 14:44:43 +02:00
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WalkSequenceUpRightLeftDown , gMovementTypeFuncs_WalkSequenceUpRightLeftDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpRightLeftDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpRightLeftDownDirections ) ] ;
memcpy ( directions , gUpRightLeftDownDirections , sizeof ( gUpRightLeftDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightLeftDownUp , gMovementTypeFuncs_WalkSequenceRightLeftDownUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightLeftDownUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightLeftDownUpDirections ) ] ;
memcpy ( directions , gRightLeftDownUpDirections , sizeof ( gRightLeftDownUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownUpRightLeft , gMovementTypeFuncs_WalkSequenceDownUpRightLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownUpRightLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gDownUpRightLeftDirections ) ] ;
memcpy ( directions , gDownUpRightLeftDirections , sizeof ( gDownUpRightLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftDownUpRight , gMovementTypeFuncs_WalkSequenceLeftDownUpRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftDownUpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftDownUpRightDirections ) ] ;
memcpy ( directions , gLeftDownUpRightDirections , sizeof ( gLeftDownUpRightDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceUpLeftRightDown , gMovementTypeFuncs_WalkSequenceUpLeftRightDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpLeftRightDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpLeftRightDownDirections ) ] ;
memcpy ( directions , gUpLeftRightDownDirections , sizeof ( gUpLeftRightDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftRightDownUp , gMovementTypeFuncs_WalkSequenceLeftRightDownUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftRightDownUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftRightDownUpDirections ) ] ;
memcpy ( directions , gLeftRightDownUpDirections , sizeof ( gLeftRightDownUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownUpLeftRight , gMovementTypeFuncs_WalkSequenceDownUpLeftRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownUpLeftRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gStandardDirections ) ] ;
memcpy ( directions , gStandardDirections , sizeof ( gStandardDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightDownUpLeft , gMovementTypeFuncs_WalkSequenceRightDownUpLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightDownUpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightDownUpLeftDirections ) ] ;
memcpy ( directions , gRightDownUpLeftDirections , sizeof ( gRightDownUpLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftUpDownRight , gMovementTypeFuncs_WalkSequenceLeftUpDownRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftUpDownRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftUpDownRightDirections ) ] ;
memcpy ( directions , gLeftUpDownRightDirections , sizeof ( gLeftUpDownRightDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceUpDownRightLeft , gMovementTypeFuncs_WalkSequenceUpDownRightLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpDownRightLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpDownRightLeftDirections ) ] ;
memcpy ( directions , gUpDownRightLeftDirections , sizeof ( gUpDownRightLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightLeftUpDown , gMovementTypeFuncs_WalkSequenceRightLeftUpDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightLeftUpDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightLeftUpDownDirections ) ] ;
memcpy ( directions , gRightLeftUpDownDirections , sizeof ( gRightLeftUpDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownRightLeftUp , gMovementTypeFuncs_WalkSequenceDownRightLeftUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownRightLeftUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gDownRightLeftUpDirections ) ] ;
memcpy ( directions , gDownRightLeftUpDirections , sizeof ( gDownRightLeftUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightUpDownLeft , gMovementTypeFuncs_WalkSequenceRightUpDownLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightUpDownLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightUpDownLeftDirections ) ] ;
memcpy ( directions , gRightUpDownLeftDirections , sizeof ( gRightUpDownLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceUpDownLeftRight , gMovementTypeFuncs_WalkSequenceUpDownLeftRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpDownLeftRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpDownLeftRightDirections ) ] ;
memcpy ( directions , gUpDownLeftRightDirections , sizeof ( gUpDownLeftRightDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftRightUpDown , gMovementTypeFuncs_WalkSequenceLeftRightUpDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftRightUpDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftRightUpDownDirections ) ] ;
memcpy ( directions , gLeftRightUpDownDirections , sizeof ( gLeftRightUpDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 1 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 2 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownLeftRightUp , gMovementTypeFuncs_WalkSequenceDownLeftRightUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownLeftRightUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gDownLeftRightUpDirections ) ] ;
memcpy ( directions , gDownLeftRightUpDirections , sizeof ( gDownLeftRightUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceUpLeftDownRight , gMovementTypeFuncs_WalkSequenceUpLeftDownRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpLeftDownRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpLeftDownRightDirections ) ] ;
memcpy ( directions , gUpLeftDownRightDirections , sizeof ( gUpLeftDownRightDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownRightUpLeft , gMovementTypeFuncs_WalkSequenceDownRightUpLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownRightUpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gDownRightUpLeftDirections ) ] ;
memcpy ( directions , gDownRightUpLeftDirections , sizeof ( gDownRightUpLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftDownRightUp , gMovementTypeFuncs_WalkSequenceLeftDownRightUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftDownRightUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftDownRightUpDirections ) ] ;
memcpy ( directions , gLeftDownRightUpDirections , sizeof ( gLeftDownRightUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightUpLeftDown , gMovementTypeFuncs_WalkSequenceRightUpLeftDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightUpLeftDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightUpLeftDownDirections ) ] ;
memcpy ( directions , gRightUpLeftDownDirections , sizeof ( gRightUpLeftDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceUpRightDownLeft , gMovementTypeFuncs_WalkSequenceUpRightDownLeft )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceUpRightDownLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gUpRightDownLeftDirections ) ] ;
memcpy ( directions , gUpRightDownLeftDirections , sizeof ( gUpRightDownLeftDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceDownLeftUpRight , gMovementTypeFuncs_WalkSequenceDownLeftUpRight )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceDownLeftUpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gDownLeftUpRightDirections ) ] ;
memcpy ( directions , gDownLeftUpRightDirections , sizeof ( gDownLeftUpRightDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . y = = objectEvent - > currentCoords . y )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceLeftUpRightDown , gMovementTypeFuncs_WalkSequenceLeftUpRightDown )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceLeftUpRightDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gLeftUpRightDownDirections ) ] ;
memcpy ( directions , gLeftUpRightDownDirections , sizeof ( gLeftUpRightDownDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_WalkSequenceRightDownLeftUp , gMovementTypeFuncs_WalkSequenceRightDownLeftUp )
2019-11-21 04:55:44 +01:00
u8 MovementType_WalkSequenceRightDownLeftUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 directions [ sizeof ( gRightDownLeftUpDirections ) ] ;
memcpy ( directions , gRightDownLeftUpDirections , sizeof ( gRightDownLeftUpDirections ) ) ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > directionSequenceIndex = = 2 & & objectEvent - > initialCoords . x = = objectEvent - > currentCoords . x )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = 3 ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
return MoveNextDirectionInSequence ( objectEvent , sprite , directions ) ;
2018-06-14 00:51:26 +02:00
}
movement_type_def ( MovementType_CopyPlayer , gMovementTypeFuncs_CopyPlayer )
2019-11-21 04:55:44 +01:00
bool8 MovementType_CopyPlayer_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
if ( objectEvent - > directionSequenceIndex = = 0 )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > directionSequenceIndex = GetPlayerFacingDirection ( ) ;
2017-09-16 15:43:49 +02:00
}
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 15:43:49 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_CopyPlayer_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ gPlayerAvatar . objectEventId ] . movementActionId = = 0xFF | | gPlayerAvatar . tileTransitionState = = T_TILE_CENTER )
2017-09-16 15:43:49 +02:00
{
return FALSE ;
}
2019-11-21 04:55:44 +01:00
return gCopyPlayerMovementFuncs [ PlayerGetCopyableMovement ( ) ] ( objectEvent , sprite , GetPlayerMovementDirection ( ) , NULL ) ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_CopyPlayer_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-16 15:43:49 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 15:43:49 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_None ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 15:43:49 +02:00
{
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_FaceDirection ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , playerDirection ) ) ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 15:43:49 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_GoSpeed0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 19:54:33 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
if ( ObjectEventIsFarawayIslandMew ( objectEvent ) )
2017-09-16 19:54:33 +02:00
{
2019-03-31 21:09:40 +02:00
direction = GetMewMoveDirection ( ) ;
if ( direction = = DIR_NONE )
2017-09-16 19:54:33 +02:00
{
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 19:54:33 +02:00
return TRUE ;
}
}
else
{
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
2017-09-16 19:54:33 +02:00
}
2019-11-21 04:55:44 +01:00
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkNormalMovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 19:54:33 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 19:54:33 +02:00
}
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 19:54:33 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_GoSpeed1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkFastMovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 22:10:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 22:10:55 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_GoSpeed2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkFastestMovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 22:10:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 22:10:55 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_Slide ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetSlideMovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 22:10:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 22:10:55 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 cph_IM_DIFFERENT ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetJumpInPlaceMovementAction ( direction ) ) ;
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_GoSpeed4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
ObjectEventMoveDestCoords ( objectEvent , direction , & x , & y ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetJumpMovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 22:10:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 22:10:55 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 CopyablePlayerMovement_Jump ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 playerDirection , bool8 tileCallback ( u8 ) )
2017-09-16 22:10:55 +02:00
{
u32 direction ;
s16 x ;
s16 y ;
direction = playerDirection ;
2019-11-21 04:55:44 +01:00
direction = state_to_direction ( gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] , objectEvent - > directionSequenceIndex , direction ) ;
x = objectEvent - > currentCoords . x ;
y = objectEvent - > currentCoords . y ;
2018-06-14 00:51:26 +02:00
MoveCoordsInDirection ( direction , & x , & y , 2 , 2 ) ;
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetJump2MovementAction ( direction ) ) ;
if ( GetCollisionAtCoords ( objectEvent , x , y , direction ) | | ( tileCallback ! = NULL & & ! tileCallback ( MapGridGetMetatileBehaviorAt ( x , y ) ) ) )
2017-09-16 22:10:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( direction ) ) ;
2017-09-16 22:10:55 +02:00
}
2019-11-21 04:55:44 +01:00
objectEvent - > singleMovementActive = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 22:10:55 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_CopyPlayerInGrass , gMovementTypeFuncs_CopyPlayerInGrass )
2017-09-16 22:40:00 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_CopyPlayerInGrass_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 22:40:00 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ gPlayerAvatar . objectEventId ] . movementActionId = = 0xFF | | gPlayerAvatar . tileTransitionState = = T_TILE_CENTER )
2017-09-16 22:40:00 +02:00
{
return FALSE ;
}
2019-11-21 04:55:44 +01:00
return gCopyPlayerMovementFuncs [ PlayerGetCopyableMovement ( ) ] ( objectEvent , sprite , GetPlayerMovementDirection ( ) , MetatileBehavior_IsPokeGrass ) ;
2017-09-16 22:40:00 +02:00
}
2018-06-14 00:51:26 +02:00
void MovementType_TreeDisguise ( struct Sprite * sprite )
2017-09-16 22:53:55 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2017-09-16 22:53:55 +02:00
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ sprite - > data [ 0 ] ] ;
if ( objectEvent - > directionSequenceIndex = = 0 | | ( objectEvent - > directionSequenceIndex = = 1 & & ! sprite - > data [ 7 ] ) )
2017-09-16 22:53:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
objectEvent - > fieldEffectSpriteId = FieldEffectStart ( FLDEFF_TREE_DISGUISE ) ;
objectEvent - > directionSequenceIndex = 1 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 7 ] + + ;
2017-09-16 22:53:55 +02:00
}
2019-11-21 04:55:44 +01:00
UpdateObjectEventCurrentMovement ( & gObjectEvents [ sprite - > data [ 0 ] ] , sprite , MovementType_Disguise_Callback ) ;
2017-09-16 22:53:55 +02:00
}
2019-11-21 04:55:44 +01:00
static bool8 MovementType_Disguise_Callback ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 22:53:55 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-09-16 22:53:55 +02:00
return FALSE ;
}
2018-06-14 00:51:26 +02:00
void MovementType_MountainDisguise ( struct Sprite * sprite )
2017-09-16 22:53:55 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2017-09-16 22:53:55 +02:00
2019-11-21 04:55:44 +01:00
objectEvent = & gObjectEvents [ sprite - > data [ 0 ] ] ;
if ( objectEvent - > directionSequenceIndex = = 0 | | ( objectEvent - > directionSequenceIndex = = 1 & & ! sprite - > data [ 7 ] ) )
2017-09-16 22:53:55 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
objectEvent - > fieldEffectSpriteId = FieldEffectStart ( FLDEFF_MOUNTAIN_DISGUISE ) ;
objectEvent - > directionSequenceIndex = 1 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 7 ] + + ;
2017-09-16 22:53:55 +02:00
}
2019-11-21 04:55:44 +01:00
UpdateObjectEventCurrentMovement ( & gObjectEvents [ sprite - > data [ 0 ] ] , sprite , MovementType_Disguise_Callback ) ;
2017-09-16 22:53:55 +02:00
}
2021-02-14 20:25:23 +01:00
void MovementType_Buried ( struct Sprite * sprite )
2017-09-16 23:24:26 +02:00
{
2017-12-02 21:44:50 +01:00
if ( ! sprite - > data [ 7 ] )
2017-09-16 23:24:26 +02:00
{
2019-11-21 04:55:44 +01:00
gObjectEvents [ sprite - > data [ 0 ] ] . fixedPriority = TRUE ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_IGNORE_PRIORITY ;
2017-09-16 23:24:26 +02:00
sprite - > oam . priority = 3 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 7 ] + + ;
2017-09-16 23:24:26 +02:00
}
2021-02-14 20:25:23 +01:00
UpdateObjectEventCurrentMovement ( & gObjectEvents [ sprite - > data [ 0 ] ] , sprite , MovementType_Buried_Callback ) ;
2017-09-16 23:24:26 +02:00
}
2021-02-14 20:25:23 +01:00
static bool8 MovementType_Buried_Callback ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:24:26 +02:00
{
2021-02-14 20:25:23 +01:00
return gMovementTypeFuncs_Buried [ sprite - > data [ 1 ] ] ( objectEvent , sprite ) ;
2017-09-16 23:24:26 +02:00
}
2021-02-14 20:25:23 +01:00
bool8 MovementType_Buried_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:24:26 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
2017-09-16 23:24:26 +02:00
return FALSE ;
}
2018-06-14 00:51:26 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_MoveInPlace_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:24:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-16 23:24:26 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 0 ;
2017-09-16 23:24:26 +02:00
}
return FALSE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WalkInPlace , gMovementTypeFuncs_WalkInPlace )
2017-09-16 23:34:41 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkInPlace_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkInPlaceNormalMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_WalkSlowlyInPlace , gMovementTypeFuncs_WalkSlowlyInPlace )
2017-09-16 23:34:41 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_WalkSlowlyInPlace_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkInPlaceSlowMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_JogInPlace , gMovementTypeFuncs_JogInPlace )
2017-09-16 23:34:41 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_JogInPlace_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkInPlaceFastMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_RunInPlace , gMovementTypeFuncs_RunInPlace )
2017-09-16 23:34:41 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_RunInPlace_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetWalkInPlaceFastestMovementAction ( objectEvent - > facingDirection ) ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
2018-06-14 00:51:26 +02:00
movement_type_def ( MovementType_Invisible , gMovementTypeFuncs_Invisible )
2017-09-16 23:34:41 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementType_Invisible_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
ClearObjectEventMovement ( objectEvent , sprite ) ;
ObjectEventSetSingleMovement ( objectEvent , sprite , GetFaceDirectionMovementAction ( objectEvent - > facingDirection ) ) ;
objectEvent - > invisible = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 1 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_Invisible_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventExecSingleMovementAction ( objectEvent , sprite ) )
2017-09-16 23:34:41 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 2 ;
2017-09-16 23:34:41 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementType_Invisible_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:34:41 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2017-09-16 23:34:41 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
static void ClearObjectEventMovement ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-16 23:41:46 +02:00
{
2021-01-26 11:16:01 +01:00
objectEvent - > singleMovementActive = FALSE ;
2019-11-21 04:55:44 +01:00
objectEvent - > heldMovementActive = FALSE ;
objectEvent - > heldMovementFinished = FALSE ;
objectEvent - > movementActionId = 0xFF ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 1 ] = 0 ;
2017-09-16 23:41:46 +02:00
}
2018-06-14 00:51:26 +02:00
u8 GetFaceDirectionAnimNum ( u8 direction )
{
return gFaceDirectionAnimNums [ direction ] ;
}
u8 GetMoveDirectionAnimNum ( u8 direction )
{
return gMoveDirectionAnimNums [ direction ] ;
}
u8 GetMoveDirectionFastAnimNum ( u8 direction )
{
return gMoveDirectionFastAnimNums [ direction ] ;
}
u8 GetMoveDirectionFasterAnimNum ( u8 direction )
{
return gMoveDirectionFasterAnimNums [ direction ] ;
}
u8 GetMoveDirectionFastestAnimNum ( u8 direction )
{
return gMoveDirectionFastestAnimNums [ direction ] ;
}
u8 GetJumpSpecialDirectionAnimNum ( u8 direction )
{
return gJumpSpecialDirectionAnimNums [ direction ] ;
}
u8 GetAcroWheelieDirectionAnimNum ( u8 direction )
{
return gAcroWheelieDirectionAnimNums [ direction ] ;
}
u8 Unref_GetAnimNums_08375633 ( u8 direction )
{
return gUnrefAnimNums_08375633 [ direction ] ;
}
u8 GetAcroEndWheelieDirectionAnimNum ( u8 direction )
{
return gAcroEndWheelieDirectionAnimNums [ direction ] ;
}
u8 GetAcroUnusedActionDirectionAnimNum ( u8 direction )
{
return gAcroUnusedActionDirectionAnimNums [ direction ] ;
}
u8 GetAcroWheeliePedalDirectionAnimNum ( u8 direction )
{
return gAcroWheeliePedalDirectionAnimNums [ direction ] ;
}
u8 GetFishingDirectionAnimNum ( u8 direction )
{
return gFishingDirectionAnimNums [ direction ] ;
}
u8 GetFishingNoCatchDirectionAnimNum ( u8 direction )
{
return gFishingNoCatchDirectionAnimNums [ direction ] ;
}
u8 GetFishingBiteDirectionAnimNum ( u8 direction )
{
return gFishingBiteDirectionAnimNums [ direction ] ;
}
u8 GetRunningDirectionAnimNum ( u8 direction )
{
return gRunningDirectionAnimNums [ direction ] ;
}
2017-09-16 23:41:46 +02:00
2017-09-17 00:18:34 +02:00
static const struct UnkStruct_085094AC * sub_8092A4C ( const union AnimCmd * const * anims )
2017-09-17 00:04:26 +02:00
{
const struct UnkStruct_085094AC * retval ;
2018-06-14 00:51:26 +02:00
for ( retval = gUnknown_085094AC ; retval - > anims ! = NULL ; retval + + )
2017-09-17 00:04:26 +02:00
{
2017-09-17 00:18:34 +02:00
if ( retval - > anims = = anims )
2017-09-17 00:04:26 +02:00
{
return retval ;
}
}
return NULL ;
}
2019-11-21 04:55:44 +01:00
void npc_apply_anim_looping ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 animNum )
2017-09-17 00:18:34 +02:00
{
const struct UnkStruct_085094AC * unk85094AC ;
2019-11-21 04:55:44 +01:00
if ( ! objectEvent - > inanimate )
2017-09-17 00:18:34 +02:00
{
sprite - > animNum = animNum ;
unk85094AC = sub_8092A4C ( sprite - > anims ) ;
if ( unk85094AC ! = NULL )
{
if ( sprite - > animCmdIndex = = unk85094AC - > animPos [ 0 ] )
{
sprite - > animCmdIndex = unk85094AC - > animPos [ 3 ] ;
}
else if ( sprite - > animCmdIndex = = unk85094AC - > animPos [ 1 ] )
{
sprite - > animCmdIndex = unk85094AC - > animPos [ 2 ] ;
}
}
SeekSpriteAnim ( sprite , sprite - > animCmdIndex ) ;
}
}
2019-11-21 04:55:44 +01:00
void obj_npc_animation_step ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 animNum )
2017-09-17 00:18:34 +02:00
{
const struct UnkStruct_085094AC * unk85094AC ;
2019-11-21 04:55:44 +01:00
if ( ! objectEvent - > inanimate )
2017-09-17 00:18:34 +02:00
{
u8 animPos ;
sprite - > animNum = animNum ;
unk85094AC = sub_8092A4C ( sprite - > anims ) ;
if ( unk85094AC ! = NULL )
{
animPos = unk85094AC - > animPos [ 1 ] ;
if ( sprite - > animCmdIndex < = unk85094AC - > animPos [ 0 ] )
{
animPos = unk85094AC - > animPos [ 0 ] ;
}
SeekSpriteAnim ( sprite , animPos ) ;
}
}
}
2017-09-17 00:24:58 +02:00
// file boundary?
2018-06-14 00:51:26 +02:00
u8 GetDirectionToFace ( s16 x1 , s16 y1 , s16 x2 , s16 y2 )
2017-09-17 00:24:58 +02:00
{
if ( x1 > x2 )
{
return DIR_WEST ;
}
if ( x1 < x2 )
{
return DIR_EAST ;
}
if ( y1 > y2 )
{
return DIR_NORTH ;
}
return DIR_SOUTH ;
}
2019-11-21 04:55:44 +01:00
void SetTrainerMovementType ( struct ObjectEvent * objectEvent , u8 movementType )
2017-09-17 00:29:14 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > movementType = movementType ;
objectEvent - > directionSequenceIndex = 0 ;
objectEvent - > playerCopyableMovement = 0 ;
gSprites [ objectEvent - > spriteId ] . callback = sMovementTypeCallbacks [ movementType ] ;
gSprites [ objectEvent - > spriteId ] . data [ 1 ] = 0 ;
2017-09-17 00:29:14 +02:00
}
2018-06-14 00:51:26 +02:00
u8 GetTrainerFacingDirectionMovementType ( u8 direction )
{
return gTrainerFacingDirectionMovementTypes [ direction ] ;
}
2017-09-17 00:33:38 +02:00
2020-06-20 07:40:12 +02:00
u8 GetCollisionInDirection ( struct ObjectEvent * objectEvent , u8 direction )
2017-09-17 00:33:38 +02:00
{
s16 x ;
s16 y ;
2019-11-21 04:55:44 +01:00
x = objectEvent - > currentCoords . x ;
y = objectEvent - > currentCoords . y ;
2017-09-17 00:33:38 +02:00
MoveCoords ( direction , & x , & y ) ;
2019-11-21 04:55:44 +01:00
return GetCollisionAtCoords ( objectEvent , x , y , direction ) ;
2017-09-17 00:33:38 +02:00
}
2020-06-20 07:40:12 +02:00
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
}
}
2019-11-21 04:55:44 +01:00
u8 GetCollisionAtCoords ( struct ObjectEvent * objectEvent , s16 x , s16 y , u32 dir )
2017-09-17 00:42:35 +02:00
{
2019-10-06 22:40:10 +02:00
u8 direction = dir ;
2020-06-07 15:37:39 +02:00
u8 currentBehavior = MapGridGetMetatileBehaviorAt ( objectEvent - > currentCoords . x , objectEvent - > currentCoords . y ) ;
u8 nextBehavior = MapGridGetMetatileBehaviorAt ( x , y ) ;
2020-06-20 07:40:12 +02:00
u8 collision ;
objectEvent - > directionOverwrite = DIR_NONE ;
2020-06-07 15:37:39 +02:00
//sideways stairs checks
if ( MetatileBehavior_IsSidewaysStairsLeftSideTop ( nextBehavior ) & & dir = = DIR_EAST )
return COLLISION_IMPASSABLE ; //moving onto left-side top edge east from regular ground -> nope
else if ( MetatileBehavior_IsSidewaysStairsRightSideTop ( nextBehavior ) & & dir = = DIR_WEST )
return COLLISION_IMPASSABLE ; //moving onto left-side top edge east from regular ground -> nope
else if ( MetatileBehavior_IsSidewaysStairsRightSideBottom ( nextBehavior ) & & ( dir = = DIR_EAST | | dir = = DIR_SOUTH ) )
return COLLISION_IMPASSABLE ; //moving into right-side bottom edge from regular ground -> nah
else if ( MetatileBehavior_IsSidewaysStairsLeftSideBottom ( nextBehavior ) & & ( dir = = DIR_WEST | | dir = = DIR_SOUTH ) )
return COLLISION_IMPASSABLE ; //moving onto left-side bottom edge from regular ground -> nah
else if ( ( MetatileBehavior_IsSidewaysStairsLeftSideTop ( currentBehavior ) | | MetatileBehavior_IsSidewaysStairsRightSideTop ( currentBehavior ) )
& & dir = = DIR_NORTH )
return COLLISION_IMPASSABLE ; //trying to move north off of top-most tile onto same level doesn't work
else if ( ! ( MetatileBehavior_IsSidewaysStairsLeftSideTop ( currentBehavior ) | | MetatileBehavior_IsSidewaysStairsRightSideTop ( currentBehavior ) )
& & dir = = DIR_SOUTH & & ( MetatileBehavior_IsSidewaysStairsLeftSideTop ( nextBehavior ) | | MetatileBehavior_IsSidewaysStairsRightSideTop ( nextBehavior ) ) )
return COLLISION_IMPASSABLE ; //trying to move south onto top stair tile at same level from non-stair -> no
else if ( ! ( MetatileBehavior_IsSidewaysStairsLeftSideBottom ( currentBehavior ) | | MetatileBehavior_IsSidewaysStairsRightSideBottom ( currentBehavior ) )
& & 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
2020-06-20 07:40:12 +02:00
// 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 ;
2017-09-17 00:42:35 +02:00
}
2019-11-21 04:55:44 +01:00
u8 GetCollisionFlagsAtCoords ( struct ObjectEvent * objectEvent , s16 x , s16 y , u8 direction )
2017-09-17 00:52:20 +02:00
{
2018-06-14 00:51:26 +02:00
u8 flags = 0 ;
2017-09-17 00:52:20 +02:00
2019-11-21 04:55:44 +01:00
if ( IsCoordOutsideObjectEventMovementRange ( objectEvent , x , y ) )
2018-06-14 00:51:26 +02:00
flags | = 1 ;
2019-11-21 04:55:44 +01:00
if ( MapGridIsImpassableAt ( x , y ) | | GetMapBorderIdAt ( x , y ) = = - 1 | | IsMetatileDirectionallyImpassable ( objectEvent , x , y , direction ) | | ( objectEvent - > trackedByCamera & & ! CanCameraMoveInDirection ( direction ) ) )
2018-06-14 00:51:26 +02:00
flags | = 2 ;
2019-11-21 04:55:44 +01:00
if ( IsZCoordMismatchAt ( objectEvent - > currentElevation , x , y ) )
2018-06-14 00:51:26 +02:00
flags | = 4 ;
2019-11-21 04:55:44 +01:00
if ( DoesObjectCollideWithObjectAt ( objectEvent , x , y ) )
2018-06-14 00:51:26 +02:00
flags | = 8 ;
return flags ;
2017-09-17 00:52:20 +02:00
}
2019-11-21 04:55:44 +01:00
static bool8 IsCoordOutsideObjectEventMovementRange ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-17 03:04:52 +02:00
{
s16 left ;
s16 right ;
s16 top ;
s16 bottom ;
2020-09-18 00:24:11 +02:00
if ( objectEvent - > rangeX ! = 0 )
2017-09-17 03:04:52 +02:00
{
2020-09-18 00:24:11 +02:00
left = objectEvent - > initialCoords . x - objectEvent - > rangeX ;
right = objectEvent - > initialCoords . x + objectEvent - > rangeX ;
2017-09-17 03:04:52 +02:00
if ( left > x | | right < x )
{
return TRUE ;
}
}
2020-09-18 00:24:11 +02:00
if ( objectEvent - > rangeY ! = 0 )
2017-09-17 03:04:52 +02:00
{
2020-09-18 00:24:11 +02:00
top = objectEvent - > initialCoords . y - objectEvent - > rangeY ;
bottom = objectEvent - > initialCoords . y + objectEvent - > rangeY ;
2017-09-17 03:04:52 +02:00
if ( top > y | | bottom < y )
{
return TRUE ;
}
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
static bool8 IsMetatileDirectionallyImpassable ( struct ObjectEvent * objectEvent , s16 x , s16 y , u8 direction )
2017-09-17 03:08:44 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gOppositeDirectionBlockedMetatileFuncs [ direction - 1 ] ( objectEvent - > currentMetatileBehavior )
2018-06-14 00:51:26 +02:00
| | gDirectionBlockedMetatileFuncs [ direction - 1 ] ( MapGridGetMetatileBehaviorAt ( x , y ) ) )
2017-09-17 03:08:44 +02:00
{
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
static bool8 DoesObjectCollideWithObjectAt ( struct ObjectEvent * objectEvent , s16 x , s16 y )
2017-09-17 03:29:04 +02:00
{
u8 i ;
2019-11-21 04:55:44 +01:00
struct ObjectEvent * curObject ;
2017-09-17 03:29:04 +02:00
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2017-09-17 03:29:04 +02:00
{
2019-11-21 04:55:44 +01:00
curObject = & gObjectEvents [ i ] ;
2020-06-29 01:22:59 +02:00
if ( curObject - > active & & curObject ! = objectEvent )
2020-06-20 07:40:12 +02:00
{
// check for collision if curObject is active, not the object in question, and not exempt from collisions
2018-06-11 16:19:17 +02:00
if ( ( curObject - > currentCoords . x = = x & & curObject - > currentCoords . y = = y ) | | ( curObject - > previousCoords . x = = x & & curObject - > previousCoords . y = = y ) )
2017-09-17 03:29:04 +02:00
{
2019-11-21 04:55:44 +01:00
if ( AreZCoordsCompatible ( objectEvent - > currentElevation , curObject - > currentElevation ) )
2017-09-17 03:29:04 +02:00
{
return TRUE ;
}
}
}
}
return FALSE ;
}
2018-06-14 00:51:26 +02:00
bool8 IsBerryTreeSparkling ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-17 03:31:37 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-17 03:31:37 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId )
2021-01-26 11:16:01 +01:00
& & gSprites [ gObjectEvents [ objectEventId ] . spriteId ] . sBerryTreeFlags & BERRY_FLAG_SPARKLING )
2017-09-17 03:31:37 +02:00
{
return TRUE ;
}
2018-06-14 00:51:26 +02:00
2017-09-17 03:31:37 +02:00
return FALSE ;
}
2021-01-26 11:16:01 +01:00
void SetBerryTreeJustPicked ( u8 localId , u8 mapNum , u8 mapGroup )
2017-09-17 03:39:29 +02:00
{
2019-11-21 04:55:44 +01:00
u8 objectEventId ;
2017-09-17 03:39:29 +02:00
2019-11-21 04:55:44 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( localId , mapNum , mapGroup , & objectEventId ) )
2017-09-17 03:39:29 +02:00
{
2021-01-26 11:16:01 +01:00
gSprites [ gObjectEvents [ objectEventId ] . spriteId ] . sBerryTreeFlags | = BERRY_FLAG_JUST_PICKED ;
2017-09-17 03:39:29 +02:00
}
}
void MoveCoords ( u8 direction , s16 * x , s16 * y )
{
2018-09-05 00:31:37 +02:00
* x + = sDirectionToVectors [ direction ] . x ;
* y + = sDirectionToVectors [ direction ] . y ;
2017-09-17 03:39:29 +02:00
}
2017-09-17 03:45:18 +02:00
void sub_8092F60 ( u8 direction , s16 * x , s16 * y )
{
2018-09-05 00:31:37 +02:00
* x + = sDirectionToVectors [ direction ] . x < < 4 ;
* y + = sDirectionToVectors [ direction ] . y < < 4 ;
2017-09-17 03:45:18 +02:00
}
2018-06-14 00:51:26 +02:00
static void MoveCoordsInDirection ( u32 dir , s16 * x , s16 * y , s16 deltaX , s16 deltaY )
2017-09-17 03:52:55 +02:00
{
2018-06-14 00:51:26 +02:00
u8 direction = dir ;
s16 dx2 = ( u16 ) deltaX ;
s16 dy2 = ( u16 ) deltaY ;
2018-09-05 00:31:37 +02:00
if ( sDirectionToVectors [ direction ] . x > 0 )
2018-06-14 00:51:26 +02:00
* x + = dx2 ;
2018-09-05 00:31:37 +02:00
if ( sDirectionToVectors [ direction ] . x < 0 )
2018-06-14 00:51:26 +02:00
* x - = dx2 ;
2018-09-05 00:31:37 +02:00
if ( sDirectionToVectors [ direction ] . y > 0 )
2018-06-14 00:51:26 +02:00
* y + = dy2 ;
2018-09-05 00:31:37 +02:00
if ( sDirectionToVectors [ direction ] . y < 0 )
2018-06-14 00:51:26 +02:00
* y - = dy2 ;
2017-09-17 03:52:55 +02:00
}
2019-04-02 03:04:23 +02:00
void sub_8092FF0 ( s16 x , s16 y , s16 * destX , s16 * destY )
2017-09-17 03:59:14 +02:00
{
2019-04-02 03:04:23 +02:00
* destX = ( x - gSaveBlock1Ptr - > pos . x ) < < 4 ;
* destY = ( y - gSaveBlock1Ptr - > pos . y ) < < 4 ;
* destX - = gTotalCameraPixelOffsetX ;
* destY - = gTotalCameraPixelOffsetY ;
2017-09-17 03:59:14 +02:00
}
2019-04-02 03:04:23 +02:00
void SetSpritePosToMapCoords ( s16 mapX , s16 mapY , s16 * destX , s16 * destY )
2017-09-17 04:15:54 +02:00
{
2019-04-02 03:04:23 +02:00
s16 dx = - gTotalCameraPixelOffsetX - gFieldCamera . x ;
s16 dy = - gTotalCameraPixelOffsetY - gFieldCamera . y ;
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . x > 0 )
2020-06-01 16:23:12 +02:00
dx + = 16 ;
2019-04-02 03:04:23 +02:00
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . x < 0 )
2020-06-01 16:23:12 +02:00
dx - = 16 ;
2019-04-02 03:04:23 +02:00
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . y > 0 )
2020-06-01 16:23:12 +02:00
dy + = 16 ;
2019-04-02 03:04:23 +02:00
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . y < 0 )
2020-06-01 16:23:12 +02:00
dy - = 16 ;
2019-04-02 03:04:23 +02:00
* destX = ( ( mapX - gSaveBlock1Ptr - > pos . x ) < < 4 ) + dx ;
* destY = ( ( mapY - gSaveBlock1Ptr - > pos . y ) < < 4 ) + dy ;
2017-09-17 04:15:54 +02:00
}
2020-06-01 16:23:12 +02:00
void SetSpritePosToOffsetMapCoords ( s16 * x , s16 * y , s16 dx , s16 dy )
2017-09-17 04:19:23 +02:00
{
2019-04-02 03:04:23 +02:00
SetSpritePosToMapCoords ( * x , * y , x , y ) ;
2017-09-17 04:19:23 +02:00
* x + = dx ;
* y + = dy ;
}
2019-11-21 04:55:44 +01:00
static void GetObjectEventMovingCameraOffset ( s16 * x , s16 * y )
2017-09-17 04:23:48 +02:00
{
* x = 0 ;
* y = 0 ;
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . x > 0 )
2017-09-17 04:23:48 +02:00
{
2018-06-14 00:51:26 +02:00
( * x ) + + ;
2017-09-17 04:23:48 +02:00
}
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . x < 0 )
2017-09-17 04:23:48 +02:00
{
( * x ) - - ;
}
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . y > 0 )
2017-09-17 04:23:48 +02:00
{
2018-06-14 00:51:26 +02:00
( * y ) + + ;
2017-09-17 04:23:48 +02:00
}
2018-10-16 15:55:16 +02:00
if ( gFieldCamera . y < 0 )
2017-09-17 04:23:48 +02:00
{
( * y ) - - ;
}
}
2019-11-21 04:55:44 +01:00
void ObjectEventMoveDestCoords ( struct ObjectEvent * objectEvent , u32 direction , s16 * x , s16 * y )
2017-09-17 04:27:04 +02:00
{
2018-06-14 00:51:26 +02:00
u8 newDirn = direction ;
2019-11-21 04:55:44 +01:00
* x = objectEvent - > currentCoords . x ;
* y = objectEvent - > currentCoords . y ;
2018-06-14 00:51:26 +02:00
MoveCoords ( newDirn , x , y ) ;
2017-09-17 04:27:04 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 ObjectEventIsMovementOverridden ( struct ObjectEvent * objectEvent )
2017-09-17 04:44:47 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > singleMovementActive | | objectEvent - > heldMovementActive )
2017-09-17 04:44:47 +02:00
return TRUE ;
2018-06-14 00:51:26 +02:00
2017-09-17 04:44:47 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 ObjectEventIsHeldMovementActive ( struct ObjectEvent * objectEvent )
2017-09-17 04:44:47 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > heldMovementActive & & objectEvent - > movementActionId ! = 0xFF )
2017-09-17 04:44:47 +02:00
return TRUE ;
2018-06-14 00:51:26 +02:00
2017-09-17 04:44:47 +02:00
return FALSE ;
}
2020-07-14 22:28:02 +02:00
static u8 TryUpdateMovementActionOnStairs ( struct ObjectEvent * objectEvent , u8 movementActionId )
{
2020-08-17 21:53:36 +02:00
# if FOLLOW_ME_IMPLEMENTED
if ( objectEvent - > isPlayer | | objectEvent - > localId = = GetFollowerLocalId ( ) )
return movementActionId ; //handled separately
# else
if ( objectEvent - > isPlayer )
return movementActionId ; //handled separately
# endif
2020-07-14 22:28:02 +02:00
if ( ! ObjectMovingOnRockStairs ( objectEvent , objectEvent - > movementDirection ) )
return movementActionId ;
switch ( movementActionId )
{
case MOVEMENT_ACTION_WALK_NORMAL_DOWN :
return MOVEMENT_ACTION_WALK_SLOW_DOWN ;
case MOVEMENT_ACTION_WALK_NORMAL_UP :
return MOVEMENT_ACTION_WALK_SLOW_UP ;
case MOVEMENT_ACTION_WALK_NORMAL_LEFT :
return MOVEMENT_ACTION_WALK_SLOW_LEFT ;
case MOVEMENT_ACTION_WALK_NORMAL_RIGHT :
return MOVEMENT_ACTION_WALK_SLOW_RIGHT ;
default :
return movementActionId ;
}
}
2019-11-21 04:55:44 +01:00
bool8 ObjectEventSetHeldMovement ( struct ObjectEvent * objectEvent , u8 movementActionId )
2017-09-17 04:44:47 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ObjectEventIsMovementOverridden ( objectEvent ) )
2017-09-17 04:44:47 +02:00
return TRUE ;
2020-07-14 22:28:02 +02:00
movementActionId = TryUpdateMovementActionOnStairs ( objectEvent , movementActionId ) ;
2018-06-14 00:51:26 +02:00
2019-11-21 04:55:44 +01:00
UnfreezeObjectEvent ( objectEvent ) ;
objectEvent - > movementActionId = movementActionId ;
objectEvent - > heldMovementActive = TRUE ;
objectEvent - > heldMovementFinished = FALSE ;
gSprites [ objectEvent - > spriteId ] . data [ 2 ] = 0 ;
2017-09-17 04:44:47 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
void ObjectEventForceSetHeldMovement ( struct ObjectEvent * objectEvent , u8 movementActionId )
2017-09-17 04:44:47 +02:00
{
2020-07-14 22:28:02 +02:00
movementActionId = TryUpdateMovementActionOnStairs ( objectEvent , movementActionId ) ;
2019-11-21 04:55:44 +01:00
ObjectEventClearHeldMovementIfActive ( objectEvent ) ;
ObjectEventSetHeldMovement ( objectEvent , movementActionId ) ;
2017-09-17 04:44:47 +02:00
}
2019-11-21 04:55:44 +01:00
void ObjectEventClearHeldMovementIfActive ( struct ObjectEvent * objectEvent )
2017-09-17 04:44:47 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > heldMovementActive )
ObjectEventClearHeldMovement ( objectEvent ) ;
2017-09-17 04:44:47 +02:00
}
2019-11-21 04:55:44 +01:00
void ObjectEventClearHeldMovement ( struct ObjectEvent * objectEvent )
2017-09-17 04:44:47 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > movementActionId = 0xFF ;
objectEvent - > heldMovementActive = FALSE ;
objectEvent - > heldMovementFinished = FALSE ;
gSprites [ objectEvent - > spriteId ] . data [ 1 ] = 0 ;
gSprites [ objectEvent - > spriteId ] . data [ 2 ] = 0 ;
2017-09-17 04:44:47 +02:00
}
2017-09-16 15:43:49 +02:00
2019-11-21 04:55:44 +01:00
u8 ObjectEventCheckHeldMovementStatus ( struct ObjectEvent * objectEvent )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > heldMovementActive )
return objectEvent - > heldMovementFinished ;
2018-06-14 00:51:26 +02:00
return 16 ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
u8 ObjectEventClearHeldMovementIfFinished ( struct ObjectEvent * objectEvent )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
u8 heldMovementStatus = ObjectEventCheckHeldMovementStatus ( objectEvent ) ;
2018-06-14 00:51:26 +02:00
if ( heldMovementStatus ! = 0 & & heldMovementStatus ! = 16 )
2019-11-21 04:55:44 +01:00
ObjectEventClearHeldMovementIfActive ( objectEvent ) ;
2017-09-16 15:43:49 +02:00
2018-06-14 00:51:26 +02:00
return heldMovementStatus ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
u8 ObjectEventGetHeldMovementActionId ( struct ObjectEvent * objectEvent )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > heldMovementActive )
2020-07-14 22:28:02 +02:00
return TryUpdateMovementActionOnStairs ( objectEvent , objectEvent - > movementActionId ) ;
2018-06-14 00:51:26 +02:00
2018-12-05 15:31:01 +01:00
return 0xFF ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
void UpdateObjectEventCurrentMovement ( struct ObjectEvent * objectEvent , struct Sprite * sprite , bool8 ( * callback ) ( struct ObjectEvent * , struct Sprite * ) )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
DoGroundEffects_OnSpawn ( objectEvent , sprite ) ;
TryEnableObjectEventAnim ( objectEvent , sprite ) ;
if ( ObjectEventIsHeldMovementActive ( objectEvent ) )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventExecHeldMovementAction ( objectEvent , sprite ) ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
else if ( ! objectEvent - > frozen )
2017-09-16 15:43:49 +02:00
{
2019-11-21 04:55:44 +01:00
while ( callback ( objectEvent , sprite ) ) ;
2017-09-16 15:43:49 +02:00
}
2019-11-21 04:55:44 +01:00
DoGroundEffects_OnBeginStep ( objectEvent , sprite ) ;
DoGroundEffects_OnFinishStep ( objectEvent , sprite ) ;
UpdateObjectEventSpriteAnimPause ( objectEvent , sprite ) ;
UpdateObjectEventVisibility ( objectEvent , sprite ) ;
ObjectEventUpdateSubpriority ( objectEvent , sprite ) ;
2017-09-16 15:43:49 +02:00
}
2018-06-14 00:51:26 +02:00
# define dirn_to_anim(name, table)\
u8 name ( u32 idx ) \
{ \
u8 direction ; \
u8 animIds [ sizeof ( table ) ] ; \
direction = idx ; \
memcpy ( animIds , ( table ) , sizeof ( table ) ) ; \
2020-06-03 22:23:28 +02:00
if ( direction > sizeof ( table ) ) direction = 0 ; \
2018-06-14 00:51:26 +02:00
return animIds [ direction ] ; \
}
dirn_to_anim ( GetFaceDirectionMovementAction , gFaceDirectionMovementActions ) ;
dirn_to_anim ( GetWalkSlowMovementAction , gWalkSlowMovementActions ) ;
2020-06-03 22:23:28 +02:00
dirn_to_anim ( GetPlayerRunSlowMovementAction , gRunSlowMovementActions ) ;
2018-06-14 00:51:26 +02:00
dirn_to_anim ( GetWalkNormalMovementAction , gWalkNormalMovementActions ) ;
dirn_to_anim ( GetWalkFastMovementAction , gWalkFastMovementActions ) ;
dirn_to_anim ( GetRideWaterCurrentMovementAction , gRideWaterCurrentMovementActions ) ;
dirn_to_anim ( GetWalkFastestMovementAction , gWalkFastestMovementActions ) ;
dirn_to_anim ( GetSlideMovementAction , gSlideMovementActions ) ;
dirn_to_anim ( GetPlayerRunMovementAction , gPlayerRunMovementActions ) ;
dirn_to_anim ( GetJump2MovementAction , gJump2MovementActions ) ;
dirn_to_anim ( GetJumpInPlaceMovementAction , gJumpInPlaceMovementActions ) ;
dirn_to_anim ( GetJumpInPlaceTurnAroundMovementAction , gJumpInPlaceTurnAroundMovementActions ) ;
dirn_to_anim ( GetJumpMovementAction , gJumpMovementActions ) ;
dirn_to_anim ( GetJumpSpecialMovementAction , gJumpSpecialMovementActions ) ;
dirn_to_anim ( GetWalkInPlaceSlowMovementAction , gWalkInPlaceSlowMovementActions ) ;
dirn_to_anim ( GetWalkInPlaceNormalMovementAction , gWalkInPlaceNormalMovementActions ) ;
dirn_to_anim ( GetWalkInPlaceFastMovementAction , gWalkInPlaceFastMovementActions ) ;
dirn_to_anim ( GetWalkInPlaceFastestMovementAction , gWalkInPlaceFastestMovementActions ) ;
2017-09-17 04:54:15 +02:00
2019-11-21 04:55:44 +01:00
bool8 ObjectEventFaceOppositeDirection ( struct ObjectEvent * objectEvent , u8 direction )
2017-09-17 04:54:15 +02:00
{
2019-11-21 04:55:44 +01:00
return ObjectEventSetHeldMovement ( objectEvent , GetFaceDirectionMovementAction ( GetOppositeDirection ( direction ) ) ) ;
2017-09-17 04:54:15 +02:00
}
2017-09-17 04:58:17 +02:00
2018-06-14 00:51:26 +02:00
dirn_to_anim ( GetAcroWheelieFaceDirectionMovementAction , gAcroWheelieFaceDirectionMovementActions ) ;
dirn_to_anim ( GetAcroPopWheelieFaceDirectionMovementAction , gAcroPopWheelieFaceDirectionMovementActions ) ;
dirn_to_anim ( GetAcroEndWheelieFaceDirectionMovementAction , gAcroEndWheelieFaceDirectionMovementActions ) ;
dirn_to_anim ( GetAcroWheelieHopFaceDirectionMovementAction , gAcroWheelieHopFaceDirectionMovementActions ) ;
dirn_to_anim ( GetAcroWheelieHopDirectionMovementAction , gAcroWheelieHopDirectionMovementActions ) ;
dirn_to_anim ( GetAcroWheelieJumpDirectionMovementAction , gAcroWheelieJumpDirectionMovementActions ) ;
dirn_to_anim ( GetAcroWheelieInPlaceDirectionMovementAction , gAcroWheelieInPlaceDirectionMovementActions ) ;
dirn_to_anim ( GetAcroPopWheelieMoveDirectionMovementAction , gAcroPopWheelieMoveDirectionMovementActions ) ;
dirn_to_anim ( GetAcroWheelieMoveDirectionMovementAction , gAcroWheelieMoveDirectionMovementActions ) ;
dirn_to_anim ( GetAcroEndWheelieMoveDirectionMovementAction , gAcroEndWheelieMoveDirectionMovementActions ) ;
2017-09-17 05:03:04 +02:00
u8 GetOppositeDirection ( u8 direction )
{
2018-06-12 00:33:50 +02:00
u8 directions [ sizeof gOppositeDirections ] ;
2017-09-17 05:03:04 +02:00
2018-06-12 00:33:50 +02:00
memcpy ( directions , gOppositeDirections , sizeof gOppositeDirections ) ;
if ( direction < 1 | | direction > ( sizeof gOppositeDirections ) )
2017-09-17 05:03:04 +02:00
{
return direction ;
}
return directions [ direction - 1 ] ;
}
2017-09-17 05:05:53 +02:00
2017-09-17 14:05:33 +02:00
static u32 zffu_offset_calc ( u8 a0 , u8 a1 )
2017-09-17 05:05:53 +02:00
{
return gUnknown_0850DC2F [ a0 - 1 ] [ a1 - 1 ] ;
}
2017-09-17 14:05:33 +02:00
static u32 state_to_direction ( u8 a0 , u32 a1 , u32 a2 )
2017-09-17 05:05:53 +02:00
{
u32 zffuOffset ;
2017-09-17 05:11:09 +02:00
u8 a1_2 ;
u8 a2_2 ;
a1_2 = a1 ;
a2_2 = a2 ;
2017-09-17 05:05:53 +02:00
if ( a1_2 = = 0 | | a2_2 = = 0 | | a1_2 > DIR_EAST | | a2_2 > DIR_EAST )
{
return 0 ;
}
zffuOffset = zffu_offset_calc ( a1_2 , a2 ) ;
return gUnknown_0850DC3F [ a0 - 1 ] [ zffuOffset - 1 ] ;
}
2017-09-17 05:11:09 +02:00
2019-11-21 04:55:44 +01:00
static void ObjectEventExecHeldMovementAction ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:11:09 +02:00
{
2020-07-14 22:28:02 +02:00
objectEvent - > movementActionId = TryUpdateMovementActionOnStairs ( objectEvent , objectEvent - > movementActionId ) ;
2019-11-21 04:55:44 +01:00
if ( gMovementActionFuncs [ objectEvent - > movementActionId ] [ sprite - > data [ 2 ] ] ( objectEvent , sprite ) )
2017-09-17 05:11:09 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > heldMovementFinished = TRUE ;
2017-09-17 05:11:09 +02:00
}
}
2019-11-21 04:55:44 +01:00
static bool8 ObjectEventExecSingleMovementAction ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:11:09 +02:00
{
2020-07-14 22:28:02 +02:00
objectEvent - > movementActionId = TryUpdateMovementActionOnStairs ( objectEvent , objectEvent - > movementActionId ) ;
2019-11-21 04:55:44 +01:00
if ( gMovementActionFuncs [ objectEvent - > movementActionId ] [ sprite - > data [ 2 ] ] ( objectEvent , sprite ) )
2017-09-17 05:11:09 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > movementActionId = 0xFF ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 0 ;
2017-09-17 05:11:09 +02:00
return TRUE ;
}
return FALSE ;
}
2017-09-17 05:12:35 +02:00
2019-11-21 04:55:44 +01:00
static void ObjectEventSetSingleMovement ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 animId )
2017-09-17 05:12:35 +02:00
{
2020-07-14 22:28:02 +02:00
objectEvent - > movementActionId = TryUpdateMovementActionOnStairs ( objectEvent , animId ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 0 ;
2017-09-17 05:12:35 +02:00
}
2017-09-17 05:20:44 +02:00
2019-11-21 04:55:44 +01:00
static void FaceDirection ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2017-09-17 05:20:44 +02:00
{
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
ShiftStillObjectEventCoords ( objectEvent ) ;
obj_npc_animation_step ( objectEvent , sprite , GetMoveDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-17 05:20:44 +02:00
sprite - > animPaused = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 05:20:44 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:20:44 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , DIR_SOUTH ) ;
2017-09-17 05:20:44 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:20:44 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , DIR_NORTH ) ;
2017-09-17 05:20:44 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:20:44 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , DIR_WEST ) ;
2017-09-17 05:20:44 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 05:20:44 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , DIR_EAST ) ;
2017-09-17 05:20:44 +02:00
return TRUE ;
}
2017-09-17 05:31:43 +02:00
2019-11-21 04:55:44 +01:00
void npc_apply_direction ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed )
2017-09-17 05:31:43 +02:00
{
s16 x ;
s16 y ;
2019-11-21 04:55:44 +01:00
x = objectEvent - > currentCoords . x ;
y = objectEvent - > currentCoords . y ;
SetObjectEventDirection ( objectEvent , direction ) ;
2017-09-17 05:31:43 +02:00
MoveCoords ( direction , & x , & y ) ;
2019-11-21 04:55:44 +01:00
ShiftObjectEventCoords ( objectEvent , x , y ) ;
2017-09-17 05:31:43 +02:00
oamt_npc_ministep_reset ( sprite , direction , speed ) ;
sprite - > animPaused = FALSE ;
2019-11-21 05:12:51 +01:00
if ( gLockedAnimObjectEvents ! = NULL & & FindLockedObjectEventIndex ( objectEvent ) ! = OBJECT_EVENTS_COUNT )
2017-09-17 05:31:43 +02:00
{
sprite - > animPaused = TRUE ;
}
2019-11-21 04:55:44 +01:00
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 05:31:43 +02:00
}
2017-09-17 05:49:31 +02:00
2019-11-21 04:55:44 +01:00
void do_go_anim ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed )
2017-09-17 05:49:31 +02:00
{
u8 ( * functions [ ARRAY_COUNT ( gUnknown_0850DEE8 ) ] ) ( u8 ) ;
memcpy ( functions , gUnknown_0850DEE8 , sizeof gUnknown_0850DEE8 ) ;
2019-11-21 04:55:44 +01:00
npc_apply_direction ( objectEvent , sprite , direction , speed ) ;
npc_apply_anim_looping ( objectEvent , sprite , functions [ speed ] ( objectEvent - > facingDirection ) ) ;
2017-09-17 05:49:31 +02:00
}
2017-09-17 05:52:50 +02:00
2019-11-21 04:55:44 +01:00
void StartRunningAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2017-09-17 05:52:50 +02:00
{
2019-11-21 04:55:44 +01:00
npc_apply_direction ( objectEvent , sprite , direction , 1 ) ;
npc_apply_anim_looping ( objectEvent , sprite , GetRunningDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-17 05:52:50 +02:00
}
2017-09-17 14:05:33 +02:00
2019-11-21 04:55:44 +01:00
bool8 npc_obj_ministep_stop_on_arrival ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 14:05:33 +02:00
{
if ( obj_npc_ministep ( sprite ) )
{
2019-11-21 04:55:44 +01:00
ShiftStillObjectEventCoords ( objectEvent ) ;
objectEvent - > triggerGroundEffectsOnStop = TRUE ;
2017-09-17 14:05:33 +02:00
sprite - > animPaused = TRUE ;
return TRUE ;
}
return FALSE ;
}
2017-09-17 14:20:42 +02:00
2019-11-21 04:55:44 +01:00
void sub_8093AF0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2017-09-17 14:20:42 +02:00
{
s16 x ;
s16 y ;
2019-11-21 04:55:44 +01:00
x = objectEvent - > currentCoords . x ;
y = objectEvent - > currentCoords . y ;
SetObjectEventDirection ( objectEvent , direction ) ;
2017-09-17 14:20:42 +02:00
MoveCoords ( direction , & x , & y ) ;
2019-11-21 04:55:44 +01:00
ShiftObjectEventCoords ( objectEvent , x , y ) ;
2017-09-17 14:20:42 +02:00
sub_80976DC ( sprite , direction ) ;
sprite - > animPaused = FALSE ;
2019-11-21 04:55:44 +01:00
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 14:20:42 +02:00
}
2019-11-21 04:55:44 +01:00
void sub_8093B60 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2017-09-17 14:20:42 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093AF0 ( objectEvent , sprite , direction ) ;
npc_apply_anim_looping ( objectEvent , sprite , GetMoveDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-17 14:20:42 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 an_walk_any_2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 14:20:42 +02:00
{
if ( sub_80976EC ( sprite ) )
{
2019-11-21 04:55:44 +01:00
ShiftStillObjectEventCoords ( objectEvent ) ;
objectEvent - > triggerGroundEffectsOnStop = TRUE ;
2017-09-17 14:20:42 +02:00
sprite - > animPaused = TRUE ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalUpLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_NORTHWEST ) ;
return MovementAction_WalkSlowDiagonalUpLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalUpRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_NORTHEAST ) ;
return MovementAction_WalkSlowDiagonalUpRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalUpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalDownLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_SOUTHWEST ) ;
return MovementAction_WalkSlowDiagonalDownLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalDownRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_SOUTHEAST ) ;
return MovementAction_WalkSlowDiagonalDownRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDiagonalDownRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_SOUTH ) ;
return MovementAction_WalkSlowDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_NORTH ) ;
return MovementAction_WalkSlowUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8093B60 ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
sub_8093B60 ( objectEvent , sprite , DIR_WEST ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkSlowLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8093B60 ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
sub_8093B60 ( objectEvent , sprite , DIR_EAST ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkSlowRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkSlowRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalUpLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTHWEST , 0 ) ;
return MovementAction_WalkNormalDiagonalUpLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalUpRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTHEAST , 0 ) ;
return MovementAction_WalkNormalDiagonalUpRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalUpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalDownLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTHWEST , 0 ) ;
return MovementAction_WalkNormalDiagonalDownLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalDownRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTHEAST , 0 ) ;
return MovementAction_WalkNormalDiagonalDownRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDiagonalDownRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTH , 0 ) ;
return MovementAction_WalkNormalDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTH , 0 ) ;
return MovementAction_WalkNormalUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 0 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_WEST , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkNormalLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 0 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_EAST , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkNormalRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkNormalRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2017-09-17 14:20:42 +02:00
2019-11-21 04:55:44 +01:00
void sub_8093FC4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed , u8 a5 )
2017-09-17 14:38:00 +02:00
{
s16 displacements [ ARRAY_COUNT ( gUnknown_0850DFBC ) ] ;
s16 x ;
s16 y ;
memcpy ( displacements , gUnknown_0850DFBC , sizeof gUnknown_0850DFBC ) ;
x = 0 ;
y = 0 ;
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2018-06-14 00:51:26 +02:00
MoveCoordsInDirection ( direction , & x , & y , displacements [ speed ] , displacements [ speed ] ) ;
2019-11-21 04:55:44 +01:00
ShiftObjectEventCoords ( objectEvent , objectEvent - > currentCoords . x + x , objectEvent - > currentCoords . y + y ) ;
2017-09-17 14:38:00 +02:00
sub_809783C ( sprite , direction , speed , a5 ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 14:38:00 +02:00
sprite - > animPaused = 0 ;
2019-11-21 04:55:44 +01:00
objectEvent - > triggerGroundEffectsOnMove = 1 ;
objectEvent - > disableCoveringGroundEffects = 1 ;
2017-09-17 14:38:00 +02:00
}
2019-11-21 04:55:44 +01:00
void maybe_shadow_1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed , u8 a4 )
2017-09-17 14:38:00 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093FC4 ( objectEvent , sprite , direction , speed , a4 ) ;
npc_apply_anim_looping ( objectEvent , sprite , GetMoveDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
DoShadowFieldEffect ( objectEvent ) ;
2017-09-17 14:38:00 +02:00
}
2017-09-17 14:45:24 +02:00
2019-11-21 04:55:44 +01:00
u8 sub_80940C4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 callback ( struct Sprite * ) )
2017-09-17 14:45:24 +02:00
{
s16 displacements [ ARRAY_COUNT ( gUnknown_0850DFC2 ) ] ;
s16 x ;
s16 y ;
u8 result ;
memcpy ( displacements , gUnknown_0850DFC2 , sizeof gUnknown_0850DFC2 ) ;
result = callback ( sprite ) ;
2017-12-02 21:44:50 +01:00
if ( result = = 1 & & displacements [ sprite - > data [ 4 ] ] ! = 0 )
2017-09-17 14:45:24 +02:00
{
x = 0 ;
y = 0 ;
2019-11-21 04:55:44 +01:00
MoveCoordsInDirection ( objectEvent - > movementDirection , & x , & y , displacements [ sprite - > data [ 4 ] ] , displacements [ sprite - > data [ 4 ] ] ) ;
ShiftObjectEventCoords ( objectEvent , objectEvent - > currentCoords . x + x , objectEvent - > currentCoords . y + y ) ;
objectEvent - > triggerGroundEffectsOnMove = TRUE ;
objectEvent - > disableCoveringGroundEffects = TRUE ;
2017-09-17 14:45:24 +02:00
}
2018-12-05 15:31:01 +01:00
else if ( result = = 0xFF )
2017-09-17 14:45:24 +02:00
{
2019-11-21 04:55:44 +01:00
ShiftStillObjectEventCoords ( objectEvent ) ;
objectEvent - > triggerGroundEffectsOnStop = TRUE ;
objectEvent - > landingJump = TRUE ;
2017-09-17 14:45:24 +02:00
sprite - > animPaused = TRUE ;
}
return result ;
}
2017-09-17 15:49:50 +02:00
2019-11-21 04:55:44 +01:00
u8 sub_8094188 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 15:49:50 +02:00
{
2019-11-21 04:55:44 +01:00
return sub_80940C4 ( objectEvent , sprite , sub_809785C ) ;
2017-09-17 15:49:50 +02:00
}
2019-11-21 04:55:44 +01:00
u8 sub_809419C ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 15:49:50 +02:00
{
2019-11-21 04:55:44 +01:00
return sub_80940C4 ( objectEvent , sprite , sub_80978E4 ) ;
2017-09-17 15:49:50 +02:00
}
2017-09-17 15:52:17 +02:00
2019-11-21 04:55:44 +01:00
bool8 sub_80941B0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 15:52:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_8094188 ( objectEvent , sprite ) = = 0xFF )
2017-09-17 15:52:17 +02:00
{
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 sub_80941C8 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 15:52:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_809419C ( objectEvent , sprite ) = = 0xFF )
2017-09-17 15:52:17 +02:00
{
return TRUE ;
}
return FALSE ;
}
2017-09-17 15:55:17 +02:00
2019-11-21 04:55:44 +01:00
bool8 sub_80941E0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 15:55:17 +02:00
{
2019-11-21 04:55:44 +01:00
switch ( sub_8094188 ( objectEvent , sprite ) )
2017-09-17 15:55:17 +02:00
{
case 255 :
return TRUE ;
case 1 :
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , GetOppositeDirection ( objectEvent - > movementDirection ) ) ;
obj_npc_animation_step ( objectEvent , sprite , GetMoveDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-17 15:55:17 +02:00
default :
return FALSE ;
}
}
2017-09-17 16:01:27 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Down_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_SOUTH , 2 , 0 ) ;
return MovementAction_Jump2Down_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Down_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Up_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_NORTH , 2 , 0 ) ;
return MovementAction_Jump2Up_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Up_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Left_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_WEST , 2 , 0 ) ;
return MovementAction_Jump2Left_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Left_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Right_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_EAST , 2 , 0 ) ;
return MovementAction_Jump2Right_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Jump2Right_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
void sub_8094390 ( struct Sprite * sprite , u16 duration )
{
sprite - > data [ 2 ] = 1 ;
sprite - > data [ 3 ] = duration ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( - - sprite - > data [ 3 ] = = 0 )
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay1_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sub_8094390 ( sprite , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_Delay_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay2_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sub_8094390 ( sprite , 2 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_Delay_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay4_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sub_8094390 ( sprite , 4 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_Delay_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay8_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sub_8094390 ( sprite , 8 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_Delay_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Delay16_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sub_8094390 ( sprite , 16 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_Delay_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTH , 1 ) ;
return MovementAction_WalkFastDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTH , 1 ) ;
return MovementAction_WalkFastUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_WEST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkFastLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_EAST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkFastRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
void sub_8094554 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 animNum , u16 duration )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
npc_apply_anim_looping ( objectEvent , sprite , animNum ) ;
2018-06-14 00:51:26 +02:00
sprite - > animPaused = FALSE ;
sprite - > data [ 2 ] = 1 ;
sprite - > data [ 3 ] = duration ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlace_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( - - sprite - > data [ 3 ] = = 0 )
{
sprite - > data [ 2 ] = 2 ;
sprite - > animPaused = TRUE ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceSlow_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( sprite - > data [ 3 ] & 1 )
{
sprite - > animDelayCounter + + ;
}
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceSlowDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_SOUTH , GetMoveDirectionAnimNum ( DIR_SOUTH ) , 32 ) ;
return MovementAction_WalkInPlaceSlow_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceSlowUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_NORTH , GetMoveDirectionAnimNum ( DIR_NORTH ) , 32 ) ;
return MovementAction_WalkInPlaceSlow_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceSlowLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_WEST , GetMoveDirectionAnimNum ( DIR_WEST ) , 32 ) ;
return MovementAction_WalkInPlaceSlow_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceSlowRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_EAST , GetMoveDirectionAnimNum ( DIR_EAST ) , 32 ) ;
return MovementAction_WalkInPlaceSlow_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceNormalDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_SOUTH , GetMoveDirectionAnimNum ( DIR_SOUTH ) , 16 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceNormalUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_NORTH , GetMoveDirectionAnimNum ( DIR_NORTH ) , 16 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceNormalLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_WEST , GetMoveDirectionAnimNum ( DIR_WEST ) , 16 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceNormalRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_EAST , GetMoveDirectionAnimNum ( DIR_EAST ) , 16 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_SOUTH , GetMoveDirectionFastAnimNum ( DIR_SOUTH ) , 8 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_NORTH , GetMoveDirectionFastAnimNum ( DIR_NORTH ) , 8 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_WEST , GetMoveDirectionFastAnimNum ( DIR_WEST ) , 8 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_EAST , GetMoveDirectionFastAnimNum ( DIR_EAST ) , 8 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastestDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_SOUTH , GetMoveDirectionFasterAnimNum ( DIR_SOUTH ) , 4 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastestUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094554 ( objectEvent , sprite , DIR_NORTH , GetMoveDirectionFasterAnimNum ( DIR_NORTH ) , 4 ) ;
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastestLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8094554 ( objectEvent , sprite , objectEvent - > directionOverwrite , GetMoveDirectionFasterAnimNum ( DIR_WEST ) , 4 ) ;
else
sub_8094554 ( objectEvent , sprite , DIR_WEST , GetMoveDirectionFasterAnimNum ( DIR_WEST ) , 4 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkInPlaceFastestRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8094554 ( objectEvent , sprite , objectEvent - > directionOverwrite , GetMoveDirectionFasterAnimNum ( DIR_WEST ) , 4 ) ;
else
sub_8094554 ( objectEvent , sprite , DIR_EAST , GetMoveDirectionFasterAnimNum ( DIR_EAST ) , 4 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTH , 2 ) ;
return MovementAction_RideWaterCurrentDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTH , 2 ) ;
return MovementAction_RideWaterCurrentUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 2 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_WEST , 2 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_RideWaterCurrentLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 2 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_EAST , 2 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_RideWaterCurrentRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RideWaterCurrentRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTH , 3 ) ;
return MovementAction_WalkFastestDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTH , 3 ) ;
return MovementAction_WalkFastestUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 3 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_WEST , 3 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkFastestLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 3 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_EAST , 3 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkFastestRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkFastestRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_SOUTH , 4 ) ;
return MovementAction_SlideDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_NORTH , 4 ) ;
return MovementAction_SlideUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 4 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_WEST , 4 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_SlideLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
do_go_anim ( objectEvent , sprite , objectEvent - > directionOverwrite , 4 ) ;
else
do_go_anim ( objectEvent , sprite , DIR_EAST , 4 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_SlideRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SlideRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartRunningAnim ( objectEvent , sprite , DIR_SOUTH ) ;
return MovementAction_PlayerRunDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartRunningAnim ( objectEvent , sprite , DIR_NORTH ) ;
return MovementAction_PlayerRunUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
StartRunningAnim ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
StartRunningAnim ( objectEvent , sprite , DIR_WEST ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_PlayerRunLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
StartRunningAnim ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
StartRunningAnim ( objectEvent , sprite , DIR_EAST ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_PlayerRunRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PlayerRunRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
void StartSpriteAnimInDirection ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 animNum )
2018-06-14 00:51:26 +02:00
{
SetAndStartSpriteAnim ( sprite , animNum , 0 ) ;
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_StartAnimInDirection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , objectEvent - > movementDirection , sprite - > animNum ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WaitSpriteAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( SpriteAnimEnded ( sprite ) )
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
void sub_8094DE4 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093FC4 ( objectEvent , sprite , direction , 1 , 0 ) ;
2018-06-14 00:51:26 +02:00
StartSpriteAnim ( sprite , GetJumpSpecialDirectionAnimNum ( direction ) ) ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094DE4 ( objectEvent , sprite , DIR_SOUTH ) ;
return MovementAction_JumpSpecialDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941C8 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
2019-11-21 04:55:44 +01:00
objectEvent - > landingJump = FALSE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094DE4 ( objectEvent , sprite , DIR_NORTH ) ;
return MovementAction_JumpSpecialUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941C8 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
2019-11-21 04:55:44 +01:00
objectEvent - > landingJump = FALSE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094DE4 ( objectEvent , sprite , DIR_WEST ) ;
return MovementAction_JumpSpecialLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941C8 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
2019-11-21 04:55:44 +01:00
objectEvent - > landingJump = FALSE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8094DE4 ( objectEvent , sprite , DIR_EAST ) ;
return MovementAction_JumpSpecialRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpSpecialRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941C8 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
2019-11-21 04:55:44 +01:00
objectEvent - > landingJump = FALSE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FacePlayer_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 playerObjectId ;
2019-11-21 05:12:51 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( OBJ_EVENT_ID_PLAYER , 0 , 0 , & playerObjectId ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , GetDirectionToFace ( objectEvent - > currentCoords . x , objectEvent - > currentCoords . y , gObjectEvents [ playerObjectId ] . currentCoords . x , gObjectEvents [ playerObjectId ] . currentCoords . y ) ) ;
2018-06-14 00:51:26 +02:00
}
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceAwayPlayer_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
u8 playerObjectId ;
2019-11-21 05:12:51 +01:00
if ( ! TryGetObjectEventIdByLocalIdAndMap ( OBJ_EVENT_ID_PLAYER , 0 , 0 , & playerObjectId ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , GetOppositeDirection ( GetDirectionToFace ( objectEvent - > currentCoords . x , objectEvent - > currentCoords . y , gObjectEvents [ playerObjectId ] . currentCoords . x , gObjectEvents [ playerObjectId ] . currentCoords . y ) ) ) ;
2018-06-14 00:51:26 +02:00
}
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_LockFacingDirection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > facingDirectionLocked = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_UnlockFacingDirection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > facingDirectionLocked = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_SOUTH , 1 , 2 ) ;
return MovementAction_JumpDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_NORTH , 1 , 2 ) ;
return MovementAction_JumpUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_WEST , 1 , 2 ) ;
return MovementAction_JumpLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_EAST , 1 , 2 ) ;
return MovementAction_JumpRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_SOUTH , 0 , 0 ) ;
return MovementAction_JumpInPlaceDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_NORTH , 0 , 0 ) ;
return MovementAction_JumpInPlaceUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_WEST , 0 , 0 ) ;
return MovementAction_JumpInPlaceLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_EAST , 0 , 0 ) ;
return MovementAction_JumpInPlaceRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceDownUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_SOUTH , 0 , 2 ) ;
return MovementAction_JumpInPlaceDownUp_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceDownUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941E0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceUpDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_NORTH , 0 , 2 ) ;
return MovementAction_JumpInPlaceUpDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceUpDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941E0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceLeftRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_WEST , 0 , 2 ) ;
return MovementAction_JumpInPlaceLeftRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceLeftRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941E0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceRightLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
maybe_shadow_1 ( objectEvent , sprite , DIR_EAST , 0 , 2 ) ;
return MovementAction_JumpInPlaceRightLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_JumpInPlaceRightLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941E0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 0 ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_FaceOriginalDirection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
FaceDirection ( objectEvent , sprite , gInitialMovementTypeFacingDirections [ objectEvent - > movementType ] ) ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_NurseJoyBowDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_SOUTH , 0x14 ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_EnableJumpLandingGroundEffect_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > disableJumpLandingGroundEffect = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_DisableJumpLandingGroundEffect_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > disableJumpLandingGroundEffect = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_DisableAnimation_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > inanimate = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RestoreAnimation_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > inanimate = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) - > inanimate ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SetInvisible_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SetVisible_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_EmoteExclamationMark_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
2018-06-14 00:51:26 +02:00
FieldEffectStart ( FLDEFF_EXCLAMATION_MARK_ICON ) ;
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_EmoteQuestionMark_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
2018-06-14 00:51:26 +02:00
FieldEffectStart ( FLDEFF_QUESTION_MARK_ICON ) ;
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_EmoteHeart_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
2018-06-14 00:51:26 +02:00
FieldEffectStart ( FLDEFF_HEART_ICON ) ;
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RevealTrainer_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2021-02-14 20:25:23 +01:00
if ( objectEvent - > movementType = = MOVEMENT_TYPE_BURIED )
2018-06-14 00:51:26 +02:00
{
2021-02-14 20:25:23 +01:00
SetBuriedTrainerMovement ( objectEvent ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
if ( objectEvent - > movementType ! = MOVEMENT_TYPE_TREE_DISGUISE & & objectEvent - > movementType ! = MOVEMENT_TYPE_MOUNTAIN_DISGUISE )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
sub_8155D78 ( objectEvent ) ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
2019-11-21 04:55:44 +01:00
return MovementAction_RevealTrainer_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RevealTrainer_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_8155DA0 ( objectEvent ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RockSmashBreak_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
SetAndStartSpriteAnim ( sprite , 1 , 0 ) ;
sprite - > data [ 2 ] = 1 ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RockSmashBreak_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( SpriteAnimEnded ( sprite ) )
{
SetMovementDelay ( sprite , 32 ) ;
sprite - > data [ 2 ] = 2 ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_RockSmashBreak_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible ^ = TRUE ;
2018-06-14 00:51:26 +02:00
if ( WaitForMovementDelay ( sprite ) )
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 3 ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_CutTree_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
SetAndStartSpriteAnim ( sprite , 1 , 0 ) ;
sprite - > data [ 2 ] = 1 ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_CutTree_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
if ( SpriteAnimEnded ( sprite ) )
{
SetMovementDelay ( sprite , 32 ) ;
sprite - > data [ 2 ] = 2 ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_CutTree_Step2 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible ^ = TRUE ;
2018-06-14 00:51:26 +02:00
if ( WaitForMovementDelay ( sprite ) )
{
2019-11-21 04:55:44 +01:00
objectEvent - > invisible = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 3 ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_SetFixedPriority_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > fixedPriority = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_ClearFixedPriority_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > fixedPriority = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_InitAffineAnim_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
sprite - > oam . affineMode = ST_OAM_AFFINE_DOUBLE ;
InitSpriteAffineAnim ( sprite ) ;
sprite - > affineAnimPaused = TRUE ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_OFF ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_ClearAffineAnim_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
FreeOamMatrix ( sprite - > oam . matrixNum ) ;
sprite - > oam . affineMode = ST_OAM_AFFINE_OFF ;
CalcCenterToCornerVec ( sprite , sprite - > oam . shape , sprite - > oam . size , sprite - > oam . affineMode ) ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_HideReflection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hideReflection = TRUE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_ShowReflection_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hideReflection = FALSE ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkDownStartAffine_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_SOUTH ) ;
2018-06-14 00:51:26 +02:00
sprite - > affineAnimPaused = FALSE ;
StartSpriteAffineAnimIfDifferent ( sprite , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkDownStartAffine_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkDownStartAffine_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > affineAnimPaused = TRUE ;
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkDownAffine_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093B60 ( objectEvent , sprite , DIR_SOUTH ) ;
2018-06-14 00:51:26 +02:00
sprite - > affineAnimPaused = FALSE ;
ChangeSpriteAffineAnimIfDifferent ( sprite , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkDownAffine_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkDownAffine_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( an_walk_any_2 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > affineAnimPaused = TRUE ;
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkLeftAffine_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_WEST , 1 ) ;
2018-06-14 00:51:26 +02:00
sprite - > affineAnimPaused = FALSE ;
ChangeSpriteAffineAnimIfDifferent ( sprite , 2 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkLeftAffine_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkLeftAffine_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > affineAnimPaused = TRUE ;
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkRightAffine_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
do_go_anim ( objectEvent , sprite , DIR_EAST , 1 ) ;
2018-06-14 00:51:26 +02:00
sprite - > affineAnimPaused = FALSE ;
ChangeSpriteAffineAnimIfDifferent ( sprite , 3 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkRightAffine_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_WalkRightAffine_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > affineAnimPaused = TRUE ;
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
static void sub_80958C0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
SetObjectEventDirection ( objectEvent , direction ) ;
ShiftStillObjectEventCoords ( objectEvent ) ;
obj_npc_animation_step ( objectEvent , sprite , GetAcroWheeliePedalDirectionAnimNum ( direction ) ) ;
2018-06-14 00:51:26 +02:00
sprite - > animPaused = TRUE ;
sprite - > data [ 2 ] = 1 ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieFaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_80958C0 ( objectEvent , sprite , DIR_SOUTH ) ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieFaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_80958C0 ( objectEvent , sprite , DIR_NORTH ) ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieFaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_80958C0 ( objectEvent , sprite , DIR_WEST ) ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieFaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_80958C0 ( objectEvent , sprite , DIR_EAST ) ;
2018-06-14 00:51:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_SOUTH , GetAcroWheelieDirectionAnimNum ( DIR_SOUTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_NORTH , GetAcroWheelieDirectionAnimNum ( DIR_NORTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_WEST , GetAcroWheelieDirectionAnimNum ( DIR_WEST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_EAST , GetAcroWheelieDirectionAnimNum ( DIR_EAST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieFaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_SOUTH , GetAcroEndWheelieDirectionAnimNum ( DIR_SOUTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieFaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_NORTH , GetAcroEndWheelieDirectionAnimNum ( DIR_NORTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieFaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_WEST , GetAcroEndWheelieDirectionAnimNum ( DIR_WEST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieFaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_EAST , GetAcroEndWheelieDirectionAnimNum ( DIR_EAST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_UnusedAcroActionDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_SOUTH , GetAcroUnusedActionDirectionAnimNum ( DIR_SOUTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_UnusedAcroActionUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_NORTH , GetAcroUnusedActionDirectionAnimNum ( DIR_NORTH ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_UnusedAcroActionLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_WEST , GetAcroUnusedActionDirectionAnimNum ( DIR_WEST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_UnusedAcroActionRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
StartSpriteAnimInDirection ( objectEvent , sprite , DIR_EAST , GetAcroUnusedActionDirectionAnimNum ( DIR_EAST ) ) ;
2018-06-14 00:51:26 +02:00
return FALSE ;
}
2020-06-24 22:27:00 +02:00
void InitFigure8Anim ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-24 22:27:00 +02:00
InitSpriteForFigure8Anim ( sprite ) ;
2018-06-14 00:51:26 +02:00
sprite - > animPaused = FALSE ;
}
2020-06-24 22:27:00 +02:00
bool8 DoFigure8Anim ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-24 22:27:00 +02:00
if ( AnimateSpriteInFigure8 ( sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
ShiftStillObjectEventCoords ( objectEvent ) ;
objectEvent - > triggerGroundEffectsOnStop = TRUE ;
2018-06-14 00:51:26 +02:00
sprite - > animPaused = TRUE ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Figure8_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-24 22:27:00 +02:00
InitFigure8Anim ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 1 ;
2019-11-21 04:55:44 +01:00
return MovementAction_Figure8_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Figure8_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-24 22:27:00 +02:00
if ( DoFigure8Anim ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
void sub_8095B84 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed , u8 a4 )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8093FC4 ( objectEvent , sprite , direction , speed , a4 ) ;
2018-06-14 00:51:26 +02:00
StartSpriteAnimIfDifferent ( sprite , GetAcroWheelieDirectionAnimNum ( direction ) ) ;
2019-11-21 04:55:44 +01:00
DoShadowFieldEffect ( objectEvent ) ;
2017-09-17 16:01:27 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:07:43 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8095B84 ( objectEvent , sprite , DIR_SOUTH , 0 , 1 ) ;
return MovementAction_AcroWheelieHopFaceDown_Step1 ( objectEvent , sprite ) ;
2017-09-17 16:07:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:07:43 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 16:07:43 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 16:07:43 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:23:18 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8095B84 ( objectEvent , sprite , DIR_NORTH , 0 , 1 ) ;
return MovementAction_AcroWheelieHopFaceUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 16:23:18 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:23:18 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 16:23:18 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 16:23:18 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:23:18 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8095B84 ( objectEvent , sprite , DIR_WEST , 0 , 1 ) ;
return MovementAction_AcroWheelieHopFaceLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 16:23:18 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
2017-09-17 16:23:18 +02:00
}
2018-06-14 00:51:26 +02:00
return FALSE ;
2017-09-17 16:23:18 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8095B84 ( objectEvent , sprite , DIR_EAST , 0 , 1 ) ;
return MovementAction_AcroWheelieHopFaceRight_Step1 ( objectEvent , sprite ) ;
2017-09-17 16:58:24 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopFaceRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:58:24 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
2017-09-17 16:58:24 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8095B84 ( objectEvent , sprite , DIR_SOUTH , 1 , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieHopDown_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 16:58:24 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 16:58:24 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 16:58:24 +02:00
return TRUE ;
}
return FALSE ;
}
2017-09-17 18:19:35 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 18:19:35 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8095B84 ( objectEvent , sprite , DIR_NORTH , 1 , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieHopUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 18:19:35 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 18:19:35 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 18:25:27 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8095B84 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 , 1 ) ;
else
sub_8095B84 ( objectEvent , sprite , DIR_WEST , 1 , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieHopLeft_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2017-09-17 18:25:27 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 18:25:27 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
2017-09-17 18:25:27 +02:00
}
2018-06-14 00:51:26 +02:00
return FALSE ;
2017-09-17 18:25:27 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 18:25:27 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8095B84 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 , 1 ) ;
else
sub_8095B84 ( objectEvent , sprite , DIR_EAST , 1 , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieHopRight_Step1 ( objectEvent , sprite ) ;
2018-06-14 00:51:26 +02:00
}
2017-09-17 18:25:27 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieHopRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2017-09-17 18:25:27 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
2017-09-17 18:25:27 +02:00
}
2018-06-14 00:51:26 +02:00
return FALSE ;
2017-09-17 18:25:27 +02:00
}
2017-09-17 18:57:42 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 18:57:42 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8095B84 ( objectEvent , sprite , DIR_SOUTH , 2 , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieJumpDown_Step1 ( objectEvent , sprite ) ;
2017-09-17 18:57:42 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 18:57:42 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 18:57:42 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:00:43 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8095B84 ( objectEvent , sprite , DIR_NORTH , 2 , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieJumpUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:00:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:00:43 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
2017-09-17 19:00:43 +02:00
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:00:43 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8095B84 ( objectEvent , sprite , objectEvent - > directionOverwrite , 2 , 0 ) ;
else
sub_8095B84 ( objectEvent , sprite , DIR_WEST , 2 , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieJumpLeft_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:00:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:00:43 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 19:00:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:00:43 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8095B84 ( objectEvent , sprite , objectEvent - > directionOverwrite , 2 , 0 ) ;
else
sub_8095B84 ( objectEvent , sprite , DIR_EAST , 2 , 0 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieJumpRight_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:00:43 +02:00
}
2017-09-17 19:06:03 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieJumpRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:06:03 +02:00
{
2019-11-21 04:55:44 +01:00
if ( sub_80941B0 ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = FALSE ;
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 19:06:03 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieInPlaceDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:06:03 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8094554 ( objectEvent , sprite , DIR_SOUTH , GetAcroWheeliePedalDirectionAnimNum ( DIR_SOUTH ) , 8 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:06:03 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieInPlaceUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:06:03 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8094554 ( objectEvent , sprite , DIR_NORTH , GetAcroWheeliePedalDirectionAnimNum ( DIR_NORTH ) , 8 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:06:03 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieInPlaceLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:06:03 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8094554 ( objectEvent , sprite , objectEvent - > directionOverwrite , GetAcroWheeliePedalDirectionAnimNum ( objectEvent - > directionOverwrite ) , 8 ) ;
else
sub_8094554 ( objectEvent , sprite , DIR_WEST , GetAcroWheeliePedalDirectionAnimNum ( DIR_WEST ) , 8 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:06:03 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieInPlaceRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:06:03 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8094554 ( objectEvent , sprite , objectEvent - > directionOverwrite , GetAcroWheeliePedalDirectionAnimNum ( objectEvent - > directionOverwrite ) , 8 ) ;
else
sub_8094554 ( objectEvent , sprite , DIR_EAST , GetAcroWheeliePedalDirectionAnimNum ( DIR_EAST ) , 8 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_WalkInPlace_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:06:03 +02:00
}
2019-11-21 04:55:44 +01:00
void sub_80960C8 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed )
2017-09-17 19:06:03 +02:00
{
2019-11-21 04:55:44 +01:00
npc_apply_direction ( objectEvent , sprite , direction , speed ) ;
StartSpriteAnim ( sprite , GetAcroWheelieDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2018-06-14 00:51:26 +02:00
SeekSpriteAnim ( sprite , 0 ) ;
2017-09-17 19:06:03 +02:00
}
2017-09-17 19:26:17 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2020-06-20 07:40:12 +02:00
sub_80960C8 ( objectEvent , sprite , DIR_SOUTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroPopWheelieMoveDown_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:26:17 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2017-09-17 19:26:17 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 19:26:17 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2020-06-20 07:40:12 +02:00
sub_80960C8 ( objectEvent , sprite , DIR_NORTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroPopWheelieMoveUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:26:17 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2017-09-17 19:26:17 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2018-06-14 00:51:26 +02:00
return TRUE ;
2017-09-17 19:26:17 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_80960C8 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_80960C8 ( objectEvent , sprite , DIR_WEST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroPopWheelieMoveLeft_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:26:17 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2017-09-17 19:26:17 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2018-06-14 00:51:26 +02:00
return TRUE ;
2017-09-17 19:26:17 +02:00
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_80960C8 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_80960C8 ( objectEvent , sprite , DIR_EAST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroPopWheelieMoveRight_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:26:17 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroPopWheelieMoveRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:26:17 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 19:26:17 +02:00
}
2019-11-21 04:55:44 +01:00
void sub_8096200 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed )
2017-09-17 19:26:17 +02:00
{
2019-11-21 04:55:44 +01:00
npc_apply_direction ( objectEvent , sprite , direction , speed ) ;
npc_apply_anim_looping ( objectEvent , sprite , GetAcroWheeliePedalDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2017-09-17 19:26:17 +02:00
}
2017-09-17 19:59:30 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:59:30 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8096200 ( objectEvent , sprite , DIR_SOUTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieMoveDown_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:59:30 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:59:30 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 19:59:30 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:59:30 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8096200 ( objectEvent , sprite , DIR_NORTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieMoveUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 19:59:30 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 19:59:30 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 19:59:30 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:02:43 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8096200 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_8096200 ( objectEvent , sprite , DIR_WEST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieMoveLeft_Step1 ( objectEvent , sprite ) ;
2017-09-17 20:02:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:02:43 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 20:02:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:02:43 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8096200 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_8096200 ( objectEvent , sprite , DIR_EAST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroWheelieMoveRight_Step1 ( objectEvent , sprite ) ;
2017-09-17 20:02:43 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroWheelieMoveRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:02:43 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 20:02:43 +02:00
}
2019-11-21 04:55:44 +01:00
void sub_8096330 ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction , u8 speed )
2017-09-17 20:02:43 +02:00
{
2019-11-21 04:55:44 +01:00
npc_apply_direction ( objectEvent , sprite , direction , speed ) ;
StartSpriteAnim ( sprite , GetAcroEndWheelieDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
2018-06-14 00:51:26 +02:00
SeekSpriteAnim ( sprite , 0 ) ;
2017-09-17 20:02:43 +02:00
}
2017-09-17 20:06:43 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:12:32 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8096330 ( objectEvent , sprite , DIR_SOUTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroEndWheelieMoveDown_Step1 ( objectEvent , sprite ) ;
2017-09-17 20:12:32 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:12:32 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2017-09-17 20:12:32 +02:00
{
2018-06-14 00:51:26 +02:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 20:12:32 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:12:32 +02:00
{
2020-06-20 07:40:12 +02:00
sub_8096330 ( objectEvent , sprite , DIR_NORTH , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroEndWheelieMoveUp_Step1 ( objectEvent , sprite ) ;
2017-09-17 20:12:32 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:12:32 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2017-09-17 20:12:32 +02:00
{
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 2 ;
2017-09-17 20:12:32 +02:00
return TRUE ;
}
return FALSE ;
}
2017-09-17 20:51:10 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 20:51:10 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8096330 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_8096330 ( objectEvent , sprite , DIR_WEST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroEndWheelieMoveLeft_Step1 ( objectEvent , sprite ) ;
2017-09-17 20:51:10 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveLeft_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:03:47 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 21:03:47 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:05:23 +02:00
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
sub_8096330 ( objectEvent , sprite , objectEvent - > directionOverwrite , 1 ) ;
else
sub_8096330 ( objectEvent , sprite , DIR_EAST , 1 ) ;
2019-11-21 04:55:44 +01:00
return MovementAction_AcroEndWheelieMoveRight_Step1 ( objectEvent , sprite ) ;
2017-09-17 21:05:23 +02:00
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_AcroEndWheelieMoveRight_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:06:45 +02:00
{
2019-11-21 04:55:44 +01:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2018-06-14 00:51:26 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
2017-09-17 21:06:45 +02:00
}
2017-09-17 21:33:26 +02:00
2019-11-21 04:55:44 +01:00
bool8 MovementAction_Levitate_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2019-11-21 04:55:44 +01:00
CreateLevitateMovementTask ( objectEvent ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 21:33:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_StopLevitate_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2019-11-21 04:55:44 +01:00
DestroyExtraMovementTask ( objectEvent - > warpArrowSpriteId ) ;
2017-09-17 21:33:26 +02:00
sprite - > pos2 . y = 0 ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 21:33:26 +02:00
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_DestroyExtraTaskIfAtTop_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
if ( sprite - > pos2 . y = = 0 )
{
2019-11-21 04:55:44 +01:00
DestroyExtraMovementTask ( objectEvent - > warpArrowSpriteId ) ;
2017-12-02 21:44:50 +01:00
sprite - > data [ 2 ] = 1 ;
2017-09-17 21:33:26 +02:00
return TRUE ;
}
return FALSE ;
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_Finish ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
return TRUE ;
}
2019-11-21 04:55:44 +01:00
bool8 MovementAction_PauseSpriteAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
sprite - > animPaused = TRUE ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
static void UpdateObjectEventSpriteAnimPause ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > disableAnim )
2017-09-17 21:33:26 +02:00
{
sprite - > animPaused = TRUE ;
}
}
2019-11-21 04:55:44 +01:00
static void TryEnableObjectEventAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > enableAnim )
2017-09-17 21:33:26 +02:00
{
sprite - > animPaused = FALSE ;
2019-11-21 04:55:44 +01:00
objectEvent - > disableAnim = FALSE ;
objectEvent - > enableAnim = FALSE ;
2017-09-17 21:33:26 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void UpdateObjectEventVisibility ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2019-11-21 04:55:44 +01:00
sub_8096530 ( objectEvent , sprite ) ;
2019-11-21 06:14:40 +01:00
UpdateObjEventSpriteVisibility ( objectEvent , sprite ) ;
2017-09-17 21:33:26 +02:00
}
2019-11-21 04:55:44 +01:00
static void sub_8096530 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
2018-10-20 22:01:45 +02:00
u16 x , y ;
u16 x2 , y2 ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo ;
2017-09-17 21:33:26 +02:00
2019-11-21 04:55:44 +01:00
objectEvent - > offScreen = FALSE ;
graphicsInfo = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) ;
2017-09-17 21:33:26 +02:00
if ( sprite - > coordOffsetEnabled )
{
x = sprite - > pos1 . x + sprite - > pos2 . x + sprite - > centerToCornerVecX + gSpriteCoordOffsetX ;
y = sprite - > pos1 . y + sprite - > pos2 . y + sprite - > centerToCornerVecY + gSpriteCoordOffsetY ;
}
else
{
x = sprite - > pos1 . x + sprite - > pos2 . x + sprite - > centerToCornerVecX ;
y = sprite - > pos1 . y + sprite - > pos2 . y + sprite - > centerToCornerVecY ;
}
x2 = graphicsInfo - > width ;
x2 + = x ;
y2 = y ;
y2 + = graphicsInfo - > height ;
if ( ( s16 ) x > = 0x100 | | ( s16 ) x2 < - 0x10 )
{
2019-11-21 04:55:44 +01:00
objectEvent - > offScreen = TRUE ;
2017-09-17 21:33:26 +02:00
}
if ( ( s16 ) y > = 0xB0 | | ( s16 ) y2 < - 0x10 )
{
2019-11-21 04:55:44 +01:00
objectEvent - > offScreen = TRUE ;
2017-09-17 21:33:26 +02:00
}
}
2019-11-21 06:14:40 +01:00
static void UpdateObjEventSpriteVisibility ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2017-09-17 21:33:26 +02:00
{
sprite - > invisible = FALSE ;
2019-11-21 04:55:44 +01:00
if ( objectEvent - > invisible | | objectEvent - > offScreen )
2017-09-17 21:33:26 +02:00
{
sprite - > invisible = TRUE ;
}
}
2018-06-11 15:34:19 +02:00
2019-11-21 04:55:44 +01:00
static void GetAllGroundEffectFlags_OnSpawn ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 15:34:19 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventUpdateMetatileBehaviors ( objEvent ) ;
GetGroundEffectFlags_Reflection ( objEvent , flags ) ;
GetGroundEffectFlags_TallGrassOnSpawn ( objEvent , flags ) ;
GetGroundEffectFlags_LongGrassOnSpawn ( objEvent , flags ) ;
GetGroundEffectFlags_SandHeap ( objEvent , flags ) ;
GetGroundEffectFlags_ShallowFlowingWater ( objEvent , flags ) ;
GetGroundEffectFlags_ShortGrass ( objEvent , flags ) ;
GetGroundEffectFlags_HotSprings ( objEvent , flags ) ;
2018-06-11 15:34:19 +02:00
}
2019-11-21 04:55:44 +01:00
static void GetAllGroundEffectFlags_OnBeginStep ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 15:34:19 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventUpdateMetatileBehaviors ( objEvent ) ;
GetGroundEffectFlags_Reflection ( objEvent , flags ) ;
GetGroundEffectFlags_TallGrassOnBeginStep ( objEvent , flags ) ;
GetGroundEffectFlags_LongGrassOnBeginStep ( objEvent , flags ) ;
GetGroundEffectFlags_Tracks ( objEvent , flags ) ;
GetGroundEffectFlags_SandHeap ( objEvent , flags ) ;
GetGroundEffectFlags_ShallowFlowingWater ( objEvent , flags ) ;
GetGroundEffectFlags_Puddle ( objEvent , flags ) ;
GetGroundEffectFlags_ShortGrass ( objEvent , flags ) ;
GetGroundEffectFlags_HotSprings ( objEvent , flags ) ;
2018-06-11 15:34:19 +02:00
}
2019-11-21 04:55:44 +01:00
static void GetAllGroundEffectFlags_OnFinishStep ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 15:34:19 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventUpdateMetatileBehaviors ( objEvent ) ;
GetGroundEffectFlags_ShallowFlowingWater ( objEvent , flags ) ;
GetGroundEffectFlags_SandHeap ( objEvent , flags ) ;
GetGroundEffectFlags_Puddle ( objEvent , flags ) ;
GetGroundEffectFlags_Ripple ( objEvent , flags ) ;
GetGroundEffectFlags_ShortGrass ( objEvent , flags ) ;
GetGroundEffectFlags_HotSprings ( objEvent , flags ) ;
GetGroundEffectFlags_Seaweed ( objEvent , flags ) ;
GetGroundEffectFlags_JumpLanding ( objEvent , flags ) ;
2018-06-11 15:34:19 +02:00
}
2018-06-11 17:23:14 +02:00
2019-11-21 04:55:44 +01:00
static void ObjectEventUpdateMetatileBehaviors ( struct ObjectEvent * objEvent )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > previousMetatileBehavior = MapGridGetMetatileBehaviorAt ( objEvent - > previousCoords . x , objEvent - > previousCoords . y ) ;
objEvent - > currentMetatileBehavior = MapGridGetMetatileBehaviorAt ( objEvent - > currentCoords . x , objEvent - > currentCoords . y ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_Reflection ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2021-01-20 11:17:07 +01:00
u32 reflectionFlags [ NUM_REFLECTION_TYPES - 1 ] = {
2021-01-20 00:21:50 +01:00
[ REFL_TYPE_ICE - 1 ] = GROUND_EFFECT_FLAG_ICE_REFLECTION ,
[ REFL_TYPE_WATER - 1 ] = GROUND_EFFECT_FLAG_WATER_REFLECTION
} ;
2021-01-20 23:32:04 +01:00
u8 reflType = ObjectEventGetNearbyReflectionType ( objEvent ) ;
2018-06-11 17:23:14 +02:00
2021-01-20 00:21:50 +01:00
if ( reflType )
2018-06-11 17:23:14 +02:00
{
2021-01-20 23:32:04 +01:00
if ( objEvent - > hasReflection = = 0 )
2018-06-11 17:23:14 +02:00
{
2021-01-20 23:32:04 +01:00
objEvent - > hasReflection + + ;
2021-01-20 00:21:50 +01:00
* flags | = reflectionFlags [ reflType - 1 ] ;
2018-06-11 17:23:14 +02:00
}
}
else
{
2021-01-20 00:21:50 +01:00
objEvent - > hasReflection = FALSE ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_TallGrassOnSpawn ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsTallGrass ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_TallGrassOnBeginStep ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsTallGrass ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_LongGrassOnSpawn ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsLongGrass ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_LongGrassOnBeginStep ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsLongGrass ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_Tracks ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2020-08-22 23:25:41 +02:00
u8 behavior = objEvent - > previousMetatileBehavior ;
if ( objEvent - > directionOverwrite )
return ;
if ( MetatileBehavior_IsDeepSand ( behavior ) )
2018-06-11 17:23:14 +02:00
{
* flags | = GROUND_EFFECT_FLAG_DEEP_SAND ;
}
2020-08-22 23:25:41 +02:00
else if ( MetatileBehavior_IsSandOrDeepSand ( behavior )
| | MetatileBehavior_IsFootprints ( behavior ) )
2018-06-11 17:23:14 +02:00
{
* flags | = GROUND_EFFECT_FLAG_SAND ;
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_SandHeap ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsDeepSand ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsDeepSand ( objEvent - > previousMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! objEvent - > inSandPile )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > inSandPile = 0 ;
objEvent - > inSandPile = 1 ;
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_SAND_PILE ;
}
}
else
{
2019-11-21 04:55:44 +01:00
objEvent - > inSandPile = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_ShallowFlowingWater ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ( MetatileBehavior_IsShallowFlowingWater ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsShallowFlowingWater ( objEvent - > previousMetatileBehavior ) )
| | ( MetatileBehavior_IsPacifidlogLog ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsPacifidlogLog ( objEvent - > previousMetatileBehavior ) ) )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! objEvent - > inShallowFlowingWater )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > inShallowFlowingWater = 0 ;
objEvent - > inShallowFlowingWater = 1 ;
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER ;
}
}
else
{
2019-11-21 04:55:44 +01:00
objEvent - > inShallowFlowingWater = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_Puddle ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsPuddle ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsPuddle ( objEvent - > previousMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
{
* flags | = GROUND_EFFECT_FLAG_PUDDLE ;
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_Ripple ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_HasRipples ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_RIPPLES ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_ShortGrass ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsShortGrass ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsShortGrass ( objEvent - > previousMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! objEvent - > inShortGrass )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > inShortGrass = 0 ;
objEvent - > inShortGrass = 1 ;
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_SHORT_GRASS ;
}
}
else
{
2019-11-21 04:55:44 +01:00
objEvent - > inShortGrass = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_HotSprings ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsHotSprings ( objEvent - > currentMetatileBehavior )
& & MetatileBehavior_IsHotSprings ( objEvent - > previousMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! objEvent - > inHotSprings )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > inHotSprings = 0 ;
objEvent - > inHotSprings = 1 ;
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_HOT_SPRINGS ;
}
}
else
{
2019-11-21 04:55:44 +01:00
objEvent - > inHotSprings = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_Seaweed ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( MetatileBehavior_IsSeaweed ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
* flags | = GROUND_EFFECT_FLAG_SEAWEED ;
}
2019-11-21 04:55:44 +01:00
static void GetGroundEffectFlags_JumpLanding ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
typedef bool8 ( * MetatileFunc ) ( u8 ) ;
static const MetatileFunc metatileFuncs [ ] = {
MetatileBehavior_IsTallGrass ,
MetatileBehavior_IsLongGrass ,
MetatileBehavior_IsPuddle ,
MetatileBehavior_IsSurfableWaterOrUnderwater ,
MetatileBehavior_IsShallowFlowingWater ,
MetatileBehavior_IsATile ,
} ;
static const u32 jumpLandingFlags [ ] = {
GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS ,
GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS ,
GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER ,
GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER ,
GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER ,
GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND ,
} ;
2019-11-21 04:55:44 +01:00
if ( objEvent - > landingJump & & ! objEvent - > disableJumpLandingGroundEffect )
2018-06-11 17:23:14 +02:00
{
u8 i ;
for ( i = 0 ; i < ARRAY_COUNT ( metatileFuncs ) ; i + + )
{
2019-11-21 04:55:44 +01:00
if ( metatileFuncs [ i ] ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
{
* flags | = jumpLandingFlags [ i ] ;
return ;
}
}
}
}
2021-01-20 11:34:33 +01:00
# define RETURN_REFLECTION_TYPE_AT(x, y) \
b = MapGridGetMetatileBehaviorAt ( x , y ) ; \
result = GetReflectionTypeByMetatileBehavior ( b ) ; \
if ( result ! = REFL_TYPE_NONE ) \
return result ;
2021-01-20 23:32:04 +01:00
static u8 ObjectEventGetNearbyReflectionType ( struct ObjectEvent * objEvent )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo ( objEvent - > graphicsId ) ;
2018-06-11 17:23:14 +02:00
// ceil div by tile width?
s16 width = ( info - > width + 8 ) > > 4 ;
s16 height = ( info - > height + 8 ) > > 4 ;
2021-01-20 23:32:04 +01:00
s16 i , j ;
u8 result , b ; // used by RETURN_REFLECTION_TYPE_AT
s16 one = 1 ;
2018-06-11 17:23:14 +02:00
2021-01-20 23:32:04 +01:00
for ( i = 0 ; i < height ; i + + )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
RETURN_REFLECTION_TYPE_AT ( objEvent - > currentCoords . x , objEvent - > currentCoords . y + one + i )
RETURN_REFLECTION_TYPE_AT ( objEvent - > previousCoords . x , objEvent - > previousCoords . y + one + i )
2018-06-11 17:23:14 +02:00
for ( j = 1 ; j < width ; j + + )
{
2019-11-21 04:55:44 +01:00
RETURN_REFLECTION_TYPE_AT ( objEvent - > currentCoords . x + j , objEvent - > currentCoords . y + one + i )
RETURN_REFLECTION_TYPE_AT ( objEvent - > currentCoords . x - j , objEvent - > currentCoords . y + one + i )
RETURN_REFLECTION_TYPE_AT ( objEvent - > previousCoords . x + j , objEvent - > previousCoords . y + one + i )
RETURN_REFLECTION_TYPE_AT ( objEvent - > previousCoords . x - j , objEvent - > previousCoords . y + one + i )
2018-06-11 17:23:14 +02:00
}
}
2021-01-20 11:34:33 +01:00
return REFL_TYPE_NONE ;
}
2018-06-11 17:23:14 +02:00
# undef RETURN_REFLECTION_TYPE_AT
static u8 GetReflectionTypeByMetatileBehavior ( u32 behavior )
{
if ( MetatileBehavior_IsIce ( behavior ) )
2021-01-20 00:21:50 +01:00
return REFL_TYPE_ICE ;
2018-06-11 17:23:14 +02:00
else if ( MetatileBehavior_IsReflective ( behavior ) )
2021-01-20 00:21:50 +01:00
return REFL_TYPE_WATER ;
2018-06-11 17:23:14 +02:00
else
2021-01-20 00:21:50 +01:00
return REFL_TYPE_NONE ;
2018-06-11 17:23:14 +02:00
}
u8 GetLedgeJumpDirection ( s16 x , s16 y , u8 z )
{
static bool8 ( * const unknown_08376040 [ ] ) ( u8 ) = {
MetatileBehavior_IsJumpSouth ,
MetatileBehavior_IsJumpNorth ,
MetatileBehavior_IsJumpWest ,
MetatileBehavior_IsJumpEast ,
} ;
u8 b ;
u8 index = z ;
if ( index = = 0 )
return 0 ;
else if ( index > 4 )
index - = 4 ;
index - - ;
b = MapGridGetMetatileBehaviorAt ( x , y ) ;
if ( unknown_08376040 [ index ] ( b ) = = 1 )
return index + 1 ;
return 0 ;
}
2019-11-21 04:55:44 +01:00
static void SetObjectEventSpriteOamTableForLongGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objEvent - > disableCoveringGroundEffects )
2018-06-11 17:23:14 +02:00
return ;
2019-11-21 04:55:44 +01:00
if ( ! MetatileBehavior_IsLongGrass ( objEvent - > currentMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
return ;
2019-11-21 04:55:44 +01:00
if ( ! MetatileBehavior_IsLongGrass ( objEvent - > previousMetatileBehavior ) )
2018-06-11 17:23:14 +02:00
return ;
sprite - > subspriteTableNum = 4 ;
2019-11-21 04:55:44 +01:00
if ( ZCoordToPriority ( objEvent - > previousElevation ) = = 1 )
2018-06-11 17:23:14 +02:00
sprite - > subspriteTableNum = 5 ;
}
bool8 IsZCoordMismatchAt ( u8 z , s16 x , s16 y )
{
u8 mapZ ;
if ( z = = 0 )
return FALSE ;
mapZ = MapGridGetZCoordAt ( x , y ) ;
if ( mapZ = = 0 | | mapZ = = 0xF )
return FALSE ;
if ( mapZ ! = z )
return TRUE ;
return FALSE ;
}
static const u8 sUnknown_08376050 [ ] = {
0x73 , 0x73 , 0x53 , 0x73 , 0x53 , 0x73 , 0x53 , 0x73 , 0x53 , 0x73 , 0x53 , 0x73 , 0x53 , 0x00 , 0x00 , 0x73
} ;
2019-11-21 04:55:44 +01:00
// Each byte corresponds to a sprite priority for an object event.
// This is directly the inverse of gObjectEventPriorities_08376070.
static const u8 sObjectEventPriorities_08376060 [ ] = {
2018-06-11 17:23:14 +02:00
2 , 2 , 2 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 0 , 0 , 2
} ;
2019-11-21 04:55:44 +01:00
// Each byte corresponds to a sprite priority for an object event.
// This is the inverse of gObjectEventPriorities_08376060.
2018-06-11 17:23:14 +02:00
// 1 = Above player sprite
// 2 = Below player sprite
2019-11-21 04:55:44 +01:00
static const u8 sObjectEventPriorities_08376070 [ ] = {
2018-06-11 17:23:14 +02:00
1 , 1 , 1 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 1 , 2 , 0 , 0 , 1 ,
} ;
2019-11-21 04:55:44 +01:00
void UpdateObjectEventZCoordAndPriority ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objEvent - > fixedPriority )
2018-06-11 17:23:14 +02:00
return ;
2019-11-21 04:55:44 +01:00
ObjectEventUpdateZCoord ( objEvent ) ;
2018-06-11 17:23:14 +02:00
2019-11-21 04:55:44 +01:00
sprite - > subspriteTableNum = sObjectEventPriorities_08376070 [ objEvent - > previousElevation ] ;
sprite - > oam . priority = sObjectEventPriorities_08376060 [ objEvent - > previousElevation ] ;
2018-06-11 17:23:14 +02:00
}
static void InitObjectPriorityByZCoord ( struct Sprite * sprite , u8 z )
{
2019-11-21 04:55:44 +01:00
sprite - > subspriteTableNum = sObjectEventPriorities_08376070 [ z ] ;
sprite - > oam . priority = sObjectEventPriorities_08376060 [ z ] ;
2018-06-11 17:23:14 +02:00
}
u8 ZCoordToPriority ( u8 z )
{
2019-11-21 04:55:44 +01:00
return sObjectEventPriorities_08376060 [ z ] ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void ObjectEventUpdateZCoord ( struct ObjectEvent * objEvent )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
u8 z = MapGridGetZCoordAt ( objEvent - > currentCoords . x , objEvent - > currentCoords . y ) ;
u8 z2 = MapGridGetZCoordAt ( objEvent - > previousCoords . x , objEvent - > previousCoords . y ) ;
2018-06-11 17:23:14 +02:00
if ( z = = 0xF | | z2 = = 0xF )
return ;
2019-11-21 04:55:44 +01:00
objEvent - > currentElevation = z ;
2018-06-11 17:23:14 +02:00
if ( z ! = 0 & & z ! = 0xF )
2019-11-21 04:55:44 +01:00
objEvent - > previousElevation = z ;
2018-06-11 17:23:14 +02:00
}
void SetObjectSubpriorityByZCoord ( u8 a , struct Sprite * sprite , u8 b )
{
s32 tmp = sprite - > centerToCornerVecY ;
u32 tmpa = * ( u16 * ) & sprite - > pos1 . y ;
u32 tmpb = * ( u16 * ) & gSpriteCoordOffsetY ;
s32 tmp2 = ( tmpa - tmp ) + tmpb ;
u16 tmp3 = ( 0x10 - ( ( ( ( u32 ) tmp2 + 8 ) & 0xFF ) > > 4 ) ) * 2 ;
sprite - > subpriority = tmp3 + sUnknown_08376050 [ a ] + b ;
}
2019-11-21 04:55:44 +01:00
static void ObjectEventUpdateSubpriority ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objEvent - > fixedPriority )
2018-06-11 17:23:14 +02:00
return ;
2019-11-21 04:55:44 +01:00
SetObjectSubpriorityByZCoord ( objEvent - > previousElevation , sprite , 1 ) ;
2018-06-11 17:23:14 +02:00
}
bool8 AreZCoordsCompatible ( u8 a , u8 b )
{
if ( a = = 0 | | b = = 0 )
return TRUE ;
if ( a ! = b )
return FALSE ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_SpawnOnTallGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 4 ] = objEvent - > localId < < 8 | objEvent - > mapNum ;
gFieldEffectArguments [ 5 ] = objEvent - > mapGroup ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 6 ] = ( u8 ) gSaveBlock1Ptr - > location . mapNum < < 8 | ( u8 ) gSaveBlock1Ptr - > location . mapGroup ;
gFieldEffectArguments [ 7 ] = 1 ;
FieldEffectStart ( FLDEFF_TALL_GRASS ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_StepOnTallGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 4 ] = objEvent - > localId < < 8 | objEvent - > mapNum ;
gFieldEffectArguments [ 5 ] = objEvent - > mapGroup ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 6 ] = ( u8 ) gSaveBlock1Ptr - > location . mapNum < < 8 | ( u8 ) gSaveBlock1Ptr - > location . mapGroup ;
gFieldEffectArguments [ 7 ] = 0 ;
FieldEffectStart ( FLDEFF_TALL_GRASS ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_SpawnOnLongGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 4 ] = objEvent - > localId < < 8 | objEvent - > mapNum ;
gFieldEffectArguments [ 5 ] = objEvent - > mapGroup ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 6 ] = ( u8 ) gSaveBlock1Ptr - > location . mapNum < < 8 | ( u8 ) gSaveBlock1Ptr - > location . mapGroup ;
gFieldEffectArguments [ 7 ] = 1 ;
FieldEffectStart ( FLDEFF_LONG_GRASS ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_StepOnLongGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 4 ] = ( objEvent - > localId < < 8 ) | objEvent - > mapNum ;
gFieldEffectArguments [ 5 ] = objEvent - > mapGroup ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 6 ] = ( u8 ) gSaveBlock1Ptr - > location . mapNum < < 8 | ( u8 ) gSaveBlock1Ptr - > location . mapGroup ;
gFieldEffectArguments [ 7 ] = 0 ;
FieldEffectStart ( FLDEFF_LONG_GRASS ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_WaterReflection ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2021-01-20 00:35:57 +01:00
SetUpReflection ( objEvent , sprite , FALSE ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_IceReflection ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2021-01-20 00:35:57 +01:00
SetUpReflection ( objEvent , sprite , TRUE ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_FlowingWater ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
StartFieldEffectForObjectEvent ( FLDEFF_FEET_IN_FLOWING_WATER , objEvent ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
static void ( * const sGroundEffectTracksFuncs [ ] ) ( struct ObjectEvent * objEvent , struct Sprite * sprite , u8 a ) = {
2018-06-11 17:23:14 +02:00
DoTracksGroundEffect_None ,
DoTracksGroundEffect_Footprints ,
DoTracksGroundEffect_BikeTireTracks ,
} ;
2019-11-21 04:55:44 +01:00
void GroundEffect_SandTracks ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo ( objEvent - > graphicsId ) ;
sGroundEffectTracksFuncs [ info - > tracks ] ( objEvent , sprite , 0 ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_DeepSandTracks ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * info = GetObjectEventGraphicsInfo ( objEvent - > graphicsId ) ;
sGroundEffectTracksFuncs [ info - > tracks ] ( objEvent , sprite , 1 ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
static void DoTracksGroundEffect_None ( struct ObjectEvent * objEvent , struct Sprite * sprite , u8 a )
2018-06-11 17:23:14 +02:00
{
}
2019-11-21 04:55:44 +01:00
static void DoTracksGroundEffect_Footprints ( struct ObjectEvent * objEvent , struct Sprite * sprite , u8 a )
2018-06-11 17:23:14 +02:00
{
// First half-word is a Field Effect script id. (gFieldEffectScriptPointers)
u16 sandFootprints_FieldEffectData [ 2 ] = {
FLDEFF_SAND_FOOTPRINTS ,
FLDEFF_DEEP_SAND_FOOTPRINTS
} ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > previousCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > previousCoords . y ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 2 ] = 149 ;
gFieldEffectArguments [ 3 ] = 2 ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 4 ] = objEvent - > facingDirection ;
2018-06-11 17:23:14 +02:00
FieldEffectStart ( sandFootprints_FieldEffectData [ a ] ) ;
}
2019-11-21 04:55:44 +01:00
static void DoTracksGroundEffect_BikeTireTracks ( struct ObjectEvent * objEvent , struct Sprite * sprite , u8 a )
2018-06-11 17:23:14 +02:00
{
// 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 bikeTireTracks_Transitions [ 4 ] [ 4 ] = {
1 , 2 , 7 , 8 ,
1 , 2 , 6 , 5 ,
5 , 8 , 3 , 4 ,
6 , 7 , 3 , 4 ,
} ;
2019-11-21 04:55:44 +01:00
if ( objEvent - > currentCoords . x ! = objEvent - > previousCoords . x | | objEvent - > currentCoords . y ! = objEvent - > previousCoords . y )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > previousCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > previousCoords . y ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 2 ] = 149 ;
gFieldEffectArguments [ 3 ] = 2 ;
gFieldEffectArguments [ 4 ] =
2019-11-21 04:55:44 +01:00
bikeTireTracks_Transitions [ objEvent - > previousMovementDirection ] [ objEvent - > facingDirection - 5 ] ;
2018-06-11 17:23:14 +02:00
FieldEffectStart ( FLDEFF_BIKE_TIRE_TRACKS ) ;
}
}
2019-11-21 04:55:44 +01:00
void GroundEffect_Ripple ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
DoRippleFieldEffect ( objEvent , sprite ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_StepOnPuddle ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
StartFieldEffectForObjectEvent ( FLDEFF_SPLASH , objEvent ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_SandHeap ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
StartFieldEffectForObjectEvent ( FLDEFF_SAND_PILE , objEvent ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_JumpOnTallGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
u8 spriteId ;
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
FieldEffectStart ( FLDEFF_JUMP_TALL_GRASS ) ;
2018-10-15 00:43:40 +02:00
spriteId = FindTallGrassFieldEffectSpriteId (
2019-11-21 04:55:44 +01:00
objEvent - > localId ,
objEvent - > mapNum ,
objEvent - > mapGroup ,
objEvent - > currentCoords . x ,
objEvent - > currentCoords . y ) ;
2018-06-11 17:23:14 +02:00
if ( spriteId = = MAX_SPRITES )
2019-11-21 04:55:44 +01:00
GroundEffect_SpawnOnTallGrass ( objEvent , sprite ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_JumpOnLongGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = 2 ;
FieldEffectStart ( FLDEFF_JUMP_LONG_GRASS ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_JumpOnShallowWater ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = sprite - > oam . priority ;
FieldEffectStart ( FLDEFF_JUMP_SMALL_SPLASH ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_JumpOnWater ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = sprite - > oam . priority ;
FieldEffectStart ( FLDEFF_JUMP_BIG_SPLASH ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_JumpLandingDust ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
gFieldEffectArguments [ 2 ] = objEvent - > previousElevation ;
2018-06-11 17:23:14 +02:00
gFieldEffectArguments [ 3 ] = sprite - > oam . priority ;
FieldEffectStart ( FLDEFF_DUST ) ;
}
2019-11-21 04:55:44 +01:00
void GroundEffect_ShortGrass ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
StartFieldEffectForObjectEvent ( FLDEFF_SHORT_GRASS , objEvent ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_HotSprings ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
StartFieldEffectForObjectEvent ( FLDEFF_HOT_SPRINGS_WATER , objEvent ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void GroundEffect_Seaweed ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
gFieldEffectArguments [ 0 ] = objEvent - > currentCoords . x ;
gFieldEffectArguments [ 1 ] = objEvent - > currentCoords . y ;
2018-06-11 17:23:14 +02:00
FieldEffectStart ( FLDEFF_BUBBLES ) ;
}
2019-11-21 04:55:44 +01:00
static void ( * const sGroundEffectFuncs [ ] ) ( struct ObjectEvent * objEvent , struct Sprite * sprite ) = {
2020-06-24 22:27:00 +02:00
GroundEffect_SpawnOnTallGrass , // GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN
GroundEffect_StepOnTallGrass , // GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE
GroundEffect_SpawnOnLongGrass , // GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN
GroundEffect_StepOnLongGrass , // GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE
2021-01-20 00:21:50 +01:00
GroundEffect_WaterReflection , // GROUND_EFFECT_FLAG_WATER_REFLECTION
GroundEffect_IceReflection , // GROUND_EFFECT_FLAG_ICE_REFLECTION
2020-06-24 22:27:00 +02:00
GroundEffect_FlowingWater , // GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER
GroundEffect_SandTracks , // GROUND_EFFECT_FLAG_SAND
GroundEffect_DeepSandTracks , // GROUND_EFFECT_FLAG_DEEP_SAND
GroundEffect_Ripple , // GROUND_EFFECT_FLAG_RIPPLES
GroundEffect_StepOnPuddle , // GROUND_EFFECT_FLAG_PUDDLE
GroundEffect_SandHeap , // GROUND_EFFECT_FLAG_SAND_PILE
GroundEffect_JumpOnTallGrass , // GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS
GroundEffect_JumpOnLongGrass , // GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS
GroundEffect_JumpOnShallowWater , // GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER
GroundEffect_JumpOnWater , // GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER
GroundEffect_JumpLandingDust , // GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND
GroundEffect_ShortGrass , // GROUND_EFFECT_FLAG_SHORT_GRASS
GroundEffect_HotSprings , // GROUND_EFFECT_FLAG_HOT_SPRINGS
GroundEffect_Seaweed // GROUND_EFFECT_FLAG_SEAWEED
2018-06-11 17:23:14 +02:00
} ;
2019-11-21 04:55:44 +01:00
static void DoFlaggedGroundEffects ( struct ObjectEvent * objEvent , struct Sprite * sprite , u32 flags )
2018-06-11 17:23:14 +02:00
{
u8 i ;
2020-07-19 20:12:38 +02:00
if ( ObjectEventIsFarawayIslandMew ( objEvent ) = = TRUE & & ! ShouldMewShakeGrass ( objEvent ) )
2018-06-11 17:23:14 +02:00
return ;
for ( i = 0 ; i < ARRAY_COUNT ( sGroundEffectFuncs ) ; i + + , flags > > = 1 )
if ( flags & 1 )
2019-11-21 04:55:44 +01:00
sGroundEffectFuncs [ i ] ( objEvent , sprite ) ;
2018-06-11 17:23:14 +02:00
}
2019-11-21 04:55:44 +01:00
void filters_out_some_ground_effects ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objEvent - > disableCoveringGroundEffects )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
objEvent - > inShortGrass = 0 ;
objEvent - > inSandPile = 0 ;
objEvent - > inShallowFlowingWater = 0 ;
objEvent - > inHotSprings = 0 ;
2018-06-11 17:23:14 +02:00
* flags & = ~ ( GROUND_EFFECT_FLAG_HOT_SPRINGS
| GROUND_EFFECT_FLAG_SHORT_GRASS
| GROUND_EFFECT_FLAG_SAND_PILE
| GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER
| GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE ) ;
}
}
2019-11-21 04:55:44 +01:00
void FilterOutStepOnPuddleGroundEffectIfJumping ( struct ObjectEvent * objEvent , u32 * flags )
2018-06-11 17:23:14 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objEvent - > landingJump )
2018-06-11 17:23:14 +02:00
* flags & = ~ GROUND_EFFECT_FLAG_PUDDLE ;
}
2019-11-21 04:55:44 +01:00
static void DoGroundEffects_OnSpawn ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
u32 flags ;
2019-11-21 04:55:44 +01:00
if ( objEvent - > triggerGroundEffectsOnMove )
2018-06-11 17:23:14 +02:00
{
flags = 0 ;
2019-11-21 04:55:44 +01:00
UpdateObjectEventZCoordAndPriority ( objEvent , sprite ) ;
GetAllGroundEffectFlags_OnSpawn ( objEvent , & flags ) ;
SetObjectEventSpriteOamTableForLongGrass ( objEvent , sprite ) ;
DoFlaggedGroundEffects ( objEvent , sprite , flags ) ;
objEvent - > triggerGroundEffectsOnMove = 0 ;
objEvent - > disableCoveringGroundEffects = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void DoGroundEffects_OnBeginStep ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
u32 flags ;
2019-11-21 04:55:44 +01:00
if ( objEvent - > triggerGroundEffectsOnMove )
2018-06-11 17:23:14 +02:00
{
flags = 0 ;
2019-11-21 04:55:44 +01:00
UpdateObjectEventZCoordAndPriority ( objEvent , sprite ) ;
GetAllGroundEffectFlags_OnBeginStep ( objEvent , & flags ) ;
SetObjectEventSpriteOamTableForLongGrass ( objEvent , sprite ) ;
filters_out_some_ground_effects ( objEvent , & flags ) ;
DoFlaggedGroundEffects ( objEvent , sprite , flags ) ;
objEvent - > triggerGroundEffectsOnMove = 0 ;
objEvent - > disableCoveringGroundEffects = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void DoGroundEffects_OnFinishStep ( struct ObjectEvent * objEvent , struct Sprite * sprite )
2018-06-11 17:23:14 +02:00
{
u32 flags ;
2019-11-21 04:55:44 +01:00
if ( objEvent - > triggerGroundEffectsOnStop )
2018-06-11 17:23:14 +02:00
{
flags = 0 ;
2019-11-21 04:55:44 +01:00
UpdateObjectEventZCoordAndPriority ( objEvent , sprite ) ;
GetAllGroundEffectFlags_OnFinishStep ( objEvent , & flags ) ;
SetObjectEventSpriteOamTableForLongGrass ( objEvent , sprite ) ;
FilterOutStepOnPuddleGroundEffectIfJumping ( objEvent , & flags ) ;
DoFlaggedGroundEffects ( objEvent , sprite , flags ) ;
objEvent - > triggerGroundEffectsOnStop = 0 ;
objEvent - > landingJump = 0 ;
2018-06-11 17:23:14 +02:00
}
}
2018-06-11 17:34:51 +02:00
2019-11-21 04:55:44 +01:00
bool8 FreezeObjectEvent ( struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > heldMovementActive | | objectEvent - > frozen )
2018-06-11 17:34:51 +02:00
{
return TRUE ;
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
else
{
objectEvent - > frozen = 1 ;
objectEvent - > spriteAnimPausedBackup = gSprites [ objectEvent - > spriteId ] . animPaused ;
objectEvent - > spriteAffineAnimPausedBackup = gSprites [ objectEvent - > spriteId ] . affineAnimPaused ;
gSprites [ objectEvent - > spriteId ] . animPaused = 1 ;
gSprites [ objectEvent - > spriteId ] . affineAnimPaused = 1 ;
return FALSE ;
}
2018-06-11 17:34:51 +02:00
}
2019-11-21 04:55:44 +01:00
void FreezeObjectEvents ( void )
2018-06-11 17:34:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active & & i ! = gPlayerAvatar . objectEventId )
FreezeObjectEvent ( & gObjectEvents [ i ] ) ;
2018-06-11 17:34:51 +02:00
}
2019-11-21 04:55:44 +01:00
void FreezeObjectEventsExceptOne ( u8 objectEventId )
2018-06-11 17:34:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2019-11-21 04:55:44 +01:00
if ( i ! = objectEventId & & gObjectEvents [ i ] . active & & i ! = gPlayerAvatar . objectEventId )
FreezeObjectEvent ( & gObjectEvents [ i ] ) ;
2018-06-11 17:34:51 +02:00
}
2019-11-21 04:55:44 +01:00
void UnfreezeObjectEvent ( struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( objectEvent - > active & & objectEvent - > frozen )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > frozen = 0 ;
gSprites [ objectEvent - > spriteId ] . animPaused = objectEvent - > spriteAnimPausedBackup ;
gSprites [ objectEvent - > spriteId ] . affineAnimPaused = objectEvent - > spriteAffineAnimPausedBackup ;
2018-06-11 17:34:51 +02:00
}
}
2019-11-21 04:55:44 +01:00
void UnfreezeObjectEvents ( void )
2018-06-11 17:34:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2019-11-21 04:55:44 +01:00
if ( gObjectEvents [ i ] . active )
UnfreezeObjectEvent ( & gObjectEvents [ i ] ) ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void Step1 ( struct Sprite * sprite , u8 dir )
2018-06-11 17:34:51 +02:00
{
2018-09-05 00:31:37 +02:00
sprite - > pos1 . x + = sDirectionToVectors [ dir ] . x ;
sprite - > pos1 . y + = sDirectionToVectors [ dir ] . y ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void Step2 ( struct Sprite * sprite , u8 dir )
2018-06-11 17:34:51 +02:00
{
2018-09-05 00:31:37 +02:00
sprite - > pos1 . x + = 2 * ( u16 ) sDirectionToVectors [ dir ] . x ;
sprite - > pos1 . y + = 2 * ( u16 ) sDirectionToVectors [ dir ] . y ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void Step3 ( struct Sprite * sprite , u8 dir )
2018-06-11 17:34:51 +02:00
{
2018-09-05 00:31:37 +02:00
sprite - > pos1 . x + = 2 * ( u16 ) sDirectionToVectors [ dir ] . x + ( u16 ) sDirectionToVectors [ dir ] . x ;
sprite - > pos1 . y + = 2 * ( u16 ) sDirectionToVectors [ dir ] . y + ( u16 ) sDirectionToVectors [ dir ] . y ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void Step4 ( struct Sprite * sprite , u8 dir )
2018-06-11 17:34:51 +02:00
{
2018-09-05 00:31:37 +02:00
sprite - > pos1 . x + = 4 * ( u16 ) sDirectionToVectors [ dir ] . x ;
sprite - > pos1 . y + = 4 * ( u16 ) sDirectionToVectors [ dir ] . y ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void Step8 ( struct Sprite * sprite , u8 dir )
2018-06-11 17:34:51 +02:00
{
2018-09-05 00:31:37 +02:00
sprite - > pos1 . x + = 8 * ( u16 ) sDirectionToVectors [ dir ] . x ;
sprite - > pos1 . y + = 8 * ( u16 ) sDirectionToVectors [ dir ] . y ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
static void oamt_npc_ministep_reset ( struct Sprite * sprite , u8 direction , u8 a3 )
2018-06-11 17:34:51 +02:00
{
2018-10-20 22:01:45 +02:00
sprite - > data [ 3 ] = direction ;
2018-06-11 17:34:51 +02:00
sprite - > data [ 4 ] = a3 ;
sprite - > data [ 5 ] = 0 ;
}
2018-10-20 22:01:45 +02:00
typedef void ( * SpriteStepFunc ) ( struct Sprite * sprite , u8 direction ) ;
2018-06-12 01:17:31 +02:00
static const SpriteStepFunc gUnknown_0850E6C4 [ ] = {
2018-06-14 00:51:26 +02:00
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
Step1 ,
2018-06-12 01:17:31 +02:00
} ;
static const SpriteStepFunc gUnknown_0850E704 [ ] = {
2018-06-14 00:51:26 +02:00
Step2 ,
Step2 ,
Step2 ,
Step2 ,
Step2 ,
Step2 ,
Step2 ,
Step2 ,
2018-06-12 01:17:31 +02:00
} ;
static const SpriteStepFunc gUnknown_0850E724 [ ] = {
2018-06-14 00:51:26 +02:00
Step2 ,
Step3 ,
Step3 ,
Step2 ,
Step3 ,
Step3 ,
2018-06-12 01:17:31 +02:00
} ;
static const SpriteStepFunc gUnknown_0850E73C [ ] = {
2018-06-14 00:51:26 +02:00
Step4 ,
Step4 ,
Step4 ,
Step4 ,
2018-06-12 01:17:31 +02:00
} ;
static const SpriteStepFunc gUnknown_0850E74C [ ] = {
2018-06-14 00:51:26 +02:00
Step8 ,
Step8 ,
2018-06-12 01:17:31 +02:00
} ;
static const SpriteStepFunc * const gUnknown_0850E754 [ ] = {
gUnknown_0850E6C4 ,
gUnknown_0850E704 ,
gUnknown_0850E724 ,
gUnknown_0850E73C ,
gUnknown_0850E74C ,
} ;
static const s16 gUnknown_0850E768 [ ] = {
16 , 8 , 6 , 4 , 2
} ;
2018-06-11 17:34:51 +02:00
bool8 obj_npc_ministep ( struct Sprite * sprite )
{
if ( sprite - > data [ 5 ] > = gUnknown_0850E768 [ sprite - > data [ 4 ] ] )
return FALSE ;
gUnknown_0850E754 [ sprite - > data [ 4 ] ] [ sprite - > data [ 5 ] ] ( sprite , sprite - > data [ 3 ] ) ;
sprite - > data [ 5 ] + + ;
if ( sprite - > data [ 5 ] < gUnknown_0850E768 [ sprite - > data [ 4 ] ] )
return FALSE ;
return TRUE ;
}
2018-10-20 22:01:45 +02:00
void sub_80976DC ( struct Sprite * sprite , u8 direction )
2018-06-11 17:34:51 +02:00
{
2018-10-20 22:01:45 +02:00
sprite - > data [ 3 ] = direction ;
2018-06-11 17:34:51 +02:00
sprite - > data [ 4 ] = 0 ;
sprite - > data [ 5 ] = 0 ;
}
bool8 sub_80976EC ( struct Sprite * sprite )
{
if ( ! ( sprite - > data [ 4 ] & 1 ) )
{
2018-06-14 00:51:26 +02:00
Step1 ( sprite , sprite - > data [ 3 ] ) ;
2018-06-11 17:34:51 +02:00
sprite - > data [ 5 ] + + ;
}
sprite - > data [ 4 ] + + ;
if ( sprite - > data [ 5 ] > 15 )
return TRUE ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
else
return FALSE ;
2018-06-11 17:34:51 +02:00
}
2020-06-24 22:27:00 +02:00
static const s8 sFigure8XOffsets [ FIGURE_8_LENGTH ] = {
2018-06-12 01:17:31 +02:00
1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 ,
2 , 2 , 2 , 1 , 2 , 2 , 1 , 2 ,
2 , 1 , 2 , 2 , 1 , 2 , 1 , 1 ,
2 , 1 , 1 , 2 , 1 , 1 , 2 , 1 ,
1 , 2 , 1 , 1 , 1 , 1 , 1 , 1 ,
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 ,
1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ,
0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 ,
} ;
2020-06-24 22:27:00 +02:00
static const s8 sFigure8YOffsets [ FIGURE_8_LENGTH ] = {
2018-06-12 01:17:31 +02:00
0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 ,
1 , 0 , 1 , 1 , 0 , 1 , 1 , 0 ,
1 , 1 , 0 , 1 , 1 , 0 , 1 , 1 ,
0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 ,
1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , - 1 , 0 , 0 , - 1 , 0 , 0 ,
- 1 , 0 , - 1 , - 1 , 0 , - 1 , - 1 , 0 ,
- 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 2 ,
} ;
2018-06-11 17:34:51 +02:00
2020-06-24 22:27:00 +02:00
s16 GetFigure8YOffset ( s16 idx )
2018-06-11 17:34:51 +02:00
{
2020-06-24 22:27:00 +02:00
return sFigure8YOffsets [ idx ] ;
2018-06-11 17:34:51 +02:00
}
2020-06-24 22:27:00 +02:00
s16 GetFigure8XOffset ( s16 idx )
2018-06-11 17:34:51 +02:00
{
2020-06-24 22:27:00 +02:00
return sFigure8XOffsets [ idx ] ;
2018-06-11 17:34:51 +02:00
}
2020-06-24 22:27:00 +02:00
static void InitSpriteForFigure8Anim ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
sprite - > data [ 6 ] = 0 ;
sprite - > data [ 7 ] = 0 ;
}
2020-06-24 22:27:00 +02:00
static bool8 AnimateSpriteInFigure8 ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2020-06-24 22:27:00 +02:00
bool8 finished = FALSE ;
2018-06-11 17:34:51 +02:00
switch ( sprite - > data [ 7 ] )
{
2020-06-24 22:27:00 +02:00
case 0 :
sprite - > pos2 . x + = GetFigure8XOffset ( sprite - > data [ 6 ] ) ;
sprite - > pos2 . y + = GetFigure8YOffset ( sprite - > data [ 6 ] ) ;
break ;
case 1 :
sprite - > pos2 . x - = GetFigure8XOffset ( ( FIGURE_8_LENGTH - 1 ) - sprite - > data [ 6 ] ) ;
sprite - > pos2 . y + = GetFigure8YOffset ( ( FIGURE_8_LENGTH - 1 ) - sprite - > data [ 6 ] ) ;
break ;
case 2 :
sprite - > pos2 . x - = GetFigure8XOffset ( sprite - > data [ 6 ] ) ;
sprite - > pos2 . y + = GetFigure8YOffset ( sprite - > data [ 6 ] ) ;
break ;
case 3 :
sprite - > pos2 . x + = GetFigure8XOffset ( ( FIGURE_8_LENGTH - 1 ) - sprite - > data [ 6 ] ) ;
sprite - > pos2 . y + = GetFigure8YOffset ( ( FIGURE_8_LENGTH - 1 ) - sprite - > data [ 6 ] ) ;
break ;
}
if ( + + sprite - > data [ 6 ] = = FIGURE_8_LENGTH )
2018-06-11 17:34:51 +02:00
{
sprite - > data [ 6 ] = 0 ;
sprite - > data [ 7 ] + + ;
}
2020-06-24 22:27:00 +02:00
if ( sprite - > data [ 7 ] = = 4 )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y = 0 ;
sprite - > pos2 . x = 0 ;
2020-06-24 22:27:00 +02:00
finished = TRUE ;
2018-06-11 17:34:51 +02:00
}
2020-06-24 22:27:00 +02:00
return finished ;
2018-06-11 17:34:51 +02:00
}
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
static const s8 gUnknown_0850E802 [ ] = {
2018-06-12 01:17:31 +02:00
- 4 , - 6 , - 8 , - 10 , - 11 , - 12 , - 12 , - 12 , - 11 , - 10 , - 9 , - 8 , - 6 , - 4 , 0 , 0
} ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
static const s8 gUnknown_0850E812 [ ] = {
2018-06-12 01:17:31 +02:00
0 , - 2 , - 3 , - 4 , - 5 , - 6 , - 6 , - 6 , - 5 , - 5 , - 4 , - 3 , - 2 , 0 , 0 , 0
} ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
static const s8 gUnknown_0850E822 [ ] = {
2018-06-12 01:17:31 +02:00
- 2 , - 4 , - 6 , - 8 , - 9 , - 10 , - 10 , - 10 , - 9 , - 8 , - 6 , - 5 , - 3 , - 2 , 0 , 0
} ;
static const s8 * const gUnknown_0850E834 [ ] = {
gUnknown_0850E802 ,
gUnknown_0850E812 ,
gUnknown_0850E822
} ;
2018-06-11 17:34:51 +02:00
s16 sub_8097820 ( s16 a1 , u8 a2 )
{
return gUnknown_0850E834 [ a2 ] [ a1 ] ;
}
void sub_809783C ( struct Sprite * sprite , u8 a2 , u8 a3 , u8 a4 )
{
sprite - > data [ 3 ] = a2 ;
sprite - > data [ 4 ] = a3 ;
sprite - > data [ 5 ] = a4 ;
sprite - > data [ 6 ] = 0 ;
}
u8 sub_809785C ( struct Sprite * sprite )
{
2020-08-28 20:00:31 +02:00
s16 v5 [ ] = { 16 , 16 , 32 } ;
u8 v6 [ ] = { 0 , 0 , 1 } ;
u8 v2 = 0 ;
2018-06-11 17:34:51 +02:00
if ( sprite - > data [ 4 ] )
2018-06-14 00:51:26 +02:00
Step1 ( sprite , sprite - > data [ 3 ] ) ;
2018-06-11 17:34:51 +02:00
sprite - > pos2 . y = sub_8097820 ( sprite - > data [ 6 ] > > v6 [ sprite - > data [ 4 ] ] , sprite - > data [ 5 ] ) ;
sprite - > data [ 6 ] + + ;
if ( sprite - > data [ 6 ] = = ( v5 [ sprite - > data [ 4 ] ] > > 1 ) )
v2 = 1 ;
if ( sprite - > data [ 6 ] > = v5 [ sprite - > data [ 4 ] ] )
{
sprite - > pos2 . y = 0 ;
v2 = - 1 ;
}
return v2 ;
}
u8 sub_80978E4 ( struct Sprite * sprite )
{
2020-08-28 20:00:31 +02:00
s16 v5 [ ] = { 32 , 32 , 64 } ;
u8 v6 [ ] = { 1 , 1 , 2 } ;
u8 v2 = 0 ;
2018-06-11 17:34:51 +02:00
if ( sprite - > data [ 4 ] & & ! ( sprite - > data [ 6 ] & 1 ) )
2018-06-14 00:51:26 +02:00
Step1 ( sprite , sprite - > data [ 3 ] ) ;
2018-06-11 17:34:51 +02:00
sprite - > pos2 . y = sub_8097820 ( sprite - > data [ 6 ] > > v6 [ sprite - > data [ 4 ] ] , sprite - > data [ 5 ] ) ;
sprite - > data [ 6 ] + + ;
if ( sprite - > data [ 6 ] = = ( v5 [ sprite - > data [ 4 ] ] > > 1 ) )
v2 = 1 ;
if ( sprite - > data [ 6 ] > = v5 [ sprite - > data [ 4 ] ] )
{
sprite - > pos2 . y = 0 ;
v2 = - 1 ;
}
return v2 ;
}
2018-10-20 22:01:45 +02:00
static void SetMovementDelay ( struct Sprite * sprite , s16 timer )
2018-06-11 17:34:51 +02:00
{
sprite - > data [ 3 ] = timer ;
}
2018-06-14 00:51:26 +02:00
static bool8 WaitForMovementDelay ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
sprite - > data [ 3 ] - - ;
if ( sprite - > data [ 3 ] = = 0 )
2018-06-11 17:34:51 +02:00
return TRUE ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
else
return FALSE ;
2018-06-11 17:34:51 +02:00
}
2018-10-20 22:01:45 +02:00
void SetAndStartSpriteAnim ( struct Sprite * sprite , u8 animNum , u8 animCmdIndex )
2018-06-11 17:34:51 +02:00
{
2018-10-20 22:01:45 +02:00
sprite - > animNum = animNum ;
sprite - > animPaused = FALSE ;
SeekSpriteAnim ( sprite , animCmdIndex ) ;
2018-06-11 17:34:51 +02:00
}
2018-06-14 00:51:26 +02:00
bool8 SpriteAnimEnded ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
if ( sprite - > animEnded )
return TRUE ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
else
return FALSE ;
2018-06-11 17:34:51 +02:00
}
2019-11-21 04:55:44 +01:00
void UpdateObjectEventSpriteVisibility ( struct Sprite * sprite , bool8 invisible )
2018-06-11 17:34:51 +02:00
{
u16 x , y ;
s16 x2 , y2 ;
sprite - > invisible = invisible ;
if ( sprite - > coordOffsetEnabled )
{
x = sprite - > pos1 . x + sprite - > pos2 . x + sprite - > centerToCornerVecX + gSpriteCoordOffsetX ;
y = sprite - > pos1 . y + sprite - > pos2 . y + sprite - > centerToCornerVecY + gSpriteCoordOffsetY ;
}
else
{
x = sprite - > pos1 . x + sprite - > pos2 . x + sprite - > centerToCornerVecX ;
y = sprite - > pos1 . y + sprite - > pos2 . y + sprite - > centerToCornerVecY ;
}
x2 = x - ( sprite - > centerToCornerVecX > > 1 ) ;
y2 = y - ( sprite - > centerToCornerVecY > > 1 ) ;
if ( ( s16 ) x > 255 | | x2 < - 16 )
2018-09-10 17:25:58 +02:00
sprite - > invisible = TRUE ;
2018-06-11 17:34:51 +02:00
if ( ( s16 ) y > 175 | | y2 < - 16 )
2018-09-10 17:25:58 +02:00
sprite - > invisible = TRUE ;
2018-06-11 17:34:51 +02:00
}
2020-06-01 16:23:12 +02:00
# define tInvisible data[2]
# define tAnimNum data[3]
# define tAnimState data[4]
static void UpdateObjectEventSprite ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
UpdateObjectEventSpritePosition ( sprite ) ;
2018-06-11 17:34:51 +02:00
SetObjectSubpriorityByZCoord ( sprite - > data [ 1 ] , sprite , 1 ) ;
2020-06-01 16:23:12 +02:00
UpdateObjectEventSpriteVisibility ( sprite , sprite - > tInvisible ) ;
2018-06-11 17:34:51 +02:00
}
2020-06-01 16:23:12 +02:00
// Unused
static void DestroyObjectEventSprites ( void )
2018-06-11 17:34:51 +02:00
{
int i ;
2020-06-01 16:23:12 +02:00
for ( i = 0 ; i < MAX_SPRITES ; i + + )
2018-06-11 17:34:51 +02:00
{
struct Sprite * sprite = & gSprites [ i ] ;
2020-06-01 16:23:12 +02:00
if ( sprite - > inUse & & sprite - > callback = = UpdateObjectEventSprite )
2018-06-11 17:34:51 +02:00
DestroySprite ( sprite ) ;
}
}
2021-01-20 00:35:57 +01:00
static int GetObjectEventSpriteId ( u8 objectEventId ) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
2018-06-11 17:34:51 +02:00
{
int i ;
2020-06-01 16:23:12 +02:00
for ( i = 0 ; i < MAX_SPRITES ; i + + )
2018-06-11 17:34:51 +02:00
{
struct Sprite * sprite = & gSprites [ i ] ;
2021-01-20 00:35:57 +01:00
if ( sprite - > inUse & & sprite - > callback = = UpdateObjectEventSprite & & ( u8 ) sprite - > data [ 0 ] = = objectEventId )
2018-06-11 17:34:51 +02:00
return i ;
}
return MAX_SPRITES ;
}
2020-06-01 16:23:12 +02:00
void TurnObjectEventSprite ( u8 objectEventId , u8 direction )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
u8 spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId ! = MAX_SPRITES )
StartSpriteAnim ( & gSprites [ spriteId ] , GetFaceDirectionAnimNum ( direction ) ) ;
2018-06-11 17:34:51 +02:00
}
2020-06-01 16:23:12 +02:00
void SetObjectEventSpriteGraphics ( u8 objectEventId , u8 graphicsId )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
int spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId ! = MAX_SPRITES )
2018-06-11 17:34:51 +02:00
{
struct Sprite * sprite = & gSprites [ spriteId ] ;
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo = GetObjectEventGraphicsInfo ( graphicsId ) ;
2018-06-11 17:34:51 +02:00
u16 tileNum = sprite - > oam . tileNum ;
2018-10-20 22:01:45 +02:00
sprite - > oam = * graphicsInfo - > oam ;
2018-06-11 17:34:51 +02:00
sprite - > oam . tileNum = tileNum ;
2018-10-20 22:01:45 +02:00
sprite - > oam . paletteNum = graphicsInfo - > paletteSlot ;
sprite - > images = graphicsInfo - > images ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( graphicsInfo - > subspriteTables = = NULL )
2018-06-11 17:34:51 +02:00
{
sprite - > subspriteTables = NULL ;
sprite - > subspriteTableNum = 0 ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_OFF ;
2018-06-11 17:34:51 +02:00
}
else
{
2018-10-20 22:01:45 +02:00
SetSubspriteTables ( sprite , graphicsInfo - > subspriteTables ) ;
2019-12-05 03:00:45 +01:00
sprite - > subspriteMode = SUBSPRITES_IGNORE_PRIORITY ;
2018-06-11 17:34:51 +02:00
}
StartSpriteAnim ( sprite , 0 ) ;
}
}
2020-06-01 16:23:12 +02:00
void SetObjectEventSpriteInvisibility ( u8 objectEventId , bool32 invisible )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
u8 spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId = = MAX_SPRITES )
2018-06-11 17:34:51 +02:00
return ;
2020-06-01 16:23:12 +02:00
if ( invisible )
gSprites [ spriteId ] . tInvisible = TRUE ;
2018-06-11 17:34:51 +02:00
else
2020-06-01 16:23:12 +02:00
gSprites [ spriteId ] . tInvisible = FALSE ;
2018-06-11 17:34:51 +02:00
}
2020-06-01 16:23:12 +02:00
bool32 IsObjectEventSpriteInvisible ( u8 objectEventId )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
u8 spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId = = MAX_SPRITES )
2018-06-11 17:34:51 +02:00
return FALSE ;
2020-06-01 16:23:12 +02:00
return ( gSprites [ spriteId ] . tInvisible = = TRUE ) ;
2018-06-11 17:34:51 +02:00
}
2020-06-01 16:23:12 +02:00
void SetObjectEventSpriteAnim ( u8 objectEventId , u8 animNum )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
u8 spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId ! = MAX_SPRITES )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
gSprites [ spriteId ] . tAnimNum = animNum ;
gSprites [ spriteId ] . tAnimState = 0 ;
2018-06-11 17:34:51 +02:00
}
}
2020-06-01 16:23:12 +02:00
static void MoveUnionRoomObjectUp ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
switch ( sprite - > tAnimState )
2018-06-11 17:34:51 +02:00
{
case 0 :
sprite - > pos2 . y = 0 ;
2020-06-01 16:23:12 +02:00
sprite - > tAnimState + + ;
2018-06-11 17:34:51 +02:00
case 1 :
sprite - > pos2 . y - = 8 ;
2020-06-01 16:23:12 +02:00
if ( sprite - > pos2 . y = = - 160 )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y = 0 ;
2020-06-01 16:23:12 +02:00
sprite - > tInvisible = TRUE ;
sprite - > tAnimNum = 0 ;
sprite - > tAnimState = 0 ;
2018-06-11 17:34:51 +02:00
}
}
}
2020-06-01 16:23:12 +02:00
static void MoveUnionRoomObjectDown ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
switch ( sprite - > tAnimState )
2018-06-11 17:34:51 +02:00
{
case 0 :
sprite - > pos2 . y = - 160 ;
2020-06-01 16:23:12 +02:00
sprite - > tAnimState + + ;
2018-06-11 17:34:51 +02:00
case 1 :
sprite - > pos2 . y + = 8 ;
if ( sprite - > pos2 . y = = 0 )
{
2020-06-01 16:23:12 +02:00
sprite - > tAnimNum = 0 ;
sprite - > tAnimState = 0 ;
2018-06-11 17:34:51 +02:00
}
}
}
2020-06-01 16:23:12 +02:00
static void UpdateObjectEventSpritePosition ( struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
switch ( sprite - > tAnimNum )
2018-06-11 17:34:51 +02:00
{
2020-06-01 16:23:12 +02:00
case UNION_ROOM_SPAWN_IN :
MoveUnionRoomObjectDown ( sprite ) ;
2018-06-11 17:34:51 +02:00
break ;
2020-06-01 16:23:12 +02:00
case UNION_ROOM_SPAWN_OUT :
MoveUnionRoomObjectUp ( sprite ) ;
2018-06-11 17:34:51 +02:00
break ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
case 0 :
break ;
2018-06-11 17:34:51 +02:00
default :
2020-06-01 16:23:12 +02:00
sprite - > tAnimNum = 0 ;
2018-06-11 17:34:51 +02:00
break ;
}
}
2021-01-20 00:35:57 +01:00
bool32 IsObjectEventSpriteAnimating ( u8 objectEventId )
2018-06-11 17:34:51 +02:00
{
2021-01-20 00:35:57 +01:00
u8 spriteId = GetObjectEventSpriteId ( objectEventId ) ;
2018-06-11 17:34:51 +02:00
2020-06-01 16:23:12 +02:00
if ( spriteId = = MAX_SPRITES )
2018-06-11 17:34:51 +02:00
return FALSE ;
2020-06-01 16:23:12 +02:00
if ( gSprites [ spriteId ] . tAnimNum ! = 0 )
2018-06-11 17:34:51 +02:00
return TRUE ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
u32 StartFieldEffectForObjectEvent ( u8 fieldEffectId , struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
ObjectEventGetLocalIdAndMap ( objectEvent , & gFieldEffectArguments [ 0 ] , & gFieldEffectArguments [ 1 ] , & gFieldEffectArguments [ 2 ] ) ;
2018-06-11 17:34:51 +02:00
return FieldEffectStart ( fieldEffectId ) ;
}
2019-11-21 04:55:44 +01:00
void DoShadowFieldEffect ( struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( ! objectEvent - > hasShadow )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
objectEvent - > hasShadow = 1 ;
StartFieldEffectForObjectEvent ( FLDEFF_SHADOW , objectEvent ) ;
2018-06-11 17:34:51 +02:00
}
}
2019-11-21 04:55:44 +01:00
static void DoRippleFieldEffect ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
const struct ObjectEventGraphicsInfo * graphicsInfo = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) ;
2018-06-11 17:34:51 +02:00
gFieldEffectArguments [ 0 ] = sprite - > pos1 . x ;
2018-10-20 22:01:45 +02:00
gFieldEffectArguments [ 1 ] = sprite - > pos1 . y + ( graphicsInfo - > height > > 1 ) - 2 ;
2018-06-11 17:34:51 +02:00
gFieldEffectArguments [ 2 ] = 151 ;
gFieldEffectArguments [ 3 ] = 3 ;
FieldEffectStart ( FLDEFF_RIPPLE ) ;
}
2019-11-21 04:55:44 +01:00
u8 ( * const gMovementActionFuncs_StoreAndLockAnim [ ] ) ( struct ObjectEvent * , struct Sprite * ) = {
2018-06-14 00:51:26 +02:00
MovementAction_StoreAndLockAnim_Step0 ,
MovementAction_Finish ,
2018-06-12 01:17:31 +02:00
} ;
2019-11-21 04:55:44 +01:00
u8 ( * const gMovementActionFuncs_FreeAndUnlockAnim [ ] ) ( struct ObjectEvent * , struct Sprite * ) = {
2018-06-14 00:51:26 +02:00
MovementAction_FreeAndUnlockAnim_Step0 ,
MovementAction_Finish ,
2018-06-12 01:17:31 +02:00
} ;
2019-11-21 04:55:44 +01:00
u8 ( * const gMovementActionFuncs_FlyUp [ ] ) ( struct ObjectEvent * , struct Sprite * ) = {
2018-06-14 00:51:26 +02:00
MovementAction_FlyUp_Step0 ,
MovementAction_FlyUp_Step1 ,
MovementAction_Fly_Finish ,
2018-06-12 01:17:31 +02:00
} ;
2019-11-21 04:55:44 +01:00
u8 ( * const gMovementActionFuncs_FlyDown [ ] ) ( struct ObjectEvent * , struct Sprite * ) = {
2018-06-14 00:51:26 +02:00
MovementAction_FlyDown_Step0 ,
MovementAction_FlyDown_Step1 ,
MovementAction_Fly_Finish ,
2018-06-12 01:17:31 +02:00
} ;
2019-11-21 04:55:44 +01:00
u8 MovementAction_StoreAndLockAnim_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
bool32 ableToStore = FALSE ;
2019-11-21 04:55:44 +01:00
if ( gLockedAnimObjectEvents = = NULL )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
gLockedAnimObjectEvents = AllocZeroed ( sizeof ( struct LockedAnimObjectEvents ) ) ;
gLockedAnimObjectEvents - > objectEventIds [ 0 ] = objectEvent - > localId ;
2020-09-05 20:51:17 +02:00
gLockedAnimObjectEvents - > count = 1 ;
ableToStore = TRUE ;
2018-06-11 17:34:51 +02:00
}
else
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
u8 i ;
u8 firstFreeSlot ;
bool32 found ;
2018-06-11 17:34:51 +02:00
for ( firstFreeSlot = 16 , found = FALSE , i = 0 ; i < 16 ; i + + )
{
2019-11-21 04:55:44 +01:00
if ( firstFreeSlot = = 16 & & gLockedAnimObjectEvents - > objectEventIds [ i ] = = 0 )
2018-06-11 17:34:51 +02:00
firstFreeSlot = i ;
2019-11-21 04:55:44 +01:00
if ( gLockedAnimObjectEvents - > objectEventIds [ i ] = = objectEvent - > localId )
2018-06-11 17:34:51 +02:00
{
found = TRUE ;
break ;
}
}
if ( ! found & & firstFreeSlot ! = 16 )
{
2019-11-21 04:55:44 +01:00
gLockedAnimObjectEvents - > objectEventIds [ firstFreeSlot ] = objectEvent - > localId ;
gLockedAnimObjectEvents - > count + + ;
2018-06-11 17:34:51 +02:00
ableToStore = TRUE ;
}
}
if ( ableToStore = = TRUE )
{
2019-11-21 04:55:44 +01:00
objectEvent - > inanimate = TRUE ;
objectEvent - > facingDirectionLocked = TRUE ;
2018-06-11 17:34:51 +02:00
}
sprite - > data [ 2 ] = 1 ;
return TRUE ;
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_FreeAndUnlockAnim_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
bool32 ableToStore ;
2018-06-14 00:51:26 +02:00
u8 index ;
2018-06-11 17:34:51 +02:00
sprite - > data [ 2 ] = 1 ;
2019-11-21 04:55:44 +01:00
if ( gLockedAnimObjectEvents ! = NULL )
2018-06-11 17:34:51 +02:00
{
ableToStore = FALSE ;
2019-11-21 04:55:44 +01:00
index = FindLockedObjectEventIndex ( objectEvent ) ;
2018-06-14 00:51:26 +02:00
if ( index ! = 16 )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
gLockedAnimObjectEvents - > objectEventIds [ index ] = 0 ;
gLockedAnimObjectEvents - > count - - ;
2018-06-11 17:34:51 +02:00
ableToStore = TRUE ;
}
2019-11-21 04:55:44 +01:00
if ( gLockedAnimObjectEvents - > count = = 0 )
FREE_AND_SET_NULL ( gLockedAnimObjectEvents ) ;
2018-06-11 17:34:51 +02:00
if ( ableToStore = = TRUE )
{
2019-11-21 04:55:44 +01:00
objectEvent - > inanimate = GetObjectEventGraphicsInfo ( objectEvent - > graphicsId ) - > inanimate ;
objectEvent - > facingDirectionLocked = FALSE ;
2018-06-11 17:34:51 +02:00
sprite - > animPaused = 0 ;
}
}
return TRUE ;
}
2019-11-21 04:55:44 +01:00
u8 FindLockedObjectEventIndex ( struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
if ( gLockedAnimObjectEvents - > objectEventIds [ i ] = = objectEvent - > localId )
2018-06-11 17:34:51 +02:00
return i ;
}
2019-11-21 05:12:51 +01:00
return OBJECT_EVENTS_COUNT ;
2018-06-11 17:34:51 +02:00
}
2019-11-21 04:55:44 +01:00
void CreateLevitateMovementTask ( struct ObjectEvent * objectEvent )
2018-06-11 17:34:51 +02:00
{
2018-06-14 00:51:26 +02:00
u8 taskId = CreateTask ( ApplyLevitateMovement , 0xFF ) ;
2018-06-11 17:34:51 +02:00
struct Task * task = & gTasks [ taskId ] ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
StoreWordInTwoHalfwords ( & task - > data [ 0 ] , ( u32 ) objectEvent ) ;
2019-11-21 04:55:44 +01:00
objectEvent - > warpArrowSpriteId = taskId ;
2018-12-05 15:31:01 +01:00
task - > data [ 3 ] = 0xFFFF ;
2018-06-11 17:34:51 +02:00
}
2018-06-14 00:51:26 +02:00
static void ApplyLevitateMovement ( u8 taskId )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2018-06-11 17:34:51 +02:00
struct Sprite * sprite ;
struct Task * task = & gTasks [ taskId ] ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
LoadWordFromTwoHalfwords ( & task - > data [ 0 ] , ( u32 * ) & objectEvent ) ; // load the map object pointer.
2019-11-21 04:55:44 +01:00
sprite = & gSprites [ objectEvent - > spriteId ] ;
2018-06-11 17:34:51 +02:00
if ( ! ( task - > data [ 2 ] & 0x3 ) )
sprite - > pos2 . y + = task - > data [ 3 ] ;
if ( ! ( task - > data [ 2 ] & 0xF ) )
task - > data [ 3 ] = - task - > data [ 3 ] ;
task - > data [ 2 ] + + ;
}
2018-06-14 00:51:26 +02:00
void DestroyExtraMovementTask ( u8 taskId )
2018-06-11 17:34:51 +02:00
{
2019-11-21 04:55:44 +01:00
struct ObjectEvent * objectEvent ;
2018-06-11 17:34:51 +02:00
struct Task * task = & gTasks [ taskId ] ;
Undo PokeCodec's PRs
This commit undoes most of PokeCodec's PRs after the debate in chat. Some
harmless or completely superseded PRs have been left alone, as there is not
much benefit in attempting to undo them.
Reverts #1104, #1108, #1115, #1118, #1119, #1124, #1126, #1127, #1132, #1136,
#1137, #1139, #1140, #1144, #1148, #1149, #1150, #1153, #1155, #1177, #1179,
#1180, #1181, #1182 and #1183.
2020-09-13 09:22:50 +02:00
LoadWordFromTwoHalfwords ( & task - > data [ 0 ] , ( u32 * ) & objectEvent ) ; // unused objectEvent
2018-06-11 17:34:51 +02:00
DestroyTask ( taskId ) ;
}
2021-01-26 10:41:13 +01:00
// Used to freeze other objects except two trainers approaching for battle
void FreezeObjectEventsExceptTwo ( u8 objectEventId1 , u8 objectEventId2 )
2018-06-11 17:34:51 +02:00
{
u8 i ;
2019-11-21 05:12:51 +01:00
for ( i = 0 ; i < OBJECT_EVENTS_COUNT ; i + + )
2018-06-11 17:34:51 +02:00
{
2021-01-26 10:41:13 +01:00
if ( i ! = objectEventId1 & & i ! = objectEventId2 & &
2019-11-21 04:55:44 +01:00
gObjectEvents [ i ] . active & & i ! = gPlayerAvatar . objectEventId )
FreezeObjectEvent ( & gObjectEvents [ i ] ) ;
2018-06-11 17:34:51 +02:00
}
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_FlyUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y = 0 ;
sprite - > data [ 2 ] + + ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_FlyUp_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y - = 8 ;
if ( sprite - > pos2 . y = = - 160 )
sprite - > data [ 2 ] + + ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_FlyDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y = - 160 ;
sprite - > data [ 2 ] + + ;
return FALSE ;
}
2019-11-21 04:55:44 +01:00
u8 MovementAction_FlyDown_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
sprite - > pos2 . y + = 8 ;
if ( ! sprite - > pos2 . y )
sprite - > data [ 2 ] + + ;
return FALSE ;
}
// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
2019-11-21 04:55:44 +01:00
u8 MovementAction_Fly_Finish ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
2018-06-11 17:34:51 +02:00
{
return TRUE ;
}
2020-06-03 22:23:28 +02:00
2020-06-20 07:40:12 +02:00
// 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 ;
}
2020-06-03 22:23:28 +02:00
// running slow
static void StartSlowRunningAnim ( struct ObjectEvent * objectEvent , struct Sprite * sprite , u8 direction )
{
sub_8093AF0 ( objectEvent , sprite , direction ) ;
npc_apply_anim_looping ( objectEvent , sprite , GetRunningDirectionAnimNum ( objectEvent - > facingDirection ) ) ;
}
bool8 MovementActionFunc_RunSlowDown_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
{
StartSlowRunningAnim ( objectEvent , sprite , DIR_SOUTH ) ;
return MovementActionFunc_RunSlow_Step1 ( objectEvent , sprite ) ;
}
bool8 MovementActionFunc_RunSlowUp_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
{
StartSlowRunningAnim ( objectEvent , sprite , DIR_NORTH ) ;
return MovementActionFunc_RunSlow_Step1 ( objectEvent , sprite ) ;
}
bool8 MovementActionFunc_RunSlowLeft_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
StartSlowRunningAnim ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
StartSlowRunningAnim ( objectEvent , sprite , DIR_WEST ) ;
2020-06-03 22:23:28 +02:00
return MovementActionFunc_RunSlow_Step1 ( objectEvent , sprite ) ;
}
bool8 MovementActionFunc_RunSlowRight_Step0 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
{
2020-06-20 07:40:12 +02:00
if ( objectEvent - > directionOverwrite )
StartSlowRunningAnim ( objectEvent , sprite , objectEvent - > directionOverwrite ) ;
else
StartSlowRunningAnim ( objectEvent , sprite , DIR_EAST ) ;
2020-06-03 22:23:28 +02:00
return MovementActionFunc_RunSlow_Step1 ( objectEvent , sprite ) ;
}
bool8 MovementActionFunc_RunSlow_Step1 ( struct ObjectEvent * objectEvent , struct Sprite * sprite )
{
2020-07-14 22:28:02 +02:00
if ( npc_obj_ministep_stop_on_arrival ( objectEvent , sprite ) )
2020-06-03 22:23:28 +02:00
{
sprite - > data [ 2 ] = 2 ;
return TRUE ;
}
return FALSE ;
}