diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 5cc32b3a..4b9c307a 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -13354,7 +13354,7 @@ __dt__24sFStateFct_c<9dAcItem_c>Fv = .text:0x80248330; // type:function size:0x6 __dt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c>Fv = .text:0x802483A0; // type:function size:0xA0 __dt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c>Fv = .text:0x80248440; // type:function size:0xA4 __dt__9dAcItem_cFv = .text:0x802484F0; // type:function size:0x248 -__dt__13dAcItem_0xB3CFv = .text:0x80248740; // type:function size:0x40 +__dt__18dAcItemResurgeIf_cFv = .text:0x80248740; // type:function size:0x40 __dt__13dAcItem_0xB34Fv = .text:0x80248780; // type:function size:0x40 AcItem__spawnItem = .text:0x802487C0; // type:function size:0x170 spawnItem2 = .text:0x80248930; // type:function size:0xBC @@ -13923,30 +13923,30 @@ isFirstBitParams2NotSet__9dAcItem_cFv = .text:0x80257770; // type:function size: fn_802577A0 = .text:0x802577A0; // type:function size:0x18 fn_802577C0 = .text:0x802577C0; // type:function size:0x8 fn_802577D0 = .text:0x802577D0; // type:function size:0x8 -vt_0x0C__15dAcItem_0xB34_1Fv = .text:0x802577E0; // type:function size:0x4 -vt_0x10__15dAcItem_0xB34_1FP9dAcItem_c = .text:0x802577F0; // type:function size:0x8 -vt_0x0C__15dAcItem_0xB34_2Fv = .text:0x80257800; // type:function size:0x6C -vt_0x10__15dAcItem_0xB34_2FP9dAcItem_c = .text:0x80257870; // type:function size:0x15C -fn_802579D0__13dAcItem_0xB3CFv = .text:0x802579D0; // type:function size:0x40 -fn_80257A10__13dAcItem_0xB3CFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 -fn_80257A80__13dAcItem_0xB3CFv = .text:0x80257A80; // type:function size:0x3C -fn_80257AC0__13dAcItem_0xB3CFv = .text:0x80257AC0; // type:function size:0x44 -fn_80257B10__13dAcItem_0xB3CCFv = .text:0x80257B10; // type:function size:0x10 -vt_0x0C__15dAcItem_0xB3C_1FUs = .text:0x80257B20; // type:function size:0x4 -vt_0x10__15dAcItem_0xB3C_1Fv = .text:0x80257B30; // type:function size:0x4 -vt_0x14__15dAcItem_0xB3C_1FP9dAcItem_c = .text:0x80257B40; // type:function size:0x8 -vt_0x18__15dAcItem_0xB3C_1Fv = .text:0x80257B50; // type:function size:0x8 +init__26dAcItemPickupPositionOff_cFv = .text:0x802577E0; // type:function size:0x4 +execute__26dAcItemPickupPositionOff_cFP9dAcItem_c = .text:0x802577F0; // type:function size:0x8 +init__25dAcItemPickupPositionOn_cFv = .text:0x80257800; // type:function size:0x6C +execute__25dAcItemPickupPositionOn_cFP9dAcItem_c = .text:0x80257870; // type:function size:0x15C +startResurgeTimer__18dAcItemResurgeIf_cFv = .text:0x802579D0; // type:function size:0x40 +canResurge__18dAcItemResurgeIf_cFP9dAcItem_c = .text:0x80257A10; // type:function size:0x68 +resetTimer__18dAcItemResurgeIf_cFv = .text:0x80257A80; // type:function size:0x3C +execute__18dAcItemResurgeIf_cFv = .text:0x80257AC0; // type:function size:0x44 +isTimerExpired__18dAcItemResurgeIf_cCFv = .text:0x80257B10; // type:function size:0x10 +setTimerInitVal__19dAcItemResurgeOff_cFUs = .text:0x80257B20; // type:function size:0x4 +postReset__19dAcItemResurgeOff_cFv = .text:0x80257B30; // type:function size:0x4 +isResurgeAllowed__19dAcItemResurgeOff_cFP9dAcItem_c = .text:0x80257B40; // type:function size:0x8 +getTimerInitVal__19dAcItemResurgeOff_cFv = .text:0x80257B50; // type:function size:0x8 fn_80257B60 = .text:0x80257B60; // type:function size:0x4 fn_80257B70 = .text:0x80257B70; // type:function size:0x4 fn_80257B80 = .text:0x80257B80; // type:function size:0x8 fn_80257B90 = .text:0x80257B90; // type:function size:0x8 isOutOfTime = .text:0x80257BA0; // type:function size:0x1C -vt_0x0C__15dAcItem_0xB3C_2FUs = .text:0x80257BC0; // type:function size:0x8 -vt_0x10__15dAcItem_0xB3C_2Fv = .text:0x80257BD0; // type:function size:0x4 -vt_0x14__15dAcItem_0xB3C_2FP9dAcItem_c = .text:0x80257BE0; // type:function size:0x28 -vt_0x18__15dAcItem_0xB3C_2Fv = .text:0x80257C10; // type:function size:0x8 -__dt__15dAcItem_0xB3C_2Fv = .text:0x80257C20; // type:function size:0x40 -__dt__15dAcItem_0xB3C_1Fv = .text:0x80257C60; // type:function size:0x40 +setTimerInitVal__18dAcItemResurgeOn_cFUs = .text:0x80257BC0; // type:function size:0x8 +postReset__18dAcItemResurgeOn_cFv = .text:0x80257BD0; // type:function size:0x4 +isResurgeAllowed__18dAcItemResurgeOn_cFP9dAcItem_c = .text:0x80257BE0; // type:function size:0x28 +getTimerInitVal__18dAcItemResurgeOn_cFv = .text:0x80257C10; // type:function size:0x8 +__dt__18dAcItemResurgeOn_cFv = .text:0x80257C20; // type:function size:0x40 +__dt__19dAcItemResurgeOff_cFv = .text:0x80257C60; // type:function size:0x40 __dt__15dAcItem_0xB34_2Fv = .text:0x80257CA0; // type:function size:0x40 __dt__15dAcItem_0xB34_1Fv = .text:0x80257CE0; // type:function size:0x40 build__24sFStateFct_c<9dAcItem_c>FRC12sStateIDIf_c = .text:0x80257D20; // type:function size:0x60 @@ -36272,12 +36272,12 @@ __vt__47sFStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c> = .data:0x80533F78; // t __vt__77sStateMgr_c<9dAcItem_c,20sStateMethodUsr_FI_c,12sFStateFct_c,13sStateIDChk_c> = .data:0x80533FA8; // type:object size:0x30 __vt__24sFStateFct_c<9dAcItem_c> = .data:0x80533FD8; // type:object size:0x18 __vt__21sFState_c<9dAcItem_c> = .data:0x80533FF0; // type:object size:0x18 -__vt__15dAcItem_0xB3C_2 = .data:0x80534008; // type:object size:0x1C -__vt__15dAcItem_0xB3C_1 = .data:0x80534024; // type:object size:0x1C -__vt__13dAcItem_0xB3C = .data:0x80534040; // type:object size:0x1C -__vt__15dAcItem_0xB34_2 = .data:0x8053405C; // type:object size:0x14 -__vt__15dAcItem_0xB34_1 = .data:0x80534070; // type:object size:0x14 -__vt__13dAcItem_0xB34 = .data:0x80534084; // type:object size:0x14 +__vt__18dAcItemResurgeOn_c = .data:0x80534008; // type:object size:0x1C +__vt__19dAcItemResurgeOff_c = .data:0x80534024; // type:object size:0x1C +__vt__18dAcItemResurgeIf_c = .data:0x80534040; // type:object size:0x1C +__vt__25dAcItemPickupPositionOn_c = .data:0x8053405C; // type:object size:0x14 +__vt__26dAcItemPickupPositionOff_c = .data:0x80534070; // type:object size:0x14 +__vt__25dAcItemPickupPositionIf_c = .data:0x80534084; // type:object size:0x14 __vt__13dAcItemBase_c = .data:0x80534098; // type:object size:0x94 lbl_80534130 = .data:0x80534130; // type:object size:0x32C __vt__23sFStateID_c<9dAcItem_c> = .data:0x8053445C; // type:object size:0x34 diff --git a/include/d/a/d_a_item.h b/include/d/a/d_a_item.h index 8d06e468..ae7bddb5 100644 --- a/include/d/a/d_a_item.h +++ b/include/d/a/d_a_item.h @@ -26,27 +26,27 @@ class dItemMdl_c; class dAcItem_c; /** Positions picked up items for a bit. */ -class dAcItem_0xB34 { +class dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34() {} - virtual void vt_0x0C() = 0; - virtual bool vt_0x10(dAcItem_c *item) = 0; + virtual ~dAcItemPickupPositionIf_c() {} + virtual void init() = 0; + virtual bool execute(dAcItem_c *item) = 0; }; /** No-op impl that immediately hides the item */ -class dAcItem_0xB34_1 : public dAcItem_0xB34 { +class dAcItemPickupPositionOff_c : public dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34_1() {} - virtual void vt_0x0C() override; - virtual bool vt_0x10(dAcItem_c *item) override; + virtual ~dAcItemPickupPositionOff_c() {} + virtual void init() override; + virtual bool execute(dAcItem_c *item) override; }; /** Impl that positions picked up items above Link's head */ -class dAcItem_0xB34_2 : public dAcItem_0xB34 { +class dAcItemPickupPositionOn_c : public dAcItemPickupPositionIf_c { public: - virtual ~dAcItem_0xB34_2() {} - virtual void vt_0x0C() override; - virtual bool vt_0x10(dAcItem_c *item) override; + virtual ~dAcItemPickupPositionOn_c() {} + virtual void init() override; + virtual bool execute(dAcItem_c *item) override; private: /* 0x04 */ f32 mHighestRelativeHeadHeight; @@ -54,52 +54,52 @@ private: }; /** Respawns certain items. */ -class dAcItem_0xB3C { +class dAcItemResurgeIf_c { public: - virtual ~dAcItem_0xB3C() {} - virtual void vt_0x0C(u16) = 0; - virtual void vt_0x10() = 0; - virtual bool vt_0x14(dAcItem_c *) = 0; - virtual UNKWORD vt_0x18() = 0; + virtual ~dAcItemResurgeIf_c() {} + virtual void setTimerInitVal(u16) = 0; + virtual void postReset() = 0; + virtual bool isResurgeAllowed(dAcItem_c *) = 0; + virtual s32 getTimerInitVal() = 0; - void fn_802579D0(); - bool fn_80257A10(dAcItem_c *); - void fn_80257A80(); - void fn_80257AC0(); - bool fn_80257B10() const; + void startResurgeTimer(); + bool canResurge(dAcItem_c *); + void resetTimer(); + void execute(); + bool isTimerExpired() const; protected: - /* 0x04 */ UNKWORD field_0x04; + /* 0x04 */ s32 mTimer; }; /** No-op impl that doesn't respawn items */ -class dAcItem_0xB3C_1 : public dAcItem_0xB3C { +class dAcItemResurgeOff_c : public dAcItemResurgeIf_c { public: - dAcItem_0xB3C_1(u16, u16) {} - virtual ~dAcItem_0xB3C_1() {} - virtual void vt_0x0C(u16) override; - virtual void vt_0x10() override; - virtual bool vt_0x14(dAcItem_c *) override; - virtual UNKWORD vt_0x18() override; + dAcItemResurgeOff_c(u16, u16) {} + virtual ~dAcItemResurgeOff_c() {} + virtual void setTimerInitVal(u16) override; + virtual void postReset() override; + virtual bool isResurgeAllowed(dAcItem_c *) override; + virtual s32 getTimerInitVal() override; }; /** Impl that respawns items */ -class dAcItem_0xB3C_2 : public dAcItem_0xB3C { +class dAcItemResurgeOn_c : public dAcItemResurgeIf_c { public: - dAcItem_0xB3C_2(u16 a1, u16 a2) { + dAcItemResurgeOn_c(u16 a1, u16 a2) { mCb1 = sCb1s[a1]; mCb2 = sCb2s[a2]; } - virtual ~dAcItem_0xB3C_2() {} - virtual void vt_0x0C(u16) override; - virtual void vt_0x10() override; - virtual bool vt_0x14(dAcItem_c *) override; - virtual UNKWORD vt_0x18() override; + virtual ~dAcItemResurgeOn_c() {} + virtual void setTimerInitVal(u16) override; + virtual void postReset() override; + virtual bool isResurgeAllowed(dAcItem_c *) override; + virtual s32 getTimerInitVal() override; public: - typedef void (dAcItem_0xB3C_2::*Callback1)(); + typedef void (dAcItemResurgeOn_c::*Callback1)(); // May or may not take a dAcItem_c* argument... - typedef bool (dAcItem_0xB3C_2::*Callback2)(); + typedef bool (dAcItemResurgeOn_c::*Callback2)(); static Callback1 sCb1s[2]; static Callback2 sCb2s[3]; @@ -113,7 +113,7 @@ public: /* 0x08 */ Callback1 mCb1; /* 0x14 */ Callback2 mCb2; - /* 0x20 */ UNKWORD field_0x20; + /* 0x20 */ s32 mInitVal; }; class dAcItem_c : public dAcItemBase_c { @@ -743,8 +743,8 @@ private: /* 0xAB8 */ fLiNdBa_c mNode; /* 0xAC4 */ ActorEventRelated mEventRelated; /* 0xB14 */ DowsingTarget mDowsingTarget; - /* 0xB34 */ dAcItem_0xB34 *field_0xB34[2]; - /* 0xB34 */ dAcItem_0xB3C *field_0xB3C; + /* 0xB34 */ dAcItemPickupPositionIf_c *mpPickupPositionCtl[2]; + /* 0xB34 */ dAcItemResurgeIf_c *mpResurgeCtl; /* 0xB40 */ void (dAcItem_c::*mFnAction)(); /* 0xB4C */ void (dAcItem_c::*mFnBounce)(); /* 0xB58 */ void (dAcItem_c::*mFunc_0xB58)(); diff --git a/src/d/a/d_a_item.cpp b/src/d/a/d_a_item.cpp index f467afc7..47cfabc2 100644 --- a/src/d/a/d_a_item.cpp +++ b/src/d/a/d_a_item.cpp @@ -505,9 +505,9 @@ dAcItem_c::dAcItem_c() } dAcItem_c::~dAcItem_c() { - delete field_0xB3C; + delete mpResurgeCtl; for (int i = 0; i < 2; i++) { - delete field_0xB34[i]; + delete mpPickupPositionCtl[i]; } delete mpMdl; mDowsingTarget.doUnregister(); @@ -563,28 +563,27 @@ bool dAcItem_c::createHeap() { return false; } - field_0xB34[0] = new dAcItem_0xB34_1(); - if (field_0xB34[0] == nullptr) { + mpPickupPositionCtl[0] = new dAcItemPickupPositionOn_c(); + if (mpPickupPositionCtl[0] == nullptr) { return false; } - field_0xB34[1] = new dAcItem_0xB34_2(); - if (field_0xB34[1] == nullptr) { + mpPickupPositionCtl[1] = new dAcItemPickupPositionOff_c(); + if (mpPickupPositionCtl[1] == nullptr) { return false; } if (getItemInitStruct()->_0x00[6] != 0) { - field_0xB3C = new dAcItem_0xB3C_2(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + mpResurgeCtl = new dAcItemResurgeOn_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); if (mId == ITEM_STAMINA_FRUIT) { - // TODO ... - field_0xB3C->vt_0x0C(150 /* 0x96 */); + mpResurgeCtl->setTimerInitVal(150); } else if (isLightFruit()) { - field_0xB3C->vt_0x0C(0 /* 0x0 */); + mpResurgeCtl->setTimerInitVal(0); } } else { - field_0xB3C = new dAcItem_0xB3C_1(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); + mpResurgeCtl = new dAcItemResurgeOff_c(getItemInitStruct()->_0x00[4], getItemInitStruct()->_0x00[5]); } - if (field_0xB3C == nullptr) { + if (mpResurgeCtl == nullptr) { return false; } @@ -2109,7 +2108,7 @@ void dAcItem_c::initializeState_ResurgeWait() { // TODO FPR swap mPosition = mPositionCopy; mRotation = mRotationCopy; - field_0xB3C->fn_802579D0(); + mpResurgeCtl->startResurgeTimer(); setNotWaiting(); // TODO ??? mbNoGravity = mbNoDespawn; @@ -2119,10 +2118,10 @@ void dAcItem_c::initializeState_ResurgeWait() { } void dAcItem_c::executeState_ResurgeWait() { - if (field_0xB3C->fn_80257A10(this)) { - if (!field_0xB3C->fn_80257B10()) { - field_0xB3C->fn_80257AC0(); - if (field_0xB3C->fn_80257B10()) { + if (mpResurgeCtl->canResurge(this)) { + if (!mpResurgeCtl->isTimerExpired()) { + mpResurgeCtl->execute(); + if (mpResurgeCtl->isTimerExpired()) { if (mId == ITEM_STAMINA_FRUIT) { startSound(SE_O_REFRESH_FRUIT_SPROUT); } @@ -2130,7 +2129,7 @@ void dAcItem_c::executeState_ResurgeWait() { } } } else { - field_0xB3C->fn_80257A80(); + mpResurgeCtl->resetTimer(); } } @@ -2594,15 +2593,15 @@ void dAcItem_c::rotateFixedBirdStatuette() { mRotation.z.mVal = 0; } -void dAcItem_0xB34_1::vt_0x0C() { +void dAcItemPickupPositionOff_c::init() { // no-op } -bool dAcItem_0xB34_1::vt_0x10(dAcItem_c *item) { +bool dAcItemPickupPositionOff_c::execute(dAcItem_c *item) { return false; } -void dAcItem_0xB34_2::vt_0x0C() { +void dAcItemPickupPositionOn_c::init() { // TODO weird double load dAcPy_c *link = dAcPy_c::GetLinkM(); if (link != nullptr) { @@ -2611,7 +2610,7 @@ void dAcItem_0xB34_2::vt_0x0C() { mNumFrames = 0; } -bool dAcItem_0xB34_2::vt_0x10(dAcItem_c *item) { +bool dAcItemPickupPositionOn_c::execute(dAcItem_c *item) { if (mNumFrames >= 22) { return false; } @@ -2641,63 +2640,63 @@ bool dAcItem_0xB34_2::vt_0x10(dAcItem_c *item) { return true; } -void dAcItem_0xB3C::fn_802579D0() { - fn_80257A80(); - vt_0x10(); +void dAcItemResurgeIf_c::startResurgeTimer() { + resetTimer(); + postReset(); } -bool dAcItem_0xB3C::fn_80257A10(dAcItem_c *item) { +bool dAcItemResurgeIf_c::canResurge(dAcItem_c *item) { if (item->getSquareDistToPlayer() < 40000.0f) { return false; } - return vt_0x14(item); + return isResurgeAllowed(item); } -void dAcItem_0xB3C::fn_80257A80() { - field_0x04 = vt_0x18(); +void dAcItemResurgeIf_c::resetTimer() { + mTimer = getTimerInitVal(); } -void dAcItem_0xB3C::fn_80257AC0() { - if (field_0x04 == 0) { +void dAcItemResurgeIf_c::execute() { + if (mTimer == 0) { return; } if (!EventManager::isInEvent()) { - field_0x04--; + mTimer--; } } -bool dAcItem_0xB3C::fn_80257B10() const { - return field_0x04 == 0; +bool dAcItemResurgeIf_c::isTimerExpired() const { + return mTimer == 0; } -void dAcItem_0xB3C_1::vt_0x0C(u16 arg) { +void dAcItemResurgeOff_c::setTimerInitVal(u16 arg) { // no-op } -void dAcItem_0xB3C_1::vt_0x10() { +void dAcItemResurgeOff_c::postReset() { // no-op } -bool dAcItem_0xB3C_1::vt_0x14(dAcItem_c *) { +bool dAcItemResurgeOff_c::isResurgeAllowed(dAcItem_c *) { return false; } -UNKWORD dAcItem_0xB3C_1::vt_0x18() { +s32 dAcItemResurgeOff_c::getTimerInitVal() { return 0; } -void dAcItem_0xB3C_2::vt_0x0C(u16 arg) { - field_0x20 = arg; +void dAcItemResurgeOn_c::setTimerInitVal(u16 arg) { + mInitVal = arg; } -void dAcItem_0xB3C_2::vt_0x10() { +void dAcItemResurgeOn_c::postReset() { // no-op } -bool dAcItem_0xB3C_2::vt_0x14(dAcItem_c *) { +bool dAcItemResurgeOn_c::isResurgeAllowed(dAcItem_c *) { return (this->*mCb2)(); } -UNKWORD dAcItem_0xB3C_2::vt_0x18() { - return field_0x20; +s32 dAcItemResurgeOn_c::getTimerInitVal() { + return mInitVal; }