1#pragma once
2
3#include <gfx/seadColor.h>
4#include <math/seadVector.h>
5
6namespace al {
7class ByamlIter;
8} // namespace al
9
10namespace alYamlMacroUtil {
11
12enum class YamlClassId : s32 {
13 U8 = 0x53,
14 U16 = 0x54,
15 S16 = 0x55,
16 V2f = 0x56,
17 V3f = 0x57,
18 Color = 0x58,
19 F32 = 0x59,
20 S32 = 0x5a,
21 Bool = 0x5b,
22 String = 0x5c,
23};
24
25class IUseYamlParam {
26public:
27 IUseYamlParam(const char* name);
28
29 virtual void clearPtr() = 0;
30 virtual YamlClassId getClassId() const = 0;
31 virtual bool isValidPtr() const = 0;
32
33 virtual void setPtr_u8(u8* value) {}
34
35 virtual void setPtr_u16(u16* value) {}
36
37 virtual void setPtr_s16(s16* value) {}
38
39 virtual void setPtr_V2f(sead::Vector2f* value) {}
40
41 virtual void setPtr_V3f(sead::Vector3f* value) {}
42
43 virtual void setPtr_YamlColor(sead::Color4f* value) {}
44
45 virtual void setPtr_s32(s32* value) {}
46
47 virtual void setPtr_f32(f32* value) {}
48
49 virtual void setPtr_bool(bool* value) {}
50
51 virtual void setPtr_YamlString(const char** value) {}
52
53 bool isEqualParamName(const char* name) const;
54
55 const char* getName() const { return mName; }
56
57 IUseYamlParam* getNext() const { return mNext; }
58
59 void setNext(IUseYamlParam* param) { mNext = param; }
60
61private:
62 const char* mName;
63 IUseYamlParam* mNext = nullptr;
64};
65
66class YamlParamGroup {
67public:
68 YamlParamGroup() = default;
69
70 template <typename T>
71 void setParamPtr(const char* name, T* value);
72
73 void addParam(IUseYamlParam* param);
74 void readyToSetPtr();
75 void readParam(const al::ByamlIter& iter);
76
77 static YamlParamGroup* sCurrent;
78
79private:
80 IUseYamlParam* mHeadParam = nullptr;
81 IUseYamlParam* mTailParam = nullptr;
82};
83
84template <typename T>
85class YamlParamBase : public IUseYamlParam {
86public:
87 YamlParamBase(const char* name);
88
89 T* getParamPtr() { return mValue; }
90
91 void setParamPtr(T* value) { mValue = value; }
92
93 void setParam(T value) { *mValue = value; }
94
95 void clearPtr() override { mValue = nullptr; }
96
97 bool isValidPtr() const override { return mValue != nullptr; }
98
99private:
100 T* mValue;
101};
102
103class YamlParam_YamlString : public YamlParamBase<const char*> {
104public:
105 YamlParam_YamlString(const char* name);
106
107 YamlClassId getClassId() const override;
108 void setPtr_YamlString(const char** value) override;
109};
110
111class YamlParam_V3f : public YamlParamBase<sead::Vector3f> {
112public:
113 YamlParam_V3f(const char* name);
114
115 YamlClassId getClassId() const override;
116 void setPtr_V3f(sead::Vector3f* value) override;
117};
118
119class YamlParam_YamlColor : public YamlParamBase<sead::Color4f> {
120public:
121 YamlParam_YamlColor(const char* name);
122
123 YamlClassId getClassId() const override;
124 void setPtr_YamlColor(sead::Color4f* value) override;
125};
126
127class YamlParam_bool : public YamlParamBase<bool> {
128public:
129 YamlParam_bool(const char* name);
130
131 YamlClassId getClassId() const override;
132 void setPtr_bool(bool* value) override;
133};
134
135class YamlParam_u8 : public YamlParamBase<u8> {
136public:
137 YamlParam_u8(const char* name);
138
139 YamlClassId getClassId() const override;
140 void setPtr_u8(u8* value) override;
141};
142
143class YamlParam_f32 : public YamlParamBase<f32> {
144public:
145 YamlParam_f32(const char* name);
146
147 YamlClassId getClassId() const override;
148 void setPtr_f32(f32* value) override;
149};
150
151class YamlParam_V2f : public YamlParamBase<sead::Vector2f> {
152public:
153 YamlParam_V2f(const char* name);
154
155 YamlClassId getClassId() const override;
156 void setPtr_V2f(sead::Vector2f* value) override;
157};
158
159} // namespace alYamlMacroUtil
160