Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
148 changes: 85 additions & 63 deletions src/Classes/PassiveTreeView.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand Down
Loading