ksys/res: Start implementing GParamList

Incomplete because many of the sub-objects have their constructors
inlined into the GParamList parse function...
This commit is contained in:
Léo Lam 2020-09-19 18:55:22 +02:00
parent a97f61f02a
commit 62880a0b1d
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
8 changed files with 262 additions and 36 deletions

View File

@ -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

View File

@ -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

Can't render this file because it is too large.

View File

@ -0,0 +1,24 @@
#pragma once
#include <heap/seadDisposer.h>
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

View File

@ -1 +0,0 @@
#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h"

View File

@ -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;
};

View File

@ -0,0 +1,98 @@
#pragma once
#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h"
namespace ksys::res {
template <GParamListObjType>
struct GParamListObjTypeTraits;
#define KSYS_DECLARE_GPARAM_TRAIT_(NAME) \
template <> \
struct GParamListObjTypeTraits<GParamListObjType::NAME> { \
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

View File

@ -1 +1,57 @@
#include "KingSystem/Resource/resResourceGParamList.h"
#include <KingSystem/ActorSystem/actActorParamMgr.h>
#include <agl/Utils/aglParameter.h>
#include <prim/seadRuntimeTypeInfo.h>
#include "KingSystem/Resource/GeneralParamList/resGParamListObject.h"
#include "KingSystem/Resource/GeneralParamList/resGParamListTraits.h"
namespace ksys::res {
void GParamList::doCreate_(u8*, u32, sead::Heap*) {}
template <GParamListObjType Type>
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>::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<DummyGParamList>(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

View File

@ -1 +1,46 @@
#pragma once
#include <container/seadBuffer.h>
#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 <GParamListObjType Type>
void add(const agl::utl::ResParameterList& list, const sead::SafeString& name, sead::Heap* heap,
GParamList* dummy_list);
sead::Buffer<GParamListObject*> 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