mirror of https://github.com/zeldaret/botw.git
implement map::Object getters
This commit is contained in:
parent
2f80f2b581
commit
8205744abc
|
@ -73164,7 +73164,7 @@
|
||||||
0x0000007100d29b0c,sub_7100D29B0C,96,
|
0x0000007100d29b0c,sub_7100D29B0C,96,
|
||||||
0x0000007100d29b6c,sub_7100D29B6C,104,
|
0x0000007100d29b6c,sub_7100D29B6C,104,
|
||||||
0x0000007100d29bd4,sub_7100D29BD4,8,
|
0x0000007100d29bd4,sub_7100D29BD4,8,
|
||||||
0x0000007100d29bdc,ActorDebug::getNullStr,12,
|
0x0000007100d29bdc,ActorDebug::getNullStr,12,_ZN4ksys3act10ActorDebug10getNullStrEPNS1_10HashUnusedE
|
||||||
0x0000007100d29be8,sub_7100D29BE8,32,
|
0x0000007100d29be8,sub_7100D29BE8,32,
|
||||||
0x0000007100d29c08,sub_7100D29C08,376,
|
0x0000007100d29c08,sub_7100D29C08,376,
|
||||||
0x0000007100d29d80,sub_7100D29D80,32,
|
0x0000007100d29d80,sub_7100D29D80,32,
|
||||||
|
@ -73816,51 +73816,51 @@
|
||||||
0x0000007100d49b10,sub_7100D49B10,416,
|
0x0000007100d49b10,sub_7100D49B10,416,
|
||||||
0x0000007100d49cb0,sub_7100D49CB0,56,
|
0x0000007100d49cb0,sub_7100D49CB0,56,
|
||||||
0x0000007100d49ce8,PlacementObj::ctor,124,_ZN4ksys3map6ObjectC1Ev!
|
0x0000007100d49ce8,PlacementObj::ctor,124,_ZN4ksys3map6ObjectC1Ev!
|
||||||
0x0000007100d49d64,PlacementObj::dtor,52,
|
0x0000007100d49d64,PlacementObj::dtor,52,_ZN4ksys3map6ObjectD1Ev
|
||||||
0x0000007100d49d98,PlacementObj::initData,380,
|
0x0000007100d49d98,PlacementObj::initData,380,
|
||||||
0x0000007100d49f14,PlacementObj::initRevivalGameDataFlagAndMiscFlags,620,
|
0x0000007100d49f14,PlacementObj::initRevivalGameDataFlagAndMiscFlags,620,
|
||||||
0x0000007100d4a180,PlacementObj::free,120,
|
0x0000007100d4a180,PlacementObj::free,120,_ZN4ksys3map6Object4freeEv
|
||||||
0x0000007100d4a1f8,PlacementObj::x_8,132,
|
0x0000007100d4a1f8,PlacementObj::x_8,132,
|
||||||
0x0000007100d4a27c,PlacementObj::getActor_0,244,
|
0x0000007100d4a27c,PlacementObj::getActor_0,244,
|
||||||
0x0000007100d4a370,PlacementObj::x_10,244,
|
0x0000007100d4a370,PlacementObj::x_10,244,
|
||||||
0x0000007100d4a464,PlacementObj::getActorWithAccessor,88,
|
0x0000007100d4a464,PlacementObj::getActorWithAccessor,88,_ZNK4ksys3map6Object20getActorWithAccessorERNS_3act24ActorLinkConstDataAccessE!
|
||||||
0x0000007100d4a4bc,PlacementObj::getActor,140,
|
0x0000007100d4a4bc,PlacementObj::getActor,140,_ZNK4ksys3map6Object8getActorEv
|
||||||
0x0000007100d4a548,PlacementObj::registerActor,320,
|
0x0000007100d4a548,PlacementObj::registerActor,320,_ZN4ksys3map6Object16registerBaseProcEPNS_3act8BaseProcE
|
||||||
0x0000007100d4a688,PlacementObj::setActorDirect,8,
|
0x0000007100d4a688,PlacementObj::setActorDirect,8,_ZN4ksys3map6Object17setBaseProcDirectEPNS_3act8BaseProcE
|
||||||
0x0000007100d4a690,PlacementObj::isEnemyOrNpcOrActiveOrMapPassive,84,
|
0x0000007100d4a690,PlacementObj::isEnemyOrNpcOrActiveOrMapPassive,84,_ZNK4ksys3map6Object32isEnemyOrNpcOrActiveOrMapPassiveEv
|
||||||
0x0000007100d4a6e4,PlacementObj::doesActorHaveNoFlag8,16,
|
0x0000007100d4a6e4,PlacementObj::doesActorHaveNoFlag8,16,_ZNK4ksys3map6Object15isFlags8ClearedEv
|
||||||
0x0000007100d4a6f4,PlacementObj::isNpcOrActiveOrMapPassiveOrFlag1,108,
|
0x0000007100d4a6f4,PlacementObj::isNpcOrActiveOrMapPassiveOrFlag1,108,_ZNK4ksys3map6Object32isNpcOrActiveOrMapPassiveOrFlag1Ev
|
||||||
0x0000007100d4a760,PlacementObj::isMapPassive,92,
|
0x0000007100d4a760,PlacementObj::isMapPassive,92,_ZNK4ksys3map6Object12isMapPassiveEPKNS0_15PlacementActorsE
|
||||||
0x0000007100d4a7bc,PlacementObj::checkActorDataFlag0,60,
|
0x0000007100d4a7bc,PlacementObj::checkActorDataFlag0,60,_ZNK4ksys3map6Object18checkActorDataFlagEPKNS0_15PlacementActorsENS0_9ActorData4FlagE
|
||||||
0x0000007100d4a7f8,PlacementObj::isEnemyOrNpc,36,
|
0x0000007100d4a7f8,PlacementObj::isEnemyOrNpc,36,_ZNK4ksys3map6Object12isEnemyOrNpcEPKNS0_15PlacementActorsE
|
||||||
0x0000007100d4a81c,PlacementObj::getTraverseDistForGenGroup,120,
|
0x0000007100d4a81c,PlacementObj::getTraverseDistForGenGroup,120,_ZNK4ksys3map6Object15getDispDistanceEPKNS0_15PlacementActorsEbb
|
||||||
0x0000007100d4a894,PlacementObj::x_3,92,
|
0x0000007100d4a894,PlacementObj::x_3,92,_ZNK4ksys3map6Object15getDispDistanceEPKNS0_9ActorDataEbjb
|
||||||
0x0000007100d4a8f0,PlacementObj::getDispDistance,144,
|
0x0000007100d4a8f0,PlacementObj::getDispDistance,144,_ZNK4ksys3map6Object15getDispDistanceEbb
|
||||||
0x0000007100d4a980,PlacementObj::getTraverseDist,208,
|
0x0000007100d4a980,PlacementObj::getTraverseDist,208,_ZNK4ksys3map6Object15getTraverseDistEPKNS0_9ActorDataEbjb
|
||||||
0x0000007100d4aa50,PlacementObj::getTraverseDistForLOD,200,
|
0x0000007100d4aa50,PlacementObj::getTraverseDistForLOD,200,_ZNK4ksys3map6Object21getTraverseDistForLODEv
|
||||||
0x0000007100d4ab18,PlacementObj::initTraverseDist,1016,
|
0x0000007100d4ab18,PlacementObj::initTraverseDist,1016,
|
||||||
0x0000007100d4af10,PlacementObj::getScale,44,
|
0x0000007100d4af10,PlacementObj::getScale,44,_ZNK4ksys3map6Object8getScaleEv
|
||||||
0x0000007100d4af3c,sub_7100D4AF3C,36,
|
0x0000007100d4af3c,sub_7100D4AF3C,36,
|
||||||
0x0000007100d4af60,PlacementObj::getLoadDistance,412,
|
0x0000007100d4af60,PlacementObj::getLoadDistance,412,
|
||||||
0x0000007100d4b0fc,PlacementObj::getUnitConfigName,172,
|
0x0000007100d4b0fc,PlacementObj::getUnitConfigName,172,_ZNK4ksys3map6Object17getUnitConfigNameEv
|
||||||
0x0000007100d4b1a8,PlacementObj::x_13,4248,
|
0x0000007100d4b1a8,PlacementObj::x_13,4248,
|
||||||
0x0000007100d4c240,PlacementObj::checkYDistance,412,
|
0x0000007100d4c240,PlacementObj::checkYDistance,412,
|
||||||
0x0000007100d4c3dc,PlacementObj::getDispDistanceComplex,968,
|
0x0000007100d4c3dc,PlacementObj::getDispDistanceComplex,968,
|
||||||
0x0000007100d4c7a4,PlacementObj::getUnitConfigNameFromByml,92,
|
0x0000007100d4c7a4,PlacementObj::getUnitConfigNameFromByml,92,_ZNK4ksys3map6Object26getUnitConfigNameFromByamlEv
|
||||||
0x0000007100d4c800,PlacementObj::findPlacementLODLinkObject,52,
|
0x0000007100d4c800,PlacementObj::findPlacementLODLinkObject,52,_ZNK4ksys3map6Object26findPlacementLODLinkObjectEPKNS0_15PlacementActorsE
|
||||||
0x0000007100d4c834,PlacementObj::getPlacementLODLinkObj,52,
|
0x0000007100d4c834,PlacementObj::getPlacementLODLinkObj,52,_ZNK4ksys3map6Object26findPlacementLODLinkObjectEv
|
||||||
0x0000007100d4c868,PlacementObj::getPlacementLODLinkObj_0,40,
|
0x0000007100d4c868,PlacementObj::getPlacementLODLinkObj_0,40,
|
||||||
0x0000007100d4c890,PlacementLinkData::getPlacementLODLinkObj,40,
|
0x0000007100d4c890,PlacementLinkData::getPlacementLODLinkObj,40,
|
||||||
0x0000007100d4c8b8,PlacementObj::getHashIdStringDebug,108,
|
0x0000007100d4c8b8,PlacementObj::getHashIdStringDebug,108,_ZNK4ksys3map6Object20getHashIdStringDebugEv
|
||||||
0x0000007100d4c924,PlacementObj::getHashIdStringDebug_0,108,
|
0x0000007100d4c924,PlacementObj::getHashIdStringDebug_0,108,_ZNK4ksys3map6Object22getHashIdStringDebug_0Ev
|
||||||
0x0000007100d4c990,PlacementObj::unlinkActor,256,
|
0x0000007100d4c990,PlacementObj::unlinkActor,256,
|
||||||
0x0000007100d4ca90,PlacementObj::checkRevivalFlag,220,
|
0x0000007100d4ca90,PlacementObj::checkRevivalFlag,220,
|
||||||
0x0000007100d4cb6c,PlacementObj::getRails,24,
|
0x0000007100d4cb6c,PlacementObj::getRails,24,_ZNK4ksys3map6Object8getRailsEv
|
||||||
0x0000007100d4cb84,PlacementObj::getRails_0,24,
|
0x0000007100d4cb84,PlacementObj::getRails_0,24,_ZNK4ksys3map6Object10getRails_0Ev
|
||||||
0x0000007100d4cb9c,PlacementObj::allocLinkData,60,
|
0x0000007100d4cb9c,PlacementObj::allocLinkData,60,_ZN4ksys3map6Object13allocLinkDataEPN4sead4HeapE
|
||||||
0x0000007100d4cbd8,PlacementObj::hasGenGroup,32,
|
0x0000007100d4cbd8,PlacementObj::hasGenGroup,32,_ZNK4ksys3map6Object11hasGenGroupEv
|
||||||
0x0000007100d4cbf8,PlacementObj::incrementLinkNum,340,
|
0x0000007100d4cbf8,PlacementObj::incrementLinkNum,340,_ZN4ksys3map6Object16incrementLinkNumEv
|
||||||
0x0000007100d4cd4c,PlacementObj::decrementLinkNum,20,
|
0x0000007100d4cd4c,PlacementObj::decrementLinkNum,20,_ZN4ksys3map6Object16decrementLinkNumEv
|
||||||
0x0000007100d4cd60,PlacementObj::initRevivalGameDataFlag,632,
|
0x0000007100d4cd60,PlacementObj::initRevivalGameDataFlag,632,
|
||||||
0x0000007100d4cfd8,PlacementObj::isRevivalGameDataFlagOn,124,
|
0x0000007100d4cfd8,PlacementObj::isRevivalGameDataFlagOn,124,
|
||||||
0x0000007100d4d054,PlacementObj::setRevivalGameDataFlagValueIf,120,
|
0x0000007100d4d054,PlacementObj::setRevivalGameDataFlagValueIf,120,
|
||||||
|
@ -73878,11 +73878,11 @@
|
||||||
0x0000007100d4d998,sub_7100D4D998,288,
|
0x0000007100d4d998,sub_7100D4D998,288,
|
||||||
0x0000007100d4dab8,sub_7100D4DAB8,80,
|
0x0000007100d4dab8,sub_7100D4DAB8,80,
|
||||||
0x0000007100d4db08,sub_7100D4DB08,428,
|
0x0000007100d4db08,sub_7100D4DB08,428,
|
||||||
0x0000007100d4dcb4,PlacementObj::getRotate,44,
|
0x0000007100d4dcb4,PlacementObj::getRotate,44,_ZNK4ksys3map6Object9getRotateEv
|
||||||
0x0000007100d4dce0,PlacementObj::x_21,360,
|
0x0000007100d4dce0,PlacementObj::x_21,360,
|
||||||
0x0000007100d4de48,PlacementObj::getTraversePosAndLoadDistance,124,
|
0x0000007100d4de48,PlacementObj::getTraversePosAndLoadDistance,124,_ZNK4ksys3map6Object29getTraversePosAndLoadDistanceEPN4sead7Vector3IfEEPf?
|
||||||
0x0000007100d4dec4,PlacementObj::getUniqueName,104,
|
0x0000007100d4dec4,PlacementObj::getUniqueName,104,_ZNK4ksys3map6Object13getUniqueNameEPPKc
|
||||||
0x0000007100d4df2c,PlacementObj::setTranslate,28,
|
0x0000007100d4df2c,PlacementObj::setTranslate,28,_ZN4ksys3map6Object12setTranslateERKN4sead7Vector3IfEE
|
||||||
0x0000007100d4df48,PlacementObj::x_22,128,
|
0x0000007100d4df48,PlacementObj::x_22,128,
|
||||||
0x0000007100d4dfc8,PlacementObj::setFieldATrue,36,
|
0x0000007100d4dfc8,PlacementObj::setFieldATrue,36,
|
||||||
0x0000007100d4dfec,j__ZdlPv_848,4,
|
0x0000007100d4dfec,j__ZdlPv_848,4,
|
||||||
|
@ -73890,11 +73890,11 @@
|
||||||
0x0000007100d4e0e0,getMapLinkDefinitionDescription,96,
|
0x0000007100d4e0e0,getMapLinkDefinitionDescription,96,
|
||||||
0x0000007100d4e140,getMapLinkDefinitionDescription_0,96,
|
0x0000007100d4e140,getMapLinkDefinitionDescription_0,96,
|
||||||
0x0000007100d4e1a0,getMapLinkDefinitionNum,324,
|
0x0000007100d4e1a0,getMapLinkDefinitionNum,324,
|
||||||
0x0000007100d4e2e4,PlacementLink::getObjActor,20,
|
0x0000007100d4e2e4,PlacementLink::getObjActor,20,_ZNK4ksys3map10ObjectLink13getObjectProcEv
|
||||||
0x0000007100d4e2f8,PlacementLink::getObjActorWithAccessor,24,
|
0x0000007100d4e2f8,PlacementLink::getObjActorWithAccessor,24,_ZNK4ksys3map10ObjectLink25getObjectProcWithAccessorERNS_3act24ActorLinkConstDataAccessE
|
||||||
0x0000007100d4e310,sub_7100D4E310,28,
|
0x0000007100d4e310,sub_7100D4E310,28,
|
||||||
0x0000007100d4e32c,isPlacementLODOrForSaleLink,24,
|
0x0000007100d4e32c,isPlacementLODOrForSaleLink,24,
|
||||||
0x0000007100d4e344,PlacementLinkData::ctor,44,
|
0x0000007100d4e344,PlacementLinkData::ctor,44,_ZN4ksys3map14ObjectLinkDataC1Ev
|
||||||
0x0000007100d4e370,PlacementLinkData::deleteArrays,136,
|
0x0000007100d4e370,PlacementLinkData::deleteArrays,136,
|
||||||
0x0000007100d4e3f8,PlacementLinkData::allocLinks,556,
|
0x0000007100d4e3f8,PlacementLinkData::allocLinks,556,
|
||||||
0x0000007100d4e624,PlacementLinkData::allocLinksToSelf,212,
|
0x0000007100d4e624,PlacementLinkData::allocLinksToSelf,212,
|
||||||
|
|
Can't render this file because it is too large.
|
Binary file not shown.
|
@ -38,7 +38,8 @@ target_sources(uking PRIVATE
|
||||||
actBaseProcMgr.h
|
actBaseProcMgr.h
|
||||||
actBaseProcUnit.cpp
|
actBaseProcUnit.cpp
|
||||||
actBaseProcUnit.h
|
actBaseProcUnit.h
|
||||||
actLifeRecoveryInfo.h
|
actDebug.cpp
|
||||||
|
actDebug.h
|
||||||
actInstParamPack.cpp
|
actInstParamPack.cpp
|
||||||
actInstParamPack.h
|
actInstParamPack.h
|
||||||
actTag.h
|
actTag.h
|
||||||
|
|
|
@ -87,6 +87,8 @@ public:
|
||||||
void setPriority(u8 priority) { mPriority = priority; }
|
void setPriority(u8 priority) { mPriority = priority; }
|
||||||
|
|
||||||
State getState() const { return mState; }
|
State getState() const { return mState; }
|
||||||
|
bool isInit() const { return mState == State::Init; }
|
||||||
|
bool isCalc() const { return mState == State::Calc; }
|
||||||
bool isDeletedOrDeleting() const {
|
bool isDeletedOrDeleting() const {
|
||||||
return mState == State::Delete || mStateFlags.isOn(StateFlags::RequestDelete);
|
return mState == State::Delete || mStateFlags.isOn(StateFlags::RequestDelete);
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,6 +163,8 @@ public:
|
||||||
Status getStatus() const { return mStatus; }
|
Status getStatus() const { return mStatus; }
|
||||||
u32 getNumJobTypes() const { return mNumJobTypes; }
|
u32 getNumJobTypes() const { return mNumJobTypes; }
|
||||||
|
|
||||||
|
bool checkGetActorOk(BaseProc* proc, void* a2);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void doAddToUpdateStateList_(BaseProc& proc);
|
void doAddToUpdateStateList_(BaseProc& proc);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include "KingSystem/ActorSystem/actDebug.h"
|
||||||
|
#include <prim/seadSafeString.h>
|
||||||
|
|
||||||
|
namespace ksys::act {
|
||||||
|
|
||||||
|
SEAD_SINGLETON_DISPOSER_IMPL(ActorDebug)
|
||||||
|
|
||||||
|
const char* ActorDebug::getNullStr(HashUnused*) {
|
||||||
|
return &sead::SafeString::cNullChar;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ksys::act
|
|
@ -0,0 +1,24 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <heap/seadDisposer.h>
|
||||||
|
#include "KingSystem/Utils/Types.h"
|
||||||
|
|
||||||
|
namespace ksys::act {
|
||||||
|
|
||||||
|
class ActorDebug {
|
||||||
|
SEAD_SINGLETON_DISPOSER(ActorDebug)
|
||||||
|
public:
|
||||||
|
struct HashUnused {
|
||||||
|
u32 hash = 0;
|
||||||
|
u32 b;
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* getNullStr(HashUnused* u);
|
||||||
|
|
||||||
|
u8 TEMP1[0x2F0];
|
||||||
|
f32 mDispDistanceMultiplier;
|
||||||
|
u8 TEMP2[0x114];
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(ActorDebug, 0x428);
|
||||||
|
|
||||||
|
} // namespace ksys::act
|
|
@ -1,7 +1,13 @@
|
||||||
target_sources(uking PRIVATE
|
target_sources(uking PRIVATE
|
||||||
mapTypes.h
|
mapTypes.h
|
||||||
|
mapDebug.cpp
|
||||||
|
mapDebug.h
|
||||||
mapMubinIter.cpp
|
mapMubinIter.cpp
|
||||||
mapMubinIter.h
|
mapMubinIter.h
|
||||||
mapObject.cpp
|
mapObject.cpp
|
||||||
mapObject.h
|
mapObject.h
|
||||||
|
mapObjectLink.cpp
|
||||||
|
mapObjectLink.h
|
||||||
|
mapPlacementMgr.cpp
|
||||||
|
mapPlacementMgr.h
|
||||||
)
|
)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#include "KingSystem/Map/mapDebug.h"
|
||||||
|
|
||||||
|
namespace ksys::map {} // namespace ksys::map
|
|
@ -0,0 +1,11 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <prim/seadSafeString.h>
|
||||||
|
|
||||||
|
namespace ksys::map {
|
||||||
|
|
||||||
|
class Object;
|
||||||
|
|
||||||
|
bool printDebugMsg(Object* object, const sead::SafeString& msg, const char* config_name);
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
|
@ -1,7 +1,371 @@
|
||||||
#include "KingSystem/Map/mapObject.h"
|
#include "KingSystem/Map/mapObject.h"
|
||||||
|
#include "KingSystem/ActorSystem/actBaseProcMgr.h"
|
||||||
|
#include "KingSystem/Utils/Debug.h"
|
||||||
|
|
||||||
namespace ksys::map {
|
namespace ksys::map {
|
||||||
|
|
||||||
Object::Object() = default;
|
Object::Object() = default;
|
||||||
|
|
||||||
|
Object::~Object() {
|
||||||
|
if (mLinkData != nullptr) {
|
||||||
|
mLinkData->release(this, true);
|
||||||
|
mLinkData = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Object::free() {
|
||||||
|
mId = 0;
|
||||||
|
_10 = nullptr;
|
||||||
|
_18 = nullptr;
|
||||||
|
_20 = nullptr;
|
||||||
|
|
||||||
|
if (mProc)
|
||||||
|
mProc = nullptr;
|
||||||
|
|
||||||
|
// TODO: figure out what this is
|
||||||
|
mFlags0.reset(Flag0::Freed);
|
||||||
|
|
||||||
|
mHardModeFlags.reset(HardModeFlag::ActorCreated);
|
||||||
|
|
||||||
|
if (mFlags0.isOn(Flag0::_80000))
|
||||||
|
mFlags0.set(Flag0::_40000);
|
||||||
|
else
|
||||||
|
mFlags0.set(Flag0::_8);
|
||||||
|
|
||||||
|
if (mLinkData)
|
||||||
|
mLinkData->field_57 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NON_MATCHING: functionally equivalent; CSEL instruction flipped
|
||||||
|
bool Object::getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) const {
|
||||||
|
act::BaseProcMgr* instance = act::BaseProcMgr::instance();
|
||||||
|
|
||||||
|
if (instance == nullptr || !instance->isHighPriorityThread() || mProc == nullptr)
|
||||||
|
return accessor.acquire(nullptr);
|
||||||
|
|
||||||
|
if (mProc->isInit() || mProc->isCalc())
|
||||||
|
return accessor.acquire(mProc);
|
||||||
|
|
||||||
|
return accessor.acquire(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
act::Actor* Object::getActor() const {
|
||||||
|
return sead::DynamicCast<act::Actor>(mProc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::registerBaseProc(act::BaseProc* proc) {
|
||||||
|
const char* sActorStateStrings[4] = {"Init", "Calc", "Sleep", "Delete"};
|
||||||
|
|
||||||
|
if (mProc != nullptr && mProc != proc) {
|
||||||
|
sead::FixedSafeString<1000> message;
|
||||||
|
message.format("%p (%s:%p:%s) → (%s:%p:%s) \n", this, mProc->getName().cstr(), mProc,
|
||||||
|
sActorStateStrings[static_cast<s32>(mProc->getState())],
|
||||||
|
proc->getName().cstr(), proc,
|
||||||
|
sActorStateStrings[static_cast<s32>(proc->getState())]);
|
||||||
|
util::PrintDebug(message);
|
||||||
|
}
|
||||||
|
mProc = proc;
|
||||||
|
|
||||||
|
mFlags0.set(Flag0::_80);
|
||||||
|
mFlags0.reset(Flag0::_80000000);
|
||||||
|
mHardModeFlags.set(HardModeFlag::ActorCreated);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setBaseProcDirect(act::BaseProc* proc) {
|
||||||
|
mProc = proc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::checkActorDataFlag(const PlacementActors* pa, ActorData::Flag flag) const {
|
||||||
|
return pa->mActorData[mActorDataIdx].mFlags.isOnBit(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::isEnemyOrNpcOrActiveOrMapPassive() const {
|
||||||
|
if (mActorFlags8.isOn(ActorFlag8::EnemyOrNpcOrActiveOrAreaOrAirWall))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
auto pa = PlacementMgr::instance()->mPlacementActors;
|
||||||
|
if (pa == nullptr)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !checkActorDataFlag(pa, ActorData::Flag::MapPassiveOrFlag1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::isNpcOrActiveOrMapPassiveOrFlag1() const {
|
||||||
|
auto actFlags = mActorFlags8;
|
||||||
|
if (actFlags.isZero())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
auto pa = PlacementMgr::instance()->mPlacementActors;
|
||||||
|
if (pa == nullptr)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (checkActorDataFlag(pa, ActorData::Flag::_16) ||
|
||||||
|
actFlags.isOn(ActorFlag8::EnemyOrNpcOrActiveOrAreaOrAirWall))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return checkActorDataFlag(pa, ActorData::Flag::MapPassiveOrFlag1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::isMapPassive(const PlacementActors* pa) const {
|
||||||
|
if (mActorFlags8.isZero())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (pa == nullptr)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (pa->mActorData[mActorDataIdx].mFlags.isOnBit(ActorData::Flag::_16) ||
|
||||||
|
mActorFlags8.isOn(ActorFlag8::EnemyOrNpcOrActiveOrAreaOrAirWall))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return checkActorDataFlag(pa, ActorData::Flag::MapPassiveOrFlag1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::isEnemyOrNpc(const PlacementActors* pa) const {
|
||||||
|
return checkActorDataFlag(pa, ActorData::Flag::EnemyOrNpc_DisableFlashback);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Object::isFlags8Cleared() const {
|
||||||
|
return mActorFlags8.isZero();
|
||||||
|
}
|
||||||
|
|
||||||
|
f32 Object::getDispDistance(const ActorData* data, bool get_diameter, u32 unused,
|
||||||
|
bool ignore_radius) const {
|
||||||
|
if (data->mFlags.isOnBit(ActorData::Flag::TraverseDistReset))
|
||||||
|
return 0.0;
|
||||||
|
|
||||||
|
f32 dist = getTraverseDist(data, get_diameter, unused, ignore_radius);
|
||||||
|
f32 mult = getDispDistanceMultiplier();
|
||||||
|
|
||||||
|
if (dist > 0.0)
|
||||||
|
return dist * mult;
|
||||||
|
else
|
||||||
|
return 100.0 * mult;
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
||||||
|
mMubinIter.tryGetParamFloatByKey(&dist, "TraverseRadiusXZ");
|
||||||
|
if (get_diameter)
|
||||||
|
dist = dist * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: inline here?
|
||||||
|
if (data->mFlags.isOnBit(DFlag::TraverseDistReset))
|
||||||
|
return dist + 0.0;
|
||||||
|
|
||||||
|
if (data->mFlags.isOnBit(DFlag::TraverseDist400) ||
|
||||||
|
data->mFlags.isOnBit(DFlag::TraverseDist200) ||
|
||||||
|
data->mFlags.isOnBit(DFlag::TraverseDist4000) ||
|
||||||
|
data->mFlags.isOnBit(DFlag::TraverseDist800))
|
||||||
|
return mTraverseDist + dist;
|
||||||
|
|
||||||
|
if (data->mFlags.isOffBit(DFlag::TraverseDist2000))
|
||||||
|
return mTraverseDist + dist;
|
||||||
|
|
||||||
|
return mTraverseDist;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
dist = mTraverseDist;
|
||||||
|
|
||||||
|
f32 mult = getDispDistanceMultiplier();
|
||||||
|
|
||||||
|
if (dist > 0.0)
|
||||||
|
return dist * mult;
|
||||||
|
else
|
||||||
|
return 100.0 * mult;
|
||||||
|
}
|
||||||
|
|
||||||
|
sead::Vector3f Object::getScale() const {
|
||||||
|
sead::Vector3f vec;
|
||||||
|
|
||||||
|
mMubinIter.getScale(&vec);
|
||||||
|
return vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Object::getUnitConfigName() const {
|
||||||
|
auto* mgr = PlacementMgr::instance();
|
||||||
|
|
||||||
|
if (mgr != nullptr && mgr->mPlacementActors != nullptr)
|
||||||
|
return mgr->mPlacementActors->mActorData[mActorDataIdx].mActorName.cstr();
|
||||||
|
|
||||||
|
return getUnitConfigNameFromByaml();
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* Object::getUnitConfigNameFromByaml() const {
|
||||||
|
const char* result;
|
||||||
|
if (!mMubinIter.tryGetParamStringByKey(&result, "UnitConfigName"))
|
||||||
|
result = "";
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object* Object::findPlacementLODLinkObject(const PlacementActors*) const {
|
||||||
|
if (!mLinkData)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
ObjectLink* result = mLinkData->mLinksToSelf.findLinkWithType(MapLinkDefType::PlacementLOD);
|
||||||
|
if (result)
|
||||||
|
return result->other_obj;
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
Object* Object::findPlacementLODLinkObject() const {
|
||||||
|
if (!mLinkData)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
ObjectLink* result = mLinkData->mLinksToSelf.findLinkWithType(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
return mLinkData->mRails;
|
||||||
|
}
|
||||||
|
|
||||||
|
void* Object::getRails_0() const {
|
||||||
|
if (!mLinkData)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return mLinkData->mRails;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto name = sead::SafeString(getUnitConfigName());
|
||||||
|
|
||||||
|
if (name == "LinkTagNone") {
|
||||||
|
// More than 255 actors are specified in one generation group.
|
||||||
|
// If it is not a test, consult the programmer.
|
||||||
|
printDebugMsg(this,
|
||||||
|
"一つの生成グループに 255 以上のアクタが指定されています。"
|
||||||
|
"テストで無ければプログラマに相談",
|
||||||
|
nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We have exceeded the expected number of links.
|
||||||
|
// If it's not a test, talk to your programmer.
|
||||||
|
printDebugMsg(this, "リンクの想定数を越えました。テストで無ければプログラマに相談", nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::decrementLinkNum() {
|
||||||
|
if (mNumLinksPointingToMe != 0)
|
||||||
|
--mNumLinksPointingToMe;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)) {
|
||||||
|
mMubinIter.tryGetFloatArrayByKey(&traverse_pos->x, "TraversePos");
|
||||||
|
} else {
|
||||||
|
*traverse_pos = mTranslate;
|
||||||
|
}
|
||||||
|
|
||||||
|
*load_dist = getLoadDistance(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::getUniqueName(const char** out) const {
|
||||||
|
if (mFlags.isOff(Flag::HasUniqueName) || !mMubinIter.tryGetParamStringByKey(out, "UniqueName"))
|
||||||
|
*out = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void Object::setTranslate(const sead::Vector3f& translate) {
|
||||||
|
mTranslate = translate;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
||||||
|
|
|
@ -1,8 +1,15 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <basis/seadTypes.h>
|
#include <basis/seadTypes.h>
|
||||||
|
#include <heap/seadHeap.h>
|
||||||
#include <prim/seadTypedBitFlag.h>
|
#include <prim/seadTypedBitFlag.h>
|
||||||
|
#include "KingSystem/ActorSystem/actActor.h"
|
||||||
|
#include "KingSystem/ActorSystem/actActorLinkConstDataAccess.h"
|
||||||
|
#include "KingSystem/ActorSystem/actDebug.h"
|
||||||
|
#include "KingSystem/Map/mapDebug.h"
|
||||||
#include "KingSystem/Map/mapMubinIter.h"
|
#include "KingSystem/Map/mapMubinIter.h"
|
||||||
|
#include "KingSystem/Map/mapObjectLink.h"
|
||||||
|
#include "KingSystem/Map/mapPlacementMgr.h"
|
||||||
#include "KingSystem/Utils/Types.h"
|
#include "KingSystem/Utils/Types.h"
|
||||||
|
|
||||||
namespace ksys::act {
|
namespace ksys::act {
|
||||||
|
@ -11,14 +18,30 @@ class BaseProc;
|
||||||
|
|
||||||
namespace ksys::map {
|
namespace ksys::map {
|
||||||
|
|
||||||
class LinkData;
|
class Object;
|
||||||
|
|
||||||
|
class ObjectLinkData;
|
||||||
|
struct ObjectLink;
|
||||||
|
struct ObjectLinkArray;
|
||||||
|
|
||||||
|
class LinkTag;
|
||||||
|
|
||||||
// FIXME: incomplete
|
// FIXME: incomplete
|
||||||
class Object {
|
class Object {
|
||||||
public:
|
public:
|
||||||
// TODO: rename
|
// TODO: rename
|
||||||
enum class Flag0 {
|
enum class Flag0 : u32 {
|
||||||
|
_2 = 0x2,
|
||||||
|
_4 = 0x4,
|
||||||
|
_8 = 0x8,
|
||||||
|
_10 = 0x10,
|
||||||
|
_20 = 0x20,
|
||||||
|
_80 = 0x80,
|
||||||
|
_8000 = 0x8000,
|
||||||
|
_40000 = 0x40000,
|
||||||
|
_80000 = 0x80000,
|
||||||
|
Freed = 0xC65067E6,
|
||||||
|
_80000000 = 0x80000000,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Flag {
|
enum class Flag {
|
||||||
|
@ -39,11 +62,6 @@ public:
|
||||||
IsTurnActorBowChargeAndHasBasicSigLink = 0x8000,
|
IsTurnActorBowChargeAndHasBasicSigLink = 0x8000,
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO: rename
|
|
||||||
enum class ActorFlag8 {
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class HardModeFlag {
|
enum class HardModeFlag {
|
||||||
ActorCreated = 0x1,
|
ActorCreated = 0x1,
|
||||||
/// This actor only spawns in master mode (hard mode).
|
/// This actor only spawns in master mode (hard mode).
|
||||||
|
@ -57,6 +75,69 @@ public:
|
||||||
Object();
|
Object();
|
||||||
~Object();
|
~Object();
|
||||||
|
|
||||||
|
void free();
|
||||||
|
|
||||||
|
bool getActorWithAccessor(act::ActorLinkConstDataAccess& accessor) const;
|
||||||
|
act::Actor* getActor() const;
|
||||||
|
void registerBaseProc(act::BaseProc* proc);
|
||||||
|
void setBaseProcDirect(act::BaseProc* proc);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
f32 getDispDistanceMultiplier() const {
|
||||||
|
f32 mult = 1.0;
|
||||||
|
|
||||||
|
if (act::ActorDebug::instance() != nullptr)
|
||||||
|
mult = act::ActorDebug::instance()->mDispDistanceMultiplier;
|
||||||
|
|
||||||
|
return mult;
|
||||||
|
}
|
||||||
|
|
||||||
|
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, bool ignore_radius) 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;
|
||||||
|
|
||||||
|
Object* findPlacementLODLinkObject(const PlacementActors* unused) const;
|
||||||
|
Object* findPlacementLODLinkObject() const;
|
||||||
|
|
||||||
|
const char* getHashIdStringDebug() const;
|
||||||
|
const char* getHashIdStringDebug_0() const;
|
||||||
|
|
||||||
|
void* getRails() const;
|
||||||
|
void* getRails_0() const;
|
||||||
|
bool allocLinkData(sead::Heap* heap);
|
||||||
|
bool hasGenGroup() const;
|
||||||
|
void incrementLinkNum();
|
||||||
|
void decrementLinkNum();
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
auto getFlags0() const { return mFlags0; }
|
auto getFlags0() const { return mFlags0; }
|
||||||
auto getFlags() const { return mFlags; }
|
auto getFlags() const { return mFlags; }
|
||||||
auto getActorFlags8() const { return mActorFlags8; }
|
auto getActorFlags8() const { return mActorFlags8; }
|
||||||
|
@ -71,19 +152,17 @@ public:
|
||||||
|
|
||||||
const MubinIter& getMubinIter() const { return mMubinIter; }
|
const MubinIter& getMubinIter() const { return mMubinIter; }
|
||||||
act::BaseProc* getProc() const { return mProc; }
|
act::BaseProc* getProc() const { return mProc; }
|
||||||
LinkData* getLinkData() const { return mLinkData; }
|
ObjectLinkData* getLinkData() const { return mLinkData; }
|
||||||
|
|
||||||
u32 getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; }
|
u32 getRevivalGameDataFlagHash() const { return mRevivalGameDataFlagHash; }
|
||||||
u32 getHashId() const { return mHashId; }
|
u32 getHashId() const { return mHashId; }
|
||||||
|
|
||||||
const sead::Vector3f& getTranslate() const { return mTranslate; }
|
const sead::Vector3f& getTranslate() const { return mTranslate; }
|
||||||
void setTranslate(const sead::Vector3f& translate);
|
|
||||||
|
|
||||||
auto getTraverseDist() const { return mTraverseDist; }
|
|
||||||
auto getTraverseDistInt() const { return mTraverseDistInt; }
|
auto getTraverseDistInt() const { return mTraverseDistInt; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
sead::TypedBitFlag<Flag0, u32> mFlags0;
|
sead::TypedBitFlag<Flag0, sead::Atomic<u32>> mFlags0;
|
||||||
u16 mActorDataIdx = 0xffff;
|
u16 mActorDataIdx = 0xffff;
|
||||||
sead::TypedBitFlag<Flag, u16> mFlags;
|
sead::TypedBitFlag<Flag, u16> mFlags;
|
||||||
u8 mIdx = 0;
|
u8 mIdx = 0;
|
||||||
|
@ -97,7 +176,7 @@ private:
|
||||||
void* _20 = nullptr;
|
void* _20 = nullptr;
|
||||||
MubinIter mMubinIter;
|
MubinIter mMubinIter;
|
||||||
act::BaseProc* mProc = nullptr;
|
act::BaseProc* mProc = nullptr;
|
||||||
LinkData* mLinkData = nullptr;
|
ObjectLinkData* mLinkData = nullptr;
|
||||||
u32 mRevivalGameDataFlagHash = 0xffffffff;
|
u32 mRevivalGameDataFlagHash = 0xffffffff;
|
||||||
void* _50 = nullptr;
|
void* _50 = nullptr;
|
||||||
u32 mHashId = 0;
|
u32 mHashId = 0;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "KingSystem/Map/mapObjectLink.h"
|
||||||
|
|
||||||
|
namespace ksys::map {
|
||||||
|
|
||||||
|
ObjectLinkData::ObjectLinkData() = default;
|
||||||
|
|
||||||
|
act::BaseProc* ObjectLink::getObjectProc() const {
|
||||||
|
if (other_obj == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return other_obj->getActor_0(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ObjectLink::getObjectProcWithAccessor(act::ActorLinkConstDataAccess& accessor) const {
|
||||||
|
if (other_obj == nullptr)
|
||||||
|
return accessor.acquire(nullptr);
|
||||||
|
else
|
||||||
|
return other_obj->getActorWithAccessor(accessor);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
|
@ -0,0 +1,98 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "KingSystem/Map/mapObject.h"
|
||||||
|
|
||||||
|
namespace ksys::map {
|
||||||
|
|
||||||
|
class Object;
|
||||||
|
|
||||||
|
enum class MapLinkDefType {
|
||||||
|
BasicSig = 0,
|
||||||
|
AxisX = 1,
|
||||||
|
AxisY = 2,
|
||||||
|
AxisZ = 3,
|
||||||
|
NAxisX = 4,
|
||||||
|
NAxisY = 5,
|
||||||
|
NAxisZ = 6,
|
||||||
|
GimmickSuccess = 7,
|
||||||
|
VelocityControl = 8,
|
||||||
|
BasicSigOnOnly = 9,
|
||||||
|
Remains = 10,
|
||||||
|
DeadUp = 11,
|
||||||
|
LifeZero = 12,
|
||||||
|
Stable = 13,
|
||||||
|
ChangeAtnSig = 14,
|
||||||
|
Create = 15,
|
||||||
|
Delete = 16,
|
||||||
|
MtxCopyCreate = 17,
|
||||||
|
Freeze = 18,
|
||||||
|
ForbidAttention = 19,
|
||||||
|
SyncLink = 20,
|
||||||
|
CopyWaitRevival = 21,
|
||||||
|
OffWaitRevival = 22,
|
||||||
|
Recreate = 23,
|
||||||
|
AreaCol = 24,
|
||||||
|
SensorBlind = 25,
|
||||||
|
ForSale = 26,
|
||||||
|
ModelBind = 27,
|
||||||
|
PlacementLOD = 28,
|
||||||
|
DemoMember = 29,
|
||||||
|
PhysSystemGroup = 30,
|
||||||
|
StackLink = 31,
|
||||||
|
FixedCs = 32,
|
||||||
|
HingeCs = 33,
|
||||||
|
LimitHingeCs = 34,
|
||||||
|
SliderCs = 35,
|
||||||
|
PulleyCs = 36,
|
||||||
|
BAndSCs = 37,
|
||||||
|
BAndSLimitAngYCs = 38,
|
||||||
|
CogWheelCs = 39,
|
||||||
|
RackAndPinionCs = 40,
|
||||||
|
Reference = 41,
|
||||||
|
Invalid = 42,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ObjectLink {
|
||||||
|
act::BaseProc* getObjectProc() const;
|
||||||
|
bool getObjectProcWithAccessor(act::ActorLinkConstDataAccess& accessor) const;
|
||||||
|
|
||||||
|
Object* other_obj;
|
||||||
|
u32 type;
|
||||||
|
MubinIter iter;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(ObjectLink, 0x20);
|
||||||
|
|
||||||
|
struct ObjectLinkArray {
|
||||||
|
ObjectLink* findLinkWithType(MapLinkDefType link_type);
|
||||||
|
u32 num_links = 0;
|
||||||
|
ObjectLink* links = nullptr;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(ObjectLinkArray, 0x10);
|
||||||
|
|
||||||
|
class ObjectLinkData {
|
||||||
|
public:
|
||||||
|
ObjectLinkData();
|
||||||
|
|
||||||
|
void release(Object* obj, bool a1);
|
||||||
|
|
||||||
|
Object* mCreateLinksSrcObj = nullptr;
|
||||||
|
Object* mDeleteLinksSrcObj = nullptr;
|
||||||
|
u32 mNumLinksReference = 0;
|
||||||
|
|
||||||
|
void* mLinksReference = nullptr;
|
||||||
|
ObjectLinkArray mLinksOther{};
|
||||||
|
ObjectLinkArray mLinksCs{};
|
||||||
|
ObjectLinkArray mLinksToSelf{};
|
||||||
|
|
||||||
|
u32 field_50 = 0;
|
||||||
|
bool field_54 = false;
|
||||||
|
bool mAppearFade = false;
|
||||||
|
bool mNoAutoDemoMember = false;
|
||||||
|
bool field_57 = false;
|
||||||
|
|
||||||
|
void* mGenGroup = nullptr;
|
||||||
|
void* mRails = nullptr;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(ObjectLinkData, 0x68);
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
|
@ -0,0 +1,7 @@
|
||||||
|
#include "KingSystem/Map/mapPlacementMgr.h"
|
||||||
|
|
||||||
|
namespace ksys::map {
|
||||||
|
|
||||||
|
SEAD_SINGLETON_DISPOSER_IMPL(PlacementMgr)
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
|
@ -0,0 +1,119 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <container/seadSafeArray.h>
|
||||||
|
#include <heap/seadDisposer.h>
|
||||||
|
#include <prim/seadSafeString.h>
|
||||||
|
#include <prim/seadTypedBitFlag.h>
|
||||||
|
#include <prim/seadTypedLongBitFlag.h>
|
||||||
|
#include <thread/seadAtomic.h>
|
||||||
|
#include "KingSystem/Utils/Types.h"
|
||||||
|
|
||||||
|
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<u32>> mFlags;
|
||||||
|
sead::TypedBitFlag<ActorFlag8, u8> mActorFlags8;
|
||||||
|
u8 TEMP[0x13F];
|
||||||
|
sead::FixedSafeString<64> mActorName;
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(ActorData, 0x1A0);
|
||||||
|
|
||||||
|
class PlacementActors {
|
||||||
|
public:
|
||||||
|
u8 TEMP1[0x538];
|
||||||
|
sead::SafeArray<ActorData, 6000> mActorData;
|
||||||
|
u8 TEMP2[0x46598];
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(PlacementActors, 0x2A80D0);
|
||||||
|
|
||||||
|
class PlacementMgr {
|
||||||
|
SEAD_SINGLETON_DISPOSER(PlacementMgr)
|
||||||
|
public:
|
||||||
|
enum class MgrFlag {
|
||||||
|
_1000000 = 0x1000000,
|
||||||
|
};
|
||||||
|
|
||||||
|
u8 TEMP1[0x1D0];
|
||||||
|
PlacementActors* mPlacementActors;
|
||||||
|
u8 TEMP2[0x48C];
|
||||||
|
sead::TypedBitFlag<MgrFlag, sead::Atomic<u32>> mFlags;
|
||||||
|
u8 TEMP3[0x190];
|
||||||
|
};
|
||||||
|
KSYS_CHECK_SIZE_NX150(PlacementMgr, 0x818);
|
||||||
|
|
||||||
|
} // namespace ksys::map
|
Loading…
Reference in New Issue