diff --git a/data/uking_functions.csv b/data/uking_functions.csv index c2dad4fd..7baa36b7 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -89049,7 +89049,7 @@ 0x0000007101186414,nullsub_4613,4, 0x0000007101186418,nullsub_4614,4,_ZN4ksys3res10GParamList9doCreate_EPhjPN4sead4HeapE 0x000000710118641c,ResourceBgparamlist::doCreate,4,_ZThn632_N4ksys3res10GParamList9doCreate_EPhjPN4sead4HeapE -0x0000007101186420,Bgparamlist::parse,22480,_ZN4ksys3res10GParamList6parse_EPhmPN4sead4HeapE| +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 diff --git a/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h b/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h index 24c060cb..9e7a4b5c 100644 --- a/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h +++ b/src/KingSystem/Resource/GeneralParamList/resGParamListTraits.h @@ -11,6 +11,8 @@ struct GParamListObjTypeTraits; template <> \ struct GParamListObjTypeTraits { \ using type = class GParamListObject##NAME; \ + static inline constexpr auto enum_value = GParamListObjType::NAME; \ + static inline constexpr auto index = static_cast(enum_value); \ }; KSYS_DECLARE_GPARAM_TRAIT_(System) diff --git a/src/KingSystem/Resource/resResourceGParamList.cpp b/src/KingSystem/Resource/resResourceGParamList.cpp index 032814d8..c59b3d0c 100644 --- a/src/KingSystem/Resource/resResourceGParamList.cpp +++ b/src/KingSystem/Resource/resResourceGParamList.cpp @@ -88,25 +88,6 @@ 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()) @@ -116,92 +97,103 @@ bool GParamList::parse_(u8* data, size_t, sead::Heap* heap) { const agl::utl::ResParameterArchive archive{data}; - add(archive.getRootList(), "System", heap, dummy_list); - add(archive.getRootList(), "General", heap, dummy_list); - add(archive.getRootList(), "Enemy", heap, dummy_list); - add(archive.getRootList(), "EnemyLevel", heap, dummy_list); - add(archive.getRootList(), "EnemyRace", heap, dummy_list); - add(archive.getRootList(), "AttackInterval", heap, - dummy_list); - add(archive.getRootList(), "EnemyShown", heap, dummy_list); - add(archive.getRootList(), "BindBone", heap, dummy_list); - add(archive.getRootList(), "Attack", heap, dummy_list); - add(archive.getRootList(), "WeaponCommon", heap, dummy_list); - add(archive.getRootList(), "WeaponThrow", heap, dummy_list); - add(archive.getRootList(), "Sandworm", heap, dummy_list); - add(archive.getRootList(), "SmallSword", heap, dummy_list); - add(archive.getRootList(), "Rod", heap, dummy_list); - add(archive.getRootList(), "LargeSword", heap, dummy_list); - add(archive.getRootList(), "Spear", heap, dummy_list); - add(archive.getRootList(), "Shield", heap, dummy_list); - add(archive.getRootList(), "Bow", heap, dummy_list); - add(archive.getRootList(), "WeaponOption", heap, dummy_list); - add(archive.getRootList(), "MasterSword", heap, dummy_list); - add(archive.getRootList(), "GuardianMiniWeapon", heap, - dummy_list); - add(archive.getRootList(), "Player", heap, dummy_list); - add(archive.getRootList(), "Camera", heap, dummy_list); - add(archive.getRootList(), "Grab", heap, dummy_list); - add(archive.getRootList(), "Armor", heap, dummy_list); - add(archive.getRootList(), "ArmorEffect", heap, dummy_list); - add(archive.getRootList(), "ArmorHead", heap, dummy_list); - add(archive.getRootList(), "ArmorUpper", heap, dummy_list); - add(archive.getRootList(), "ShiekerStone", heap, dummy_list); - add(archive.getRootList(), "SeriesArmor", heap, dummy_list); - add(archive.getRootList(), "Liftable", heap, dummy_list); - add(archive.getRootList(), "Item", heap, dummy_list); - add(archive.getRootList(), "Rupee", heap, dummy_list); - add(archive.getRootList(), "Arrow", heap, dummy_list); - add(archive.getRootList(), "Bullet", heap, dummy_list); - add(archive.getRootList(), "CureItem", heap, dummy_list); - add(archive.getRootList(), "CookSpice", heap, dummy_list); - add(archive.getRootList(), "LumberjackTree", heap, - dummy_list); - add(archive.getRootList(), "Npc", heap, dummy_list); - add(archive.getRootList(), "NpcEquipment", heap, dummy_list); - add(archive.getRootList(), "Zora", heap, dummy_list); - add(archive.getRootList(), "Traveler", heap, dummy_list); - add(archive.getRootList(), "Prey", heap, dummy_list); - add(archive.getRootList(), "AnimalFollowOffset", heap, - dummy_list); - add(archive.getRootList(), "ExtendedEntity", heap, - dummy_list); - add(archive.getRootList(), "BindActor", heap, dummy_list); - add(archive.getRootList(), "EatTarget", heap, dummy_list); - add(archive.getRootList(), "AnimalUnit", heap, dummy_list); - add(archive.getRootList(), "Insect", heap, dummy_list); - add(archive.getRootList(), "Fish", heap, dummy_list); - add(archive.getRootList(), "Rope", heap, dummy_list); - add(archive.getRootList(), "Horse", heap, dummy_list); - add(archive.getRootList(), "HorseUnit", heap, dummy_list); - add(archive.getRootList(), "HorseObject", heap, dummy_list); - add(archive.getRootList(), "HorseRider", heap, dummy_list); - add(archive.getRootList(), "HorseCreator", heap, dummy_list); - add(archive.getRootList(), "GiantArmorSlot", heap, - dummy_list); - add(archive.getRootList(), "GiantArmor", heap, dummy_list); - add(archive.getRootList(), "Guardian", heap, dummy_list); - add(archive.getRootList(), "MonsterShop", heap, dummy_list); - add(archive.getRootList(), "Swarm", heap, dummy_list); - add(archive.getRootList(), "GelEnemy", heap, dummy_list); - add(archive.getRootList(), "Nest", heap, dummy_list); - add(archive.getRootList(), "Wizzrobe", heap, dummy_list); - add(archive.getRootList(), "StalEnemy", heap, dummy_list); - add(archive.getRootList(), "GuardianMini", heap, dummy_list); - add(archive.getRootList(), "ClothReaction", heap, dummy_list); - add(archive.getRootList(), "Global", heap, dummy_list); - add(archive.getRootList(), "Beam", heap, dummy_list); - add(archive.getRootList(), "AutoGen", heap, dummy_list); - add(archive.getRootList(), "ChemicalType", heap, dummy_list); - add(archive.getRootList(), "Golem", heap, dummy_list); - add(archive.getRootList(), "HorseTargetedInfo", heap, - dummy_list); - add(archive.getRootList(), "WolfLink", heap, dummy_list); - add(archive.getRootList(), "Event", heap, dummy_list); - add(archive.getRootList(), "GolemIK", heap, dummy_list); - add(archive.getRootList(), "PictureBook", heap, dummy_list); - add(archive.getRootList(), "AirWall", heap, dummy_list); - add(archive.getRootList(), "Motorcycle", heap, dummy_list); +#define KSYS_GPARAM_ADD_(NAME) \ + do { \ + using Traits = GParamListObjTypeTraits; \ + const auto pobj = agl::utl::getResParameterObj(archive.getRootList(), #NAME); \ + if (pobj.ptr()) { \ + auto* obj = new (heap) Traits::type; \ + if (obj) \ + addObj(&obj->getObj(), obj->getName()); \ + \ + mObjects[Traits::index] = obj; \ + \ + } else { \ + mObjects[Traits::index] = dummy_list ? dummy_list->mObjects[Traits::index] : nullptr; \ + } \ + } while (0) + + KSYS_GPARAM_ADD_(System); + KSYS_GPARAM_ADD_(General); + KSYS_GPARAM_ADD_(Enemy); + KSYS_GPARAM_ADD_(EnemyLevel); + KSYS_GPARAM_ADD_(EnemyRace); + KSYS_GPARAM_ADD_(AttackInterval); + KSYS_GPARAM_ADD_(EnemyShown); + KSYS_GPARAM_ADD_(BindBone); + KSYS_GPARAM_ADD_(Attack); + KSYS_GPARAM_ADD_(WeaponCommon); + KSYS_GPARAM_ADD_(WeaponThrow); + KSYS_GPARAM_ADD_(Sandworm); + KSYS_GPARAM_ADD_(SmallSword); + KSYS_GPARAM_ADD_(Rod); + KSYS_GPARAM_ADD_(LargeSword); + KSYS_GPARAM_ADD_(Spear); + KSYS_GPARAM_ADD_(Shield); + KSYS_GPARAM_ADD_(Bow); + KSYS_GPARAM_ADD_(WeaponOption); + KSYS_GPARAM_ADD_(MasterSword); + KSYS_GPARAM_ADD_(GuardianMiniWeapon); + KSYS_GPARAM_ADD_(Player); + KSYS_GPARAM_ADD_(Camera); + KSYS_GPARAM_ADD_(Grab); + KSYS_GPARAM_ADD_(Armor); + KSYS_GPARAM_ADD_(ArmorEffect); + KSYS_GPARAM_ADD_(ArmorHead); + KSYS_GPARAM_ADD_(ArmorUpper); + KSYS_GPARAM_ADD_(ShiekerStone); + KSYS_GPARAM_ADD_(SeriesArmor); + KSYS_GPARAM_ADD_(Liftable); + KSYS_GPARAM_ADD_(Item); + KSYS_GPARAM_ADD_(Rupee); + KSYS_GPARAM_ADD_(Arrow); + KSYS_GPARAM_ADD_(Bullet); + KSYS_GPARAM_ADD_(CureItem); + KSYS_GPARAM_ADD_(CookSpice); + KSYS_GPARAM_ADD_(LumberjackTree); + KSYS_GPARAM_ADD_(Npc); + KSYS_GPARAM_ADD_(NpcEquipment); + KSYS_GPARAM_ADD_(Zora); + KSYS_GPARAM_ADD_(Traveler); + KSYS_GPARAM_ADD_(Prey); + KSYS_GPARAM_ADD_(AnimalFollowOffset); + KSYS_GPARAM_ADD_(ExtendedEntity); + KSYS_GPARAM_ADD_(BindActor); + KSYS_GPARAM_ADD_(EatTarget); + KSYS_GPARAM_ADD_(AnimalUnit); + KSYS_GPARAM_ADD_(Insect); + KSYS_GPARAM_ADD_(Fish); + KSYS_GPARAM_ADD_(Rope); + KSYS_GPARAM_ADD_(Horse); + KSYS_GPARAM_ADD_(HorseUnit); + KSYS_GPARAM_ADD_(HorseObject); + KSYS_GPARAM_ADD_(HorseRider); + KSYS_GPARAM_ADD_(HorseCreator); + KSYS_GPARAM_ADD_(GiantArmorSlot); + KSYS_GPARAM_ADD_(GiantArmor); + KSYS_GPARAM_ADD_(Guardian); + KSYS_GPARAM_ADD_(MonsterShop); + KSYS_GPARAM_ADD_(Swarm); + KSYS_GPARAM_ADD_(GelEnemy); + KSYS_GPARAM_ADD_(Nest); + KSYS_GPARAM_ADD_(Wizzrobe); + KSYS_GPARAM_ADD_(StalEnemy); + KSYS_GPARAM_ADD_(GuardianMini); + KSYS_GPARAM_ADD_(ClothReaction); + KSYS_GPARAM_ADD_(Global); + KSYS_GPARAM_ADD_(Beam); + KSYS_GPARAM_ADD_(AutoGen); + KSYS_GPARAM_ADD_(ChemicalType); + KSYS_GPARAM_ADD_(Golem); + KSYS_GPARAM_ADD_(HorseTargetedInfo); + KSYS_GPARAM_ADD_(WolfLink); + KSYS_GPARAM_ADD_(Event); + KSYS_GPARAM_ADD_(GolemIK); + KSYS_GPARAM_ADD_(PictureBook); + KSYS_GPARAM_ADD_(AirWall); + KSYS_GPARAM_ADD_(Motorcycle); + +#undef KSYS_GPARAM_ADD_ if (data) applyResParameterArchive(archive); diff --git a/src/KingSystem/Resource/resResourceGParamList.h b/src/KingSystem/Resource/resResourceGParamList.h index 56b5fba2..139f63bd 100644 --- a/src/KingSystem/Resource/resResourceGParamList.h +++ b/src/KingSystem/Resource/resResourceGParamList.h @@ -23,10 +23,6 @@ protected: 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);