uking/ui: Implement food sorting in inventory

This commit is contained in:
Léo Lam 2021-01-22 11:30:46 +01:00
parent 48276bb4e7
commit d9f7561588
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
3 changed files with 80 additions and 1 deletions

View File

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

Can't render this file because it is too large.

View File

@ -164,6 +164,46 @@ int getWeaponModifierSortKey(sead::TypedBitFlag<act::WeaponModifier> 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;

View File

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