From c23f86e6d5aaba7bd85790fc0f206f0db5e739cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Fri, 12 Mar 2021 19:30:37 +0100 Subject: [PATCH] ksys/act: Add BaseProcCreateTaskSelector --- data/uking_functions.csv | 16 +++---- src/KingSystem/ActorSystem/CMakeLists.txt | 2 + .../ActorSystem/actBaseProcCreateTask.h | 2 + .../actBaseProcCreateTaskSelector.cpp | 45 +++++++++++++++++++ .../actBaseProcCreateTaskSelector.h | 25 +++++++++++ src/KingSystem/Utils/Thread/TaskQueueBase.h | 2 + 6 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.cpp create mode 100644 src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index fb75c72a..7e77606b 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -92242,17 +92242,17 @@ 0x00000071011dd898,ActorInstParams::addBoolAITree,140, 0x00000071011dd924,sub_71011DD924,12, 0x00000071011dd930,sub_71011DD930,104, -0x00000071011dd998,sub_71011DD998,56, -0x00000071011dd9d0,sub_71011DD9D0,92, -0x00000071011dda2c,sub_71011DDA2C,148, -0x00000071011ddac0,sub_71011DDAC0,348, +0x00000071011dd998,sub_71011DD998,56,_ZN4ksys3act26BaseProcCreateTaskSelector18SingletonDisposer_D2Ev +0x00000071011dd9d0,sub_71011DD9D0,92,_ZN4ksys3act26BaseProcCreateTaskSelector18SingletonDisposer_D0Ev +0x00000071011dda2c,sub_71011DDA2C,148,_ZN4ksys3act26BaseProcCreateTaskSelector14createInstanceEPN4sead4HeapE +0x00000071011ddac0,sub_71011DDAC0,348,_ZN4ksys3act26BaseProcCreateTaskSelector10selectTaskERKNS_4util20TaskSelectionContextE 0x00000071011ddc1c,BaseProcMgr::ActorCreatorRequestData::rtti1,204, 0x00000071011ddce8,BaseProcMgr::ActorCreatorRequestData::rtti2,92, 0x00000071011ddd44,BaseProcMgr::ActorCreatorRequestData::dtorDelete,4, -0x00000071011ddd48,sub_71011DDD48,52, -0x00000071011ddd7c,sub_71011DDD7C,92, -0x00000071011dddd8,sub_71011DDDD8,8, -0x00000071011ddde0,sub_71011DDDE0,8, +0x00000071011ddd48,sub_71011DDD48,52,_ZN4sead10Delegate1RIN4ksys3act26BaseProcCreateTaskSelectorERKNS1_4util20TaskSelectionContextEPNS4_4TaskEE6invokeES7_ +0x00000071011ddd7c,sub_71011DDD7C,92,_ZNK4sead10Delegate1RIN4ksys3act26BaseProcCreateTaskSelectorERKNS1_4util20TaskSelectionContextEPNS4_4TaskEE5cloneEPNS_4HeapE +0x00000071011dddd8,sub_71011DDDD8,8,_ZNK4sead11IDelegate1RIRKN4ksys4util20TaskSelectionContextEPNS2_4TaskEE9isNoDummyEv +0x00000071011ddde0,sub_71011DDDE0,8,_ZNK4sead11IDelegate1RIRKN4ksys4util20TaskSelectionContextEPNS2_4TaskEE5cloneEPNS_4HeapE 0x00000071011ddde8,ActorCreatorInvoker::clone,52, 0x00000071011dde1c,sub_71011DDE1C,92, 0x00000071011dde78,sub_71011DDE78,8, diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index f0448d05..3d9ec011 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -54,6 +54,8 @@ target_sources(uking PRIVATE actBaseProc.h actBaseProcCreateTask.cpp actBaseProcCreateTask.h + actBaseProcCreateTaskSelector.cpp + actBaseProcCreateTaskSelector.h actBaseProcDeleter.cpp actBaseProcDeleter.h actBaseProcHandle.cpp diff --git a/src/KingSystem/ActorSystem/actBaseProcCreateTask.h b/src/KingSystem/ActorSystem/actBaseProcCreateTask.h index 0d1c28cb..c78cf091 100644 --- a/src/KingSystem/ActorSystem/actBaseProcCreateTask.h +++ b/src/KingSystem/ActorSystem/actBaseProcCreateTask.h @@ -74,6 +74,8 @@ protected: void prepareImpl_(util::TaskRequest* req) override; private: + friend class BaseProcCreateTaskSelector; + bool onTaskDelegateInvoked(void* arg); void doPrepare(const BaseProcCreateTaskData* data); diff --git a/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.cpp b/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.cpp new file mode 100644 index 00000000..5b98aac6 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.cpp @@ -0,0 +1,45 @@ +#include "KingSystem/ActorSystem/actBaseProcCreateTaskSelector.h" +#include +#include "KingSystem/ActorSystem/actBaseProcCreateTask.h" +#include "KingSystem/Map/mapObject.h" + +namespace ksys::act { + +SEAD_SINGLETON_DISPOSER_IMPL(BaseProcCreateTaskSelector) + +util::Task* BaseProcCreateTaskSelector::selectTask(const util::TaskSelectionContext& context) { + util::Task* min_task = nullptr; + util::Task* lane1_task = nullptr; + auto min = std::numeric_limits::max(); + + for (auto& it : context) { + auto* task = sead::DynamicCast(&it); + if (!task) + return ⁢ + + if (task->getLaneId() == 2) + return ⁢ + + if (task->mMapObject && task->mMapObject->getFlags0().isOff(map::Object::Flag0::_4)) + return ⁢ + + if (task->mDistanceToLoadSphere >= 0.0 && min > task->mDistanceToLoadSphere) + min_task = ⁢ + + if (task->mDistanceToLoadSphere >= 0.0 && min > task->mDistanceToLoadSphere) + min = task->mDistanceToLoadSphere; + + if (task->getLaneId() == 1) + lane1_task = ⁢ + } + + if (min_task) + return min_task; + + if (lane1_task) + return lane1_task; + + return std::addressof(*context.begin()); +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.h b/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.h new file mode 100644 index 00000000..40e5da31 --- /dev/null +++ b/src/KingSystem/ActorSystem/actBaseProcCreateTaskSelector.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Thread/TaskQueueBase.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::act { + +class BaseProcCreateTaskSelector { + SEAD_SINGLETON_DISPOSER(BaseProcCreateTaskSelector) + BaseProcCreateTaskSelector() = default; + +public: + auto& getDelegate() { return mDelegate; } + +private: + util::Task* selectTask(const util::TaskSelectionContext& context); + + util::TaskSelectionDelegateT mDelegate{ + this, &BaseProcCreateTaskSelector::selectTask}; +}; +KSYS_CHECK_SIZE_NX150(BaseProcCreateTaskSelector, 0x40); + +} // namespace ksys::act diff --git a/src/KingSystem/Utils/Thread/TaskQueueBase.h b/src/KingSystem/Utils/Thread/TaskQueueBase.h index bdc7503f..e90d4a24 100644 --- a/src/KingSystem/Utils/Thread/TaskQueueBase.h +++ b/src/KingSystem/Utils/Thread/TaskQueueBase.h @@ -26,6 +26,8 @@ struct TaskSelectionContext { }; using TaskSelectionDelegate = sead::IDelegate1R; +template +using TaskSelectionDelegateT = sead::Delegate1R; class TaskQueueBase { SEAD_RTTI_BASE(TaskQueueBase)