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
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
|
#ifndef D_A_SHIP_H
#define D_A_SHIP_H
#include "res/Object/Ship.h"
#include "f_op/f_op_actor.h"
#include "d/d_cc_d.h"
#include "d/d_bg_s_acch.h"
#include "d/d_particle.h"
#include "SSystem/SComponent/c_phase.h"
#include "f_op/f_op_msg.h"
class camera_class;
class daGrid_c;
class daTornado_c;
class daPy_FLG1;
class daBomb_c;
class daShip_c : public fopAc_ac_c {
public:
enum daSHIP_SFLG {
daSFLG_FLY_e = 0x00000001,
daSFLG_UNK2_e = 0x00000002,
daSFLG_UNK4_e = 0x00000004,
daSFLG_UNK8_e = 0x00000008,
daSFLG_UNK10_e = 0x00000010,
daSFLG_UNK20_e = 0x00000020,
daSFLG_JUMP_e = 0x00000040,
daSFLG_LAND_e = 0x00000080,
daSFLG_UNK100_e = 0x00000100,
daSFLG_SAIL_ON_e = 0x00000200,
daSFLG_UNK400_e = 0x00000400,
daSFLG_UNK800_e = 0x00000800,
daSFLG_UNK1000_e = 0x00001000,
daSFLG_JUMP_RIDE_e = 0x00002000,
daSFLG_JUMP_OK_e = 0x00004000,
daSFLG_UNK8000_e = 0x00008000,
daSFLG_UNK10000_e = 0x00010000,
daSFLG_SHOOT_CANNON_e = 0x00020000,
daSFLG_CRANE_UP_END_e = 0x00040000,
daSFLG_UNK80000_e = 0x00080000,
daSFLG_UNK100000_e = 0x00100000,
daSFLG_HEAD_NO_DRAW_e = 0x00200000,
daSFLG_UNK400000_e = 0x00400000,
daSFLG_UNK800000_e = 0x00800000,
daSFLG_UNK1000000_e = 0x01000000,
daSFLG_UNK2000000_e = 0x02000000,
daSFLG_UNK4000000_e = 0x04000000,
daSFLG_UNK8000000_e = 0x08000000,
daSFLG_UNK10000000_e = 0x10000000,
daSFLG_UNK20000000_e = 0x20000000,
daSFLG_UNK40000000_e = 0x40000000,
daSFLG_UNK80000000_e = 0x80000000
};
enum Mode_e {
MODE_WAIT_e = 0,
MODE_STEER_MOVE_e = 1,
MODE_PADDLE_MOVE_e = 2,
MODE_READY_FIRST_e = 3,
MODE_READY_SECOND_e = 4,
MODE_GET_OFF_FIRST_e = 5,
MODE_GET_OFF_SECOND_e = 6,
MODE_TALK_e = 8,
MODE_CANNON_e = 9,
MODE_CRANE_e = 10,
MODE_CRANE_UP_e = 11,
MODE_TORNADO_UP_e = 12,
MODE_START_MODE_WARP_e = 13,
MODE_TACT_WARP_e = 14,
MODE_START_MODE_THROW_e = 16,
};
enum Part_e {
PART_WAIT_e = 0,
PART_STEER_e = 1,
PART_CANNON_e = 2,
PART_CRANE_e = 3,
};
enum DemoMode_e {
DEMO_INIT_e = 0,
DEMO_MOVE_e = 1,
DEMO_SALVAGE_e = 2,
DEMO_UNK03_e = 3,
DEMO_RACE_FAIL_e = 4,
DEMO_KEEP_e = 5,
DEMO_NECK_e = 6,
DEMO_THROW_e = 7,
DEMO_OPEN_e = 8,
DEMO_TORNADO_S_e = 9,
DEMO_HWARP_UP_e = 10,
DEMO_HWARP_DOWN_e = 11,
};
typedef BOOL (daShip_c::*ProcFunc)();
u32 checkStateFlg(daSHIP_SFLG flag) const { return mStateFlag & flag; }
BOOL getFlyFlg() { return checkStateFlg(daSFLG_FLY_e); }
BOOL getJumpFlg() const { return checkStateFlg(daSFLG_JUMP_e); }
BOOL getLandFlg() const { return checkStateFlg(daSFLG_LAND_e); }
BOOL getSailOn() { return checkStateFlg(daSFLG_SAIL_ON_e); }
void onJumpRideFlg() { onStateFlg(daSFLG_JUMP_RIDE_e); }
BOOL checkJumpOkFlg() const { return checkStateFlg(daSFLG_JUMP_OK_e); }
BOOL checkShootCannon() const { return checkStateFlg(daSFLG_SHOOT_CANNON_e); }
BOOL checkCraneUpEnd() const { return checkStateFlg(daSFLG_CRANE_UP_END_e); }
BOOL checkHeadNoDraw() const { return checkStateFlg(daSFLG_HEAD_NO_DRAW_e); }
void setSteerMove() { mNextMode = MODE_STEER_MOVE_e; }
void setPaddleMove() { mNextMode = MODE_PADDLE_MOVE_e; }
void setReadyFirst() { mNextMode = MODE_READY_FIRST_e; }
void setReadySecond() { mNextMode = MODE_READY_SECOND_e; }
void setGetOffFirst() { mNextMode = MODE_GET_OFF_FIRST_e; }
void setGetOffSecond() { mNextMode = MODE_GET_OFF_SECOND_e; }
void setCannon() { mNextMode = MODE_CANNON_e; }
void setCrane() { mNextMode = MODE_CRANE_e; }
void setStartModeWarp() { mNextMode = MODE_START_MODE_WARP_e; }
void setTactWarp() { mNextMode = MODE_TACT_WARP_e; }
void setStartModeThrow() { mNextMode = MODE_START_MODE_THROW_e; }
BOOL checkSalvageDemo() const { return m0351 == DEMO_SALVAGE_e; }
int getTactWarpPosNum() const { return mTactWarpPosNum; }
void setTactWarpPosNum(int num) { mTactWarpPosNum = num; }
u32 getTactWarpID() { return mTactWarpID; }
void setTactWarpID(u32 warpID) { mTactWarpID = warpID; }
Mtx& getBodyMtx() { return mpBodyAnm->getModel()->getBaseTRMtx(); }
#if VERSION <= VERSION_JPN
bool checkCraneMode() const {
return mCurMode == MODE_CRANE_e && mNextMode == MODE_CRANE_e;
}
#else
bool checkCraneMode() const {
return mCurMode == MODE_CRANE_e && mNextMode == MODE_CRANE_e && speedF < 1.0f && !checkStateFlg(daSFLG_FLY_e) && !checkForceMove();
}
#endif
#if VERSION == VERSION_DEMO
BOOL checkForceMove() { return getTornadoActor() || getWhirlActor(); }
daTornado_c* getTornadoActor() { return mTornadoActor; }
fopAc_ac_c* getWhirlActor() { return mWhirlActor; }
#else
BOOL checkForceMove() const { return getTornadoActor() || getWhirlActor(); }
daTornado_c* getTornadoActor() const { return mTornadoActor; }
fopAc_ac_c* getWhirlActor() const { return mWhirlActor; }
#endif
bool checkTornadoFlg() const { return mTornadoID != fpcM_ERROR_PROCESS_ID_e; }
bool checkTornadoUp() const { return mCurMode == MODE_TORNADO_UP_e; }
f32 getBeltSpeed() const { return m1044.absXZ(); }
s16 getCannonAngleX() const { return shape_angle.x + m0396 - 0x4000; }
s16 getCannonAngleY() const { return shape_angle.y + m0394; }
s16 getCraneAngle() const { return m0398; }
s16 getCraneBaseAngle() const { return mCraneBaseAngle; }
s16 getCraneHookAngleY() const { return shape_angle.y; }
cXyz* getCraneTop() { return mCraneTop; }
f32 getCraneRipplePosX() const { return mCraneRipplePos.x; }
f32 getCraneRipplePosY() const { return mCraneRipplePos.y; }
f32 getCraneRipplePosZ() const { return mCraneRipplePos.z; }
MtxP getHeadJntMtx() { return mpHeadAnm->getModel()->getAnmMtx(FN_HEAD_H_JNT_J_FN_ATAMA_e); }
f32 getJumpRate() { return mJumpRate; }
u8 getPart() const { return mPart; }
s16 getRopeCnt() const { return mRopeCnt; }
BOOL checkRopeDownStart() const { return mRopeCnt > 20; }
BOOL checkRopeCntMax() const { return mRopeCnt == 250; }
s16 getSailAngle() { return mSailAngle; }
MtxP getTactJntMtx() { return mpHeadAnm->getModel()->getAnmMtx(FN_HEAD_H_JNT_J_FN_AGO2_e); }
f32 getTillerAngleRate() { return mTillerAngleRate; }
cXyz* getTillerTopPosP() { return &mTillerTopPos; }
void offCraneHookFlg() { offStateFlg(daSFLG_UNK800_e);}
void offFantomGanonBattle() {}
void offStateFlg(daSHIP_SFLG flag) { mStateFlag &= ~flag;}
void offTornadoFlg() {
mTornadoID = fpcM_ERROR_PROCESS_ID_e;
mTornadoActor = NULL;
}
void offWhirlFlg() {
mWhirlID = fpcM_ERROR_PROCESS_ID_e;
mWhirlActor = NULL;
}
void onCb1Ride() { onStateFlg(daSFLG_UNK40000000_e); }
void onCraneHookFlg() { onStateFlg(daSFLG_UNK800_e); }
void onCrashFlg() { onStateFlg(daSFLG_UNK4_e); }
void onFantomGanonBattle() {}
void onLinkSit() { onStateFlg(daSFLG_UNK4000000_e); }
void onSceneChange() { onStateFlg(daSFLG_UNK20000000_e); }
void onShortHitFlg() { onStateFlg(daSFLG_UNK20_e); }
void onStateFlg(daSHIP_SFLG flag) { mStateFlag |= flag; }
void onTornadoFlg(u32 tornadoID) { mTornadoID = tornadoID; }
void onWhirlFlg(u32 whirlID, s16 linkID) {
mWhirlID = whirlID;
m03B2 = linkID;
m0352 = 1;
}
void onWhirlFlgDirect(u32 whirlID, s16 linkID) {
mWhirlID = whirlID;
m03B2 = linkID;
m0352 = 0;
}
void setAtnPos(const cXyz* pPos) {
onStateFlg(daSFLG_UNK1000000_e);
m1068 = *pPos;
}
BOOL bodyJointCallBack(int);
BOOL cannonJointCallBack(int);
BOOL craneJointCallBack();
BOOL headJointCallBack0();
BOOL headJointCallBack1(int);
BOOL draw();
BOOL checkForceMessage();
void setInitMessage();
BOOL setNextMessage(msg_class*);
void seStart(u32, cXyz*);
void setSailAngle();
void setControllAngle(s16);
void getMaxWaterY(cXyz*);
void setWaveAngle(s16*, s16*);
f32 getWaterY();
void setYPos();
BOOL checkOutRange();
void decrementShipSpeed(f32);
void firstDecrementShipSpeed(f32);
s16 getAimControllAngle(s16);
void setMoveAngle(s16);
void changeDemoEndProc();
void setCrashData(s16);
BOOL checkNextMode(int);
void setPartOnAnime(u8);
void setPartOffAnime();
void setPartAnimeInit(u8);
void setSelfMove(int);
BOOL procWait_init();
BOOL procWait();
BOOL procReady_init();
BOOL procReady();
BOOL procGetOff_init();
BOOL procGetOff();
BOOL procPaddleMove_init();
BOOL procPaddleMove();
BOOL procSteerMove_init();
BOOL procSteerMove();
BOOL procCannonReady_init();
BOOL procCannonReady();
BOOL procCannon_init();
BOOL procCannon();
BOOL procCraneReady_init();
BOOL procCraneReady();
BOOL procCrane_init();
BOOL procCrane();
BOOL procCraneUp_init();
BOOL procCraneUp();
BOOL procToolDemo_init();
BOOL procToolDemo();
BOOL procZevDemo_init();
BOOL procZevDemo();
BOOL procTalkReady_init();
BOOL procTalkReady();
BOOL procTalk_init();
BOOL procTalk();
BOOL procTurn_init();
BOOL procTurn();
BOOL procTornadoUp_init();
BOOL procTornadoUp();
BOOL procStartModeWarp_init();
BOOL procStartModeWarp();
BOOL procTactWarp_init();
BOOL procTactWarp();
BOOL procWhirlDown_init();
BOOL procWhirlDown();
BOOL procStartModeThrow_init();
BOOL procStartModeThrow();
void setEffectData(f32, s16);
void setRoomInfo();
void incRopeCnt(int, int);
void setRopePos();
f32 getAnglePartRate();
void setTornadoActor();
void setWhirlActor();
void setHeadAnm();
BOOL execute();
BOOL shipDelete();
BOOL createHeap();
cPhs_State create();
void initStartPos(cXyz const*, s16);
public:
/* 0x0290 */ request_of_phase_process_class mPhs;
/* 0x0298 */ mDoExt_McaMorf* mpBodyAnm;
/* 0x029C */ mDoExt_McaMorf* mpHeadAnm;
/* 0x02A0 */ J3DTexMtx* m02A0;
/* 0x02A4 */ J3DTexMtx* m02A4;
/* 0x02A8 */ Mtx m02A8;
/* 0x02D8 */ u8 m02D8[0x02E8 - 0x02D8];
/* 0x02E8 */ J3DAnmTransform* mAnmTransform;
/* 0x02EC */ J3DFrameCtrl mFrameCtrl;
/* 0x0300 */ J3DModel* mpCannonModel;
/* 0x0304 */ J3DModel* mpSalvageArmModel;
/* 0x0308 */ J3DModel* mpLinkModel;
/* 0x030C */ mDoExt_3DlineMat1_c mRopeLine;
/* 0x0348 */ u8 m0348[0x034A - 0x0348];
/* 0x034A */ s8 m034A;
/* 0x034B */ u8 m034B;
/* 0x034C */ u8 mCurMode;
/* 0x034D */ u8 mNextMode;
/* 0x034E */ u8 mPart;
/* 0x034F */ u8 m034F;
/* 0x0350 */ u8 m0350;
/* 0x0351 */ u8 m0351;
/* 0x0352 */ u8 m0352;
/* 0x0353 */ u8 m0353;
/* 0x0354 */ int mEvtStaffId;
/* 0x0358 */ u32 mStateFlag;
/* 0x035C */ u32 mNextMessageNo;
/* 0x0360 */ u32 mShadowId;
/* 0x0364 */ s16 mSailAngle;
/* 0x0366 */ s16 m0366;
/* 0x0368 */ u8 m0368[0x036C - 0x0368];
/* 0x036C */ s16 m036C;
/* 0x036E */ s16 m036E;
/* 0x0370 */ s16 m0370;
/* 0x0372 */ s16 m0372;
/* 0x0374 */ s16 m0374;
/* 0x0376 */ s16 m0376;
/* 0x0378 */ s16 m0378;
/* 0x037A */ s16 m037A;
/* 0x037C */ s16 m037C;
/* 0x037E */ s16 m037E;
/* 0x0380 */ s16 m0380;
/* 0x0382 */ s16 m0382;
/* 0x0384 */ s16 m0384;
/* 0x0386 */ s16 m0386;
/* 0x0388 */ s16 m0388;
/* 0x038A */ u16 m038A; // file idx
/* 0x038C */ s16 m038C;
/* 0x038E */ s16 m038E;
/* 0x0390 */ u16 m0390;
/* 0x0392 */ u16 m0392; // file idx
/* 0x0394 */ s16 m0394;
/* 0x0396 */ s16 m0396;
/* 0x0398 */ s16 m0398; // CraneAngle
/* 0x039A */ s16 mCraneBaseAngle;
/* 0x039C */ s16 m039C;
/* 0x039E */ s16 mRopeCnt;
/* 0x03A0 */ s16 m03A0;
/* 0x03A2 */ s16 m03A2;
/* 0x03A4 */ s16 mStickMAng;
/* 0x03A6 */ s16 m03A6;
/* 0x03A8 */ s16 m03A8;
/* 0x03AA */ s16 m03AA;
/* 0x03AC */ s16 m03AC;
/* 0x03AE */ s16 m03AE;
/* 0x03B0 */ s16 m03B0;
/* 0x03B2 */ s16 m03B2;
/* 0x03B4 */ u16 m03B4; // file idx
/* 0x03B6 */ s16 m03B6;
/* 0x03B8 */ s16 m03B8;
/* 0x03BA */ s16 m03BA;
/* 0x03BC */ csXyz m03BC;
/* 0x03C2 */ s16 m03C2;
/* 0x03C4 */ int m03C4;
/* 0x03C8 */ int mTactWarpPosNum;
/* 0x03CC */ int m03CC;
/* 0x03D0 */ f32 m03D0;
/* 0x03D4 */ f32 m03D4;
/* 0x03D8 */ f32 m03D8;
/* 0x03DC */ f32 mTillerAngleRate;
/* 0x03E0 */ f32 m03E0;
/* 0x03E4 */ f32 mJumpRate;
/* 0x03E8 */ f32 m03E8;
/* 0x03EC */ f32 mStickMVal;
/* 0x03F0 */ u8 m03F0[0x03F4 - 0x03F0];
/* 0x03F4 */ f32 m03F4;
/* 0x03F8 */ f32 m03F8;
/* 0x03FC */ f32 mFwdVel;
/* 0x0400 */ f32 m0400;
/* 0x0404 */ f32 m0404;
/* 0x0408 */ f32 m0408;
/* 0x040C */ f32 m040C;
/* 0x0410 */ fpc_ProcID mGridID;
/* 0x0414 */ daGrid_c* mpGrid;
/* 0x0418 */ fpc_ProcID mTornadoID;
/* 0x041C */ daTornado_c* mTornadoActor;
/* 0x0420 */ fpc_ProcID mWhirlID;
/* 0x0424 */ fopAc_ac_c* mWhirlActor;
/* 0x0428 */ cXyz* m0428;
/* 0x042C */ fpc_ProcID mTactWarpID;
/* 0x0430 */ fpc_ProcID m0430;
/* 0x0434 */ cXyz* mCraneTop;
/* 0x0438 */ cXyz mTillerTopPos;
/* 0x0444 */ cXyz m0444;
/* 0x0450 */ cXyz m0450;
/* 0x045C */ cXyz m045C;
/* 0x0468 */ cXyz mRopeLineSegments[250];
/* 0x1020 */ cXyz mCraneRipplePos;
/* 0x102C */ cXyz m102C;
/* 0x1038 */ cXyz m1038;
/* 0x1044 */ cXyz m1044;
/* 0x1050 */ cXyz m1050;
/* 0x105C */ cXyz mEffPos;
/* 0x1068 */ cXyz m1068;
/* 0x1074 */ cXyz m1074;
/* 0x1080 */ dBgS_AcchCir mAcchCir[4];
/* 0x1180 */ dBgS_ObjAcch mAcch;
/* 0x1344 */ dCcD_Stts mStts;
/* 0x1380 */ dCcD_Cyl mCyl[3];
/* 0x1710 */ dCcD_Sph mSph;
/* 0x183C */ dPa_waveEcallBack mWaveR;
/* 0x18A0 */ dPa_waveEcallBack mWaveL;
/* 0x1904 */ dPa_splashEcallBack mSplash;
/* 0x1920 */ dPa_trackEcallBack mTrack;
/* 0x1970 */ dPa_rippleEcallBack mRipple;
/* 0x1984 */ dPa_followEcallBack m1984;
/* 0x1998 */ dPa_followEcallBack m1998;
/* 0x19AC */ dPa_followEcallBack m19AC;
/* 0x19C0 */ dPa_rippleEcallBack m19C0;
/* 0x19D4 */ ProcFunc mProc;
};
#endif /* D_A_SHIP_H */
|