Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
6c1d128
remove Variant, AltQual, QualityId from SkillsTab and every damn plac…
Peechey Mar 3, 2026
d2cb398
clean up old list, re add variant
Peechey Mar 3, 2026
5d120e0
separate dropdown for imbued support, import, save/load
Peechey Mar 15, 2026
c244ce3
disable imbued for other socketGroups of a slot if another already ha…
Peechey Mar 16, 2026
8a03334
clean up old code
Peechey Mar 16, 2026
e8c32b9
refactor to use GemSelectControl, dps sort integrated into new imbued…
Peechey Mar 18, 2026
b79243f
comments
Peechey Mar 18, 2026
30cdcfb
add gem color to text
Peechey Mar 19, 2026
0f5514b
comments
Peechey Mar 19, 2026
86901ca
remove unused code
Peechey Mar 19, 2026
dfd3a21
remove more unused code
Peechey Mar 19, 2026
4f49335
pr comments: tooltip showing for imbued, use better field for text co…
Peechey Mar 22, 2026
3f8d4c0
fix quality tooltip to show quality lines that were previously on var…
Peechey Apr 13, 2026
f2f1be3
Merge branch 'dev' into feature/imbued-support-implementation
Peechey Apr 13, 2026
9803db6
pr comments (clean up, tooltip update, UI change)
Peechey Apr 14, 2026
71eeba7
Fix sort list
Apr 14, 2026
17571b6
Remove more quality lines
Apr 14, 2026
79c5abb
Merge branch 'dev' into feature/imbued-support-implementation
Apr 14, 2026
d18b835
Fix imbued gem overwrite on import
Apr 14, 2026
5766193
Fix issue when swapping weapon slots
Apr 14, 2026
82a0b04
Fix imbued supports blocking other skill sets
Apr 14, 2026
86c1512
Fix item granted supports regression
Apr 14, 2026
7536d38
Fix crash on clicking on imbued slot with no active skill gem
Apr 14, 2026
3d73327
Fix Imbued supports not being reset on socket delete or wipe
Apr 14, 2026
456bb41
Merge branch 'dev' into feature/imbued-support-implementation
Apr 14, 2026
0b8a522
Only use sort cache on support for imbued dropdown making it way faster
Apr 14, 2026
bc9399c
Fix invisible support and active boxes applying when clicking on box
Apr 14, 2026
3030b9e
Fix imbued support dropdown showing legacy Awakened gems
Wires77 Apr 15, 2026
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
118 changes: 64 additions & 54 deletions src/Classes/GemSelectControl.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ local m_max = math.max
local m_floor = math.floor

local toolTipText = "Prefix tag searches with a colon and exclude tags with a dash. e.g. :fire:lightning:-cold:area"
local imbuedTooltipText = "Socketed in must be set in order to add an imbued support.\nOnly one imbued support is allowed per socketed in."
local altQualMap = {
Comment thread
Peechey marked this conversation as resolved.
Outdated
["Default"] = "",
["Alternate1"] = "Anomalous ",
["Alternate2"] = "Divergent ",
["Alternate3"] = "Phantasmal ",
}

