#ifndef D_A_NPC_NE_H
#define D_A_NPC_NE_H

#include "SSystem/SComponent/c_phase.h"
#include "d/d_bg_s_acch.h"
#include "d/d_cc_d.h"
#include "d/d_path.h"
#include "d/d_msg_flow.h"
#include "f_op/f_op_actor.h"

/**
 * @ingroup actors-npcs
 * @class npc_ne_class
 * @brief Cat (Neko)
 *
 * @details
 *
 */
class npc_ne_class : public fopEn_enemy_c {
public:
    enum Action {
        ACT_WAIT = 0,
        ACT_AWAY = 1,
        ACT_TAME = 2,
        ACT_ROOF = 3,
        ACT_HOME = 4,
        ACT_JUMP = 5,
        ACT_S_JUMP = 6,
        ACT_BIRD = 7,
        ACT_BALL = 8,
        ACT_SANBASI = 9,
        ACT_PATH_WALK = 10,
        ACT_SWIM = 12,
        ACT_OUT_SWIM = 13,
        ACT_CLIMB = 14,
        ACT_DROP = 15,
        ACT_S_DROP = 16,
        ACT_MESSAGE = 17,
        ACT_DISH = 18,
        ACT_CARRY = 20,
    };

    enum Animation {
        ANM_CARRY_A = 6,
        ANM_CARRY_B = 7,
        ANM_DRINK_DISH = 8,
        ANM_EMPTY_DISH = 9,
        ANM_FAWN_L = 10,
        ANM_FAWN_R = 11,
        ANM_JUMP_END = 12,
        ANM_JUMP_LOOP = 13,
        ANM_JUMP_START = 14,
        ANM_JUMP_UP = 15,
        ANM_MILK = 16,
        ANM_RUN = 17,
        ANM_SIT_A = 18,
        ANM_SIT_B = 19,
        ANM_SWIM = 20,
        ANM_TO_JUMP = 21,
        ANM_TO_WAIT = 22,
        ANM_TO_CARRY_B = 23,
        ANM_WAIT = 24,
        ANM_WALK = 25,
    };

    enum Behavior {
        BHV_NONE = 0,
        BHV_TAME = 1,
        BHV_PIER = 2,
        BHV_DISH = 3,
    };

    enum LookMode {
        LOOK_FORWARD = 0,
        LOOK_PLAYER = 1,
        LOOK_TARGET = 2,
        LOOK_NONE = 3,
    };

    npc_ne_class();

