From e75e4b1248ef711424dffda0d7679afa367e5570 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 17 Aug 2024 16:17:12 +0200 Subject: [PATCH] Fix incosistent sorting for preorder earrings --- Gearsetter/Model/ItemList.cs | 59 ++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/Gearsetter/Model/ItemList.cs b/Gearsetter/Model/ItemList.cs index cc4ff27..ade3edc 100644 --- a/Gearsetter/Model/ItemList.cs +++ b/Gearsetter/Model/ItemList.cs @@ -11,10 +11,10 @@ internal sealed class ItemList { private static readonly ReadOnlyDictionary PreferredItems = new Dictionary() { - { 41081, 90 }, - { 33648, 80 }, + { 16039, 50 }, { 24589, 70 }, - { 16039, 50 } + { 33648, 80 }, + { 41081, 90 }, }.AsReadOnly(); public required EClassJob ClassJob { get; init; } @@ -26,28 +26,10 @@ internal sealed class ItemList public void Sort() { - var preferredItems = Items - .Where(x => PreferredItems.ContainsKey(x.ItemId)) - // don't show azeyma's earring for lv90 blue mage - .Where(x => x.ItemId != 41081 || ClassJob != EClassJob.BlueMage) - .ToList(); - var defaultItems = Items - .Except(preferredItems) + Items = Items .OrderDescending(new ItemComparer(SubstatPriorities)) .ToList(); - // insert the preferred items - foreach (BaseItem preferredItem in preferredItems) - { - int level = PreferredItems[preferredItem.ItemId]; - int index = defaultItems.FindIndex(x => x.Level < level); - if (index >= 0) - defaultItems.Insert(index, preferredItem); - else - defaultItems.Add(preferredItem); - } - - Items = defaultItems; } public void UpdateStats(Dictionary primaryStats, Configuration configuration) @@ -123,6 +105,11 @@ internal sealed class ItemList if (damageA != damageB) return damageA.CompareTo(damageB); + bool hasPriorityA = TryGetPreferredItemPriority(a, b, out byte priorityA); + bool hasPriorityB = TryGetPreferredItemPriority(b, a, out byte priorityB); + if ((hasPriorityA || hasPriorityB) && priorityA != priorityB) + return priorityA.CompareTo(priorityB); + // gear: primary stat wins // // we pretend every gear item has at least 1 primary stat to ensure weathered items are sorted last(ish), @@ -185,5 +172,33 @@ internal sealed class ItemList // fallback return string.CompareOrdinal(a.Name, b.Name); } + + public static bool TryGetPreferredItemPriority(BaseItem self, BaseItem other, out byte priority) + { + if (PreferredItems.TryGetValue(self.ItemId, out byte levelSelf)) + { + // both items are preferred, sort by level only + if (PreferredItems.TryGetValue(other.ItemId, out byte _)) + { + priority = levelSelf; + return true; + } + + // if they're the same level, place the preferrd item last + if (levelSelf == other.Level) + { + priority = (byte)(levelSelf - 1); + return true; + } + + priority = levelSelf; + return true; + } + else + { + priority = self.Level; + return false; + } + } } }