diff --git a/data/uking_functions.csv b/data/uking_functions.csv index dfc60848..dfaec21f 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -73822,14 +73822,14 @@ 0x0000007100d49cb0,sub_7100D49CB0,56, 0x0000007100d49ce8,PlacementObj::ctor,124,_ZN4ksys3map6ObjectC1Ev! 0x0000007100d49d64,PlacementObj::dtor,52,_ZN4ksys3map6ObjectD1Ev -0x0000007100d49d98,PlacementObj::initData,380, +0x0000007100d49d98,PlacementObj::initData,380,_ZN4ksys3map6Object8initDataEPNS0_9MubinIterEhjPNS0_9ActorDataE! 0x0000007100d49f14,PlacementObj::initRevivalGameDataFlagAndMiscFlags,620, 0x0000007100d4a180,PlacementObj::free,120,_ZN4ksys3map6Object4freeEv -0x0000007100d4a1f8,PlacementObj::x_8,132, -0x0000007100d4a27c,PlacementObj::getActor_0,244, +0x0000007100d4a1f8,PlacementObj::x_8,132,_ZN4ksys3map6Object10tryGetProcEb +0x0000007100d4a27c,PlacementObj::getActor_0,244,_ZN4ksys3map6Object11tryGetActorEb 0x0000007100d4a370,PlacementObj::x_10,244, -0x0000007100d4a464,PlacementObj::getActorWithAccessor,88,_ZNK4ksys3map6Object20getActorWithAccessorERNS_3act24ActorLinkConstDataAccessE! -0x0000007100d4a4bc,PlacementObj::getActor,140,_ZNK4ksys3map6Object8getActorEv +0x0000007100d4a464,PlacementObj::getActorWithAccessor,88,_ZN4ksys3map6Object20getActorWithAccessorERNS_3act24ActorLinkConstDataAccessE +0x0000007100d4a4bc,PlacementObj::getActor,140,_ZN4ksys3map6Object8getActorEv 0x0000007100d4a548,PlacementObj::registerActor,320,_ZN4ksys3map6Object16registerBaseProcEPNS_3act8BaseProcE 0x0000007100d4a688,PlacementObj::setActorDirect,8,_ZN4ksys3map6Object17setBaseProcDirectEPNS_3act8BaseProcE 0x0000007100d4a690,PlacementObj::isEnemyOrNpcOrActiveOrMapPassive,84,_ZNK4ksys3map6Object32isEnemyOrNpcOrActiveOrMapPassiveEv @@ -73858,8 +73858,8 @@ 0x0000007100d4c890,PlacementLinkData::getPlacementLODLinkObj,40, 0x0000007100d4c8b8,PlacementObj::getHashIdStringDebug,108,_ZNK4ksys3map6Object20getHashIdStringDebugEv 0x0000007100d4c924,PlacementObj::getHashIdStringDebug_0,108,_ZNK4ksys3map6Object22getHashIdStringDebug_0Ev -0x0000007100d4c990,PlacementObj::unlinkActor,256, -0x0000007100d4ca90,PlacementObj::checkRevivalFlag,220, +0x0000007100d4c990,PlacementObj::unlinkActor,256,_ZN4ksys3map6Object10unlinkProcEb +0x0000007100d4ca90,PlacementObj::checkRevivalFlag,220,_ZNK4ksys3map6Object16checkRevivalFlagENS0_9ActorData4FlagE 0x0000007100d4cb6c,PlacementObj::getRails,24,_ZNK4ksys3map6Object8getRailsEv 0x0000007100d4cb84,PlacementObj::getRails_0,24,_ZNK4ksys3map6Object10getRails_0Ev 0x0000007100d4cb9c,PlacementObj::allocLinkData,60,_ZN4ksys3map6Object13allocLinkDataEPN4sead4HeapE @@ -73867,19 +73867,19 @@ 0x0000007100d4cbf8,PlacementObj::incrementLinkNum,340,_ZN4ksys3map6Object16incrementLinkNumEv 0x0000007100d4cd4c,PlacementObj::decrementLinkNum,20,_ZN4ksys3map6Object16decrementLinkNumEv 0x0000007100d4cd60,PlacementObj::initRevivalGameDataFlag,632, -0x0000007100d4cfd8,PlacementObj::isRevivalGameDataFlagOn,124, -0x0000007100d4d054,PlacementObj::setRevivalGameDataFlagValueIf,120, -0x0000007100d4d0cc,PlacementObj::setRevivalGameDataFlagValue,24, +0x0000007100d4cfd8,PlacementObj::isRevivalGameDataFlagOn,124,_ZNK4ksys3map6Object23isRevivalGameDataFlagOnEv +0x0000007100d4d054,PlacementObj::setRevivalGameDataFlagValueIf,120,_ZN4ksys3map6Object21setRevivalFlagValueIfENS0_9ActorData4FlagEb +0x0000007100d4d0cc,PlacementObj::setRevivalGameDataFlagValue,24,_ZN4ksys3map6Object19setRevivalFlagValueEb 0x0000007100d4d0e4,PlacementObj::x_17_dragonCheck,876, -0x0000007100d4d450,PlacementObj::x_18,400, -0x0000007100d4d5e0,PlacementObj::setupTargetLinks,176, -0x0000007100d4d690,PlacementObj::checkCreateOrDeleteLinkObjRevival,72, -0x0000007100d4d6d8,PlacementObj::shouldSkipSpawn,112, -0x0000007100d4d748,PlacementObj::x_20_checkTraverseFlags,24, +0x0000007100d4d450,PlacementObj::x_18,400,_ZNK4ksys3map6Object4x_18Ev! +0x0000007100d4d5e0,PlacementObj::setupTargetLinks,176,_ZN4ksys3map6Object16setupTargetLinksEPS1_PNS0_10ObjectLinkEPN4sead4HeapE? +0x0000007100d4d690,PlacementObj::checkCreateOrDeleteLinkObjRevival,72,_ZNK4ksys3map6Object33checkCreateOrDeleteLinkObjRevivalEv +0x0000007100d4d6d8,PlacementObj::shouldSkipSpawn,112,_ZNK4ksys3map6Object15shouldSkipSpawnEv +0x0000007100d4d748,PlacementObj::x_20_checkTraverseFlags,24,_ZNK4ksys3map6Object18checkTraverseFlagsEv 0x0000007100d4d760,PlacementObj::shouldSkipSpawn_,284, -0x0000007100d4d87c,PlacementObj::x_20,184, -0x0000007100d4d934,PlacementObj::postActorCreate,84, -0x0000007100d4d988,PlacementObj::spawnGenGroupActorsIfNeeded,16, +0x0000007100d4d87c,PlacementObj::x_20,184,_ZNK4ksys3map6Object4x_20Ev! +0x0000007100d4d934,PlacementObj::postActorCreate,84,_ZN4ksys3map6Object17onBaseProcCreatedEPNS_3act8BaseProcE +0x0000007100d4d988,PlacementObj::spawnGenGroupActorsIfNeeded,16,_ZN4ksys3map6Object27spawnGenGroupActorsIfNeededEPS1_ 0x0000007100d4d998,sub_7100D4D998,288, 0x0000007100d4dab8,sub_7100D4DAB8,80, 0x0000007100d4db08,sub_7100D4DB08,428, @@ -73889,38 +73889,38 @@ 0x0000007100d4dec4,PlacementObj::getUniqueName,104,_ZNK4ksys3map6Object13getUniqueNameEPPKc 0x0000007100d4df2c,PlacementObj::setTranslate,28,_ZN4ksys3map6Object12setTranslateERKN4sead7Vector3IfEE 0x0000007100d4df48,PlacementObj::x_22,128, -0x0000007100d4dfc8,PlacementObj::setFieldATrue,36, +0x0000007100d4dfc8,PlacementObj::setFieldATrue,36,_ZN4ksys3map6Object13setFieldATrueEv 0x0000007100d4dfec,j__ZdlPv_848,4, 0x0000007100d4dff0,_ZN4sead15FixedSafeStringILi655EEaSERKNS_14SafeStringBaseIcEE,240, -0x0000007100d4e0e0,getMapLinkDefinitionDescription,96, -0x0000007100d4e140,getMapLinkDefinitionDescription_0,96, -0x0000007100d4e1a0,getMapLinkDefinitionNum,324, -0x0000007100d4e2e4,PlacementLink::getObjActor,20,_ZNK4ksys3map10ObjectLink13getObjectProcEv +0x0000007100d4e0e0,getMapLinkDefinitionDescription,96,_ZNK4ksys3map10ObjectLink14getDescriptionEv +0x0000007100d4e140,getMapLinkDefinitionDescription_0,96,_ZN4ksys3map10ObjectLink21getDescriptionForTypeENS0_14MapLinkDefTypeE +0x0000007100d4e1a0,getMapLinkDefinitionNum,324,_ZN4ksys3map10ObjectLink14getTypeForNameERKN4sead14SafeStringBaseIcEE +0x0000007100d4e2e4,PlacementLink::getObjActor,20,_ZNK4ksys3map10ObjectLink14getObjectActorEv 0x0000007100d4e2f8,PlacementLink::getObjActorWithAccessor,24,_ZNK4ksys3map10ObjectLink25getObjectProcWithAccessorERNS_3act24ActorLinkConstDataAccessE -0x0000007100d4e310,sub_7100D4E310,28, -0x0000007100d4e32c,isPlacementLODOrForSaleLink,24, +0x0000007100d4e310,sub_7100D4E310,28,_ZN4ksys3map10ObjectLink14sub_7100D4E310ENS0_14MapLinkDefTypeE? +0x0000007100d4e32c,isPlacementLODOrForSaleLink,24,_ZN4ksys3map10ObjectLink27isPlacementLODOrForSaleLinkENS0_14MapLinkDefTypeE 0x0000007100d4e344,PlacementLinkData::ctor,44,_ZN4ksys3map14ObjectLinkDataC1Ev -0x0000007100d4e370,PlacementLinkData::deleteArrays,136, +0x0000007100d4e370,PlacementLinkData::deleteArrays,136,_ZN4ksys3map14ObjectLinkData12deleteArraysEv 0x0000007100d4e3f8,PlacementLinkData::allocLinks,556, -0x0000007100d4e624,PlacementLinkData::allocLinksToSelf,212, +0x0000007100d4e624,PlacementLinkData::allocLinksToSelf,212,_ZN4ksys3map14ObjectLinkData16allocLinksToSelfEiPN4sead4HeapE 0x0000007100d4e6f8,PlacementLinkData::dtor,292, 0x0000007100d4e81c,PlacementObj::x,256, 0x0000007100d4e91c,PlacementLinkData::addLink,440, 0x0000007100d4ead4,PlacementLinkData::setupLinks,364, 0x0000007100d4ec40,sub_7100D4EC40,328, -0x0000007100d4ed88,PlacementLinkData::setGenGroup,16, +0x0000007100d4ed88,PlacementLinkData::setGenGroup,16,_ZN4ksys3map14ObjectLinkData11setGenGroupEPNS0_8GenGroupE 0x0000007100d4ed98,PlacementLinkData::checkCreateLinkObjRevival,52, 0x0000007100d4edcc,PlacementLinkData::checkDeleteLinkObjRevival,20, -0x0000007100d4ede0,PlacementLinkArray::checkLink,280, -0x0000007100d4eef8,PlacementLinkArray::findLinkWithType,56, +0x0000007100d4ede0,PlacementLinkArray::checkLink,280,_ZN4ksys3map15ObjectLinkArray9checkLinkENS0_14MapLinkDefTypeEb! +0x0000007100d4eef8,PlacementLinkArray::findLinkWithType,56,_ZN4ksys3map15ObjectLinkArray16findLinkWithTypeENS0_14MapLinkDefTypeE 0x0000007100d4ef30,sub_7100D4EF30,116, 0x0000007100d4efa4,PlacementLinkData::x_2,332, 0x0000007100d4f0f0,sub_7100D4F0F0,224, 0x0000007100d4f1d0,sub_7100D4F1D0,532, 0x0000007100d4f3e4,sub_7100D4F3E4,496, -0x0000007100d4f5d4,PlacementLinkData::findLinkWithType,76, -0x0000007100d4f620,PlacementLinkData::findLinkWithType_0,76, -0x0000007100d4f66c,PlacementLinkArray::findLinkWithType_0,56, +0x0000007100d4f5d4,PlacementLinkData::findLinkWithType,76,_ZN4ksys3map14ObjectLinkData16findLinkWithTypeENS0_14MapLinkDefTypeE +0x0000007100d4f620,PlacementLinkData::findLinkWithType_0,76,_ZN4ksys3map14ObjectLinkData18findLinkWithType_0ENS0_14MapLinkDefTypeE +0x0000007100d4f66c,PlacementLinkArray::findLinkWithType_0,56,_ZN4ksys3map15ObjectLinkArray18findLinkWithType_0ENS0_14MapLinkDefTypeE 0x0000007100d4f6a4,sub_7100D4F6A4,88, 0x0000007100d4f6fc,PlacementLinkData::x_6,204, 0x0000007100d4f7c8,PlacementLinkData::allocRails,92, @@ -92327,25 +92327,25 @@ 0x00000071011e4224,sub_71011E4224,412, 0x00000071011e43c0,sub_71011E43C0,48, 0x00000071011e43f0,sub_71011E43F0,92, -0x00000071011e444c,PlacementMgr::deleteInstance,100, -0x00000071011e44b0,PlacementMgr::deleteInstance2,108, -0x00000071011e451c,PlacementMgr::createInstance,136, -0x00000071011e45a4,PlacementMgr::destroyInstance,88, -0x00000071011e45fc,PlacementMgr::ctor,660, +0x00000071011e444c,PlacementMgr::deleteInstance,100,_ZN4ksys3map12PlacementMgr18SingletonDisposer_D1Ev +0x00000071011e44b0,PlacementMgr::deleteInstance2,108,_ZN4ksys3map12PlacementMgr18SingletonDisposer_D0Ev +0x00000071011e451c,PlacementMgr::createInstance,136,_ZN4ksys3map12PlacementMgr14createInstanceEPN4sead4HeapE! +0x00000071011e45a4,PlacementMgr::destroyInstance,88,_ZN4ksys3map12PlacementMgr14deleteInstanceEv +0x00000071011e45fc,PlacementMgr::ctor,660,_ZN4ksys3map12PlacementMgrC1Ev! 0x00000071011e4890,PlacementMgr::threadFn,1120, 0x00000071011e4cf0,PlacementMgr::invoked1,184, 0x00000071011e4da8,PlacementMgr::invoked2,24, -0x00000071011e4dc0,sub_71011E4DC0,112, -0x00000071011e4e30,sub_71011E4E30,120, +0x00000071011e4dc0,sub_71011E4DC0,112,_ZN4ksys3map12PlacementMgrD1Ev? +0x00000071011e4e30,sub_71011E4E30,120,_ZN4ksys3map12PlacementMgrD0Ev? 0x00000071011e4ea8,PlacementMgr::__auto2,584, -0x00000071011e50f0,sub_71011E50F0,56, -0x00000071011e5128,PlacementMgr::x_3,236, -0x00000071011e5214,PlacementMgr::setRemoveInnerDataAcceptiveMaybe,8, +0x00000071011e50f0,sub_71011E50F0,56,_ZN4ksys3map12PlacementMgr11releaseTreeEv +0x00000071011e5128,PlacementMgr::x_3,236,_ZN4ksys3map12PlacementMgr3x_3Ev! +0x00000071011e5214,PlacementMgr::setRemoveInnerDataAcceptiveMaybe,8,_ZN4ksys3map12PlacementMgr8reset7F0Ev 0x00000071011e521c,PlacementMgr::calcRemoveInnerData,716, 0x00000071011e54e8,PlacementMgr::initBeforeStageGenB,84, -0x00000071011e553c,PlacementMgr::startThreadAndClusteredRenderer,316, +0x00000071011e553c,PlacementMgr::startThreadAndClusteredRenderer,316,_ZN4ksys3map12PlacementMgr21initClusteredRendererEv! 0x00000071011e5678,PlacementMgr::stopThreads,152, -0x00000071011e5710,PlacementMgr::__auto0,36, +0x00000071011e5710,PlacementMgr::__auto0,36,_ZN4ksys3map12PlacementMgr5auto0Ev 0x00000071011e5734,PlacementMgr::stopThread,120, 0x00000071011e57ac,PlacementMgr::__auto1,64, 0x00000071011e57ec,PlacementMgr::createMapsAndInitAndStartPlacementThread,344, @@ -92356,15 +92356,15 @@ 0x00000071011e645c,PlacementMgr::preCalc,1760, 0x00000071011e6b3c,PlacementMgr::requestDraw,292, 0x00000071011e6c60,PlacementMgr::x_5,268, -0x00000071011e6d6c,PlacementMgr::printDebugInfo,248, +0x00000071011e6d6c,PlacementMgr::printDebugInfo,248,_ZN4ksys3map12PlacementMgr14printDebugInfoEv? 0x00000071011e6e64,PlacementMgr::isStaticCompoundReady,40, 0x00000071011e6e8c,sub_71011E6E8C,84, 0x00000071011e6ee0,sub_71011E6EE0,204, -0x00000071011e6fac,PlacementMgr::incrementCounter,16, -0x00000071011e6fbc,PlacementMgr::x,172, -0x00000071011e7068,PlacementMgr::__auto5,24, -0x00000071011e7080,PlacementMgr::__auto16,80, -0x00000071011e70d0,PlacementMgr::someFlagCheck,28, +0x00000071011e6fac,PlacementMgr::incrementCounter,16,_ZN4ksys3map12PlacementMgr16incrementCounterEv +0x00000071011e6fbc,PlacementMgr::x,172,_ZN4ksys3map12PlacementMgr1xEv +0x00000071011e7068,PlacementMgr::__auto5,24,_ZN4ksys3map12PlacementMgr5auto5Ev +0x00000071011e7080,PlacementMgr::__auto16,80,_ZN4ksys3map12PlacementMgr6auto16Ev +0x00000071011e70d0,PlacementMgr::someFlagCheck,28,_ZNK4ksys3map12PlacementMgr13someFlagCheckEv 0x00000071011e70ec,PlacementMgr::threadHandleChecksAndDirectActorGen,276, 0x00000071011e7200,PlacementMgr::threadTraverse,7300, 0x00000071011e8e84,PlacementMgr::threadLoadUnloadCheck,2376, @@ -92432,8 +92432,8 @@ 0x00000071011ed3d8,OpenWorldSceneNavigator::getJpName,12, 0x00000071011ed3e4,nullsub_4651,4, 0x00000071011ed3e8,nullsub_4652,4, -0x00000071011ed3ec,PlacementTree::ctor,60, -0x00000071011ed428,sub_71011ED428,84, +0x00000071011ed3ec,PlacementTree::ctor,60,_ZN4ksys3map13PlacementTreeC1Ev? +0x00000071011ed428,sub_71011ED428,84,_ZN4ksys3map13PlacementTreeD1Ev? 0x00000071011ed47c,PlacementTree::x,940, 0x00000071011ed828,PlacementTree::resetPlacementObjPtrs,160, 0x00000071011ed8c8,PlacementTree::x_1,152, diff --git a/src/KingSystem/ActorSystem/CMakeLists.txt b/src/KingSystem/ActorSystem/CMakeLists.txt index 27fd0a4a..fe74e421 100644 --- a/src/KingSystem/ActorSystem/CMakeLists.txt +++ b/src/KingSystem/ActorSystem/CMakeLists.txt @@ -86,6 +86,8 @@ target_sources(uking PRIVATE actBaseProcMgr.h actBaseProcUnit.cpp actBaseProcUnit.h + actClusteredRenderer.cpp + actClusteredRenderer.h actDebug.cpp actDebug.h actGlobalParameter.cpp diff --git a/src/KingSystem/ActorSystem/actActorConstDataAccess.h b/src/KingSystem/ActorSystem/actActorConstDataAccess.h index 0244893b..b78e9fbc 100644 --- a/src/KingSystem/ActorSystem/actActorConstDataAccess.h +++ b/src/KingSystem/ActorSystem/actActorConstDataAccess.h @@ -92,6 +92,7 @@ public: f32 getAttackSpHitRatio() const; s32 getAttackPower() const; + bool checkLinkTagActivated(bool a, bool b); map::ObjectLinkData* getMapObjectLinkData() const; map::Object* getMapObject() const; diff --git a/src/KingSystem/ActorSystem/actActorCreator.h b/src/KingSystem/ActorSystem/actActorCreator.h index d25e745f..ae80dd23 100644 --- a/src/KingSystem/ActorSystem/actActorCreator.h +++ b/src/KingSystem/ActorSystem/actActorCreator.h @@ -43,6 +43,9 @@ public: void setActorFactory(ActorFactory* factory) { mActorFactory = factory; } bool get5a() const { return _5a; } + sead::OffsetList& getActorList() { return mActorList; } + sead::CriticalSection& getCS() { return mActorListCS; } + static void addScale(InstParamPack& pack, float scale); static void addScale(InstParamPack& pack, const sead::Vector3f& scale); static bool isAITreeParam(const InstParamPack::Entry& entry); diff --git a/src/KingSystem/ActorSystem/actBaseProc.h b/src/KingSystem/ActorSystem/actBaseProc.h index 6a55c2fb..761acd4b 100644 --- a/src/KingSystem/ActorSystem/actBaseProc.h +++ b/src/KingSystem/ActorSystem/actBaseProc.h @@ -102,6 +102,7 @@ public: bool isDeletedOrDeleting() const { return mState == State::Delete || mStateFlags.isOn(StateFlags::RequestDelete); } + bool isDeleteOrInvalid() const { return mState >= act::BaseProc::State::Delete; } /// For BaseProcLink or ActorLinkConstDataAccess. bool acquire(ActorLinkConstDataAccess& accessor); diff --git a/src/KingSystem/ActorSystem/actClusteredRenderer.cpp b/src/KingSystem/ActorSystem/actClusteredRenderer.cpp new file mode 100644 index 00000000..fdf4b2fd --- /dev/null +++ b/src/KingSystem/ActorSystem/actClusteredRenderer.cpp @@ -0,0 +1 @@ +#include "KingSystem/ActorSystem/actClusteredRenderer.h" diff --git a/src/KingSystem/ActorSystem/actClusteredRenderer.h b/src/KingSystem/ActorSystem/actClusteredRenderer.h new file mode 100644 index 00000000..d9e68db9 --- /dev/null +++ b/src/KingSystem/ActorSystem/actClusteredRenderer.h @@ -0,0 +1,10 @@ +#pragma once + +namespace ksys::act { + +class ClusteredRenderer { +public: + void startThread(); +}; + +} // namespace ksys::act diff --git a/src/KingSystem/ActorSystem/actInfoData.h b/src/KingSystem/ActorSystem/actInfoData.h index bdaf24eb..b4f20b63 100644 --- a/src/KingSystem/ActorSystem/actInfoData.h +++ b/src/KingSystem/ActorSystem/actInfoData.h @@ -126,6 +126,7 @@ public: u32 getModelFlags(const char* actor) const; bool getVariationMatAnim(const char* actor, const char** anim, f32* frame) const; bool getName(al::ByamlIter* iter, const char** name, s32 idx) const; + bool sub_7100D30DF8(InvalidLifeConditions& info, const sead::Vector3f& vec); const char* getString(const char* actor, const char* key, const sead::SafeString& default_ = sead::SafeString::cEmptyString, diff --git a/src/KingSystem/CMakeLists.txt b/src/KingSystem/CMakeLists.txt index 80c07ae8..9c40f3ff 100644 --- a/src/KingSystem/CMakeLists.txt +++ b/src/KingSystem/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory(Ecosystem) add_subdirectory(Effect) add_subdirectory(Event) add_subdirectory(Framework) +add_subdirectory(Graphics) add_subdirectory(Map) add_subdirectory(Mii) add_subdirectory(Physics) diff --git a/src/KingSystem/Graphics/CMakeLists.txt b/src/KingSystem/Graphics/CMakeLists.txt new file mode 100644 index 00000000..fdc1c04b --- /dev/null +++ b/src/KingSystem/Graphics/CMakeLists.txt @@ -0,0 +1,4 @@ +target_sources(uking PRIVATE + gfxForestRenderer.cpp + gfxForestRenderer.h +) diff --git a/src/KingSystem/Graphics/gfxForestRenderer.cpp b/src/KingSystem/Graphics/gfxForestRenderer.cpp new file mode 100644 index 00000000..8055101d --- /dev/null +++ b/src/KingSystem/Graphics/gfxForestRenderer.cpp @@ -0,0 +1 @@ +#include "KingSystem/Graphics/gfxForestRenderer.h" diff --git a/src/KingSystem/Graphics/gfxForestRenderer.h b/src/KingSystem/Graphics/gfxForestRenderer.h new file mode 100644 index 00000000..ec4d76c3 --- /dev/null +++ b/src/KingSystem/Graphics/gfxForestRenderer.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +namespace ksys::gfx { + +class ForestRenderer { +public: + s32 x_7(const sead::Vector3f& vec); +}; + +} // namespace ksys::gfx diff --git a/src/KingSystem/Map/CMakeLists.txt b/src/KingSystem/Map/CMakeLists.txt index 858d21a3..7336bfd1 100644 --- a/src/KingSystem/Map/CMakeLists.txt +++ b/src/KingSystem/Map/CMakeLists.txt @@ -6,8 +6,18 @@ target_sources(uking PRIVATE mapMubinIter.h mapObject.cpp mapObject.h + mapObjectGenGroup.cpp + mapObjectGenGroup.h mapObjectLink.cpp mapObjectLink.h + mapPlacementActors.cpp + mapPlacementActors.h mapPlacementMgr.cpp mapPlacementMgr.h + mapPlacementTree.cpp + mapPlacementTree.h + mapRail.cpp + mapRail.h + mapStagePreActorCache.cpp + mapStagePreActorCache.h ) diff --git a/src/KingSystem/Map/mapObject.cpp b/src/KingSystem/Map/mapObject.cpp index 6d62d9c2..4cdc137f 100644 --- a/src/KingSystem/Map/mapObject.cpp +++ b/src/KingSystem/Map/mapObject.cpp @@ -1,11 +1,25 @@ #include "KingSystem/Map/mapObject.h" #include "KingSystem/ActorSystem/actBaseProcMgr.h" +#include "KingSystem/ActorSystem/actInfoData.h" +#include "KingSystem/GameData/gdtManager.h" +#include "KingSystem/Graphics/gfxForestRenderer.h" #include "KingSystem/Map/mapObjectLink.h" +#include "KingSystem/Map/mapPlacementMgr.h" +#include "KingSystem/Map/mapStagePreActorCache.h" +#include "KingSystem/Terrain/teraSystem.h" #include "KingSystem/Utils/Debug.h" namespace ksys::map { -Object::Object() = default; +// NON_MATCHING +Object::Object() { + mHardModeFlags.makeAllZero(); + _b = 0xFF; + _18 = nullptr; + _20 = nullptr; + mProc = nullptr; + mLinkData = nullptr; +} Object::~Object() { if (mLinkData != nullptr) { @@ -23,9 +37,7 @@ void Object::free() { if (mProc) mProc = nullptr; - // TODO: figure out what this is - mFlags0.reset(Flag0::Freed); - + mFlags0.reset(Flag0::ResetOnFreed); mHardModeFlags.reset(HardModeFlag::ActorCreated); if (mFlags0.isOn(Flag0::_80000)) @@ -37,25 +49,99 @@ void Object::free() { mLinkData->field_57 = 0; } -// NON_MATCHING: functionally equivalent; CSEL instruction flipped -bool Object::getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) const { +// NON_MATCHING +void Object::initData(MubinIter* iter, u8 idx, u32 actor_data_idx, ActorData* data) { + mActorDataIdx = 0xFFFF; + mFlags0.makeAllZero(); + mRevivalGameDataFlagHash = gdt::InvalidHandle; + mId = 0; + mActorFlags8.makeAllZero(); + mFlags.makeAllZero(); + mIdx = 0; + mNumLinksPointingToMe = 0; + mStaticCompoundId = 0xFFFF; + _18 = nullptr; + _20 = nullptr; + _10 = nullptr; + _50 = nullptr; + mTraverseDist = 0.0f; + mTraverseDistInt = 0; + mHashId = 0; + mHardModeFlags.makeAllZero(); + _b = 0xFF; + mProc = nullptr; + mLinkData = nullptr; + iter->tryGetFloatArrayByKey(&mTranslate.x, "Translate"); + mMubinIter = *iter; + + u32 hash = 0; + iter->tryGetParamUIntByKey(&hash, "HashId"); + if (hash == 0) + hash = 0xFFFFFFFF; + mHashId = hash; + + mIdx = idx; + mFlags0.setDirect(Flag0::_8); + mNumLinksPointingToMe = 0; + _10 = nullptr; + _18 = nullptr; + _20 = nullptr; + mStaticCompoundId = 0xFFFF; + mActorDataIdx = actor_data_idx; + mProc = nullptr; + mLinkData = nullptr; + mActorFlags8 = data->mActorFlags8; + + auto* fr = StagePreActorCache::instance()->getForestRenderer(); + if (fr != nullptr) { + if (fr->x_7(mTranslate) != -1) { + mFlags0.set(Flag0::_10); + } + } + initRevivalGameDataFlagAndMiscFlags(data, false); +} + +act::BaseProc* Object::tryGetProc(bool force) { + auto* bpm = act::BaseProcMgr::instance(); + if (bpm == nullptr || !bpm->isHighPriorityThread()) + return nullptr; + if (mProc == nullptr) + return nullptr; + + act::BaseProc* result = nullptr; + if (!mProc->isDeleteOrInvalid()) + result = mProc; + if (mProc->isDeleteOrInvalid() || force) + return result; + + if (!mProc->isInit()) + bpm->isAccessingProcSafe(mProc, nullptr); + return mProc; +} + +act::Actor* Object::tryGetActor(bool force) { + auto* proc = tryGetProc(force); + return sead::DynamicCast(proc); +} + +bool Object::getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) { act::BaseProcMgr* instance = act::BaseProcMgr::instance(); if (instance == nullptr || !instance->isHighPriorityThread() || mProc == nullptr) return accessor.acquire(nullptr); - if (mProc->isInit() || mProc->isCalc()) + if (!mProc->isDeleteOrInvalid()) return accessor.acquire(mProc); return accessor.acquire(nullptr); } -act::Actor* Object::getActor() const { +act::Actor* Object::getActor() { return sead::DynamicCast(mProc); } void Object::registerBaseProc(act::BaseProc* proc) { - const char* sActorStateStrings[4] = {"Init", "Calc", "Sleep", "Delete"}; + static const char* sActorStateStrings[4] = {"Init", "Calc", "Sleep", "Delete"}; if (mProc != nullptr && mProc != proc) { sead::FixedSafeString<1000> message; @@ -65,7 +151,7 @@ void Object::registerBaseProc(act::BaseProc* proc) { sActorStateStrings[static_cast(proc->getState())]); util::PrintDebug(message); } - mProc = proc; + setBaseProcDirect(proc); mFlags0.set(Flag0::_80); mFlags0.reset(Flag0::_80000000); @@ -93,7 +179,7 @@ bool Object::isEnemyOrNpcOrActiveOrMapPassive() const { bool Object::isNpcOrActiveOrMapPassiveOrFlag1() const { auto actFlags = mActorFlags8; - if (actFlags.isZero()) + if (isFlags8Cleared()) return true; auto pa = PlacementMgr::instance()->mPlacementActors; @@ -108,13 +194,13 @@ bool Object::isNpcOrActiveOrMapPassiveOrFlag1() const { } bool Object::isMapPassive(const PlacementActors* pa) const { - if (mActorFlags8.isZero()) + if (isFlags8Cleared()) return true; if (pa == nullptr) return false; - if (pa->mActorData[mActorDataIdx].mFlags.isOnBit(ActorData::Flag::_16) || + if (checkActorDataFlag(pa, ActorData::Flag::_16) || mActorFlags8.isOn(ActorFlag8::EnemyOrNpcOrActiveOrAreaOrAirWall)) return false; @@ -146,20 +232,17 @@ f32 Object::getDispDistance(const ActorData* data, bool get_diameter, u32 unused f32 Object::getDispDistance(const PlacementActors* pa, bool get_diameter, bool ignore_radius) const { auto* dat = &pa->mActorData[mActorDataIdx]; - return getDispDistance(dat, get_diameter, 0, ignore_radius); } f32 Object::getDispDistance(bool get_diameter, bool ignore_radius) const { auto pa = PlacementMgr::instance()->mPlacementActors; - return getDispDistance(pa, get_diameter, ignore_radius); } [[gnu::noinline]] f32 Object::getTraverseDist(const ActorData* data, bool get_diameter, u32, bool ignore_radius) const { using DFlag = ActorData::Flag; - f32 dist = 0.0; if (mFlags.isOn(Flag::HasTraversePos) && !ignore_radius) { @@ -186,22 +269,18 @@ f32 Object::getDispDistance(bool get_diameter, bool ignore_radius) const { f32 Object::getTraverseDistForLOD() const { using DFlag = ActorData::Flag; - auto* data = &PlacementMgr::instance()->mPlacementActors->mActorData[mActorDataIdx]; f32 dist = 0.0; if (data->mFlags.isOnBit(ActorData::Flag::TraverseDistReset)) return 0.0; - if (data->mFlags.isOnBit(ActorData::Flag::TraverseDistReset)) dist = 0.0; - else if (data->mFlags.isOnBit(DFlag::TraverseDist400) || data->mFlags.isOnBit(DFlag::TraverseDist200) || data->mFlags.isOnBit(DFlag::TraverseDist4000) || data->mFlags.isOnBit(DFlag::TraverseDist800)) dist = mTraverseDist + 0.0; - else if (data->mFlags.isOffBit(DFlag::TraverseDist2000)) dist = mTraverseDist + 0.0; else @@ -217,7 +296,6 @@ f32 Object::getTraverseDistForLOD() const { sead::Vector3f Object::getScale() const { sead::Vector3f vec; - mMubinIter.getScale(&vec); return vec; } @@ -235,7 +313,6 @@ const char* Object::getUnitConfigNameFromByaml() const { const char* result; if (!mMubinIter.tryGetParamStringByKey(&result, "UnitConfigName")) result = ""; - return result; } @@ -246,7 +323,6 @@ Object* Object::findPlacementLODLinkObject(const PlacementActors*) const { ObjectLink* result = mLinkData->mLinksToSelf.findLinkWithType(MapLinkDefType::PlacementLOD); if (result) return result->other_obj; - return nullptr; } @@ -254,75 +330,196 @@ Object* Object::findPlacementLODLinkObject() const { if (!mLinkData) return nullptr; - ObjectLink* result = mLinkData->mLinksToSelf.findLinkWithType(MapLinkDefType::PlacementLOD); + ObjectLink* result = mLinkData->mLinksToSelf.findLinkWithType_0(MapLinkDefType::PlacementLOD); if (result) return result->other_obj; - return nullptr; } const char* Object::getHashIdStringDebug() const { - act::ActorDebug::HashUnused t; - - const char* terminator; - - if (mMubinIter.tryGetParamUIntByKey(&t.hash, "HashId")) - terminator = act::ActorDebug::instance()->getNullStr(&t); - else - terminator = ""; - - return terminator; + return getHashIdStringDebug_0(); } const char* Object::getHashIdStringDebug_0() const { act::ActorDebug::HashUnused t; - const char* terminator; if (mMubinIter.tryGetParamUIntByKey(&t.hash, "HashId")) terminator = act::ActorDebug::instance()->getNullStr(&t); else terminator = ""; - return terminator; } -void* Object::getRails() const { - if (!mLinkData) - return nullptr; +void Object::unlinkProc(bool force) { + bool set = false; + auto flag = Flag0::ResetOnUnlinkFailed; - return mLinkData->mRails; + if (!tera::checkTeraSystemStatus()) { + auto* thread = sead::ThreadMgr::instance()->getCurrentThread(); + thread->getPriority(); + } + static_cast(mFlags0.isZero()); + + if (force || mFlags0.isOn(Flag0::ActorCreated)) + set = true; + else if (checkActorDataFlag(PlacementMgr::instance()->mPlacementActors, + ActorData::Flag::RevivalEnable)) + set = isRevivalGameDataFlagOn(); + + if (set) + flag = Flag0::ResetOnUnlink; + + mFlags0.reset(flag); + mProc = nullptr; +} + +bool Object::checkRevivalFlag(ActorData::Flag bit) const { + if (bit == ActorData::Flag::RevivalEnable || bit == ActorData::Flag::RevivalForUsed || + bit == ActorData::Flag::RevivalForDrop) { + if (getActorData().mFlags.isOffBit(bit)) + return false; + return isRevivalGameDataFlagOn(); + } + return false; +} + +bool Object::isRevivalGameDataFlagOn() const { + bool x = false; + gdt::Manager::instance()->getBool(mRevivalGameDataFlagHash, &x, true); + return x; +} + +void Object::setRevivalFlagValueIf(ActorData::Flag bit, bool value) { + if (bit == ActorData::Flag::RevivalEnable || bit == ActorData::Flag::RevivalForUsed || + bit == ActorData::Flag::RevivalForDrop) { + if (getActorData().mFlags.isOnBit(bit)) { + setRevivalFlagValue(value); + } + } +} + +void Object::setRevivalFlagValue(bool value) { + gdt::Manager::instance()->setBool(value, mRevivalGameDataFlagHash); +} + +// NON_MATCHING +bool Object::x_18() const { + act::InfoData::InvalidLifeConditions info; + const char* s; + auto* id = act::InfoData::instance(); + + if (PlacementMgr::instance() != nullptr && + PlacementMgr::instance()->mPlacementActors != nullptr) + s = PlacementMgr::instance()->mPlacementActors->mActorData[mActorDataIdx].mActorName.cstr(); + else + s = getUnitConfigNameFromByaml(); + id->getInvalidLifeConditions(s, info); + + sead::Vector3f temp = mTranslate; + return !id->sub_7100D30DF8(info, temp); +} + +// NON_MATCHING +bool Object::setupTargetLinks(Object* src, ObjectLink* link, sead::Heap* heap) { + if (mNumLinksPointingToMe == 0) + return false; + + if (mLinkData == nullptr) { + mLinkData = new (heap) ObjectLinkData(); + if (mLinkData == nullptr) + return false; + } + + if (mLinkData->mLinksToSelf.links.isBufferReady()) + return mLinkData->sub_7100D4EC40(src, link, this); + + if (!mLinkData->allocLinksToSelf(mNumLinksPointingToMe, heap)) + return false; + + return mLinkData->sub_7100D4EC40(src, link, this); +} + +bool Object::checkCreateOrDeleteLinkObjRevival() const { + if (mLinkData != nullptr) + return mLinkData->checkCreateOrDeleteLinkObjRevival(); + return false; +} + +bool Object::shouldSkipSpawn() const { + if (checkTraverseFlags() || shouldSkipSpawn_(false)) + return true; + return checkCreateOrDeleteLinkObjRevival(); +} + +bool Object::checkTraverseFlags() const { + return mFlags0.isOn(Flag0::_500400); +} + +// NON_MATCHING +bool Object::x_20() const { + if (getActorData().mFlags.isOffBit(ActorData::Flag::RevivalEnable)) + return false; + + if (mFlags0.isOff(Flag0::_400400)) + return false; + + if (!shouldSkipSpawn_(false)) { + return checkCreateOrDeleteLinkObjRevival(); + } + return false; +} + +void Object::onBaseProcCreated(act::BaseProc* actor) { + if (actor != nullptr) { + registerBaseProc(actor); + mFlags0.set(Flag0::ActorCreated); + } else { + mFlags0.reset(Flag0::_80002106); + } +} + +void Object::spawnGenGroupActorsIfNeeded(Object* obj) { + if (mLinkData != nullptr) + mLinkData->sub_7100D4FB78(obj); +} + +void Object::setFieldATrue() { + if (mActorFlags8.isOn(ActorFlag8::MapPassive) || mActorFlags8.isOn(ActorFlag8::_8)) { + mActorFlags8.reset(ActorFlag8::MapPassive); + mActorFlags8.reset(ActorFlag8::_8); + mActorFlags8.set(ActorFlag8::EnemyOrNpcOrActiveOrAreaOrAirWall); + } +} + +void* Object::getRails() const { + return getRails_0(); } void* Object::getRails_0() const { - if (!mLinkData) + if (mLinkData == nullptr) return nullptr; - - return mLinkData->mRails; + return mLinkData->mRail; } bool Object::allocLinkData(sead::Heap* heap) { mLinkData = new (heap) ObjectLinkData; - return mLinkData != nullptr; } bool Object::hasGenGroup() const { if (!mLinkData) return false; - return mLinkData->mGenGroup != nullptr; } void Object::incrementLinkNum() { if (mNumLinksPointingToMe != 0xFF) { - mNumLinksPointingToMe += 1; + mNumLinksPointingToMe++; return; } - auto name = sead::SafeString(getUnitConfigName()); - - if (name == "LinkTagNone") { + if (sead::SafeString(getUnitConfigName()) == "LinkTagNone") { // More than 255 actors are specified in one generation group. // If it is not a test, consult the programmer. printDebugMsg(this, @@ -345,18 +542,15 @@ void Object::decrementLinkNum() { sead::Vector3f Object::getRotate() const { sead::Vector3f result; mMubinIter.getRotate(&result); - return result; } // NON_MATCHING: Vec3f copy incorrect void Object::getTraversePosAndLoadDistance(sead::Vector3f* traverse_pos, f32* load_dist) const { - if (mFlags.isOn(Flag::HasTraversePos)) { + if (mFlags.isOn(Flag::HasTraversePos)) mMubinIter.tryGetFloatArrayByKey(&traverse_pos->x, "TraversePos"); - } else { + else *traverse_pos = mTranslate; - } - *load_dist = getLoadDistance(false); } diff --git a/src/KingSystem/Map/mapObject.h b/src/KingSystem/Map/mapObject.h index 0bc7fb5e..10e9d3c5 100644 --- a/src/KingSystem/Map/mapObject.h +++ b/src/KingSystem/Map/mapObject.h @@ -6,26 +6,26 @@ #include "KingSystem/ActorSystem/actActor.h" #include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h" #include "KingSystem/ActorSystem/actDebug.h" +#include "KingSystem/GameData/gdtFlagHandle.h" #include "KingSystem/Map/mapDebug.h" #include "KingSystem/Map/mapMubinIter.h" +#include "KingSystem/Map/mapPlacementActors.h" #include "KingSystem/Map/mapPlacementMgr.h" #include "KingSystem/Utils/Types.h" namespace ksys::act { class BaseProc; -} +class BaseProcInitializer; +class BaseProcCreateTask; +} // namespace ksys::act namespace ksys::map { -class Object; - class ObjectLinkData; struct ObjectLink; struct ObjectLinkArray; - class LinkTag; -// FIXME: incomplete class Object { public: // TODO: rename @@ -35,12 +35,29 @@ public: _8 = 0x8, _10 = 0x10, _20 = 0x20, + _40 = 0x40, _80 = 0x80, + _100 = 0x100, + ActorCreated = 0x200, + _400 = 0x400, + _2000 = 0x2000, + _4000 = 0x4000, _8000 = 0x8000, _40000 = 0x40000, _80000 = 0x80000, - Freed = 0xC65067E6, + _100000 = 0x100000, + _400000 = 0x400000, + _2000000 = 0x2000000, + _4000000 = 0x4000000, + _40000000 = 0x40000000, _80000000 = 0x80000000, + ResetOnUnlinkFailed = _100 | _2000, + ResetOnUnlink = _2 | _4 | _80 | _100 | ActorCreated | _400 | _2000, + _400400 = _400 | _400000, + _500400 = _400400 | _100000, + _80002106 = _2 | _4 | _100 | _2000 | _80000000, + ResetOnFreed = ResetOnUnlink | _500400 | _20 | _40 | _4000 | _2000000 | _4000000 | + _40000000 | _80000000, }; enum class Flag { @@ -74,21 +91,38 @@ public: Object(); ~Object(); + void initData(MubinIter* iter, u8 idx, u32 actor_data_idx, ActorData* data); void free(); - void onBaseProcCreated(act::BaseProc* proc); - - bool getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) const; - act::Actor* getActor() const; void registerBaseProc(act::BaseProc* proc); void setBaseProcDirect(act::BaseProc* proc); + void onBaseProcCreated(act::BaseProc* proc); + act::BaseProc* tryGetProc(bool force); + void unlinkProc(bool force); + + bool getActorWithAccessor(act::ActorLinkConstDataAccess& accessor); + act::Actor* tryGetActor(bool force); + act::Actor* getActor(); + + LinkTag* tryGetLinkTag(bool force); bool isEnemyOrNpcOrActiveOrMapPassive() const; bool isFlags8Cleared() const; bool isNpcOrActiveOrMapPassiveOrFlag1() const; bool isMapPassive(const PlacementActors* pa) const; - bool checkActorDataFlag(const PlacementActors* pa, ActorData::Flag flag) const; bool isEnemyOrNpc(const PlacementActors* pa) const; + bool isRevivalGameDataFlagOn() const; + bool checkActorDataFlag(const PlacementActors* pa, ActorData::Flag flag) const; + bool checkTraverseFlags() const; + bool checkRevivalFlag(ActorData::Flag bit) const; + + void setRevivalFlagValueIf(ActorData::Flag bit, bool value); + void setRevivalFlagValue(bool value); + void setFieldATrue(); + + sead::Vector3f getScale() const; + sead::Vector3f getRotate() const; + void setTranslate(const sead::Vector3f& translate); f32 getDispDistanceMultiplier() const { f32 mult = 1.0; @@ -99,18 +133,18 @@ public: return mult; } + void getTraversePosAndLoadDistance(sead::Vector3f* traverse_pos, f32* load_dist) const; f32 getDispDistance(const PlacementActors* pa, bool get_diameter, bool ignore_radius) const; f32 getDispDistance(const ActorData* data, bool get_diameter, u32 unused, bool ignore_radius) const; f32 getDispDistance(bool get_diameter = false, bool ignore_radius = false) const; - f32 getTraverseDist(const ActorData* data, bool get_diameter, u32 unused, bool ignore_radius) const; f32 getTraverseDistForLOD() const; - sead::Vector3f getScale() const; const char* getUnitConfigName() const; const char* getUnitConfigNameFromByaml() const; + void getUniqueName(const char** out) const; Object* findPlacementLODLinkObject(const PlacementActors* unused) const; Object* findPlacementLODLinkObject() const; @@ -118,26 +152,28 @@ public: const char* getHashIdStringDebug() const; const char* getHashIdStringDebug_0() const; + bool x_18() const; + bool x_20() const; + s32 x_22() const; + + bool hasGenGroup() const; + void spawnGenGroupActorsIfNeeded(Object* obj); + void* getRails() const; void* getRails_0() const; + bool setupTargetLinks(Object* src, ObjectLink* link, sead::Heap* heap); bool allocLinkData(sead::Heap* heap); - bool hasGenGroup() const; void incrementLinkNum(); void decrementLinkNum(); + bool checkCreateOrDeleteLinkObjRevival() const; - sead::Vector3f getRotate() const; - void getTraversePosAndLoadDistance(sead::Vector3f* traverse_pos, f32* load_dist) const; - void getUniqueName(const char** out) const; - void setTranslate(const sead::Vector3f& translate); + bool shouldSkipSpawn() const; + bool shouldSkipSpawn_(bool x) const; // TODO: - void initData(MubinIter* iter, u8 idx, u32 actor_data_idx, ActorData* data); void initRevivalGameDataFlagAndMiscFlags(ActorData* data, bool zero); - act::BaseProc* getActor_0(bool a1) const; - LinkTag* x_10(bool a1) const; f32 getLoadDistance(bool get_diameter) const; Object* findSrcLODLinkObject() const; - bool isRevivalGameDataFlagOn() const; const auto& getFlags0() const { return mFlags0; } const auto& getFlags() const { return mFlags; } @@ -159,7 +195,7 @@ public: act::BaseProc* getProc() const { return mProc; } ObjectLinkData* getLinkData() const { return mLinkData; } - u32 getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; } + gdt::FlagHandle getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; } u32 getHashId() const { return mHashId; } const sead::Vector3f& getTranslate() const { return mTranslate; } @@ -182,7 +218,7 @@ private: MubinIter mMubinIter; act::BaseProc* mProc = nullptr; ObjectLinkData* mLinkData = nullptr; - u32 mRevivalGameDataFlagHash = 0xffffffff; + gdt::FlagHandle mRevivalGameDataFlagHash = gdt::InvalidHandle; void* _50 = nullptr; u32 mHashId = 0; sead::Vector3f mTranslate; diff --git a/src/KingSystem/Map/mapObjectGenGroup.cpp b/src/KingSystem/Map/mapObjectGenGroup.cpp new file mode 100644 index 00000000..714dee15 --- /dev/null +++ b/src/KingSystem/Map/mapObjectGenGroup.cpp @@ -0,0 +1 @@ +#include "KingSystem/Map/mapObjectGenGroup.h" diff --git a/src/KingSystem/Map/mapObjectGenGroup.h b/src/KingSystem/Map/mapObjectGenGroup.h new file mode 100644 index 00000000..b78defec --- /dev/null +++ b/src/KingSystem/Map/mapObjectGenGroup.h @@ -0,0 +1,7 @@ +#pragma once + +namespace ksys::map { + +class GenGroup {}; + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapObjectLink.cpp b/src/KingSystem/Map/mapObjectLink.cpp index 8bc85335..2f2d44ca 100644 --- a/src/KingSystem/Map/mapObjectLink.cpp +++ b/src/KingSystem/Map/mapObjectLink.cpp @@ -1,15 +1,131 @@ #include "KingSystem/Map/mapObjectLink.h" +#include +#include "KingSystem/ActorSystem/actActorConstDataAccess.h" #include "KingSystem/Map/mapObject.h" +#include "KingSystem/Map/mapObjectGenGroup.h" namespace ksys::map { -ObjectLinkData::ObjectLinkData() = default; +struct MapLinkDefinition { + const char* name; + const char* desc; + MapLinkDefType type; +}; -act::BaseProc* ObjectLink::getObjectProc() const { +static constexpr u32 sNumTypes = 42; +static constexpr sead::SafeArray sMapLinkDefinitions{{ + {"-AxisX", "マイナスX軸シグナル", MapLinkDefType::NAxisX}, + {"-AxisY", "マイナスY軸シグナル", MapLinkDefType::NAxisY}, + {"-AxisZ", "マイナスZ軸シグナル", MapLinkDefType::NAxisZ}, + {"AreaCol", "エリア(センサ)指定", MapLinkDefType::AreaCol}, + {"AxisX", "X軸シグナル", MapLinkDefType::AxisX}, + {"AxisY", "Y軸シグナル", MapLinkDefType::AxisY}, + {"AxisZ", "Z軸シグナル", MapLinkDefType::AxisZ}, + {"BAndSCs", "ボール&ソケットCS", MapLinkDefType::BAndSCs}, + {"BAndSLimitAngYCs", "Y角速度制限付ボール&ソケットCS", MapLinkDefType::BAndSLimitAngYCs}, + {"BasicSig", "基本シグナル", MapLinkDefType::BasicSig}, + {"BasicSigOnOnly", "オンのみ基本シグナル", MapLinkDefType::BasicSigOnOnly}, + {"ChangeAtnSig", "アテンション変更時シグナル", MapLinkDefType::ChangeAtnSig}, + {"CogWheelCs", "歯車CS", MapLinkDefType::CogWheelCs}, + {"CopyWaitRevival", "配置自動セーブ継承", MapLinkDefType::CopyWaitRevival}, + {"Create", "生成", MapLinkDefType::Create}, + {"DeadUp", "死んだらオン", MapLinkDefType::DeadUp}, + {"DemoMember", "デモ参加", MapLinkDefType::DemoMember}, + {"FixedCs", "固定CS", MapLinkDefType::FixedCs}, + {"ForSale", "売り物", MapLinkDefType::ForSale}, + {"ForbidAttention", "アテンションタイプ変更", MapLinkDefType::ForbidAttention}, + {"Freeze", "凍結", MapLinkDefType::Freeze}, + {"GimmickSuccess", "ネタ成功シグナル", MapLinkDefType::GimmickSuccess}, + {"HingeCs", "ヒンジCS", MapLinkDefType::HingeCs}, + {"LifeZero", "ライフ0", MapLinkDefType::LifeZero}, + {"LimitHingeCs", "制限付ヒンジCS", MapLinkDefType::LimitHingeCs}, + {"ModelBind", "モデルバインド", MapLinkDefType::ModelBind}, + {"MtxCopyCreate", "位置継承生成", MapLinkDefType::MtxCopyCreate}, + {"OffWaitRevival", "配置自動セーブオフ", MapLinkDefType::OffWaitRevival}, + {"PhysSystemGroup", "物理システムグループ", MapLinkDefType::PhysSystemGroup}, + {"PlacementLOD", "配置LOD", MapLinkDefType::PlacementLOD}, + {"PulleyCs", "滑車CS", MapLinkDefType::PulleyCs}, + {"RackAndPinionCs", "ラック&ピニオンCS", MapLinkDefType::RackAndPinionCs}, + {"Recreate", "再生成", MapLinkDefType::Recreate}, + {"Reference", "参照", MapLinkDefType::Reference}, + {"Remains", "遺物シグナル", MapLinkDefType::Remains}, + {"SensorBind", "センサバインド", MapLinkDefType::SensorBlind}, + {"SliderCs", "スライダーCS", MapLinkDefType::SliderCs}, + {"Stable", "安定", MapLinkDefType::Stable}, + {"StackLink", "スタック", MapLinkDefType::StackLink}, + {"SyncLink", "生成グループ", MapLinkDefType::SyncLink}, + {"VelocityControl", "速度制御シグナル", MapLinkDefType::VelocityControl}, +}}; + +const char* ObjectLink::getDescription() const { + return getDescriptionForType(type); +} + +const char* ObjectLink::getDescriptionForType(MapLinkDefType t) { + const char* desc = "不定"; // invalid + + for (int i = 0; i < sMapLinkDefinitions.size(); ++i) { + if (sMapLinkDefinitions[i].type == t) { + desc = sMapLinkDefinitions[i].desc; + break; + } + } + + return desc; +} + +MapLinkDefType ObjectLink::getTypeForName(const sead::SafeString& name) { + sead::Buffer buf{sMapLinkDefinitions.size(), + sMapLinkDefinitions.getBufferPtr()}; + + s32 idx = buf.binarySearchC( + [&](const MapLinkDefinition& item) { return sead::SafeString(item.name).compare(name); }); + + if (idx == -1) + return MapLinkDefType::Invalid; + return buf[idx].type; +} + +bool ObjectLink::sub_7100D4E310(MapLinkDefType t) { + switch (t) { + case MapLinkDefType::Create: + case MapLinkDefType::Delete: + case MapLinkDefType::MtxCopyCreate: + case MapLinkDefType::Freeze: + case MapLinkDefType::ForbidAttention: + return true; + default: + break; + case MapLinkDefType::BasicSig: + case MapLinkDefType::AxisX: + case MapLinkDefType::AxisY: + case MapLinkDefType::AxisZ: + case MapLinkDefType::NAxisX: + case MapLinkDefType::NAxisY: + case MapLinkDefType::NAxisZ: + case MapLinkDefType::GimmickSuccess: + case MapLinkDefType::VelocityControl: + case MapLinkDefType::BasicSigOnOnly: + case MapLinkDefType::Remains: + case MapLinkDefType::DeadUp: + case MapLinkDefType::LifeZero: + case MapLinkDefType::Stable: + case MapLinkDefType::ChangeAtnSig: + return true; + } + + return false; +} + +bool ObjectLink::isPlacementLODOrForSaleLink(MapLinkDefType t) { + return t == MapLinkDefType::PlacementLOD || t == MapLinkDefType::ForSale; +} + +act::Actor* ObjectLink::getObjectActor() const { if (other_obj == nullptr) return nullptr; - return other_obj->getActor_0(false); + return other_obj->tryGetActor(false); } bool ObjectLink::getObjectProcWithAccessor(act::ActorLinkConstDataAccess& accessor) const { @@ -19,4 +135,97 @@ bool ObjectLink::getObjectProcWithAccessor(act::ActorLinkConstDataAccess& access return other_obj->getActorWithAccessor(accessor); } +ObjectLinkData::ObjectLinkData() = default; + +void ObjectLinkData::deleteArrays() { + if (mRail) { + delete mRail; + mRail = nullptr; + } + + mLinksOther.links.freeBuffer(); + mLinksCs.links.freeBuffer(); + mObjects.freeBuffer(); + mLinksToSelf.links.freeBuffer(); +} + +bool ObjectLinkData::allocLinksToSelf(s32 num_links, sead::Heap* heap) { + if (num_links >= 1) { + mLinksToSelf.links.tryAllocBuffer(num_links, heap); + if (!mLinksToSelf.links.isBufferReady()) + return false; + } + return true; +} + +ObjectLink* ObjectLinkData::findLinkWithType(MapLinkDefType t) { + return findLinkWithType_0(t); +} + +ObjectLink* ObjectLinkData::findLinkWithType_0(MapLinkDefType t) { + switch (t) { + case MapLinkDefType::FixedCs: + case MapLinkDefType::HingeCs: + case MapLinkDefType::LimitHingeCs: + case MapLinkDefType::SliderCs: + case MapLinkDefType::PulleyCs: + case MapLinkDefType::BAndSCs: + case MapLinkDefType::BAndSLimitAngYCs: + case MapLinkDefType::CogWheelCs: + case MapLinkDefType::RackAndPinionCs: + return mLinksCs.findLinkWithType(t); + default: + return mLinksOther.findLinkWithType(t); + } +} + +void ObjectLinkData::setGenGroup(GenGroup* group) { + if (mGenGroup == nullptr) + mGenGroup = group; +} + +// NON_MATCHING +bool ObjectLinkArray::checkLink(MapLinkDefType t, bool b) { + bool x_exists; + ObjectLink* link = nullptr; + + if (t != MapLinkDefType::BasicSig) { + x_exists = false; + } else { + link = findLinkWithType(MapLinkDefType::BasicSigOnOnly); + x_exists = link != nullptr; + + if (link != nullptr) + goto done; + } + + link = findLinkWithType(t); + + if (link == nullptr) + return false; + if (link->type == MapLinkDefType::VelocityControl) + return false; + +done: + act::ActorConstDataAccess acc{}; + + if (link->other_obj != nullptr) + link->other_obj->getActorWithAccessor(acc); + else + acc.acquire(nullptr); + return acc.checkLinkTagActivated(b, x_exists); +} + +ObjectLink* ObjectLinkArray::findLinkWithType(MapLinkDefType type) { + return findLinkWithType_0(type); +} + +ObjectLink* ObjectLinkArray::findLinkWithType_0(MapLinkDefType type) { + for (int i = 0; i < links.size(); ++i) { + if (links[i].type == type) + return &links[i]; + } + return nullptr; +} + } // namespace ksys::map diff --git a/src/KingSystem/Map/mapObjectLink.h b/src/KingSystem/Map/mapObjectLink.h index b0f25f7b..0068fe9f 100644 --- a/src/KingSystem/Map/mapObjectLink.h +++ b/src/KingSystem/Map/mapObjectLink.h @@ -1,17 +1,20 @@ #pragma once #include +#include #include "KingSystem/Map/mapMubinIter.h" #include "KingSystem/Utils/Types.h" namespace ksys::act { +class Actor; class ActorLinkConstDataAccess; -class BaseProc; } // namespace ksys::act namespace ksys::map { +class GenGroup; class Object; +class Rail; enum class MapLinkDefType { BasicSig = 0, @@ -60,19 +63,28 @@ enum class MapLinkDefType { }; struct ObjectLink { - act::BaseProc* getObjectProc() const; + ~ObjectLink() {} + act::Actor* getObjectActor() const; bool getObjectProcWithAccessor(act::ActorLinkConstDataAccess& accessor) const; + const char* getDescription() const; + static const char* getDescriptionForType(MapLinkDefType t); + static MapLinkDefType getTypeForName(const sead::SafeString& name); + static bool sub_7100D4E310(MapLinkDefType t); + static bool isPlacementLODOrForSaleLink(MapLinkDefType t); - Object* other_obj; - u32 type; - MubinIter iter; + Object* other_obj = nullptr; + MapLinkDefType type = MapLinkDefType::Invalid; + MubinIter iter{}; }; KSYS_CHECK_SIZE_NX150(ObjectLink, 0x20); struct ObjectLinkArray { - ObjectLink* findLinkWithType(MapLinkDefType link_type); - u32 num_links = 0; - ObjectLink* links = nullptr; + bool checkLink(MapLinkDefType t, bool b); + + ObjectLink* findLinkWithType(MapLinkDefType type); + ObjectLink* findLinkWithType_0(MapLinkDefType type); + + sead::Buffer links; }; KSYS_CHECK_SIZE_NX150(ObjectLinkArray, 0x10); @@ -80,13 +92,30 @@ class ObjectLinkData { public: ObjectLinkData(); + void deleteArrays(); void release(Object* obj, bool a1); + bool allocLinksToSelf(s32 num_links, sead::Heap* heap); + + bool sub_7100D4EC40(Object* src, ObjectLink* link, Object* dest); + void sub_7100D4FB78(Object* obj); + bool checkCreateLinkObjRevival() const; + bool checkDeleteLinkObjRevival() const; + + ObjectLink* findLinkWithType(MapLinkDefType t); + ObjectLink* findLinkWithType_0(MapLinkDefType t); + + void setGenGroup(GenGroup* group); + + void x_1(act::Actor* actor, Object* obj); + + bool checkCreateOrDeleteLinkObjRevival() const { + return checkDeleteLinkObjRevival() || checkCreateLinkObjRevival(); + } Object* mCreateLinksSrcObj = nullptr; Object* mDeleteLinksSrcObj = nullptr; - u32 mNumLinksReference = 0; - void* mLinksReference = nullptr; + sead::Buffer mObjects; ObjectLinkArray mLinksOther{}; ObjectLinkArray mLinksCs{}; ObjectLinkArray mLinksToSelf{}; @@ -97,8 +126,8 @@ public: bool mNoAutoDemoMember = false; bool field_57 = false; - void* mGenGroup = nullptr; - void* mRails = nullptr; + GenGroup* mGenGroup = nullptr; + Rail* mRail = nullptr; }; KSYS_CHECK_SIZE_NX150(ObjectLinkData, 0x68); diff --git a/src/KingSystem/Map/mapPlacementActors.cpp b/src/KingSystem/Map/mapPlacementActors.cpp new file mode 100644 index 00000000..dd7e81b7 --- /dev/null +++ b/src/KingSystem/Map/mapPlacementActors.cpp @@ -0,0 +1 @@ +#include "KingSystem/Map/mapPlacementActors.h" diff --git a/src/KingSystem/Map/mapPlacementActors.h b/src/KingSystem/Map/mapPlacementActors.h new file mode 100644 index 00000000..49552ae9 --- /dev/null +++ b/src/KingSystem/Map/mapPlacementActors.h @@ -0,0 +1,126 @@ +#pragma once + +#include +#include +#include +#include +#include +#include "KingSystem/Utils/Types.h" + +namespace ksys::map { + +class Object; + +// TODO: rename +enum class ActorFlag8 { + MapPassive = 0x1, + EnemyOrNpcOrActiveOrAreaOrAirWall = 0x2, + UndispCutOrPreActorXLinkOrChemical = 0x4, + _8 = 0x8, + CanGetPouch = 0x10, + HasCreateOrDeleteLink = 0x20, + DragonDropItemTarget = 0x40, + TreeOrBush = 0x80, +}; + +class ActorData { +public: + enum class Flag { + MapPassive = 0, + _1 = 1, + _2 = 2, + _3 = 3, + _4 = 4, + _5 = 5, + _6 = 6, + _7 = 7, + MapConstActive = 8, + TraverseDist200 = 9, + TraverseDist400 = 10, + TraverseDist800 = 11, + TraverseDistReset = 12, + TraverseDist2000 = 13, + TraverseDist4000 = 14, + _15 = 15, + _16 = 16, + RevivalEnable = 17, + RevivalForUsed = 18, + RevivalForDrop = 19, + RevivalRandom = 20, + RevivalBloodyMoon = 21, + RevivalUnderGodTimeOrNoneForUsed = 22, + EnableRemainsScene = 23, + _24 = 24, + EnemyOrNpc_DisableFlashback = 25, + _26 = 26, + LimitYDiff = 27, + IsGrassCut = 28, + HasFar = 29, + Fairy = 30, + UnderGodForest = 31, + + EnemyOrNpc = 32, + MapConstPassive = 33, + RandomCreateNotRain = 34, + _35 = 35, + MessageDialogViewBoard = 36, + _37 = 37, + NpcOrNonGanonAndNonGuardianEnemy = 38, + IgnoreBoundingAtAreaCulling = 39, + _40 = 40, + EnemyHuge = 41, + Enemy = 42, + _43 = 43, + EnemyLookOrGrassCutTagOrFirePillarOrDgnWater = 44, + _45 = 45, + MapPassiveOrFlag1 = 46, + _47 = 47, + _48 = 48, + SheikSensorTargetDeadOrAlive = 49, + Dragon = 50, + TreeOrBush = 51, + GuardianC = 52, + _53 = 53, + HasStopTimerFlag = 54, + AllRadarOrZukanActor = 55, + NoCreateForStackLink = 56, + OnLowTree = 57, + _58 = 58, + _59 = 59, + _60 = 60, + _61 = 61, + _62 = 62, + _63 = 63, + }; + + sead::TypedLongBitFlag<64, Flag, sead::Atomic> mFlags; + sead::TypedBitFlag mActorFlags8; + u8 TEMP[0x13F]; + sead::FixedSafeString<64> mActorName; +}; +KSYS_CHECK_SIZE_NX150(ActorData, 0x1A0); + +// FIXME: incomplete +class PlacementStruct1 { +public: + sead::BitFlag16 mFlags; + bool mIsOneHitChallengeActive; +}; + +class PlacementActors { +public: + u32 getNumStaticObjs() const; + map::Object* getStaticObj_2(s32 idx) const; + bool sub_7100D524B4() const; + void x_9(); + + u8 _0[0xe0 - 0x0]; + PlacementStruct1* mStruct1; + u8 _e8[0x538 - 0xe8]; + sead::SafeArray mActorData; + // u8 _261b38[0x2a80d0 - 0x261b38]; + u32 mActorDataMapSize; +}; +// KSYS_CHECK_SIZE_NX150(PlacementActors, 0x2A80D0); + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapPlacementMgr.cpp b/src/KingSystem/Map/mapPlacementMgr.cpp index b6114392..807dc199 100644 --- a/src/KingSystem/Map/mapPlacementMgr.cpp +++ b/src/KingSystem/Map/mapPlacementMgr.cpp @@ -1,7 +1,133 @@ #include "KingSystem/Map/mapPlacementMgr.h" +#include +#include "KingSystem/ActorSystem/actActorCreator.h" +#include "KingSystem/ActorSystem/actClusteredRenderer.h" +#include "KingSystem/ActorSystem/actInfoData.h" +#include "KingSystem/ActorSystem/actInstParamPack.h" +#include "KingSystem/Map/mapObject.h" +#include "KingSystem/Map/mapPlacementActors.h" +#include "KingSystem/Map/mapPlacementTree.h" +#include "KingSystem/System/VFR.h" namespace ksys::map { SEAD_SINGLETON_DISPOSER_IMPL(PlacementMgr) +PlacementMgr::PlacementMgr() : mThreadParams(this, &PlacementMgr::threadFn) {} + +PlacementMgr::~PlacementMgr() { + mThreadHeap->destroy(); + mDynamicHeap->destroy(); + mVillagerHeap->destroy(); + mTraverseResultHeap->destroy(); +} + +void PlacementMgr::releaseTree() { + if (mPlacementTree != nullptr) + delete mPlacementTree; + mPlacementTree = nullptr; +} + +// NON_MATCHING +void PlacementMgr::x_3() { + auto ac = act::ActorCreator::instance(); + const auto loc = sead::makeScopedLock(ac->getCS()); + if (mNumStaticObjs < mPlacementActors->getNumStaticObjs()) { + auto list = ac->getActorList(); + for (act::Actor& node : list) { + if (node.getMapObject() == mPlacementActors->getStaticObj_2(mNumStaticObjs)) { + node.deleteLater(act::BaseProc::DeleteReason::_0); + } + } + } +} + +void PlacementMgr::reset7F0() { + _7f0 = 0; +} + +// NON_MATCHING +void PlacementMgr::initClusteredRenderer() { + if (mThread != nullptr && mClusteredRenderer == nullptr) + return; + if (mThreadHeap == nullptr) + return; + + mFlags.reset(MgrFlag::_40000); + mThread = new (mThreadHeap) + sead::DelegateThread("PlacementMgr", &mThreadParams, mThreadHeap, + sead::ThreadUtil::ConvertPrioritySeadToPlatform(0x14), + sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0x100000, 0x20); + mRequestedMsg = 0; + sead::CoreIdMask mask{sead::CoreId::cSub4}; + mThread->setAffinity(mask); + mThread->start(); + mFlags.reset(MgrFlag::_2); + + if (mClusteredRenderer != nullptr) { + mClusteredRenderer->startThread(); + } +} + +void PlacementMgr::auto0() { + if (mThread == nullptr) + return; + mFlags.set(MgrFlag::_2); + _278 = 0; +} + +void PlacementMgr::printDebugInfo() { + if (!sFlags.isOn(MgrStaticFlags::debug)) + return; + + // Actor info:%d (loaded:%d) Instance:%d + sead::FormatFixedSafeString<128> s1("アクタ情報:%d(ロード済み:%d) インスタンス:%d", + mPlacementActors->mActorDataMapSize, mLoadedActorCount, + mPlacementActors->getNumStaticObjs()); + // Traverse result pre-actor:%d actor:%d + sead::FormatFixedSafeString<128> s2("トラバース結果 pre-actor:%d actor:%d", + mTraverseResults[mTraverseResultIdx].pre_actors.size(), + mTraverseResults[mTraverseResultIdx].actors.size()); + // Memory preActor:%dk info:%dk result:%dk mass:%dk clustered:%d + sead::FormatFixedSafeString<128> s3( + "メモリ preActor:%dk info:%dk result:%dk mass:%dk clustered:%dk", 40468, 2437, 87, + mMassMemoryUsage / 1024, mClusteredMemoryUsage / 1024); + // Dynamic heap remaining:%dk + sead::FormatFixedSafeString<128> s4("動的ヒープ残り:%dk", + int(mDynamicHeap->getFreeSize()) / 1024); +} + +void PlacementMgr::incrementCounter() { + _278++; +} + +void PlacementMgr::x() { + if (mFlags.isOn(MgrFlag::_2)) + return; + + mPlacementActors->x_9(); + mIntTime++; + + f32 last_time = mTime; + auto* vfr = VFR::instance(); + mTime += vfr->getDeltaTime(); + mTimeUpdated = s32(last_time) != s32(mTime); +} + +void PlacementMgr::auto5() { + mFlags.set(MgrFlag::_1); +} + +void PlacementMgr::auto16() { + mFlags.set(MgrFlag::_100000); + mFlags.set(MgrFlag::_200000); + mFlags.set(MgrFlag::_400000); +} + +bool PlacementMgr::someFlagCheck() const { + if (mFlags.isOn(MgrFlag::_80000)) + return true; + return mFlags.isOn(MgrFlag::_100000); +} + } // namespace ksys::map diff --git a/src/KingSystem/Map/mapPlacementMgr.h b/src/KingSystem/Map/mapPlacementMgr.h index 9aa98458..d8189dfd 100644 --- a/src/KingSystem/Map/mapPlacementMgr.h +++ b/src/KingSystem/Map/mapPlacementMgr.h @@ -1,131 +1,149 @@ #pragma once -#include +#include #include -#include -#include -#include -#include -#include "KingSystem/Utils/Types.h" +#include +#include +#include "KingSystem/ActorSystem/actActor.h" + +namespace ksys::act { +class ClusteredRenderer; +class InstParamPack; +} // namespace ksys::act namespace ksys::map { -// TODO: rename -enum class ActorFlag8 { - EnemyOrNpcOrActiveOrAreaOrAirWall = 0x2, - MapPassiveOrFlag1 = 0x4, -}; - -class ActorData { -public: - enum class Flag { - MapPassive = 0, - _1 = 1, - _2 = 2, - _3 = 3, - _4 = 4, - _5 = 5, - _6 = 6, - _7 = 7, - MapConstActive = 8, - TraverseDist200 = 9, - TraverseDist400 = 10, - TraverseDist800 = 11, - TraverseDistReset = 12, - TraverseDist2000 = 13, - TraverseDist4000 = 14, - _15 = 15, - _16 = 16, - RevivalEnable = 17, - RevivalForUsed = 18, - RevivalForDrop = 19, - RevivalRandom = 20, - RevivalBloodyMoon = 21, - RevivalUnderGodTimeOrNoneForUsed = 22, - EnableRemainsScene = 23, - _24 = 24, - EnemyOrNpc_DisableFlashback = 25, - _26 = 26, - LimitYDiff = 27, - IsGrassCut = 28, - HasFar = 29, - Fairy = 30, - UnderGodForest = 31, - - EnemyOrNpc = 32, - MapConstPassive = 33, - RandomCreateNotRain = 34, - _35 = 35, - MessageDialogViewBoard = 36, - _37 = 37, - NpcOrNonGanonAndNonGuardianEnemy = 38, - IgnoreBoundingAtAreaCulling = 39, - _40 = 40, - EnemyHuge = 41, - Enemy = 42, - _43 = 43, - EnemyLookOrGrassCutTagOrFirePillarOrDgnWater = 44, - _45 = 45, - MapPassiveOrFlag1 = 46, - _47 = 47, - _48 = 48, - SheikSensorTargetDeadOrAlive = 49, - Dragon = 50, - TreeOrBush = 51, - GuardianC = 52, - _53 = 53, - HasStopTimerFlag = 54, - AllRadarOrZukanActor = 55, - NoCreateForStackLink = 56, - OnLowTree = 57, - _58 = 58, - _59 = 59, - _60 = 60, - _61 = 61, - _62 = 62, - _63 = 63, - }; - - sead::TypedLongBitFlag<64, Flag, sead::Atomic> mFlags; - sead::TypedBitFlag mActorFlags8; - u8 TEMP[0x13F]; - sead::FixedSafeString<64> mActorName; -}; -KSYS_CHECK_SIZE_NX150(ActorData, 0x1A0); - -// FIXME: move this to another header and rename -// FIXME: incomplete -class PlacementStruct1 { -public: - sead::BitFlag16 mFlags; - bool mIsOneHitChallengeActive; -}; - -class PlacementActors { -public: - u8 _0[0xe0 - 0x0]; - PlacementStruct1* mStruct1; - u8 _e8[0x538 - 0xe8]; - sead::SafeArray mActorData; - u8 _261b38[0x2a80d0 - 0x261b38]; -}; -KSYS_CHECK_SIZE_NX150(PlacementActors, 0x2A80D0); +class Object; +class PlacementTree; +class PlacementActors; class PlacementMgr { SEAD_SINGLETON_DISPOSER(PlacementMgr) PlacementMgr(); virtual ~PlacementMgr(); + struct TraverseResults { + sead::PtrArray pre_actors; + sead::PtrArray actors; + sead::PtrArray _20; + sead::PtrArray _30; + sead::PtrArray _40; + sead::PtrArray _50; + sead::PtrArray dragon_item_drop_targets; + sead::PtrArray _70; + }; + KSYS_CHECK_SIZE_NX150(TraverseResults, 0x80); + public: + void releaseTree(); + void x_3(); + void reset7F0(); + void initClusteredRenderer(); + void auto0(); + bool auto1(); + void x_0(sead::Vector3f* pos, act::InstParamPack* pack); + void printDebugInfo(); + void loadModel(Object* obj); + void incrementCounter(); + void x(); + void auto5(); + void auto16(); + bool someFlagCheck() const; + + void threadFn(sead::Thread* thread, sead::MessageQueue::Element msg); + enum class MgrFlag { + _1 = 0x1, + _2 = 0x2, + _20 = 0x20, + _40000 = 0x40000, + _80000 = 0x80000, + _100000 = 0x100000, + _200000 = 0x200000, + _400000 = 0x400000, _1000000 = 0x1000000, }; - u8 TEMP1[0x1C8]; + enum class MgrStaticFlags { + debug = 0x1, + }; + + static sead::TypedBitFlag sFlags; + + u32 _28; + u32 _2c = 0; + u32 _30 = 0; + + u8 TEMP[0x108]; + sead::Delegate2 mThreadParams; + sead::DelegateThread* mThread; + u32 mTraverseResultIdx; + u16 mRequestedMsg = 0; + + sead::Vector3f mCameraPos{}; + sead::Vector3f mPlayerPos{}; + sead::Vector3f mPrevPlayerPos{}; + sead::ExpHeap* mDynamicHeap; + sead::ExpHeap* mThreadHeap; + sead::ExpHeap* mVillagerHeap; + sead::ExpHeap* mTraverseResultHeap; + void* mActorCreator; + u32 mLoadedActorCount; + void* mTeraSystem; + s32 mIntTime; + f32 mTime; + bool mTimeUpdated; + + s32 mMassMemoryUsage; + s32 mClusteredMemoryUsage; + void* mDebugHeap; PlacementActors* mPlacementActors; - u8 TEMP2[0x48C]; + + void* mVillagerManager; + + u32 mNumStaticObjs; + u32 mActorDataMapSize; + u8 TEMP2[0x70]; + + u32 _278; + + u32 mPreActorNumDone; + u32 mLoadActorNumTotal; + sead::Vector3f mPrevCameraPos{}; + f32 mDeltaCameraDistance; + sead::FixedSafeString<256> mStr1; + sead::FixedSafeString<256> mStr2; + sead::FixedSafeString<256> mStr3; + sead::CriticalSection mCS{}; + + u64 mStartTick; + u8 TEMP3[0x5c]; + sead::TypedBitFlag> mFlags; - u8 TEMP3[0x190]; + bool mThreadStarted = false; + bool _689 = false; + bool _68a = false; + u32 _68c; + u32 _690; + u32 mMessage = 0; + u32 mJobType = 0; + TraverseResults mTraverseResults[2]; + PlacementTree* mPlacementTree = nullptr; + u32 _7a8; + void* mMassRenderer = nullptr; + act::ClusteredRenderer* mClusteredRenderer = nullptr; + void* mPlacementNavi = nullptr; + u32 mMassRendererReqCount = 0; + u32 mMassRendererStatus = 0; + + // fix these + sead::DelegateFunc mInvoker{}; + u8 TEMP4[0x10]; + + s32 _7f0 = -1; + + sead::DelegateFunc mInvoker2{}; + u8 TEMP5[0x10]; }; KSYS_CHECK_SIZE_NX150(PlacementMgr, 0x818); diff --git a/src/KingSystem/Map/mapPlacementTree.cpp b/src/KingSystem/Map/mapPlacementTree.cpp new file mode 100644 index 00000000..52eea81e --- /dev/null +++ b/src/KingSystem/Map/mapPlacementTree.cpp @@ -0,0 +1,13 @@ +#include "KingSystem/Map/mapPlacementTree.h" + +namespace ksys::map { + +PlacementTree::PlacementTree() = default; + +PlacementTree::~PlacementTree() { + mBuffer.freeBuffer(); + mObjects.freeBuffer(); + delete[] _28; +} + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapPlacementTree.h b/src/KingSystem/Map/mapPlacementTree.h new file mode 100644 index 00000000..13818b34 --- /dev/null +++ b/src/KingSystem/Map/mapPlacementTree.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include +#include +#include + +using F32Limits = std::numeric_limits; + +namespace ksys::map { + +// FIXME +class PlacementTree { + struct TreeObject { + u32 _0; + u32 _4; + u32 _8; + f32 _c; + f32 _10; + f32 _14; + }; + +public: + PlacementTree(); + ~PlacementTree(); + + sead::Buffer mBuffer{}; + sead::Buffer mObjects{}; + void* _20{}; + void* _28{}; + u32 _30{}; + f32 _34 = F32Limits::max(); + f32 _38 = F32Limits::max(); + f32 _3c = F32Limits::max(); + f32 _40 = F32Limits::max(); + sead::ReadWriteLock mLock{}; +}; + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapRail.cpp b/src/KingSystem/Map/mapRail.cpp new file mode 100644 index 00000000..939707d6 --- /dev/null +++ b/src/KingSystem/Map/mapRail.cpp @@ -0,0 +1 @@ +#include "KingSystem/Map/mapRail.h" diff --git a/src/KingSystem/Map/mapRail.h b/src/KingSystem/Map/mapRail.h new file mode 100644 index 00000000..dbbfca39 --- /dev/null +++ b/src/KingSystem/Map/mapRail.h @@ -0,0 +1,7 @@ +#pragma once + +namespace ksys::map { + +class Rail {}; + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapStagePreActorCache.cpp b/src/KingSystem/Map/mapStagePreActorCache.cpp new file mode 100644 index 00000000..cc853e2a --- /dev/null +++ b/src/KingSystem/Map/mapStagePreActorCache.cpp @@ -0,0 +1,7 @@ +#include "KingSystem/Map/mapStagePreActorCache.h" + +namespace ksys::map { + +SEAD_SINGLETON_DISPOSER_IMPL(StagePreActorCache) + +} // namespace ksys::map diff --git a/src/KingSystem/Map/mapStagePreActorCache.h b/src/KingSystem/Map/mapStagePreActorCache.h new file mode 100644 index 00000000..7d87c958 --- /dev/null +++ b/src/KingSystem/Map/mapStagePreActorCache.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace ksys::gfx { +class ForestRenderer; +} + +namespace ksys::map { + +// TODO +class StagePreActorCache { + SEAD_SINGLETON_DISPOSER(StagePreActorCache) + StagePreActorCache(); + +public: + auto* getForestRenderer() { return mForestRenderer; } + +private: + gfx::ForestRenderer* mForestRenderer; +}; + +} // namespace ksys::map