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
165 changes: 86 additions & 79 deletions src/Classes/Tooltip.lua
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,84 @@ for _, recipeName in pairs(recipeNames) do
recipeImages[recipeName]:Load("TreeData/" .. recipeName .. ".png", "CLAMP")
end


-- spell-checker: disable
local headerConfigs = {
RELIC = {left="Assets/itemsheaderfoilleft.png",middle="Assets/itemsheaderfoilmiddle.png",right="Assets/itemsheaderfoilright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
UNIQUE = {left="Assets/itemsheaderuniqueleft.png",middle="Assets/itemsheaderuniquemiddle.png",right="Assets/itemsheaderuniqueright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
RARE = {left="Assets/itemsheaderrareleft.png",middle="Assets/itemsheaderraremiddle.png",right="Assets/itemsheaderrareright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
MAGIC = {left="Assets/itemsheadermagicleft.png",middle="Assets/itemsheadermagicmiddle.png",right="Assets/itemsheadermagicright.png",height=38,sideWidth=32,middleWidth=32,textYOffset=6,allowInfluenceIcon=true},
NORMAL = {left="Assets/itemsheaderwhiteleft.png",middle="Assets/itemsheaderwhitemiddle.png",right="Assets/itemsheaderwhiteright.png",height=38,sideWidth=32,middleWidth=32,textYOffset=6,allowInfluenceIcon=true},
GEM = {left="Assets/itemsheadergemleft.png",middle="Assets/itemsheadergemmiddle.png",right="Assets/itemsheadergemright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=5},
JEWEL = {left="Assets/jewelpassiveheaderleft.png",middle="Assets/jewelpassiveheadermiddle.png",right="Assets/jewelpassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
NOTABLE = {left="Assets/notablepassiveheaderleft.png",middle="Assets/notablepassiveheadermiddle.png",right="Assets/notablepassiveheaderright.png",height=38,sideWidth=38,middleWidth=38,textYOffset=6},
PASSIVE = {left="Assets/normalpassiveheaderleft.png",middle="Assets/normalpassiveheadermiddle.png",right="Assets/normalpassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
KEYSTONE = {left="Assets/keystonepassiveheaderleft.png",middle="Assets/keystonepassiveheadermiddle.png",right="Assets/keystonepassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
ASCENDANCY = {left="Assets/ascendancypassiveheaderleft.png",middle="Assets/ascendancypassiveheadermiddle.png",right="Assets/ascendancypassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
MASTERY = {left="Assets/masteryheaderunallocatedleft.png",middle="Assets/masteryheaderunallocatedmiddle.png",right="Assets/masteryheaderunallocatedright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
MASTERYALLOC = {left="Assets/masteryheaderallocatedleft.png",middle="Assets/masteryheaderallocatedmiddle.png",right="Assets/masteryheaderallocatedright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
}
local headerInfluence = {
Fractured = "Assets/fracturedicon.png",
Veiled = "Assets/veiledicon.png",
Shaper = "Assets/shapericon.png",
Elder = "Assets/eldericon.png",
Redeemer = "Assets/redeemericon.png",
Hunter = "Assets/huntericon.png",
Crusader = "Assets/crusadericon.png",
Warlord = "Assets/warlordicon.png",
Eater = "Assets/eatericon.png",
Exarch = "Assets/exarchicon.png",
Synthesis = "Assets/synthesisicon.png",
Experimented = "Assets/experimentedicon.png",
Foulborn = "Assets/breachicon.png",
Memory = "Assets/memoryicon.png",
Vestigial = "Assets/vestigialicon.png",
}
local separatorConfigs = {
RELIC = "Assets/itemsseparatorfoil.png",
UNIQUE = "Assets/itemsseparatorunique.png",
RARE = "Assets/itemsseparatorrare.png",
MAGIC = "Assets/itemsseparatormagic.png",
NORMAL = "Assets/itemsseparatorwhite.png",
GEM = "Assets/itemsseparatorgem.png",
}
-- spell-checker: enable

-- Cache tooltip assets
local tooltipAssetCache = {
header = {},
influence = {},
separator = {},
}

local function getCachedImage(cache, key, path)
local image = cache[key]

if image == nil then
image = NewImageHandle()
image:Load(path)
cache[key] = image
end

return image
end

local function getHeaderImage(rarity, location)
local key = rarity .. ":" .. location
return getCachedImage(tooltipAssetCache.header, key, headerConfigs[rarity][location])
end

local function getInfluenceIconImage(influence)
return getCachedImage(tooltipAssetCache.influence, influence, headerInfluence[influence])
end

local function getSeparatorImage(rarity)
local path = separatorConfigs[rarity] or separatorConfigs["NORMAL"]
return getCachedImage(tooltipAssetCache.separator, rarity, path)
end


---@class Tooltip
local TooltipClass = newClass("Tooltip")

Expand Down Expand Up @@ -130,25 +208,7 @@ function TooltipClass:AddSeparator(size)

if self.tooltipHeader then
local rarity = tostring(self.tooltipHeader):upper()
-- spell-checker: disable
local separatorConfigs = {
RELIC = "Assets/itemsseparatorfoil.png",
UNIQUE = "Assets/itemsseparatorunique.png",
RARE = "Assets/itemsseparatorrare.png",
MAGIC = "Assets/itemsseparatormagic.png",
NORMAL = "Assets/itemsseparatorwhite.png",
GEM = "Assets/itemsseparatorgem.png",
}
-- spell-checker: enable
local separatorPath = separatorConfigs[rarity] or separatorConfigs.NORMAL

if not self.separatorImage or self.separatorImagePath ~= separatorPath then
self.separatorImage = NewImageHandle()
self.separatorImage:Load(separatorPath)
self.separatorImagePath = separatorPath
end

separatorImage = self.separatorImage
separatorImage = getSeparatorImage(rarity)
end

local lastBlock = lastLine and lastLine.block or 1
Expand Down Expand Up @@ -297,7 +357,7 @@ function TooltipClass:CalculateColumns(ttY, ttX, ttH, ttW, viewPort)
end
local lineX = lineCentered and (x + ttW / 2) or (x + (H_PAD / 2))
local lineAlign = lineCentered and "CENTER_X" or "LEFT"

local stackEntry = {lineX, y, lineAlign, data.size, font, data.text}
if data.modLine and data.modLine.disabled then
stackEntry.strikethrough = true
Expand Down Expand Up @@ -390,40 +450,6 @@ function TooltipClass:Draw(x, y, w, h, viewPort)
ttW = titleW + 50
end
end
-- spell-checker: disable
local headerInfluence = {
Fractured = "Assets/fracturedicon.png",
Veiled = "Assets/veiledicon.png",
Shaper = "Assets/shapericon.png",
Elder = "Assets/eldericon.png",
Redeemer = "Assets/redeemericon.png",
Hunter = "Assets/huntericon.png",
Crusader = "Assets/crusadericon.png",
Warlord = "Assets/warlordicon.png",
Eater = "Assets/eatericon.png",
Exarch = "Assets/exarchicon.png",
Synthesis = "Assets/synthesisicon.png",
Experimented = "Assets/experimentedicon.png",
Foulborn = "Assets/breachicon.png",
Memory = "Assets/memoryicon.png",
Vestigial = "Assets/vestigialicon.png",
}
local headerConfigs = {
RELIC = {left="Assets/itemsheaderfoilleft.png",middle="Assets/itemsheaderfoilmiddle.png",right="Assets/itemsheaderfoilright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
UNIQUE = {left="Assets/itemsheaderuniqueleft.png",middle="Assets/itemsheaderuniquemiddle.png",right="Assets/itemsheaderuniqueright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
RARE = {left="Assets/itemsheaderrareleft.png",middle="Assets/itemsheaderraremiddle.png",right="Assets/itemsheaderrareright.png",height=54,sideWidth=47,middleWidth=52,textYOffset=3,allowInfluenceIcon=true},
MAGIC = {left="Assets/itemsheadermagicleft.png",middle="Assets/itemsheadermagicmiddle.png",right="Assets/itemsheadermagicright.png",height=38,sideWidth=32,middleWidth=32,textYOffset=6,allowInfluenceIcon=true},
NORMAL = {left="Assets/itemsheaderwhiteleft.png",middle="Assets/itemsheaderwhitemiddle.png",right="Assets/itemsheaderwhiteright.png",height=38,sideWidth=32,middleWidth=32,textYOffset=6,allowInfluenceIcon=true},
GEM = {left="Assets/itemsheadergemleft.png",middle="Assets/itemsheadergemmiddle.png",right="Assets/itemsheadergemright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=5},
JEWEL = {left="Assets/jewelpassiveheaderleft.png",middle="Assets/jewelpassiveheadermiddle.png",right="Assets/jewelpassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
NOTABLE = {left="Assets/notablepassiveheaderleft.png",middle="Assets/notablepassiveheadermiddle.png",right="Assets/notablepassiveheaderright.png",height=38,sideWidth=38,middleWidth=38,textYOffset=6},
PASSIVE = {left="Assets/normalpassiveheaderleft.png",middle="Assets/normalpassiveheadermiddle.png",right="Assets/normalpassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
KEYSTONE = {left="Assets/keystonepassiveheaderleft.png",middle="Assets/keystonepassiveheadermiddle.png",right="Assets/keystonepassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
ASCENDANCY = {left="Assets/ascendancypassiveheaderleft.png",middle="Assets/ascendancypassiveheadermiddle.png",right="Assets/ascendancypassiveheaderright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
MASTERY = {left="Assets/masteryheaderunallocatedleft.png",middle="Assets/masteryheaderunallocatedmiddle.png",right="Assets/masteryheaderunallocatedright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
MASTERYALLOC = {left="Assets/masteryheaderallocatedleft.png",middle="Assets/masteryheaderallocatedmiddle.png",right="Assets/masteryheaderallocatedright.png",height=38,sideWidth=33,middleWidth=38,textYOffset=6},
}
-- spell-checker: enable
local config
if self.tooltipHeader and main.showFlavourText and self.lines[1] and self.lines[1].text then
local rarity = tostring(self.tooltipHeader):upper()
Expand Down Expand Up @@ -483,18 +509,6 @@ function TooltipClass:Draw(x, y, w, h, viewPort)

self.titleYOffset = config.textYOffset or 0

if not self.headerLeft or self.headerLeftPath ~= config.left then
self.headerLeft = NewImageHandle()
self.headerLeft:Load(config.left)
self.headerLeftPath = config.left
self.headerMiddle = NewImageHandle()
self.headerMiddle:Load(config.middle)
self.headerMiddlePath = config.middle
self.headerRight = NewImageHandle()
self.headerRight:Load(config.right)
self.headerRightPath = config.right
end

local headerHeight = config.height
local headerSideWidth = config.sideWidth
local headerMiddleWidth = config.middleWidth
Expand All @@ -504,13 +518,6 @@ function TooltipClass:Draw(x, y, w, h, viewPort)
local headerTotalWidth = ttW - 2 * BORDER_WIDTH
local headerMiddleAreaWidth = m_max(0, headerTotalWidth - 2 * headerSideWidth)

if self.influenceHeader1 then
self.influenceIcon1 = NewImageHandle()
self.influenceIcon1:Load(headerInfluence[self.influenceHeader1])
self.influenceIcon2 = NewImageHandle()
self.influenceIcon2:Load(headerInfluence[self.influenceHeader2])
end

local foilTypes = {
["Rainbow"] = {0.6, 1, 0.5},
["Amethyst"] = {0.9, 0.6, 1},
Expand All @@ -536,10 +543,10 @@ function TooltipClass:Draw(x, y, w, h, viewPort)
end
end
-- Draw left cap first, then influence icon on top
DrawImage(self.headerLeft, headerX, headerY, headerSideWidth, headerHeight)
DrawImage(getHeaderImage(rarity, "left"), headerX, headerY, headerSideWidth, headerHeight)
if self.influenceHeader1 and config.allowInfluenceIcon then
SetDrawColor(1, 1, 1)
DrawImage(self.influenceIcon1, headerX + 2, headerY + (headerHeight - (headerHeight/2))/2, headerHeight/2, headerHeight/2)
DrawImage(getInfluenceIconImage(self.influenceHeader1), headerX + 2, headerY + (headerHeight - (headerHeight/2))/2, headerHeight/2, headerHeight/2)
end

if self.tooltipHeader == "RELIC" then
Expand All @@ -556,20 +563,20 @@ function TooltipClass:Draw(x, y, w, h, viewPort)
local drawX = headerX + headerSideWidth
local endX = headerX + headerTotalWidth - headerSideWidth
while drawX + headerMiddleWidth <= endX do
DrawImage(self.headerMiddle, drawX, headerY, headerMiddleWidth, headerHeight)
DrawImage(getHeaderImage(rarity, "middle"), drawX, headerY, headerMiddleWidth, headerHeight)
drawX = drawX + headerMiddleWidth
end
local remainingWidth = endX - drawX
if remainingWidth > 0 then
DrawImage(self.headerMiddle, drawX, headerY, remainingWidth, headerHeight)
DrawImage(getHeaderImage(rarity, "middle"), drawX, headerY, remainingWidth, headerHeight)
end
end

-- Draw right cap
DrawImage(self.headerRight, headerX + headerTotalWidth - headerSideWidth, headerY, headerSideWidth, headerHeight)
DrawImage(getHeaderImage(rarity, "right"), headerX + headerTotalWidth - headerSideWidth, headerY, headerSideWidth, headerHeight)
if self.influenceHeader2 and config.allowInfluenceIcon then
SetDrawColor(1, 1, 1)
DrawImage(self.influenceIcon2, headerX + headerTotalWidth - (headerHeight/2) - 2, headerY + (headerHeight - (headerHeight/2))/2, headerHeight/2, headerHeight/2)
DrawImage(getInfluenceIconImage(self.influenceHeader2), headerX + headerTotalWidth - (headerHeight/2) - 2, headerY + (headerHeight - (headerHeight/2))/2, headerHeight/2, headerHeight/2)
end
end

Expand Down
Loading