From c181eb05b792ca6422d3ace7e26eea6ab33a4829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 18 Mar 2021 15:13:37 +0100 Subject: [PATCH] ksys/act: Add some ActorCreator functions --- data/uking_functions.csv | 62 ++--- src/KingSystem/ActorSystem/actActor.h | 21 +- .../ActorSystem/actActorCreator.cpp | 224 ++++++++++++++++++ src/KingSystem/ActorSystem/actActorCreator.h | 67 +++++- .../ActorSystem/actInstParamPack.cpp | 2 +- src/KingSystem/ActorSystem/actInstParamPack.h | 21 +- 6 files changed, 348 insertions(+), 49 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 9c25ee89..a59b7679 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -57660,7 +57660,7 @@ 0x00000071009ccf5c,sub_71009CCF5C,48, 0x00000071009ccf8c,sub_71009CCF8C,92, 0x00000071009ccfe8,sub_71009CCFE8,8,_ZNK4sead10IDelegate1IRKN4ksys4util25TaskRemoveCallbackContextEE9isNoDummyEv -0x00000071009ccff0,sub_71009CCFF0,8, +0x00000071009ccff0,sub_71009CCFF0,8,_ZNK4sead10IDelegate1IRKN4ksys4util25TaskRemoveCallbackContextEE5cloneEPNS_4HeapE 0x00000071009ccff8,ResourceJpg::ctor,100, 0x00000071009cd05c,sub_71009CD05C,8, 0x00000071009cd064,ResourceJpg::dtorDelete,36, @@ -92217,48 +92217,48 @@ 0x00000071011db7e0,j__ZdlPv_1215,4, 0x00000071011db7e4,sub_71011DB7E4,48, 0x00000071011db814,sub_71011DB814,512, -0x00000071011dba14,sub_71011DBA14,100, -0x00000071011dba78,sub_71011DBA78,108, -0x00000071011dbae4,ActorCreator::createInstance,260, +0x00000071011dba14,sub_71011DBA14,100,_ZN4ksys3act12ActorCreator18SingletonDisposer_D2Ev +0x00000071011dba78,sub_71011DBA78,108,_ZN4ksys3act12ActorCreator18SingletonDisposer_D0Ev +0x00000071011dbae4,ActorCreator::createInstance,260,_ZN4ksys3act12ActorCreator14createInstanceEPN4sead4HeapE 0x00000071011dbbe8,ActorCreator::Disposer::dtorDelete,88,_ZN4ksys3act12ActorCreator14deleteInstanceEv 0x00000071011dbc40,ActorCreator::invokedCreateActor,1652, -0x00000071011dc2b4,ActorCreator::invokedCleanUp,152, -0x00000071011dc34c,ActorCreator::dtor,20, -0x00000071011dc360,ActorCreator::dtorDelete,52, -0x00000071011dc394,BaseProcMgr::ActorCreatorRequestData::dtor,4, -0x00000071011dc398,ActorCreator::requestCreateMapActor,340, -0x00000071011dc4ec,ActorCreator::createActor_,380, -0x00000071011dc668,ActorCreator::createActor,316, -0x00000071011dc7a4,ActorCreator::requestCreateActor,336, +0x00000071011dc2b4,ActorCreator::invokedCleanUp,152,_ZN4ksys3act12ActorCreator13onTaskRemovedERKNS_4util25TaskRemoveCallbackContextE +0x00000071011dc34c,ActorCreator::dtor,20,_ZN4ksys3act12ActorCreatorD1Ev +0x00000071011dc360,ActorCreator::dtorDelete,52,_ZN4ksys3act12ActorCreatorD0Ev +0x00000071011dc394,BaseProcMgr::ActorCreatorRequestData::dtor,4,_ZN4ksys3act22BaseProcCreateTaskDataD2Ev +0x00000071011dc398,ActorCreator::requestCreateMapActor,340,_ZN4ksys3act12ActorCreator21requestCreateMapActorEPKcPN4sead4HeapEPNS_3map9MubinIterEPNS7_6ObjectEPNS0_14BaseProcHandleEiPNS0_13InstParamPackE +0x00000071011dc4ec,ActorCreator::createActor_,380,_ZN4ksys3act12ActorCreator12createActor_EPKcS3_PN4sead4HeapEPNS0_13InstParamPackEbb +0x00000071011dc668,ActorCreator::createActor,316,_ZN4ksys3act12ActorCreator11createActorEPKcPN4sead4HeapEPNS0_13InstParamPackEbb +0x00000071011dc7a4,ActorCreator::requestCreateActor,336,_ZN4ksys3act12ActorCreator18requestCreateActorEPKcPN4sead4HeapEPNS0_14BaseProcHandleEPNS0_13InstParamPackEPNS_3map6ObjectEi 0x00000071011dc8f4,parseActorParams,2788, 0x00000071011dd3d8,ActorCreator::c,176, -0x00000071011dd488,ActorCreator::enableDistanceChecks,244, -0x00000071011dd57c,ActorCreator::eraseActor,84, -0x00000071011dd5d0,ActorInstParams::addScale,80, -0x00000071011dd620,isLiterallyEqualAT,96, -0x00000071011dd680,sub_71011DD680,264, -0x00000071011dd788,sub_71011DD788,136, -0x00000071011dd810,ActorInstParams::addAtvInt,136, -0x00000071011dd898,ActorInstParams::addBoolAITree,140, -0x00000071011dd924,sub_71011DD924,12, -0x00000071011dd930,sub_71011DD930,104, +0x00000071011dd488,ActorCreator::enableDistanceChecks,244,_ZN4ksys3act12ActorCreator26enableDistanceUnloadChecksEv? +0x00000071011dd57c,ActorCreator::eraseActor,84,_ZN4ksys3act12ActorCreator10eraseActorEPNS0_5ActorE +0x00000071011dd5d0,ActorInstParams::addScale,80,_ZN4ksys3act12ActorCreator8addScaleERNS0_13InstParamPackEf +0x00000071011dd620,isLiterallyEqualAT,96,_ZN4ksys3act12ActorCreator13isAITreeParamERKNS0_13InstParamPack5EntryE +0x00000071011dd680,sub_71011DD680,264,_ZN4ksys3act12ActorCreator14addAITreeParamERNS0_13InstParamPackERKN4sead14SafeStringBaseIcEES8_ +0x00000071011dd788,sub_71011DD788,136,_ZN4ksys3act12ActorCreator14addAITreeParamERNS0_13InstParamPackEiRKN4sead14SafeStringBaseIcEE +0x00000071011dd810,ActorInstParams::addAtvInt,136,_ZN4ksys3act12ActorCreator14addAITreeParamERNS0_13InstParamPackEjRKN4sead14SafeStringBaseIcEE +0x00000071011dd898,ActorInstParams::addBoolAITree,140,_ZN4ksys3act12ActorCreator14addAITreeParamERNS0_13InstParamPackEbRKN4sead14SafeStringBaseIcEE +0x00000071011dd924,sub_71011DD924,12,_ZN4ksys3act12ActorCreator23setCreatePriorityState1ERNS0_13InstParamPackEPNS0_8BaseProcE +0x00000071011dd930,sub_71011DD930,104,_ZN4ksys3act12ActorCreator23setCreatePriorityState2ERNS0_13InstParamPackEPNS0_8BaseProcE 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, +0x00000071011ddc1c,BaseProcMgr::ActorCreatorRequestData::rtti1,204,_ZNK4ksys3act22BaseProcCreateTaskData27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071011ddce8,BaseProcMgr::ActorCreatorRequestData::rtti2,92,_ZNK4ksys3act22BaseProcCreateTaskData18getRuntimeTypeInfoEv +0x00000071011ddd44,BaseProcMgr::ActorCreatorRequestData::dtorDelete,4,_ZN4ksys3act22BaseProcCreateTaskDataD0Ev 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, -0x00000071011dde80,sub_71011DDE80,8, -0x00000071011dde88,sub_71011DDE88,48, -0x00000071011ddeb8,sub_71011DDEB8,92, +0x00000071011ddde8,ActorCreatorInvoker::invoke,52,_ZN4sead10Delegate1RIN4ksys3act12ActorCreatorERNS2_17BaseProcCreateArgEPNS2_8BaseProcEE6invokeES5_ +0x00000071011dde1c,sub_71011DDE1C,92,_ZNK4sead10Delegate1RIN4ksys3act12ActorCreatorERNS2_17BaseProcCreateArgEPNS2_8BaseProcEE5cloneEPNS_4HeapE +0x00000071011dde78,sub_71011DDE78,8,_ZNK4sead11IDelegate1RIRN4ksys3act17BaseProcCreateArgEPNS2_8BaseProcEE9isNoDummyEv +0x00000071011dde80,sub_71011DDE80,8,_ZNK4sead11IDelegate1RIRN4ksys3act17BaseProcCreateArgEPNS2_8BaseProcEE5cloneEPNS_4HeapE +0x00000071011dde88,sub_71011DDE88,48,_ZN4sead9Delegate1IN4ksys3act12ActorCreatorERKNS1_4util25TaskRemoveCallbackContextEE6invokeES7_ +0x00000071011ddeb8,sub_71011DDEB8,92,_ZNK4sead9Delegate1IN4ksys3act12ActorCreatorERKNS1_4util25TaskRemoveCallbackContextEE5cloneEPNS_4HeapE 0x00000071011ddf14,AI_AIBase::ctor,64,_ZN4ksys3act2ai2AiC1ERKNS1_10ActionBase7InitArgE 0x00000071011ddf54,AI_AIBase::dtor,84,_ZN4ksys3act2ai2AiD1Ev 0x00000071011ddfa8,AI_AIBase::dtorDelete,92,_ZN4ksys3act2ai2AiD0Ev diff --git a/src/KingSystem/ActorSystem/actActor.h b/src/KingSystem/ActorSystem/actActor.h index f5e4a822..e4d1ae95 100644 --- a/src/KingSystem/ActorSystem/actActor.h +++ b/src/KingSystem/ActorSystem/actActor.h @@ -19,6 +19,7 @@ class RootAi; } class LifeRecoverInfo; +class ActorCreator; class ActorParam; class Actor : public BaseProc { @@ -36,6 +37,10 @@ public: _2e = 0x2e, }; + enum class ActorFlag2 { + NoDistanceCheck = 0x80, + }; + enum class DeleteType { _1 = 1, _2 = 2, @@ -71,12 +76,21 @@ public: void nullsub_4649(); // Some kind of logging which has been excluded from the build? + sead::TypedBitFlag& getActorFlags2() { return mActorFlags2; } + const sead::TypedBitFlag& getActorFlags2() const { return mActorFlags2; } + const sead::TypedBitFlag& getStasisFlags() const { return mStasisFlags; } void onAiEnter(const char* name, const char* context); + static constexpr size_t getCreatorListNodeOffset() { return offsetof(Actor, mCreatorListNode); } + protected: - /* 0x180 */ u8 TEMP_0x180[0x3D8]; // FIXME + friend class ActorCreator; + + /* 0x17c */ u8 TEMP_0x17c[0x518 - 0x17c]; // FIXME + /* 0x518 */ sead::TypedBitFlag mActorFlags2; + /* 0x51c */ u8 TEMP_0x51c[0x558 - 0x51c]; /* 0x558 */ ai::RootAi* mRootAi; /* 0x560 */ void* mASList; // FIXME /* 0x568 */ void* mEffects; // FIXME @@ -86,12 +100,13 @@ protected: /* 0x658 */ u8 TEMP_0x650[0x710 - 0x658]; /* ..... */ // The name could be incorrect. /* 0x710 */ sead::TypedBitFlag mStasisFlags; - /* 0x714 */ u8 TEMP_0x714[0x7c8 - 0x714]; // FIXME + /* 0x714 */ u8 TEMP_0x714[0x7b0 - 0x714]; // FIXME + /* 0x7b0 */ ActorCreator* mCreator{}; + /* 0x7b8 */ sead::ListNode mCreatorListNode; /* 0x7c8 */ map::Object* mMapObject; /* 0x7d0 */ u8 TEMP_0x7d0[0x838 - 0x7d0]; }; KSYS_CHECK_SIZE_NX150(Actor, 0x838); - } // namespace act } // namespace ksys diff --git a/src/KingSystem/ActorSystem/actActorCreator.cpp b/src/KingSystem/ActorSystem/actActorCreator.cpp index be6c43b4..e3203b5e 100644 --- a/src/KingSystem/ActorSystem/actActorCreator.cpp +++ b/src/KingSystem/ActorSystem/actActorCreator.cpp @@ -1,7 +1,231 @@ #include "KingSystem/ActorSystem/actActorCreator.h" +#include +#include "KingSystem/ActorSystem/actActor.h" +#include "KingSystem/ActorSystem/actActorTemplate.h" +#include "KingSystem/ActorSystem/actActorUtil.h" +#include "KingSystem/ActorSystem/actBaseProcCreateTask.h" +#include "KingSystem/ActorSystem/actBaseProcMgr.h" +#include "KingSystem/ActorSystem/actInfoData.h" +#include "KingSystem/Resource/resResourceMgrTask.h" +#include "KingSystem/Utils/HeapUtil.h" namespace ksys::act { SEAD_SINGLETON_DISPOSER_IMPL(ActorCreator) +ActorCreator::ActorCreator() { + mActorList.initOffset(Actor::getCreatorListNodeOffset()); + mActorFactory = nullptr; + mEnableDistanceChecks = false; + mBlockSpawns = false; + _5a = true; + mForBaseProcDualHeap = nullptr; + mPlacementMgrHeap = nullptr; } + +void ActorCreator::onTaskRemoved(const util::TaskRemoveCallbackContext& context) { + if (!context.mTask) + return; + + auto* task = sead::DynamicCast(context.mTask); + if (task) + task->onBaseProcCreationFailed(nullptr, true); +} + +ActorCreator::~ActorCreator() = default; + +bool ActorCreator::requestCreateMapActor(const char* name, sead::Heap* heap, + map::MubinIter* mubin_iter, map::Object* map_object, + BaseProcHandle* handle, int task_lane_id, + InstParamPack* params) { + const char* actor_profile; + if (!InfoData::instance()->getActorProfile(&actor_profile, name)) + return false; + + const char* actor_class; + ActorTemplate::instance()->getActorClass(&actor_class, actor_profile); + + return requestCreateActor_(actor_class, name, heap, mubin_iter, map_object, handle, + task_lane_id, params); +} + +BaseProc* ActorCreator::createActor_(const char* actor_class, const char* name, sead::Heap* heap, + InstParamPack* params, bool sleep_after_init, bool) { + auto* debug_heap = util::getDebugHeap(); + bool has_debug_heap = false; + if (debug_heap && (debug_heap == heap || debug_heap->isInclude(heap))) { + res::ResourceMgrTask::instance()->controlField9c0d88(false); + has_debug_heap = true; + } + + const bool is_high_priority_thread = BaseProcMgr::instance()->isHighPriorityThread(); + SEAD_ASSERT(is_high_priority_thread); + + BaseProcCreateTaskData data; + data.mHeap = heap; + data.mProcClass = actor_class; + data.mProcName = name; + data.mCreateDelegate = &mCreateProcDelegate; + data.mSleepAfterInit = sleep_after_init; + if (params) { + data.mParams = ¶ms->getBuffer(); + data.mOtherProc = params->getProc(); + } + + BaseProcCreateRequest req; + req.task_remove_callback = nullptr; + req.task_lane_id = static_cast(BaseProcCreateTask::LaneId::_1); + req.task_data = &data; + auto* actor = BaseProcMgr::instance()->createProc(req); + if (has_debug_heap) + res::ResourceMgrTask::instance()->controlField9c0d88(true); + return actor; +} + +Actor* ActorCreator::createActor(const char* name, sead::Heap* heap, InstParamPack* params, + bool sleep_after_init, bool block_other_synchronous_spawns) { + BaseProc* proc = nullptr; + if (block_other_synchronous_spawns) + mBlockSpawns = true; + + if (block_other_synchronous_spawns || !mBlockSpawns) { + const char* profile; + if (InfoData::instance()->getActorProfile(&profile, name)) { + const char* actor_class; + ActorTemplate::instance()->getActorClass(&actor_class, profile); + proc = createActor_(actor_class, name, heap, params, sleep_after_init); + } + } + + auto* actor = sead::DynamicCast(proc); + if (!actor && proc) + proc->deleteLater(BaseProc::DeleteReason::_0); + + return actor; +} + +bool ActorCreator::requestCreateActor_(const char* actor_class, const char* name, sead::Heap* heap, + map::MubinIter* mubin_iter, map::Object* map_object, + BaseProcHandle* handle, int task_lane_id, + InstParamPack* params) { + BaseProcCreateTaskData data; + data.mHeap = heap; + data.mProcClass = actor_class; + data.mProcName = name; + data.mMubinIter = mubin_iter; + data.mMapObject = map_object; + data.mCreateDelegate = &mCreateProcDelegate; + data.mProcHandle = handle; + if (params) { + data.mParams = ¶ms->getBuffer(); + data.mOtherProc = params->getProc(); + } + + BaseProcCreateRequest req; + req.task_lane_id = task_lane_id; + req.task_data = &data; + req.task_remove_callback = &mTaskRemovedDelegate; + return BaseProcMgr::instance()->requestCreateProc(req); +} + +bool ActorCreator::requestCreateActor_(const char* actor_class, const char* name, sead::Heap* heap, + map::Object* map_object, BaseProcHandle* handle, + int task_lane_id, InstParamPack* params) { + BaseProcCreateTaskData data; + data.mHeap = heap; + data.mProcClass = actor_class; + data.mProcName = name; + data.mCreateDelegate = &mCreateProcDelegate; + data.mMapObject = map_object; + data.mProcHandle = handle; + if (params) { + data.mParams = ¶ms->getBuffer(); + data.mOtherProc = params->getProc(); + } + + BaseProcCreateRequest req; + req.task_lane_id = task_lane_id; + req.task_data = &data; + req.task_remove_callback = &mTaskRemovedDelegate; + return BaseProcMgr::instance()->requestCreateProc(req); +} + +bool ActorCreator::requestCreateActor(const char* name, sead::Heap* heap, BaseProcHandle* handle, + InstParamPack* params, map::Object* map_object, + int task_lane_id) { + const char* actor_profile; + if (!InfoData::instance()->getActorProfile(&actor_profile, name)) + return false; + + const char* actor_class; + ActorTemplate::instance()->getActorClass(&actor_class, actor_profile); + + if (mBlockSpawns) + return false; + + return requestCreateActor_(actor_class, name, heap, map_object, handle, task_lane_id, params); +} + +// NON_MATCHING: OffsetList iteration +void ActorCreator::enableDistanceUnloadChecks() { + const auto lock = sead::makeScopedLock(mActorListCS); + for (auto it = mActorList.robustBegin(); it != mActorList.robustEnd(); ++it) { + auto& actor = *it; + if (!isWeaponOrArmor(&actor) || actor.getProfile().include("ArmorExtra")) + actor.getActorFlags2().set(Actor::ActorFlag2::NoDistanceCheck); + } + mEnableDistanceChecks = true; +} + +void ActorCreator::eraseActor(Actor* actor) { + const auto lock = sead::makeScopedLock(mActorListCS); + mActorList.erase(actor); + actor->mCreator = nullptr; +} + +void ActorCreator::addScale(InstParamPack& pack, float scale) { + addScale(pack, {scale, scale, scale}); +} + +void ActorCreator::addScale(InstParamPack& pack, const sead::Vector3f& scale) { + sead::SafeString key = "@S"; + pack.getBuffer().add(scale, key); +} + +bool ActorCreator::isAITreeParam(const InstParamPack::Entry& entry) { + return sead::SafeString("=AT") == entry.key; +} + +void ActorCreator::addAITreeParam(InstParamPack& pack, const sead::SafeString& value, + const sead::SafeString& name) { + pack.getBuffer().add(true, "=AT"); + pack.getBuffer().add(value, name); +} + +void ActorCreator::addAITreeParam(InstParamPack& pack, int value, const sead::SafeString& name) { + pack.getBuffer().add(true, "=AT"); + pack.getBuffer().add(value, name); +} + +void ActorCreator::addAITreeParam(InstParamPack& pack, u32 value, const sead::SafeString& name) { + pack.getBuffer().add(true, "=AT"); + pack.getBuffer().add(value, name); +} + +void ActorCreator::addAITreeParam(InstParamPack& pack, bool value, const sead::SafeString& name) { + pack.getBuffer().add(true, "=AT"); + pack.getBuffer().add(value, name); +} + +void ActorCreator::setCreatePriorityState1(InstParamPack& pack, BaseProc* proc) { + pack.setProc(proc); + proc->setCreatePriorityState1(); +} + +void ActorCreator::setCreatePriorityState2(InstParamPack& pack, BaseProc* proc) { + pack.setProc(proc); + proc->setCreatePriorityState2(); + pack.getBuffer().add(true, "@W"); +} + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actActorCreator.h b/src/KingSystem/ActorSystem/actActorCreator.h index ef6c229a..d25e745f 100644 --- a/src/KingSystem/ActorSystem/actActorCreator.h +++ b/src/KingSystem/ActorSystem/actActorCreator.h @@ -2,14 +2,26 @@ #include #include +#include #include #include +#include "KingSystem/ActorSystem/actInstParamPack.h" +#include "KingSystem/Utils/Thread/Task.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::map { +class MubinIter; +class Object; +; +} // namespace ksys::map namespace ksys::act { class Actor; -struct ActorCreateArg; class ActorFactory; +class BaseProc; +struct BaseProcCreateArg; +class BaseProcHandle; class ActorCreator { SEAD_SINGLETON_DISPOSER(ActorCreator) @@ -17,24 +29,59 @@ class ActorCreator { virtual ~ActorCreator(); public: - void setActorFactory(ActorFactory* factory) { mActorFactory = factory; } + bool requestCreateMapActor(const char* name, sead::Heap* heap, map::MubinIter* mubin_iter, + map::Object* map_object, BaseProcHandle* handle, int task_lane_id, + InstParamPack* params); + Actor* createActor(const char* name, sead::Heap* heap, InstParamPack* params, + bool sleep_after_init, bool block_other_synchronous_spawns); + bool requestCreateActor(const char* name, sead::Heap* heap, BaseProcHandle* handle, + InstParamPack* params, map::Object* map_object, int task_lane_id); + void enableDistanceUnloadChecks(); + void eraseActor(Actor* actor); + + void setActorFactory(ActorFactory* factory) { mActorFactory = factory; } bool get5a() const { return _5a; } + static void addScale(InstParamPack& pack, float scale); + static void addScale(InstParamPack& pack, const sead::Vector3f& scale); + static bool isAITreeParam(const InstParamPack::Entry& entry); + static void addAITreeParam(InstParamPack& pack, const sead::SafeString& value, + const sead::SafeString& name); + static void addAITreeParam(InstParamPack& pack, int value, const sead::SafeString& name); + static void addAITreeParam(InstParamPack& pack, u32 value, const sead::SafeString& name); + static void addAITreeParam(InstParamPack& pack, bool value, const sead::SafeString& name); + static void setCreatePriorityState1(InstParamPack& pack, BaseProc* proc); + static void setCreatePriorityState2(InstParamPack& pack, BaseProc* proc); + private: - sead::Heap* forBaseProcDualHeap; - sead::Heap* placementMgrHeap; + bool requestCreateActor_(const char* actor_class, const char* name, sead::Heap* heap, + map::MubinIter* mubin_iter, map::Object* map_object, + BaseProcHandle* handle, int task_lane_id, InstParamPack* params); + bool requestCreateActor_(const char* actor_class, const char* name, sead::Heap* heap, + map::Object* map_object, BaseProcHandle* handle, int task_lane_id, + InstParamPack* params); + BaseProc* createActor_(const char* actor_class, const char* name, sead::Heap* heap, + InstParamPack* params, bool sleep_after_init, bool = false); + + BaseProc* doCreateProc(BaseProcCreateArg& arg); + void onTaskRemoved(const util::TaskRemoveCallbackContext& context); + + sead::Heap* mForBaseProcDualHeap; + sead::Heap* mPlacementMgrHeap; sead::OffsetList mActorList; - void* _50; + void* _50{}; bool mEnableDistanceChecks; - bool _59; + bool mBlockSpawns; bool _5a; - void* _60; - sead::Delegate1 mCreateActorDelegate; - // FIXME: argument type - sead::Delegate1 mCleanUpDelegate; + void* _60{}; + sead::Delegate1R mCreateProcDelegate{ + this, &ActorCreator::doCreateProc}; + util::TaskRemoveCallbackT mTaskRemovedDelegate{this, + &ActorCreator::onTaskRemoved}; sead::CriticalSection mActorListCS; ActorFactory* mActorFactory; }; +KSYS_CHECK_SIZE_NX150(ActorCreator, 0xf0); } // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actInstParamPack.cpp b/src/KingSystem/ActorSystem/actInstParamPack.cpp index 566cb7be..a943cd06 100644 --- a/src/KingSystem/ActorSystem/actInstParamPack.cpp +++ b/src/KingSystem/ActorSystem/actInstParamPack.cpp @@ -39,7 +39,7 @@ bool InstParamPack::Buffer::pop(s32* position, InstParamPack::Entry* out_entry) switch (out_entry->type) { case EntryType::Int: return read(out_entry->data.i, position); - case EntryType::_1: + case EntryType::UInt: return read(out_entry->data.type1, position); case EntryType::Float: return read(out_entry->data.f, position); diff --git a/src/KingSystem/ActorSystem/actInstParamPack.h b/src/KingSystem/ActorSystem/actInstParamPack.h index bbfdc74d..b5a8c61d 100644 --- a/src/KingSystem/ActorSystem/actInstParamPack.h +++ b/src/KingSystem/ActorSystem/actInstParamPack.h @@ -17,10 +17,10 @@ class BaseProc; class InstParamPack { public: enum class EntryType { - /// Signed(?) 32-bit integer. + /// Signed 32-bit integer. Int = 0, - /// Unknown. - _1 = 1, + /// Unsigned 32-bit integer. + UInt = 1, /// Single-precision float. Float = 2, /// Boolean. @@ -73,7 +73,9 @@ public: add(&data, name, sizeof(data), EntryType::Int); } - void add(u32 data, const sead::SafeString& name) { add(static_cast(data), name); } + void add(u32 data, const sead::SafeString& name) { + add(&data, name, sizeof(data), EntryType::UInt); + } void add(float data, const sead::SafeString& name) { add(&data, name, sizeof(data), EntryType::Float); @@ -83,6 +85,14 @@ public: add(&data, name, sizeof(data), EntryType::Bool); } + void add(const sead::Vector3f& data, const sead::SafeString& name) { + add(&data, name, sizeof(data), EntryType::Vec3); + } + + void add(const sead::SafeString& data, const sead::SafeString& name) { + add(data.cstr(), name, data.calcLength() + 1, EntryType::String); + } + void add(const sead::Matrix34f& data, const sead::SafeString& name) { add(&data, name, sizeof(data), EntryType::Matrix34); } @@ -122,6 +132,9 @@ public: Buffer& getBuffer() { return mBuffer; } const Buffer& getBuffer() const { return mBuffer; } + BaseProc* getProc() const { return mProc; } + void setProc(BaseProc* proc) { mProc = proc; } + Buffer* operator->() { return &mBuffer; } const Buffer* operator->() const { return &mBuffer; }