diff options
| author | robojumper <robojumper@gmail.com> | 2026-05-07 19:52:36 +0200 |
|---|---|---|
| committer | robojumper <robojumper@gmail.com> | 2026-05-14 14:40:32 +0200 |
| commit | 48fbe8d1da7a82412a73746620291af93354364a (patch) | |
| tree | aa7cb0631f3970e41aa4266ca51657237d6917fa /include | |
| parent | 02bab6f41fc616ca7d9aa77f4a81782d65b16200 (diff) | |
Progress
Diffstat (limited to 'include')
| -rw-r--r-- | include/d/a/d_a_item.h | 120 | ||||
| -rw-r--r-- | include/d/a/d_a_itembase.h | 1 | ||||
| -rw-r--r-- | include/d/d_angle.h | 17 |
3 files changed, 104 insertions, 34 deletions
diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 8c28c148..8d06e468 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -1,14 +1,16 @@ #ifndef D_A_ITEM_H #define D_A_ITEM_H +// clang-format off +// vtable order #include "common.h" +#include "d/d_shadow.h" #include "d/a/d_a_base.h" #include "d/a/d_a_itembase.h" #include "d/a/obj/d_a_obj_scattersand.h" #include "d/col/bg/d_bg_s_acch.h" #include "d/col/c/c_cc_d.h" #include "d/col/cc/d_cc_d.h" -#include "d/d_shadow.h" #include "f/f_list_mg.h" #include "f/f_list_nd.h" #include "m/m_angle.h" @@ -18,84 +20,100 @@ #include "toBeSorted/actor_event.h" #include "toBeSorted/d_emitter.h" #include "toBeSorted/dowsing_target.h" +// clang-format on class dItemMdl_c; class dAcItem_c; +/** Positions picked up items for a bit. */ class dAcItem_0xB34 { public: virtual ~dAcItem_0xB34() {} virtual void vt_0x0C() = 0; - virtual void vt_0x10() = 0; + virtual bool vt_0x10(dAcItem_c *item) = 0; }; +/** No-op impl that immediately hides the item */ class dAcItem_0xB34_1 : public dAcItem_0xB34 { public: virtual ~dAcItem_0xB34_1() {} virtual void vt_0x0C() override; - virtual void vt_0x10() override; + virtual bool vt_0x10(dAcItem_c *item) override; }; +/** Impl that positions picked up items above Link's head */ class dAcItem_0xB34_2 : public dAcItem_0xB34 { public: virtual ~dAcItem_0xB34_2() {} virtual void vt_0x0C() override; - virtual void vt_0x10() override; + virtual bool vt_0x10(dAcItem_c *item) override; private: - /* 0x04 */ u8 _0x04[0x0C - 0x04]; + /* 0x04 */ f32 mHighestRelativeHeadHeight; + /* 0x08 */ u8 mNumFrames; }; +/** Respawns certain items. */ class dAcItem_0xB3C { public: virtual ~dAcItem_0xB3C() {} virtual void vt_0x0C(u16) = 0; virtual void vt_0x10() = 0; - virtual void vt_0x14() = 0; - virtual void vt_0x18() = 0; + virtual bool vt_0x14(dAcItem_c *) = 0; + virtual UNKWORD vt_0x18() = 0; void fn_802579D0(); - bool fn_80257A10(dAcItem_c*); - bool fn_80257A80(); + bool fn_80257A10(dAcItem_c *); + void fn_80257A80(); void fn_80257AC0(); - bool fn_80257B10(); + bool fn_80257B10() const; protected: - /* 0x04 */ u8 _0x04[0x08 - 0x04]; + /* 0x04 */ UNKWORD field_0x04; }; +/** No-op impl that doesn't respawn items */ class dAcItem_0xB3C_1 : public dAcItem_0xB3C { public: dAcItem_0xB3C_1(u16, u16) {} - virtual ~dAcItem_0xB3C_1(); + virtual ~dAcItem_0xB3C_1() {} virtual void vt_0x0C(u16) override; virtual void vt_0x10() override; - virtual void vt_0x14() override; - virtual void vt_0x18() override; + virtual bool vt_0x14(dAcItem_c *) override; + virtual UNKWORD vt_0x18() override; }; +/** Impl that respawns items */ class dAcItem_0xB3C_2 : public dAcItem_0xB3C { public: dAcItem_0xB3C_2(u16 a1, u16 a2) { mCb1 = sCb1s[a1]; mCb2 = sCb2s[a2]; } - virtual ~dAcItem_0xB3C_2(); + virtual ~dAcItem_0xB3C_2() {} virtual void vt_0x0C(u16) override; virtual void vt_0x10() override; - virtual void vt_0x14() override; - virtual void vt_0x18() override; + virtual bool vt_0x14(dAcItem_c *) override; + virtual UNKWORD vt_0x18() override; public: typedef void (dAcItem_0xB3C_2::*Callback1)(); + // May or may not take a dAcItem_c* argument... typedef bool (dAcItem_0xB3C_2::*Callback2)(); static Callback1 sCb1s[2]; static Callback2 sCb2s[3]; + void Cb1_1(); + void Cb1_2(); + + bool Cb2_1(); + bool Cb2_2(); + bool Cb2_3(); + /* 0x08 */ Callback1 mCb1; /* 0x14 */ Callback2 mCb2; - /* 0x20 */ u8 _0x20[0x24 - 0x20]; + /* 0x20 */ UNKWORD field_0x20; }; class dAcItem_c : public dAcItemBase_c { @@ -110,10 +128,17 @@ public: virtual int draw() override; virtual u16 getItemIdFromParams() override; - virtual void setItemId(u16 id); + virtual void setItemId(u16 id) override; virtual bool shouldDespawn(); virtual bool isItemSmallKeyOrHeartPieceOrStaminaFruit(); + enum ItemGetAnim_e { + ANIM_DEFAULT, + ANIM_GORGEOUS, + ANIM_FROWN, + ANIM_SMALL, + }; + STATE_FUNC_DECLARE(dAcItem_c, Wait); STATE_FUNC_DECLARE(dAcItem_c, Carry); STATE_FUNC_DECLARE(dAcItem_c, GetBeetle); @@ -141,9 +166,11 @@ public: static void setFlag(s32 id); static bool checkTreasureTempCollect(u16 itemId); - void setItemPosition(const mVec3_c &); void getItemFromBWheelItem(); - bool isStateWait(); + void setItemPosition(const mVec3_c &); + void setItemVelocity(f32 f); + bool isStateWait() const; + void stopCarryAndGet(); static s32 getTotalBombCount(); static s32 getTotalArrowCount(); @@ -224,7 +251,10 @@ public: u32 getParams2Lower_shift1_0x7() const; + static bool getEventNameForAnim(u32 anim, const char **outName); + static bool getTboxEventNameForAnim(u32 anim, const char **outName); static bool getItemGetEventName(u16 item, const char **outName); + static bool getItemGetTboxEventName(u16 item, const char **outName); static void itemGetEventStart(dAcBase_c *); static void itemGetEventEnd(dAcBase_c *); @@ -248,7 +278,7 @@ public: TEAR_MAX }; - static Tear_e getTearSubtype(ITEM_ID item); + static Tear_e getTearSubtype(u32 item); static void healLink(u32 amount, bool); // move to dAcPy_c @@ -265,6 +295,10 @@ public: } private: + bool isField_0xD04GtZero() const { + return 0.0f < field_0xD04; + } + static bool sIsPerformingInitialCollection; static s32 sCollectionCurrentCount; @@ -275,8 +309,17 @@ private: static const mVec3_c sScale1Maybe; static const mVec3_c sScale2Maybe; + static const mVec3_c sUnkOffset1; + static const mVec3_c sUnkOffset2; + static const mVec3_c sUnkOffset3; + static const mVec3_c sUnkOffset4; + static const mVec3_c sUnkOffset5; + static const mVec3_c sUnkOffset6; + static const mVec2_c sUnkVec2; + typedef bool (dAcItem_c::*sStaticPtmf)(); - static const sStaticPtmf sStaticPtmfs[]; + static const sStaticPtmf sStaticPtmfs1[]; + static const sStaticPtmf sStaticPtmfs2[]; static dAcRef_c<dAcObjBase_c> sItemListHead; static dAcRef_c<dAcObjBase_c> sItemListTail; @@ -397,6 +440,11 @@ private: void incrementFramesInAir(); void setItemFlags(u32 flags); + /** Checks if the ground's specialCode should allow the item to sink, deleting the item when fully submerged */ + bool isItemDeleteGround(s32 specialCode) const; + /** Checks if the ground's specialCode should allow the item to "dip" into the ground */ + bool isItemSwimGround(s32 specialCode) const; + bool fn_80255CF0(); bool fn_802574A0(); void addToGetQueue(); @@ -409,8 +457,6 @@ private: bool fn_802577A0(); void fn_80256F20(); bool fn_80256E80(); - bool fn_80255C50(u32 specialCode); - bool fn_80255CA0(u32 specialCode); void getCurrentModelScale(f32 *scale); f32 getCurrentScale(); void fn_802518C0(mVec3_c *out); @@ -456,7 +502,10 @@ private: void fn_80254810(); static s16 getItemRotateAngle(); - static void getItemGetEventName(u16 id, char *const *name); + bool playHeartStemCutSound(); + + void getOffsetPosition(mVec3_c &position) const; + f32 scaleBy(f32 f) const; // Could also return vector static void fn_80247540(mVec3_c &); @@ -662,12 +711,14 @@ private: f32 getRupoorHitKnockbackRand3(); f32 getHeartHitKnockbackRand3(); - f32 fn_802577C0(); - f32 fn_802577D0(); + f32 getSinkSpeedHeart(); + f32 getSinkSpeedDefault(); - void fn_80255E80(); - void fn_80255F40(); +public: + void rotateTowardsCamera(); + void rotateFixedBirdStatuette(); +private: /* 0x334 */ dItemMdl_c *mpMdl; /* 0x338 */ dShadowCircle_c mShdw; /* 0x340 */ mVec3_c field_0x340; @@ -688,7 +739,7 @@ private: /* 0xA60 */ dEmitter_c mEff_0xA60; /* 0xA94 */ dAcRef_c<dAcOScatterSand> mCoveredSand; /* 0xAA0 */ dAcRef_c<dAcObjBase_c> mForceSignRef; - /* 0xAAC */ mVec3_c posCopy; + /* 0xAAC */ mVec3_c mItemPosCopy; /* 0xAB8 */ fLiNdBa_c mNode; /* 0xAC4 */ ActorEventRelated mEventRelated; /* 0xB14 */ DowsingTarget mDowsingTarget; @@ -725,7 +776,7 @@ private: /* 0xC90 */ f32 (dAcItem_c::*mFn_0xC90)(); /* 0xC9C */ void (dAcItem_c::*mFn_0xC9C)(); /* 0xCA8 */ void (dAcItem_c::*mFnSetBoundingBox)(); - /* 0xCB4 */ f32 (dAcItem_c::*mFn_0xCB4)(void); + /* 0xCB4 */ f32 (dAcItem_c::*mFnGetSinkSpeed)(void); /* 0xCC0 */ dAcRef_c<dAcItem_c> mItemQueuePrev; /* 0xCCC */ dAcRef_c<dAcItem_c> mItemQueueNext; /* 0xCD8 */ f32 field_0xCD8; @@ -735,9 +786,9 @@ private: /* 0xCE8 */ f32 field_0xCE8; /* 0xCEC */ f32 field_0xCEC; /* 0xCF0 */ u8 _CF0[0xD00 - 0xCF0]; - /* 0xD00 */ f32 field_0xD00; + /* 0xD00 */ f32 mSinkOffset; /* 0xD04 */ f32 field_0xD04; - /* 0xD08 */ u8 _D08[0xD0C - 0xD08]; + /* 0xD08 */ f32 field_0xD08; /* 0xD0C */ f32 field_0xD0C; /* 0xD10 */ u8 _D10[0xD14 - 0xD10]; /* 0xD14 */ f32 mFreestandingOffsetH; @@ -790,6 +841,7 @@ private: public: static fLiMgBa_c sItemList; + static fLiMgBa_c sUnusedList; }; #endif diff --git a/include/d/a/d_a_itembase.h b/include/d/a/d_a_itembase.h index d0f29f23..828d98c0 100644 --- a/include/d/a/d_a_itembase.h +++ b/include/d/a/d_a_itembase.h @@ -245,6 +245,7 @@ public: virtual ~dAcItemBase_c() {} virtual u16 getItemId() const; virtual u16 getItemIdFromParams() = 0; + virtual void setItemId(u16 id); static bool isValidItemTypeIdx(int itemId); static bool getItemTypeFromId(u16 itemID, u32 *pOutType); diff --git a/include/d/d_angle.h b/include/d/d_angle.h new file mode 100644 index 00000000..dc12dabc --- /dev/null +++ b/include/d/d_angle.h @@ -0,0 +1,17 @@ +#ifndef D_ANGLE_H +#define D_ANGLE_H + +#include "m/m_angle.h" +#include "m/m_vec.h" + +inline void setRotXY(mAng3_c &rot, s32 x, s32 y) { + rot.x.mVal = x; + rot.y.mVal = y; + rot.z.mVal = 0; +} + +inline void setRotXYVec(mAng3_c &rot, const mVec3_c &direction) { + setRotXY(rot, -direction.atan2sY_XZ(), direction.atan2sX_Z()); +} + +#endif |
