summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2020-09-10 16:47:09 +0200
committerLéo Lam <leo@leolam.fr>2020-09-10 16:49:07 +0200
commit59c91970f67a9257ea2dc6b262bbc22172f134c2 (patch)
treeae6af592dbe142b5dbf45248bf80cb180b113aea /src
parent6af5dfd74748f13d8c375c49d0c3383fd4050c35 (diff)
ksys/res: Add Recipe
It's mostly the same as Drop. *shrug*
Diffstat (limited to 'src')
-rw-r--r--src/KingSystem/Resource/resResourceRecipe.cpp67
-rw-r--r--src/KingSystem/Resource/resResourceRecipe.h48
2 files changed, 115 insertions, 0 deletions
diff --git a/src/KingSystem/Resource/resResourceRecipe.cpp b/src/KingSystem/Resource/resResourceRecipe.cpp
new file mode 100644
index 00000000..070ee84e
--- /dev/null
+++ b/src/KingSystem/Resource/resResourceRecipe.cpp
@@ -0,0 +1,67 @@
+#include "KingSystem/Resource/resResourceRecipe.h"
+
+namespace ksys::res {
+
+// NON_MATCHING: first line (see also Drop::parse_)
+bool Recipe::parse_(u8* data, size_t, sead::Heap* heap) {
+ mTableNum.init(0, "TableNum", "テーブルの数", &mObj);
+ addObj(&mObj, "Header");
+
+ if (!data)
+ return true;
+
+ applyResParameterArchive(agl::utl::ResParameterArchive{data});
+
+ const s32 num_tables = mTableNum.ref();
+ if (num_tables < 1)
+ return true;
+
+ mTables.allocBufferAssert(num_tables, heap);
+
+ const agl::utl::ResParameterArchive archive{data};
+ const auto root = archive.getRootList();
+ const auto header_obj = root.getResParameterObj(0);
+
+ for (s32 i = 0; i < num_tables; ++i) {
+ sead::FormatFixedSafeString<64> name;
+ name.format("Table%02d", i + 1);
+ mTables[i].name.init("", name, "テーブル名", &mObj);
+ }
+
+ mObj.applyResParameterObj(header_obj, nullptr);
+
+ for (s32 i = 0; i < num_tables; ++i) {
+ const auto obj = root.getResParameterObj(i + 1);
+ mTables[i].column_num.init(0, "ColumnNum", "行数", &mTables[i].obj);
+
+ addObj(&mTables[i].obj, mTables[i].name.ref());
+ applyResParameterArchive(agl::utl::ResParameterArchive{data});
+ mTables[i].obj.applyResParameterObj(obj, nullptr);
+
+ if (mTables[i].column_num.ref() > 0) {
+ mTables[i].items.allocBufferAssert(mTables[i].column_num.ref(), heap);
+ }
+ }
+
+ for (s32 i = 0; i < num_tables; ++i) {
+ parseTable_(i);
+ }
+
+ applyResParameterArchive(agl::utl::ResParameterArchive{data});
+ return true;
+}
+
+void Recipe::parseTable_(const s32& table_idx) {
+ const s32 num = mTables[table_idx].column_num.ref();
+ for (s32 i = 0; i < num; ++i) {
+ sead::FormatFixedSafeString<64> name;
+ name.format("ItemName%02d", i + 1);
+ mTables[table_idx].items[i].name.init("", name, "アイテム名", &mTables[table_idx].obj);
+
+ sead::FormatFixedSafeString<64> name2;
+ name2.format("ItemNum%02d", i + 1);
+ mTables[table_idx].items[i].num.init(0, name2, "個数", &mTables[table_idx].obj);
+ }
+}
+
+} // namespace ksys::res
diff --git a/src/KingSystem/Resource/resResourceRecipe.h b/src/KingSystem/Resource/resResourceRecipe.h
new file mode 100644
index 00000000..a18bcf42
--- /dev/null
+++ b/src/KingSystem/Resource/resResourceRecipe.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <agl/Utils/aglParameter.h>
+#include <agl/Utils/aglParameterObj.h>
+#include <container/seadBuffer.h>
+#include "KingSystem/Resource/resResource.h"
+#include "KingSystem/Utils/ParamIO.h"
+#include "KingSystem/Utils/Types.h"
+
+namespace ksys::res {
+
+class Recipe : public ParamIO, public Resource {
+ SEAD_RTTI_OVERRIDE(Recipe, Resource)
+public:
+ struct Item {
+ agl::utl::Parameter<sead::SafeString> name;
+ agl::utl::Parameter<s32> num;
+ };
+ KSYS_CHECK_SIZE_NX150(Item, 0x48);
+
+ struct Table {
+ agl::utl::ParameterObj obj;
+ agl::utl::Parameter<sead::SafeString> name;
+ agl::utl::Parameter<s32> column_num;
+ sead::Buffer<Item> items;
+ };
+ KSYS_CHECK_SIZE_NX150(Table, 0x88);
+
+ Recipe() : ParamIO("recipe", 0) {}
+
+ bool ParamIO_m0() override { return true; }
+ void doCreate_(u8*, u32, sead::Heap*) override {}
+ bool needsParse() const override { return true; }
+
+ const sead::Buffer<Table>& getTables() const { return mTables; }
+
+private:
+ bool parse_(u8* data, size_t size, sead::Heap* heap) override;
+ void parseTable_(const s32& table_idx);
+
+ agl::utl::ParameterObj mObj;
+ agl::utl::Parameter<s32> mTableNum;
+ sead::Buffer<void*> _300;
+ sead::Buffer<Table> mTables;
+};
+KSYS_CHECK_SIZE_NX150(Recipe, 0x320);
+
+} // namespace ksys::res