diff --git a/CMakeLists.txt b/CMakeLists.txt index 12263c60..4866a424 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ add_executable(uking src/KingSystem/ActorSystem/actActorFactory.h src/KingSystem/ActorSystem/actActorLinkConstDataAccess.cpp src/KingSystem/ActorSystem/actActorLinkConstDataAccess.h + src/KingSystem/ActorSystem/actActorParamMgr.h src/KingSystem/ActorSystem/actAiAction.cpp src/KingSystem/ActorSystem/actAiAction.h src/KingSystem/ActorSystem/actAiClass.cpp @@ -62,10 +63,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/GeneralParamList/resGParamListTraits.h src/KingSystem/Resource/resCurrentResNameMgr.cpp src/KingSystem/Resource/resCurrentResNameMgr.h src/KingSystem/Resource/resEntryFactory.cpp diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c66ce2c6..ed3c0bf2 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89047,17 +89047,17 @@ 0x0000007101186094,ActorParam::Load::loadPriority,472, 0x000000710118626c,ActorParam::Load::checkClassAndPriority,424, 0x0000007101186414,nullsub_4613,4, -0x0000007101186418,nullsub_4614,4, -0x000000710118641c,ResourceBgparamlist::doCreate,4, -0x0000007101186420,Bgparamlist::parse,22480, -0x000000710118bbf0,ResourceBgparamlist::parse,28, -0x000000710118bc0c,nullsub_4616,4, -0x000000710118bc10,nullsub_4617,4, +0x0000007101186418,nullsub_4614,4,_ZN4ksys3res10GParamList9doCreate_EPhjPN4sead4HeapE +0x000000710118641c,ResourceBgparamlist::doCreate,4,_ZThn632_N4ksys3res10GParamList9doCreate_EPhjPN4sead4HeapE +0x0000007101186420,Bgparamlist::parse,22480,_ZN4ksys3res10GParamList6parse_EPhmPN4sead4HeapE| +0x000000710118bbf0,ResourceBgparamlist::parse,28,_ZThn632_N4ksys3res10GParamList6parse_EPhmPN4sead4HeapE +0x000000710118bc0c,nullsub_4616,4,_ZN4ksys3res10GParamList9finalize_Ev +0x000000710118bc10,nullsub_4617,4,_ZThn632_N4ksys3res10GParamList9finalize_Ev 0x000000710118bc14,return_D318,8, -0x000000710118bc1c,nullsub_4618,4, -0x000000710118bc20,nullsub_4619,4, -0x000000710118bc24,sub_710118BC24,24, -0x000000710118bc3c,sub_710118BC3C,28, +0x000000710118bc1c,nullsub_4618,4,_ZN4ksys3res15DummyGParamList9doCreate_EPhjPN4sead4HeapE +0x000000710118bc20,nullsub_4619,4,_ZThn632_N4ksys3res15DummyGParamList9doCreate_EPhjPN4sead4HeapE +0x000000710118bc24,sub_710118BC24,24,_ZN4ksys3res15DummyGParamList6parse_EPhmPN4sead4HeapE +0x000000710118bc3c,sub_710118BC3C,28,_ZThn632_N4ksys3res15DummyGParamList6parse_EPhmPN4sead4HeapE 0x000000710118bc58,BgparamlistObjectGeneral::ctor,764, 0x000000710118bf54,BgparamlistObjectEnemy::ctor,1440, 0x000000710118c4f4,BgparamlistObjectEnemyLevel::ctor,936, @@ -89123,28 +89123,28 @@ 0x00000071011a6410,BgparamlistObjectGolemIK::ctor,1792, 0x00000071011a6b10,BgparamlistObjectPictureBook::ctor,344, 0x00000071011a6c68,BgparamlistObjectMotorcycle::ctor,2736, -0x00000071011a7718,sub_71011A7718,52, -0x00000071011a774c,sub_71011A774C,40, -0x00000071011a7774,sub_71011A7774,8, -0x00000071011a777c,sub_71011A777C,8, -0x00000071011a7784,sub_71011A7784,92, -0x00000071011a77e0,sub_71011A77E0,8, -0x00000071011a77e8,ResourceBgparamlist::rtti1,8, -0x00000071011a77f0,ResourceBgparamlist::rtti2,92, -0x00000071011a784c,ResourceBgparamlist::dtor,48, -0x00000071011a787c,ResourceBgparamlist::dtorDelete,36, -0x00000071011a78a0,ResourceBgparamlist::needsParse,8, -0x00000071011a78a8,sub_71011A78A8,52, -0x00000071011a78dc,sub_71011A78DC,40, -0x00000071011a7904,sub_71011A7904,40, -0x00000071011a792c,sub_71011A792C,132, -0x00000071011a79b0,sub_71011A79B0,92, -0x00000071011a7a0c,sub_71011A7A0C,132, -0x00000071011a7a90,sub_71011A7A90,92, -0x00000071011a7aec,sub_71011A7AEC,48, -0x00000071011a7b1c,sub_71011A7B1C,36, -0x00000071011a7b40,sub_71011A7B40,52, -0x00000071011a7b74,sub_71011A7B74,40, +0x00000071011a7718,sub_71011A7718,52,_ZN4ksys3res10GParamListD2Ev +0x00000071011a774c,sub_71011A774C,40,_ZN4ksys3res10GParamListD0Ev +0x00000071011a7774,sub_71011A7774,8,_ZN4ksys3res10GParamList10ParamIO_m0Ev +0x00000071011a777c,sub_71011A777C,8,_ZNK4ksys3res10GParamList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071011a7784,sub_71011A7784,92,_ZNK4ksys3res10GParamList18getRuntimeTypeInfoEv +0x00000071011a77e0,sub_71011A77E0,8,_ZNK4ksys3res10GParamList10needsParseEv +0x00000071011a77e8,ResourceBgparamlist::rtti1,8,_ZThn632_NK4ksys3res10GParamList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071011a77f0,ResourceBgparamlist::rtti2,92,_ZThn632_NK4ksys3res10GParamList18getRuntimeTypeInfoEv +0x00000071011a784c,ResourceBgparamlist::dtor,48,_ZThn632_N4ksys3res10GParamListD1Ev +0x00000071011a787c,ResourceBgparamlist::dtorDelete,36,_ZThn632_N4ksys3res10GParamListD0Ev +0x00000071011a78a0,ResourceBgparamlist::needsParse,8,_ZThn632_NK4ksys3res10GParamList10needsParseEv +0x00000071011a78a8,sub_71011A78A8,52,_ZThn664_N4ksys3res10GParamListD1Ev +0x00000071011a78dc,sub_71011A78DC,40,_ZThn664_N4ksys3res10GParamListD0Ev +0x00000071011a7904,sub_71011A7904,40,_ZN4ksys3res15DummyGParamListD0Ev +0x00000071011a792c,sub_71011A792C,132,_ZNK4ksys3res15DummyGParamList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071011a79b0,sub_71011A79B0,92,_ZNK4ksys3res15DummyGParamList18getRuntimeTypeInfoEv +0x00000071011a7a0c,sub_71011A7A0C,132,_ZThn632_NK4ksys3res15DummyGParamList27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071011a7a90,sub_71011A7A90,92,_ZThn632_NK4ksys3res15DummyGParamList18getRuntimeTypeInfoEv +0x00000071011a7aec,sub_71011A7AEC,48,_ZThn632_N4ksys3res15DummyGParamListD1Ev +0x00000071011a7b1c,sub_71011A7B1C,36,_ZThn632_N4ksys3res15DummyGParamListD0Ev +0x00000071011a7b40,sub_71011A7B40,52,_ZThn664_N4ksys3res15DummyGParamListD1Ev +0x00000071011a7b74,sub_71011A7B74,40,_ZThn664_N4ksys3res15DummyGParamListD0Ev 0x00000071011a7b9c,sub_71011A7B9C,12, 0x00000071011a7ba8,sub_71011A7BA8,12, 0x00000071011a7bb4,sub_71011A7BB4,12, @@ -89186,7 +89186,7 @@ 0x00000071011a7d64,sub_71011A7D64,12, 0x00000071011a7d70,sub_71011A7D70,12, 0x00000071011a7d7c,sub_71011A7D7C,12, -0x00000071011a7d88,sub_71011A7D88,12, +0x00000071011a7d88,sub_71011A7D88,12,_ZNK4ksys3res24GParamListObjectTraveler7getNameEv 0x00000071011a7d94,sub_71011A7D94,12, 0x00000071011a7da0,sub_71011A7DA0,12, 0x00000071011a7dac,sub_71011A7DAC,12, @@ -89224,7 +89224,7 @@ 0x00000071011a7f2c,sub_71011A7F2C,12, 0x00000071011a7f38,sub_71011A7F38,12, 0x00000071011a7f44,sub_71011A7F44,12, -0x00000071011a80c4,sub_71011A80C4,140, +0x00000071011a80c4,sub_71011A80C4,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys3res10GParamListEE9isDerivedEPKNS0_9InterfaceE 0x00000071011a8150,sub_71011A8150,108,_ZN4ksys3res9AIProgramD1Ev 0x00000071011a81bc,ResourceAiprog::m2,104,_ZThn632_N4ksys3res9AIProgramD1Ev 0x00000071011a8224,sub_71011A8224,112,_ZThn664_N4ksys3res9AIProgramD1Ev diff --git a/src/KingSystem/ActorSystem/actActorParamMgr.h b/src/KingSystem/ActorSystem/actActorParamMgr.h new file mode 100644 index 00000000..0ae5a850 --- /dev/null +++ b/src/KingSystem/ActorSystem/actActorParamMgr.h @@ -0,0 +1,24 @@ +#pragma once + +#include + +namespace ksys { + +namespace res { +class GParamList; +} + +namespace act { + +// FIXME: incomplete +class ActorParamMgr { + SEAD_SINGLETON_DISPOSER(ActorParamMgr) +public: + void init(sead::Heap* heap, sead::Heap* debug_heap); + + res::GParamList* getDummyGParamList() const; +}; + +} // namespace act + +} // namespace ksys diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp deleted file mode 100644 index b2685f7e..00000000 --- a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h index 69a3e1d3..fa9870e5 100644 --- a/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListObject.h @@ -87,6 +87,7 @@ enum class GParamListObjType { AirWall = 0x4D, Motorcycle = 0x4E, }; +inline constexpr size_t NumGParamListObjTypes = 1 + 0x4E; /// Base class for GeneralParamList parameter objects. /// @bug This should have a virtual destructor... @@ -94,6 +95,8 @@ class GParamListObject : public sead::hostio::Node { public: virtual const char* getName() const = 0; + agl::utl::ParameterObj& getObj() { return mObj; } + protected: agl::utl::ParameterObj mObj; }; diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h b/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h new file mode 100644 index 00000000..24c060cb --- /dev/null +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h @@ -0,0 +1,98 @@ +#pragma once + +#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" + +namespace ksys::res { + +template +struct GParamListObjTypeTraits; + +#define KSYS_DECLARE_GPARAM_TRAIT_(NAME) \ + template <> \ + struct GParamListObjTypeTraits { \ + using type = class GParamListObject##NAME; \ + }; + +KSYS_DECLARE_GPARAM_TRAIT_(System) +KSYS_DECLARE_GPARAM_TRAIT_(General) +KSYS_DECLARE_GPARAM_TRAIT_(Enemy) +KSYS_DECLARE_GPARAM_TRAIT_(EnemyLevel) +KSYS_DECLARE_GPARAM_TRAIT_(EnemyRace) +KSYS_DECLARE_GPARAM_TRAIT_(AttackInterval) +KSYS_DECLARE_GPARAM_TRAIT_(EnemyShown) +KSYS_DECLARE_GPARAM_TRAIT_(BindBone) +KSYS_DECLARE_GPARAM_TRAIT_(Attack) +KSYS_DECLARE_GPARAM_TRAIT_(WeaponCommon) +KSYS_DECLARE_GPARAM_TRAIT_(WeaponThrow) +KSYS_DECLARE_GPARAM_TRAIT_(Sandworm) +KSYS_DECLARE_GPARAM_TRAIT_(SmallSword) +KSYS_DECLARE_GPARAM_TRAIT_(Rod) +KSYS_DECLARE_GPARAM_TRAIT_(LargeSword) +KSYS_DECLARE_GPARAM_TRAIT_(Spear) +KSYS_DECLARE_GPARAM_TRAIT_(Shield) +KSYS_DECLARE_GPARAM_TRAIT_(Bow) +KSYS_DECLARE_GPARAM_TRAIT_(WeaponOption) +KSYS_DECLARE_GPARAM_TRAIT_(MasterSword) +KSYS_DECLARE_GPARAM_TRAIT_(GuardianMiniWeapon) +KSYS_DECLARE_GPARAM_TRAIT_(Player) +KSYS_DECLARE_GPARAM_TRAIT_(Camera) +KSYS_DECLARE_GPARAM_TRAIT_(Grab) +KSYS_DECLARE_GPARAM_TRAIT_(Armor) +KSYS_DECLARE_GPARAM_TRAIT_(ArmorEffect) +KSYS_DECLARE_GPARAM_TRAIT_(ArmorHead) +KSYS_DECLARE_GPARAM_TRAIT_(ArmorUpper) +KSYS_DECLARE_GPARAM_TRAIT_(ShiekerStone) +KSYS_DECLARE_GPARAM_TRAIT_(SeriesArmor) +KSYS_DECLARE_GPARAM_TRAIT_(Liftable) +KSYS_DECLARE_GPARAM_TRAIT_(Item) +KSYS_DECLARE_GPARAM_TRAIT_(Rupee) +KSYS_DECLARE_GPARAM_TRAIT_(Arrow) +KSYS_DECLARE_GPARAM_TRAIT_(Bullet) +KSYS_DECLARE_GPARAM_TRAIT_(CureItem) +KSYS_DECLARE_GPARAM_TRAIT_(CookSpice) +KSYS_DECLARE_GPARAM_TRAIT_(LumberjackTree) +KSYS_DECLARE_GPARAM_TRAIT_(Npc) +KSYS_DECLARE_GPARAM_TRAIT_(NpcEquipment) +KSYS_DECLARE_GPARAM_TRAIT_(Zora) +KSYS_DECLARE_GPARAM_TRAIT_(Traveler) +KSYS_DECLARE_GPARAM_TRAIT_(Prey) +KSYS_DECLARE_GPARAM_TRAIT_(AnimalFollowOffset) +KSYS_DECLARE_GPARAM_TRAIT_(ExtendedEntity) +KSYS_DECLARE_GPARAM_TRAIT_(BindActor) +KSYS_DECLARE_GPARAM_TRAIT_(EatTarget) +KSYS_DECLARE_GPARAM_TRAIT_(AnimalUnit) +KSYS_DECLARE_GPARAM_TRAIT_(Insect) +KSYS_DECLARE_GPARAM_TRAIT_(Fish) +KSYS_DECLARE_GPARAM_TRAIT_(Rope) +KSYS_DECLARE_GPARAM_TRAIT_(Horse) +KSYS_DECLARE_GPARAM_TRAIT_(HorseUnit) +KSYS_DECLARE_GPARAM_TRAIT_(HorseObject) +KSYS_DECLARE_GPARAM_TRAIT_(HorseRider) +KSYS_DECLARE_GPARAM_TRAIT_(HorseCreator) +KSYS_DECLARE_GPARAM_TRAIT_(GiantArmorSlot) +KSYS_DECLARE_GPARAM_TRAIT_(GiantArmor) +KSYS_DECLARE_GPARAM_TRAIT_(Guardian) +KSYS_DECLARE_GPARAM_TRAIT_(MonsterShop) +KSYS_DECLARE_GPARAM_TRAIT_(Swarm) +KSYS_DECLARE_GPARAM_TRAIT_(GelEnemy) +KSYS_DECLARE_GPARAM_TRAIT_(Nest) +KSYS_DECLARE_GPARAM_TRAIT_(Wizzrobe) +KSYS_DECLARE_GPARAM_TRAIT_(StalEnemy) +KSYS_DECLARE_GPARAM_TRAIT_(GuardianMini) +KSYS_DECLARE_GPARAM_TRAIT_(ClothReaction) +KSYS_DECLARE_GPARAM_TRAIT_(Global) +KSYS_DECLARE_GPARAM_TRAIT_(Beam) +KSYS_DECLARE_GPARAM_TRAIT_(AutoGen) +KSYS_DECLARE_GPARAM_TRAIT_(ChemicalType) +KSYS_DECLARE_GPARAM_TRAIT_(Golem) +KSYS_DECLARE_GPARAM_TRAIT_(HorseTargetedInfo) +KSYS_DECLARE_GPARAM_TRAIT_(WolfLink) +KSYS_DECLARE_GPARAM_TRAIT_(Event) +KSYS_DECLARE_GPARAM_TRAIT_(GolemIK) +KSYS_DECLARE_GPARAM_TRAIT_(PictureBook) +KSYS_DECLARE_GPARAM_TRAIT_(AirWall) +KSYS_DECLARE_GPARAM_TRAIT_(Motorcycle) + +#undef KSYS_DECLARE_GPARAM_TRAIT_ + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceGParamList.cpp b/src/KingSystem/Resource/resResourceGParamList.cpp index 43ea51cd..42d1fa36 100644 --- a/src/KingSystem/Resource/resResourceGParamList.cpp +++ b/src/KingSystem/Resource/resResourceGParamList.cpp @@ -1 +1,57 @@ #include "KingSystem/Resource/resResourceGParamList.h" +#include +#include +#include +#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" +#include "KingSystem/Resource/GeneralParamList/resGParamListTraits.h" + +namespace ksys::res { + +void GParamList::doCreate_(u8*, u32, sead::Heap*) {} + +template +KSYS_ALWAYS_INLINE void GParamList::add(const agl::utl::ResParameterList& list, + const sead::SafeString& name, sead::Heap* heap, + GParamList* dummy_list) { + const auto pobj = agl::utl::getResParameterObj(list, name); + if (pobj.ptr()) { + using T = typename GParamListObjTypeTraits::type; + + auto* obj = new (heap) T; + if (obj) + addObj(&obj->getObj(), obj->getName()); + + mObjects[s32(Type)] = obj; + + } else { + mObjects[s32(Type)] = dummy_list ? dummy_list->mObjects[s32(Type)] : nullptr; + } +} + +bool GParamList::parse_(u8* data, size_t, sead::Heap* heap) { + GParamList* dummy_list = nullptr; + if (!sead::IsDerivedFrom(this) && act::ActorParamMgr::instance()) + dummy_list = act::ActorParamMgr::instance()->getDummyGParamList(); + + mObjects.allocBufferAssert(NumGParamListObjTypes, heap); + + const agl::utl::ResParameterArchive archive{data}; + + // TODO: System, etc. + + if (data) + applyResParameterArchive(archive); + + return true; +} + +void GParamList::finalize_() {} + +void DummyGParamList::doCreate_(u8*, u32, sead::Heap*) {} + +bool DummyGParamList::parse_(u8* data, size_t size, sead::Heap* heap) { + GParamList::parse_(data, size, heap); + return true; +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceGParamList.h b/src/KingSystem/Resource/resResourceGParamList.h index 6f70f09b..56b5fba2 100644 --- a/src/KingSystem/Resource/resResourceGParamList.h +++ b/src/KingSystem/Resource/resResourceGParamList.h @@ -1 +1,46 @@ #pragma once + +#include +#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h" +#include "KingSystem/Resource/resResource.h" +#include "KingSystem/Utils/ParamIO.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +class GParamList : public ParamIO, public Resource { + SEAD_RTTI_OVERRIDE(GParamList, Resource) +public: + GParamList() : ParamIO("bgparamlist", 0) {} + ~GParamList() override = default; + + bool ParamIO_m0() override { return false; } + void doCreate_(u8* buffer, u32 bufferSize, sead::Heap* heap) override; + bool needsParse() const override { return true; } + +protected: + bool parse_(u8* data, size_t size, sead::Heap* heap) override; + void finalize_() override; + +private: + template + void add(const agl::utl::ResParameterList& list, const sead::SafeString& name, sead::Heap* heap, + GParamList* dummy_list); + + sead::Buffer mObjects; +}; +KSYS_CHECK_SIZE_NX150(GParamList, 0x2c0); + +class DummyGParamList : public GParamList { + SEAD_RTTI_OVERRIDE(DummyGParamList, GParamList) +public: + using GParamList::GParamList; + ~DummyGParamList() override = default; + + void doCreate_(u8* buffer, u32 bufferSize, sead::Heap* heap) override; + +private: + bool parse_(u8* data, size_t size, sead::Heap* heap) override; +}; + +} // namespace ksys::res