#ifndef D_A_CANON_H
#define D_A_CANON_H

#include "f_op/f_op_actor.h"
#include "d/d_cc_d.h"

class dDlst_2DObject_c;
class dDlst_2DBattery_c;

class daCanon_c : public fopAc_ac_c {
    typedef void (daCanon_c::*Func)();

public:
    inline cPhs_State _create();
    inline bool _delete();
    inline bool _draw();
    inline bool _execute();
    bool checkProcess(Func func) { return m290 == func; }
    void setProcess(Func func) { m290 = func; }

    void set_mtx();
    void bul_set_mtx(cXyz*);
    cXyz getGridPos(int, int);
    cXyz getBulEndPos(short, short);
    BOOL createCheck(int, int, int);
    void createTargetObj();
    void breakAllObj();
    void makeFireEffect(cXyz&, csXyz&, int);
    void wait_proc_init();
    void wait_proc();
    void game_start_proc_init();
    void game_start_proc();
    void game_proc_init();
    void game_proc();
    void fire_proc_init();
    void fire_proc();
    void pause_proc_init();
    void pause_proc();
    void end_proc_init();
    void end_proc();
    void PadMove();
    BOOL CreateHeap();
    void GameInfo2DDraw();
    
    static daCanon_c* getCanonPtr() { return canon_p; }
    static daCanon_c* canon_p;

    static const char M_arcname[];

public:
    /* 0x290 */ Func m290;
    /* 0x29C */ dCcD_Stts mStts1;
    /* 0x2D8 */ dCcD_Cyl mCyl1;
    /* 0x408 */ dCcD_Stts mStts2;
    /* 0x444 */ dCcD_Cyl mCyl2;
    /* 0x574 */ request_of_phase_process_class mPhase;
    /* 0x57C */ J3DModel* mpModel1;
    /* 0x580 */ J3DModel* mpModel2;
    /* 0x584 */ dDlst_2DObject_c* m584[10];
    /* 0x5AC */ dDlst_2DObject_c* m5AC[5];
    /* 0x5C0 */ dDlst_2DBattery_c* m5C0;
    /* 0x5C4 */ Mtx m5C4;
    /* 0x5F4 */ u8 m5F4[10];
    /* 0x600 */ fpc_ProcID m600[5];
    /* 0x614 */ cXyz m614;
    /* 0x620 */ cXyz m620;
    /* 0x62C */ cXyz m62C;
    /* 0x638 */ f32 m638;
    /* 0x63C */ cXyz m63C;
    /* 0x648 */ csXyz m648;
    /* 0x64E */ s16 m64E;
    /* 0x650 */ s16 m650;
    /* 0x652 */ s16 m652;
    /* 0x654 */ s16 m654;
    /* 0x656 */ s16 m656;
    /* 0x658 */ u8 field_658[0x65A - 0x658];
    /* 0x65A */ s16 m65A;
    /* 0x65C */ s16 m65C;
    /* 0x65E */ s16 m65E;
    /* 0x660 */ s16 m660;
    /* 0x662 */ u8 field_662[0x664 - 0x662];
    /* 0x664 */ bool m664;
}; // size = 0x668

#endif /* D_A_CANON_H */
