diff options
| author | robojumper <robojumper@gmail.com> | 2024-11-22 21:30:35 +0100 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2024-11-22 21:30:35 +0100 |
| commit | d70141b14b9070d1421a672f89f82290856590a5 (patch) | |
| tree | 664545bc04743616fd5a6a3448ca0131d8935dc8 /include/d | |
| parent | ee64481b9ca7b80978d93aa717d09f861da2308a (diff) | |
Decompile the ColliderLinkedList stuff too
Diffstat (limited to 'include/d')
| -rw-r--r-- | include/d/a/obj/d_a_obj_tbox.h | 4 | ||||
| -rw-r--r-- | include/d/col/c/c_cc_d.h | 18 | ||||
| -rw-r--r-- | include/d/d_cc.h | 89 |
3 files changed, 99 insertions, 12 deletions
diff --git a/include/d/a/obj/d_a_obj_tbox.h b/include/d/a/obj/d_a_obj_tbox.h index 255d868b..eaccca94 100644 --- a/include/d/a/obj/d_a_obj_tbox.h +++ b/include/d/a/obj/d_a_obj_tbox.h @@ -148,8 +148,8 @@ private: s32 field_0x4F4; /* 0x04F8 */ dBgW mBgWs[2]; - /* 0x0918 */ LinkedCollider mCcD1; - /* 0x0B30 */ LinkedCollider mCcD2; + /* 0x0918 */ LinkedColliderUnk mCcD1; + /* 0x0B30 */ LinkedColliderUnk mCcD2; /* 0x0D48 */ ColliderLinkedList field_0x0D48; /* 0x0D54 */ dCcD_Unk mCcD3; /* 0x0F5C */ dCcD_Cyl mCcD4; diff --git a/include/d/col/c/c_cc_d.h b/include/d/col/c/c_cc_d.h index 49791e31..b9d9daa4 100644 --- a/include/d/col/c/c_cc_d.h +++ b/include/d/col/c/c_cc_d.h @@ -883,6 +883,12 @@ public: u32 ChkAtNoGaurd() const { return mAt.MskSPrm(0x200000); } + void SetAt_0x40000000() { + mAt.OnSPrm(0x40000000); + } + u32 ChkAt_0x40000000() { + return mAt.MskSPrm(0x40000000); + } // Tg @@ -908,6 +914,12 @@ public: void SetTgInfo_0x2(u16 val) { mTg.SetInfo_0x2(val); } + void SetTg_0x40000000() { + mTg.OnSPrm(0x40000000); + } + u32 ChkTg_0x40000000() { + return mTg.MskSPrm(0x40000000); + } // Co @@ -929,6 +941,12 @@ public: void SetCo_0x400() { mCo.OnSPrm(0x400); } + void SetCo_0x40000000() { + mCo.OnSPrm(0x40000000); + } + u32 ChkCo_0x40000000() { + return mCo.MskSPrm(0x40000000); + } /** * SET HIT diff --git a/include/d/d_cc.h b/include/d/d_cc.h index e150555f..2d2f39a4 100644 --- a/include/d/d_cc.h +++ b/include/d/d_cc.h @@ -5,28 +5,97 @@ #include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_d.h" -// Somewhere in d_cc -class LinkedCollider : public dCcD_Unk { +class LinkedColliderNode : public cListNd_c { public: - LinkedCollider() : mpList(nullptr), field_0x210(this) {} - virtual ~LinkedCollider() { + LinkedColliderNode(cCcD_Obj *obj) : mpList(nullptr), mpCcDObj(obj) {} + void remove() { if (mpList != nullptr) { - mpList->remove(&mNode); + mpList->remove(this); mpList = nullptr; } } - /* 0x208 */ cListNd_c mNode; - /* 0x210 */ dCcD_Unk *field_0x210; - /* 0x214 */ cListMg_c *mpList; + /* 0x08 */ cCcD_Obj *mpCcDObj; + /* 0x0C */ cListMg_c *mpList; }; -struct ColliderLinkedList { +class LinkedColliderUnk : public dCcD_Unk { +public: + LinkedColliderUnk() : mNode(this) {} + virtual ~LinkedColliderUnk() { + mNode.remove(); + } + /* 0x210 */ LinkedColliderNode mNode; +}; + +class LinkedColliderCyl : public dCcD_Cyl { +public: + LinkedColliderCyl() : mNode(this) {} + virtual ~LinkedColliderCyl() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class LinkedColliderSph : public dCcD_Sph { +public: + LinkedColliderSph() : mNode(this) {} + virtual ~LinkedColliderSph() { + mNode.remove(); + } + /* 0x150 */ LinkedColliderNode mNode; +}; + +class LinkedColliderCps : public dCcD_Cps { +public: + LinkedColliderCps() : mNode(this) {} + virtual ~LinkedColliderCps() { + mNode.remove(); + } + /* 0x170 */ LinkedColliderNode mNode; +}; + +class ColliderLinkedList { +private: cListMg_c mList; + static void Set(cCcD_Obj *obj, void *cbArg); + static void SetStts(cCcD_Obj *obj, void *cbArg); + static void AtSet(cCcD_Obj *obj, void *cbArg); + static void ClrAt(cCcD_Obj *obj, void *cbArg); + static void TgSet(cCcD_Obj *obj, void *cbArg); + static void ClrTg(cCcD_Obj *obj, void *cbArg); + static void CoSet(cCcD_Obj *obj, void *cbArg); + static void ClrCo(cCcD_Obj *obj, void *cbArg); + +public: virtual ~ColliderLinkedList(); - void addCc(LinkedCollider &ccD, const dCcD_SrcUnk &src); + void postInit(cCcD_Obj &ccD); + void addCc(LinkedColliderCyl &ccD, const dCcD_SrcCyl &src); + void addCc(LinkedColliderSph &ccD, const dCcD_SrcSph &src); + void addCc(LinkedColliderCps &ccD, const dCcD_SrcCps &src); + void addCc(LinkedColliderUnk &ccD, const dCcD_SrcUnk &src); void SetStts(cCcD_Stts &stts); void registerColliders(); + + typedef void (*ccCbFunc)(cCcD_Obj *obj, void *cbArg); + void foreachCc(ccCbFunc f, void *cbArg) const; + void foreachCc2(ccCbFunc f, void *cbArg) const; + + // This find function is used by a lot of other + // TUs, all of which own the function passed as + // a ptmf. It's not immediately clear how this works, + // does every actor subclass the LinkedCollider___, + // or are the functions all added here for the other + // files to implement? + typedef bool (cCcD_Obj::*ccPtmf)(); + cCcD_Obj *find(ccPtmf f) const; + + void AtSet(); + void ClrAt(); + void TgSet(); + void ClrTg(); + void CoSet(); + void ClrCo(); }; #endif |
