#ifndef D_A_E_YMB_H
#define D_A_E_YMB_H

#include "d/d_cc_d.h"
#include "d/d_cc_uty.h"
#include "f_op/f_op_actor_mng.h"
#include "d/d_bg_w.h"

/**
 * @ingroup actors-enemies
 * @class daE_YMB_c
 * @brief Twilight Insect Boss
 * 
 * @details 
 * 
*/

class daE_YMB_c : public fopEn_enemy_c {
public:
    int ctrlJoint(J3DJoint*, J3DModel*);
    static int JointCallBack(J3DJoint*, int);
    int draw();
    void setBck(int, u8, f32, f32);
    bool checkBck(int);
    void setActionMode(int, int);
    void setLastDamage();
    void damage_check();
    void setCameraSwitch();
    void checkWaterPos();
    void checkGroundPos();
    void setFlyWaitVoice();
    void setDownWaitVoice();
    void setHitBoardSe();
    void setElecEffect1();
    void setElecEffect2();
    void setWaterEffect1();
    void setWaterEffect2();
    void setBoilEffect(int);
    void setDamageEffect(int);
    void setDownHamonEffect();
    void setFlyBlurEffect();
    void setRockDamageEffect();
    void setDeathEffect();
    void executeWait();
    void setBitePos(int);
    void setInclination();
    void setBodyAngle();
    bool checkWolfLockIn();
    void executeFly();
    void executeFlyAttack();
    void executeRunAway();
    void executeGuard();
    void executeSwim();
    void executeWaterJump();
    void getNearDownPos();
    void executeDamage();
    void setMidnaBindInit(cXyz*);
    void setMidnaBindLevel(int);
    void setWolfLockEffect();
    void initDownToWater();
    void calcDownToWater();
    void executeDown();
    void setCreateDrop();
    void executeDeath();
    void demo_skip(int);
    static int DemoSkipCallBack(void*, int);
    void calcLakeDemoPlayerPos();
    void executeLakeDemo();
    void executeStartDemo();
    bool checkStartBattleDemo();
    void executeBattleDemo();
    void action();
    void mtx_set();
    void getBellyBitePos(cXyz*);
    int getDownLockPoint();
    void setAttentionPos();
    void cc_set();
    int execute();
    int _delete();
    int CreateHeap();
    cPhs_Step create();

    int getMaxLockAttack() { return 6; }
    u8 getSwitchBit() { return mSwitchBit; }

    /* 0x05AC */ request_of_phase_process_class mPhase;
    /* 0x05B4 */ mDoExt_invisibleModel mInvisModel;
    /* 0x05BC */ mDoExt_McaMorfSO* mpModelMorf;
    /* 0x05C0 */ mDoExt_brkAnm* mpBrkAnm;
    /* 0x05C4 */ Z2CreatureEnemy mSound;
    /* 0x0668 */ f32 field_0x668[6];
    /* 0x0680 */ int field_0x680[6];
    /* 0x0698 */ int field_0x698;
    /* 0x069C */ cXyz field_0x69c;
    /* 0x06A8 */ cXyz field_0x6a8;
    /* 0x06B4 */ int mAction;
    /* 0x06B8 */ int mMode;
    /* 0x06BC */ u32 mShadowKey;
    /* 0x06C0 */ u8 mSwitchBit;
    /* 0x06C1 */ u8 field_0x6c1;
    /* 0x06C4 */ f32 field_0x6c4;
    /* 0x06C8 */ f32 field_0x6c8;
    /* 0x06CC */ f32 field_0x6cc;
    /* 0x06D0 */ f32 field_0x6d0;
    /* 0x06D4 */ f32 field_0x6d4;
    /* 0x06D8 */ f32 field_0x6d8;
    /* 0x06DC */ f32 field_0x6dc;
    /* 0x06E0 */ f32 field_0x6e0;
    /* 0x06E4 */ s16 field_0x6e4;
    /* 0x06E6 */ s16 field_0x6e6;
    /* 0x06E8 */ s16 field_0x6e8;
    /* 0x06EA */ s16 field_0x6ea;
    /* 0x06EC */ int field_0x6ec;
    /* 0x06F0 */ int field_0x6f0;
    /* 0x06F4 */ int field_0x6f4;
    /* 0x06F8 */ int field_0x6f8;
    /* 0x06FC */ int field_0x6fc;
    /* 0x0700 */ int field_0x700;
    /* 0x0704 */ int field_0x704;
    /* 0x0708 */ int field_0x708;
    /* 0x070C */ int field_0x70c;
    /* 0x0710 */ u8 field_0x710;
    /* 0x0711 */ u8 field_0x711;
    /* 0x0712 */ u8 field_0x712;
    /* 0x0713 */ u8 field_0x713;
    /* 0x0714 */ u8 field_0x714;
    /* 0x0715 */ u8 field_0x715;
    /* 0x0716 */ u8 field_0x716;
    /* 0x0717 */ u8 field_0x717;
    /* 0x0718 */ u8 field_0x718;
    /* 0x0719 */ u8 field_0x719[0x71f - 0x719];
    /* 0x071F */ u8 field_0x71f;
    /* 0x0720 */ u8 field_0x720;
    /* 0x0721 */ u8 field_0x721;
    /* 0x0722 */ u8 field_0x722;
    /* 0x0723 */ u8 field_0x723;
    /* 0x0724 */ u8 field_0x724;
    /* 0x0725 */ u8 field_0x725;
    /* 0x0728 */ cXyz mDemoCamEye;
    /* 0x0734 */ cXyz mDemoCamCenter;
    /* 0x0740 */ cXyz field_0x740;
    /* 0x074C */ cXyz field_0x74c;
    /* 0x0758 */ f32 mDemoCamFovy;
    /* 0x075C */ f32 field_0x75c;
    /* 0x0760 */ s16 field_0x760;
    /* 0x0762 */ s16 field_0x762;
    /* 0x0764 */ u8 field_0x764;
    /* 0x0765 */ u8 field_0x765;
    /* 0x0768 */ Mtx field_0x768;
    /* 0x0798 */ dBgW* mpBgW;
    /* 0x079C */ dBgS_GndChk mGndChk;
    /* 0x07F0 */ dCcD_Stts mStts;
    /* 0x082C */ dCcD_Sph field_0x82c[2];
    /* 0x0A9C */ dCcD_Sph field_0xa9c;
    /* 0x0BD4 */ dCcD_Sph field_0xbd4[6];
    /* 0x1324 */ dCcD_Sph field_0x1324;
    /* 0x145C */ dCcU_AtInfo mAtInfo;
    /* 0x1480 */ u32 mElecParticles[4];
    /* 0x1490 */ u32 mMidnaBindParticles[3];
    /* 0x149C */ u8 field_0x149c[0x14d8 - 0x149c];
    /* 0x14D8 */ u32 mWaterParticles1[6];
    /* 0x14F0 */ u32 mWaterParticles2[7];
    /* 0x150C */ u32 mDownHamonParticles[2];
    /* 0x1514 */ u32 mBlurParticles[2];
    /* 0x151C */ u32 mDamageParticle;
    /* 0x1520 */ u8 field_0x1520;
};

STATIC_ASSERT(sizeof(daE_YMB_c) == 0x1524);

#endif /* D_A_E_YMB_H */