    /* 0x5AC */ request_of_phase_process_class mPhase;
    /* 0x5B4 */ u8 mBehavior;
    /* 0x5B5 */ u8 mTexture;
    /* 0x5B6 */ u8 mSize;
    /* 0x5B7 */ u8 mIsGengle;
    /* 0x5B8 */ u8 mPathIndex;
    /* 0x5B9 */ u8 field_0x5b9;
    /* 0x5BC */ dPath* mpPath;
    /* 0x5C0 */ s8 mPathPointNo;
    /* 0x5C1 */ s8 mPathDir;
    /* 0x5C4 */ cXyz mTargetPos;
    /* 0x5D0 */ s16 mTargetAngleY;
    /* 0x5D4 */ f32 mAngleYStep;
    /* 0x5D8 */ f32 mDistToTarget;
    /* 0x5DC */ s16 mAngleToPlayer;
    /* 0x5E0 */ f32 mDistScale;
    /* 0x5E4 */ const char* mResName;
    /* 0x5E8 */ mDoExt_McaMorf* mpMorf;
    /* 0x5EC */ mDoExt_btkAnm* mpBtkAnm;
    /* 0x5F0 */ mDoExt_btpAnm* mpBtpAnm;
    /* 0x5F4 */ s8 mBtkFrame;
    /* 0x5F6 */ s16 mBtpFrame;
    /* 0x5F8 */ s8 mBtpReset;
    /* 0x5FC */ mDoExt_McaMorf* mpDishMorf;
    /* 0x600 */ cXyz mDishPos;
    /* 0x60C */ Z2SoundObjSimple mSound;
    /* 0x62C */ s16 mBtpTimer;
    /* 0x630 */ int mAnmID;
    /* 0x634 */ u8 field_0x634[4];
    /* 0x638 */ f32 mAnmSpeed;
    /* 0x63C */ u8 field_0x63c[4];
    /* 0x640 */ s16 mCounter;
    /* 0x642 */ s16 mAction;
    /* 0x644 */ u8 field_0x644[2];
    /* 0x646 */ s16 mMode;
    /* 0x648 */ u32 mShadowKey;
    /* 0x64C */ s16 mTimers[5];
    /* 0x656 */ s16 mCcDisableTimer;
    /* 0x658 */ s16 mSplashTimer;
    /* 0x65C */ f32 field_0x65c;
    /* 0x660 */ s16 field_0x660;
    /* 0x662 */ s16 mHeadAngleZ;
    /* 0x664 */ s16 mHeadAngleY;
    /* 0x666 */ s16 mHeadAngleX;
    /* 0x668 */ s8 mLookMode;
    /* 0x66C */ cXyz mLookTarget;
    /* 0x678 */ s16 mLookNoMoveTimer;
    /* 0x67A */ s16 mLookDownTimer;
    /* 0x67C */ s16 mLookUpTimer;
    /* 0x67E */ s16 mHeadTargetAngleY;
    /* 0x680 */ s16 mHeadTargetAngleZ;
    /* 0x682 */ s16 mNeckAngleY;
    /* 0x684 */ s16 mTailSwayAngle[2];
    /* 0x688 */ s16 mTailAngle;
    /* 0x68A */ s16 mTailTargetAngle;
    /* 0x68C */ f32 mTailSway;
    /* 0x690 */ f32 mTailSwayTarget;
    /* 0x694 */ s16 mBackboneAngleY;
    /* 0x696 */ s16 mBackboneTargetAngleY;
    /* 0x698 */ u8 field_0x698[2];
    /* 0x69A */ s16 mHeadBobAngleY;
    /* 0x69C */ s16 mHeadBobAngleX;
    /* 0x69E */ u8 field_0x69e[2];
    /* 0x6A0 */ s16 mHeadBobTargetAngleY;
    /* 0x6A2 */ s16 mHeadBobTargetAngleX;
    /* 0x6A4 */ s16 mHeadBobTimer;
    /* 0x6A6 */ u8 field_0x6a6[0x12];
    /* 0x6B8 */ f32 field_0x6b8;
    /* 0x6BC */ f32 mWaterY;
    /* 0x6C0 */ u8 field_0x6c0[0x14];
    /* 0x6D4 */ f32 field_0x6d4;
    /* 0x6D8 */ cXyz mBaseScale;
    /* 0x6E4 */ cXyz mClimbPos;
    /* 0x6F0 */ s8 mCarryTimer;
    /* 0x6F1 */ u8 field_0x6f1[7];
    /* 0x6F8 */ s8 mSearchBall;
    /* 0x6FC */ int mHomePathIdx;
    /* 0x700 */ s8 mNoFollow;
    /* 0x701 */ s8 mWantsFish;
    /* 0x704 */ dBgS_AcchCir mAcchCir;
    /* 0x744 */ dBgS_ObjAcch mAcch;
    /* 0x91C */ f32 mGroundY;
    /* 0x920 */ dCcD_Stts mStts;
    /* 0x95C */ dCcD_Sph mCcSph;
    /* 0xA94 */ dCcD_Sph mAtSph;
    /* 0xBCC */ s8 mAtEnable;
    /* 0xBCD */ u8 field_0xbcd[0x27];
    /* 0xBF4 */ f32 field_0xbf4;
    /* 0xBF8 */ u8 field_0xbf8[8];
    /* 0xC00 */ u32 mParticle[2];
    /* 0xC08 */ s8 mMessageState;
    /* 0xC09 */ s16 mIsTalking;
    /* 0xC0C */ s16 mFlowID;
    /* 0xC10 */ dMsgFlow_c mMsgFlow;
    /* 0xC5C */ s16 mDemoMode;
    /* 0xC5E */ s16 mDemoCounter;
    /* 0xC60 */ s16 mDemoTimer;
    /* 0xC64 */ cXyz mCameraEye1;
    /* 0xC70 */ cXyz mCameraCenter1;
    /* 0xC7C */ u8 field_0xc7c[0xc];
    /* 0xC88 */ f32 mCameraFovY;
    /* 0xC8C */ u8 field_0xc8c[4];
    /* 0xC90 */ cXyz mDemoFishPos;
    /* 0xC9C */ cXyz mCameraEye2;
    /* 0xCA8 */ cXyz mCameraCenter2;
    /* 0xCB4 */ bool field_0xcb4;
    /* 0xCB6 */ s16 field_0xcb6;
    /* 0xCB8 */ f32 field_0xcb8;
    /* 0xCBC */ u32 mFishID;
    /* 0xCC0 */ bool field_0xcc0;
    /* 0xCC1 */ bool mHIOInit;
};

STATIC_ASSERT(sizeof(npc_ne_class) == 0xCC4);

class daNpc_Ne_HIO_c {
public:
    daNpc_Ne_HIO_c();
    virtual ~daNpc_Ne_HIO_c() {}

    /* 0x04 */ s8 field_0x04;
    /* 0x08 */ f32 mScale;
    /* 0x0C */ f32 mWalkSpeed;
    /* 0x10 */ f32 mRunSpeed;
    /* 0x14 */ f32 mSwimSpeed;
    /* 0x18 */ u8 field_0x18;
};

STATIC_ASSERT(sizeof(daNpc_Ne_HIO_c) == 0x1C);

struct home_path_pnt {
public:
    /* 0x0 */ int mNo;
    /* 0x4 */ Vec mPosition;
};  // Size: 0x10


#endif /* D_A_NPC_NE_H */
