#ifndef GUARD_FOLLOWER_NPC_H #define GUARD_FOLLOWER_NPC_H #include "constants/follower_npc.h" #define MOVEMENT_INVALID 0xFE struct FollowerNPCSpriteGraphics { u16 normalId; u16 machBikeId; u16 acroBikeId; u16 surfId; u16 underwaterId; }; enum FollowerNPCDataTypes { FNPC_DATA_IN_PROGRESS, FNPC_DATA_WARP_END, FNPC_DATA_SURF_BLOB, FNPC_DATA_COME_OUT_DOOR, FNPC_DATA_FORCED_MOVEMENT, FNPC_DATA_OBJ_ID, FNPC_DATA_CURRENT_SPRITE, FNPC_DATA_DELAYED_STATE, FNPC_DATA_MAP_ID, FNPC_DATA_MAP_NUM, FNPC_DATA_MAP_GROUP, FNPC_DATA_EVENT_FLAG, FNPC_DATA_GFX_ID, FNPC_DATA_FOLLOWER_FLAGS, FNPC_DATA_BATTLE_PARTNER }; enum FollowerNPCSpriteTypes { FOLLOWER_NPC_SPRITE_INDEX_NORMAL, FOLLOWER_NPC_SPRITE_INDEX_MACH_BIKE, FOLLOWER_NPC_SPRITE_INDEX_ACRO_BIKE, FOLLOWER_NPC_SPRITE_INDEX_SURF, FOLLOWER_NPC_SPRITE_INDEX_UNDERWATER, }; enum FollowerNPCDoorStairsStates { FNPC_DOOR_NONE, FNPC_DOOR_NEEDS_TO_EXIT, FNPC_DOOR_NO_POS_SET }; enum FollowerNPCWarpEndStates { FNPC_WARP_NONE, FNPC_WARP_REAPPEAR }; enum FollowerNPCSurfBlobStates { FNPC_SURF_BLOB_NONE, FNPC_SURF_BLOB_NEW, FNPC_SURF_BLOB_RECREATE, FNPC_SURF_BLOB_DESTROY }; enum FollowerNPCOutOfDoorTaskStates { OPEN_DOOR, NPC_WALK_OUT, CLOSE_DOOR, UNFREEZE_OBJECTS, REALLOW_MOVEMENT }; enum FollowerNPCHandleEscalatorFinishTaskStates { MOVE_TO_PLAYER_POS, WAIT_FOR_PLAYER_MOVE, SHOW_FOLLOWER_DOWN, MOVE_FOLLOWER_DOWN, SHOW_FOLLOWER_UP, MOVE_FOLLOWER_UP, MOVEMENT_FINISH }; void SetFollowerNPCData(enum FollowerNPCDataTypes type, u32 value); const u8 *GetFollowerNPCScriptPointer(void); u32 GetFollowerNPCData(enum FollowerNPCDataTypes type); void ClearFollowerNPCData(void); u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direction); void SetFollowerNPCSprite(u32 spriteIndex); bool32 PlayerHasFollowerNPC(void); void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive); void CreateFollowerNPCAvatar(void); void FollowerNPC_HandleSprite(void); u32 DetermineFollowerNPCDirection(struct ObjectEvent *player, struct ObjectEvent *follower); u32 GetFollowerNPCObjectId(void); bool32 CheckFollowerNPCFlag(u32 flag); bool32 FollowerNPC_IsCollisionExempt(struct ObjectEvent *obstacle, struct ObjectEvent *collider); void HideNPCFollower(void); void FollowerNPC_WarpSetEnd(void); bool32 FollowerNPCCanBike(void); void FollowerNPC_HandleBike(void); void FollowerNPC_FollowerToWater(void); void FollowerNPC_SetIndicatorToRecreateSurfBlob(void); void FollowerNPC_BindToSurfBlobOnReloadScreen(void); void PrepareFollowerNPCDismountSurf(void); bool32 FollowerNPCComingThroughDoor(void); void FollowerNPC_SetIndicatorToComeOutDoor(void); void EscalatorMoveFollowerNPC(u32 movementType); void EscalatorMoveFollowerNPCFinish(void); void FollowerNPCWalkIntoPlayerForLeaveMap(void); void FollowerNPCHideForLeaveMap(struct ObjectEvent *follower); void FollowerNPCReappearAfterLeaveMap(struct ObjectEvent *follower, struct ObjectEvent *player); void FollowerNPCFaceAfterLeaveMap(void); bool32 FollowerNPCIsBattlePartner(void); bool32 IsNPCFollowerWildBattle(void); void PrepareForFollowerNPCBattle(void); void RestorePartyAfterFollowerNPCBattle(void); void FollowerNPC_TryRemoveFollowerOnWhiteOut(void); void Task_MoveNPCFollowerAfterForcedMovement(u8 taskId); void Task_HideNPCFollowerAfterMovementFinish(u8 taskId); #endif // GUARD_FOLLOWER_NPC_H