Skip to content

Commit 4ade12f

Browse files
authored
d_a_npc_coach work (#2579)
* data and class member work * inline work * got to SetCoachBlazing * work on some calc functions * all functions worked on * pr cleanup * more pr cleanup * coach header cleanup
1 parent 58a6d8d commit 4ade12f

File tree

14 files changed

+2413
-1147
lines changed

14 files changed

+2413
-1147
lines changed

include/d/actor/d_a_coach_2D.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class daCoach2D_c : public fopAc_ac_c, public request_of_phase_process_class {
4646
void show() { mIsVisible = true; }
4747
void hide() { mIsVisible = false; }
4848
bool isVisible() { return mIsVisible ? true : false; }
49+
void setHitCount(u8 i_hitCount) { mHitCount = i_hitCount; }
50+
void setMaxHitCount(u8 i_maxHitCount) { mMaxHitCount = i_maxHitCount; }
4951

5052
/* 0x574 */ J2DScreen* mpScrn;
5153
/* 0x578 */ J2DAnmTevRegKey* mpFireIconBrk;

include/d/actor/d_a_e_kr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ class e_kr_class {
1818
public:
1919
/* 80705004 */ e_kr_class();
2020

21+
s32 getId() { return field_0xf00; }
22+
s32 checkBombDrop() { return field_0xf04; }
23+
2124
/* 0x000 */ fopEn_enemy_c enemy;
2225
/* 0x5AC */ request_of_phase_process_class mPhase;
2326
/* 0x5B4 */ mDoExt_McaMorfSO* mpMorf;

include/d/actor/d_a_npc_coach.h

Lines changed: 305 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define D_A_NPC_COACH_H
33

44
#include "d/actor/d_a_npc.h"
5+
#include "d/d_path.h"
56

67
/**
78
* @ingroup actors-npcs
@@ -10,18 +11,233 @@
1011
*
1112
* @details
1213
*
13-
*/
14+
*/
15+
16+
class daNpcCoach_Attr_c {
17+
public:
18+
/* 0x00 */ f32 gravity; // 重力 - Gravity
19+
/* 0x04 */ f32 max_fall_speed; // 最大落下速度 - Maximum Fall Speed
20+
/* 0x08 */ f32 jump_coeff; // 跳係数 - Jump Coefficient
21+
/* 0x0C */ f32 field_0xc;
22+
/* 0x10 */ f32 field_0x10;
23+
/* 0x14 */ f32 field_0x14;
24+
/* 0x18 */ f32 field_0x18;
25+
/* 0x1C */ f32 max_speed; // 最大速度 - Maximum Speed
26+
/* 0x20 */ f32 spring_constant; // バネ係数 - Spring Constant
27+
/* 0x24 */ f32 damp_coeff[1]; // 減衰係数 - Damp Coefficient
28+
/* 0x28 */ f32 field_0x28[1];
29+
/* 0x2C */ f32 field_0x2c;
30+
/* 0x30 */ f32 field_0x30;
31+
/* 0x34 */ f32 field_0x34;
32+
/* 0x38 */ f32 vert_swing_width; // 縦揺れ幅 - Vertical Swing Width
33+
/* 0x3C */ f32 shake_dist; // 揺れ距離 - Shake Distance
34+
/* 0x40 */ f32 jump_dist; // 跳ね距離 - Jump Distance
35+
/* 0x44 */ f32 wheel_bounce; // 車輪跳ね - Wheel Bounce
36+
/* 0x48 */ f32 field_0x48;
37+
/* 0x4C */ f32 field_0x4c;
38+
/* 0x50 */ f32 field_0x50;
39+
/* 0x54 */ f32 field_0x54;
40+
/* 0x58 */ f32 field_0x58;
41+
/* 0x5C */ f32 field_0x5c;
42+
/* 0x60 */ s16 field_0x60;
43+
/* 0x62 */ s16 horse_rot_limit; // 馬Rot限度 - Horse Rot Limit
44+
/* 0x64 */ s16 horiz_sway_range; // 横揺れ幅 - Horizontal Sway Range
45+
/* 0x66 */ s16 field_0x66;
46+
/* 0x68 */ s16 field_0x68;
47+
/* 0x6A */ s8 field_0x6a;
48+
/* 0x6B */ u8 field_0x6b;
49+
/* 0x6C */ u8 field_0x6c;
50+
/* 0x6D */ u8 shake_test; // 揺れ実験 - Shake Test
51+
/* 0x6E */ s16 field_0x6e;
52+
/* 0x70 */ int damage_reduction; // ダメージ減量 - Damage Reduction
53+
/* 0x74 */ int damage_durability; // ダメージ耐久度 - Damage Durability
54+
/* 0x78 */ u8 damage_extinguish_level; // ダメージ消火度 - Damage Extinguish Level
55+
/* 0x79 */ u8 horse_camera; // 馬カメラ - Horse Camera
56+
/* 0x7A */ u8 field_0x7a;
57+
/* 0x7B */ u8 field_0x7b;
58+
/* 0x7C */ f32 camera_dist; // カメラ距離 - Camera Distance
59+
/* 0x80 */ s16 camera_elevation_angle; // カメラ仰角 - Camera Elevation Angle
60+
/* 0x82 */ s16 camera_rotation_angle; // カメラ回転角 - Camera Rotation Angle
61+
/* 0x84 */ s16 field_0x84;
62+
/* 0x86 */ u8 field_0x86;
63+
/* 0x87 */ u8 field_0x87;
64+
/* 0x88 */ u8 field_0x88;
65+
/* 0x89 */ u8 field_0x89;
66+
/* 0x8A */ s16 field_0x8a;
67+
/* 0x8C */ f32 field_0x8c;
68+
/* 0x90 */ f32 field_0x90;
69+
/* 0x94 */ f32 field_0x94;
70+
/* 0x98 */ f32 deceleration_speed; // 減速速度 - Deceleration Speed
71+
/* 0x9C */ s32 deceleration_time; // 減速時間 - Deceleration Time
72+
};
73+
74+
class daNpcChReins_c {
75+
public:
76+
/* 0x000 */ mDoExt_3DlineMat1_c field_0x0;
77+
/* 0x03C */ mDoExt_3DlineMat1_c field_0x3c;
78+
/* 0x078 */ cXyz field_0x78[10];
79+
/* 0x0F0 */ cXyz field_0xf0[10];
80+
/* 0x168 */ f32 field_0x168;
81+
/* 0x16C */ s8 field_0x16c;
82+
/* 0x170 */ cXyz field_0x170;
83+
};
84+
85+
class daNpcChHorse_c {
86+
public:
87+
/* 0x000 */ mDoExt_McaMorf2* mpModelMorf;
88+
/* 0x004 */ mDoExt_btpAnm* mpBtpAnm;
89+
/* 0x008 */ mDoExt_bckAnm* mpBckAnm;
90+
/* 0x00C */ dBgS_ObjAcch mBgc;
91+
/* 0x1F0 */ dCcD_Cyl field_0x1f0[4];
92+
/* 0x6D4 */ Z2CreatureRide mSound;
93+
/* 0x770 */ cXyz field_0x770;
94+
/* 0x77C */ f32 mAnmRate;
95+
/* 0x780 */ f32 mAimSpeed;
96+
/* 0x784 */ f32 field_0x784;
97+
/* 0x788 */ int field_0x788;
98+
/* 0x78C */ int field_0x78c;
99+
/* 0x790 */ int field_0x790;
100+
/* 0x794 */ u32 mShadowKey;
101+
/* 0x798 */ daNpcChReins_c mChReins;
102+
};
103+
104+
class daNpcChWheel_c {
105+
public:
106+
/* 0x00 */ cXyz field_0x0;
107+
/* 0x0C */ u32 field_0xc[2];
108+
/* 0x14 */ csXyz mWheelRot;
109+
/* 0x1A */ s16 field_0x1a;
110+
/* 0x1C */ s16 field_0x1c;
111+
/* 0x1E */ s16 field_0x1e;
112+
/* 0x20 */ s16 field_0x20;
113+
};
114+
115+
class daNpcChHarness_c {
116+
public:
117+
/* 809A3570 */ ~daNpcChHarness_c();
118+
119+
/* 0x000 */ J3DModel* mHarnessModel;
120+
/* 0x004 */ dKy_tevstr_c mTevStr;
121+
/* 0x38C */ dBgS_ObjAcch mBgc;
122+
/* 0x564 */ dCcD_Cyl field_0x564;
123+
/* 0x6A0 */ dBgW* field_0x6a0;
124+
/* 0x6A4 */ Mtx mMtx;
125+
/* 0x6D4 */ cXyz field_0x6d4;
126+
/* 0x6E0 */ cXyz field_0x6e0;
127+
/* 0x6EC */ cXyz field_0x6ec;
128+
/* 0x6F8 */ u32 mShadowKey;
129+
/* 0x6FC */ f32 field_0x6fc;
130+
/* 0x700 */ csXyz field_0x700;
131+
/* 0x706 */ csXyz field_0x706;
132+
/* 0x70C */ daNpcChWheel_c field_0x70c;
133+
/* 0x730 */ daNpcChWheel_c field_0x730;
134+
};
135+
136+
class daNpcChCoach_c {
137+
public:
138+
/* 809A3674 */ ~daNpcChCoach_c();
139+
140+
/* 0x000 */ J3DModel* mCoachModel;
141+
/* 0x004 */ dKy_tevstr_c mTevStr;
142+
/* 0x38C */ dBgS_ObjAcch mBgc;
143+
/* 0x564 */ dBgW* field_0x564;
144+
/* 0x568 */ Mtx field_0x568;
145+
/* 0x598 */ Mtx field_0x598;
146+
/* 0x5C8 */ cXyz field_0x5c8;
147+
/* 0x5D4 */ cXyz field_0x5d4;
148+
/* 0x5E0 */ cXyz field_0x5e0;
149+
/* 0x5EC */ cXyz field_0x5ec;
150+
/* 0x5F8 */ JPABaseEmitter* field_0x5f8[10];
151+
/* 0x620 */ Z2SoundObjCoach mSound;
152+
/* 0x644 */ dCcD_Sph field_0x644;
153+
/* 0x77C */ int field_0x77c;
154+
/* 0x780 */ u32 mShadowKey;
155+
/* 0x784 */ f32 field_0x784;
156+
/* 0x788 */ f32 field_0x788;
157+
/* 0x78C */ f32 mCoachTrans;
158+
/* 0x790 */ f32 field_0x790;
159+
/* 0x794 */ f32 field_0x794;
160+
/* 0x798 */ s16 mCoachRot;
161+
/* 0x79A */ csXyz field_0x79a;
162+
/* 0x7A0 */ csXyz field_0x7a0;
163+
/* 0x7A8 */ daNpcChWheel_c field_0x7a8;
164+
/* 0x7CC */ daNpcChWheel_c field_0x7cc;
165+
};
166+
167+
class daNpcChYelia_c {
168+
public:
169+
/* 0x000 */ mDoExt_McaMorfSO* mpModelMorf;
170+
/* 0x004 */ dKy_tevstr_c mTevStr;
171+
/* 0x38C */ Z2Creature mSound;
172+
/* 0x41C */ dCcD_Cyl field_0x41c[2];
173+
/* 0x694 */ cXyz field_0x694;
174+
};
175+
176+
class daNpcChPath_c {
177+
public:
178+
BOOL setPath(int, int, cXyz*, bool);
179+
BOOL isClose() { return dPath_ChkClose(mpPath); }
180+
bool setNextPoint() {
181+
mPntIndex++;
182+
183+
if (mPntIndex >= mpPath->m_num) {
184+
if (isClose()) {
185+
mPntIndex = 0;
186+
} else {
187+
mPntIndex--;
188+
return FALSE;
189+
}
190+
}
191+
192+
return TRUE;
193+
}
194+
BOOL setPrevPoint() {
195+
mPntIndex--;
196+
197+
if (mPntIndex < 0) {
198+
if (isClose()) {
199+
mPntIndex = mpPath->m_num - 1;
200+
} else {
201+
mPntIndex++;
202+
return FALSE;
203+
}
204+
}
205+
206+
return TRUE;
207+
}
208+
void getTargetPoint(cXyz& param_1) {
209+
if (mpPath != NULL) {
210+
param_1 = dPath_GetPnt(mpPath, mPntIndex)->m_position;
211+
}
212+
}
213+
bool isPath() { return mpPath != NULL; }
214+
int getCurrentId() { return mCurrentID; }
215+
s8 getArg0() { return mpPath->m_points[mPntIndex].mArg0; }
216+
s8 getArg1() { return mpPath->m_points[mPntIndex].mArg1; }
217+
s8 getArg2() { return mpPath->m_points[mPntIndex].mArg2; }
218+
int getArg3() { return mpPath->m_points[mPntIndex].mArg3; }
219+
inline int checkNearAttackPoint();
220+
inline bool checkPoint(cXyz*, f32);
221+
inline bool setNextTarget();
222+
223+
/* 0x00 */ dPath* mpPath;
224+
/* 0x04 */ cXyz* field_0x4;
225+
/* 0x08 */ f32 field_0x8;
226+
/* 0x0C */ int mCurrentID;
227+
/* 0x10 */ int mPntIndex;
228+
};
229+
14230
class daNpcCoach_c : public fopAc_ac_c {
15231
public:
16232
/* 8099DA60 */ void hitFireArrow(cXyz);
17233
/* 8099DBA4 */ void deleteFireArrow(unsigned int);
18234
/* 8099DCE8 */ bool deleteFireArrowFromList(unsigned int);
19235
/* 8099DD28 */ void setPosAngle(cXyz&, csXyz&);
20-
/* 8099DD7C */ void ctrlJointHorse(J3DJoint*, J3DModel*);
236+
/* 8099DD7C */ int ctrlJointHorse(J3DJoint*, J3DModel*);
21237
/* 8099DE18 */ void initCoachPosition(Vec&, SVec&);
22238
/* 8099E138 */ void changeAtherPath(s8, cXyz&, csXyz&);
23-
/* 8099E4C0 */ void createHeap();
24-
/* 8099EB40 */ void execute();
239+
/* 8099E4C0 */ int createHeap();
240+
/* 8099EB40 */ int execute();
25241
/* 8099EEA0 */ void checkCoachDamage();
26242
/* 8099F1B8 */ void setCoachBlazing(u8);
27243
/* 8099F4BC */ void reinsExecute();
@@ -33,40 +249,107 @@ class daNpcCoach_c : public fopAc_ac_c {
33249
/* 809A1810 */ void calcHorseMotion();
34250
/* 809A1BE0 */ void calcHorseAnm();
35251
/* 809A2740 */ void calcHorsePath();
36-
/* 809A2EB8 */ void draw();
252+
/* 809A2EB8 */ int draw();
37253
/* 809A3330 */ ~daNpcCoach_c();
38-
/* 809A3884 */ void create();
254+
/* 809A3884 */ cPhs__Step create();
39255
/* 809A3928 */ void create_init();
40256
/* 809A4078 */ void initCollision();
41257
/* 809A43A0 */ void initBaseMtx();
42258
/* 809A43DC */ void setBaseMtx();
43259
/* 809A46C4 */ void initCoachBlazing();
44260
/* 809A48A8 */ daNpcCoach_c();
45261

46-
bool checkCoachBlazing() { return field_0x1dc4; }
47-
Mtx* getCoachMtx() { return &field_0x2490; }
262+
inline bool checkCoachBlazing() { return mCoachBlazing; }
263+
inline Mtx* getCoachMtx() { return &mCoachMtx; }
264+
inline csXyz* getFrontWheelRot(int param_1) {
265+
if (param_1 == 2) {
266+
return &mChHarness.field_0x70c.mWheelRot;
267+
}
268+
269+
return &mChHarness.field_0x730.mWheelRot;
270+
}
271+
inline csXyz* getRearWheelRot(int param_1) {
272+
if (param_1 == 1) {
273+
return &mChCoach.field_0x7a8.mWheelRot;
274+
}
275+
276+
return &mChCoach.field_0x7cc.mWheelRot;
277+
}
278+
inline s16 getCoachRotate() { return mChCoach.mCoachRot; }
279+
inline f32 getCoachTrans() { return mChCoach.mCoachTrans; }
280+
inline int getRailID() { return mChPath.getCurrentId(); }
48281

49-
static u8 const M_attr[160];
282+
inline void setDriverMtx();
283+
inline void calcDriverMotion() { setDriverMtx(); }
284+
inline void calcYeliaMotion();
285+
inline void setYeliaMtx() {
286+
mDoMtx_stack_c::copy(mChCoach.mCoachModel->getAnmMtx(6));
287+
mDoMtx_stack_c::multVecZero(&mChYelia.field_0x694);
288+
mChYelia.mpModelMorf->getModel()->setBaseTRMtx(mDoMtx_stack_c::get());
289+
}
290+
inline void setCoachCollision();
291+
inline s16 getGroundSlope(dBgS_ObjAcch*, s16);
292+
inline void calcSpringF(f32*, f32, f32*);
293+
inline void calcSpringS(s16*, s16, f32*);
294+
inline void setCoachMtx();
295+
inline void setWheelSmoke(daNpcChWheel_c*, dBgS_ObjAcch*, dKy_tevstr_c*, csXyz*);
296+
inline void setHarnessCollision();
297+
inline f32 calcMaxSpeed();
298+
inline void setHorseCollision();
299+
inline void setHorseMtx();
300+
inline void setHorseAnm(int);
301+
inline void eyeWink();
302+
inline BOOL checkKargoAttack();
303+
inline BOOL setExpressionAnm(int, bool);
304+
inline void resetOverAngle();
305+
inline void reinsDraw();
306+
inline u8 getPathID() { return fopAcM_GetParam(this) & 0xFF; }
307+
inline int getMessageNo() { return home.angle.x; }
308+
inline void setHarnessMtx();
309+
310+
const daNpcCoach_Attr_c& attr() { return M_attr; }
311+
312+
static daNpcCoach_Attr_c const M_attr;
313+
static u16 const ParticleName[10];
50314
private:
51-
/* 0x568 */ u8 field_0x568[0x1dc4 - 0x568];
52-
/* 0x1DC4 */ bool field_0x1dc4;
53-
/* 0x1DC5 */ u8 field_0x1dc5[0x247c - 0x1dc5];
54-
/* 0x247C */ u32 field_0x247c[4];
55-
/* 0x248C */ u8 field_0x248c[0x2490 - 0x248c];
56-
/* 0x2490 */ Mtx field_0x2490;
57-
/* 0x24C0 */ u8 field_0x254c[0x2570 - 0x24c0];
315+
/* 0x0568 */ daNpcChHorse_c mChHorse;
316+
/* 0x0E7C */ daNpcChHarness_c mChHarness;
317+
/* 0x15D0 */ daNpcChCoach_c mChCoach;
318+
/* 0x1DC0 */ int field_0x1dc0;
319+
/* 0x1DC4 */ bool mCoachBlazing;
320+
/* 0x1DC5 */ u8 field_0x1dc5;
321+
/* 0x1DC6 */ u8 field_0x1dc6;
322+
/* 0x1DC7 */ u8 field_0x1dc7;
323+
/* 0x1DC8 */ daNpcChYelia_c mChYelia;
324+
/* 0x2468 */ daNpcChPath_c mChPath;
325+
/* 0x247C */ fpc_ProcID field_0x247c[5];
326+
/* 0x2490 */ Mtx mCoachMtx;
327+
/* 0x24C0 */ int field_0x24c0;
328+
/* 0x24C4 */ int field_0x24c4;
329+
/* 0x24C8 */ f32 field_0x24c8;
330+
/* 0x24CC */ dBgS_AcchCir mAcchCir;
331+
/* 0x250C */ dCcD_Stts mStts;
332+
/* 0x2548 */ request_of_phase_process_class mPhase;
333+
/* 0x2550 */ int field_0x2550;
334+
/* 0x2554 */ fpc_ProcID field_0x2554;
335+
/* 0x2558 */ u8 field_0x2558;
336+
/* 0x2559 */ u8 field_0x2559;
337+
/* 0x255C */ cXyz field_0x255c;
338+
/* 0x2568 */ int mPathID;
339+
/* 0x256C */ u8 field_0x256c[0x2570 - 0x256c];
58340
};
59341

60342
STATIC_ASSERT(sizeof(daNpcCoach_c) == 0x2570);
61343

62-
class daNpcChHarness_c {
344+
struct daNpcCoach_Hio_c {
63345
public:
64-
/* 809A3570 */ ~daNpcChHarness_c();
65-
};
346+
void default_set() {
347+
field_0xc = daNpcCoach_c::M_attr;
348+
}
66349

67-
class daNpcChCoach_c {
68-
public:
69-
/* 809A3674 */ ~daNpcChCoach_c();
350+
/* 0x0 */ u8 field_0x0[0x8 - 0x0];
351+
/* 0x8 */ int field_0x8;
352+
/* 0xC */ daNpcCoach_Attr_c field_0xc;
70353
};
71354

72355
#endif /* D_A_NPC_COACH_H */

0 commit comments

Comments
 (0)