summaryrefslogtreecommitdiff
path: root/include/d/actor/d_a_bomb.h
blob: 0f5b3a73468cca0c40091af41f171e5d696265cf (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#ifndef D_A_BOMB_H
#define D_A_BOMB_H

#include "f_op/f_op_actor.h"
#include "d/d_particle.h"
#include "d/d_bg_s_acch.h"
#include "d/d_cc_d.h"
#include "m_Do/m_Do_ext.h"

class daBomb_fuseSmokeEcallBack : public dPa_levelEcallBack {
public:
    daBomb_fuseSmokeEcallBack() {}
    ~daBomb_fuseSmokeEcallBack() {}
    
    void execute(JPABaseEmitter*) {}
    void executeAfter(JPABaseEmitter*);
    void draw(JPABaseEmitter*) {}
    
    void setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz*, s8) {
        mpPos = pos;
        mpEmitter = emitter;
    }

    /* 0x04 */ s16 field_0x04;
    /* 0x08 */ const cXyz* mpPos;
    /* 0x0C */ cXyz* field_0x0C;
    /* 0x10 */ cXyz* field_0x10;
    /* 0x14 */ JPABaseEmitter* mpEmitter;
}; // Size 0x18

class daBomb_fuseSparksEcallBack : public dPa_levelEcallBack {
public:
    daBomb_fuseSparksEcallBack() {}
    ~daBomb_fuseSparksEcallBack() {}
    
    void execute(JPABaseEmitter*);
    void draw(JPABaseEmitter*) {}

    void setup(JPABaseEmitter* emitter, const cXyz* pos, const csXyz*, s8) {
        mpPos = pos;
        mpEmitter = emitter;
    }

    /* 0x04 */ const cXyz* mpPos;
    /* 0x08 */ JPABaseEmitter* mpEmitter;
}; // Size 0x0C

class dBgS_BombAcch : public dBgS_Acch {
public:
    dBgS_BombAcch() { mbBombThrough = true; }
}; // Size 0x1C4


class daBomb_c : public fopAc_ac_c {
public:
    typedef bool(daBomb_c::*procFunc)();

    void draw_norm();
    void draw_nut();
    BOOL draw();
    bool checkExplodeCc_norm();
    bool checkExplodeCc_nut();
    bool checkExplodeCc_cannon();
    bool checkExplodeCc();
    bool checkExplodeTimer();
    bool checkExplode();
    bool checkExplodeBg_norm();
    bool checkExplodeBg_nut();
    bool checkExplodeBg_cannon();
    bool checkExplodeBg();
#if VERSION > VERSION_DEMO
    void water_tention();
#endif
    void posMoveF();
    void bgCrrPos();
    void bgCrrPos_lava();
    void bgCrrPos_water();
    bool chk_water_land();
    bool chk_water_in();
    bool chk_water_sink();
    bool chk_lava_hit();
    bool chk_dead_zone();
    void bound(f32);
    void set_real_shadow_flag();
    void setRoomInfo();
    void makeFireEffect(cXyz&, csXyz&);
    void makeWaterEffect();
    void setFuseEffect();
    void eff_explode_normal(const csXyz*);
    void eff_explode_cheap(const csXyz*);
    void eff_explode();
    BOOL procExplode_init();
    bool procExplode();
    bool procCarry_init();
    bool procCarry();
    bool procWait_init();
    bool procWait();
    bool waitState_cannon();
    void waitState_bomtyu();
    bool procSink_init();
    bool procSink();
    BOOL execute();
    void set_wind_vec();
    void anm_play_nut();
    void set_mtx();
    void init_mtx();
    void se_cannon_fly_set();
    void se_cannon_fly_stop();
    void eff_water_splash();
    bool bombDelete();
    BOOL createHeap();
    cPhs_State create();
    void create_init();

    enum State_e {
        STATE_0 = 0,
        STATE_1 = 1,
        STATE_2 = 2,
        STATE_3 = 3,
        STATE_4 = 4,
        STATE_5 = 5,
        STATE_6 = 6,
        STATE_7 = 7,
        STATE_8 = 8
    };

    enum Prm_e {
        PRM_STATE_W = 8,
        PRM_STATE_S = 0x00,

        PRM_CHEAP_EFF_W = 1,
        PRM_CHEAP_EFF_S = 0x10,

        PRM_ANGXZERO_W = 1,
        PRM_ANGXZERO_S = 0x11,
    
