mirror of https://github.com/zeldaret/botw.git
uking/ui: Add inventory saving function
This commit is contained in:
parent
404597421d
commit
eeeab7ab93
|
@ -56334,7 +56334,7 @@
|
||||||
0x000000710096eb10,sub_710096EB10,1192,_ZNK5uking2ui16PauseMenuDataMgr19isWeaponSectionFullERKN4sead14SafeStringBaseIcEE
|
0x000000710096eb10,sub_710096EB10,1192,_ZNK5uking2ui16PauseMenuDataMgr19isWeaponSectionFullERKN4sead14SafeStringBaseIcEE
|
||||||
0x000000710096efb8,PauseMenuDataMgr::__auto4,688,_ZN5uking2ui16PauseMenuDataMgr7itemGetERKN4sead14SafeStringBaseIcEEiPKNS_3act18WeaponModifierInfoE
|
0x000000710096efb8,PauseMenuDataMgr::__auto4,688,_ZN5uking2ui16PauseMenuDataMgr7itemGetERKN4sead14SafeStringBaseIcEEiPKNS_3act18WeaponModifierInfoE
|
||||||
0x000000710096f268,PauseMenuDataMgr::increasePouchNumStackable,1876,
|
0x000000710096f268,PauseMenuDataMgr::increasePouchNumStackable,1876,
|
||||||
0x000000710096f9bc,PauseMenuDataMgr::saveToGameData,1700,
|
0x000000710096f9bc,PauseMenuDataMgr::saveToGameData,1700,_ZNK5uking2ui16PauseMenuDataMgr14saveToGameDataERKN4sead10OffsetListINS0_9PouchItemEEE
|
||||||
0x0000007100970060,PauseMenuDataMgr::pouchGetCookResultMaybe,248,
|
0x0000007100970060,PauseMenuDataMgr::pouchGetCookResultMaybe,248,
|
||||||
0x0000007100970158,PauseMenuDataMgr::x_1,268,
|
0x0000007100970158,PauseMenuDataMgr::x_1,268,
|
||||||
0x0000007100970264,PauseMenuDataMgr::__auto5,116,
|
0x0000007100970264,PauseMenuDataMgr::__auto5,116,
|
||||||
|
|
Can't render this file because it is too large.
|
2
lib/sead
2
lib/sead
|
@ -1 +1 @@
|
||||||
Subproject commit 212fa5f0a3d9bb6a209af66d3c11fd29afc95371
|
Subproject commit c062aa0fa2bc8ef3a287c9455c76f6229b27089a
|
|
@ -155,7 +155,7 @@ void PauseMenuDataMgr::resetItem() {
|
||||||
mNewlyAddedItem.mType = PouchItemType::Invalid;
|
mNewlyAddedItem.mType = PouchItemType::Invalid;
|
||||||
mNewlyAddedItem._1c = -1;
|
mNewlyAddedItem._1c = -1;
|
||||||
mNewlyAddedItem.mValue = 0;
|
mNewlyAddedItem.mValue = 0;
|
||||||
mNewlyAddedItem.mValid = false;
|
mNewlyAddedItem.mEquipped = false;
|
||||||
mNewlyAddedItem._25 = 0;
|
mNewlyAddedItem._25 = 0;
|
||||||
mNewlyAddedItem.mName.clear();
|
mNewlyAddedItem.mName.clear();
|
||||||
mNewlyAddedItem.mData.cook = {};
|
mNewlyAddedItem.mData.cook = {};
|
||||||
|
@ -540,7 +540,7 @@ void PauseMenuDataMgr::itemGet(const sead::SafeString& name, int value,
|
||||||
mNewlyAddedItem.mValue = value;
|
mNewlyAddedItem.mValue = value;
|
||||||
mNewlyAddedItem._25 = 1;
|
mNewlyAddedItem._25 = 1;
|
||||||
mNewlyAddedItem.mName = name;
|
mNewlyAddedItem.mName = name;
|
||||||
mNewlyAddedItem.mValid = false;
|
mNewlyAddedItem.mEquipped = false;
|
||||||
|
|
||||||
if (modifier) {
|
if (modifier) {
|
||||||
setItemModifier(mNewlyAddedItem, modifier);
|
setItemModifier(mNewlyAddedItem, modifier);
|
||||||
|
@ -615,6 +615,102 @@ void PauseMenuDataMgr::updateListHeads() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PauseMenuDataMgr::saveToGameData(const sead::OffsetList<PouchItem>& list) const {
|
||||||
|
if (mIsPouchForQuest)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto* item = list.size() > 0 ? list.nth(0) : nullptr;
|
||||||
|
s32 num_food = 0;
|
||||||
|
s32 idx = 0;
|
||||||
|
s32 num_weapons = 0;
|
||||||
|
s32 num_shields = 0;
|
||||||
|
s32 num_bows = 0;
|
||||||
|
|
||||||
|
for (idx = 0; idx < NumPouchItemsMax; ++idx) {
|
||||||
|
if (!item) {
|
||||||
|
ksys::gdt::setFlag_PorchItem({}, idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_EquipFlag(false, idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_Value1(0, idx);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (item && !item->get25()) {
|
||||||
|
#ifdef MATCHING_HACK_NX_CLANG
|
||||||
|
asm(""); // Prevent list.mOffset from being loaded too early
|
||||||
|
#endif
|
||||||
|
item = list.next(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!item) {
|
||||||
|
ksys::gdt::setFlag_PorchItem({}, idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_EquipFlag(false, idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_Value1(0, idx);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sead::FixedSafeString<64> name{item->getName()};
|
||||||
|
s32 value = item->getValue();
|
||||||
|
for (const auto& entry : mArray3) {
|
||||||
|
if (entry.item == item) {
|
||||||
|
value +=
|
||||||
|
ksys::act::InfoData::instance()->hasTag(name.cstr(), ksys::act::tags::CanStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const auto type = item->getType();
|
||||||
|
ksys::gdt::setFlag_PorchItem(name, idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_EquipFlag(item->isEquipped(), idx);
|
||||||
|
ksys::gdt::setFlag_PorchItem_Value1(value, idx);
|
||||||
|
switch (type) {
|
||||||
|
case PouchItemType::Weapon:
|
||||||
|
if (num_weapons < NumWeaponsMax) {
|
||||||
|
act::WeaponModifierInfo(*item).savePorchSwordFlag(num_weapons);
|
||||||
|
++num_weapons;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PouchItemType::Bow:
|
||||||
|
if (num_bows < NumBowsMax) {
|
||||||
|
act::WeaponModifierInfo(*item).savePorchBowFlag(num_bows);
|
||||||
|
++num_bows;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PouchItemType::Arrow:
|
||||||
|
break;
|
||||||
|
case PouchItemType::Shield:
|
||||||
|
if (num_shields < NumShieldsMax) {
|
||||||
|
act::WeaponModifierInfo(*item).savePorchShieldFlag(num_shields);
|
||||||
|
++num_shields;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PouchItemType::ArmorHead:
|
||||||
|
case PouchItemType::ArmorUpper:
|
||||||
|
case PouchItemType::ArmorLower:
|
||||||
|
case PouchItemType::Material:
|
||||||
|
break;
|
||||||
|
case PouchItemType::Food:
|
||||||
|
if (num_food >= NumFoodMax)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ksys::gdt::setFlag_StaminaRecover(
|
||||||
|
{static_cast<f32>(item->getCookData().mStaminaRecoverX),
|
||||||
|
static_cast<f32>(item->getCookData().mStaminaRecoverY) * 30.0f / 30.0f},
|
||||||
|
num_food);
|
||||||
|
ksys::gdt::setFlag_CookEffect0(item->getCookData().mCookEffect0, num_food);
|
||||||
|
ksys::gdt::setFlag_CookEffect1({f32(item->getCookData().mCookEffect1), 0.0}, num_food);
|
||||||
|
ksys::gdt::setFlag_CookMaterialName0(*item->mIngredients[0], num_food);
|
||||||
|
ksys::gdt::setFlag_CookMaterialName1(*item->mIngredients[1], num_food);
|
||||||
|
ksys::gdt::setFlag_CookMaterialName2(*item->mIngredients[2], num_food);
|
||||||
|
ksys::gdt::setFlag_CookMaterialName3(*item->mIngredients[3], num_food);
|
||||||
|
ksys::gdt::setFlag_CookMaterialName4(*item->mIngredients[4], num_food);
|
||||||
|
++num_food;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
item = list.next(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PauseMenuDataMgr::removeArrow(const sead::SafeString& arrow_name, int count) {
|
void PauseMenuDataMgr::removeArrow(const sead::SafeString& arrow_name, int count) {
|
||||||
if (!ksys::act::InfoData::instance()->hasTag(arrow_name.cstr(), ksys::act::tags::Arrow))
|
if (!ksys::act::InfoData::instance()->hasTag(arrow_name.cstr(), ksys::act::tags::Arrow))
|
||||||
return;
|
return;
|
||||||
|
@ -647,7 +743,7 @@ void PauseMenuDataMgr::setWeaponItemValue(s32 value, PouchItemType type) {
|
||||||
|
|
||||||
s32 idx = 0;
|
s32 idx = 0;
|
||||||
for (auto& item : getItems()) {
|
for (auto& item : getItems()) {
|
||||||
if (!item.isValid() || item.getType() != type) {
|
if (!item.isEquipped() || item.getType() != type) {
|
||||||
++idx;
|
++idx;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -734,7 +830,7 @@ void PauseMenuDataMgr::breakMasterSword() {
|
||||||
for (auto& item : getItems()) {
|
for (auto& item : getItems()) {
|
||||||
if (item.getType() == PouchItemType::Weapon && isMasterSwordActorName(item.getName())) {
|
if (item.getType() == PouchItemType::Weapon && isMasterSwordActorName(item.getName())) {
|
||||||
item.mValue = 0;
|
item.mValue = 0;
|
||||||
item.mValid = false;
|
item.mEquipped = false;
|
||||||
if (!mIsPouchForQuest && idx >= 0) {
|
if (!mIsPouchForQuest && idx >= 0) {
|
||||||
ksys::gdt::setFlag_PorchItem_Value1(0, idx);
|
ksys::gdt::setFlag_PorchItem_Value1(0, idx);
|
||||||
ksys::gdt::setFlag_PorchItem_EquipFlag(false, idx);
|
ksys::gdt::setFlag_PorchItem_EquipFlag(false, idx);
|
||||||
|
@ -910,22 +1006,22 @@ int pouchItemSortPredicateForArrow(const PouchItem* lhs, const PouchItem* rhs) {
|
||||||
bool PauseMenuDataMgr::isHeroSoulEnabled(const sead::SafeString& name) const {
|
bool PauseMenuDataMgr::isHeroSoulEnabled(const sead::SafeString& name) const {
|
||||||
if (name == sValues.Obj_HeroSoul_Zora || name == sValues.Obj_DLC_HeroSoul_Zora) {
|
if (name == sValues.Obj_HeroSoul_Zora || name == sValues.Obj_DLC_HeroSoul_Zora) {
|
||||||
if (mZoraSoulItem)
|
if (mZoraSoulItem)
|
||||||
return mZoraSoulItem->isValid();
|
return mZoraSoulItem->isEquipped();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == sValues.Obj_HeroSoul_Rito || name == sValues.Obj_DLC_HeroSoul_Rito) {
|
if (name == sValues.Obj_HeroSoul_Rito || name == sValues.Obj_DLC_HeroSoul_Rito) {
|
||||||
if (mRitoSoulItem)
|
if (mRitoSoulItem)
|
||||||
return mRitoSoulItem->isValid();
|
return mRitoSoulItem->isEquipped();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == sValues.Obj_HeroSoul_Goron || name == sValues.Obj_DLC_HeroSoul_Goron) {
|
if (name == sValues.Obj_HeroSoul_Goron || name == sValues.Obj_DLC_HeroSoul_Goron) {
|
||||||
if (mGoronSoulItem)
|
if (mGoronSoulItem)
|
||||||
return mGoronSoulItem->isValid();
|
return mGoronSoulItem->isEquipped();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == sValues.Obj_HeroSoul_Gerudo || name == sValues.Obj_DLC_HeroSoul_Gerudo) {
|
if (name == sValues.Obj_HeroSoul_Gerudo || name == sValues.Obj_DLC_HeroSoul_Gerudo) {
|
||||||
if (mGerudoSoulItem)
|
if (mGerudoSoulItem)
|
||||||
return mGerudoSoulItem->isValid();
|
return mGerudoSoulItem->isEquipped();
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -127,7 +127,7 @@ public:
|
||||||
virtual ~PouchItem() = default;
|
virtual ~PouchItem() = default;
|
||||||
|
|
||||||
PouchItemType getType() const { return mType; }
|
PouchItemType getType() const { return mType; }
|
||||||
bool isValid() const { return mValid; }
|
bool isEquipped() const { return mEquipped; }
|
||||||
u8 get25() const { return _25; }
|
u8 get25() const { return _25; }
|
||||||
const sead::SafeString& getName() const { return mName; }
|
const sead::SafeString& getName() const { return mName; }
|
||||||
|
|
||||||
|
@ -179,7 +179,7 @@ private:
|
||||||
PouchItemType mType = PouchItemType::Invalid;
|
PouchItemType mType = PouchItemType::Invalid;
|
||||||
s32 _1c = -1;
|
s32 _1c = -1;
|
||||||
s32 mValue = 0;
|
s32 mValue = 0;
|
||||||
bool mValid = false;
|
bool mEquipped = false;
|
||||||
u8 _25 = 1;
|
u8 _25 = 1;
|
||||||
sead::FixedSafeString<64> mName;
|
sead::FixedSafeString<64> mName;
|
||||||
Data mData{};
|
Data mData{};
|
||||||
|
|
Loading…
Reference in New Issue