#ifndef D_A_BOMB_2_H
#define D_A_BOMB_2_H

#include "f_op/f_op_actor_mng.h"
#include "d/d_a_obj.h"
#include "d/d_particle.h"
#include "d/d_bg_s_acch.h"
#include "d/d_cc_d.h"
#include "d/actor/d_a_bomb.h"
#include "m_Do/m_Do_ext.h"
#include "m_Do/m_Do_ext.h"

namespace daBomb2 {
    class FuseSmokeCB_c : public dPa_levelEcallBack {
    public:
        FuseSmokeCB_c() {}
        virtual ~FuseSmokeCB_c();

        
        void setOldPosP(const cXyz*, const cXyz*);
        void deleteCallBack();

        //void init(JPABaseEmitter*);
        void execute(JPABaseEmitter*);
        void executeAfter(JPABaseEmitter*);
        void draw(JPABaseEmitter*);

        void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8);

        /* 0x04 */ s16 field_0x04;
        /* 0x08 */ const cXyz* mpPos;
        /* 0x0C */ const cXyz* field_0x0C;
        /* 0x10 */ const cXyz* field_0x10;
        /* 0x14 */ JPABaseEmitter* mpEmitter;
    }; // Size 0x18
    
    class FuseSparksCB_c : public dPa_levelEcallBack {
    public:
        FuseSparksCB_c() {}
        virtual ~FuseSparksCB_c();

        void deleteCallBack();

        //void init(JPABaseEmitter*);
        void execute(JPABaseEmitter*);
        //void executeAfter(JPABaseEmitter*);
        void draw(JPABaseEmitter*);

        void setup(JPABaseEmitter*, cXyz const*, csXyz const*, s8);

        /* 0x04 */ const cXyz* mpPos;
        /* 0x08 */ JPABaseEmitter* mpEmitter;
    }; // Size 0x0C
    
    class Env_c {
    public:
        void set(const cXyz&);
        void clean();
        bool is_end() const;
        void proc(const cXyz&);

    private:
        /* 0x00 */ LIGHT_INFLUENCE mPntLight;
        /* 0x20 */ WIND_INFLUENCE mPntWind;
        /* 0x4C */ u8 field_0x4C;
        /* 0x50 */ f32 field_0x50;
    }; // Size 0x54

    class Act_c : public fopAc_ac_c { 
    public:
        Act_c();
        
        //d_a_bomb_static functions
        void remove_fuse_effect();
        void set_time(int);
        int get_time() const;
        bool chk_eat() const;
        void set_eat();
        void set_no_hit();
        bool chk_explode();

        static int solidHeapCB(fopAc_ac_c*);
        bool create_heap_nut();
        bool create_heap();
        void crr_init();
        void cc_init();
        void start_explode_instant();
        void start_explode_interval();
        void start_carry();
        void start_proc_call();
        void create_init();
        int _create();
        bool _delete();
        void set_mtx();
        void init_mtx();
        void cc_set();
        void camera_lockoff() const;
        void posMoveF();
        void bgCrrPos();
        void bgCrrPos_lava();
        void bgCrrPos_water();
        bool chk_water_in() const;
        bool chk_lava_in() const;
        void setRoomInfo();
        void bound(float);
        void set_nut_exp_interval();
        void anm_play();
        void set_wind_vec();
        void eff_explode();
        void eff_explode_normal(const csXyz*);
        void eff_explode_water();
        void eff_fuse_init();
        void eff_fuse_start();
        void eff_fuse_move();
        void eff_fuse_end();
        void eff_water_splash();
        void se_fall_water();
        void se_explode();
        void se_explode_water();
        void se_ignition();
        void set_sound_env(int, int);
        bool chk_exp_cc_nut();
        bool chk_exp_cc();
        bool chk_exp_bg_nut();
        bool chk_exp_bg();
        bool chk_exp_timer();
        bool chk_sink_bg_nut();
        bool chk_sink_bg();
        bool chk_exp_pre();
        bool chk_exp_post();
        bool chk_sink_post();
        void set_real_shadow_flag();
        void carry_fuse_start();
        void on_carry();
        void off_carry();
        void mode_wait_init();
        void mode_wait();
        void mode_carry_init();
        void mode_carry();
        void mode_explode_init();
        void mode_explode();
        void mode_sink_init();
        void mode_sink();
        void mode_proc_call();
        void tensor_init();
        void vib_init();
        void vib_proc();
        void set_vib_tensor();
        void tensor_wait();
        void tensor_wait_drop();
        void tensor_wait_ground();
        void tensor_carry();
        void tensor_explode();
        void tensor_sink();
        void tensor_proc_call();
        bool _execute();
        bool is_draw();
        void draw_nut();
        void draw_shadow();
        bool _draw();

        enum Prm_e {
            PRM_1_W = 1,
            PRM_1_S = 0x08,

            PRM_2_W = 2,
            PRM_2_S = 0x00,
        };

    private: 
        //some of these might need updating since i initially copied them from daBomb_c
        /* 0x290 */ request_of_phase_process_class mPhs;
        /* 0x298 */ J3DModel* mpModel;
        /* 0x29C */ mDoExt_bckAnm mBck0;
        /* 0x2AC */ mDoExt_brkAnm mBrk0;
        /* 0x2C4 */ dBgS_BombAcch mAcch;
        /* 0x488 */ dBgS_AcchCir mCir;
        /* 0x4C8 */ dBgS_ObjGndChk_Yogan mGndChk;
        /* 0x51C */ f32 field_0x51C;
        /* 0x520 */ f32 field_0x520;
        /* 0x524 */ bool field_0x524;
        /* 0x525 */ bool mbWaterIn;
        /* 0x526 */ u8 field_0x526;
        /* 0x528 */ f32 field_0x528;
        /* 0x52C */ dCcD_Stts mStts;
        /* 0x568 */ dCcD_Sph mSph;
        /* 0x694 */ int field_0x694;
        /* 0x698 */ int field_0x698;

        /* 0x69C */ FuseSmokeCB_c mSmoke;
        /* 0x6B4 */ FuseSparksCB_c mSparks;
        /* 0x6C0 */ cXyz field_0x6C0;
        /* 0x6CC */ cXyz field_0x6CC;
        /* 0x6D8 */ cXyz field_0x6D8;
        /* 0x6E4 */ Env_c mEnv;
        /* 0x738 */ int field_0x738;
        /* 0x73C */ int field_0x73C;
        /* 0x740 */ u8 field_0x740;
        /* 0x741 */ u8 field_0x741;
        /* 0x742 */ u8 field_0x742;
        /* 0x743 */ u8 field_0x743;
        /* 0x744 */ bool field_0x744;
        /* 0x745 */ bool field_0x745;
        /* 0x748 */ cXyz field_0x748;
        /* 0x754 */ Mtx field_0x754;
        /* 0x784 */ f32 field_0x784;
        /* 0x788 */ f32 field_0x788;
        /* 0x78C */ f32 field_0x78C;
        /* 0x790 */ f32 field_0x790;
        /* 0x794 */ f32 field_0x794;
        /* 0x798 */ f32 field_0x798;
        /* 0x79C */ f32 field_0x79C;
        /* 0x7A0 */ f32 field_0x7A0;
        /* 0x7A4 */ f32 field_0x7A4;
        /* 0x7A8 */ s32 field_0x7A8;

        static dCcD_SrcSph M_sph_src;
    }; // Size 0x7AC
}

#endif /* D_A_BOMB_2_H */