        PRM_VERSION_W = 1,
        PRM_VERSION_S = 0x1F,
    };

    struct Attr_c {
        const char* resName;
        u32 heapSize;
    };

    const Attr_c& attrType() const { return m_attrType[mType]; }

    s16 getBombRestTime();
    s16 getBombCheck_Flag();
    void setBombCheck_Flag();
    void setBombFire_ON();
    void setBombNoHit();
    void setBombOffCoSet();
    void setBombOnCoSet();
    void setBombNoEff();
    void setBombRestTime(s16 time);
    void setNoGravityTime(s16 time);
    static int prm_make(daBomb_c::State_e, bool, bool);
    bool chk_state(State_e) const;
    void change_state(State_e);
    int prm_get_state() const;
    bool get_explode_instant() const;
    bool prm_get_cheapEff() const;
    bool prm_get_angXZero() const;
    int prm_get_version() const;
    void _prm_chk_version() const;

private:
    /* 0x290 */ procFunc mFunc;
    /* 0x29C */ request_of_phase_process_class mPhase;
    /* 0x2A4 */ J3DModel* mpModel;
    /* 0x2A8 */ mDoExt_bckAnm mBck0;
    /* 0x2B8 */ mDoExt_bckAnm mBck1;
    /* 0x2C8 */ mDoExt_brkAnm mBrk0;
    /* 0x2E0 */ mDoExt_brkAnm mBrk1;
    /* 0x2F8 */ int mType;
    /* 0x2FC */ dBgS_BombAcch mAcch;
    /* 0x4C0 */ dBgS_AcchCir mCir;
    /* 0x500 */ dBgS_ObjGndChk_Yogan mGndChk;
    /* 0x554 */ f32 field_0x554;
    /* 0x558 */ f32 field_0x558;
#if VERSION > VERSION_DEMO
    /* 0x55C */ f32 field_0x55C;
#endif
    /* 0x560 */ bool field_0x560;
    /* 0x561 */ bool mbWaterIn;
    /* 0x562 */ u8 field_0x562;
    /* 0x564 */ dCcD_Stts mStts;
    /* 0x5A0 */ dCcD_Sph mSph;
    /* 0x6CC */ daBomb_fuseSmokeEcallBack mSmoke;
    /* 0x6E4 */ daBomb_fuseSparksEcallBack mSparks;
    /* 0x6F0 */ u8 field_0x6F0;
    /* 0x6F1 */ u8 field_0x6F1;
    /* 0x6F2 */ u8 mBombFire;
    /* 0x6F3 */ u8 field_0x6F3;
    /* 0x6F4 */ u8 field_0x6F4;
    /* 0x6F5 */ u8 field_0x6F5;
    /* 0x6F6 */ u8 field_0x6F6;
    /* 0x6F7 */ u8 field_0x6F7;
    /* 0x6F8 */ s32 mInitialState;
    /* 0x6FC */ s16 mRestTime;
    /* 0x6FE */ s16 field_0x6FE;
    /* 0x700 */ s16 mNoGravityTime;
    /* 0x702 */ s16 field_0x702;
    /* 0x704 */ cXyz mFusePos; //should figure out what this 3 cXyz thing really is
    /* 0x710 */ cXyz mFusePos2; //seems like several particle structures use it and a couple construct it as a TVec3<f32> array
    /* 0x71C */ cXyz mFusePos3; //others have no special construction, and it gets passed to functions that take cXyz sometimes
    /* 0x728 */ LIGHT_INFLUENCE mPntLight;
    /* 0x748 */ WIND_INFLUENCE mPntWind;
    /* 0x774 */ u8 field_0x774;
    /* 0x778 */ f32 field_0x778;
    /* 0x77C */ u8 field_0x77C;
    /* 0x77D */ u8 field_0x77D;
    /* 0x77E */ u8 field_0x77E;
    /* 0x77F */ u8 field_0x77F;
    /* 0x780 */ u8 field_0x780;
    /* 0x781 */ u8 field_0x781;
    /* 0x782 */ u8 field_0x782;
    /* 0x784 */ int field_0x784;
    /* 0x788 */ cXyz mWindVec;
    /* 0x794 */ u8 field_0x794[0x7C4 - 0x794];
    /* 0x7C4 */ int mMassCounter;
    /* 0x7C8 */ int field_0x7C8;
    
    static const Attr_c m_attrType[];
}; // Size 0x7CC

#endif /* D_A_BOMB_H */