diff --git a/src/Classes/ItemsTab.lua b/src/Classes/ItemsTab.lua index aaa060c8c7..61b28d707a 100644 --- a/src/Classes/ItemsTab.lua +++ b/src/Classes/ItemsTab.lua @@ -3996,48 +3996,104 @@ function ItemsTabClass:AddItemTooltip(tooltip, item, slot, dbMode) t_insert(compareSlots, slot) end end - table.sort(compareSlots, function(a, b) - if a ~= b then - if slot == a then - return true - end - if slot == b then - return false - end - end - if a.selItemId ~= b.selItemId then - if item == self.items[a.selItemId] then - return true - end - if item == self.items[b.selItemId] then - return false - end + + tooltip:AddLine(14, colorCodes.TIP .. "Tip: Press Ctrl+D to disable the display of stat differences.") + + local function getReplacedItemAndOutput(compareSlot) + local selItem = self.items[compareSlot.selItemId] + local output = calcFunc({ repSlotName = compareSlot.slotName, repItem = item ~= selItem and item or nil }) + return selItem, output + end + local function addCompareForSlot(compareSlot, selItem, output) + if not selItem or not output then + selItem, output = getReplacedItemAndOutput(compareSlot) end - local aNum = tonumber(a.slotName:match("%d+")) - local bNum = tonumber(b.slotName:match("%d+")) - if aNum and bNum then - return aNum < bNum + local header + if item == selItem then + header = "^7Removing this item from "..compareSlot.label.." will give you:" else - return a.slotName < b.slotName + header = string.format("^7Equipping this item in %s will give you:%s", compareSlot.label or compareSlot.slotName, selItem and "\n(replacing "..colorCodes[selItem.rarity]..selItem.name.."^7)" or "") end - end) + self.build:AddStatComparesToTooltip(tooltip, calcBase, output, header) + end - -- Add comparisons for each slot - for _, compareSlot in pairs(compareSlots) do - if not main.slotOnlyTooltips or (slot and (slot.nodeId == compareSlot.nodeId or slot.slotName == compareSlot.slotName)) or not slot or slot == compareSlot then - local selItem = self.items[compareSlot.selItemId] - local output = calcFunc({ repSlotName = compareSlot.slotName, repItem = item ~= selItem and item or nil}) - local header - if item == selItem then - header = "^7Removing this item from "..compareSlot.label.." will give you:" - else - header = string.format("^7Equipping this item in %s will give you:%s", compareSlot.label, selItem and "\n(replacing "..colorCodes[selItem.rarity]..selItem.name.."^7)" or "") + -- if we have a specific slot to compare to, and the user has "Show + -- tooltips only for affected slots" checked, we can just compare that + -- one slot + if main.slotOnlyTooltips and slot then + addCompareForSlot(slot) + return + end + + + local slots = {} + local isUnique = item.rarity == "UNIQUE" or item.rarity == "RELIC" + local currentSameUniqueCount = 0 + for _, compareSlot in ipairs(compareSlots) do + local selItem, output = getReplacedItemAndOutput(compareSlot) + local isSameUnique = isUnique and selItem and item.name == selItem.name + if isUnique and isSameUnique and item.limit then + currentSameUniqueCount = currentSameUniqueCount + 1 + end + table.insert(slots, + { selItem = selItem, output = output, compareSlot = compareSlot, isSameUnique = isSameUnique }) + end + + -- limited uniques: only compare to slots with the same item if more don't fit + if currentSameUniqueCount == item.limit then + for _, slotEntry in ipairs(slots) do + if slotEntry.isSameUnique then + addCompareForSlot(slotEntry.compareSlot, slotEntry.selItem, slotEntry.output) + end + end + return + end + + + -- either the same unique or same base type + local function similar(compareItem, sameUnique) + -- empty slot + if not compareItem then return 0 end + + local sameBaseType = not isUnique + and compareItem.rarity ~= "UNIQUE" and compareItem.rarity ~= "RELIC" + and item.base.type == compareItem.base.type + and item.base.subType == compareItem.base.subType + if sameBaseType or sameUnique then + return 1 + else + return 0 + end + end + -- sort by: + -- 1. empty sockets + -- 2. same base group jewel or unique + -- 3. DPS + -- 4. EHP + local function sortFunc(a, b) + if a == b then return end + + local aParams = { a.compareSlot.selItemId == 0 and 1 or 0, similar(a.selItem, a.isSameUnique), a.output.FullDPS, a.output.CombinedDPS, a.output.TotalEHP, a.compareSlot.label } + local bParams = { b.compareSlot.selItemId == 0 and 1 or 0, similar(b.selItem, b.isSameUnique), b.output.FullDPS, b + .output.CombinedDPS, b.output.TotalEHP, b.compareSlot.label } + for i = 1, #aParams do + if aParams[i] == nil or bParams[i] == nil then + -- continue + elseif aParams[i] > bParams[i] then + return true + elseif aParams[i] < bParams[i] then + return false end - self.build:AddStatComparesToTooltip(tooltip, calcBase, output, header) end + return true + end + table.sort(slots, sortFunc) + + for _, slotEntry in ipairs(slots) do + addCompareForSlot(slotEntry.compareSlot, slotEntry.selItem, slotEntry.output) end + end - tooltip:AddLine(14, colorCodes.TIP.."Tip: Press Ctrl+D to disable the display of stat differences.") if launch.devModeAlt then -- Modifier debugging info diff --git a/src/Classes/PassiveTreeView.lua b/src/Classes/PassiveTreeView.lua index 3370a436e2..9c4ce10dda 100644 --- a/src/Classes/PassiveTreeView.lua +++ b/src/Classes/PassiveTreeView.lua @@ -1223,7 +1223,7 @@ function PassiveTreeViewClass:AddNodeTooltip(tooltip, node, build) if node.type == "Socket" and node.alloc then local socket, jewel = build.itemsTab:GetSocketAndJewelForNodeID(node.id) if jewel then - build.itemsTab:AddItemTooltip(tooltip, jewel, { nodeId = node.id }) + build.itemsTab:AddItemTooltip(tooltip, jewel, socket) if node.distanceToClassStart and node.distanceToClassStart > 0 then tooltip:AddSeparator(14) tooltip:AddLine(16, string.format("^7Distance to start: %d", node.distanceToClassStart)) diff --git a/src/Classes/TradeQuery.lua b/src/Classes/TradeQuery.lua index 4965c4eec1..76d49d75f1 100644 --- a/src/Classes/TradeQuery.lua +++ b/src/Classes/TradeQuery.lua @@ -1013,7 +1013,7 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro local result = self.resultTbl[row_idx][pb_index] local item = new("Item", result.item_string) tooltip:Clear() - self.itemsTab:AddItemTooltip(tooltip, item, slotTbl) + self.itemsTab:AddItemTooltip(tooltip, item, activeSlot) addMegalomaniacCompareToTooltipIfApplicable(tooltip, pb_index) tooltip:AddSeparator(10) tooltip:AddLine(16, string.format("^7Price: %s %s", result.amount, result.currency)) @@ -1041,7 +1041,7 @@ function TradeQueryClass:PriceItemRowDisplay(row_idx, top_pane_alignment_ref, ro -- item.baseName is nil and throws error in the following AddItemTooltip func -- if the item is unidentified local item = new("Item", item_string) - self.itemsTab:AddItemTooltip(tooltip, item, slotTbl, true) + self.itemsTab:AddItemTooltip(tooltip, item, activeSlot, true) addMegalomaniacCompareToTooltipIfApplicable(tooltip, selected_result_index) end end diff --git a/src/Modules/Main.lua b/src/Modules/Main.lua index 49f78e6bbc..3d4ba4a323 100644 --- a/src/Modules/Main.lua +++ b/src/Modules/Main.lua @@ -1032,7 +1032,7 @@ function main:OpenOptionsPopup() nextRow() controls.slotOnlyTooltips = new("CheckBoxControl", { "TOPLEFT", nil, "TOPLEFT" }, { defaultLabelPlacementX, currentY, 20 }, "^7Show tooltips only for affected slots:", function(state) self.slotOnlyTooltips = state - end) + end, "Shows comparisons in tooltips only for the slot you are currently placing the item in, instead of all slots.") controls.slotOnlyTooltips.state = self.slotOnlyTooltips nextRow()