local GemSelectClass = newClass("GemSelectControl", "EditControl", function(self, anchor, rect, skillsTab, index, changeFunc, forceTooltip)
local GemSelectClass = newClass("GemSelectControl", "EditControl", function(self, anchor, rect, skillsTab, index, changeFunc, forceTooltip, imbued)
self.EditControl(anchor, rect, nil, nil, "^ %a':-")
self.controls.scrollBar = new("ScrollBarControl", { "TOPRIGHT", self, "TOPRIGHT" }, {-1, 0, 18, 0}, (self.height - 4) * 4)
self.controls.scrollBar.y = function()
Expand Down Expand Up @@ -56,6 +57,7 @@ local GemSelectClass = newClass("GemSelectControl", "EditControl", function(self
lifeReservationFlat = "Life",
lifeReservationPercent = "LifePercent",
}
self.imbuedSelect = imbued
end)

function GemSelectClass:CalcOutputWithThisGem(calcFunc, gemData, qualityId, useFullDPS)
Expand All @@ -81,7 +83,7 @@ function GemSelectClass:CalcOutputWithThisGem(calcFunc, gemData, qualityId, useF

-- Create gemInstance to represent the hovered gem
local gemInstance = gemList[self.index]
gemInstance.level = self.skillsTab:ProcessGemLevel(gemData)
gemInstance.level = self.skillsTab:ProcessGemLevel(gemData, self.imbuedSelect)
gemInstance.gemData = gemData
gemInstance.displayEffect = nil
if gemInstance.qualityId == nil or gemInstance.qualityId == "" then
Expand Down Expand Up @@ -120,21 +122,15 @@ function GemSelectClass:PopulateGemList()
self.gems["Default:" .. gemId] = gemData
end
elseif showNormal or showAll then
if self.skillsTab.showAltQualityGems and (self.skillsTab.defaultGemQuality or 0) > 0 then
for _, altQual in ipairs(self.skillsTab:getGemAltQualityList(gemData)) do
self.gems[altQual.type .. ":" .. gemId] = gemData
end
else
self.gems["Default:" .. gemId] = gemData
end
self.gems["Default:" .. gemId] = gemData
end
end
end
end
end

function GemSelectClass:GetQualityType(gemId)
return gemId and gemId:gsub(":.+","") or "Default"
function GemSelectClass:GetQualityType() -- todo: whatever is using this adds the Default quality to gems, it seems, can't fully remove yet?
return "Default"
end

function GemSelectClass:FilterSupport(gemId, gemData)
Expand All @@ -143,6 +139,11 @@ function GemSelectClass:FilterSupport(gemId, gemData)
if gemData.grantedEffect.legacy and not self.skillsTab.showLegacyGems then
return false
end

if self.imbuedSelect then
return (gemData.grantedEffect.support and not (gemData.tagString:match("Exceptional")))
end

return (not gemData.grantedEffect.support
or showSupportTypes == "ALL"
or (showSupportTypes == "NORMAL" and not (isLegacyAwakened or gemData.tagString:match("Exceptional")))
Expand Down Expand Up @@ -177,7 +178,7 @@ function GemSelectClass:BuildList(buf)
for i, pattern in ipairs(patternList) do
local matchList = { }
for gemId, gemData in pairs(self.gems) do
if self:FilterSupport(gemId, gemData) and not added[gemId] and ((" "..gemData.name:lower()):match(pattern) or altQualMap[self:GetQualityType(gemId)]:lower():match(pattern)) then
if self:FilterSupport(gemId, gemData) and not added[gemId] and ((" "..gemData.name:lower()):match(pattern)) then
addThisGem = true
if #tagsList > 0 then
for _, tag in ipairs(tagsList) do
Expand Down Expand Up @@ -259,12 +260,11 @@ function GemSelectClass:UpdateSortCache()
and sortCache.outputRevision == self.skillsTab.build.outputRevision and sortCache.defaultLevel == self.skillsTab.defaultGemLevel
and (sortCache.characterLevel == self.skillsTab.build.characterLevel or self.skillsTab.defaultGemLevel ~= "characterLevel")
and sortCache.defaultQuality == self.skillsTab.defaultGemQuality and sortCache.sortType == self.skillsTab.sortGemsByDPSField
and sortCache.considerAlternates == self.skillsTab.showAltQualityGems and sortCache.considerGemType == self.skillsTab.showSupportGemTypes
and sortCache.showLegacyGems == self.skillsTab.showLegacyGems then
and sortCache.considerGemType == self.skillsTab.showSupportGemTypes and sortCache.showLegacyGems == self.skillsTab.showLegacyGems then
return
end

if not sameSortBy or not sortCache or (sortCache.considerAlternates ~= self.skillsTab.showAltQualityGems or sortCache.considerGemType ~= self.skillsTab.showSupportGemTypes
if not sameSortBy or not sortCache or (sortCache.considerGemType ~= self.skillsTab.showSupportGemTypes
or sortCache.showLegacyGems ~= self.skillsTab.showLegacyGems
or sortCache.defaultQuality ~= self.skillsTab.defaultGemQuality
or sortCache.defaultLevel ~= self.skillsTab.defaultGemLevel
Expand All @@ -276,7 +276,6 @@ function GemSelectClass:UpdateSortCache()
-- Initialize a new sort cache
sortCache = {
considerGemType = self.skillsTab.showSupportGemTypes,
considerAlternates = self.skillsTab.showAltQualityGems,
showLegacyGems = self.skillsTab.showLegacyGems,
socketGroup = self.skillsTab.displayGroup,
gemInstance = self.skillsTab.displayGroup.gemList[self.index],
Expand Down Expand Up @@ -471,9 +470,6 @@ function GemSelectClass:Draw(viewPort, noTooltip)
end
end
local gemText = gemData and gemData.name or "<No matches>"
if gemId and gemId ~= "" then
gemText = altQualMap[self:GetQualityType(gemId)] .. gemText
end
DrawString(0, y, "LEFT", height - 4, "VAR", gemText)
if gemData then
if gemData.grantedEffect.support and self.sortCache.canSupport[gemId] then
Expand All @@ -495,7 +491,7 @@ function GemSelectClass:Draw(viewPort, noTooltip)
local qualityType = self:GetQualityType(self.list[self.hoverSel])
local output= self:CalcOutputWithThisGem(calcFunc, gemData, qualityType, self.skillsTab.sortGemsByDPSField == "FullDPS")
local gemInstance = {
level = self.skillsTab:ProcessGemLevel(gemData),
level = self.skillsTab:ProcessGemLevel(gemData, self.imbuedSelect),
qualityId = qualityType,
quality = self.skillsTab.defaultGemQuality or 0,
count = 1,
Expand Down Expand Up @@ -536,45 +532,59 @@ function GemSelectClass:Draw(viewPort, noTooltip)
local gemInstance = self.skillsTab.displayGroup.gemList[self.index]
local cursorX, cursorY = GetCursorPos()
self.tooltip:Clear()

if hoverControl and hoverControl.imbuedSelect then -- tooltip for imbued
gemInstance = { }
if type(hoverControl.gemId) == "string" then -- on select
gemInstance["gemData"] = hoverControl.gems[hoverControl.gemId]
else -- on load
gemInstance["gemData"] = hoverControl.gemId
end
gemInstance.level = 1
gemInstance.quality = 0
end

if gemInstance and gemInstance.gemData then
-- Check valid qualityId, set to 'Default' if missing
if gemInstance.qualityId == nil or gemInstance.qualityId == "" then
gemInstance.qualityId = "Default"
end
self:AddGemTooltip(gemInstance)
else
self.tooltip:AddLine(16, toolTipText)
end
self.tooltip:AddLine(16, self.imbuedSelect and imbuedTooltipText or toolTipText)
end

if not self.imbuedSelect then
colorS = 0.5
colorA = 0.5
if cursorX > (x + width - 18) then
colorS = 1
self.tooltip:Clear()
self.tooltip:AddLine(16, "Only show Support gems")
elseif (cursorX > (x + width - 40) and cursorX < (cursorX + width - 20)) then
colorA = 1
self.tooltip:Clear()
self.tooltip:AddLine(16, "Only show Active gems")
end

colorS = 0.5
colorA = 0.5
if cursorX > (x + width - 18) then
colorS = 1
self.tooltip:Clear()
self.tooltip:AddLine(16, "Only show Support gems")
elseif (cursorX > (x + width - 40) and cursorX < (cursorX + width - 20)) then
colorA = 1
self.tooltip:Clear()
self.tooltip:AddLine(16, "Only show Active gems")
end

-- support shortcut
sx = x + width - 16 - 2
SetDrawColor(colorS,colorS,colorS)
DrawImage(nil, sx, y+2, 16, height-4)
SetDrawColor(0,0,0)
DrawImage(nil, sx+1, y+2, 16-2, height-4)
SetDrawColor(colorS,colorS,colorS)
DrawString(sx + 8, y, "CENTER_X", height - 2, "VAR", "S")

-- active shortcut
sx = x + width - (16*2) - (2*2)
SetDrawColor(colorA,colorA,colorA)
DrawImage(nil, sx, y+2, 16, height-4)
SetDrawColor(0,0,0)
DrawImage(nil, sx+1, y+2, 16-2, height-4)
SetDrawColor(colorA,colorA,colorA)
DrawString(sx + 8, y, "CENTER_X", height - 2, "VAR", "A")
-- support shortcut
sx = x + width - 16 - 2
SetDrawColor(colorS,colorS,colorS)
DrawImage(nil, sx, y+2, 16, height-4)
SetDrawColor(0,0,0)
DrawImage(nil, sx+1, y+2, 16-2, height-4)
SetDrawColor(colorS,colorS,colorS)
DrawString(sx + 8, y, "CENTER_X", height - 2, "VAR", "S")

-- active shortcut
sx = x + width - (16*2) - (2*2)
SetDrawColor(colorA,colorA,colorA)
DrawImage(nil, sx, y+2, 16, height-4)
SetDrawColor(0,0,0)
DrawImage(nil, sx+1, y+2, 16-2, height-4)
SetDrawColor(colorA,colorA,colorA)
DrawString(sx + 8, y, "CENTER_X", height - 2, "VAR", "A")
end

SetDrawLayer(nil, 10)
self.tooltip:Draw(x, y, width, height, viewPort)
Expand All @@ -599,7 +609,7 @@ function GemSelectClass:AddGemTooltip(gemInstance)
if secondary and (not secondary.support or gemInstance.gemData.secondaryEffectName) then
local grantedEffect = gemInstance.gemData.VaalGem and secondary or primary
local grantedEffectSecondary = gemInstance.gemData.VaalGem and primary or secondary
self.tooltip:AddLine(fontSizeTitle, colorCodes.GEM .. altQualMap[gemInstance.qualityId]..grantedEffect.name, "FONTIN SC")
self.tooltip:AddLine(fontSizeTitle, colorCodes.GEM..grantedEffect.name, "FONTIN SC")
self.tooltip:AddSeparator(10)
self.tooltip:AddLine(fontSizeBig, "^x7F7F7F" .. gemInstance.gemData.tagString, "FONTIN SC")
self:AddCommonGemInfo(gemInstance, grantedEffect, true)
Expand All @@ -609,7 +619,7 @@ function GemSelectClass:AddGemTooltip(gemInstance)
self:AddCommonGemInfo(gemInstance, grantedEffectSecondary)
else
local grantedEffect = gemInstance.gemData.grantedEffect
self.tooltip:AddLine(fontSizeTitle, colorCodes.GEM .. altQualMap[gemInstance.qualityId]..grantedEffect.name, "FONTIN SC")
self.tooltip:AddLine(fontSizeTitle, colorCodes.GEM..grantedEffect.name, "FONTIN SC")
self.tooltip:AddSeparator(10)
if grantedEffect.legacy then
self.tooltip:AddLine(fontSizeTitle, colorCodes.WARNING .. "Legacy Gem", "FONTIN SC")
Expand Down Expand Up @@ -912,4 +922,4 @@ function GemSelectClass:OnKeyUp(key)
end
local newSel = self.EditControl:OnKeyUp(key)
return newSel == self.EditControl and self or newSel
end
end
8 changes: 6 additions & 2 deletions src/Classes/ImportTab.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1116,11 +1116,11 @@ function ImportTabClass:ImportSocketedItems(item, socketedItems, slotName)
self:ImportItem(socketedItem, slotName .. " Abyssal Socket "..abyssalSocketId)
abyssalSocketId = abyssalSocketId + 1
else
local normalizedBasename, qualityType = self.build.skillsTab:GetBaseNameAndQuality(socketedItem.typeLine, nil)
local normalizedBasename, qualityType = sanitiseText(socketedItem.typeLine)
local gemId = self.build.data.gemForBaseName[normalizedBasename:lower()]
if socketedItem.hybrid then
-- Used by transfigured gems and dual-skill gems (currently just Stormbind)
normalizedBasename, qualityType = self.build.skillsTab:GetBaseNameAndQuality(socketedItem.hybrid.baseTypeName, nil)
normalizedBasename, qualityType = sanitiseText(socketedItem.hybrid.baseTypeName)
gemId = self.build.data.gemForBaseName[normalizedBasename:lower()]
if gemId and socketedItem.hybrid.isVaalGem then
gemId = self.build.data.gemGrantedEffectIdForVaalGemId[self.build.data.gems[gemId].grantedEffectId]
Expand Down Expand Up @@ -1149,6 +1149,10 @@ function ImportTabClass:ImportSocketedItems(item, socketedItems, slotName)
else
t_insert(socketGroup.gemList, gemInstance)
end
if socketedItem.builtInSupport then
socketGroup.imbuedSupport = socketedItem.builtInSupport:gsub("Supported by Level 1 ", "")
self.build.skillsTab.controls.imbuedSupport.gemChangeFunc(data.gems[data.gemForBaseName[socketGroup.imbuedSupport:lower().." support"]], nil, nil, slotName)
end
end
end
end
Expand Down
Loading
Loading