From 59c91970f67a9257ea2dc6b262bbc22172f134c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 10 Sep 2020 16:47:09 +0200 Subject: [PATCH] ksys/res: Add Recipe It's mostly the same as Drop. *shrug* --- CMakeLists.txt | 2 + data/uking_functions.csv | 36 +++++----- src/KingSystem/Resource/resResourceRecipe.cpp | 67 +++++++++++++++++++ src/KingSystem/Resource/resResourceRecipe.h | 48 +++++++++++++ 4 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 src/KingSystem/Resource/resResourceRecipe.cpp create mode 100644 src/KingSystem/Resource/resResourceRecipe.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 228f54fe..042301a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,8 @@ add_executable(uking src/KingSystem/Resource/resResourceDrop.h src/KingSystem/Resource/resResourceLod.cpp src/KingSystem/Resource/resResourceLod.h + src/KingSystem/Resource/resResourceRecipe.cpp + src/KingSystem/Resource/resResourceRecipe.h src/KingSystem/Terrain/teraSystem.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index f018c096..e8a8dcd0 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -94385,24 +94385,24 @@ 0x00000071012fc31c,sub_71012FC31C,8, 0x00000071012fc324,sub_71012FC324,92, 0x00000071012fc380,sub_71012FC380,8, -0x00000071012fc4fc,nullsub_4845,4, -0x00000071012fc500,nullsub_4846,4, -0x00000071012fc504,Brecipe::parse,1328, -0x00000071012fca34,sub_71012FCA34,408, -0x00000071012fcbcc,ResourceBrecipe::parse,28, -0x00000071012fcbe8,sub_71012FCBE8,124, -0x00000071012fcc64,sub_71012FCC64,112, -0x00000071012fccd4,sub_71012FCCD4,8, -0x00000071012fccdc,sub_71012FCCDC,8, -0x00000071012fcce4,sub_71012FCCE4,92, -0x00000071012fcd40,sub_71012FCD40,8, -0x00000071012fcd48,sub_71012FCD48,8, -0x00000071012fcd50,sub_71012FCD50,92, -0x00000071012fcdac,sub_71012FCDAC,120, -0x00000071012fce24,sub_71012FCE24,108, -0x00000071012fce90,sub_71012FCE90,8, -0x00000071012fce98,sub_71012FCE98,128, -0x00000071012fcf18,sub_71012FCF18,116, +0x00000071012fc4fc,nullsub_4845,4,_ZN4ksys3res6Recipe9doCreate_EPhjPN4sead4HeapE +0x00000071012fc500,nullsub_4846,4,_ZThn632_N4ksys3res6Recipe9doCreate_EPhjPN4sead4HeapE +0x00000071012fc504,Brecipe::parse,1328,_ZN4ksys3res6Recipe6parse_EPhmPN4sead4HeapE? +0x00000071012fca34,sub_71012FCA34,408,_ZN4ksys3res6Recipe11parseTable_ERKi +0x00000071012fcbcc,ResourceBrecipe::parse,28,_ZThn632_N4ksys3res6Recipe6parse_EPhmPN4sead4HeapE +0x00000071012fcbe8,sub_71012FCBE8,124,_ZN4ksys3res6RecipeD2Ev +0x00000071012fcc64,sub_71012FCC64,112,_ZN4ksys3res6RecipeD0Ev +0x00000071012fccd4,sub_71012FCCD4,8,_ZN4ksys3res6Recipe10ParamIO_m0Ev +0x00000071012fccdc,sub_71012FCCDC,8,_ZNK4ksys3res6Recipe27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071012fcce4,sub_71012FCCE4,92,_ZNK4ksys3res6Recipe18getRuntimeTypeInfoEv +0x00000071012fcd40,sub_71012FCD40,8,_ZNK4ksys3res6Recipe10needsParseEv +0x00000071012fcd48,sub_71012FCD48,8,_ZThn632_NK4ksys3res6Recipe27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x00000071012fcd50,sub_71012FCD50,92,_ZThn632_NK4ksys3res6Recipe18getRuntimeTypeInfoEv +0x00000071012fcdac,sub_71012FCDAC,120,_ZThn632_N4ksys3res6RecipeD1Ev +0x00000071012fce24,sub_71012FCE24,108,_ZThn632_N4ksys3res6RecipeD0Ev +0x00000071012fce90,sub_71012FCE90,8,_ZThn632_NK4ksys3res6Recipe10needsParseEv +0x00000071012fce98,sub_71012FCE98,128,_ZThn664_N4ksys3res6RecipeD1Ev +0x00000071012fcf18,sub_71012FCF18,116,_ZThn664_N4ksys3res6RecipeD0Ev 0x00000071012fd100,sub_71012FD100,232, 0x00000071012fd1e8,sub_71012FD1E8,52, 0x00000071012fd21c,sub_71012FD21C,48, 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 +#include +#include +#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 name; + agl::utl::Parameter num; + }; + KSYS_CHECK_SIZE_NX150(Item, 0x48); + + struct Table { + agl::utl::ParameterObj obj; + agl::utl::Parameter name; + agl::utl::Parameter column_num; + sead::Buffer 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& 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 mTableNum; + sead::Buffer _300; + sead::Buffer
mTables; +}; +KSYS_CHECK_SIZE_NX150(Recipe, 0x320); + +} // namespace ksys::res