diff --git a/CMakeLists.txt b/CMakeLists.txt index 264f9bd5..12263c60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,10 @@ add_executable(uking src/KingSystem/MessageSystem/mesTransceiver.h + src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp + src/KingSystem/Resource/GeneralParamList/resGParamListObject.h + src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.cpp + src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.h src/KingSystem/Resource/resCurrentResNameMgr.cpp src/KingSystem/Resource/resCurrentResNameMgr.h src/KingSystem/Resource/resEntryFactory.cpp @@ -78,6 +82,8 @@ add_executable(uking src/KingSystem/Resource/resResourceDemo.h src/KingSystem/Resource/resResourceDrop.cpp src/KingSystem/Resource/resResourceDrop.h + src/KingSystem/Resource/resResourceGParamList.cpp + src/KingSystem/Resource/resResourceGParamList.h src/KingSystem/Resource/resResourceLod.cpp src/KingSystem/Resource/resResourceLod.h src/KingSystem/Resource/resResourceRecipe.cpp diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 6584db48..c66ce2c6 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89095,7 +89095,7 @@ 0x0000007101197528,BgparamlistObjectNpc::ctor,1232, 0x00000071011979f8,BgparamlistObjectNpcEquipment::ctor,1960, 0x00000071011981a0,BgparamlistObjectZora::ctor,508, -0x000000710119839c,BgparamlistObjectTraveler::ctor,29996, +0x000000710119839c,BgparamlistObjectTraveler::ctor,29996,_ZN4ksys3res24GParamListObjectTravelerC1Ev 0x000000710119f8c8,BgparamlistObjectPrey::ctor,508, 0x000000710119fac4,BgparamlistObjectEatTarget::ctor,684, 0x000000710119fd70,BgparamlistObjectAnimalUnit::ctor,1380, diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp new file mode 100644 index 00000000..b2685f7e --- /dev/null +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp @@ -0,0 +1 @@ +#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h new file mode 100644 index 00000000..4b2bc689 --- /dev/null +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +/// Base class for GeneralParamList parameter objects. +/// @bug This should have a virtual destructor... +class GParamListObject : public sead::hostio::Node { +public: + virtual const char* getName() const = 0; + +protected: + agl::utl::ParameterObj mObj; +}; +KSYS_CHECK_SIZE_NX150(GParamListObject, 0x38); + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.cpp b/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.cpp new file mode 100644 index 00000000..5d7f98c6 --- /dev/null +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.cpp @@ -0,0 +1,64 @@ +#include "KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.h" +#include "KingSystem/Utils/FixedString.h" + +namespace ksys::res { + +template +KSYS_ALWAYS_INLINE static void +initGParamListTravelerRoutePoints(GParamListObjectTraveler::RoutePoint* point, + agl::utl::ParameterObj* obj) { + if constexpr (I < N) { + point->initParameters_(obj); + initGParamListTravelerRoutePoints(point + 1, obj); + } +} + +GParamListObjectTraveler::GParamListObjectTraveler() { + auto* const obj = &mObj; + + mAppearGameDataName.init("", "AppearGameDataName", "", obj); + mDeleteGameDataName.init("", "DeleteGameDataName", "", obj); + mRouteType.init("", "RouteType", "", obj); + mRideHorseName.init("", "RideHorseName", "", obj); + mIsLeadHorse.init(false, "IsLeadHorse", "", obj); + mHorseGearLevel.init(-1, "HorseGearLevel", "", obj); + + initGParamListTravelerRoutePoints(mRoutePoints.data(), obj); + mRoutePoint29Name.init("", "RoutePoint29Name", "", obj); +} + +KSYS_ALWAYS_INLINE GParamListObjectTraveler::RoutePoints::RoutePoints() { + // Nintendo seems to have duplicated the definitions for each of the 29 route points, + // which is utterly disgusting and error prone. Manually writing out the loop and using + // placement-new is necessary to prevent Clang from emitting a loop. +#pragma clang loop unroll(full) + for (auto& storage : mStorage) + new (&storage) RoutePoint; +} + +KSYS_ALWAYS_INLINE GParamListObjectTraveler::RoutePoint::RoutePoint() = default; + +template +KSYS_ALWAYS_INLINE void +GParamListObjectTraveler::RoutePoint::initParameters_(agl::utl::ParameterObj* obj) { + mName.init("", KSYS_STR(Str("RoutePoint") + Str() + Str("Name")), "", obj); + mForward.initParameters_(obj); + mBackward.initParameters_(obj); +} + +template +KSYS_ALWAYS_INLINE void +GParamListObjectTraveler::RoutePoint::DirectionInfo::initParameters_(agl::utl::ParameterObj* obj) { + static constexpr auto prefix = [] { + using ksys::util::Str; + return Str("RoutePoint") + Str() + Str("to") + Str(); + }(); + + mEntryPoint.init("", KSYS_STR(prefix + Str("EntryPoint")), "", obj); + mWaitFrame.init(0.0, KSYS_STR(prefix + Str("WaitFrame")), "", obj); + mSchedule.init("", KSYS_STR(prefix + Str("Schedule")), "", obj); + mMoveAS.init("", KSYS_STR(prefix + Str("MoveAS")), "", obj); + mWaitAS.init("", KSYS_STR(prefix + Str("WaitAS")), "", obj); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.h b/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.h new file mode 100644 index 00000000..f99af44d --- /dev/null +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListObjectTraveler.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +class GParamListObjectTraveler : public GParamListObject { +public: + struct RoutePoint { + RoutePoint(); + + template + KSYS_VISIBILITY_HIDDEN void initParameters_(agl::utl::ParameterObj* obj); + + struct DirectionInfo { + template + KSYS_VISIBILITY_HIDDEN void initParameters_(agl::utl::ParameterObj* obj); + + agl::utl::Parameter mEntryPoint; + agl::utl::Parameter mWaitFrame; + agl::utl::Parameter mSchedule; + agl::utl::Parameter mMoveAS; + agl::utl::Parameter mWaitAS; + }; + + agl::utl::Parameter mName; + // i to i+1 + DirectionInfo mForward; + // i+1 to i + DirectionInfo mBackward; + }; + static constexpr size_t NumRoutePoints = 29; + + GParamListObjectTraveler(); + const char* getName() const override { return "Traveler"; } + + agl::utl::Parameter mAppearGameDataName; + agl::utl::Parameter mDeleteGameDataName; + agl::utl::Parameter mRouteType; + agl::utl::Parameter mRideHorseName; + agl::utl::Parameter mIsLeadHorse; + agl::utl::Parameter mHorseGearLevel; + + struct RoutePoints { + RoutePoints(); + auto& operator[](s32 i) { return reinterpret_cast(mStorage[i]); } + auto& operator[](s32 i) const { return reinterpret_cast(mStorage[i]); } + auto data() { return reinterpret_cast(&mStorage[0]); } + + private: + std::aligned_storage_t mStorage[NumRoutePoints]; + }; + RoutePoints mRoutePoints; + agl::utl::Parameter mRoutePoint29Name; +}; +KSYS_CHECK_SIZE_NX150(GParamListObjectTraveler, 0x3148); + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceGParamList.cpp b/src/KingSystem/Resource/resResourceGParamList.cpp new file mode 100644 index 00000000..43ea51cd --- /dev/null +++ b/src/KingSystem/Resource/resResourceGParamList.cpp @@ -0,0 +1 @@ +#include "KingSystem/Resource/resResourceGParamList.h" diff --git a/src/KingSystem/Resource/resResourceGParamList.h b/src/KingSystem/Resource/resResourceGParamList.h new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/src/KingSystem/Resource/resResourceGParamList.h @@ -0,0 +1 @@ +#pragma once