#ifndef AC_UKI_H
#define AC_UKI_H

#include "types.h"
#include "m_actor.h"
#include "libultra/ultratypes.h"

#ifdef __cplusplus
extern "C" {
#endif

enum {
    aUKI_STATUS_0,
    aUKI_STATUS_CARRY,
    aUKI_STATUS_READY,
    aUKI_STATUS_CAST,
    aUKI_STATUS_FLOAT,
    aUKI_STATUS_VIB,
    aUKI_STATUS_COMEBACK,
    aUKI_STATUS_CATCH,

    aUKI_STATUS_NUM
};

typedef void (*aUKI_SET_VALUE_PROC)(ACTOR* actorx, xyz_t pos, xyz_t pos_speed, int angle_speed_y, int command);
typedef mActor_name_t (*aUKI_GET_FISH_TYPE)(ACTOR* actorx);

/* sizeof(UKI_ACTOR) == 0x2B8 */
typedef struct actor_uki_s {
    /* 0x000 */ ACTOR actor_class;
    /* 0x174 */ ACTOR* child_actor;
    /* 0x178 */ ClObjPipe_c col_pipe;
    /* 0x194 */ f32 _194;
    /* 0x198 */ MtxF mtxf;
    /* 0x1D8 */ s16 proc;
    /* 0x1DC */ xyz_t parabola_vec[2];
    /* 0x1F4 */ xyz_t parabola_acc[2];
    /* 0x20C */ f32 range;
    /* 0x210 */ aUKI_SET_VALUE_PROC set_value_proc;
    /* 0x214 */ aUKI_GET_FISH_TYPE get_fish_type_proc;
    /* 0x218 */ xyz_t right_hand_pos;
    /* 0x224 */ xyz_t position_speed;
    /* 0x230 */ int angle_speed_y;
    /* 0x234 */ int command;
    /* 0x238 */ int status;
    /* 0x23C */ xyz_t cast_goal_point;
    /* 0x248 */ xyz_t rod_top_position;
    /* 0x254 */ xyz_t left_hand_pos;
    /* 0x260 */ u8 touched_flag;
    /* 0x261 */ u8 hit_water_flag;
    /* 0x262 */ s16 frame_timer;
    /* 0x264 */ s16 cast_timer;
    /* 0x266 */ s16 touch_timer;
    /* 0x268 */ xyz_t uki_pos;
    /* 0x274 */ xyz_t gyo_pos;
    /* 0x280 */ s_xyz uki_angle;
    /* 0x286 */ s16 uki_rot_speed;
    /* 0x288 */ int gyo_command;
    /* 0x28C */ int gyo_status;
    /* 0x290 */ int gyo_type;
    /* 0x294 */ f32 gyo_scale;
    /* 0x298 */ int color[3]; /* rgb */
    /* 0x2A4 */ u8 _2A4[0x10];
    /* 0x2B4 */ u8 coast_flag;
    /* 0x2B5 */ u8 _2B5;
} UKI_ACTOR;

extern ACTOR_PROFILE Uki_Profile;

#ifdef __cplusplus
}
#endif

#endif
