diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/d/a/d_a_player.h | 13 | ||||
| -rw-r--r-- | include/d/a/obj/d_a_obj_arrow.h | 92 | ||||
| -rw-r--r-- | include/d/col/c/c_cc_d.h | 20 | ||||
| -rw-r--r-- | include/d/d_linkage.h | 19 | ||||
| -rw-r--r-- | include/d/d_player_mdl.h | 13 | ||||
| -rw-r--r-- | include/d/d_vec.h | 14 | ||||
| -rw-r--r-- | include/m/m_vec.h | 3 | ||||
| -rw-r--r-- | include/rvl/MTX/vec.h | 4 |
8 files changed, 167 insertions, 11 deletions
diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index d56631eb..c1d45efd 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -62,7 +62,18 @@ public: // Item select/equip/use functions [0x801E3160 - 0x801E7AD0] ? static s32 calcItemWheelSelection(bool reset, s32 numOptions); - static void addDigInteractionTarget(dAcBase_c*, f32); + static void addDigInteractionTarget(dAcBase_c *, f32); + static void fn_801E2FC0(const mVec3_c &v1, cBgS_PolyInfo &, f32); + + // Slingshot, Bow functions [0x80208CA0 - 0x8020AC30] + mAng fn_80208CA0(); + f32 fn_80208CE0(); // 50.0f + f32 fn_80208CF0(); // 3.0f + void fn_80209700(f32 &, f32 &, bool); + const mVec3_c *fn_802097E0(mAng &, mAng &); + f32 fn_802097B0(); // 50.0f + f32 fn_802097C0(); // 1000.0f + f32 fn_802097D0(); // 4000.0f public: f32 getField_0x4564() const { diff --git a/include/d/a/obj/d_a_obj_arrow.h b/include/d/a/obj/d_a_obj_arrow.h index b3d68cda..a1a17b4b 100644 --- a/include/d/a/obj/d_a_obj_arrow.h +++ b/include/d/a/obj/d_a_obj_arrow.h @@ -6,19 +6,18 @@ #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 "s/s_StateID.hpp" #include "toBeSorted/d_emitter.h" class dAcArrow_c : public dAcObjBase_c { public: - dAcArrow_c() : mPolyInfo(), mStateMgr(*this) {} + dAcArrow_c() : mPolyInfo(), mStateMgr(*this), mEffects(this) {} virtual ~dAcArrow_c(); virtual bool createHeap() override; virtual int create() override; - virtual int doDelete() override; virtual int actorExecute() override; virtual int draw() override; @@ -30,11 +29,70 @@ public: void hitCallback(cCcD_Obj *i_objInfA, dAcObjBase_c *i_actorB, cCcD_Obj *i_objInfB); -public: +private: static cCcD_SrcGObj sCcSrcInf; static dCcD_SrcCps sCc1; static const dCcD_SrcSph sCc2; + static const u8 sDamageArrMaybe[]; + static u16 sCounter; + + bool fn_8025DD20(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 fn_80260050(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_0x2 = 1 << 1, + ARROW_INITIAL_SPAWN = 1 << 2, + ARROW_0x8 = 1 << 3, + ARROW_0x10 = 1 << 4, + ARROW_0x20 = 1 << 5, + ARROW_0x40 = 1 << 6, + ARROW_0x80 = 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; @@ -42,17 +100,31 @@ public: /* 0x4CC */ dCcD_Sph mCcSph; /* 0x61C */ cBgS_PolyInfo mPolyInfo; // ?? /* 0x648 */ dEmitter_c mEffects; - /* 0x67C */ u32 field_0x67C; - /* 0x680 */ u8 mSubType; + /* 0x67C */ u32 mArrowFlags; + /* 0x680 */ u8 mArrowType; /* 0x681 */ u8 field_0x681; /* 0x682 */ u8 mDespawnTimer; + /* 0x683 */ u8 field_0x683; /* 0x684 */ s16 field_0x684; /* 0x686 */ u8 field_0x686[0x688 - 0x686]; - /* 0x688 */ u16 field_0x688; - /* 0x68A */ u16 field_0x68A; - /* 0x68C */ u8 field_0x68C[0x6A8 - 0x68C]; + /* 0x688 */ s16 field_0x688; + /* 0x68A */ s16 field_0x68A; + /* 0x68C */ u16 mEffectId; + /* 0x68E */ mAng field_0x68E; + /* 0x690 */ mAng field_0x690; + /* 0x692 */ mAng3_c field_0x692; + /* 0x698 */ UNKWORD field_0x698; + /* 0x69C */ f32 field_0x69C; + /* 0x6A0 */ f32 field_0x6A0; + /* 0x6A4 */ f32 field_0x6A4; /* 0x6A8 */ f32 field_0x6A8; - /* 0x6AC */ u8 field_0x6AC[0x6F8 - 0x6AC]; + /* 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 field_0x6E0; + /* 0x6EC */ mVec3_c field_0x6EC; /* 0x6F8 */ dAcRef_c<dAcObjBase_c> mRef2; /* 0x704 */ STATE_MGR_DECLARE(dAcArrow_c); }; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index edd178ee..384d253d 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -552,6 +552,10 @@ public: return mSrc.mDamage; } + void SetInfo_0x0(u8 val) { + mSrc.mInfo.field_0x0 = val; + } + const cCcD_SrcGObjAt &GetSrc() const { return mSrc; } @@ -605,6 +609,9 @@ public: void Set_0x4C(u32 f) { field_0x4C = f; } + bool Chk_0x4C(u32 f) const { + return field_0x4C & f; + } u32 MskType(u32 mask) const { return mSrc.mType & mask; @@ -930,6 +937,10 @@ public: mTg.Set_0x4C(f); } + bool ChkTg_0x4C(u32 f) const { + return mTg.Chk_0x4C(f); + } + void SetAtCallback(cCcD_HitCallback cb) { mAt.SetCallback(cb); } @@ -981,12 +992,21 @@ public: void OnAt_0x40() { mAt.OnSPrm(0x40); } + void OnAt_0x1000() { + mAt.OnSPrm(0x1000); + } + void OnAt_0x2000() { + mAt.OnSPrm(0x2000); + } // Related to Beetle (no hook) void OnAt_0x4000() { mAt.OnSPrm(0x4000); } + void SetAtInfo_0x0(u8 amount) { + mAt.SetInfo_0x0(amount); + } void SetAtDamage(u8 amount) { mAt.SetAtDamage(amount); diff --git a/include/d/d_linkage.h b/include/d/d_linkage.h index 720f1769..2739ab49 100644 --- a/include/d/d_linkage.h +++ b/include/d/d_linkage.h @@ -55,6 +55,10 @@ public: return mState; } + f32 getField_0x1C() const { + return field_0x1C; + } + bool checkState(State_e state) const { return mState == state; } @@ -68,6 +72,21 @@ public: return (checkState(STATE_ACTIVE) && mType == type); } + bool hasJntCol() const { + return field_0xA0 != nullptr; + } + + dJntCol_c *getJntCol() { + return field_0xA0; + } + + // TODO - can we get rid of this inline? + int getArrowOffsetPosAndAngle( + mVec3_c const *param_1, mAng3_c const *param_2, mVec3_c *param_3, mVec3_c *param_4, bool param_5 + ) const { + return field_0xA0->getArrowOffsetPosAndAngle(param_1, param_2, param_3, param_4, param_5); + } + public: void set(u32 flags, f32, f32, f32, void *unk); bool tryAttach(dAcObjBase_c *, dAcObjBase_c *, dAcRefBase_c *, ConnectionType_e, bool); diff --git a/include/d/d_player_mdl.h b/include/d/d_player_mdl.h index a01d0a5a..65e5b594 100644 --- a/include/d/d_player_mdl.h +++ b/include/d/d_player_mdl.h @@ -914,6 +914,19 @@ public: static mColor sGuideColor2; static mColor sGuideColor3; + // Really not sure about these - there exist virtual functions for these use cases... + const mAng& getField_0x1268() const { + return field_0x1268; + } + + const mAng& getField_0x126A() const { + return field_0x126A; + } + + void getWeaponLMtx(mMtx_c &mtx) const { + mMainMdl.getNodeWorldMtx(PLAYER_MAIN_NODE_WEAPON_L, mtx); + } + protected: /* 0x370 */ mHeapAllocator_c mModelAllocator; /* 0x38C */ mHeapAllocator_c mSwordAllocator; diff --git a/include/d/d_vec.h b/include/d/d_vec.h index 18fdd628..5c9dbfda 100644 --- a/include/d/d_vec.h +++ b/include/d/d_vec.h @@ -26,4 +26,18 @@ inline mVec3_c vec2ToVec3XY(const mVec2_c &v) { return mVec3_c(v.x, v.y, 0.0f); } +/** + * @brief Computes left x right + * + * @param result the result + * @param left left operant + * @param right right operand + */ +inline void vecCross(mVec3_c &result, const mVec3_c &left, const mVec3_c &right) { + result.set( + (left.y * right.z) - (left.z * right.y), (left.z * right.x) - (left.x * right.z), + (left.x * right.y) - (left.y * right.x) + ); +} + #endif diff --git a/include/m/m_vec.h b/include/m/m_vec.h index 6f0047b9..bd4cc4b0 100644 --- a/include/m/m_vec.h +++ b/include/m/m_vec.h @@ -265,6 +265,9 @@ public: s16 atan2sX_Z() const { return cM::atan2s(x, z); } + s16 atan2snX_nZ() const { + return cM::atan2s(-x, -z); + } s16 atan2snY_XZ() const { return cM::atan2s(-y, absXZ()); } diff --git a/include/rvl/MTX/vec.h b/include/rvl/MTX/vec.h index e220fa40..70e0c58b 100644 --- a/include/rvl/MTX/vec.h +++ b/include/rvl/MTX/vec.h @@ -29,6 +29,10 @@ f32 PSVECDistance(const Vec *, const Vec *); #define VECDistance PSVECDistance void C_VECHalfAngle(const Vec *, const Vec *, Vec *); +void C_VECReflect(const Vec *, const Vec *, Vec *); + +#define VECHalfAngle C_VECHalfAngle +#define VECReflect C_VECReflect #ifdef __cplusplus } |
