#ifndef D_A_E_SW_H
#define D_A_E_SW_H

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

/**
 * @ingroup actors-enemies
 * @class daE_SW_c
 * @brief Moldorm
 * 
 * @details 
 * 
 */
class daE_SW_c : public fopEn_enemy_c {
public:
    typedef void (daE_SW_c::*actionFunc)();

    void bckSet(int, f32, u8, f32);
    int draw();
    void setBeforeJumpEffect();
    void setJumpEffect();
    void setSmokeEffect();
    void setDiveEffect();
    void setHideEffect();
    void setActionMode(s16, s16);
    fopAc_ac_c* search_bomb();
    BOOL bomb_check();
    bool setModeBack();
    void checkFall();
    bool checkBeforeWall();
    void executeWait();
    int checkRunChase();
    void executeChaseSlow();
    void executeChaseFast();
    void executeBomb();
    void executeAttack();
    void executeHook();
    void executeMoveOut();
    void executeChance();
    void executeDive();
    void executeDamage();
    void executeDie();
    void executeMaster();
    bool checkSuddenAttack(int);
    void executeSuddenAttack();
    void executeFall();
    void action();
    void mtx_set();
    void cc_set();
    void damage_check();
    void checkGroundSand();
    int execute();
    int _delete();
    int CreateHeap();
    cPhs_Step create();
    void d_setAction(void (daE_SW_c::*)());
    void d_checkFall();
    void d_damage_check();
    void d_action();
    bool d_bomb_check();
    void d_bm_chase();
    void d_wait();
    bool d_chaseCheck();
    void d_chase();
    void d_attk();
    void d_chance();
    void d_chance2();
    void d_dive();
    void d_damage();
    void d_die();
    void d_hook();
    void d_fall();
    int d_execute();

    bool d_checkAction(void (daE_SW_c::*action)()) {
        return field_0xafc == action;
    }

    bool d_checkOldAction(void (daE_SW_c::*action)()) {
        return field_0xb0c == action;
    }
private:
    /* 0x5AC */ request_of_phase_process_class mPhase;
    /* 0x5B4 */ mDoExt_McaMorfSO* mpModelMorf;
    /* 0x5B8 */ Z2CreatureEnemy mSound;
    /* 0x65C */ cXyz field_0x65c;
    /* 0x668 */ cXyz field_0x668;
    /* 0x674 */ cXyz field_0x674;
    /* 0x680 */ s16 mMoveMode;
    /* 0x682 */ s16 mActionMode;
    /* 0x684 */ u8 field_0x684;
    /* 0x688 */ fpc_ProcID field_0x688;
    /* 0x68C */ u8 field_0x68c;
    /* 0x690 */ f32 field_0x690;
    /* 0x694 */ u8 field_0x694;
    /* 0x695 */ u8 field_0x695;
    /* 0x696 */ u8 field_0x696;
    /* 0x697 */ u8 field_0x697;
    /* 0x698 */ int field_0x698;
    /* 0x69C */ s16 field_0x69c;
    /* 0x69E */ s16 field_0x69e;
    /* 0x6A0 */ s16 field_0x6a0;
    /* 0x6A2 */ s16 field_0x6a2;
    /* 0x6A4 */ s16 field_0x6a4;
    /* 0x6A8 */ cXyz field_0x6a8;
    /* 0x6B4 */ f32 field_0x6b4;
    /* 0x6B8 */ f32 field_0x6b8;
    /* 0x6BC */ s16 field_0x6bc;
    /* 0x6BE */ u8 field_0x6be[0x6c8 - 0x6be];
    /* 0x6C8 */ f32 field_0x6c8;
    /* 0x6CC */ s16 field_0x6cc;
    /* 0x6D0 */ f32 field_0x6d0;
    /* 0x6D4 */ f32 field_0x6d4;
    /* 0x6D8 */ f32 field_0x6d8;
    /* 0x6DC */ f32 field_0x6dc;
    /* 0x6E0 */ u32 mShadowKey;
    /* 0x6E4 */ u8 field_0x6e4;
    /* 0x6E5 */ u8 field_0x6e5;
    /* 0x6E6 */ u8 field_0x6e6;
    /* 0x6E7 */ u8 field_0x6e7;
    /* 0x6E8 */ u8 field_0x6e8;
    /* 0x6E9 */ u8 field_0x6e9;
    /* 0x6EA */ s16 field_0x6ea;
    /* 0x6EC */ s16 field_0x6ec;
    /* 0x6EE */ s16 field_0x6ee;
    /* 0x6F0 */ s16 field_0x6f0;
    /* 0x6F2 */ s16 field_0x6f2;
    /* 0x6F4 */ u8 field_0x6f4[0x6f6 - 0x6f4];
    /* 0x6F6 */ s16 field_0x6f6;
    /* 0x6F8 */ dBgS_AcchCir field_0x6f8[2];
    /* 0x778 */ dBgS_ObjAcch mBgc;
    /* 0x950 */ dCcD_Stts mStts;
    /* 0x98C */ dCcD_Sph field_0x98c;
    /* 0xAC4 */ dCcU_AtInfo mAtInfo;
    /* 0xAE8 */ u32 field_0xae8;
    /* 0xAEC */ u32 field_0xaec;
    /* 0xAF0 */ u32 field_0xaf0;
    /* 0xAF4 */ u32 field_0xaf4;
    /* 0xAF8 */ u8 field_0xaf8;
    /* 0xAF9 */ u8 field_0xaf9;
    /* 0xAFC */ actionFunc field_0xafc;
    /* 0xB0C */ actionFunc field_0xb0c;
    /* 0xB14 */ bool field_0xb14;
};

STATIC_ASSERT(sizeof(daE_SW_c) == 0xb18);

#endif /* D_A_E_SW_H */
