summaryrefslogtreecommitdiff
path: root/include/d/actor/d_a_obj_pumpkin.h
blob: b1b36bfa1fe2149334dd0474319d475b5c5dbf09 (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
#ifndef D_A_OBJ_PUMPKIN_H
#define D_A_OBJ_PUMPKIN_H

#include "f_op/f_op_actor_mng.h"
#include "d/d_bg_s_acch.h"
#include "d/d_cc_d.h"
#include "d/actor/d_a_player.h"

struct daObj_Pumpkin_HIOParam {
    /* 0x00 */ f32 featured_offset;
    /* 0x04 */ f32 gravity;
    /* 0x08 */ f32 scale;
    /* 0x0C */ f32 real_shadow_size;
    /* 0x10 */ f32 weight;
    /* 0x14 */ f32 height;
    /* 0x18 */ f32 knee_length;
    /* 0x1C */ f32 width;
    /* 0x20 */ f32 fire_rate;
    /* 0x24 */ f32 launch_angle;
    /* 0x28 */ f32 floating_offset;
    /* 0x2C */ s16 hold_on;
    /* 0x2E */ s16 pull_sound_delay;
    /* 0x30 */ s16 growth_time_1;
    /* 0x32 */ s16 growth_time_2;
};

class daObj_Pumpkin_Param_c {
public:
    virtual ~daObj_Pumpkin_Param_c() {}

    static const daObj_Pumpkin_HIOParam m;
};

#if DEBUG
class daObj_Pumpkin_HIO_c : public mDoHIO_entry_c {
public:
    daObj_Pumpkin_HIO_c();

    void listenPropertyEvent(const JORPropertyEvent*);
    void genMessage(JORMContext*);

    daObj_Pumpkin_HIOParam m;
};

#define OBJ_PUMPKIN_HIO_CLASS daObj_Pumpkin_HIO_c
#else
#define OBJ_PUMPKIN_HIO_CLASS daObj_Pumpkin_Param_c
#endif

/**
 * @ingroup actors-objects
 * @class daObj_Pumpkin_c
 * @brief Ordon Village Pumpkin
 *
 * @details
 *
 */
class daObj_Pumpkin_c : public fopAc_ac_c {
private:
    /* 0x568 */ OBJ_PUMPKIN_HIO_CLASS* mpHIO;
    /* 0x56C */ request_of_phase_process_class mPhaseReq;
    /* 0x574 */ J3DModel* mpModel;
    /* 0x578 */ dBgS_ObjAcch mObjAcch;
    /* 0x750 */ dCcD_Stts mStts;
    /* 0x78C */ dBgS_AcchCir mAcchCir;
    /* 0x7CC */ cBgS_GndChk mGndChk;
    /* 0x808 */ dCcD_Cyl mCyl0;
    /* 0x944 */ dCcD_Cyl mCyl1;
    /* 0xA80 */ daPy_boomerangMove_c mBoomerangMove;
    /* 0xA8C */ cM3dGLin mLin;
    /* 0xAA8 */ dBgS_LinChk mLinChk;
    /* 0xB18 */ f32 mPumpkinScale;
    /* 0xB1C */ u8 mType;
    /* 0xB20 */ cXyz field_0xB20;
    /* 0xB2C */ cXyz field_0xB2C;
    /* 0xB38 */ csXyz field_0xB38;
    /* 0xB40 */ fpc_ProcID mItemProcId;
    /* 0xB44 */ int field_0xB44;
    /* 0xB48 */ int field_0xB48;
    /* 0xB4C */ int field_0xB4C;
    /* 0xB50 */ int field_0xB50;
    /* 0xB54 */ int field_0xB54;
    /* 0xB58 */ int field_0xB58;
    /* 0xB5C */ f32 field_0xB5C;
    /* 0xB60 */ f32 field_0xB60;
    /* 0xB64 */ f32 mWaterY;
    /* 0xB68 */ f32 field_0xB68;
    /* 0xB6C */ u8 field_0xB6C[0xB70 - 0xB6C];
    /* 0xB70 */ f32 field_0xB70;
    /* 0xB74 */ f32 field_0xB74;
    /* 0xB78 */ s16 field_0xB78;
    /* 0xB7A */ s16 field_0xB7A;
    /* 0xB7C */ s16 field_0xB7C;
    /* 0xB7E */ s16 field_0xB7E;
    /* 0xB80 */ s16 field_0xB80;
    /* 0xB82 */ u8 field_0xB82[0xB88 - 0xB82];
    /* 0xB88 */ u32 mWaterPrtcls[4];
    /* 0xB98 */ u32 mHamonPrtcl;
    /* 0xB9C */ u8 field_0xB9C[0xBA0 - 0xB9C];
    /* 0xBA0 */ u32 mSmokePrtcl1;
    /* 0xBA4 */ u32 mSmokePrtcl2;
    /* 0xBA8 */ u8 field_0xBA8;
    /* 0xBA9 */ u8 field_0xBA9;
    /* 0xBAA */ u8 field_0xBAA;
    /* 0xBAB */ u8 field_0xBAB;
    /* 0xBAC */ u8 field_0xBAC;
    /* 0xBAD */ u8 field_0xBAD;
    /* 0xBAE */ u8 field_0xBAE;
    /* 0xBAF */ u8 field_0xBAF;
    /* 0xBB0 */ u8 field_0xBB0;
    /* 0xBB1 */ u8 field_0xBB1;
    /* 0xBB2 */ u8 field_0xBB2;
    /* 0xBB3 */ u8 field_0xbb3;
    /* 0xBB4 */ u8 field_0xbb4;

public:
    virtual ~daObj_Pumpkin_c();
    int create();
    int CreateHeap();
    int Delete();
    int Execute();
    int Draw();
    static int createHeapCallBack(fopAc_ac_c*);
    int isDelete();
    void setEnvTevColor();
    void setRoomNo();
    void reset();
    void setMtx();
    s16 calcRollAngle(s16, int);
    int getWallAngle(s16, s16*);
    void setSmokePrtcl();
    void setWaterPrtcl();
    void setHamonPrtcl();
    void crash();

    void setMtx(MtxP mtx) {
        cXyz newPos;
        field_0xbb3 = 1;
        mDoMtx_stack_c::copy(mtx);
        mDoMtx_stack_c::multVecZero(&newPos);
        current.pos = newPos;
        old.pos = current.pos;
        mpModel->setBaseTRMtx(mtx);
    }

    int getItemTableNo() {
        u8 prm = fopAcM_GetParam(this) & 0xFF;
        if (prm == 0xFF) {
            return -1;
        }

        return prm;
    }

    u8 getType() {
        u8 prm = (fopAcM_GetParam(this) & 0xFF00) >> 8; 
        switch (prm) {
        case 0:
            return 0;
        case 1:
            return 1;
        case 2:
            return 2;
        case 3:
            return 3;
        default:
            return 0;
        }
    }

    u8 getProcType() {
        u8 prm = (fopAcM_GetParam(this) & 0xF0000000) >> 0x1C;
        if (prm == 0xF) {
            return 0;
        }

        return prm;
    }

    void popup(f32 i_f0, f32 i_deg, cXyz* ip_vec) {
        if (ip_vec != NULL) {
            current.pos = *ip_vec;
            old.pos = current.pos;
        }

        s16 temp_r30 = cM_deg2s(i_deg);
        speed.setall(0.0f);
        speed.y = i_f0 * cM_ssin(temp_r30);
        speedF = i_f0 * cM_scos(temp_r30);
        field_0xB50 = 6;
        field_0xB7C = 0x4000;
        field_0xBAD = 1;
        field_0xB74 = 0.0f;
    }
};

STATIC_ASSERT(sizeof(daObj_Pumpkin_c) == 0xbbc);


#endif /* D_A_OBJ_PUMPKIN_H */