summaryrefslogtreecommitdiff
path: root/include/d/a/obj/d_a_obj_arrow.h
blob: 7a44ee7d7e5e72028ba12dbbf362952d1e40e502 (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
#ifndef D_A_OBJ_ARROW_H
#define D_A_OBJ_ARROW_H

#include "d/a/obj/d_a_obj_base.h"
#include "d/col/c/c_bg_s_poly_info.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_d.h"
#include "m/m3d/m_smdl.h"
#include "m/m_vec.h"
#include "nw4r/g3d/res/g3d_resfile.h"
#include "s/s_State.hpp"
#include "toBeSorted/d_emitter.h"

class dAcArrow_c : public dAcObjBase_c {
public:
    dAcArrow_c() : mPolyInfo(), mStateMgr(*this), mEffects(this) {}
    virtual ~dAcArrow_c();

    virtual bool createHeap() override;
    virtual int create() override;
    virtual int actorExecute() override;
    virtual int draw() override;

    STATE_FUNC_DECLARE(dAcArrow_c, Wait);
    STATE_FUNC_DECLARE(dAcArrow_c, Move);
    STATE_FUNC_DECLARE(dAcArrow_c, ActorStop);
    STATE_FUNC_DECLARE(dAcArrow_c, BgStop);
    STATE_FUNC_DECLARE(dAcArrow_c, Bound);

    void hitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB);

private:
    static cCcD_SrcGObj sCcSrcInf;
    static dCcD_SrcCps sCc1;
    static const dCcD_SrcSph sCc2;

    static const u8 sDamageArrMaybe[];
    static u16 sCounter;

    bool checkWaterHit(const mVec3_c &v1, mVec3_c &v2, bool noEffect);
    void fn_8025DED0(f32 f);
    void fn_8025E160();
    void updateRoomId();
    s16 fn_8025E640();
    void fn_8025E720(dAcObjBase_c *obj, const mVec3_c &v);
    void updateMtx();
    void setInitialPosition();
    dAcObjBase_c *fn_8025E960();
    void initPickupCc();
    bool checkPickup();
    void onSlingshotHit(const mVec3_c &v, bool);
    void fn_802600D0(bool);
    void fn_802601C0();
    bool fn_80260250(dAcObjBase_c *o1, dAcObjBase_c *o2);

    enum ArrowFlag_e {
        ARROW_0x1 = 1 << 0,
        ARROW_SHOULD_DESPAWN = 1 << 1,
        ARROW_INITIAL_SPAWN = 1 << 2,
        ARROW_0x8 = 1 << 3,
        ARROW_OLD = 1 << 4,
        ARROW_WATER_HIT = 1 << 5,
        ARROW_0x40 = 1 << 6,
        ARROW_FULLY_CHARGED = 1 << 7,
        ARROW_0x100 = 1 << 8,
        ARROW_0x200 = 1 << 9,
        ARROW_0x400 = 1 << 10,
        ARROW_0x800 = 1 << 11,
        ARROW_0x1000 = 1 << 12,
        ARROW_0x2000 = 1 << 13,
        ARROW_0x4000 = 1 << 14,
        ARROW_0x8000 = 1 << 15,
        ARROW_0x10000 = 1 << 16,
    };

    void setArrowFlag(u32 f) {
        mArrowFlags |= f;
    }

    void unsetArrowFlag(u32 f) {
        mArrowFlags &= ~f;
    }

    bool checkArrowFlag (u32 f) const {
        return (mArrowFlags & f) != 0;
    }

    enum ArrowType_e {
        TYPE_MSK_SLINGSHOT = 0x10,
    };

    bool isSlingshotProjectile() const {
        return (mArrowType & TYPE_MSK_SLINGSHOT) != 0;
    }

    /* 0x330 */ nw4r::g3d::ResFile mResFile;
    /* 0x334 */ m3d::smdl_c mModel;
    /* 0x350 */ dAcRef_c<dAcObjBase_c> mRef1;
    /* 0x35C */ dCcD_Cps mCcCps;
    /* 0x4CC */ dCcD_Sph mCcSph;
    /* 0x61C */ cBgS_PolyInfo mPolyInfo;
    /* 0x648 */ dEmitter_c mEffects;
    /* 0x67C */ u32 mArrowFlags;
    /* 0x680 */ u8 mArrowType;
    /* 0x681 */ u8 mHiddenTimer;
    /* 0x682 */ u8 mDespawnTimer;
    /* 0x683 */ u8 field_0x683;
    /* 0x684 */ s16 mCounterIdx;
    /* 0x686 */ u8 field_0x686[0x688 - 0x686];
    /* 0x688 */ s16 field_0x688;
    /* 0x68A */ s16 field_0x68A;
    /* 0x68C */ u16 mEffectId;
    /* 0x68E */ mAng mEffectRotationZ;
    /* 0x690 */ mAng field_0x690;
    /* 0x692 */ mAng3_c mEffectRotation;
    /* 0x698 */ s32 mBoundJntIdx;
    /* 0x69C */ f32 field_0x69C;
    /* 0x6A0 */ f32 field_0x6A0;
    /* 0x6A4 */ f32 field_0x6A4;
    /* 0x6A8 */ f32 field_0x6A8;
    /* 0x6AC */ f32 field_0x6AC;
    /* 0x6B0 */ mVec3_c field_0x6B0;
    /* 0x6BC */ mVec3_c field_0x6BC;
    /* 0x6C8 */ mVec3_c field_0x6C8;
    /* 0x6D4 */ mVec3_c field_0x6D4;
    /* 0x6E0 */ mVec3_c mEffectTranslation;
    /* 0x6EC */ mVec3_c field_0x6EC;
    /* 0x6F8 */ dAcRef_c<dAcObjBase_c> mRef2;
    /* 0x704 */ STATE_MGR_DECLARE(dAcArrow_c);
};

#endif