Skip to content

Commit d54c7aa

Browse files
vaisestLocalIdentity
andauthored
Fix and add support for Triad Grip 3.29 (#9987)
* Fix and add support for Triad Grip 3.29 * Fix issues * Move logic --------- Co-authored-by: LocalIdentity <localidentity2@gmail.com>
1 parent ed5510b commit d54c7aa

4 files changed

Lines changed: 54 additions & 13 deletions

File tree

spec/System/TestItemMods_spec.lua

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,18 @@ describe("TetsItemMods", function()
6767
assert.are_not.equals(lightningResBefore, build.calcsTab.mainOutput.LightningResist)
6868
end)
6969

70+
it("caps socketed gem multipliers in gem order", function()
71+
build.itemsTab:CreateDisplayItemFromRaw("Test Gloves\nIron Gauntlets\nSockets: R-R-R-R")
72+
build.itemsTab:AddDisplayItem()
73+
build.skillsTab:PasteSocketGroup("Slot: Gloves\nHeavy Strike 20/0 1\nHeavy Strike 20/0 1\nHeavy Strike 20/0 1\nHeavy Strike 20/0 1\nArc 20/0 1\n")
74+
runCallback("OnFrame")
75+
76+
local multipliers = build.calcsTab.mainEnv.itemModDB.multipliers
77+
assert.are.equals(4, multipliers.SocketedGemsInGloves)
78+
assert.are.equals(4, multipliers.SocketedRedGemsInGloves)
79+
assert.are.equals(0, multipliers.SocketedBlueGemsInGloves)
80+
end)
81+
7082
it("Doomsower vaal pact and extra phys as fire", function()
7183
build.itemsTab:CreateDisplayItemFromRaw([[Doomsower
7284
Lion Sword

src/Data/ModCache.lua

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10068,12 +10068,12 @@ c["Minions cannot be Blinded Minions have 15% chance to Blind Enemies on hit"]={
1006810068
c["Minions cannot be Killed, but die 6 seconds after being reduced to 1 Life"]={nil,"cannot be Killed, but die 6 seconds after being reduced to 1 Life "}
1006910069
c["Minions convert 25% of Physical Damage to Chaos Damage per Empty Socket"]={{[1]={[1]={type="Multiplier",var="EmptySocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToChaos",type="BASE",value=25}}}},nil}
1007010070
c["Minions convert 25% of Physical Damage to Chaos Damage per White Socket"]={{[1]={[1]={type="Multiplier",var="WhiteSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToChaos",type="BASE",value=25}}}},nil}
10071-
c["Minions convert 25% of Physical Damage to Cold Damage per Socketed Green Gem"]={nil,"convert 25% of Physical Damage to Cold Damage per Socketed Green Gem "}
10072-
c["Minions convert 25% of Physical Damage to Cold Damage per Socketed Green Gem Minions convert 25% of Physical Damage to Cold Damage per Green Socket"]={{[1]={[1]={type="Multiplier",var="GreenSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Physical damage to cold damage per socketed green gem minions convert 25% of physicalDamageConvertToCold",type="BASE",value=25}}}},nil}
10073-
c["Minions convert 25% of Physical Damage to Fire Damage per Socketed Red Gem"]={nil,"convert 25% of Physical Damage to Fire Damage per Socketed Red Gem "}
10074-
c["Minions convert 25% of Physical Damage to Fire Damage per Socketed Red Gem Minions convert 25% of Physical Damage to Fire Damage per Red Socket"]={{[1]={[1]={type="Multiplier",var="RedSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Physical damage to fire damage per socketed red gem minions convert 25% of physicalDamageConvertToFire",type="BASE",value=25}}}},nil}
10075-
c["Minions convert 25% of Physical Damage to Lightning Damage per Socketed Blue Gem"]={nil,"convert 25% of Physical Damage to Lightning Damage per Socketed Blue Gem "}
10076-
c["Minions convert 25% of Physical Damage to Lightning Damage per Socketed Blue Gem Minions convert 25% of Physical Damage to Lightning Damage per Blue Socket"]={{[1]={[1]={type="Multiplier",var="BlueSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Physical damage to lightning damage per socketed blue gem minions convert 25% of physicalDamageConvertToLightning",type="BASE",value=25}}}},nil}
10071+
c["Minions convert 25% of Physical Damage to Cold Damage per Green Socket"]={{[1]={[1]={type="Multiplier",var="GreenSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToCold",type="BASE",value=25}}}},nil}
10072+
c["Minions convert 25% of Physical Damage to Cold Damage per Socketed Green Gem"]={{[1]={[1]={type="Multiplier",var="SocketedGreenGemsIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToCold",type="BASE",value=25}}}},nil}
10073+
c["Minions convert 25% of Physical Damage to Fire Damage per Red Socket"]={{[1]={[1]={type="Multiplier",var="RedSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToFire",type="BASE",value=25}}}},nil}
10074+
c["Minions convert 25% of Physical Damage to Fire Damage per Socketed Red Gem"]={{[1]={[1]={type="Multiplier",var="SocketedRedGemsIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToFire",type="BASE",value=25}}}},nil}
10075+
c["Minions convert 25% of Physical Damage to Lightning Damage per Blue Socket"]={{[1]={[1]={type="Multiplier",var="BlueSocketIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToLightning",type="BASE",value=25}}}},nil}
10076+
c["Minions convert 25% of Physical Damage to Lightning Damage per Socketed Blue Gem"]={{[1]={[1]={type="Multiplier",var="SocketedBlueGemsIn{SlotName}"},flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToLightning",type="BASE",value=25}}}},nil}
1007710077
c["Minions convert 50% of Physical Damage to Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="PhysicalDamageConvertToCold",type="BASE",value=50}}}},nil}
1007810078
c["Minions count as having the same number of"]={nil,"count as having the same number of "}
1007910079
c["Minions count as having the same number of Endurance, Frenzy and Power Charges as you"]={nil,"count as having the same number of Endurance, Frenzy and Power Charges as you "}

src/Modules/CalcSetup.lua

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,13 +1189,13 @@ function calcs.initEnv(build, mode, override, specEnv)
11891189
-- Calculate socket counts
11901190
local slotEmptySocketsCount = { R = 0, G = 0, B = 0, W = 0}
11911191
local slotGemSocketsCount = 0
1192-
local socketedGems = 0
1192+
local socketedGems = { }
11931193
-- Loop through socket groups to calculate number of socketed gems
1194-
for _, socketGroup in pairs(env.build.skillsTab.socketGroupList) do
1194+
for _, socketGroup in ipairs(env.build.skillsTab.socketGroupList) do
11951195
if (not socketGroup.source and socketGroup.enabled and socketGroup.slot and socketGroup.slot == slotName and socketGroup.gemList) then
1196-
for _, gem in pairs(socketGroup.gemList) do
1196+
for _, gem in ipairs(socketGroup.gemList) do
11971197
if (gem.gemData and gem.enabled) then
1198-
socketedGems = socketedGems + 1
1198+
t_insert(socketedGems, gem)
11991199
end
12001200
end
12011201
end
@@ -1205,18 +1205,36 @@ function calcs.initEnv(build, mode, override, specEnv)
12051205
if socket.color == 'R' or socket.color == 'B' or socket.color == 'G' or socket.color == 'W' then
12061206
slotGemSocketsCount = slotGemSocketsCount + 1
12071207
-- loop through sockets indexes that are greater than number of socketed gems
1208-
if i > socketedGems then
1208+
if i > #socketedGems then
12091209
slotEmptySocketsCount[socket.color] = slotEmptySocketsCount[socket.color] + 1
12101210
end
12111211
end
12121212
end
1213-
env.itemModDB.multipliers["SocketedGemsIn"..slotName] = (env.itemModDB.multipliers["SocketedGemsIn"..slotName] or 0) + math.min(slotGemSocketsCount, socketedGems)
1213+
local socketedColours = { R = 0, G = 0, B = 0 }
1214+
-- Only gems that fit in the item's sockets contribute to multipliers
1215+
for i = 1, math.min(slotGemSocketsCount, #socketedGems) do
1216+
local tags = socketedGems[i].gemData.tags
1217+
if tags and tags.strength then
1218+
socketedColours.R = socketedColours.R + 1
1219+
end
1220+
if tags and tags.dexterity then
1221+
socketedColours.G = socketedColours.G + 1
1222+
end
1223+
if tags and tags.intelligence then
1224+
socketedColours.B = socketedColours.B + 1
1225+
end
1226+
end
1227+
env.itemModDB.multipliers["SocketedGemsIn" .. slotName] = math.min(slotGemSocketsCount, #socketedGems)
1228+
env.itemModDB.multipliers["SocketedRedGemsIn" .. slotName] = socketedColours.R
1229+
env.itemModDB.multipliers["SocketedGreenGemsIn" .. slotName] = socketedColours.G
1230+
env.itemModDB.multipliers["SocketedBlueGemsIn" .. slotName] = socketedColours.B
1231+
env.itemModDB.multipliers["EmptySocketIn" .. slotName] = math.min(slotGemSocketsCount, slotEmptySocketsCount.R + slotEmptySocketsCount.G + slotEmptySocketsCount.B + slotEmptySocketsCount.W)
12141232
env.itemModDB.multipliers.EmptyRedSocketsInAnySlot = (env.itemModDB.multipliers.EmptyRedSocketsInAnySlot or 0) + slotEmptySocketsCount.R
12151233
env.itemModDB.multipliers.EmptyGreenSocketsInAnySlot = (env.itemModDB.multipliers.EmptyGreenSocketsInAnySlot or 0) + slotEmptySocketsCount.G
12161234
env.itemModDB.multipliers.EmptyBlueSocketsInAnySlot = (env.itemModDB.multipliers.EmptyBlueSocketsInAnySlot or 0) + slotEmptySocketsCount.B
12171235
env.itemModDB.multipliers.EmptyWhiteSocketsInAnySlot = (env.itemModDB.multipliers.EmptyWhiteSocketsInAnySlot or 0) + slotEmptySocketsCount.W
12181236
-- Warn if socketed gems over socket limit
1219-
if socketedGems > slotGemSocketsCount then
1237+
if #socketedGems > slotGemSocketsCount then
12201238
env.itemWarnings.socketLimitWarning = env.itemWarnings.socketLimitWarning or { }
12211239
t_insert(env.itemWarnings.socketLimitWarning, slotName)
12221240
end

src/Modules/ModParser.lua

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,6 +1433,9 @@ local modTagList = {
14331433
["for each empty blue socket on any equipped item"] = { tag = { type = "Multiplier", var = "EmptyBlueSocketsInAnySlot" } },
14341434
["for each empty white socket on any equipped item"] = { tag = { type = "Multiplier", var = "EmptyWhiteSocketsInAnySlot" } },
14351435
["per socketed gem"] = { tag = { type = "Multiplier", var = "SocketedGemsIn{SlotName}"}},
1436+
["per socketed red gem"] = { tag = { type = "Multiplier", var = "SocketedRedGemsIn{SlotName}" } },
1437+
["per socketed green gem"] = { tag = { type = "Multiplier", var = "SocketedGreenGemsIn{SlotName}" } },
1438+
["per socketed blue gem"] = { tag = { type = "Multiplier", var = "SocketedBlueGemsIn{SlotName}" } },
14361439
["for each impale on enemy"] = { tag = { type = "Multiplier", var = "ImpaleStacks", actor = "enemy" } },
14371440
["per impale on enemy"] = { tag = { type = "Multiplier", var = "ImpaleStacks", actor = "enemy" } },
14381441
["per grasping vine"] = { tag = { type = "Multiplier", var = "GraspingVinesCount" } },
@@ -4376,6 +4379,14 @@ local specialModList = {
43764379
["minions convert (%d+)%% of (.+) damage to (.+) damage per (.+) socket"] = function(num, _, source, target, socketColor) return {
43774380
mod("MinionModifier", "LIST", { mod = mod(source:gsub("^%l", string.upper) .. "DamageConvertTo" .. target:gsub("^%l", string.upper), "BASE", num) }, { type = "Multiplier", var = socketColor:gsub("^%l", string.upper) .. "SocketIn{SlotName}" })
43784381
} end,
4382+
["minions convert (%d+)%% of (.+) damage to (.+) damage per socketed (%a+) gem"] = function(num, _, source, target, colour)
4383+
if colour == "red" or colour == "green" or colour == "blue" then
4384+
local var = string.format("Socketed%sGemsIn{SlotName}", colour:gsub("^%l", string.upper))
4385+
return {
4386+
mod("MinionModifier", "LIST", { mod = mod(source:gsub("^%l", string.upper) .. "DamageConvertTo" .. target:gsub("^%l", string.upper), "BASE", num) }, { type = "Multiplier", var = var })
4387+
}
4388+
end
4389+
end,
43794390
["minions have a (%d+)%% chance to impale on hit with attacks"] = function(num) return { mod("MinionModifier", "LIST", { mod = mod("ImpaleChance", "BASE", num ) }) } end,
43804391
["minions from herald skills deal (%d+)%% more damage"] = function(num) return { mod("MinionModifier", "LIST", { mod = mod("Damage", "MORE", num) }, { type = "SkillType", skillType = SkillType.Herald }) } end,
43814392
["minions have (%d+)%% increased movement speed for each herald affecting you"] = function(num) return { mod("MinionModifier", "LIST", { mod = mod("MovementSpeed", "INC", num, { type = "Multiplier", var = "Herald", actor = "parent" }) }) } end,

0 commit comments

Comments
 (0)