mirror of
https://github.com/zeldaret/botw
synced 2026-08-05 01:19:17 -04:00
@@ -142,4 +142,6 @@ target_sources(uking PRIVATE
|
||||
resResourceLod.h
|
||||
resResourceRecipe.cpp
|
||||
resResourceRecipe.h
|
||||
resResourceShop.cpp
|
||||
resResourceShop.h
|
||||
)
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1,55 @@
|
||||
#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"
|
||||
|
||||
namespace ksys::res {
|
||||
|
||||
class Shop : public ParamIO, public Resource {
|
||||
SEAD_RTTI_OVERRIDE(Shop, Resource)
|
||||
|
||||
public:
|
||||
struct Item {
|
||||
agl::utl::Parameter<s32> sort_value;
|
||||
agl::utl::Parameter<sead::SafeString> name;
|
||||
agl::utl::Parameter<s32> num_stock;
|
||||
agl::utl::Parameter<s32> price_adjustment;
|
||||
agl::utl::Parameter<bool> demo_flag;
|
||||
agl::utl::Parameter<s32> price;
|
||||
};
|
||||
KSYS_CHECK_SIZE_NX150(Item, 0xC8);
|
||||
|
||||
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);
|
||||
|
||||
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<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(Shop, 0x320);
|
||||
|
||||
} // namespace ksys::res
|
||||
Reference in New Issue
Block a user