From ff99d7763572fc5b463bc8ece39a2c40e90deaf0 Mon Sep 17 00:00:00 2001 From: notyouraveragehooman <65437533+notyouraveragehooman@users.noreply.github.com> Date: Fri, 21 Aug 2020 14:18:47 -0700 Subject: [PATCH 1/3] BaseProc::getConnectedCalcParent BaseProc::setConnectedCalcParent --- data/uking_functions.csv | 4 ++-- src/KingSystem/ActorSystem/actBaseProc.cpp | 26 ++++++++++++++++++++- src/KingSystem/ActorSystem/actBaseProc.h | 2 +- src/KingSystem/ActorSystem/actBaseProcMgr.h | 7 +++--- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c80a95ed..ac76da19 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89467,7 +89467,7 @@ 0x00000071011ba200,ActorBase::x,112, 0x00000071011ba270,ActorBase::queueExtraJobPush,68,_ZN4ksys3act8BaseProc18queueExtraJobPush_ENS0_7JobTypeE 0x00000071011ba2b4,ActorBase::shouldSkipJobPush,144, -0x00000071011ba344,ActorBase::getConnectedCalcParent,32, +0x00000071011ba344,ActorBase::getConnectedCalcParent,32,_ZNK4ksys3act8BaseProc22getConnectedCalcParentEv 0x00000071011ba364,ActorBase::jobInvoked,564, 0x00000071011ba598,ActorBase::updateState,1076,_ZN4ksys3act8BaseProc18processStateUpdateEh! 0x00000071011ba9cc,ActorBase::afterUpdateState,48,_ZN4ksys3act8BaseProc17afterUpdateState_Ev @@ -89483,7 +89483,7 @@ 0x00000071011bb128,ActorBase::wakeUp,484, 0x00000071011bb30c,ActorBase::getConnectedCalcChild,32, 0x00000071011bb32c,ActorBase::setConnectedCalcChild,248, -0x00000071011bb424,ActorBase::setConnectedCalcParent,248, +0x00000071011bb424,ActorBase::setConnectedCalcParent,248,_ZN4ksys3act8BaseProc22setConnectedCalcParentEPS1_b 0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188, 0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188, 0x00000071011bb6a0,ActorBase::setCreatePriorityState2,12, diff --git a/src/KingSystem/ActorSystem/actBaseProc.cpp b/src/KingSystem/ActorSystem/actBaseProc.cpp index 149386e2..79e2cc47 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.cpp +++ b/src/KingSystem/ActorSystem/actBaseProc.cpp @@ -66,7 +66,7 @@ bool BaseProc::deleteLater(DeleteReason reason) { } } - if (!BaseProcMgr::instance()->addToUpdateStateList(*this)) + if (!BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestDelete)) onDeleteRequested_(reason); if (!is_high_prio) @@ -425,4 +425,28 @@ bool BaseProc::x00000071011ba9fc() { return true; } +BaseProc* BaseProc::getConnectedCalcParent() const { + if (mConnectedCalcParent == nullptr || mConnectedCalcParent->mState == State::Delete) + return nullptr; + + return mConnectedCalcParent; +} + +bool BaseProc::setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete) { + if (parent == nullptr) + return false; + + if (isDeletedOrDeleting() || parent->isDeletedOrDeleting()) + return false; + + if (BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestSetParent)) + return false; + + mConnectedCalcParentNew = parent; + + mFlags.change(Flags::DeleteParentOnDelete, delete_parent_on_delete); + + return true; +} + } // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index e0fde4c1..41393c0b 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -107,7 +107,7 @@ public: void release(); BaseProc* getConnectedCalcParent() const; - void setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete); + bool setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_delete); void resetConnectedCalcParent(bool clear_existing_set_request); BaseProc* getConnectedCalcChild() const; diff --git a/src/KingSystem/ActorSystem/actBaseProcMgr.h b/src/KingSystem/ActorSystem/actBaseProcMgr.h index 87fd4e19..9f278515 100644 --- a/src/KingSystem/ActorSystem/actBaseProcMgr.h +++ b/src/KingSystem/ActorSystem/actBaseProcMgr.h @@ -69,7 +69,7 @@ public: void unregisterProc(BaseProc& proc); void addToPreDeleteList(BaseProc& proc); - bool addToUpdateStateList(BaseProc& proc); + bool addToUpdateStateList(BaseProc& proc, BaseProc::StateFlags flags); void eraseFromPreDeleteList(BaseProc& proc); void eraseFromUpdateStateList(BaseProc& proc); void processPreDeleteList(); @@ -210,11 +210,10 @@ private: }; KSYS_CHECK_SIZE_NX150(BaseProcMgr, 0x21a0); -inline bool BaseProcMgr::addToUpdateStateList(BaseProc& proc) { +inline bool BaseProcMgr::addToUpdateStateList(BaseProc& proc, BaseProc::StateFlags flag) { auto lock = sead::makeScopedLock(mProcUpdateStateListCS); doAddToUpdateStateList_(proc); - return (proc.mStateFlags.set(BaseProc::StateFlags::RequestDelete) & - u32(BaseProc::StateFlags::RequestDelete)) != 0; + return (proc.mStateFlags.set(flag) & u32(flag)) != 0; } } // namespace ksys::act From a49164a85fa68175eba66cb1c49d13641dc5f32e Mon Sep 17 00:00:00 2001 From: notyouraveragehooman <65437533+notyouraveragehooman@users.noreply.github.com> Date: Fri, 21 Aug 2020 15:18:54 -0700 Subject: [PATCH 2/3] BaseProc child connection functions --- data/uking_functions.csv | 8 ++-- src/KingSystem/ActorSystem/actBaseProc.cpp | 50 ++++++++++++++++++++++ src/KingSystem/ActorSystem/actBaseProc.h | 2 +- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index ac76da19..39a1ba94 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89481,11 +89481,11 @@ 0x00000071011baed4,ActorBase::setJobPriority2,288, 0x00000071011baff4,ActorBase::sleep,308, 0x00000071011bb128,ActorBase::wakeUp,484, -0x00000071011bb30c,ActorBase::getConnectedCalcChild,32, -0x00000071011bb32c,ActorBase::setConnectedCalcChild,248, +0x00000071011bb30c,ActorBase::getConnectedCalcChild,32,_ZNK4ksys3act8BaseProc21getConnectedCalcChildEv +0x00000071011bb32c,ActorBase::setConnectedCalcChild,248,_ZN4ksys3act8BaseProc21setConnectedCalcChildEPS1_b 0x00000071011bb424,ActorBase::setConnectedCalcParent,248,_ZN4ksys3act8BaseProc22setConnectedCalcParentEPS1_b -0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188, -0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188, +0x00000071011bb51c,ActorBase::resetConnectedCalcChild,188,_ZN4ksys3act8BaseProc23resetConnectedCalcChildEb +0x00000071011bb5d8,ActorBase::resetConnectedCalcParent,188,_ZN4ksys3act8BaseProc24resetConnectedCalcParentEb 0x00000071011bb6a0,ActorBase::setCreatePriorityState2,12, 0x00000071011bb6ac,ActorBase::rtti1,112,_ZNK4ksys3act8BaseProc27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE 0x00000071011bb71c,ActorBase::rtti2,92,_ZNK4ksys3act8BaseProc18getRuntimeTypeInfoEv diff --git a/src/KingSystem/ActorSystem/actBaseProc.cpp b/src/KingSystem/ActorSystem/actBaseProc.cpp index 79e2cc47..2748f667 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.cpp +++ b/src/KingSystem/ActorSystem/actBaseProc.cpp @@ -449,4 +449,54 @@ bool BaseProc::setConnectedCalcParent(BaseProc* parent, bool delete_parent_on_de return true; } +void BaseProc::resetConnectedCalcParent(bool clear_existing_set_request) { + if (isDeletedOrDeleting()) + return; + + if (clear_existing_set_request) { + mStateFlags.reset(StateFlags::RequestSetParent); + mConnectedCalcParentNew = nullptr; + } + + if (mConnectedCalcParent) + BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestResetParent); +} + +BaseProc* BaseProc::getConnectedCalcChild() const { + if (!mConnectedCalcChild || mConnectedCalcChild->mState == State::Delete) + return nullptr; + + return mConnectedCalcChild; +} + +bool BaseProc::setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete) { + if (child == nullptr) + return false; + + if (isDeletedOrDeleting() || child->isDeletedOrDeleting()) + return false; + + if (BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestSetChild)) + return false; + + mConnectedCalcChildNew = child; + + mFlags.change(Flags::DeleteChildOnDelete, delete_child_on_delete); + + return true; +} + +void BaseProc::resetConnectedCalcChild(bool clear_existing_set_request) { + if (isDeletedOrDeleting()) + return; + + if (clear_existing_set_request) { + mStateFlags.reset(StateFlags::RequestSetChild); + mConnectedCalcChildNew = nullptr; + } + + if (mConnectedCalcChild) + BaseProcMgr::instance()->addToUpdateStateList(*this, StateFlags::RequestResetChild); +} + } // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index 41393c0b..4d2675f0 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -111,7 +111,7 @@ public: void resetConnectedCalcParent(bool clear_existing_set_request); BaseProc* getConnectedCalcChild() const; - void setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete); + bool setConnectedCalcChild(BaseProc* child, bool delete_child_on_delete); void resetConnectedCalcChild(bool clear_existing_set_request); bool isSpecialJobType(JobType type); From da35629aa82c50ea26fc09006092ac7c340ca10c Mon Sep 17 00:00:00 2001 From: notyouraveragehooman <65437533+notyouraveragehooman@users.noreply.github.com> Date: Fri, 21 Aug 2020 15:38:44 -0700 Subject: [PATCH 3/3] BaseProc::release --- data/uking_functions.csv | 2 +- src/KingSystem/ActorSystem/actBaseProc.cpp | 5 +++++ src/KingSystem/ActorSystem/actBaseProc.h | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 39a1ba94..2a129d9a 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89474,7 +89474,7 @@ 0x00000071011BA9FC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv,0xBC,_ZN4ksys3act8BaseProc17x00000071011ba9fcEv 0x00000071011baab8,ActorBase::setProcStateFlag,124, 0x00000071011bab34,ActorBase::acquire,196, -0x00000071011babf8,ActorBase::release,36, +0x00000071011babf8,ActorBase::release,36,_ZN4ksys3act8BaseProc7releaseEv 0x00000071011bac1c,ActorBase::doDelete,244, 0x00000071011bad10,ActorBase::preDelete,164,_ZN4ksys3act8BaseProc11doPreDeleteEPb 0x00000071011badb4,ActorBase::setJobPriority,288, diff --git a/src/KingSystem/ActorSystem/actBaseProc.cpp b/src/KingSystem/ActorSystem/actBaseProc.cpp index 2748f667..b0a94ed3 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.cpp +++ b/src/KingSystem/ActorSystem/actBaseProc.cpp @@ -425,6 +425,11 @@ bool BaseProc::x00000071011ba9fc() { return true; } +void BaseProc::release() { + if (mRefCount >= 1) + mRefCount--; +} + BaseProc* BaseProc::getConnectedCalcParent() const { if (mConnectedCalcParent == nullptr || mConnectedCalcParent->mState == State::Delete) return nullptr; diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index 4d2675f0..1c9aa7cc 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -282,7 +282,7 @@ protected: sead::ListNode mDeleteListNode; BaseProcMapNode mMapNode{this}; BaseProcUnit* mProcUnit = nullptr; - sead::Atomic mRefCount = 0; + sead::Atomic mRefCount = 0; private: void unlinkProcUnit_();