#ifndef D_A_B_DR_H
#define D_A_B_DR_H

#include "f_op/f_op_actor_mng.h"
#include "Z2AudioLib/Z2Creature.h"
#include "d/d_cc_d.h"
#include "d/d_msg_flow.h"
#include "d/d_bg_s_acch.h"
#include "m_Do/m_Do_hostIO.h"

/**
 * @ingroup actors-enemies
 * @class daB_DR_c
 * @brief Argorok
 *
 * @details City in the Sky dungeon boss.
 *
 */
class daB_DR_c : public fopEn_enemy_c {
public:
    int ctrlJoint(J3DJoint*, J3DModel*);
    static int JointCallBack(J3DJoint*, int);
    int draw();
    void setBck(int, u8, f32, f32);
    void setActionMode(int, int);
    void mGlider_WindPosSet();
    void mBoot_c_tranceSet(bool);
    void mStatusONOFF(int);
    void setSe();
    void setDeathLightEffect();
    void chkPartCreate(bool);
    void mHabatakiAnmSet(int);
    void mGlider_AniSet(bool);
    void mGliderAtAniSet();
    void tail_hit_check();
    void week_hit_check();
    void mTimerClr();
    void mCountClr();
    void mAllClr();
    void mHeadAngleSet();
    bool flapMove(bool);
    bool revolutionMove();
    bool mPlayerHighCheck();
    bool mBgFallGroundCheck();
    void normalHoverMove();
    void executeWait();
    void executeFlyWait();
    void executeTailHit();
    void executeWeekHit();
    void mBreathSet();
    bool mBreathHighSet(bool);
    bool mFeintBreath();
    void executeBreathAttack();
    void executeWindAttack();
    bool mGliderMoveSub(f32);
    void executeGliderAttack();
    void executePillarSearch();
    void executePillarWait();
    bool startDemoCheck();
    void executeDamageDemo();
    void executeMiddleDemo();
    void executeDead();
    void executeBullet();
    void executeParts();
    void action();
    void action_fire();
    void action_parts();
    void mtx_set();
    void parts_mtx_set();
    void cc_set();
    void down_cc_set();
    void demo_skip(int);
    static int DemoSkipCallBack(void*, int);
    int execute();
    int _delete();
    int CreateHeap();
    int create();
    daB_DR_c();

    MtxP getMtx() { return mpModelMorf->getModel()->getAnmMtx(15); }

