diff --git a/data/uking_functions.csv b/data/uking_functions.csv index e9f3c40b..32c7a9e8 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -56384,7 +56384,7 @@ 0x0000007100977a28,sub_7100977A28,272,_ZN5uking2ui13compareShieldEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE 0x0000007100977b38,sub_7100977B38,336,_ZN5uking2ui12compareArmorEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE 0x0000007100977c88,sub_7100977C88,308,_ZN5uking2ui15compareMaterialEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE -0x0000007100977dbc,sub_7100977DBC,540, +0x0000007100977dbc,sub_7100977DBC,540,_ZN5uking2ui11compareFoodEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE 0x0000007100977fd8,sub_7100977FD8,116,_ZN5uking2ui14compareKeyItemEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE 0x000000710097804c,sub_710097804C,676, 0x00000071009782f0,sub_71009782F0,664,_ZN5uking2uiL15doCompareShieldEPKNS0_9PouchItemES3_PN4ksys3act8InfoDataE diff --git a/src/Game/UI/uiPauseMenuDataMgr.cpp b/src/Game/UI/uiPauseMenuDataMgr.cpp index bc05a5bb..9628eee6 100644 --- a/src/Game/UI/uiPauseMenuDataMgr.cpp +++ b/src/Game/UI/uiPauseMenuDataMgr.cpp @@ -164,6 +164,46 @@ int getWeaponModifierSortKey(sead::TypedBitFlag flags) { return 12; } +int getFoodSortKey(int* effect_value, const PouchItem* item) { + const int type = item->getCookData().mCookEffect0.x; + const int value = item->getCookData().mCookEffect0.y; + *effect_value = value; + // TODO: add an enum + switch (type) { + case 1: + return 0; + case 2: + return 1; + case 14: + return 2; + case 15: + return 3; + case 13: + return 4; + case 16: + return 5; + case 5: + return 6; + case 4: + return 7; + case 6: + return 8; + case 10: + return 9; + case 11: + return 10; + case 12: + return 11; + default: + *effect_value = 0; + if (ksys::act::InfoData::instance()->hasTag(item->getName().cstr(), + ksys::act::tags::CookResult)) { + return 0; + } + return 12; + } +} + } // namespace int pouchItemSortPredicate(const PouchItem* lhs, const PouchItem* rhs); @@ -1985,6 +2025,44 @@ int compareMaterial(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoD return compareSortKeys(lhs, rhs, data); } +int compareFood(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoData* data) { + int e1, e2; + const int k1 = getFoodSortKey(&e1, lhs); + const int k2 = getFoodSortKey(&e2, rhs); + // Lower key is better + if (k1 < k2) + return -1; + if (k1 > k2) + return 1; + + if (auto cmp = compareSortKeys(lhs, rhs, data)) + return cmp; + + // Higher is better + if (e1 > e2) + return -1; + if (e1 < e2) + return 1; + + const int st1 = lhs->getCookData().mStaminaRecoverX; + const int st2 = rhs->getCookData().mStaminaRecoverX; + // Higher is better + if (st1 > st2) + return -1; + if (st1 < st2) + return 1; + + const auto sv1 = lhs->getCookData().getStaminaRecoverValue(); + const auto sv2 = rhs->getCookData().getStaminaRecoverValue(); + // Higher is better + if (sv1 > sv2) + return -1; + if (sv1 < sv2) + return 1; + + return 0; +} + int compareKeyItem(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoData* data) { if (auto cmp = compareSortKeys(lhs, rhs, data)) return cmp; diff --git a/src/Game/UI/uiPauseMenuDataMgr.h b/src/Game/UI/uiPauseMenuDataMgr.h index 4348abbe..95fe25e2 100644 --- a/src/Game/UI/uiPauseMenuDataMgr.h +++ b/src/Game/UI/uiPauseMenuDataMgr.h @@ -148,6 +148,7 @@ struct CookTagInfo { class PouchItem { public: struct CookData { + f32 getStaminaRecoverValue() const { return f32(mStaminaRecoverY) * 30.0f; } void setStaminaRecoverX(int x) { mStaminaRecoverX = x; } void setStaminaRecoverY(int y) { mStaminaRecoverY = y; } void setCookEffect1(int effect) { mCookEffect1 = effect; }