summaryrefslogtreecommitdiff
path: root/include/d/actor/d_a_npc_cb1.h
blob: d2ffda9af8f4f5d473fab743fe675145a0187c15 (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
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
#ifndef D_A_NPC_CB1_H
#define D_A_NPC_CB1_H

#include "d/actor/d_a_player_npc.h"
#include "d/d_com_inf_game.h"
#include "d/d_npc.h"
#include "f_op/f_op_actor.h"
#include "d/d_cc_d.h"
#include "d/d_bg_s_acch.h"
#include "SSystem/SComponent/c_bg_s_poly_info.h"
#include "f_op/f_op_actor_mng.h"
#include "m_Do/m_Do_ext.h"
#include "SSystem/SComponent/c_phase.h"
#include "m_Do/m_Do_hostIO.h"

class daNpc_Cb1_c : public daPy_npc_c {
public:
    typedef BOOL (daNpc_Cb1_c::*ActionFunc_t)(void*);

    enum daNpc_Cb1_StatusBit_e {
        daCbStts_NO_CARRY_ACTION = 0x0001,
        daCbStts_TACT = 0x0002,
        daCbStts_TACT_CORRECT = 0x0004,
        daCbStts_TACT_CANCEL = 0x0008,
        daCbStts_MUSIC = 0x0010,
        daCbStts_NUT = 0x0020,
        daCbStts_SHIP_RIDE = 0x0040,
        daCbStts_PLAYER_FIND = 0x0080,
        daCbStts_UNK_0100 = 0x0100,
    };

    // daPy_py_c virtuals
    virtual f32 getGroundY() { return mAcch.GetGroundH(); }
    virtual MtxP getLeftHandMatrix() { return cullMtx; }
    virtual MtxP getRightHandMatrix() { return cullMtx; }
    virtual f32 getBaseAnimeFrameRate() { return 1.0f; }
    virtual f32 getBaseAnimeFrame() { return 0.0f; }

    s16 XyCheckCB(int i_itemBtn) {
        if(dComIfGp_getSelectItem(i_itemBtn) == dItemNo_WIND_WAKER_e && dComIfGs_isEventBit(dSv_event_flag_c::UNK_1880)) {
            return true;
        }

        return false;
    }
    s16 XyEventCB(int) { return mEventIdx[2]; }
    BOOL chkNpcAction(ActionFunc_t action) { return mNpcAction == action; }
    BOOL chkPlayerAction(ActionFunc_t action) { return mPlayerAction == action; }
    s16 getBackbone_x() { return mJntCtrl.getBackbone_x(); }
    s16 getBackbone_y() { return mJntCtrl.getBackbone_y(); }
    s16 getHead_y() { return mJntCtrl.getHead_y(); }
    cXyz& getEyePos() { return mEyePos; }
    cXyz& getNusSpeed() { return mNusSpeed; } // not entirely sure about this one
    cXyz& getNutPos() { return mNutPos; } // not entirely sure about this one
    s16 getWork3() { return m8FA; }
    void incAttnSetCount() {
        if(mAttnSetCount != 0xFF) {
            mAttnSetCount += 1;
        }
    }
    BOOL isTypeBossDie() { return fopAcM_GetParam(this) == 0; }
    BOOL isTypeForest() { return fopAcM_GetParam(this) == 1; }
    BOOL isTypeWaterFall() { return fopAcM_GetParam(this) == 2; }
    BOOL isTypeEkaze() { return fopAcM_GetParam(this) == 3; }
    BOOL isTypeKaze() { return fopAcM_GetParam(this) == 4; }
    BOOL isTypeKazeBoss() { return fopAcM_GetParam(this) == 5; }
    BOOL isNoCarryAction() { return m_status & daCbStts_NO_CARRY_ACTION; }
    BOOL isTact() { return m_status & daCbStts_TACT; }
    BOOL isTactCorrect() { return m_status & daCbStts_TACT_CORRECT; }
    BOOL isTactCancel() { return m_status & daCbStts_TACT_CANCEL; }
    BOOL isMusic() { return m_status & daCbStts_MUSIC; }
    BOOL isNut() { return m_status & daCbStts_NUT; }
    BOOL isShipRide() { return m_status & daCbStts_SHIP_RIDE; }
    BOOL isPlayerFind() { return m_status & daCbStts_PLAYER_FIND; }
    void offNoCarryAction() { m_status &= ~daCbStts_NO_CARRY_ACTION; }
    void offTact() { m_status &= ~daCbStts_TACT; }
    void offTactCorrect() { m_status &= ~daCbStts_TACT_CORRECT; }
    void offTactCancel() { m_status &= ~daCbStts_TACT_CANCEL; }
    void offMusic() { m_status &= ~daCbStts_MUSIC; }
    void offNut() { m_status &= ~daCbStts_NUT; }
    void offShipRide() { m_status &= ~daCbStts_SHIP_RIDE; }
    void offPlayerFind() { m_status &= ~daCbStts_PLAYER_FIND; }
    void noCarryAction() { m_status |= daCbStts_NO_CARRY_ACTION; }
    void onTact() { m_status |= daCbStts_TACT; }
    void onTactCorrect() { m_status |= daCbStts_TACT_CORRECT; }
    void onTactCancel() { m_status |= daCbStts_TACT_CANCEL; }
    void onMusic() { m_status |= daCbStts_MUSIC; }
    void onNut() { m_status |= daCbStts_NUT; }
    void onShipRide() { m_status |= daCbStts_SHIP_RIDE; }
    void onPlayerFind() { m_status |= daCbStts_PLAYER_FIND; }
    void restartPoint(s16 point) {
        setPointRestart(point, 1);
        setWaitNpcAction(NULL);
    }
    
    static bool m_playerRoom;
    static bool m_flying;
    static s16 m_flyingTimer;
    static u16 m_status;

    static s16 getMaxFlyingTimer();
    
    int getFlyingTimer() { return m_flyingTimer; }
    void setFlyingTimer(s16 time) { m_flyingTimer = time; }
    static bool isFlying() { return m_flying; }
    void onFlying() { m_flying = true; }
    void offFlying() { m_flying = false; }
    static bool isPlayerRoom() { return m_playerRoom; }
    void onPlayerRoom() { m_playerRoom = true; }
    void offPlayerRoom() { m_playerRoom = false; }
    
    daNpc_Cb1_c() {
        m8DB = 0xFF;
    }
    ~daNpc_Cb1_c();
    BOOL isTagCheckOK();
    void setMessageAnimation(u8);
    cPhs_State create();
    BOOL createHeap();
    BOOL setAction(ActionFunc_t*, ActionFunc_t, void*);
    void setWaitAction(void*);
    void setWaitNpcAction(void*);
    void npcAction(void*);
    void setNpcAction(ActionFunc_t, void*);
    void playerAction(void*);
    void setPlayerAction(ActionFunc_t, void*);
    s16 getStickAngY();
    int calcStickPos(s16, cXyz*);
    BOOL flyCheck();
    void checkLanding();
    void breaking();
    BOOL flyAction(BOOL, f32, s16, BOOL);
    BOOL walkAction(f32, f32, s16);
    void returnLinkPlayer();
    BOOL isFlyAction();
    BOOL sowCheck();
    BOOL shipRideCheck();
    BOOL eventProc();
    void evCheckDisp(int);
    void evInitWait(int);
    BOOL evActWait(int);
    void evInitMsgSet(int);
    BOOL evActMsgSet(int);
    void evInitMsgEnd(int);
    BOOL evActMsgEnd(int);
    void evInitMovePos(int);
    BOOL evActMovePos(int);
    void evInitOffsetLink(int);
    BOOL evActOffsetLink(int);
    void evInitWalk(int);
    BOOL evActWalk(int);
    void evInitToLink(int);
    BOOL evActToLink(int);
    void evInitTact(int);
    BOOL evActTact(int);
    void evInitCelloPlay(int);
    BOOL evActCelloPlay(int);
    void evInitTurn(int);
    BOOL evActTurn(int);
    void evInitSow(int);
    BOOL evActSow(int);
    void evInitSetAnm(int);
    BOOL evActSetAnm(int);
    void evInitSetGoal(int);
    BOOL evActSetGoal(int);
    void evInitWarp(int);
    BOOL evActWarp(int);
    void evInitEnd(int);
    BOOL evActEnd(int);
    u8 getAnmType(int);
    BOOL initTalk();
    BOOL execTalk(BOOL);
    BOOL waitNpcAction(void*);
    BOOL talkNpcAction(void*);
    BOOL carryNpcAction(void*);
    BOOL flyNpcAction(void*);
    void routeAngCheck(cXyz&, s16*);
    void routeWallCheck(cXyz&, cXyz&, s16*);
    f32 checkForwardGroundY(s16);
    f32 checkWallJump(s16);
    BOOL chkWallHit();
    BOOL routeCheck(f32, s16*);
    BOOL searchNpcAction(void*);
    BOOL hitNpcAction(void*);
    BOOL jumpNpcAction(void*);
    BOOL rescueNpcAction(void*);
    BOOL musicNpcAction(void*);
    BOOL shipNpcAction(void*);
    BOOL waitPlayerAction(void*);
    BOOL walkPlayerAction(void*);
    BOOL hitPlayerAction(void*);
    BOOL jumpPlayerAction(void*);
    BOOL flyPlayerAction(void*);
    BOOL carryPlayerAction(void*);
    BOOL calcFlyingTimer();
    void initAnm(s8, BOOL);
    void musicPlay();
    void musicStop();
    BOOL setAnm(u8);
    void playAnm();
    BOOL chkAttention(f32, s32);
    void carryCheck();
    void eventOrder();
    void checkOrder();
    BOOL checkCommandTalk();
    u16 next_msgStatus(u32*);
    u32 getMsg();
    void setCollision();
    void lookBack(BOOL);
    void setBaseMtx();
    BOOL init();
    BOOL draw();
    BOOL execute();

private:
    /* 0x4EC */ request_of_phase_process_class mPhs;
    /* 0x4F4 */ mDoExt_McaMorf* mpMorf;
    /* 0x4F8 */ u32 mShadowId;
    /* 0x4FC */ J3DModel* mpStickModel;
    /* 0x500 */ J3DModel* mpCelloModel;
    /* 0x504 */ J3DModel* mpFaceModel;
    /* 0x508 */ J3DModel* mpPropellerModel;
    /* 0x50C */ J3DModel* mpNutModel;
    /* 0x510 */ mDoExt_bckAnm mPropellerBckAnim;
    /* 0x520 */ mDoExt_bckAnm mNutBckAnim;
    /* 0x530 */ dBgS_AcchCir mAcchCir[2];
    /* 0x5B0 */ dCcD_Stts mStts;
    /* 0x5EC */ dCcD_Cyl mCyl;
    /* 0x71C */ dCcD_Cyl mWindCyl;
    /* 0x84C */ dNpc_JntCtrl_c mJntCtrl;
    /* 0x880 */ cXyz mEyePos;
    /* 0x88C */ cXyz m88C;
    /* 0x898 */ cXyz mNutPos;
    /* 0x8A4 */ cXyz mNusSpeed;
    /* 0x8B0 */ f32 m8B0;
    /* 0x8B4 */ ActionFunc_t mPlayerAction;
    /* 0x8C0 */ ActionFunc_t mNpcAction;
    /* 0x8CC */ u32 mMsgNo;
    /* 0x8D0 */ s16 m8D0;
    /* 0x8D2 */ s8 m_backbone_jnt_num;
    /* 0x8D3 */ s8 m_armRend_jnt_num;
    /* 0x8D4 */ s8 m_armL2_jnt_num;
    /* 0x8D5 */ s8 m_nut_jnt_num;
    /* 0x8D6 */ s8 m_center_jnt_num;
    /* 0x8D7 */ s8 m8D7;
    /* 0x8D8 */ s8 m8D8;
    /* 0x8D9 */ u8 mAttnSetCount;
    /* 0x8DA */ u8 mHasAttention;
    /* 0x8DB */ u8 m8DB;
    /* 0x8DC */ s8 m8DC;
    /* 0x8DD */ s8 m8DD;
    /* 0x8DE */ u8 m8DE;
    /* 0x8DF */ u8 m8DF;
    /* 0x8E0 */ u8 m8E0;
    /* 0x8E1 */ s8 m8E1;
    /* 0x8E2 */ u8 m8E2;
    /* 0x8E3 */ s8 m8E3;
    /* 0x8E4 */ s16 mEventIdx[5];
    /* 0x8EE */ s16 m8EE;
    /* 0x8F0 */ s8 m8F0;
    /* 0x8F1 */ s8 m8F1;
    /* 0x8F2 */ s8 m8F2;
    /* 0x8F3 */ u8 m8F3;
    /* 0x8F4 */ s16 m8F4;
    /* 0x8F6 */ s16 m8F6;
    /* 0x8F8 */ s16 m8F8;
    /* 0x8FA */ s16 m8FA;
    /* 0x8FC */ f32 m8FC;
    /* 0x900 */ f32 m900;
    /* 0x904 */ cXyz m904;
    /* 0x910 */ cXyz m910;
    /* 0x91C */ cXyz m91C;
    /* 0x928 */ cBgS_PolyInfo mPolyInfo;

    enum {
        ANM_00 = 0x00,
        ANM_01 = 0x01,
        ANM_02 = 0x02,
        ANM_03 = 0x03,
        ANM_04 = 0x04,
        ANM_05 = 0x05,
        ANM_06 = 0x06,
        ANM_07 = 0x07,
        ANM_08 = 0x08,
        ANM_09 = 0x09,
        ANM_0A = 0x0A,
        ANM_0B = 0x0B,
        ANM_0C = 0x0C,
        ANM_0D = 0x0D,
        ANM_0E = 0x0E,
        ANM_0F = 0x0F,
        ANM_10 = 0x10,
        ANM_11 = 0x11,
        ANM_12 = 0x12,
        ANM_13 = 0x13,
        ANM_14 = 0x14,
        ANM_15 = 0x15,
        ANM_16 = 0x16,
        ANM_17 = 0x17
    };

    class AnmData {
    public:
        /* 0x00 */ s8 mAnmFileIdx;
        /* 0x01 */ u8 mLoopMode;
        /* 0x02 */ s8 field_0x02;
        /* 0x03 */ s8 mSpeed;
        /* 0x04 */ s8 field_0x04;
        /* 0x05 */ s8 field_0x05;
    }; // Size: 0x06

    static AnmData anmTblData[];
    static s8 anmPrmData[];
    
    typedef void(daNpc_Cb1_c::*ev_init_func_t)(int);
    typedef BOOL(daNpc_Cb1_c::*ev_run_func_t)(int);
    struct mode_entry_t {
        ev_init_func_t init;
        ev_run_func_t run;
    };

    static mode_entry_t m_evProcTbl[];
};

#endif /* D_A_NPC_CB1_H */