This commit is contained in:
robojumper
2026-05-14 15:17:03 +02:00
parent 48fbe8d1da
commit e10759e25a
3 changed files with 112 additions and 113 deletions
+26 -26
View File
@@ -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
+43 -43
View File
@@ -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)();
+43 -44
View File
@@ -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;
}