diff options
| author | Léo Lam <leo@leolam.fr> | 2021-01-21 23:36:01 +0100 |
|---|---|---|
| committer | Léo Lam <leo@leolam.fr> | 2021-01-22 00:14:40 +0100 |
| commit | 7814fd527b259b5a7c499f4e78e956f789f65fdf (patch) | |
| tree | edb537341df832191af241fb263131c1909be186 /src/Game/UI/uiPauseMenuDataMgr.cpp | |
| parent | 3e31611d2a7e8a3abe5544e205c5ceae619e13a9 (diff) | |
uking/ui: Implement shield sorting for inventory
Diffstat (limited to 'src/Game/UI/uiPauseMenuDataMgr.cpp')
| -rw-r--r-- | src/Game/UI/uiPauseMenuDataMgr.cpp | 81 |
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)) |
