ksys/res: Add ActorLink

This commit is contained in:
Léo Lam 2020-09-05 22:10:51 +02:00
parent 02051dce6b
commit 3d3bcaee1a
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
8 changed files with 260 additions and 24 deletions

View File

@ -47,6 +47,7 @@ add_executable(uking
src/KingSystem/ActorSystem/actBaseProcMgr.h
src/KingSystem/ActorSystem/actBaseProcUnit.cpp
src/KingSystem/ActorSystem/actBaseProcUnit.h
src/KingSystem/ActorSystem/actTag.h
src/KingSystem/MessageSystem/mesTransceiver.h
@ -54,6 +55,8 @@ add_executable(uking
src/KingSystem/Resource/resEntryFactory.h
src/KingSystem/Resource/resResource.cpp
src/KingSystem/Resource/resResource.h
src/KingSystem/Resource/resResourceActorLink.cpp
src/KingSystem/Resource/resResourceActorLink.h
src/KingSystem/Resource/resResourceDemo.cpp
src/KingSystem/Resource/resResourceDemo.h
src/KingSystem/Resource/resResourceLod.cpp
@ -67,6 +70,7 @@ add_executable(uking
src/KingSystem/Utils/ByamlLocal.h
src/KingSystem/Utils/ByamlUtil.cpp
src/KingSystem/Utils/Debug.h
src/KingSystem/Utils/HashUtil.h
src/KingSystem/Utils/HeapUtil.cpp
src/KingSystem/Utils/HeapUtil.h
src/KingSystem/Utils/ParamIO.h

View File

@ -88704,28 +88704,28 @@
0x00000071011661fc,sub_71011661FC,80,
0x000000710116624c,sub_710116624C,76,
0x0000007101166298,sub_7101166298,84,
0x00000071011662ec,Bxml::ctor,2168,
0x0000007101166b64,sub_7101166B64,556,
0x0000007101166d90,nullsub_4611,4,
0x0000007101166d94,nullsub_4612,4,
0x0000007101166d98,Bxml::parse,428,
0x0000007101166f44,ResourceBxml::parse,28,
0x0000007101166f60,sub_7101166F60,124,
0x0000007101166fdc,sub_7101166FDC,124,
0x0000007101167058,Bxml::hasTagByName,164,
0x00000071011670fc,Bxml::hasTag,108,
0x0000007101167168,sub_7101167168,236,
0x0000007101167254,sub_7101167254,224,
0x0000007101167334,sub_7101167334,8,
0x000000710116733c,sub_710116733C,92,
0x0000007101167398,sub_7101167398,8,
0x00000071011673a0,sub_71011673A0,8,
0x00000071011673a8,sub_71011673A8,92,
0x0000007101167404,sub_7101167404,232,
0x00000071011674ec,sub_71011674EC,220,
0x00000071011675c8,sub_71011675C8,8,
0x00000071011675d0,sub_71011675D0,240,
0x00000071011676c0,sub_71011676C0,228,
0x00000071011662ec,Bxml::ctor,2168,_ZN4ksys3res9ActorLinkC1Ev
0x0000007101166b64,sub_7101166B64,556,_ZN4ksys3res9ActorLink5UsersC2Ev
0x0000007101166d90,nullsub_4611,4,_ZN4ksys3res9ActorLink9doCreate_EPhjPN4sead4HeapE
0x0000007101166d94,nullsub_4612,4,_ZThn632_N4ksys3res9ActorLink9doCreate_EPhjPN4sead4HeapE
0x0000007101166d98,Bxml::parse,428,_ZN4ksys3res9ActorLink6parse_EPhmPN4sead4HeapE?
0x0000007101166f44,ResourceBxml::parse,28,_ZThn632_N4ksys3res9ActorLink6parse_EPhmPN4sead4HeapE
0x0000007101166f60,sub_7101166F60,124,_ZN4ksys3res9ActorLink3m5_Ev
0x0000007101166fdc,sub_7101166FDC,124,_ZThn632_N4ksys3res9ActorLink3m5_Ev
0x0000007101167058,Bxml::hasTagByName,164,_ZNK4ksys3res9ActorLink6hasTagEPKc?
0x00000071011670fc,Bxml::hasTag,108,_ZNK4ksys3res9ActorLink6hasTagENS_3act3TagE
0x0000007101167168,sub_7101167168,236,_ZN4ksys3res9ActorLinkD2Ev
0x0000007101167254,sub_7101167254,224,_ZN4ksys3res9ActorLinkD0Ev
0x0000007101167334,sub_7101167334,8,_ZNK4ksys3res9ActorLink27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE?
0x000000710116733c,sub_710116733C,92,_ZNK4ksys3res9ActorLink18getRuntimeTypeInfoEv
0x0000007101167398,sub_7101167398,8,_ZNK4ksys3res9ActorLink10needsParseEv
0x00000071011673a0,sub_71011673A0,8,_ZThn632_NK4ksys3res9ActorLink27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE?
0x00000071011673a8,sub_71011673A8,92,_ZThn632_NK4ksys3res9ActorLink18getRuntimeTypeInfoEv
0x0000007101167404,sub_7101167404,232,_ZThn632_N4ksys3res9ActorLinkD1Ev
0x00000071011674ec,sub_71011674EC,220,_ZThn632_N4ksys3res9ActorLinkD0Ev
0x00000071011675c8,sub_71011675C8,8,_ZThn632_NK4ksys3res9ActorLink10needsParseEv
0x00000071011675d0,sub_71011675D0,240,_ZThn664_N4ksys3res9ActorLinkD1Ev
0x00000071011676c0,sub_71011676C0,228,_ZThn664_N4ksys3res9ActorLinkD0Ev
0x0000007101167918,sub_7101167918,548,
0x0000007101167b3c,sub_7101167B3C,316,
0x0000007101167c78,sub_7101167C78,328,

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

@ -1 +1 @@
Subproject commit 292b10a27dac9c59241bd54b87e1772c47ef444e
Subproject commit 27e919f21530a5c7b2186d9c616f9ad590b71496

@ -1 +1 @@
Subproject commit b085263d6999ae37d8442ad1a1e9f5832dbdfc19
Subproject commit 397b25d7f0c8841972f20a59f6000f1fb5daabfe

View File

@ -0,0 +1,30 @@
#pragma once
#include <basis/seadTypes.h>
#include <string_view>
#include "KingSystem/Utils/HashUtil.h"
namespace ksys::act {
/// Actor tag.
class Tag {
public:
Tag() = default;
constexpr Tag(u32 hash) : mHash(hash) {}
constexpr Tag(std::string_view name) : mHash(util::calcCrc32(name)) {}
constexpr bool operator==(Tag other) const { return mHash == other.mHash; }
constexpr bool operator!=(Tag other) const { return mHash != other.mHash; }
constexpr bool operator<(Tag other) const { return mHash < other.mHash; }
constexpr bool operator>(Tag other) const { return mHash > other.mHash; }
constexpr bool operator<=(Tag other) const { return mHash <= other.mHash; }
constexpr bool operator>=(Tag other) const { return mHash >= other.mHash; }
constexpr operator u32() const { return mHash; }
constexpr u32 getHash() const { return mHash; }
private:
u32 mHash;
};
} // namespace ksys::act

View File

@ -0,0 +1,103 @@
#include "KingSystem/Resource/resResourceActorLink.h"
#include <codec/seadHashCRC32.h>
#include <heap/seadHeapMgr.h>
namespace ksys::res {
ActorLink::ActorLink() : ParamIO("xml", 0) {
const auto init_user = [this](auto& param, const char* key, const char* default_ = "Dummy") {
param.init(default_, key, "", &mUsers.obj);
};
init_user(mUsers.profile, "ProfileUser");
init_user(mUsers.actor_capture, "ActorCaptureUser");
init_user(mUsers.as, "ASUser", "");
init_user(mUsers.model, "ModelUser", "");
init_user(mUsers.anim, "AnimUser", "");
init_user(mUsers.ai_program, "AIProgramUser", "");
init_user(mUsers.gparam, "GParamUser", "");
init_user(mUsers.damage_param, "DamageParamUser");
init_user(mUsers.rg_config_list, "RgConfigListUser");
init_user(mUsers.rg_blend_weight, "RgBlendWeightUser");
init_user(mUsers.awareness, "AwarenessUser");
init_user(mUsers.elink, "ElinkUser");
init_user(mUsers.slink, "SlinkUser");
init_user(mUsers.xlink, "XlinkUser");
init_user(mUsers.attention, "AttentionUser");
init_user(mUsers.physics, "PhysicsUser");
init_user(mUsers.chemical, "ChemicalUser");
init_user(mUsers.drop_table, "DropTableUser");
init_user(mUsers.shop_data, "ShopDataUser");
init_user(mUsers.recipe, "RecipeUser");
init_user(mUsers.lod, "LODUser");
init_user(mUsers.ai_schedule, "AIScheduleUser");
init_user(mUsers.bone_control, "BoneControlUser");
init_user(mUsers.life_condition, "LifeConditionUser");
init_user(mUsers.umii, "UMiiUser");
init_user(mUsers.animation_info, "AnimationInfo");
mActorScale.init(1.0, "ActorScale", "", &mUsers.obj);
mActorNameJpn.init("不正な名前", "ActorNameJpn", "ActorNameJpn", &mUsers.obj);
mPriority.init("", "Priority", "Priority", &mUsers.obj);
addObj(&mUsers.obj, "LinkTarget");
}
bool ActorLink::parse_(u8* data, size_t, sead::Heap* heap) {
if (!data)
return true;
const agl::utl::ResParameterArchive archive{data};
const auto root = archive.getRootList();
const s32 tags_idx = root.searchObjIndex(agl::utl::ParameterBase::calcHash("Tags"));
// NON_MATCHING: getResParameter (redundant uxtw; i and res increment order)
const auto parse_tags = [&] {
if (tags_idx == -1)
return;
const auto obj = root.getResParameterObj(tags_idx);
if (!obj.ptr())
return;
const auto num_tags = obj.getNum();
if (num_tags == 0)
return;
mHeap = heap;
mTags.allocBufferAssert(num_tags, heap);
for (s32 i = 0; i != num_tags; ++i) {
const char* tag = obj.getResParameter(i).getData<char>();
mTags[i] = sead::HashCRC32::calcStringHash(tag);
}
if (num_tags > 1)
mTags.heapSort(0, num_tags - 1);
};
parse_tags();
applyResParameterArchive(agl::utl::ResParameterArchive{data});
return true;
}
void ActorLink::m5_() {
if (!mTags.isBufferReady())
return;
if (!mHeap)
return;
sead::ScopedCurrentHeapSetter setter{mHeap};
mTags.freeBuffer();
}
// NON_MATCHING: operands are swapped for an equality comparison in binarySearch
bool ActorLink::hasTag(const char* tag_name) const {
return mTags.size() >= 1 && mTags.binarySearch(sead::HashCRC32::calcStringHash(tag_name)) != -1;
}
bool ActorLink::hasTag(act::Tag tag) const {
return mTags.size() >= 1 && mTags.binarySearch(tag) != -1;
}
} // namespace ksys::res

View File

@ -0,0 +1,74 @@
#pragma once
#include <agl/Utils/aglParameter.h>
#include <agl/Utils/aglParameterObj.h>
#include <container/seadBuffer.h>
#include "KingSystem/ActorSystem/actTag.h"
#include "KingSystem/Resource/resResource.h"
#include "KingSystem/Utils/ParamIO.h"
#include "KingSystem/Utils/Types.h"
namespace ksys::res {
class ActorLink : public ParamIO, public Resource {
SEAD_RTTI_OVERRIDE(ActorLink, Resource)
public:
struct Users {
agl::utl::Parameter<sead::SafeString> profile;
agl::utl::Parameter<sead::SafeString> actor_capture;
agl::utl::Parameter<sead::SafeString> as;
agl::utl::Parameter<sead::SafeString> model;
agl::utl::Parameter<sead::SafeString> anim;
agl::utl::Parameter<sead::SafeString> ai_program;
agl::utl::Parameter<sead::SafeString> gparam;
agl::utl::Parameter<sead::SafeString> damage_param;
agl::utl::Parameter<sead::SafeString> rg_config_list;
agl::utl::Parameter<sead::SafeString> rg_blend_weight;
agl::utl::Parameter<sead::SafeString> awareness;
agl::utl::Parameter<sead::SafeString> physics;
agl::utl::Parameter<sead::SafeString> chemical;
agl::utl::Parameter<sead::SafeString> attention;
agl::utl::Parameter<sead::SafeString> elink;
agl::utl::Parameter<sead::SafeString> slink;
agl::utl::Parameter<sead::SafeString> xlink;
agl::utl::Parameter<sead::SafeString> drop_table;
agl::utl::Parameter<sead::SafeString> shop_data;
agl::utl::Parameter<sead::SafeString> recipe;
agl::utl::Parameter<sead::SafeString> lod;
agl::utl::Parameter<sead::SafeString> bone_control;
agl::utl::Parameter<sead::SafeString> ai_schedule;
agl::utl::Parameter<sead::SafeString> life_condition;
agl::utl::Parameter<sead::SafeString> umii;
agl::utl::Parameter<sead::SafeString> animation_info;
agl::utl::ParameterObj obj;
};
ActorLink();
void doCreate_(u8*, u32, sead::Heap*) override {}
bool needsParse() const override { return true; }
const Users& getUsers() const { return mUsers; }
const sead::SafeString& getActorNameJpn() const { return mActorNameJpn.ref(); }
const sead::SafeString& getPriority() const { return mPriority.ref(); }
f32 getActorScale() const { return mActorScale.ref(); }
bool hasTag(const char* tag_name) const;
bool hasTag(act::Tag tag) const;
const sead::Buffer<u32>& getTags() const { return mTags; }
private:
bool parse_(u8* data, size_t size, sead::Heap* heap) override;
void m5_() override;
Users mUsers;
agl::utl::Parameter<sead::SafeString> mActorNameJpn;
agl::utl::Parameter<sead::SafeString> mPriority;
agl::utl::Parameter<f32> mActorScale;
sead::Buffer<u32> mTags;
sead::Heap* mHeap = nullptr;
};
KSYS_CHECK_SIZE_NX150(ActorLink, 0x778);
} // namespace ksys::res

View File

@ -0,0 +1,25 @@
#pragma once
#include <basis/seadTypes.h>
#include <string_view>
namespace ksys::util {
template <typename CharType = u8>
constexpr u32 calcCrc32(const CharType* data, std::size_t size) {
u32 crc = 0xFFFFFFFF;
for (std::size_t i = 0; i < size; ++i) {
crc ^= u8(data[i]);
for (std::size_t j = 0; j < 8; ++j) {
u32 mask = -(crc & 1);
crc = (crc >> 1) ^ (0xEDB88320 & mask);
}
}
return ~crc;
}
constexpr u32 calcCrc32(std::string_view str) {
return calcCrc32<char>(str.data(), str.size());
}
} // namespace ksys::util