From d072fcf7da93fcd03a10a169ac3e10476191916e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 12 Mar 2021 17:19:34 +0100 Subject: [PATCH] ksys/act: Start adding BaseProcCreateTask --- data/uking_functions.csv | 22 ++--- src/KingSystem/ActorSystem/CMakeLists.txt | 2 + src/KingSystem/ActorSystem/actBaseProc.h | 4 + .../ActorSystem/actBaseProcCreateTask.cpp | 83 ++++++++++++++++ .../ActorSystem/actBaseProcCreateTask.h | 95 +++++++++++++++++++ .../ActorSystem/actBaseProcHandle.h | 1 + src/KingSystem/ActorSystem/actInstParamPack.h | 3 + src/KingSystem/Map/mapObject.h | 2 + 8 files changed, 201 insertions(+), 11 deletions(-) create mode 100644 src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp create mode 100644 src/KingSystem/ActorSystem/actBaseProcCreateTask.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index ba4c2e90..fb75c72a 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -96955,17 +96955,17 @@ 0x0000007101304bdc,sub_7101304BDC,288, 0x0000007101304cfc,sub_7101304CFC,204, 0x0000007101304dc8,sub_7101304DC8,92, -0x0000007101304e24,BaseProcEvent::ctor,240, -0x0000007101304f14,BaseProcEvent::invokedCreateActor,400, -0x00000071013050a4,sub_71013050A4,88, -0x00000071013050fc,BaseProcEvent::initWithRequestData,688, -0x00000071013053ac,BaseProcEvent::initWithRequest,152, -0x0000007101305444,BaseProcEvent::rtti1,288, -0x0000007101305564,BaseProcEvent::rtti2,92, -0x00000071013055c0,BaseProcEvent::dtor,56, -0x00000071013055f8,BaseProcEvent::dtorDelete,64, -0x0000007101305638,sub_7101305638,52, -0x000000710130566c,sub_710130566C,92, +0x0000007101304e24,BaseProcEvent::ctor,240,_ZN4ksys3act18BaseProcCreateTaskC1EPN4sead4HeapE +0x0000007101304f14,BaseProcEvent::invokedCreateActor,400,_ZN4ksys3act18BaseProcCreateTask21onTaskDelegateInvokedEPv +0x00000071013050a4,sub_71013050A4,88,_ZN4ksys3act18BaseProcCreateTask24onBaseProcCreationFailedEPNS0_8BaseProcEb +0x00000071013050fc,BaseProcEvent::initWithRequestData,688,_ZN4ksys3act18BaseProcCreateTask9doPrepareEPKNS0_22BaseProcCreateTaskDataE +0x00000071013053ac,BaseProcEvent::initWithRequest,152,_ZN4ksys3act18BaseProcCreateTask12prepareImpl_EPNS_4util11TaskRequestE +0x0000007101305444,BaseProcEvent::rtti1,288,_ZNK4ksys3act18BaseProcCreateTask27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x0000007101305564,BaseProcEvent::rtti2,92,_ZNK4ksys3act18BaseProcCreateTask18getRuntimeTypeInfoEv +0x00000071013055c0,BaseProcEvent::dtor,56,_ZN4ksys3act18BaseProcCreateTaskD2Ev +0x00000071013055f8,BaseProcEvent::dtorDelete,64,_ZN4ksys3act18BaseProcCreateTaskD0Ev +0x0000007101305638,sub_7101305638,52,_ZN4sead10Delegate1RIN4ksys3act18BaseProcCreateTaskEPvbE6invokeES4_ +0x000000710130566c,sub_710130566C,92,_ZNK4sead10Delegate1RIN4ksys3act18BaseProcCreateTaskEPvbE5cloneEPNS_4HeapE 0x00000071013056c8,sub_71013056C8,64, 0x0000007101305708,BaseProcInitializer::ctor,40, 0x0000007101305730,BaseProcInitializer::dtor,260, diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index cd6b64e9..f0448d05 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -52,6 +52,8 @@ target_sources(uking PRIVATE actAttention.h actBaseProc.cpp actBaseProc.h + actBaseProcCreateTask.cpp + actBaseProcCreateTask.h actBaseProcDeleter.cpp actBaseProcDeleter.h actBaseProcHandle.cpp diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index 34847d13..db4fa76d 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -134,6 +134,10 @@ public: /// Actually pre-delete the actor. Called from BaseProcDeleter. void doPreDelete(const PreDeleteArg& arg); + /// Set the BaseProcUnit. Only for use by BaseProcCreateTask. + void setUnitForBaseProcCreateTask(BaseProcUnit* unit) { mProcUnit = unit; } + void setInitializedFlag() { mFlags.set(Flags::Initialized); } + protected: friend class BaseProcLinkDataMgr; friend class BaseProcMgr; diff --git a/src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp b/src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp new file mode 100644 index 00000000..e69b0cb6 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp @@ -0,0 +1,83 @@ +#include "KingSystem/ActorSystem/actBaseProcCreateTask.h" +#include "KingSystem/ActorSystem/actBaseProcHandle.h" +#include "KingSystem/ActorSystem/actBaseProcUnit.h" +#include "KingSystem/Map/mapObject.h" + +namespace ksys::act { + +BaseProcCreateTask::BaseProcCreateTask(sead::Heap* heap) : ManagedTask(heap) {} + +bool BaseProcCreateTask::onTaskDelegateInvoked(void*) { + BaseProcCreateArg arg; + arg.heap = mHeap; + arg.heap2 = arg.heap; + arg.proc_class = mClass; + arg.proc_name = mName; + mDistanceToLoadSphere = -1.0; + arg.params = mParams.getNumParams() != 0 ? &mParams : nullptr; + arg.mubin_iter = mMubinIter.isValid() ? &mMubinIter : nullptr; + arg.map_object = mMapObject; + arg.proc_link = mLink; + mLink.reset(); + static_cast(arg.heap2->getMaxAllocatableSize(sizeof(void*))); + + BaseProc* proc = mCreateDelegate->invoke(arg); + if (proc) { + proc->setUnitForBaseProcCreateTask(mUnit); + + if (proc->isDeletedOrDeleting() || !proc->init(arg.heap2, false)) + onBaseProcCreationFailed(proc, false); + + proc->setInitializedFlag(); + } else { + onBaseProcCreationFailed(proc, false); + } + + return true; +} + +void BaseProcCreateTask::onBaseProcCreationFailed(BaseProc* proc, bool set_flag_5) { + if (mMapObject) + mMapObject->onBaseProcCreated(proc); + + if (!proc && mUnit) { + mUnit->cleanUp(proc, set_flag_5); + mUnit = nullptr; + } +} + +void BaseProcCreateTask::doPrepare(const BaseProcCreateTaskData* arg) { + auto data = sead::DynamicCast(arg); + [&] { + mHeap = data->mHeap; + mClass = data->mProcClass; + mName = data->mProcName; + + if (data->mMubinIter) + mMubinIter = *data->mMubinIter; + else + mMubinIter = {}; + + mMapObject = data->mMapObject; + + if (data->mParams && data->mParams->getNumParams() != 0) + mParams = *data->mParams; + else + mParams.clearFast(); + + mCreateDelegate = data->mCreateDelegate; + mUnit = data->mProcHandle ? data->mProcHandle->getUnit() : nullptr; + + if (data->mOtherProc) + mLink.acquire(data->mOtherProc, false); + else + mLink.reset(); + }(); +} + +void BaseProcCreateTask::prepareImpl_(util::TaskRequest* req) { + doPrepare(sead::DynamicCast(req)->mData); + setDelegateInternal_(&mTaskDelegate); +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProcCreateTask.h b/src/KingSystem/ActorSystem/actBaseProcCreateTask.h new file mode 100644 index 00000000..0d1c28cb --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcCreateTask.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include +#include +#include "KingSystem/ActorSystem/actBaseProcLink.h" +#include "KingSystem/ActorSystem/actInstParamPack.h" +#include "KingSystem/Map/mapMubinIter.h" +#include "KingSystem/Utils/Thread/ManagedTask.h" +#include "KingSystem/Utils/Thread/Task.h" +#include "KingSystem/Utils/Thread/TaskData.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::map { +class Object; +} + +namespace ksys::act { + +class BaseProc; +class BaseProcHandle; +class BaseProcUnit; + +struct BaseProcCreateArg { + sead::Heap* heap; + sead::Heap* heap2; + sead::SafeString proc_class; + sead::SafeString proc_name; + map::MubinIter* mubin_iter; + map::Object* map_object; + InstParamPack::Buffer* params; + BaseProcLink proc_link; +}; +KSYS_CHECK_SIZE_NX150(BaseProcCreateArg, 0x58); + +class BaseProcCreateTaskData : public util::TaskData { + SEAD_RTTI_OVERRIDE(BaseProcCreateTaskData, util::TaskData) + +public: + BaseProcCreateTaskData() = default; + virtual ~BaseProcCreateTaskData() = default; + + sead::Heap* mHeap{}; + sead::SafeString mProcClass{}; + sead::SafeString mProcName{}; + sead::IDelegate1R* mCreateDelegate{}; + BaseProcHandle* mProcHandle{}; + map::MubinIter* mMubinIter{}; + map::Object* mMapObject{}; + InstParamPack::Buffer* mParams{}; + BaseProc* mOtherProc{}; + bool _60{}; +}; +KSYS_CHECK_SIZE_NX150(BaseProcCreateTaskData, 0x68); + +class BaseProcCreateTaskRequest : public util::TaskRequest { + SEAD_RTTI_OVERRIDE(BaseProcCreateTaskRequest, util::TaskRequest) + +public: + BaseProcCreateTaskRequest() = default; + + BaseProcCreateTaskData* mData{}; +}; + +class BaseProcCreateTask : public util::ManagedTask { + SEAD_RTTI_OVERRIDE(BaseProcCreateTask, util::ManagedTask) + +public: + explicit BaseProcCreateTask(sead::Heap* heap); + + void onBaseProcCreationFailed(BaseProc* proc, bool set_flag_5); + +protected: + void prepareImpl_(util::TaskRequest* req) override; + +private: + bool onTaskDelegateInvoked(void* arg); + void doPrepare(const BaseProcCreateTaskData* data); + + sead::Heap* mHeap; + sead::FixedSafeString<64> mClass; + sead::FixedSafeString<64> mName; + map::MubinIter mMubinIter; + sead::IDelegate1R* mCreateDelegate{}; + BaseProcUnit* mUnit{}; + map::Object* mMapObject{}; + util::TaskDelegateT mTaskDelegate{ + this, &BaseProcCreateTask::onTaskDelegateInvoked}; + BaseProcLink mLink; + f32 mDistanceToLoadSphere = -1.0; + InstParamPack::Buffer mParams; +}; +KSYS_CHECK_SIZE_NX150(BaseProcCreateTask, 0x298); + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProcHandle.h b/src/KingSystem/ActorSystem/actBaseProcHandle.h index 7b0301a2..aa8da7cc 100644 --- a/src/KingSystem/ActorSystem/actBaseProcHandle.h +++ b/src/KingSystem/ActorSystem/actBaseProcHandle.h @@ -16,6 +16,7 @@ public: bool procReady(); BaseProc* getProc(); + BaseProcUnit* getUnit() const { return mUnit; } static BaseProcHandle sDummyHandle; diff --git a/src/KingSystem/ActorSystem/actInstParamPack.h b/src/KingSystem/ActorSystem/actInstParamPack.h index 74865e3b..bbfdc74d 100644 --- a/src/KingSystem/ActorSystem/actInstParamPack.h +++ b/src/KingSystem/ActorSystem/actInstParamPack.h @@ -62,6 +62,9 @@ public: Buffer() { clear(); } Buffer& operator=(const Buffer& other); + auto getNumParams() const { return mNumItems; } + void clearFast() { mNumItems = 0; } + void clear(); void add(const void* data, const sead::SafeString& name, s32 byte_size, EntryType type); void add(ActorCallback* callback, const sead::SafeString& name); diff --git a/src/KingSystem/Map/mapObject.h b/src/KingSystem/Map/mapObject.h index 6a4a2325..710c35c0 100644 --- a/src/KingSystem/Map/mapObject.h +++ b/src/KingSystem/Map/mapObject.h @@ -76,6 +76,8 @@ public: void free(); + void onBaseProcCreated(act::BaseProc* proc); + bool getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) const; act::Actor* getActor() const; void registerBaseProc(act::BaseProc* proc);