uking/ui: Add inventory saving function

This commit is contained in:
Léo Lam 2021-01-17 01:17:45 +01:00
parent 404597421d
commit eeeab7ab93
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
4 changed files with 108 additions and 12 deletions

View File

@ -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.

@ -1 +1 @@
Subproject commit 212fa5f0a3d9bb6a209af66d3c11fd29afc95371 Subproject commit c062aa0fa2bc8ef3a287c9455c76f6229b27089a

View File

@ -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;

View File

@ -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{};