diff --git a/spec/System/TestGemSocketQuality_spec.lua b/spec/System/TestGemSocketQuality_spec.lua index 719004b176..09fb190321 100644 --- a/spec/System/TestGemSocketQuality_spec.lua +++ b/spec/System/TestGemSocketQuality_spec.lua @@ -101,6 +101,31 @@ describe("TestGemSocketQuality", function() assert.are.equals(0, build.calcsTab.mainOutput.GemQuality) end) + it("uses replacement item socket colours in item comparisons", function() + equipBody("R-R-R") + build.skillsTab:PasteSocketGroup("Slot: Body Armour\nFireball 20/0 1\nControlled Destruction 20/0 1\n") + runCallback("OnFrame") + assert.are.equals(0, build.calcsTab.mainOutput.GemQuality) + local baseDPS = build.calcsTab.mainOutput.CombinedDPS + + build.itemsTab:CreateDisplayItemFromRaw( + "Rarity: RARE\nReplacement Robe\nSage's Robe\nQuality: 0\nSockets: B-B-B\nImplicits: 0\n") + local replacement = build.itemsTab.displayItem + build.itemsTab:AddDisplayItem(true) + runCallback("OnFrame") + + local calcFunc = build.calcsTab:GetMiscCalculator() + local preview = calcFunc({ repSlotName = "Body Armour", repItem = replacement }) + assert.are.equals(10, preview.GemQuality) + assert.is_true(preview.CombinedDPS > baseDPS) + + build.itemsTab.slots["Body Armour"]:SetSelItemId(replacement.id) + build.buildFlag = true + runCallback("OnFrame") + assert.are.equals(preview.GemQuality, build.calcsTab.mainOutput.GemQuality) + assert.are.equals(preview.CombinedDPS, build.calcsTab.mainOutput.CombinedDPS) + end) + it("always grants the bonus with Dialla's 'always matches' mod", function() -- Blue gem in a red socket equipBody("R-R-R", "Gems Socketed always have the Quality bonus from Socket Colour\n") diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index de16231644..ce513c7154 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -552,9 +552,8 @@ function calcs.buildActiveSkillModList(env, activeSkill) skillModList:NewMod("GemLevel", "BASE", activeSkill.activeEffect.srcInstance and activeSkill.activeEffect.srcInstance.level or activeSkill.activeEffect.level, "Max Level") skillModList:NewMod("GemQuality", "BASE", activeSkill.activeEffect.srcInstance and activeSkill.activeEffect.srcInstance.quality or activeSkill.activeEffect.quality, "Max Quality") -- matching socket bonus - local socketMatches = activeSkill.activeEffect.srcInstance and activeSkill.activeEffect.srcInstance.matchesSocket or activeSkill.activeEffect.matchesSocket - if socketMatches then - skillModList:NewMod("GemSocketQuality", "BASE", data.misc.MatchingSocketQualityBonus, "Socket Quality") + if (activeSkill.activeEffect.socketQuality or 0) > 0 then + skillModList:NewMod("GemSocketQuality", "BASE", activeSkill.activeEffect.socketQuality, "Socket Quality") end for _, supportProperty in ipairs(skillModList:Tabulate("LIST", activeSkill.skillCfg, "SupportedGemProperty")) do local value = supportProperty.value diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index 7030116836..b4fc8affca 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -14,6 +14,21 @@ local m_min = math.min local m_max = math.max local tempTable1 = { } +local gemSocketColours = { "R", "G", "B" } + +local function getMatchingSocketQuality(env, groupCfg, gemInstance, socketIndex) + local item = groupCfg.slotName and env.player.itemList[groupCfg.slotName] + local sockets = item and item.sockets + if not sockets then + return 0 + elseif sockets.colourAlwaysMatches then + return data.misc.MatchingSocketQualityBonus + end + local grantedEffect = gemInstance.grantedEffect or (gemInstance.gemData and gemInstance.gemData.grantedEffect) + local gemColour = grantedEffect and grantedEffect.color and gemSocketColours[grantedEffect.color] + local socket = socketIndex and sockets[socketIndex] + return gemColour and socket and socket.color == gemColour and data.misc.MatchingSocketQualityBonus or 0 +end -- Initialise modifier database with stats and conditions common to all actors function calcs.initModDB(env, modDB) @@ -1600,6 +1615,17 @@ function calcs.initEnv(build, mode, override, specEnv) local supportLists = { } local groupCfgList = { } local processedSockets = {} + local socketIndexByGem = {} + local slotSocketedCounts = {} + for _, group in ipairs(build.skillsTab.socketGroupList) do + if group.slot then + local socketOffset = slotSocketedCounts[group.slot] or 0 + for gemIndex, gemInstance in ipairs(group.gemList) do + socketIndexByGem[gemInstance] = socketOffset + gemIndex + end + slotSocketedCounts[group.slot] = socketOffset + #group.gemList + end + end -- Process support gems adding them to applicable support lists for index, group in ipairs(build.skillsTab.socketGroupList) do local slot = group.slot and build.itemsTab.slots[group.slot] @@ -1677,7 +1703,8 @@ function calcs.initEnv(build, mode, override, specEnv) if not grantedEffect or not grantedEffect.support then return end - local actualQuality = gemInstance.quality + (gemInstance.matchesSocket and data.misc.MatchingSocketQualityBonus or 0) + local socketQuality = getMatchingSocketQuality(env, groupCfg, gemInstance, socketIndexByGem[gemInstance]) + local actualQuality = gemInstance.quality + socketQuality local supportEffect = { grantedEffect = grantedEffect, level = gemInstance.level, @@ -1685,7 +1712,7 @@ function calcs.initEnv(build, mode, override, specEnv) globalQuality = 0, itemQuality = 0, supportQuality = 0, - socketQuality = gemInstance.matchesSocket and data.misc.MatchingSocketQualityBonus or 0, + socketQuality = socketQuality, srcInstance = gemInstance, gemData = gemInstance.gemData, superseded = false, @@ -1754,7 +1781,8 @@ function calcs.initEnv(build, mode, override, specEnv) for index, grantedEffect in ipairs(grantedEffectList) do if not grantedEffect.support and not grantedEffect.unsupported and (not grantedEffect.hasGlobalEffect or gemInstance["enableGlobal"..index]) then slotHasActiveSkill = true - local actualQuality = gemInstance.quality + (gemInstance.matchesSocket and data.misc.MatchingSocketQualityBonus or 0) + local socketQuality = getMatchingSocketQuality(env, groupCfg, gemInstance, socketIndexByGem[gemInstance]) + local actualQuality = gemInstance.quality + socketQuality local activeEffect = { grantedEffect = grantedEffect, level = gemInstance.level, @@ -1762,7 +1790,7 @@ function calcs.initEnv(build, mode, override, specEnv) globalQuality = 0, itemQuality = 0, supportQuality = 0, - socketQuality = gemInstance.matchesSocket and data.misc.MatchingSocketQualityBonus or 0, + socketQuality = socketQuality, srcInstance = gemInstance, gemData = gemInstance.gemData, }