summaryrefslogtreecommitdiff
path: root/include/d/actor/d_a_obj_ajav.h
blob: d29b5bb306ed9793eaeb6f6dec75cf39c94d03cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#ifndef D_A_OBJ_AJAV_H
#define D_A_OBJ_AJAV_H

#include "d/d_bg_w.h"
#include "d/d_cc_d.h"
#include "d/d_com_inf_game.h"
#include "f_op/f_op_actor.h"
#include "f_op/f_op_actor_mng.h"

namespace daObjAjav {
    static void daObjAjav_make_splash(cXyz, f32);
    static BOOL check_angle(s16*, s16);
    static void daObjAjav_limit_angle(s16*, s16);
    static csXyz daObjAjav_get_rot_speed(cXyz, cXyz, s16);
    
    class Act_c;
    
    class Part_c {
    public:
        typedef void(Part_c::*daObjAjavPartCallback)(daObjAjav::Act_c*);
    public:
        bool checkExeProc(daObjAjavPartCallback i_proc) { return mExeProc == i_proc; }
        void draw(daObjAjav::Act_c* i_actor) {  (this->*mDrawProc)(i_actor); }
        void execute(daObjAjav::Act_c* i_actor) { (this->*mExeProc)(i_actor); }
        void setDrawProc(daObjAjavPartCallback i_drawProc) { mDrawProc = i_drawProc; }
        void setExeProc(daObjAjavPartCallback i_exeProc) { mExeProc = i_exeProc; }
        inline void set_se_pos(cXyz i_pos); // weak but not inlined
        
        void make_hamon(cXyz, f32);
        void no_proc(daObjAjav::Act_c*);
        void init_data(cXyz, cXyz, dKy_tevstr_c*, cXyz*);
        BOOL set_mdl_area(const char*, int, u32);
        void init_mtx(cXyz, csXyz, cXyz);
        void set_flaw_mtx(cXyz, csXyz);
        void set_fall_mtx(cXyz, csXyz);
        void fall_init(cXyz, csXyz, s16, u16);
        void fall_0(daObjAjav::Act_c*);
        void fall_1(daObjAjav::Act_c*);
        void flaw(daObjAjav::Act_c*);
        void draw_normal(daObjAjav::Act_c*);
        void draw_flashing(daObjAjav::Act_c*);
        void draw_flashing_shy(daObjAjav::Act_c*);
        void draw_flashing_normal(daObjAjav::Act_c*);
        void draw_shy(daObjAjav::Act_c*);
        void make_fall_rock(BOOL);
    public:
        /* 0x00 */ cXyz mCenterPos;
        /* 0x0C */ cXyz mCenterToOriginTrans;
        /* 0x18 */ cXyz mRockDisplacement;
        /* 0x24 */ cXyz mRockDisplacementRate;
        /* 0x30 */ cXyz mFlawPos;
        /* 0x3C */ csXyz mAccumulatedRotation;
        /* 0x42 */ csXyz mRotationSpeed;
        /* 0x48 */ cXyz mSePos;
        /* 0x54 */ u16 mTimerTrigger;
        /* 0x56 */ u16 mTimer; // also used as a vertical velocity in fall_1
        /* 0x58 */ s16 mAngleLimit;
        /* 0x5A */ bool mbHasSplashed;
        /* 0x5B */ u8 mB8[0x6C - 0x5B];
        /* 0x6C */ cXyz mRockParticlePos;
        /* 0x78 */ J3DModel* mpModel;
        /* 0x7C */ dKy_tevstr_c* mpTevStr;
        /* 0x80 */ daObjAjavPartCallback mExeProc;
        /* 0x8C */ daObjAjavPartCallback mDrawProc;
    };  // Size: 0x98


    class Act_c : public fopAc_ac_c {
    public:
        enum {
            STATUS_MAX = 4
        };
    public:
        BOOL check_ev() { return dComIfGs_isEventBit(dSv_event_flag_c::ENDLESS_NIGHT); }
        BOOL check_sw(int sw_no) { return dComIfGs_isSwitch(sw_no, fopAcM_GetHomeRoomNo(this)); }
        void on_sw(int sw_no) { dComIfGs_onSwitch(sw_no, fopAcM_GetHomeRoomNo(this)); }
        
        // Fake inline method to match _execute, this isn't in the debug maps but is needed
        // in the call to set_hamon.
        // The stone is 6 fragments arranged in a 3x2 (row x col) grid, so
        // this gets the starting index of the n'th row.
        int get_rock_row() { return M_status << 1; }

        static BOOL solidHeapCB(fopAc_ac_c*);
        BOOL create_heap();
        cPhs_State _create();
        bool _delete();
        void init_mtx();
        void set_tex();
        void set_co_offset();
        BOOL check_all_wait();
        BOOL check_end();
        void to_broken();
        BOOL damage_part();
        void make_shot_rock();
        void make_hamon2(cXyz, float);
        void set_hamon(float);
        bool _execute();
        bool _draw();
    
    public:
        static const char M_arcname[];
    public:
        /* 0x290 */ u32 mSwNo;
        /* 0x294 */ request_of_phase_process_class mPhs;
        /* 0x29C */ dCcD_Stts mSphStts;
        /* 0x2D8 */ dCcD_Sph mSph;
        /* 0x404 */ cXyz mSphCoOffset;
        /* 0x410 */ dCcD_Stts mCylStts;
        /* 0x44C */ dCcD_Cyl mCyl;
        /* 0x57C */ dCcD_Stts mHintCylStts[2];
        /* 0x5F4 */ dCcD_Cyl mHintCyls[2];
        /* 0x854 */ Mtx mMtx;
        /* 0x884 */ u8 m884[0x890 - 0x884];
        /* 0x890 */ Part_c mRockParts[6];
        /* 0xC20 */ s16 mEventIdx;
        /* 0xC22 */ u8 M_status;
        /* 0xC23 */ bool mbResLoaded;
        /* 0xC24 */ u8 mActionIdx;
        /* 0xC25 */ u8 mC25[0xC26 - 0xC25];
        /* 0xC26 */ u16 mCutsceneEndDelay;
        /* 0xC28 */ u8 mHintCylHits;
        /* 0xC29 */ u8 mC29[0xC2C - 0xC29];
        /* 0xC2C */ dBgW* mpBgW;
    };  // Size: 0xC30
};

#endif /* D_A_OBJ_AJAV_H */