1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
#pragma once
#include <container/seadBuffer.h>
#include <prim/seadSafeString.h>
#include <utility/aglParameter.h>
#include <utility/aglParameterObj.h>
#include "KingSystem/ActorSystem/actInfoData.h"
#include "KingSystem/Resource/resResource.h"
#include "KingSystem/Utils/ParamIO.h"
namespace ksys::res {
class ModelList : public ParamIO, public Resource {
SEAD_RTTI_OVERRIDE(ModelList, Resource)
public:
struct ControllerInfo {
agl::utl::Parameter<sead::Color4f> mAddColor;
agl::utl::Parameter<sead::Color4f> mMulColor;
agl::utl::ParameterObj mObj;
agl::utl::Parameter<sead::Vector3f> mBaseScale;
agl::utl::Parameter<sead::SafeString> mVariationMatAnim;
agl::utl::Parameter<s32> mVariationMatAnimFrame;
agl::utl::Parameter<sead::SafeString> mVariationShaderAnim;
agl::utl::Parameter<s32> mVariationShaderAnimFrame;
agl::utl::Parameter<sead::SafeString> mCalcAABBASKey;
};
KSYS_CHECK_SIZE_NX150(ControllerInfo, 0x160);
struct Attention {
agl::utl::Parameter<bool> mIsEnableAttention;
agl::utl::Parameter<sead::SafeString> mLookAtBone;
agl::utl::Parameter<sead::Vector3f> mLookAtOffset;
agl::utl::Parameter<f32> mCursorOffsetY;
agl::utl::Parameter<f32> mAIInfoOffsetY;
agl::utl::Parameter<sead::SafeString> mCutTargetBone;
agl::utl::Parameter<sead::Vector3f> mCutTargetOffset;
agl::utl::Parameter<sead::SafeString> mGameCameraBone;
agl::utl::Parameter<sead::Vector3f> mGameCameraOffset;
agl::utl::Parameter<sead::SafeString> mBowCameraBone;
agl::utl::Parameter<sead::Vector3f> mBowCameraOffset;
agl::utl::Parameter<sead::SafeString> mAttackTargetBone;
agl::utl::Parameter<sead::Vector3f> mAttackTargetOffset;
agl::utl::Parameter<f32> mAttackTargetOffsetBack;
agl::utl::Parameter<sead::SafeString> mAtObstacleChkOffsetBone;
agl::utl::Parameter<sead::Vector3f> mAtObstacleChkOffset;
agl::utl::Parameter<bool> mAtObstacleChkUseLookAtPos;
agl::utl::Parameter<sead::SafeString> mCursorAIInfoBaseBone;
agl::utl::Parameter<sead::Vector3f> mCursorAIInfoBaseOffset;
agl::utl::ParameterObj mObj;
};
KSYS_CHECK_SIZE_NX150(Attention, 0x300);
struct Unit {
agl::utl::Parameter<sead::SafeString> unit_name;
agl::utl::Parameter<sead::SafeString> bind_bone;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(Unit, 0x80);
struct ModelData {
agl::utl::Parameter<sead::SafeString> folder;
agl::utl::ParameterObj base_obj;
sead::Buffer<Unit> units;
agl::utl::ParameterList unit_list;
agl::utl::ParameterList list;
};
KSYS_CHECK_SIZE_NX150(ModelData, 0xf8);
// Misspelling of "partical", which is a misspelling of "particle"?
struct Partial {
agl::utl::Parameter<sead::SafeString> bone;
agl::utl::Parameter<s32> bind_flag;
agl::utl::Parameter<bool> recursible;
agl::utl::ParameterObj obj;
};
KSYS_CHECK_SIZE_NX150(Partial, 0x98);
struct AnmTarget {
agl::utl::Parameter<s32> num_as_slot;
agl::utl::Parameter<bool> is_partical_enable;
agl::utl::Parameter<s32> target_type;
agl::utl::ParameterObj base_obj;
sead::Buffer<Partial> partials;
agl::utl::ParameterList partial_list;
agl::utl::ParameterList list;
};
KSYS_CHECK_SIZE_NX150(AnmTarget, 0x130);
struct ModelDataInfo {
std::array<std::array<const char*, 8>, 1> unit_names;
std::array<std::array<const char*, 8>, 1> unit_bind_bones;
std::array<int, 1> num_units;
std::array<const char*, 1> folder_name;
int num_model_data;
sead::Vector3f base_scale;
};
KSYS_CHECK_SIZE_NX150(ModelDataInfo, 0xa0);
struct AttentionInfo {
const char* look_at_bone;
sead::Vector3f look_at_offset;
float cursor_offset_y;
float ai_info_offset_y;
const char* cut_target_bone;
sead::Vector3f cut_target_offset;
const char* game_camera_bone;
sead::Vector3f game_camera_offset;
const char* bow_camera_bone;
sead::Vector3f bow_camera_offset;
const char* attack_target_bone;
sead::Vector3f attack_target_offset;
float attack_target_offset_back;
const char* at_obstacle_chk_bone;
sead::Vector3f at_obstacle_chk_offset;
const char* cursor_ai_info_base_bone;
sead::Vector3f cursor_ai_info_base_offset;
};
KSYS_CHECK_SIZE_NX150(AttentionInfo, 0xb0);
struct PartialInfo {
sead::SafeString bone;
int bind_flag;
bool recursible;
};
KSYS_CHECK_SIZE_NX150(PartialInfo, 0x18);
ModelList();
~ModelList() override;
void doCreate_(u8* buffer, u32 buffer_size, sead::Heap* heap) override;
bool needsParse() const override { return true; }
bool parse_(u8* data, size_t size, sead::Heap* heap) override;
const ControllerInfo& getControllerInfo() const { return mControllerInfo; }
const Attention& getAttention() const { return mAttention; }
const sead::Buffer<ModelData>& getModelData() const { return mModelData; }
const sead::Buffer<AnmTarget>& getAnmTargets() const { return mAnmTargets; }
bool isDummy() const { return mIsDummy; }
void markAsDummy() { mIsDummy = true; }
int getNumAnmTargets() const;
void getModelDataInfo(ModelDataInfo* info) const;
bool getAttentionInfo(AttentionInfo* info) const;
bool getLocatorInfo(act::InfoData::Locator* info, act::InfoData::Locator::Type type) const;
bool isParticalEnable(int anm_target_idx) const;
int getNumASSlot(int anm_target_idx) const;
int getNumPartials(int anm_target_idx) const;
void getPartialInfo(PartialInfo* info, int anm_target_idx, int partial_idx) const;
static act::InfoData::Locator::Type getLocatorTypeFromStr(const sead::SafeString& type);
private:
bool parseModelData(const agl::utl::ResParameterList& res, sead::Heap* heap);
bool parseAnmTarget(const agl::utl::ResParameterList& res, sead::Heap* heap);
ControllerInfo mControllerInfo;
Attention mAttention;
u8* mRawData{};
sead::Buffer<ModelData> mModelData;
agl::utl::ParameterList mModelDataList;
sead::Buffer<AnmTarget> mAnmTargets;
agl::utl::ParameterList mAnmTargetList;
bool mIsDummy = false;
};
KSYS_CHECK_SIZE_NX150(ModelList, 0x7d0);
} // namespace ksys::res
|