#ifndef D_A_E_DF_H
#define D_A_E_DF_H

#include "JSystem/JHostIO/JORReflexible.h"
#include "d/d_cc_d.h"
#include "d/d_cc_uty.h"
#include "f_op/f_op_actor.h"

/**
 * @ingroup actors-enemies
 * @class daE_DF_c
 * @brief Deku Flower
 *
 * @details
 *
 */
class daE_DF_c : public fopEn_enemy_c {
public:
    enum {
        /* 0x0 */ EAT_TYPE_OBJ,
        /* 0x1 */ EAT_TYPE_LINK,
        /* 0x2 */ EAT_TYPE_BOMB,
    };

    enum {
        /* 0x0 */ ACT_WAIT,
        /* 0x1 */ ACT_EAT,
        /* 0x2 */ ACT_DAMAGE,
        /* 0x3 */ ACT_MISS,
        /* 0x4 */ ANIM_BOUND,
        /* 0x5 */ ANIM_BURST,
        /* 0x6 */ ANIM_DIE,
        /* 0x7 */ ANIM_EAT,
        /* 0x8 */ ANIM_EAT_WAIT,
        /* 0x9 */ ANIM_SPITOUT,
        /* 0xA */ ANIM_WAIT,
    };

    int CreateHeap();
    void initCcCylinder();
    void setCcCylinder();
    void SetAnm(int, int, f32, f32);
    void CameraSet(f32);
    bool DemoStart();
    void SetReleaseCam();
    int ctrlJoint(J3DJoint*, J3DModel*);
    void Link_Eat_Pos();
    void Set_Angle(cXyz*);
    void Obj_Damage();
    void DamageAction();
    void BombEatAction();
    void Spid_Out();
    void LinkEatAction();
    u8 Mogu_Mogu();
    void ObjEatAction();
    void EatAction();
    void SearchAction();
    void WaitAction();
    void MissAction();
    void Action();
    int Execute();
    void Yazirushi();
    int Draw();
    int Delete();
    void setBaseMtx();
    int Create();

    /* 0x5AC */ u8 mAction;
    /* 0x5AD */ u8 mEatObjType;
    /* 0x5AE */ u8 mEatStep;
    /* 0x5B0 */ csXyz mChaseAngle;
    /* 0x5B8 */ s32 mCarryType;
    /* 0x5BC */ u8 mMoguCount;
    /* 0x5BE */ s16 mTimer;
    /* 0x5C0 */ s32 mAnim;
    /* 0x5C4 */ s16 mTargetAngle;
    /* 0x5C6 */ s16 mInvincibilityTimer;
    /* 0x5C8 */ mDoExt_McaMorfSO* mpMorfSO;
    /* 0x5CC */ request_of_phase_process_class mPhaseReq;
    /* 0x5D4 */ u8 field_0x5d4[0x5D8 - 0x5D4];
    /* 0x5D8 */ Z2CreatureEnemy mCreatureSound;
    /* 0x67C */ dCcD_Stts mStts;
    /* 0x6B8 */ dCcD_Cyl mCyl;
    /* 0x7F4 */ dCcU_AtInfo mAtInfo;
    /* 0x818 */ u8 mHIOInit;
    /* 0x819 */ u8 mArg0;
    /* 0x81C */ cXyz mCenterPos;
    /* 0x828 */ cXyz mEyePos;
    /* 0x834 */ f32 mFovY;
};

STATIC_ASSERT(sizeof(daE_DF_c) == 0x838);

#endif /* D_A_E_DF_H */
