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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
#ifndef D_A_OBJ_BASE_H
#define D_A_OBJ_BASE_H
#include "c/c_math.h"
#include "common.h"
#include "d/a/d_a_base.h"
#include "d/a/d_a_salbage_if.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/c/c_m3d_g_aab.h"
#include "d/d_jnt_col.h"
#include "d/d_light_env.h"
#include "d/d_linkage.h"
#include "egg/math/eggMath.h"
#include "m/m3d/m_shadow.h"
#include "m/m3d/m_smdl.h"
#include "m/m_angle.h"
#include "m/m_color.h"
#include "m/m_mtx.h"
#include "m/m_vec.h"
#include "m/types_m.h"
#include "nw4r/math/math_arithmetic.h"
// Ghidra: ActorObjectBase
// size: 0x330
// vtable: 0x805015b8
// non-official name
class dAcObjBase_c : public dAcBase_c {
public:
enum ObjProperties_e {
OBJ_PROP_0x1 = (1 << 0),
OBJ_PROP_0x2 = (1 << 1),
OBJ_PROP_0x4 = (1 << 2),
OBJ_PROP_0x8 = (1 << 3),
OBJ_PROP_0x10 = (1 << 4),
OBJ_PROP_0x20 = (1 << 5),
OBJ_PROP_0x40 = (1 << 6),
OBJ_PROP_0x80 = (1 << 7),
OBJ_PROP_0x100 = (1 << 8),
OBJ_PROP_0x200 = (1 << 9),
OBJ_PROP_0x400 = (1 << 10),
OBJ_PROP_0x800 = (1 << 11),
OBJ_PROP_0x1000 = (1 << 12),
OBJ_PROP_0x2000 = (1 << 13),
OBJ_PROP_0x4000 = (1 << 14),
OBJ_PROP_0x8000 = (1 << 15),
OBJ_PROP_0x10000 = (1 << 16),
OBJ_PROP_0x20000 = (1 << 17),
OBJ_PROP_0x40000 = (1 << 18),
OBJ_PROP_0x80000 = (1 << 19),
OBJ_PROP_0x100000 = (1 << 20),
OBJ_PROP_0x200000 = (1 << 21),
OBJ_PROP_0x400000 = (1 << 22),
OBJ_PROP_0x800000 = (1 << 23),
OBJ_PROP_0x1000000 = (1 << 24),
OBJ_PROP_0x2000000 = (1 << 25),
OBJ_PROP_0x4000000 = (1 << 26),
OBJ_PROP_0x8000000 = (1 << 27),
OBJ_PROP_0x10000000 = (1 << 28),
OBJ_PROP_0x20000000 = (1 << 29),
OBJ_PROP_0x40000000 = (1 << 30),
OBJ_PROP_0x80000000 = (1 << 31),
};
public:
/* 0x0FC */ f32 mYOffset;
/* 0x100 */ f32 field_0x100;
/* 0x104 */ f32 unkfloat;
/* 0x108 */ char field_0x108[12];
/* 0x114 */ u16 mTargetFiTextID;
/* 0x116 */ u8 mTargetFiRelated;
/* 0x118 */ mVec3_c mOldPosition;
/* 0x124 */ mVec3_c mPositionCopy2;
/* 0x130 */ mVec3_c mPositionCopy3;
/* 0x13C */ mAng3_c mAngle;
/* 0x144 */ f32 mSpeed;
/* 0x148 */ f32 mAcceleration;
/* 0x14C */ f32 mMaxSpeed;
/* 0x150 */ mVec3_c mVelocity;
/* 0x15C */ mMtx_c mWorldMtx;
/* 0x18C */ cM3dGAab mBoundingBox;
/* 0x1A4 */ f32 mCullingDistance;
/* 0x1A8 */ f32 field_0x1A8;
/* 0x1AC */ u32 mObjectActorFlags;
/* 0x1B0 */ f32 field_0x1B0;
/* 0x1B4 */ mVec3_c field_0x1B4;
/* 0x1C0 */ cCcD_Stts mStts;
/* 0x1FC */ mVec3_c mStartingPos;
/* 0x208 */ mAng3_c mStartingRot;
/* 0x210 */ dLinkage_c mLinkage;
/* 0x2B8 */ u32 field_0x2B8;
/* 0x2BC */ ActorLighting mLightingInfo;
/* 0x32C */ dSalvageIf_c *mpSalvageIf;
public:
mVec3_c &getOldPosition() {
return mOldPosition;
}
void setOldPosition(const mVec3_c &v) {
mOldPosition = v;
}
mVec3_c &getStartingPosition() {
return mStartingPos;
}
const mVec3_c &getStartingPos() const {
return mStartingPos;
}
void setStartingPosition(const mVec3_c &v) {
mStartingPos = v;
}
mVec3_c &getVelocity() {
return mVelocity;
}
mAng3_c &getAngle() {
return mAngle;
}
void setStartingRotation(const mAng3_c &v) {
mStartingRot = v;
}
f32 getVelocityMag() const {
return fabsf(nw4r::math::VEC3LenSq(mVelocity));
}
f32 getSpeed() const {
return mSpeed;
}
f32 getYOffset() const {
return mYOffset;
}
bool isFullyStopped(f32 speed = EGG::Math<f32>::epsilon()) const {
return getVelocityMag() <= speed;
}
bool isSpeedStopped(f32 speed = EGG::Math<f32>::epsilon()) const {
return std::fabsf(mSpeed) <= speed;
}
bool isVerticalSpeedStopped(f32 speed = EGG::Math<f32>::epsilon()) const {
return std::fabsf(mVelocity.y) <= speed;
}
bool checkYOffsetField_0x100() const {
return mYOffset <= field_0x100;
}
void unsetObjectProperty(u32 property) {
mObjectActorFlags &= ~property;
}
void setObjectProperty(u32 property) {
mObjectActorFlags |= property;
}
bool checkObjectProperty(u32 property) const {
return mObjectActorFlags & property;
}
dLinkage_c &getLinkage() {
return mLinkage;
}
const dLinkage_c &getLinkage() const {
return mLinkage;
}
void setJntCol(dJntCol_c *pCol) {
mLinkage.field_0xA0 = pCol;
}
// could be their own thing?
static void *getOarcFile(const char *oarcName, const char *fileName);
static void *getOarcSubEntry(const char *oarcName, const char *fileName);
static void *getOarcResFile(const char *oarcName);
static void *getOarcModelFile(const char *oarcName);
static void *getOarcZev(const char *oarcName);
static void *getOarcDZB(const char *dzbName, const char *dzbName2);
static void *getOarcPLC(const char *plcName, const char *plcName2);
public:
dAcObjBase_c();
virtual ~dAcObjBase_c();
virtual int preCreate() override;
virtual int preExecute() override;
virtual void postExecute(MAIN_STATE_e state) override;
virtual int preDraw() override;
virtual void *getObjectListEntry();
virtual bool restorePosRotFromCopy() override;
virtual bool canBeLinkedToWoodTag();
virtual bool drop();
public:
static dAcObjBase_c *create(
fProfile::PROFILE_NAME_e actorId, u32 roomId, u32 params1, const mVec3_c *pos, const mAng3_c *rot,
const mVec3_c *scale, u32 params2
);
static dAcObjBase_c *create(
const char *name, u32 roomId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, const mVec3_c *scale,
u32 params2, u16 id, s8 viewclipId
);
static dAcObjBase_c *create(
dAcObjBase_c *, fProfile::PROFILE_NAME_e actorId, u32 params1, const mVec3_c *pos, const mAng3_c *rot,
const mVec3_c *scale, u32 params2, u32 roomId
);
static dAcObjBase_c *findObject(fProfile::PROFILE_NAME_e actorId, fLiNdBa_c *refList, dAcObjBase_c *parent);
static dAcObjBase_c *getNextObject(fLiMgBa_c *ref, dAcObjBase_c *parent);
bool isPlayer();
void calcVelocity(mVec3_c &pos, f32 speed);
void calcVelocity();
void updateMatrix();
void setDefaultCullDistance();
void fn_8002EA30(f32, f32, f32, f32, f32, void *);
void fn_8002EA60(void *);
void fn_8002EB30(void *);
void putInODesert(f32 depth, mVec3_c *position);
void fn_8002ECD0(m3d::smdl_c *smdl, UNKWORD);
// Disabling makes Items and Link Disappear
void drawModelType1(m3d::smdl_c *smdl);
// Disabling make Lava and other objects Disappear
void drawModel2();
void fn_8002ed20();
void fn_8002edb0(m3d::mShadowCircle_c &shadow, m3d::smdl_c &smdl, const mQuat_c *rot, s32, s32, f32);
void drawShadow(
m3d::mShadowCircle_c &shadow, void *, const mMtx_c &mtx, const mQuat_c *rot, s32, s32, s32, s32, s32, f32
);
void createChildAttached(
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2,
u32 roomId
);
void createChildNonAttached(
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2,
u32 roomId
);
void fn_8002efa0();
bool fn_8002eff0(const f32 &, const s16 &, cCcD_Obj *, const f32 &, const f32 &);
void createChildAttached2(
fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale, u32 params2,
u32 roomId
);
// These may not belong here
static dAcBase_c *createInsectActor(
dAcBase_c *parent, fProfile::PROFILE_NAME_e actorId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
u32 params2, s32 roomId
);
static dAcBase_c *createActorUnkGroup3(
fProfile::PROFILE_NAME_e actorId, u32 roomId, u32 params1, mVec3_c *pos, mAng3_c *rot, mVec3_c *scale,
u32 params2
);
static dAcBase_c *createActorUnkGroup3(
const char *name, u32 roomId, u32 params1, const mVec3_c *pos, const mAng3_c *rot, const mVec3_c *scale,
u32 params2, u16 id, s8 viewclipId
);
};
// Actors' createHeap functions often have patterns that can be matched with this macro
#define TRY_CREATE(thing) \
do { \
bool result = (thing); \
if (!result) \
return result; \
} while (0)
// Actors' createHeap functions often have patterns that can be matched with this macro
// `bool result;` needs to be defined in scope prior to use
#define TRY_CREATE2(thing) \
do { \
result = (thing); \
if (!result) \
return result; \
} while (0)
#define CREATE_ALLOCATOR_SIZE(className, size) \
do { \
if (!initAllocatorWork1Heap(size, #className "::m_allocator", 0x20)) { \
return FAILED; \
} \
} while (0)
// Use this in actors' create functions
#define CREATE_ALLOCATOR(className) CREATE_ALLOCATOR_SIZE(className, -1)
#define CREATE_ALLOCATOR_UNCHECKED(className) initAllocatorWork1Heap(-1, #className "::m_allocator", 0x20)
class dAcObjRef_unk {
public:
dAcObjRef_unk(dAcObjBase_c *ref) : mObj(nullptr), refOwner(ref) {}
~dAcObjRef_unk() {
refOwner = nullptr;
}
bool fn_80051780(const cCcD_Obj &);
void fn_800051630();
void modifyMtx();
/* 0x00 */ dAcRef_c<dAcObjBase_c> mObj;
/* 0x0C */ u8 _0C[4];
/* 0x10 */ dAcObjBase_c *refOwner;
/* 0x14 */ u8 _14[0x2C - 0x14];
};
typedef dAcRef_c<dAcObjBase_c> dAcObjRef_c;
#endif
|