diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 3808767b..316361ea 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89538,9 +89538,9 @@ 0x00000071010f220c,sub_71010F220C,60, 0x00000071010f2248,sub_71010F2248,1536, 0x00000071010f2848,sub_71010F2848,8, -0x00000071010f2850,WorldMgr::destroyInstance,100, -0x00000071010f28b4,WorldMgr::destroyInstanceDelete,108, -0x00000071010f2920,WorldMgr::createInstance,136, +0x00000071010f2850,WorldMgr::destroyInstance,100,_ZN4ksys5world7Manager18SingletonDisposer_D1Ev +0x00000071010f28b4,WorldMgr::destroyInstanceDelete,108,_ZN4ksys5world7Manager18SingletonDisposer_D0Ev +0x00000071010f2920,WorldMgr::createInstance,136,_ZN4ksys5world7Manager14createInstanceEPN4sead4HeapE 0x00000071010f29a8,nullsub_5567,4, 0x00000071010f29ac,nullsub_5568,4, 0x00000071010f29b0,nullsub_5569,4, @@ -89576,7 +89576,7 @@ 0x00000071010f3cdc,WorldMgr::isCurrentClimateForbidComeback,96, 0x00000071010f3d3c,WorldMgr::isClimateForbidComeback,92, 0x00000071010f3d98,WorldMgr::unloadDgnenvAndGetWeatherMgr,76, -0x00000071010f3de4,WorldMgr::ctor,728, +0x00000071010f3de4,WorldMgr::ctor,728,_ZN4ksys5world7ManagerC1Ev! 0x00000071010f40bc,WorldMgr::init,836, 0x00000071010f4400,WorldMgr::resetForStageUnload,84, 0x00000071010f4454,WorldMgr::loadBwinfo,148, @@ -89584,8 +89584,8 @@ 0x00000071010f66c4,WorldMgr::updateRemainsType,268, 0x00000071010f67d0,WorldMgr::updateGraphicsMap,164, 0x00000071010f6874,sub_71010F6874,680, -0x00000071010f6b1c,sub_71010F6B1C,116, -0x00000071010f6b90,sub_71010F6B90,76, +0x00000071010f6b1c,sub_71010F6B1C,116,_ZN4ksys5world10DungeonEnvD2Ev +0x00000071010f6b90,sub_71010F6B90,76,_ZN4ksys5world9WorldInfoD2Ev 0x00000071010f6bdc,sub_71010F6BDC,36, 0x00000071010f6c00,WorldMgr::initBeforeStageGenB,32, 0x00000071010f6c20,WorldMgr::__auto4,32, @@ -89630,8 +89630,8 @@ 0x00000071010f8438,WorldMgr::setIgnitedLevel,188, 0x00000071010f84f4,WorldMgr::__auto7,48, 0x00000071010f8524,WorldMgr::__auto17,32, -0x00000071010f8544,sub_71010F8544,64, -0x00000071010f8584,sub_71010F8584,104, +0x00000071010f8544,sub_71010F8544,64,_ZN4ksys5world9WorldInfoD0Ev +0x00000071010f8584,sub_71010F8584,104,_ZN4ksys5world10DungeonEnvD0Ev 0x00000071010f85ec,getDungeonSizeText,428, 0x00000071010f8798,j__ZdlPv_1204,4, 0x00000071010f879c,_ZN4sead15FixedSafeStringILi9EEaSERKNS_14SafeStringBaseIcEE,240, diff --git a/src/KingSystem/World/CMakeLists.txt b/src/KingSystem/World/CMakeLists.txt index 451e82b6..bd8dd0a9 100644 --- a/src/KingSystem/World/CMakeLists.txt +++ b/src/KingSystem/World/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources(uking PRIVATE + worldManager.cpp worldManager.h ) diff --git a/src/KingSystem/World/worldManager.cpp b/src/KingSystem/World/worldManager.cpp new file mode 100644 index 00000000..10e649d8 --- /dev/null +++ b/src/KingSystem/World/worldManager.cpp @@ -0,0 +1,10 @@ +#include "KingSystem/World/worldManager.h" + +namespace ksys::world { + +SEAD_SINGLETON_DISPOSER_IMPL(Manager) + +// NON_MATCHING: stores in a different order (handwritten assignments?) but should be equivalent +Manager::Manager() = default; + +} // namespace ksys::world diff --git a/src/KingSystem/World/worldManager.h b/src/KingSystem/World/worldManager.h index 45ede28d..1d4f4e84 100644 --- a/src/KingSystem/World/worldManager.h +++ b/src/KingSystem/World/worldManager.h @@ -1,45 +1,43 @@ #pragma once +#include +#include +#include +#include +#include #include +#include #include #include "KingSystem/Resource/resHandle.h" -#include "KingSystem/Utils/ParamIO.h" -#include "agl/Utils/aglAtomicPtrArray.h" -#include "agl/Utils/aglParameter.h" -#include "agl/Utils/aglParameterObj.h" +#include "KingSystem/Utils/Types.h" namespace ksys::world { +// FIXME class Climate {}; -class WorldInfo : public ParamIO { +class WorldInfo : public agl::utl::IParameterIO, public sead::hostio::Node { public: - WorldInfo() : ParamIO("winfo", 0) {} - ~WorldInfo(); - - bool ParamIO_m0() override { return true; } + WorldInfo() : agl::utl::IParameterIO("winfo", 0) {} + u8 _1d8[0x20]; res::Handle mResHandle; - u32 mNumClimates = 0; - Climate* mClimates = nullptr; + sead::Buffer mClimates; }; +KSYS_CHECK_SIZE_NX150(WorldInfo, 0x258); -class DungeonEnv : public ParamIO { +class DungeonEnv : public agl::utl::IParameterIO, public sead::hostio::Node { public: - DungeonEnv() : ParamIO("dgenv", 0) {} - ~DungeonEnv(); - - bool ParamIO_m0() override { return true; } + DungeonEnv() : agl::utl::IParameterIO("dgnenv", 0) {} + u8 _1d8[0x20]; res::Handle mResHandle; - - agl::utl::Parameter mLightLongitude; + agl::utl::Parameter mLightLongitude; agl::utl::Parameter> mDungeonSize; agl::utl::Parameter> mString538; agl::utl::ParameterObj mDungeonEnvObj; - sead::PtrArray mgrs{}; - sead::DirectResource* mInfoRes = nullptr; }; +KSYS_CHECK_SIZE_NX150(DungeonEnv, 0x338); // FIXME: incomplete class Manager : public sead::hostio::Node { @@ -48,41 +46,102 @@ class Manager : public sead::hostio::Node { virtual ~Manager(); public: + enum class CalcType { + _3 = 3, + }; + + enum class StageType { + + }; + + enum class RemainsType { + + }; + + enum class FieldType { + + }; + + enum class ScalingMode { + + }; + bool isRaining(const sead::Vector3f& pos) const; WorldInfo mWorldInfo; DungeonEnv mDungeonEnv; + sead::DirectResource* mInfoRes{}; - agl::utl::AtomicPtrArray mAtomicPtrArray{0, 0}; - u32 _5e0 = 1; - u32 mCalcType = 3; + sead::PtrArray mMgrs; + agl::utl::AtomicPtrArray mAtomicPtrArray; + sead::BitFlag32 _5e0 = 1; + CalcType mCalcType = CalcType::_3; sead::FixedSizeJQ mJobQueue; - f32 mWindPowerIf78C = 5.0; - f32 mTempDirectDayExtra = 100000.0; - f32 mTempDirectNightExtra = 100000.0; - f32 mTempDirectDay = 100000.0; - f32 mTempDirectNight = 100000.0; - s32 _794; - s32 mStageType = 0; - s32 mStageType2 = 0; - u8 mGameSceneInitialised = 0; - sead::Vector3f mPrevPlayerPos{}; - sead::Vector3f mPlayerPos{}; - sead::Vector3f mPrevCameraPos{}; - sead::Vector3f mCameraPos{}; - f32 _770 = 0.0; - s32 _778 = 0; - s32 _78c = 0; - s32 _7ac = 0; - void* _7a4 = nullptr; - void* _79c = nullptr; - f32 mWindPowerAocField = 0.75; - u8 mWorldInfoLoaded = 0; + + sead::Vector3f mCameraPos{0, 0, 0}; + sead::Vector3f mPrevCameraPos{0, 0, 0}; + sead::Vector3f mPlayerPos{0, 0, 0}; + sead::Vector3f mPrevPlayerPos{0, 0, 0}; + + StageType mStageType{}; + StageType mStageType2{}; + + u32 _6c0 = 0; + u32 _6c4 = 30; + u32 _6c8 = 0; + bool _6cc = false; + bool mGameSceneInitialized = false; + + float mFloatsPerClimate[20]; + u32 _720 = 0; + sead::Vector3f mWindDir{0, 0, -1}; + sead::Vector3f mDirectionalLightVecA{0, 1, 0}; + sead::Vector3f mDirectionalLightVecB{0, 1, 0}; + sead::Vector3f _748{0, 0, 0}; + float _754 = 1.0; + float mWindPowerIf7D4 = 1.0; + float mWindPowerIf78C = 5.0; + float mTempDirectDayExtra = 99999.9; + float mTempDirectNightExtra = 99999.9; + float mTempDirectDay = 99999.9; + float mTempDirectNight = 99999.9; + float _770 = 0.0; + float mFocusDist = 100.0; + float _778 = -1.0; + u32 _77c = 9; + u32 mCurrentArea = 0; + u32 mPrevArea = 0; + u32 _788 = 0; + u32 _78c = 0; + u32 _790 = 0; + u32 _794 = 0; + int _798 = -1; + u32 _79c = 0; + u32 _7a0 = 0; + u32 _7a4 = 0; + u32 _7a8 = 0; + u32 _7ac = 0; + u32 _7b0 = 0; + u32 mIgnitedLevel = 0; + u32 _7b8 = 0; + RemainsType mRemainsType{}; + FieldType mFieldType{}; + ScalingMode mScalingMode{}; + u32 _7c8 = 0; + float mWindPowerAocField = 0.75; + bool mWorldInfoLoaded = false; u8 mWeatherType = 0xFF; u8 _7d2 = 0; u8 _7d3 = 1; u8 _7d4 = 0; - u8 mInFinalTrialBossBattleArea = 0; + u8 _7d5 = 0; + u8 _7d6 = 0; + u8 _7d7 = 0; + bool mIsDemo = false; + bool mIsMainField = false; + bool mIsBattleCurseR = false; + bool mInFinalTrialBossBattleArea = false; }; +KSYS_CHECK_SIZE_NX150(Manager, 0x7e0); } // namespace ksys::world