    u8 onTarget() { return mTarget = true; }
    u8 isBack() { return arg0; }

private:
    /* 0x05AC */ request_of_phase_process_class mPhase;
    /* 0x05B4 */ mDoExt_McaMorfSO* mpModelMorf;
    /* 0x05B8 */ J3DModel* mpPartModel;
    /* 0x05BC */ mDoExt_brkAnm* mpCoreBrk;
    /* 0x05C0 */ Z2CreatureEnemy mSound;
    /* 0x0664 */ Z2CreatureEnemy mSound2;
    /* 0x0708 */ int mActionMode;
    /* 0x070C */ int mMoveMode;
    /* 0x0710 */ int mAnm;
    /* 0x0714 */ u8 field_0x714[0x0718 - 0x0714];
    /* 0x0718 */ int field_0x718;
    /* 0x071C */ u32 mShadowKey;
    /* 0x0720 */ f32 mTargetHeight;
    /* 0x0724 */ f32 field_0x724;
    /* 0x0728 */ f32 field_0x728;
    /* 0x072C */ f32 field_0x72c;
    /* 0x0730 */ f32 field_0x730;
    /* 0x0734 */ f32 field_0x734;
    /* 0x0738 */ f32 field_0x738;
    /* 0x073C */ f32 field_0x73c;
    /* 0x0740 */ f32 field_0x740;
    /* 0x0744 */ f32 field_0x744;
    /* 0x0748 */ f32 field_0x748;
    /* 0x074C */ s16 field_0x74c;
    /* 0x074E */ s16 field_0x74e;
    /* 0x0750 */ s16 field_0x750;
    /* 0x0752 */ s16 field_0x752;
    /* 0x0754 */ s16 field_0x754;
    /* 0x0756 */ s16 field_0x756;
    /* 0x0758 */ csXyz mHeadAngle;
    /* 0x0760 */ cXyz field_0x760;
    /* 0x076C */ cXyz mBoot_c_trance;
    /* 0x0778 */ cXyz field_0x778;
    /* 0x0784 */ cXyz field_0x784;
    /* 0x0790 */ cXyz field_0x790;
    /* 0x079C */ cXyz mGlider_WindPos;
    /* 0x07A8 */ cXyz field_0x7a8;
    /* 0x07B4 */ cXyz field_0x7b4;
    /* 0x07C0 */ int mTimer[4];
    /* 0x07D0 */ u8 field_0x7d0;
    /* 0x07D1 */ u8 field_0x7d1;
    /* 0x07D2 */ u8 mBreakPartsNo;
    /* 0x07D3 */ u8 field_0x7d3;
    /* 0x07D4 */ u8 field_0x7d4;
    /* 0x07D5 */ u8 field_0x7d5;
    /* 0x07D6 */ u8 field_0x7d6;
    /* 0x07D7 */ u8 field_0x7d7;
    /* 0x07D8 */ u8 field_0x7d8;
    /* 0x07D9 */ u8 mTarget;
    /* 0x07DA */ u8 field_0x7da;
    /* 0x07DB */ u8 field_0x7db;
    /* 0x07DC */ u8 field_0x7dc;
    /* 0x07E0 */ int field_0x7e0;
    /* 0x07E4 */ u8 mCount[4];
    /* 0x07E8 */ u8 field_0x7e8;
    /* 0x07E9 */ u8 field_0x7e9;
    /* 0x07EA */ u8 arg0;
    /* 0x07EB */ u8 mPartNo;
    /* 0x07EC */ u8 bitSw;
    /* 0x07ED */ u8 bitSw2;
    /* 0x07EE */ u8 bitSw3;
    /* 0x07F0 */ dBgS_AcchCir mAcchCir;
    /* 0x0830 */ dBgS_ObjAcch mAcch;
    /* 0x0A08 */ dCcD_Stts mColliderStts;
    /* 0x0A44 */ dCcD_Cyl mWeekCc;
    /* 0x0B80 */ dCcD_Sph mFootAtCc[2];
    /* 0x0DF0 */ dCcD_Sph field_0xdf0;
    /* 0x0F28 */ dCcD_Sph mBreathAtCc;
    /* 0x1060 */ dCcD_Sph mWindAtCc;
    /* 0x1198 */ dCcD_Sph mWindAtCc2;
    /* 0x12D0 */ dCcD_Sph mWindAtCc3;
    /* 0x1408 */ dCcD_Sph mTailCc;
    /* 0x1540 */ dCcD_Cyl mPillarCc;
    /* 0x167C */ dCcD_Sph mDownSphCc[9];
    /* 0x2174 */ dCcD_Cyl mDownCc[5];
    /* 0x27A0 */ u8 field_0x27A0[0x27A8 - 0x27A0];
    /* 0x27A8 */ Z2CreatureEnemy* field_0x27a8;
    /* 0x27AC */ u8 field_0x27AC[0x27BE - 0x27AC];
    /* 0x27BE */ u8 field_0x27be;
    /* 0x27BF */ u8 field_0x27bf[0x27C4 - 0x27BF];
    /* 0x27C4 */ cXyz mDemoCamEye;
    /* 0x27D0 */ cXyz mDemoCamCenter;
    /* 0x27DC */ u32 field_0x27dc[4];
    /* 0x27EC */ u32 field_0x27ec[4];
    /* 0x27FC */ u32 field_0x27fc[4];
    /* 0x280C */ u32 field_0x280c;
    /* 0x2810 */ u8 mInitHIO;
    /* 0x2814 */ dMsgFlow_c mMsgFlow;
};

STATIC_ASSERT(sizeof(daB_DR_c) == 0x2860);

#endif /* D_A_B_DR_H */
