diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 510a5228..f8323f9e 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -85887,26 +85887,26 @@ 0x000000710109b454,sub_710109B454,8, 0x000000710109b45c,sub_710109B45C,208, 0x000000710109b52c,sub_710109B52C,196, -0x000000710109b764,nullsub_4475,4, -0x000000710109b768,nullsub_4476,4, -0x000000710109b76c,Bshop::parse,1404, -0x000000710109bce8,sub_710109BCE8,872, -0x000000710109c050,ResourceBshop::parse,28, -0x000000710109c06c,sub_710109C06C,588, -0x000000710109c2b8,sub_710109C2B8,336, -0x000000710109c408,sub_710109C408,124, -0x000000710109c484,sub_710109C484,112, -0x000000710109c4f4,sub_710109C4F4,8, -0x000000710109c4fc,sub_710109C4FC,8, -0x000000710109c504,sub_710109C504,92, -0x000000710109c560,sub_710109C560,8, -0x000000710109c568,sub_710109C568,8, -0x000000710109c570,sub_710109C570,92, -0x000000710109c5cc,sub_710109C5CC,120, -0x000000710109c644,sub_710109C644,108, -0x000000710109c6b0,sub_710109C6B0,8, -0x000000710109c6b8,sub_710109C6B8,128, -0x000000710109c738,sub_710109C738,116, +0x000000710109b764,nullsub_4475,4,_ZN4ksys3res4Shop9doCreate_EPhjPN4sead4HeapE +0x000000710109b768,nullsub_4476,4,_ZThn632_N4ksys3res4Shop9doCreate_EPhjPN4sead4HeapE +0x000000710109b76c,Bshop::parse,1404,_ZN4ksys3res4Shop6parse_EPhmPN4sead4HeapE +0x000000710109bce8,sub_710109BCE8,872,_ZN4ksys3res4Shop11parseTable_ERKi +0x000000710109c050,ResourceBshop::parse,28,_ZThn632_N4ksys3res4Shop6parse_EPhmPN4sead4HeapE +0x000000710109c06c,sub_710109C06C,588,_ZNK4ksys3res4Shop22findTableIndexOrNormalERKN4sead14SafeStringBaseIcEE +0x000000710109c2b8,sub_710109C2B8,336,_ZNK4ksys3res4Shop14findTableIndexERKN4sead14SafeStringBaseIcEE +0x000000710109c408,sub_710109C408,124,_ZN4ksys3res4ShopD2Ev +0x000000710109c484,sub_710109C484,112,_ZN4ksys3res4ShopD0Ev +0x000000710109c4f4,sub_710109C4F4,8,_ZN4ksys3res4Shop10ParamIO_m0Ev +0x000000710109c4fc,sub_710109C4FC,8,_ZNK4ksys3res4Shop27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x000000710109c504,sub_710109C504,92,_ZNK4ksys3res4Shop18getRuntimeTypeInfoEv +0x000000710109c560,sub_710109C560,8,_ZNK4ksys3res4Shop10needsParseEv +0x000000710109c568,sub_710109C568,8,_ZThn632_NK4ksys3res4Shop27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE? +0x000000710109c570,sub_710109C570,92,_ZThn632_NK4ksys3res4Shop18getRuntimeTypeInfoEv +0x000000710109c5cc,sub_710109C5CC,120,_ZThn632_N4ksys3res4ShopD1Ev +0x000000710109c644,sub_710109C644,108,_ZThn632_N4ksys3res4ShopD0Ev +0x000000710109c6b0,sub_710109C6B0,8,_ZThn632_NK4ksys3res4Shop10needsParseEv +0x000000710109c6b8,sub_710109C6B8,128,_ZThn664_N4ksys3res4ShopD1Ev +0x000000710109c738,sub_710109C738,116,_ZThn664_N4ksys3res4ShopD0Ev 0x000000710109c920,sub_710109C920,244, 0x000000710109ca14,sub_710109CA14,8, 0x000000710109cb20,sub_710109CB20,84, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index abf6860e..a34e8223 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -140,4 +140,6 @@ target_sources(uking PRIVATE resResourceLod.h resResourceRecipe.cpp resResourceRecipe.h + resResourceShop.cpp + resResourceShop.h ) diff --git a/src/KingSystem/Resource/resResourceShop.cpp b/src/KingSystem/Resource/resResourceShop.cpp new file mode 100644 index 00000000..0fa43727 --- /dev/null +++ b/src/KingSystem/Resource/resResourceShop.cpp @@ -0,0 +1,115 @@ +#include "KingSystem/Resource/resResourceShop.h" + +namespace ksys::res { + +bool Shop::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 Shop::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("ItemSort%03d", i + 1); + mTables[table_idx].items[i].sort_value.init(0, name, "ソート値", &mTables[table_idx].obj); + + sead::FormatFixedSafeString<64> name2; + name2.format("ItemName%03d", i + 1); + mTables[table_idx].items[i].name.init("", name2, "アイテム名", &mTables[table_idx].obj); + + sead::FormatFixedSafeString<64> name3; + name3.format("ItemNum%03d", i + 1); + mTables[table_idx].items[i].num_stock.init(0, name3, "販売個数", &mTables[table_idx].obj); + + sead::FormatFixedSafeString<64> name4; + name4.format("ItemAdjustPrice%03d", i + 1); + mTables[table_idx].items[i].price_adjustment.init(0, name4, "値段調整値", + &mTables[table_idx].obj); + + sead::FormatFixedSafeString<64> name5; + name5.format("ItemLookGetFlg%03d", i + 1); + mTables[table_idx].items[i].demo_flag.init(false, name5, "ゲットフラグを見るか", + &mTables[table_idx].obj); + + sead::FormatFixedSafeString<64> name6; + name6.format("ItemAmount%03d", i + 1); + mTables[table_idx].items[i].price.init(0, name6, "価値", &mTables[table_idx].obj); + } +} + +s32 Shop::findTableIndex(const sead::SafeString& table_name) const { + if (!mTables.isBufferReady()) + return -1; + + const s32 num = mTableNum.ref(); + for (s32 i = 0; i < num; ++i) { + if (mTables[i].name.ref() == table_name) + return i; + } + + return -1; +} + +s32 Shop::findTableIndexOrNormal(const sead::SafeString& table_name) const { + if (!mTables.isBufferReady()) + return -1; + + s32 normal_idx = -1; + const s32 num = mTableNum.ref(); + for (s32 i = 0; i < num; ++i) { + if (mTables[i].name.ref() == table_name) + return i; + + if (normal_idx < 0 && mTables[i].name.ref() == "Normal") + normal_idx = i; + } + + return normal_idx; +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceShop.h b/src/KingSystem/Resource/resResourceShop.h new file mode 100644 index 00000000..db93ea5e --- /dev/null +++ b/src/KingSystem/Resource/resResourceShop.h @@ -0,0 +1,55 @@ +#pragma once + +#include +#include +#include +#include "KingSystem/Resource/resResource.h" +#include "KingSystem/Utils/ParamIO.h" + +namespace ksys::res { + +class Shop : public ParamIO, public Resource { + SEAD_RTTI_OVERRIDE(Shop, Resource) + +public: + struct Item { + agl::utl::Parameter sort_value; + agl::utl::Parameter name; + agl::utl::Parameter num_stock; + agl::utl::Parameter price_adjustment; + agl::utl::Parameter demo_flag; + agl::utl::Parameter price; + }; + KSYS_CHECK_SIZE_NX150(Item, 0xC8); + + struct Table { + agl::utl::ParameterObj obj; + agl::utl::Parameter name; + agl::utl::Parameter column_num; + sead::Buffer items; + }; + KSYS_CHECK_SIZE_NX150(Table, 0x88); + + Shop() : ParamIO("shop", 0) {} + + s32 findTableIndexOrNormal(const sead::SafeString& table_name) const; + s32 findTableIndex(const sead::SafeString& table_name) const; + + 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(Shop, 0x320); + +} // namespace ksys::res