summaryrefslogtreecommitdiff
path: root/src/Game/UI/uiPauseMenuDataMgr.cpp
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-01-21 23:36:01 +0100
committerLéo Lam <leo@leolam.fr>2021-01-22 00:14:40 +0100
commit7814fd527b259b5a7c499f4e78e956f789f65fdf (patch)
treeedb537341df832191af241fb263131c1909be186 /src/Game/UI/uiPauseMenuDataMgr.cpp
parent3e31611d2a7e8a3abe5544e205c5ceae619e13a9 (diff)
uking/ui: Implement shield sorting for inventory
Diffstat (limited to 'src/Game/UI/uiPauseMenuDataMgr.cpp')
-rw-r--r--src/Game/UI/uiPauseMenuDataMgr.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/Game/UI/uiPauseMenuDataMgr.cpp b/src/Game/UI/uiPauseMenuDataMgr.cpp
index d49d159e..74c3f8dc 100644
--- a/src/Game/UI/uiPauseMenuDataMgr.cpp
+++ b/src/Game/UI/uiPauseMenuDataMgr.cpp
@@ -133,6 +133,37 @@ void getSameGroupActorName(sead::SafeString* group, const sead::SafeString& item
}
}
+int getWeaponModifierSortKey(sead::TypedBitFlag<act::WeaponModifier> flags) {
+ if (flags.isOn(act::WeaponModifier::AddAtk))
+ return flags.isOn(act::WeaponModifier::IsYellow) ? 0 : 1;
+
+ if (flags.isOn(act::WeaponModifier::AddLife))
+ return flags.isOn(act::WeaponModifier::IsYellow) ? 4 : 5;
+
+ if (flags.isOn(act::WeaponModifier::AddThrow))
+ return 6;
+
+ if (flags.isOn(act::WeaponModifier::AddCrit))
+ return 7;
+
+ if (flags.isOn(act::WeaponModifier::AddGuard))
+ return flags.isOn(act::WeaponModifier::IsYellow) ? 2 : 3;
+
+ if (flags.isOn(act::WeaponModifier::AddSurfMaster))
+ return 8;
+
+ if (flags.isOn(act::WeaponModifier::AddSpreadFire))
+ return 10;
+
+ if (flags.isOn(act::WeaponModifier::AddZoomRapid))
+ return 11;
+
+ if (flags.isOn(act::WeaponModifier::AddRapidFire))
+ return 9;
+
+ return 12;
+}
+
} // namespace
int pouchItemSortPredicate(const PouchItem* lhs, const PouchItem* rhs);
@@ -1857,6 +1888,56 @@ static s32 compareSortKeys(const PouchItem* lhs, const PouchItem* rhs, ksys::act
return 0;
}
+static int getShieldGuardPower(const PouchItem* item, ksys::act::InfoData* data) {
+ int power = ksys::act::getWeaponCommonGuardPower(data, item->getName().cstr());
+ if (item->getWeaponAddFlags().isOn(act::WeaponModifier::AddGuard))
+ power += item->getWeaponAddValue();
+ return power;
+}
+
+static int doCompareShield(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoData* data) {
+ const int gp1 = getShieldGuardPower(lhs, data);
+ const int gp2 = getShieldGuardPower(rhs, data);
+ // Higher is better
+ if (gp1 > gp2)
+ return -1;
+ if (gp1 < gp2)
+ return 1;
+
+ const int mod1 = getWeaponModifierSortKey(lhs->getWeaponAddFlags());
+ const int mod2 = getWeaponModifierSortKey(rhs->getWeaponAddFlags());
+ // Lower is better
+ if (mod1 < mod2)
+ return -1;
+ if (mod1 > mod2)
+ return 1;
+
+ const int val1 = lhs->getValue();
+ const int val2 = rhs->getValue();
+ // Higher is better
+ if (val1 > val2)
+ return -1;
+ if (val1 < val2)
+ return 1;
+
+ return 0;
+}
+
+int compareShield(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoData* data) {
+ if (ksys::gdt::getFlag_SortTypeShieldPouch()) {
+ if (auto cmp = compareSortKeys(lhs, rhs, data))
+ return cmp;
+
+ return doCompareShield(lhs, rhs, data);
+
+ } else {
+ if (auto cmp = doCompareShield(lhs, rhs, data))
+ return cmp;
+
+ return compareSortKeys(lhs, rhs, data);
+ }
+}
+
int compareArmor(const PouchItem* lhs, const PouchItem* rhs, ksys::act::InfoData* data) {
if (ksys::gdt::getFlag_SortTypeArmorPouch()) {
if (auto cmp = compareSortKeys(lhs, rhs, data))