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
|
#ifndef D_NPC_H
#define D_NPC_H
#include "f_op/f_op_actor.h"
#include "f_op/f_op_msg.h"
#include "d/d_bg_s_acch.h"
#include "d/d_cc_d.h"
#include "d/d_path.h"
#include "m_Do/m_Do_ext.h"
class fopNpc_npc_c;
class dNpc_HIO_c {
public:
virtual ~dNpc_HIO_c() {}
public:
/* 0x04 */ f32 m04;
/* 0x08 */ s16 mMaxHeadX;
/* 0x0A */ s16 mMaxBackboneX;
/* 0x0C */ s16 mMaxHeadY;
/* 0x0E */ s16 mMaxBackboneY;
/* 0x10 */ s16 mMinHeadX;
/* 0x12 */ s16 mMinBackboneX;
/* 0x14 */ s16 mMinHeadY;
/* 0x16 */ s16 mMinBackboneY;
/* 0x18 */ s16 mMaxTurnStep;
/* 0x1A */ s16 mMaxHeadTurnVel; // TODO: Not sure what the difference between this and the above field is
/* 0x1C */ f32 mAttnYOffset;
/* 0x20 */ s16 mMaxAttnAngleY;
/* 0x22 */ u8 m22;
/* 0x23 */ u8 m23[0x24 - 0x23];
/* 0x24 */ f32 mMaxAttnDistXZ;
}; // Size: 0x28
class dNpc_JntCtrl_c {
public:
/* 0x00 */ s16 mAngles[2][2];
// /* 0x00 */ s16 mHeadUpDownRot;
// /* 0x02 */ s16 mHeadLeftRightRot;
// /* 0x04 */ s16 mBackboneUpDownRot;
// /* 0x06 */ s16 mBackboneLeftRightRot;
/* 0x08 */ s8 mHeadJntNum;
/* 0x09 */ s8 mBackboneJntNum;
/* 0x0A */ bool mbTrn;
/* 0x0B */ bool mbHeadLock;
/* 0x0C */ bool mbBackBoneLock;
/* 0x0D */ u8 field_0x0D;
/* 0x0E */ s16 mMinAngles[2][2];
/* 0x16 */ s16 mMaxAngles[2][2];
// /* 0x0E */ s16 field_0x0E;
// /* 0x10 */ s16 mMinHeadRot;
// /* 0x12 */ s16 field_0x12;
// /* 0x14 */ s16 mMinSpineRot;
// /* 0x16 */ s16 field_0x16;
// /* 0x18 */ s16 mMaxHeadRot;
// /* 0x1A */ s16 field_0x1A;
// /* 0x1C */ s16 mMaxSpineRot;
/* 0x1E */ s16 mMaxTurnStep[2][2];
/* 0x26 */ u8 pad_0x26[0x2C - 0x26];
/* 0x2C */ s16 field_0x2C;
/* 0x2E */ s16 field_0x2E;
/* 0x30 */ s16 field_0x30;
/* 0x32 */ s16 field_0x32;
public:
dNpc_JntCtrl_c() {
offBackBoneLock();
offHeadLock();
}
s8 getHeadJntNum() { return mHeadJntNum; }
s8 getBackboneJntNum() { return mBackboneJntNum; }
void setHeadJntNum(s8 jnt) { mHeadJntNum = jnt; }
void setBackboneJntNum(s8 jnt) { mBackboneJntNum = jnt; }
s16 getHead_x() { return mAngles[0][0]; }
s16 getHead_y() { return mAngles[0][1]; }
s16 getBackbone_x() { return mAngles[1][0]; }
s16 getBackbone_y() { return mAngles[1][1]; }
void setHead_x(s16 angle) { mAngles[0][0] = angle; }
void setHead_y(s16 angle) { mAngles[0][1] = angle; }
void setBackBone_x(s16 angle) { mAngles[1][0] = angle; }
void setBackBone_y(s16 angle) { mAngles[1][1] = angle; }
bool trnChk() { return mbTrn; }
void setTrn() { mbTrn = true; }
void clrTrn() { mbTrn = false; }
void onHeadLock() { mbHeadLock = true; }
void onBackBoneLock() { mbBackBoneLock = true; }
void offHeadLock() { mbHeadLock = false; }
void offBackBoneLock() { mbBackBoneLock = false; }
bool angCalcS(s16*, s16, s16, s16);
void limitter(s16*, s16, s16);
bool follow(s16*, s16, s16, int);
bool move(s16, int);
void lookAtTarget(s16* outY, cXyz* pDstPos, cXyz srcPos, s16 defaultY, s16 maxVel, bool param_6);
void setParam(s16 max_backbone_x, s16 max_backbone_y, s16 min_backbone_x, s16 min_backbone_y,
s16 max_head_x, s16 max_head_y, s16 min_head_x, s16 min_head_y,
s16 max_turn_step);
int chkLim(s16, int, int);
void turn_fromBackbone2Head(s16, s16*, s16*, bool);
void turn_fromHead2Backbone(s16, s16*, s16*);
s16 follow_current(s16*, s16);
void lookAtTarget_2(s16*, cXyz*, cXyz, s16, s16, bool);
}; // Size: 0x34
class dNpc_EventCut_c {
private:
/* 0x00 */ char* mpEvtStaffName;
/* 0x04 */ int mEvtStaffId;
/* 0x08 */ fopAc_ac_c* mpActor;
/* 0x0C */ fopNpc_npc_c* mpTalkActor;
/* 0x10 */ int mCurActIdx;
/* 0x14 */ u32 field_0x14;
/* 0x18 */ int mTimer;
/* 0x1C */ char* mpActorName;
/* 0x20 */ u32 field_0x20;
/* 0x24 */ s32 mSetId;
/* 0x28 */ cXyz mOffsetPos;
/* 0x34 */ cXyz mTargetActorPos;
/* 0x40 */ fopAc_ac_c* mpTargetActor;
/* 0x44 */ s16 field_0x44;
/* 0x48 */ f32 mSpeed;
/* 0x4C */ f32 pDelDistance;
/* 0x50 */ s16 mAddAngle;
/* 0x52 */ u8 field_0x52;
/* 0x54 */ cXyz mPos;
/* 0x60 */ bool mbAttention;
/* 0x61 */ u8 mbNoTurn;
/* 0x62 */ s16 mTurnSpeed;
/* 0x64 */ u32 mTurnType;
/* 0x68 */ dNpc_JntCtrl_c* mpJntCtrl;
public:
dNpc_EventCut_c() {
mpActor = NULL;
mpTalkActor = NULL;
mpJntCtrl = NULL;
}
void setActorInfo(char*, fopAc_ac_c*);
void setActorInfo2(char*, fopNpc_npc_c*);
bool cutProc();
void cutWaitStart();
void cutWaitProc();
void cutTurnToActorStart();
void cutTurnToActorProc();
void cutMoveToActorStart();
void cutMoveToActorProc();
void cutTurnToPosStart();
void cutTurnToPosProc();
void cutMoveToPosStart();
void cutMoveToPosProc();
void cutTalkMsgStart();
void cutContinueTalkStart();
void cutTalkMsgProc();
char* getActorName() { return mpEvtStaffName; }
int getNowCut() { return mCurActIdx; }
bool getAttnFlag() { return mbAttention; }
void setAttnFlag(bool flag) { mbAttention = flag; }
bool getAttnNoTurnFlag() { return mbNoTurn; }
void setAttnNoTurnFlag(bool flag) { mbNoTurn = flag; }
f32 getMoveSpeed() { return mSpeed; }
cXyz getAttnPos() { return mPos; }
void setAttnPos(cXyz& pos) { mPos = pos; }
s16 getTurnSpeed() { return mTurnSpeed; }
void setJntCtrlPtr(dNpc_JntCtrl_c* ctrl) { mpJntCtrl = ctrl; }
static fopAc_ac_c* findActorCallBack(fopAc_ac_c*, void*);
}; // Size: 0x6C
class dNpc_PathRun_c {
public:
dPath* getPath() { return mPath; }
bool isPath() { return mPath != NULL; }
u8 getIdx() { return mIdx; }
void setIdx(u8 idx) { mIdx = idx; }
void clrIdx() { mIdx = 0; }
u8 getDir() { return mbDir; }
void setDir(u8 dir) { mbDir = dir; }
void turnDir() { mbDir ^= 1; }
bool setInfDrct(dPath* pPath);
bool setInf(u8 pathIdx, s8 roomNo, u8 forwards);
dPath* nextPath(s8 roomNo);
cXyz getPoint(u8 pointIdx);
bool chkPointPass(cXyz, bool);
bool incIdx();
bool incIdxLoop();
bool incIdxAuto();
bool decIdx();
bool decIdxLoop();
bool decIdxAuto();
bool nextIdx();
bool nextIdxAuto();
s32 absIdx(u8, u8);
u8 maxPoint();
u8 pointArg(u8 idx);
bool setNearPathIndx(cXyz*, f32);
f32 setNearPathIndxMk(cXyz*);
bool setNearPathIndxMk2(cXyz*, u8, u8);
bool chkInside(cXyz*);
private:
/* 0x00 */ dPath* mPath;
/* 0x04 */ u8 field_0x04;
/* 0x05 */ u8 mIdx;
/* 0x06 */ u8 mbDir;
/* 0x07 */ u8 field_0x07;
}; // Size: 0x08
class dNpc_HeadAnm_c {
public:
typedef void (dNpc_HeadAnm_c::*SwingProc)(void);
void swing_vertical_init(s16 param_1, s16 param_2, s16 param_3, int param_4);
void swing_vertical();
void swing_horizone_init(s16 param_1, s16 param_2, s16 param_3, int param_4);
void swing_horizone();
void move();
dNpc_HeadAnm_c() {
field_0x14 = 0.0f;
field_0x18 = 0.0f;
field_0x1C = 0;
field_0x1E = 0;
field_0x20 = 0;
field_0x00 = 0;
field_0x02 = 0;
field_0x04 = 0;
}
void defaultCalcX(s16) {}
void defaultCalcY(s16) {}
void setProc(SwingProc proc) { mProc = proc; }
/* 0x00 */ s16 field_0x00;
/* 0x02 */ s16 field_0x02;
/* 0x04 */ s16 field_0x04;
/* 0x08 */ SwingProc mProc;
/* 0x14 */ f32 field_0x14;
/* 0x18 */ f32 field_0x18;
/* 0x1C */ s16 field_0x1C;
/* 0x1E */ s16 field_0x1E;
/* 0x20 */ s16 field_0x20;
}; // Size: 0x22
class fopNpc_npc_c : public fopAc_ac_c {
public:
fopNpc_npc_c() {
mCurrMsgBsPcId = fpcM_ERROR_PROCESS_ID_e;
mpCurrMsg = NULL;
}
/* 0x290 */ dNpc_JntCtrl_c m_jnt;
/* 0x2C4 */ dNpc_EventCut_c mEventCut;
/* 0x330 */ mDoExt_McaMorf* mpMorf;
/* 0x334 */ dBgS_ObjAcch mObjAcch;
/* 0x4F8 */ dBgS_AcchCir mAcchCir;
/* 0x538 */ dCcD_Stts mStts;
/* 0x574 */ dCcD_Cyl mCyl;
/* 0x6A4 */ u32 mCurrMsgNo;
/* 0x6A8 */ u32 mEndMsgNo;
/* 0x6AC */ fpc_ProcID mCurrMsgBsPcId;
/* 0x6B0 */ msg_class* mpCurrMsg;
/* 0x6B4 */ u8 field_0x6b4[6];
/* 0x6BA */ u16 field_0x6ba;
/* 0x6BC */ u8 field_0x6bc[4];
/* 0x6C0 */ /* vtable */
virtual u16 next_msgStatus(u32* pMsgNo) { return fopMsgStts_MSG_ENDS_e; }
virtual u32 getMsg() { return 0; }
virtual void anmAtr(u16 i_msgStatus) {}
void setCollision(f32 radius, f32 height);
u16 talk(int);
}; // Size: 0x6C4
bool dNpc_setAnmIDRes(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animResId, int soundResId, const char* arcName);
bool dNpc_setAnmFNDirect(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, char* animFilename, char* soundFilename, const char* arcName);
bool dNpc_setAnm(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName);
void dNpc_setShadowModel(J3DModel*, J3DModelData*, J3DModel*);
cXyz dNpc_playerEyePos(f32);
void dNpc_calc_DisXZ_AngY(cXyz, cXyz, f32*, s16*);
bool dNpc_chkArasoi();
bool dNpc_chkLetterPassed();
bool dNpc_setAnm_2(mDoExt_McaMorf* pMorf, int loopMode, f32 morf, f32 speed, int animFileIdx, int soundFileIdx, const char* arcName);
bool dNpc_chkAttn(fopAc_ac_c* i_this, cXyz destPos, f32 param_3, f32 param_4, f32 param_5, bool param_6);
extern dCcD_SrcCyl dNpc_cyl_src;
#endif /* D_NPC_H */
|