diff --git a/src/Classes/PassiveTreeView.lua b/src/Classes/PassiveTreeView.lua index 079854468..555eac540 100644 --- a/src/Classes/PassiveTreeView.lua +++ b/src/Classes/PassiveTreeView.lua @@ -14,6 +14,10 @@ local m_floor = math.floor local band = AND64 -- bit.band local b_rshift = bit.rshift +local JEWEL_RADIUS_TINT_NEUTRAL = { 1, 1, 1, 0.7 } +local JEWEL_RADIUS_TINT_PRIMARY_ONLY = { 1, 0, 0, 0.7 } +local JEWEL_RADIUS_TINT_COMPARE_ONLY = { 0, 1, 0, 0.7 } + local PassiveTreeViewClass = newClass("PassiveTreeView", function(self) self.ring = NewImageHandle() self.ring:Load("Assets/ring.png", "CLAMP") @@ -1094,76 +1098,84 @@ function PassiveTreeViewClass:Draw(build, viewPort, inputEvents) end -- Draw ring overlays for jewel sockets + local function drawJewelRadius(jewel, scrX, scrY, tint) + local radData = build.data.jewelRadius[jewel.jewelRadiusIndex] + local outerSize = radData.outer * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale + local innerSize = radData.inner * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale * 1.06 + SetDrawColor(tint[1], tint[2], tint[3], tint[4]) + if jewel.title == "From Nothing" then + -- From Nothing ring shows on the allocated Keystone + for keystoneName, _ in pairs(jewel.jewelData.fromNothingKeystones) do + local keystone = spec.tree.keystoneMap[keystoneName] + if keystone and keystone.x and keystone.y then + innerSize = 150 * scale + local keyX, keyY = treeToScreen(keystone.x, keystone.y) + self:DrawImageRotated(self.jewelShadedOuterRing, keyX, keyY, outerSize * 2, outerSize * 2, -0.7) + self:DrawImageRotated(self.jewelShadedOuterRingFlipped, keyX, keyY, outerSize * 2, outerSize * 2, 0.7) + self:DrawImageRotated(self.jewelShadedInnerRing, keyX, keyY, innerSize * 2, innerSize * 2, -0.7) + self:DrawImageRotated(self.jewelShadedInnerRingFlipped, keyX, keyY, innerSize * 2, innerSize * 2, 0.7) + end + end + elseif jewel.jewelData and jewel.jewelData.conqueredBy and jewel.jewelData.conqueredBy.conqueror and jewel.jewelData.conqueredBy.conqueror.type then + local conqueror = jewel.jewelData.conqueredBy.conqueror.type + if conqueror == "kalguur" then + conqueror = "kalguuran" + end + local circle1 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/passiveskillscreen".. conqueror .."jewelcircle1.dds") + local circle2 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/passiveskillscreen".. conqueror .."jewelcircle2.dds") + if conqueror == "abyss" then + circle1 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/".. conqueror .."/".. conqueror .."passiveskillscreenjewelcircle1.dds") + circle2 = circle1 + end + self:DrawImageRotated(circle1.handle, scrX, scrY, outerSize * 2, outerSize * 2, -0.7, unpack(circle1)) + self:DrawImageRotated(circle2.handle, scrX, scrY, outerSize * 2, outerSize * 2, 0.7, unpack(circle2)) + else + self:DrawImageRotated(self.jewelShadedOuterRing, scrX, scrY, outerSize * 2, outerSize * 2, -0.7) + self:DrawImageRotated(self.jewelShadedOuterRingFlipped, scrX, scrY, outerSize * 2, outerSize * 2, 0.7) + self:DrawImageRotated(self.jewelShadedInnerRing, scrX, scrY, innerSize * 2, innerSize * 2, -0.7) + self:DrawImageRotated(self.jewelShadedInnerRingFlipped, scrX, scrY, innerSize * 2, innerSize * 2, 0.7) + end + end SetDrawLayer(nil, 25) for nodeId in pairs(tree.sockets) do local node = spec.nodes[nodeId] if node and node.name ~= "Charm Socket" and node.containJewelSocket ~= true and (not node.expansionJewel or node.expansionJewel.size == 2) then local scrX, scrY = treeToScreen(node.x, node.y) local socket, jewel = build.itemsTab:GetSocketAndJewelForNodeID(nodeId) + local compareNode = self.compareSpec and self.compareSpec.nodes[nodeId] or nil + local cJewel = self.compareSpec and self:GetCompareJewel(nodeId) or nil if node == hoverNode then - local isThreadOfHope = jewel and jewel.jewelRadiusLabel == "Variable" - if isThreadOfHope then - for _, radData in ipairs(build.data.jewelRadius) do - local outerSize = radData.outer * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale - local innerSize = radData.inner * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale - -- Jewel in socket is Thread of Hope or similar, draw it's annulus + local effectiveJewel = jewel or cJewel + local isThreadOfHope = effectiveJewel and effectiveJewel.jewelRadiusLabel == "Variable" + for _, radData in ipairs(build.data.jewelRadius) do + local outerSize = radData.outer * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale + local innerSize = radData.inner * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale + if isThreadOfHope then + -- Thread of Hope-like: draw the annulus (only radii with a non-zero inner) if innerSize ~= 0 then SetDrawColor(radData.col) DrawImage(self.ring, scrX - outerSize, scrY - outerSize, outerSize * 2, outerSize * 2) DrawImage(self.ring, scrX - innerSize, scrY - innerSize, innerSize * 2, innerSize * 2) end - end - else - for _, radData in ipairs(build.data.jewelRadius) do - local outerSize = radData.outer * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale - local innerSize = radData.inner * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale - -- Jewel in socket is not Thread of Hope or similar, draw normal jewel radius + else + -- Standard jewel: draw the full-disc radii (inner == 0) if innerSize == 0 then SetDrawColor(radData.col) DrawImage(self.ring, scrX - outerSize, scrY - outerSize, outerSize * 2, outerSize * 2) end end end - elseif node.alloc then - if jewel and jewel.jewelRadiusIndex then - -- Draw only the selected jewel radius - local radData = build.data.jewelRadius[jewel.jewelRadiusIndex] - local outerSize = radData.outer * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale - local innerSize = radData.inner * data.gameConstants["PassiveTreeJewelDistanceMultiplier"] * scale * 1.06 - SetDrawColor(1,1,1,0.7) - if jewel.title == "From Nothing" then - -- From Nothing ring shows on the allocated Keystone - for keystoneName, _ in pairs(jewel.jewelData.fromNothingKeystones) do - local keystone = spec.tree.keystoneMap[keystoneName] - if keystone and keystone.x and keystone.y then - innerSize = 150 * scale - local keyX, keyY = treeToScreen(keystone.x, keystone.y) - self:DrawImageRotated(self.jewelShadedOuterRing, keyX, keyY, outerSize * 2, outerSize * 2, -0.7) - self:DrawImageRotated(self.jewelShadedOuterRingFlipped, keyX, keyY, outerSize * 2, outerSize * 2, 0.7) - self:DrawImageRotated(self.jewelShadedInnerRing, keyX, keyY, innerSize * 2, innerSize * 2, -0.7) - self:DrawImageRotated(self.jewelShadedInnerRingFlipped, keyX, keyY, innerSize * 2, innerSize * 2, 0.7) - end - end - elseif jewel.jewelData and jewel.jewelData.conqueredBy and jewel.jewelData.conqueredBy.conqueror and jewel.jewelData.conqueredBy.conqueror.type then - local conqueror = jewel.jewelData.conqueredBy.conqueror.type - if conqueror == "kalguur" then - conqueror = "kalguuran" - end - local circle1 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/passiveskillscreen".. conqueror .."jewelcircle1.dds") - local circle2 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/passiveskillscreen".. conqueror .."jewelcircle2.dds") - if conqueror == "abyss" then - circle1 = tree:GetAssetByName("art/textures/interface/2d/2dart/uiimages/ingame/".. conqueror .."/".. conqueror .."passiveskillscreenjewelcircle1.dds") - circle2 = circle1 - end - self:DrawImageRotated(circle1.handle, scrX, scrY, outerSize * 2, outerSize * 2, -0.7, unpack(circle1)) - self:DrawImageRotated(circle2.handle, scrX, scrY, outerSize * 2, outerSize * 2, 0.7, unpack(circle2)) - else - self:DrawImageRotated(self.jewelShadedOuterRing, scrX, scrY, outerSize * 2, outerSize * 2, -0.7) - self:DrawImageRotated(self.jewelShadedOuterRingFlipped, scrX, scrY, outerSize * 2, outerSize * 2, 0.7) - - self:DrawImageRotated(self.jewelShadedInnerRing, scrX, scrY, innerSize * 2, innerSize * 2, -0.7) - self:DrawImageRotated(self.jewelShadedInnerRingFlipped, scrX, scrY, innerSize * 2, innerSize * 2, 0.7) - end + end + if node.alloc or (compareNode and compareNode.alloc) then + local pHasRadius = jewel and jewel.jewelRadiusIndex + local cHasRadius = cJewel and cJewel.jewelRadiusIndex + local sameJewel = jewel and cJewel and jewel.name == cJewel.name + if pHasRadius then + local tint = (not self.compareSpec or sameJewel) and JEWEL_RADIUS_TINT_NEUTRAL or JEWEL_RADIUS_TINT_PRIMARY_ONLY + drawJewelRadius(jewel, scrX, scrY, tint) + end + if cHasRadius and not sameJewel then + drawJewelRadius(cJewel, scrX, scrY, JEWEL_RADIUS_TINT_COMPARE_ONLY) end end end @@ -1445,16 +1457,33 @@ function PassiveTreeViewClass:AddNodeTooltip(tooltip, node, build, incSmallPassi local fontSizeBig = main.showFlavourText and 18 or 16 tooltip.center = true tooltip.maxWidth = 800 + -- Appends the compare spec's jewel tooltip if it has a jewel in this socket + local function addCompareJewelSection(socket, withLabel) + local cJewel = self.compareSpec and self:GetCompareJewel(node.id) + local cAllocated = self.compareSpec and self.compareSpec.allocNodes and self.compareSpec.allocNodes[node.id] + if not cJewel or not cAllocated then return false end + if withLabel then + tooltip:AddSeparator(14) + tooltip:AddLine(14, colorCodes.DEXTERITY .. "Compared build:") + end + self.compareSpec.build.itemsTab:AddItemTooltip(tooltip, cJewel, socket) + return true + end + -- Special case for sockets if (node.type == "Socket" or node.containJewelSocket) and node.alloc then local socket, jewel = build.itemsTab:GetSocketAndJewelForNodeID(node.id) + local cJewel = self.compareSpec and self:GetCompareJewel(node.id) or nil if jewel then build.itemsTab:AddItemTooltip(tooltip, jewel, socket) + if cJewel and cJewel.name ~= jewel.name then + addCompareJewelSection(socket, true) + end if node.distanceToClassStart and node.distanceToClassStart > 0 then tooltip:AddSeparator(14) tooltip:AddLine(16, string.format("^7Distance to start: %d", node.distanceToClassStart)) end - else + elseif not addCompareJewelSection(socket, false) then self:AddNodeName(tooltip, node, build) end tooltip:AddSeparator(14) @@ -1469,16 +1498,9 @@ function PassiveTreeViewClass:AddNodeTooltip(tooltip, node, build, incSmallPassi end -- For unallocated sockets, show compare build's jewel if it has one - if node.type == "Socket" and not node.alloc and self.compareSpec then - local cJewel = self:GetCompareJewel(node.id) - local cItemsTab = self.compareSpec.build and self.compareSpec.build.itemsTab - local cAllocated = self.compareSpec.allocNodes and self.compareSpec.allocNodes[node.id] - if cJewel and cAllocated then - -- Show the compare build's jewel tooltip instead of generic socket info - local socket = build.itemsTab:GetSocketAndJewelForNodeID(node.id) - cItemsTab:AddItemTooltip(tooltip, cJewel, socket) - tooltip:AddSeparator(14) - tooltip:AddLine(14, colorCodes.DEXTERITY .. "Jewel from compared build") + if node.type == "Socket" and not node.alloc then + local socket = build.itemsTab:GetSocketAndJewelForNodeID(node.id) + if addCompareJewelSection(socket, false) then tooltip:AddLine(14, colorCodes.TIP.."Tip: Hold Shift or Ctrl to hide this tooltip.") return end