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
8 changed files with 262 additions and 36 deletions
@@ -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
@@ -1 +0,0 @@
#include "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;
};
@@ -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
@@ -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
@@ -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