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: ksys/act: Start adding BaseProcCreateTask --- .../ActorSystem/actBaseProcCreateTask.cpp | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp (limited to 'src/KingSystem/ActorSystem/actBaseProcCreateTask.cpp') 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 -- cgit v1.2.3