diff --git a/Classes/ItemSlot.lua b/Classes/ItemSlot.lua index 0a36de00..fdb6788a 100644 --- a/Classes/ItemSlot.lua +++ b/Classes/ItemSlot.lua @@ -1,31 +1,28 @@ -- Path of Building -- -- Class: Item Slot --- Item Slot control, wrapper for the basic dropdown control +-- Item Slot control, extends the basic dropdown control -- local launch, main = ... local ipairs = ipairs local t_insert = table.insert -local ItemSlotClass = common.NewClass("ItemSlot", function(self, itemsMain, x, y, slotName, slotLabel) - self.itemsMain = itemsMain - self.items = { } - self.list = { } - self.x = x - self.y = y - self.width = 320 - self.height = 20 - self.slotName = slotName - self.label = slotLabel or slotName - self.dropDown = common.New("DropDownControl", x, y, self.width, self.height, self.list, function(sel) - if self.itemsMain[sel] ~= self.selItem then - self.selItem = self.itemsMain[sel] +local ItemSlotClass = common.NewClass("ItemSlot", "DropDownControl", function(self, itemsMain, x, y, slotName, slotLabel) + self.DropDownControl(x, y, 320, 20, { }, function(sel) + if self.items[sel] ~= self.selItem then + self.selItem = self.items[sel] itemsMain:PopulateSlots() itemsMain.buildFlag = true itemsMain.modFlag = true end end) + self.itemsMain = itemsMain + self.items = { } + self.baseX = x + self.baseY = y + self.slotName = slotName + self.label = slotLabel or slotName itemsMain.slots[slotName] = self end) @@ -34,13 +31,13 @@ function ItemSlotClass:Populate() wipeTable(self.list) self.items[1] = 0 self.list[1] = "None" - self.dropDown.sel = 1 + self.sel = 1 for _, item in ipairs(self.itemsMain.list) do if self.itemsMain:IsItemValidForSlot(item, self.slotName) then t_insert(self.items, item.id) t_insert(self.list, data.colorCodes[item.rarity]..item.name) if item.id == self.selItem then - self.dropDown.sel = #self.list + self.sel = #self.list end end end @@ -49,35 +46,23 @@ function ItemSlotClass:Populate() end end -function ItemSlotClass:IsMouseOver() - return self.dropDown:IsMouseOver() -end - function ItemSlotClass:Draw(viewPort) - self.dropDown.x = viewPort.x + self.x - self.dropDown.y = viewPort.y + self.y - DrawString(self.dropDown.x - 2, self.dropDown.y + 2, "RIGHT_X", self.height - 4, "VAR", "^7"..self.label..":") - self.dropDown:Draw() - if self.dropDown:IsMouseOver() then + self.x = viewPort.x + self.baseX + self.y = viewPort.y + self.baseY + DrawString(self.x - 2, self.y + 2, "RIGHT_X", self.height - 4, "VAR", "^7"..self.label..":") + self.DropDownControl:Draw() + if self:IsMouseOver() then local ttItem - if self.dropDown.dropped then - if self.dropDown.hoverSel then - ttItem = itemsMain.list[self.items[self.dropDown.hoverSel]] + if self.dropped then + if self.hoverSel then + ttItem = self.itemsMain.list[self.items[self.hoverSel]] end elseif self.selItem and not self.itemsMain.selControl then ttItem = self.itemsMain.list[self.selItem] end if ttItem then self.itemsMain:AddItemTooltip(ttItem) - main:DrawTooltip(self.dropDown.x, self.dropDown.y, self.width, self.height, viewPort, data.colorCodes[ttItem.rarity], true) + main:DrawTooltip(self.x, self.y, self.width, self.height, viewPort, data.colorCodes[ttItem.rarity], true) end end end - -function ItemSlotClass:OnKeyDown(key) - return self.dropDown:OnKeyDown(key) -end - -function ItemSlotClass:OnKeyUp(key) - return self.dropDown:OnKeyUp(key) -end diff --git a/Classes/PassiveTreeView.lua b/Classes/PassiveTreeView.lua index 1dc864c9..51a29945 100644 --- a/Classes/PassiveTreeView.lua +++ b/Classes/PassiveTreeView.lua @@ -3,7 +3,7 @@ -- Class: Passive Tree View -- Passive skill tree viewer. -- -local launch = ... +local launch, main = ... local pairs = pairs local ipairs = ipairs @@ -12,9 +12,7 @@ local m_max = math.max local m_floor = math.floor local t_insert = table.insert -local TreeViewClass = common.NewClass("PassiveTreeView", function(self, main) - self.main = main - +local TreeViewClass = common.NewClass("PassiveTreeView", function(self) self.ring = NewImageHandle() self.ring:Load("Art/ring.png") @@ -420,7 +418,7 @@ function TreeViewClass:DrawTree(build, viewPort, inputEvents) self:AddNodeTooltip(hoverNode, build) local scrX, scrY = treeToScreen(hoverNode.x, hoverNode.y) local size = m_floor(hoverNode.size * scale) - self.main:DrawTooltip(m_floor(scrX - size), m_floor(scrY - size), size * 2, size * 2, viewPort) + main:DrawTooltip(m_floor(scrX - size), m_floor(scrY - size), size * 2, size * 2, viewPort) end SetDrawColor(0.05, 0.05, 0.05) @@ -460,22 +458,22 @@ function TreeViewClass:AddNodeTooltip(node, build) if jewel then build.items:AddItemTooltip(jewel, build) else - self.main:AddTooltipLine(24, "^7"..node.dn..(IsKeyDown("ALT") and " ["..node.id.."]" or "")) + main:AddTooltipLine(24, "^7"..node.dn..(IsKeyDown("ALT") and " ["..node.id.."]" or "")) end - self.main:AddTooltipSeperator(14) - self.main:AddTooltipLine(14, "^x80A080Tip: Right click this socket to go to the items page and choose the jewel for this socket.") + main:AddTooltipSeperator(14) + main:AddTooltipLine(14, "^x80A080Tip: Right click this socket to go to the items page and choose the jewel for this socket.") return end -- Node name - self.main:AddTooltipLine(24, "^7"..node.dn..(IsKeyDown("ALT") and " ["..node.id.."]" or "")) + main:AddTooltipLine(24, "^7"..node.dn..(IsKeyDown("ALT") and " ["..node.id.."]" or "")) if IsKeyDown("ALT") and node.power and node.power.dps then - self.main:AddTooltipLine(16, string.format("DPS power: %g Defence power: %g", node.power.dps, node.power.def)) + main:AddTooltipLine(16, string.format("DPS power: %g Defence power: %g", node.power.dps, node.power.def)) end -- Node description if node.sd[1] then - self.main:AddTooltipLine(16, "") + main:AddTooltipLine(16, "") for i, line in ipairs(node.sd) do if node.mods[i].list then if IsKeyDown("ALT") then @@ -491,22 +489,22 @@ function TreeViewClass:AddNodeTooltip(node, build) end end end - self.main:AddTooltipLine(16, "^7"..line) + main:AddTooltipLine(16, "^7"..line) end end -- Reminder text if node.reminderText then - self.main:AddTooltipSeperator(14) + main:AddTooltipSeperator(14) for _, line in ipairs(node.reminderText) do - self.main:AddTooltipLine(14, "^xA0A080"..line) + main:AddTooltipLine(14, "^xA0A080"..line) end end -- Mod differences local calcFunc, calcBase = build.calcs:GetNodeCalculator(build) if calcFunc then - self.main:AddTooltipSeperator(14) + main:AddTooltipSeperator(14) local count local nodeOutput, pathOutput if node.alloc then @@ -527,10 +525,10 @@ function TreeViewClass:AddNodeTooltip(node, build) if diff > 0.001 or diff < -0.001 then none = false if not header then - self.main:AddTooltipLine(14, string.format("^7%s this node will give you:", node.alloc and "Unallocating" or "Allocating")) + main:AddTooltipLine(14, string.format("^7%s this node will give you:", node.alloc and "Unallocating" or "Allocating")) header = true end - self.main:AddTooltipLine(14, string.format("%s%+"..data.fmt.." %s", diff > 0 and "^x00FF44" or "^xFF3300", diff * (data.pc and 100 or 1), data.label)) + main:AddTooltipLine(14, string.format("%s%+"..data.fmt.." %s", diff > 0 and "^x00FF44" or "^xFF3300", diff * (data.pc and 100 or 1), data.label)) end end end @@ -542,26 +540,26 @@ function TreeViewClass:AddNodeTooltip(node, build) if diff > 0.001 or diff < -0.001 then none = false if not header then - self.main:AddTooltipLine(14, string.format("^7%s this node and all nodes %s will give you:", node.alloc and "Unallocating" or "Allocating", node.alloc and "depending on it" or "leading to it")) + main:AddTooltipLine(14, string.format("^7%s this node and all nodes %s will give you:", node.alloc and "Unallocating" or "Allocating", node.alloc and "depending on it" or "leading to it")) header = true end - self.main:AddTooltipLine(14, string.format("%s%+"..data.fmt.." %s", diff > 0 and "^x00FF44" or "^xFF3300", diff * (data.pc and 100 or 1), data.label)) + main:AddTooltipLine(14, string.format("%s%+"..data.fmt.." %s", diff > 0 and "^x00FF44" or "^xFF3300", diff * (data.pc and 100 or 1), data.label)) end end end end if none then - self.main:AddTooltipLine(14, string.format("^7No changes from %s this node%s.", node.alloc and "unallocating" or "allocating", count > 1 and " or the nodes leading to it" or "")) + main:AddTooltipLine(14, string.format("^7No changes from %s this node%s.", node.alloc and "unallocating" or "allocating", count > 1 and " or the nodes leading to it" or "")) end end -- Pathing distance if node.path and #node.path > 0 then - self.main:AddTooltipSeperator(14) - self.main:AddTooltipLine(14, "^7"..#node.path .. " points to node") + main:AddTooltipSeperator(14) + main:AddTooltipLine(14, "^7"..#node.path .. " points to node") if #node.path > 1 then - self.main:AddTooltipLine(14, "^x80A080") - self.main:AddTooltipLine(14, "Tip: To reach this node by a different path, hold Shift, then trace the path and click this node") + main:AddTooltipLine(14, "^x80A080") + main:AddTooltipLine(14, "Tip: To reach this node by a different path, hold Shift, then trace the path and click this node") end end end diff --git a/Common.lua b/Common.lua index 5e4f6849..cb952cd4 100644 --- a/Common.lua +++ b/Common.lua @@ -15,11 +15,41 @@ common.newEditField = require("simplegraphic/editfield") -- Class library common.classes = { } -function common.NewClass(className, initFunc) +-- NewClass(""[, ""[, "" ...]], constructorFunc) +function common.NewClass(className, ...) local class = { } - class.__index = class - class._init = initFunc common.classes[className] = class + class.__index = class + class._className = className + local numVarArg = select("#", ...) + class._constructor = select(numVarArg, ...) + if numVarArg > 1 then + -- Build list of parent classes + class._parents = { } + for i = 1, numVarArg - 1 do + local parentName = select(i, ...) + if not common.classes[parentName] then + error("Parent class '"..className.."' not defined") + end + class._parents[i] = common.classes[parentName] + end + if #class._parents == 1 then + -- Single inheritance + setmetatable(class, class._parents[1]) + else + -- Multiple inheritance + setmetatable(class, { + __index = function(self, key) + for _, parent in ipairs(class._parents) do + local val = class._parents[key] + if val ~= nil then + return val + end + end + end, + }) + end + end return class end function common.New(className, ...) @@ -27,8 +57,33 @@ function common.New(className, ...) if not class then error("Class '"..className.."' not defined") end + if not class._constructor then + error("Class '"..className.."' has no constructor") + end local object = setmetatable({ }, class) - class._init(object, ...) + if class._parents then + -- Add parent class proxies + for _, parent in pairs(class._parents) do + object[parent._className] = setmetatable({ }, { + __index = function(self, key) + local v = rawget(object, key) + if v ~= nil then + return v + else + return parent[key] + end + end, + __newindex = object, + __call = function(...) + if not parent._constructor then + error("Parent class '"..parent._className.."' of class '"..className.."' has no constructor") + end + parent._constructor(...) + end, + }) + end + end + class._constructor(object, ...) return object end @@ -60,7 +115,7 @@ function common.controlsInput(host, inputEvents) end elseif event.type == "KeyUp" then if host.selControl then - if host.selControl:OnKeyUp(event.key) then + if host.selControl.OnKeyUp and host.selControl:OnKeyUp(event.key) then host.selControl = nil end inputEvents[id] = nil diff --git a/Gems/act_dex.lua b/Gems/act_dex.lua index 2558b8b6..435ffe80 100644 --- a/Gems/act_dex.lua +++ b/Gems/act_dex.lua @@ -56,6 +56,7 @@ gems["Barrage"] = { gems["Bear Trap"] = { cast = true, trap = true, + showAverage = true, base = { skill_castTime = 1, skill_damageEff = 2, @@ -633,6 +634,7 @@ gems["Fire Trap"] = { aoe = true, duration = true, fire = true, + showAverage = true, base = { skill_castTime = 1, skill_damageEff = 1, @@ -683,6 +685,7 @@ gems["Freeze Mine"] = { mine = true, aoe = true, cold = true, + showAverage = true, base = { skill_castTime = 0.5, skill_damageEff = 0.5, @@ -1063,6 +1066,7 @@ gems["Ice Trap"] = { trap = true, aoe = true, cold = true, + showAverage = true, base = { skill_castTime = 1, skill_damageEff = 1.1, diff --git a/Gems/act_int.lua b/Gems/act_int.lua index de851b0b..b5ec632b 100644 --- a/Gems/act_int.lua +++ b/Gems/act_int.lua @@ -1186,6 +1186,7 @@ gems["Lightning Warp"] = { lightning = true, movement = true, duration = true, + showAverage = true, base = { skill_castTime = 1, skill_damageEff = 0.6, diff --git a/Gems/other.lua b/Gems/other.lua new file mode 100644 index 00000000..acc95a04 --- /dev/null +++ b/Gems/other.lua @@ -0,0 +1,1208 @@ +-- Path of Building +-- +-- Other skills +-- Skill gem data (c) Grinding Gear Games +-- +local gems = ... + +gems["_default"] = { + attack = true, + melee = true, + bow = true, + projectile = true, + base = { + }, + quality = { + }, + levels = { + [1] = { } + }, +} +gems["Detonate Mines"] = { + spell = true, + base = { + spell_castTime = 0.2, + }, + quality = { + castSpeedInc = 5, + }, + levels = { + [1] = { }, + [2] = { }, + [3] = { }, + [4] = { }, + [5] = { }, + [6] = { }, + [7] = { }, + [8] = { }, + [9] = { }, + [10] = { }, + } +} +gems["Portal"] = { + spell = true, + base = { + spell_castTine = 2.5, + }, + quality = { + castSpeedInc = 3, + }, + levels = { + [1] = { }, + [2] = { }, + [3] = { }, + [4] = { }, + [5] = { }, + [6] = { }, + [7] = { }, + [8] = { }, + [9] = { }, + [10] = { }, + } +} +gems["Vaal Arc"] = { + spell = true, + lightning = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.8, + skill_damageEff = 0.8, + skill_critChanceBase = 5, + shockChance = 100, + }, + quality = { + shock_durationInc = 1.5, + }, + levels = { + [1] = { skill_lightningMin = 2, skill_lightningMax = 35, }, + [2] = { skill_lightningMin = 2, skill_lightningMax = 44, }, + [3] = { skill_lightningMin = 3, skill_lightningMax = 59, }, + [4] = { skill_lightningMin = 4, skill_lightningMax = 77, }, + [5] = { skill_lightningMin = 5, skill_lightningMax = 99, }, + [6] = { skill_lightningMin = 7, skill_lightningMax = 125, }, + [7] = { skill_lightningMin = 8, skill_lightningMax = 158, }, + [8] = { skill_lightningMin = 10, skill_lightningMax = 187, }, + [9] = { skill_lightningMin = 12, skill_lightningMax = 220, }, + [10] = { skill_lightningMin = 14, skill_lightningMax = 259, }, + [11] = { skill_lightningMin = 16, skill_lightningMax = 303, }, + [12] = { skill_lightningMin = 19, skill_lightningMax = 353, }, + [13] = { skill_lightningMin = 22, skill_lightningMax = 411, }, + [14] = { skill_lightningMin = 25, skill_lightningMax = 478, }, + [15] = { skill_lightningMin = 29, skill_lightningMax = 554, }, + [16] = { skill_lightningMin = 34, skill_lightningMax = 641, }, + [17] = { skill_lightningMin = 37, skill_lightningMax = 706, }, + [18] = { skill_lightningMin = 41, skill_lightningMax = 777, }, + [19] = { skill_lightningMin = 45, skill_lightningMax = 854, }, + [20] = { skill_lightningMin = 49, skill_lightningMax = 938, }, + [21] = { skill_lightningMin = 54, skill_lightningMax = 1030, }, + [22] = { skill_lightningMin = 60, skill_lightningMax = 1131, }, + [23] = { skill_lightningMin = 65, skill_lightningMax = 1240, }, + [24] = { skill_lightningMin = 72, skill_lightningMax = 1359, }, + [25] = { skill_lightningMin = 78, skill_lightningMax = 1489, }, + [26] = { skill_lightningMin = 86, skill_lightningMax = 1631, }, + [27] = { skill_lightningMin = 94, skill_lightningMax = 1785, }, + [28] = { skill_lightningMin = 103, skill_lightningMax = 1953, }, + [29] = { skill_lightningMin = 112, skill_lightningMax = 2136, }, + [30] = { skill_lightningMin = 123, skill_lightningMax = 2335, }, + } +} +gems["Vaal Burning Arrow"] = { + attack = true, + bow = true, + projectile = true, + aoe = true, + fire = true, + vaal = true, + showAverage = true, + base = { + igniteChance = 20, + physicalConvertTofire = 50, + }, + quality = { + ignite_durationInc = 3, + }, + levels = { + [1] = { attack_damageMore = 1.6, degen_fireInc = 10, }, + [2] = { attack_damageMore = 1.62, degen_fireInc = 11, }, + [3] = { attack_damageMore = 1.64, degen_fireInc = 12, }, + [4] = { attack_damageMore = 1.66, degen_fireInc = 13, }, + [5] = { attack_damageMore = 1.68, degen_fireInc = 14, }, + [6] = { attack_damageMore = 1.7, degen_fireInc = 15, }, + [7] = { attack_damageMore = 1.72, degen_fireInc = 16, }, + [8] = { attack_damageMore = 1.74, degen_fireInc = 17, }, + [9] = { attack_damageMore = 1.76, degen_fireInc = 18, }, + [10] = { attack_damageMore = 1.78, degen_fireInc = 19, }, + [11] = { attack_damageMore = 1.8, degen_fireInc = 20, }, + [12] = { attack_damageMore = 1.82, degen_fireInc = 21, }, + [13] = { attack_damageMore = 1.84, degen_fireInc = 22, }, + [14] = { attack_damageMore = 1.86, degen_fireInc = 23, }, + [15] = { attack_damageMore = 1.88, degen_fireInc = 24, }, + [16] = { attack_damageMore = 1.9, degen_fireInc = 25, }, + [17] = { attack_damageMore = 1.92, degen_fireInc = 26, }, + [18] = { attack_damageMore = 1.94, degen_fireInc = 27, }, + [19] = { attack_damageMore = 1.96, degen_fireInc = 28, }, + [20] = { attack_damageMore = 1.98, degen_fireInc = 29, }, + [21] = { attack_damageMore = 2, degen_fireInc = 30, }, + [22] = { attack_damageMore = 2.02, degen_fireInc = 31, }, + [23] = { attack_damageMore = 2.04, degen_fireInc = 32, }, + [24] = { attack_damageMore = 2.06, degen_fireInc = 33, }, + [25] = { attack_damageMore = 2.08, degen_fireInc = 34, }, + [26] = { attack_damageMore = 2.1, degen_fireInc = 35, }, + [27] = { attack_damageMore = 2.12, degen_fireInc = 36, }, + [28] = { attack_damageMore = 2.14, degen_fireInc = 37, }, + [29] = { attack_damageMore = 2.16, degen_fireInc = 38, }, + [30] = { attack_damageMore = 2.18, degen_fireInc = 39, }, + } +} +gems["Vaal Clarity"] = { + aura = true, + spell = true, + aoe = true, + duration = true, + vaal = true, + base = { + spell_castTime = 0.6, + manaCostMore = 0, + }, + quality = { + auraRadiusInc = 1, + }, + levels = { + [1] = { auraRadiusInc = 0, skill_durationBase = 8, }, + [2] = { auraRadiusInc = 3, skill_durationBase = 8.1, }, + [3] = { auraRadiusInc = 6, skill_durationBase = 8.2, }, + [4] = { auraRadiusInc = 9, skill_durationBase = 8.3, }, + [5] = { auraRadiusInc = 12, skill_durationBase = 8.4, }, + [6] = { auraRadiusInc = 15, skill_durationBase = 8.5, }, + [7] = { auraRadiusInc = 18, skill_durationBase = 8.6, }, + [8] = { auraRadiusInc = 21, skill_durationBase = 8.7, }, + [9] = { auraRadiusInc = 23, skill_durationBase = 8.8, }, + [10] = { auraRadiusInc = 25, skill_durationBase = 8.9, }, + [11] = { auraRadiusInc = 27, skill_durationBase = 9, }, + [12] = { auraRadiusInc = 29, skill_durationBase = 9.1, }, + [13] = { auraRadiusInc = 31, skill_durationBase = 9.2, }, + [14] = { auraRadiusInc = 33, skill_durationBase = 9.3, }, + [15] = { auraRadiusInc = 35, skill_durationBase = 9.4, }, + [16] = { auraRadiusInc = 36, skill_durationBase = 9.5, }, + [17] = { auraRadiusInc = 37, skill_durationBase = 9.6, }, + [18] = { auraRadiusInc = 38, skill_durationBase = 9.7, }, + [19] = { auraRadiusInc = 39, skill_durationBase = 9.8, }, + [20] = { auraRadiusInc = 40, skill_durationBase = 9.9, }, + [21] = { auraRadiusInc = 41, skill_durationBase = 10, }, + [22] = { auraRadiusInc = 42, skill_durationBase = 10.1, }, + [23] = { auraRadiusInc = 43, skill_durationBase = 10.2, }, + [24] = { auraRadiusInc = 44, skill_durationBase = 10.3, }, + [25] = { auraRadiusInc = 45, skill_durationBase = 10.4, }, + [26] = { auraRadiusInc = 46, skill_durationBase = 10.5, }, + [27] = { auraRadiusInc = 47, skill_durationBase = 10.6, }, + [28] = { auraRadiusInc = 48, skill_durationBase = 10.7, }, + [29] = { auraRadiusInc = 49, skill_durationBase = 10.8, }, + [30] = { auraRadiusInc = 50, skill_durationBase = 10.9, }, + } +} +gems["Vaal Cold Snap"] = { + spell = true, + aoe = true, + duration = true, + cold = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.85, + skill_damageEff = 1.4, + skill_critChanceBase = 5, + skill_durationBase = 10, + }, + quality = { + aoeRadiusInc = 0.5, + }, + levels = { + [1] = { skill_coldMin = 11, skill_coldMax = 17, }, + [2] = { skill_coldMin = 14, skill_coldMax = 21, }, + [3] = { skill_coldMin = 18, skill_coldMax = 28, }, + [4] = { skill_coldMin = 24, skill_coldMax = 35, }, + [5] = { skill_coldMin = 32, skill_coldMax = 48, }, + [6] = { skill_coldMin = 42, skill_coldMax = 63, }, + [7] = { skill_coldMin = 55, skill_coldMax = 82, }, + [8] = { skill_coldMin = 70, skill_coldMax = 105, }, + [9] = { skill_coldMin = 88, skill_coldMax = 132, }, + [10] = { skill_coldMin = 111, skill_coldMax = 166, }, + [11] = { skill_coldMin = 137, skill_coldMax = 206, }, + [12] = { skill_coldMin = 170, skill_coldMax = 255, }, + [13] = { skill_coldMin = 208, skill_coldMax = 313, }, + [14] = { skill_coldMin = 255, skill_coldMax = 382, }, + [15] = { skill_coldMin = 295, skill_coldMax = 443, }, + [16] = { skill_coldMin = 342, skill_coldMax = 512, }, + [17] = { skill_coldMin = 394, skill_coldMax = 591, }, + [18] = { skill_coldMin = 454, skill_coldMax = 682, }, + [19] = { skill_coldMin = 523, skill_coldMax = 784, }, + [20] = { skill_coldMin = 600, skill_coldMax = 901, }, + [21] = { skill_coldMin = 658, skill_coldMax = 987, }, + [22] = { skill_coldMin = 721, skill_coldMax = 1081, }, + [23] = { skill_coldMin = 789, skill_coldMax = 1184, }, + [24] = { skill_coldMin = 863, skill_coldMax = 1295, }, + [25] = { skill_coldMin = 944, skill_coldMax = 1416, }, + [26] = { skill_coldMin = 1032, skill_coldMax = 1548, }, + [27] = { skill_coldMin = 1127, skill_coldMax = 1691, }, + [28] = { skill_coldMin = 1231, skill_coldMax = 1846, }, + [29] = { skill_coldMin = 1343, skill_coldMax = 2015, }, + [30] = { skill_coldMin = 1466, skill_coldMax = 2199, }, + } +} +gems["Vaal Cyclone"] = { + attack = true, + melee = true, + aoe = true, + duration = true, + vaal = true, + base = { + skill_durationBase = 5, + aoeRadiusInc = 50, + attackSpeedMore = 2, + }, + quality = { + aoeRadiusInc = 0.5, + }, + levels = { + [1] = { attack_damageMore = 0.5, }, + [2] = { attack_damageMore = 0.506, }, + [3] = { attack_damageMore = 0.512, }, + [4] = { attack_damageMore = 0.518, }, + [5] = { attack_damageMore = 0.524, }, + [6] = { attack_damageMore = 0.53, }, + [7] = { attack_damageMore = 0.536, }, + [8] = { attack_damageMore = 0.542, }, + [9] = { attack_damageMore = 0.548, }, + [10] = { attack_damageMore = 0.554, }, + [11] = { attack_damageMore = 0.56, }, + [12] = { attack_damageMore = 0.566, }, + [13] = { attack_damageMore = 0.572, }, + [14] = { attack_damageMore = 0.578, }, + [15] = { attack_damageMore = 0.584, }, + [16] = { attack_damageMore = 0.59, }, + [17] = { attack_damageMore = 0.596, }, + [18] = { attack_damageMore = 0.602, }, + [19] = { attack_damageMore = 0.608, }, + [20] = { attack_damageMore = 0.614, }, + [21] = { attack_damageMore = 0.62, }, + [22] = { attack_damageMore = 0.626, }, + [23] = { attack_damageMore = 0.632, }, + [24] = { attack_damageMore = 0.638, }, + [25] = { attack_damageMore = 0.644, }, + [26] = { attack_damageMore = 0.65, }, + [27] = { attack_damageMore = 0.656, }, + [28] = { attack_damageMore = 0.662, }, + [29] = { attack_damageMore = 0.668, }, + [30] = { attack_damageMore = 0.674, }, + } +} +gems["Vaal Discipline"] = { + aura = true, + spell = true, + aoe = true, + duration = true, + vaal = true, + base = { + skill_castTime = 0.6, + skill_durationBase = 3, + }, + quality = { + auraRadiusInc = 1, + }, + levels = { + [1] = { auraRadiusInc = 0, energyShieldBase = 181, }, + [2] = { auraRadiusInc = 3, energyShieldBase = 210, }, + [3] = { auraRadiusInc = 6, energyShieldBase = 233, }, + [4] = { auraRadiusInc = 9, energyShieldBase = 268, }, + [5] = { auraRadiusInc = 12, energyShieldBase = 301, }, + [6] = { auraRadiusInc = 15, energyShieldBase = 334, }, + [7] = { auraRadiusInc = 18, energyShieldBase = 376, }, + [8] = { auraRadiusInc = 21, energyShieldBase = 418, }, + [9] = { auraRadiusInc = 23, energyShieldBase = 463, }, + [10] = { auraRadiusInc = 25, energyShieldBase = 496, }, + [11] = { auraRadiusInc = 27, energyShieldBase = 519, }, + [12] = { auraRadiusInc = 29, energyShieldBase = 562, }, + [13] = { auraRadiusInc = 31, energyShieldBase = 602, }, + [14] = { auraRadiusInc = 33, energyShieldBase = 638, }, + [15] = { auraRadiusInc = 35, energyShieldBase = 680, }, + [16] = { auraRadiusInc = 36, energyShieldBase = 716, }, + [17] = { auraRadiusInc = 37, energyShieldBase = 759, }, + [18] = { auraRadiusInc = 38, energyShieldBase = 807, }, + [19] = { auraRadiusInc = 39, energyShieldBase = 842, }, + [20] = { auraRadiusInc = 40, energyShieldBase = 908, }, + [21] = { auraRadiusInc = 41, energyShieldBase = 944, }, + [22] = { auraRadiusInc = 42, energyShieldBase = 991, }, + [23] = { auraRadiusInc = 43, energyShieldBase = 1019, }, + [24] = { auraRadiusInc = 44, energyShieldBase = 1070, }, + [25] = { auraRadiusInc = 45, energyShieldBase = 1123, }, + [26] = { auraRadiusInc = 46, energyShieldBase = 1153, }, + [27] = { auraRadiusInc = 47, energyShieldBase = 1217, }, + [28] = { auraRadiusInc = 48, energyShieldBase = 1276, }, + [29] = { auraRadiusInc = 49, energyShieldBase = 1350, }, + [30] = { auraRadiusInc = 50, energyShieldBase = 1364, }, + } +} +gems["Vaal Detonate Dead"] = { + unsupported = true, +} +gems["Vaal Double Strike"] = { + attack = true, + melee = true, + duration = true, + vaal = true, + base = { + }, + quality = { + attackSpeedInc = 0.5, + }, + levels = { + [1] = { attack_damageMore = 0.7, skill_durationBase = 3.6, }, + [2] = { attack_damageMore = 0.708, skill_durationBase = 3.7, }, + [3] = { attack_damageMore = 0.716, skill_durationBase = 3.8, }, + [4] = { attack_damageMore = 0.724, skill_durationBase = 3.9, }, + [5] = { attack_damageMore = 0.732, skill_durationBase = 4, }, + [6] = { attack_damageMore = 0.74, skill_durationBase = 4.1, }, + [7] = { attack_damageMore = 0.748, skill_durationBase = 4.2, }, + [8] = { attack_damageMore = 0.756, skill_durationBase = 4.3, }, + [9] = { attack_damageMore = 0.764, skill_durationBase = 4.4, }, + [10] = { attack_damageMore = 0.772, skill_durationBase = 4.5, }, + [11] = { attack_damageMore = 0.78, skill_durationBase = 4.6, }, + [12] = { attack_damageMore = 0.788, skill_durationBase = 4.7, }, + [13] = { attack_damageMore = 0.796, skill_durationBase = 4.8, }, + [14] = { attack_damageMore = 0.804, skill_durationBase = 4.9, }, + [15] = { attack_damageMore = 0.812, skill_durationBase = 5, }, + [16] = { attack_damageMore = 0.82, skill_durationBase = 5.1, }, + [17] = { attack_damageMore = 0.828, skill_durationBase = 5.2, }, + [18] = { attack_damageMore = 0.836, skill_durationBase = 5.3, }, + [19] = { attack_damageMore = 0.844, skill_durationBase = 5.4, }, + [20] = { attack_damageMore = 0.852, skill_durationBase = 5.5, }, + [21] = { attack_damageMore = 0.86, skill_durationBase = 5.6, }, + [22] = { attack_damageMore = 0.868, skill_durationBase = 5.7, }, + [23] = { attack_damageMore = 0.876, skill_durationBase = 5.8, }, + [24] = { attack_damageMore = 0.884, skill_durationBase = 5.9, }, + [25] = { attack_damageMore = 0.892, skill_durationBase = 6, }, + [26] = { attack_damageMore = 0.9, skill_durationBase = 6.1, }, + [27] = { attack_damageMore = 0.908, skill_durationBase = 6.2, }, + [28] = { attack_damageMore = 0.916, skill_durationBase = 6.3, }, + [29] = { attack_damageMore = 0.924, skill_durationBase = 6.4, }, + [30] = { attack_damageMore = 0.932, skill_durationBase = 6.5, }, + } +} +gems["Vaal Fireball"] = { + spell = true, + projectile = true, + aoe = true, + fire = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.85, + skill_damageEff = 1.25, + skill_critChanceBase = 6, + aoeRadiusInc = 50, + }, + quality = { + igniteChance = 1.5, + }, + levels = { + [1] = { skill_fireMin = 8, skill_fireMax = 11, }, + [2] = { skill_fireMin = 9, skill_fireMax = 13, }, + [3] = { skill_fireMin = 11, skill_fireMax = 16, }, + [4] = { skill_fireMin = 14, skill_fireMax = 22, }, + [5] = { skill_fireMin = 20, skill_fireMax = 30, }, + [6] = { skill_fireMin = 30, skill_fireMax = 45, }, + [7] = { skill_fireMin = 39, skill_fireMax = 59, }, + [8] = { skill_fireMin = 51, skill_fireMax = 76, }, + [9] = { skill_fireMin = 65, skill_fireMax = 98, }, + [10] = { skill_fireMin = 82, skill_fireMax = 124, }, + [11] = { skill_fireMin = 103, skill_fireMax = 155, }, + [12] = { skill_fireMin = 128, skill_fireMax = 192, }, + [13] = { skill_fireMin = 158, skill_fireMax = 238, }, + [14] = { skill_fireMin = 195, skill_fireMax = 292, }, + [15] = { skill_fireMin = 238, skill_fireMax = 357, }, + [16] = { skill_fireMin = 289, skill_fireMax = 434, }, + [17] = { skill_fireMin = 351, skill_fireMax = 526, }, + [18] = { skill_fireMin = 424, skill_fireMax = 636, }, + [19] = { skill_fireMin = 488, skill_fireMax = 732, }, + [20] = { skill_fireMin = 560, skill_fireMax = 841, }, + [21] = { skill_fireMin = 614, skill_fireMax = 921, }, + [22] = { skill_fireMin = 673, skill_fireMax = 1009, }, + [23] = { skill_fireMin = 736, skill_fireMax = 1105, }, + [24] = { skill_fireMin = 806, skill_fireMax = 1209, }, + [25] = { skill_fireMin = 881, skill_fireMax = 1322, }, + [26] = { skill_fireMin = 963, skill_fireMax = 1445, }, + [27] = { skill_fireMin = 1052, skill_fireMax = 1578, }, + [28] = { skill_fireMin = 1149, skill_fireMax = 1723, }, + [29] = { skill_fireMin = 1254, skill_fireMax = 1881, }, + [30] = { skill_fireMin = 1368, skill_fireMax = 2052, }, + } +} +gems["Vaal Flameblast"] = { + spell = true, + aoe = true, + fire = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 1, + skill_damageEff = 0.6, + skill_critChanceBase = 5, + spell_damageMore = 12, + }, + quality = { + damageInc = 1, + }, + levels = { + [1] = { skill_fireMin = 39, skill_fireMax = 58, }, + [2] = { skill_fireMin = 46, skill_fireMax = 68, }, + [3] = { skill_fireMin = 53, skill_fireMax = 80, }, + [4] = { skill_fireMin = 62, skill_fireMax = 93, }, + [5] = { skill_fireMin = 71, skill_fireMax = 107, }, + [6] = { skill_fireMin = 78, skill_fireMax = 117, }, + [7] = { skill_fireMin = 86, skill_fireMax = 129, }, + [8] = { skill_fireMin = 94, skill_fireMax = 141, }, + [9] = { skill_fireMin = 103, skill_fireMax = 154, }, + [10] = { skill_fireMin = 113, skill_fireMax = 169, }, + [11] = { skill_fireMin = 123, skill_fireMax = 184, }, + [12] = { skill_fireMin = 134, skill_fireMax = 201, }, + [13] = { skill_fireMin = 146, skill_fireMax = 219, }, + [14] = { skill_fireMin = 159, skill_fireMax = 238, }, + [15] = { skill_fireMin = 173, skill_fireMax = 259, }, + [16] = { skill_fireMin = 188, skill_fireMax = 282, }, + [17] = { skill_fireMin = 204, skill_fireMax = 306, }, + [18] = { skill_fireMin = 221, skill_fireMax = 332, }, + [19] = { skill_fireMin = 240, skill_fireMax = 360, }, + [20] = { skill_fireMin = 260, skill_fireMax = 390, }, + [21] = { skill_fireMin = 281, skill_fireMax = 422, }, + [22] = { skill_fireMin = 305, skill_fireMax = 457, }, + [23] = { skill_fireMin = 329, skill_fireMax = 494, }, + [24] = { skill_fireMin = 356, skill_fireMax = 534, }, + [25] = { skill_fireMin = 385, skill_fireMax = 577, }, + [26] = { skill_fireMin = 416, skill_fireMax = 623, }, + [27] = { skill_fireMin = 449, skill_fireMax = 673, }, + [28] = { skill_fireMin = 484, skill_fireMax = 726, }, + [29] = { skill_fireMin = 522, skill_fireMax = 783, }, + [30] = { skill_fireMin = 563, skill_fireMax = 844, }, + } +} +gems["Vaal Glacial Hammer"] = { + attack = true, + melee = true, + aoe = true, + duration = true, + cold = true, + vaal = true, + showAverage = true, + base = { + physicalConvertTocold = 50, + chill_durationInc = 35, + }, + quality = { + chill_durationInc = 2, + freeze_durationInc = 1, + }, + levels = { + [1] = { attack_damageMore = 1.5, skill_durationBase = 3.4, }, + [2] = { attack_damageMore = 1.518, skill_durationBase = 3.45 }, + [3] = { attack_damageMore = 1.536, skill_durationBase = 3.5, }, + [4] = { attack_damageMore = 1.554, skill_durationBase = 3.55, }, + [5] = { attack_damageMore = 1.572, skill_durationBase = 3.6, }, + [6] = { attack_damageMore = 1.59, skill_durationBase = 3.65, }, + [7] = { attack_damageMore = 1.608, skill_durationBase = 3.7, }, + [8] = { attack_damageMore = 1.626, skill_durationBase = 3.75, }, + [9] = { attack_damageMore = 1.644, skill_durationBase = 3.8, }, + [10] = { attack_damageMore = 1.662, skill_durationBase = 3.85, }, + [11] = { attack_damageMore = 1.68, skill_durationBase = 3.9, }, + [12] = { attack_damageMore = 1.698, skill_durationBase = 3.95, }, + [13] = { attack_damageMore = 1.716, skill_durationBase = 4, }, + [14] = { attack_damageMore = 1.734, skill_durationBase = 4.05, }, + [15] = { attack_damageMore = 1.752, skill_durationBase = 4.1, }, + [16] = { attack_damageMore = 1.77, skill_durationBase = 4.15, }, + [17] = { attack_damageMore = 1.788, skill_durationBase = 4.2, }, + [18] = { attack_damageMore = 1.806, skill_durationBase = 4.25, }, + [19] = { attack_damageMore = 1.824, skill_durationBase = 4.3, }, + [20] = { attack_damageMore = 1.842, skill_durationBase = 4.35, }, + [21] = { attack_damageMore = 1.86, skill_durationBase = 4.4, }, + [22] = { attack_damageMore = 1.878, skill_durationBase = 4.45, }, + [23] = { attack_damageMore = 1.896, skill_durationBase = 4.5, }, + [24] = { attack_damageMore = 1.914, skill_durationBase = 4.55, }, + [25] = { attack_damageMore = 1.932, skill_durationBase = 4.6, }, + [26] = { attack_damageMore = 1.95, skill_durationBase = 4.65, }, + [27] = { attack_damageMore = 1.968, skill_durationBase = 4.7, }, + [28] = { attack_damageMore = 1.986, skill_durationBase = 4.75, }, + [29] = { attack_damageMore = 2.004, skill_durationBase = 4.8, }, + [30] = { attack_damageMore = 2.022, skill_durationBase = 4.85, }, + } +} +gems["Vaal Grace"] = { + aura = true, + spell = true, + aoe = true, + duration = true, + vaal = true, + base = { + skill_castTime = 0.6, + skill_durationBase = 6, + }, + quality = { + auraRadiusInc = 1, + }, + levels = { + [1] = { auraRadiusInc = 0, dodgeAttack = 24, dodgeSpell = 24, }, + [2] = { auraRadiusInc = 3, dodgeAttack = 25, dodgeSpell = 25, }, + [3] = { auraRadiusInc = 6, dodgeAttack = 25, dodgeSpell = 25, }, + [4] = { auraRadiusInc = 9, dodgeAttack = 26, dodgeSpell = 26, }, + [5] = { auraRadiusInc = 12, dodgeAttack = 26, dodgeSpell = 26, }, + [6] = { auraRadiusInc = 15, dodgeAttack = 27, dodgeSpell = 27, }, + [7] = { auraRadiusInc = 18, dodgeAttack = 27, dodgeSpell = 27, }, + [8] = { auraRadiusInc = 21, dodgeAttack = 28, dodgeSpell = 28, }, + [9] = { auraRadiusInc = 23, dodgeAttack = 28, dodgeSpell = 28, }, + [10] = { auraRadiusInc = 25, dodgeAttack = 29, dodgeSpell = 29, }, + [11] = { auraRadiusInc = 27, dodgeAttack = 29, dodgeSpell = 29, }, + [12] = { auraRadiusInc = 29, dodgeAttack = 30, dodgeSpell = 30, }, + [13] = { auraRadiusInc = 31, dodgeAttack = 30, dodgeSpell = 30, }, + [14] = { auraRadiusInc = 33, dodgeAttack = 31, dodgeSpell = 31, }, + [15] = { auraRadiusInc = 35, dodgeAttack = 31, dodgeSpell = 31, }, + [16] = { auraRadiusInc = 36, dodgeAttack = 32, dodgeSpell = 32, }, + [17] = { auraRadiusInc = 37, dodgeAttack = 32, dodgeSpell = 32, }, + [18] = { auraRadiusInc = 38, dodgeAttack = 33, dodgeSpell = 33, }, + [19] = { auraRadiusInc = 39, dodgeAttack = 33, dodgeSpell = 33, }, + [20] = { auraRadiusInc = 40, dodgeAttack = 34, dodgeSpell = 34, }, + [21] = { auraRadiusInc = 41, dodgeAttack = 34, dodgeSpell = 34, }, + [22] = { auraRadiusInc = 42, dodgeAttack = 35, dodgeSpell = 35, }, + [23] = { auraRadiusInc = 43, dodgeAttack = 35, dodgeSpell = 35, }, + [24] = { auraRadiusInc = 44, dodgeAttack = 36, dodgeSpell = 36, }, + [25] = { auraRadiusInc = 45, dodgeAttack = 36, dodgeSpell = 36, }, + [26] = { auraRadiusInc = 46, dodgeAttack = 37, dodgeSpell = 37, }, + [27] = { auraRadiusInc = 47, dodgeAttack = 37, dodgeSpell = 37, }, + [28] = { auraRadiusInc = 48, dodgeAttack = 38, dodgeSpell = 38, }, + [29] = { auraRadiusInc = 49, dodgeAttack = 38, dodgeSpell = 38, }, + [30] = { auraRadiusInc = 50, dodgeAttack = 39, dodgeSpell = 39, }, + } +} +gems["Vaal Ground Slam"] = { + attack = true, + melee = true, + aoe = true, + vaal = true, + showAverage = true, + base = { + aoeRadiusInc = 20, + }, + quality = { + stunEnemyDurationInc = 1.5, + }, + levels = { + [1] = { attack_damageMore = 1.6, }, + [2] = { attack_damageMore = 1.62, }, + [3] = { attack_damageMore = 1.64, }, + [4] = { attack_damageMore = 1.66, }, + [5] = { attack_damageMore = 1.68, }, + [6] = { attack_damageMore = 1.7, }, + [7] = { attack_damageMore = 1.72, }, + [8] = { attack_damageMore = 1.74, }, + [9] = { attack_damageMore = 1.76, }, + [10] = { attack_damageMore = 1.78, }, + [11] = { attack_damageMore = 1.8, }, + [12] = { attack_damageMore = 1.82, }, + [13] = { attack_damageMore = 1.84, }, + [14] = { attack_damageMore = 1.86, }, + [15] = { attack_damageMore = 1.88, }, + [16] = { attack_damageMore = 1.9, }, + [17] = { attack_damageMore = 1.92, }, + [18] = { attack_damageMore = 1.94, }, + [19] = { attack_damageMore = 1.96, }, + [20] = { attack_damageMore = 1.98, }, + [21] = { attack_damageMore = 2, }, + [22] = { attack_damageMore = 2.02, }, + [23] = { attack_damageMore = 2.04, }, + [24] = { attack_damageMore = 2.06, }, + [25] = { attack_damageMore = 2.08, }, + [26] = { attack_damageMore = 2.1, }, + [27] = { attack_damageMore = 2.12, }, + [28] = { attack_damageMore = 2.14, }, + [29] = { attack_damageMore = 2.16, }, + [30] = { attack_damageMore = 2.18, }, + } +} +gems["Vaal Haste"] = { + aura = true, + spell = true, + aoe = true, + duration = true, + vaal = true, + base = { + skill_castTime = 0.6, + skill_durationBase = 6, + }, + quality = { + auraRadiusInc = 1, + }, + levels = { + [1] = { auraRadiusInc = 0, attackSpeedInc = 30, castSpeedInc = 29, movementSpeedInc = 14, }, + [2] = { auraRadiusInc = 3, attackSpeedInc = 30, castSpeedInc = 30, movementSpeedInc = 14, }, + [3] = { auraRadiusInc = 6, attackSpeedInc = 30, castSpeedInc = 30, movementSpeedInc = 15, }, + [4] = { auraRadiusInc = 9, attackSpeedInc = 31, castSpeedInc = 30, movementSpeedInc = 15, }, + [5] = { auraRadiusInc = 12, attackSpeedInc = 31, castSpeedInc = 31, movementSpeedInc = 15, }, + [6] = { auraRadiusInc = 15, attackSpeedInc = 31, castSpeedInc = 31, movementSpeedInc = 16, }, + [7] = { auraRadiusInc = 18, attackSpeedInc = 32, castSpeedInc = 31, movementSpeedInc = 16, }, + [8] = { auraRadiusInc = 21, attackSpeedInc = 32, castSpeedInc = 32, movementSpeedInc = 16, }, + [9] = { auraRadiusInc = 23, attackSpeedInc = 32, castSpeedInc = 32, movementSpeedInc = 17, }, + [10] = { auraRadiusInc = 25, attackSpeedInc = 33, castSpeedInc = 32, movementSpeedInc = 17, }, + [11] = { auraRadiusInc = 27, attackSpeedInc = 33, castSpeedInc = 33, movementSpeedInc = 17, }, + [12] = { auraRadiusInc = 29, attackSpeedInc = 33, castSpeedInc = 33, movementSpeedInc = 18, }, + [13] = { auraRadiusInc = 31, attackSpeedInc = 34, castSpeedInc = 33, movementSpeedInc = 18, }, + [14] = { auraRadiusInc = 33, attackSpeedInc = 34, castSpeedInc = 34, movementSpeedInc = 18, }, + [15] = { auraRadiusInc = 35, attackSpeedInc = 34, castSpeedInc = 34, movementSpeedInc = 19, }, + [16] = { auraRadiusInc = 36, attackSpeedInc = 35, castSpeedInc = 34, movementSpeedInc = 19, }, + [17] = { auraRadiusInc = 37, attackSpeedInc = 35, castSpeedInc = 35, movementSpeedInc = 19, }, + [18] = { auraRadiusInc = 38, attackSpeedInc = 35, castSpeedInc = 35, movementSpeedInc = 20, }, + [19] = { auraRadiusInc = 39, attackSpeedInc = 36, castSpeedInc = 35, movementSpeedInc = 20, }, + [20] = { auraRadiusInc = 40, attackSpeedInc = 36, castSpeedInc = 36, movementSpeedInc = 20, }, + [21] = { auraRadiusInc = 41, attackSpeedInc = 36, castSpeedInc = 36, movementSpeedInc = 21, }, + [22] = { auraRadiusInc = 42, attackSpeedInc = 37, castSpeedInc = 36, movementSpeedInc = 21, }, + [23] = { auraRadiusInc = 43, attackSpeedInc = 37, castSpeedInc = 37, movementSpeedInc = 21, }, + [24] = { auraRadiusInc = 44, attackSpeedInc = 37, castSpeedInc = 37, movementSpeedInc = 22, }, + [25] = { auraRadiusInc = 45, attackSpeedInc = 38, castSpeedInc = 37, movementSpeedInc = 22, }, + [26] = { auraRadiusInc = 46, attackSpeedInc = 38, castSpeedInc = 38, movementSpeedInc = 22, }, + [27] = { auraRadiusInc = 47, attackSpeedInc = 38, castSpeedInc = 38, movementSpeedInc = 23, }, + [28] = { auraRadiusInc = 48, attackSpeedInc = 39, castSpeedInc = 38, movementSpeedInc = 23, }, + [29] = { auraRadiusInc = 49, attackSpeedInc = 39, castSpeedInc = 39, movementSpeedInc = 23, }, + [30] = { auraRadiusInc = 50, attackSpeedInc = 39, castSpeedInc = 39, movementSpeedInc = 24, }, + } +} +gems["Vaal Ice Nova"] = { + spell = true, + aoe = true, + cold = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.9, + skill_damageEff = 0.7, + skill_critChanceBase = 6, + }, + quality = { + aoeRadiusInc = 0.5, + }, + levels = { + [1] = { skill_coldMin = 11, skill_coldMax = 17, }, + [2] = { skill_coldMin = 14, skill_coldMax = 22, }, + [3] = { skill_coldMin = 18, skill_coldMax = 29, }, + [4] = { skill_coldMin = 24, skill_coldMax = 37, }, + [5] = { skill_coldMin = 31, skill_coldMax = 48, }, + [6] = { skill_coldMin = 39, skill_coldMax = 61, }, + [7] = { skill_coldMin = 49, skill_coldMax = 76, }, + [8] = { skill_coldMin = 57, skill_coldMax = 89, }, + [9] = { skill_coldMin = 67, skill_coldMax = 105, }, + [10] = { skill_coldMin = 78, skill_coldMax = 123, }, + [11] = { skill_coldMin = 91, skill_coldMax = 143, }, + [12] = { skill_coldMin = 106, skill_coldMax = 166, }, + [13] = { skill_coldMin = 123, skill_coldMax = 193, }, + [14] = { skill_coldMin = 143, skill_coldMax = 223, }, + [15] = { skill_coldMin = 164, skill_coldMax = 257, }, + [16] = { skill_coldMin = 189, skill_coldMax = 296, }, + [17] = { skill_coldMin = 208, skill_coldMax = 325, }, + [18] = { skill_coldMin = 228, skill_coldMax = 357, }, + [19] = { skill_coldMin = 250, skill_coldMax = 391, }, + [20] = { skill_coldMin = 274, skill_coldMax = 428, }, + [21] = { skill_coldMin = 300, skill_coldMax = 469, }, + [22] = { skill_coldMin = 328, skill_coldMax = 513, }, + [23] = { skill_coldMin = 359, skill_coldMax = 561, }, + [24] = { skill_coldMin = 393, skill_coldMax = 613, }, + [25] = { skill_coldMin = 429, skill_coldMax = 670, }, + [26] = { skill_coldMin = 468, skill_coldMax = 732, }, + [27] = { skill_coldMin = 511, skill_coldMax = 799, }, + [28] = { skill_coldMin = 558, skill_coldMax = 871, }, + [29] = { skill_coldMin = 608, skill_coldMax = 950, }, + [30] = { skill_coldMin = 663, skill_coldMax = 1035, }, + } +} +gems["Vaal Immortal Call"] = { + unsupported = true +} +gems["Vaal Lightning Strike"] = { + attack = true, + melee = true, + duration = true, + lightning = true, + vaal = true, + showAverage = true, + parts = { + { + name = "Strike", + }, + { + name = "Beams", + damageMore = 0.5, + }, + }, + base = { + physicalConvertTolightning = 50, + }, + quality = { + durationInc = 1, + }, + levels = { + [1] = { attack_damageMore = 1, skill_durationBase = 5, }, + [2] = { attack_damageMore = 1.012, skill_durationBase = 5.2, }, + [3] = { attack_damageMore = 1.024, skill_durationBase = 5.4, }, + [4] = { attack_damageMore = 1.036, skill_durationBase = 5.6, }, + [5] = { attack_damageMore = 1.048, skill_durationBase = 5.8, }, + [6] = { attack_damageMore = 1.06, skill_durationBase = 6, }, + [7] = { attack_damageMore = 1.072, skill_durationBase = 6.2, }, + [8] = { attack_damageMore = 1.084, skill_durationBase = 6.4, }, + [9] = { attack_damageMore = 1.096, skill_durationBase = 6.6, }, + [10] = { attack_damageMore = 1.108, skill_durationBase = 6.8, }, + [11] = { attack_damageMore = 1.12, skill_durationBase = 7, }, + [12] = { attack_damageMore = 1.132, skill_durationBase = 7.2, }, + [13] = { attack_damageMore = 1.144, skill_durationBase = 7.4, }, + [14] = { attack_damageMore = 1.156, skill_durationBase = 7.6, }, + [15] = { attack_damageMore = 1.168, skill_durationBase = 7.8, }, + [16] = { attack_damageMore = 1.18, skill_durationBase = 8, }, + [17] = { attack_damageMore = 1.192, skill_durationBase = 8.2, }, + [18] = { attack_damageMore = 1.204, skill_durationBase = 8.4, }, + [19] = { attack_damageMore = 1.216, skill_durationBase = 8.6, }, + [20] = { attack_damageMore = 1.228, skill_durationBase = 8.8, }, + [21] = { attack_damageMore = 1.24, skill_durationBase = 9, }, + [22] = { attack_damageMore = 1.252, skill_durationBase = 9.2, }, + [23] = { attack_damageMore = 1.264, skill_durationBase = 9.4, }, + [24] = { attack_damageMore = 1.276, skill_durationBase = 9.6, }, + [25] = { attack_damageMore = 1.288, skill_durationBase = 9.8, }, + [26] = { attack_damageMore = 1.3, skill_durationBase = 10, }, + [27] = { attack_damageMore = 1.312, skill_durationBase = 10.2, }, + [28] = { attack_damageMore = 1.324, skill_durationBase = 10.4, }, + [29] = { attack_damageMore = 1.336, skill_durationBase = 10.6, }, + [30] = { attack_damageMore = 1.348, skill_durationBase = 10.8, }, + } +} +gems["Vaal Lightning Trap"] = { + spell = true, + trap = true, + projectile = true, + duration = true, + lightning = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 1, + skill_damageEff = 0.9, + skill_critChanceBase = 5, + skill_durationBase = 4, + pierceChance = 100, + }, + quality = { + trapThrowingSpeedInc = 0.5, + }, + levels = { + [1] = { skill_lightningMin = 3, skill_lightningMax = 62, }, + [2] = { skill_lightningMin = 4, skill_lightningMax = 77, }, + [3] = { skill_lightningMin = 5, skill_lightningMax = 98, }, + [4] = { skill_lightningMin = 7, skill_lightningMax = 124, }, + [5] = { skill_lightningMin = 8, skill_lightningMax = 153, }, + [6] = { skill_lightningMin = 10, skill_lightningMax = 188, }, + [7] = { skill_lightningMin = 12, skill_lightningMax = 228, }, + [8] = { skill_lightningMin = 14, skill_lightningMax = 263, }, + [9] = { skill_lightningMin = 16, skill_lightningMax = 301, }, + [10] = { skill_lightningMin = 18, skill_lightningMax = 344, }, + [11] = { skill_lightningMin = 21, skill_lightningMax = 391, }, + [12] = { skill_lightningMin = 23, skill_lightningMax = 444, }, + [13] = { skill_lightningMin = 26, skill_lightningMax = 503, }, + [14] = { skill_lightningMin = 30, skill_lightningMax = 568, }, + [15] = { skill_lightningMin = 34, skill_lightningMax = 640, }, + [16] = { skill_lightningMin = 38, skill_lightningMax = 720, }, + [17] = { skill_lightningMin = 41, skill_lightningMax = 779, }, + [18] = { skill_lightningMin = 44, skill_lightningMax = 841, }, + [19] = { skill_lightningMin = 48, skill_lightningMax = 907, }, + [20] = { skill_lightningMin = 52, skill_lightningMax = 979, }, + [21] = { skill_lightningMin = 56, skill_lightningMax = 1055, }, + [22] = { skill_lightningMin = 60, skill_lightningMax = 1136, }, + [23] = { skill_lightningMin = 64, skill_lightningMax = 1223, }, + [24] = { skill_lightningMin = 69, skill_lightningMax = 1316, }, + [25] = { skill_lightningMin = 74, skill_lightningMax = 1415, }, + [26] = { skill_lightningMin = 80, skill_lightningMax = 1521, }, + [27] = { skill_lightningMin = 86, skill_lightningMax = 1634, }, + [28] = { skill_lightningMin = 92, skill_lightningMax = 1755, }, + [29] = { skill_lightningMin = 99, skill_lightningMax = 1884, }, + [30] = { skill_lightningMin = 106, skill_lightningMax = 2021, }, + } +} +gems["Vaal Lightning Warp"] = { + spell = true, + aoe = true, + duration = true, + lightning = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 1, + skill_damageEff = 0.5, + skill_critChanceBase = 5, + }, + quality = { + castSpeedInc = 1, + }, + levels = { + [1] = { skill_lightningMin = 1, skill_lightningMax = 18, durationInc = -0, }, + [2] = { skill_lightningMin = 1, skill_lightningMax = 24, durationInc = -2, }, + [3] = { skill_lightningMin = 2, skill_lightningMax = 32, durationInc = -4, }, + [4] = { skill_lightningMin = 2, skill_lightningMax = 42, durationInc = -6, }, + [5] = { skill_lightningMin = 3, skill_lightningMax = 54, durationInc = -8, }, + [6] = { skill_lightningMin = 4, skill_lightningMax = 70, durationInc = -10, }, + [7] = { skill_lightningMin = 5, skill_lightningMax = 88, durationInc = -12, }, + [8] = { skill_lightningMin = 5, skill_lightningMax = 104, durationInc = -14, }, + [9] = { skill_lightningMin = 6, skill_lightningMax = 123, durationInc = -16, }, + [10] = { skill_lightningMin = 8, skill_lightningMax = 145, durationInc = -18, }, + [11] = { skill_lightningMin = 9, skill_lightningMax = 170, durationInc = -20, }, + [12] = { skill_lightningMin = 10, skill_lightningMax = 199, durationInc = -22, }, + [13] = { skill_lightningMin = 12, skill_lightningMax = 232, durationInc = -24, }, + [14] = { skill_lightningMin = 14, skill_lightningMax = 270, durationInc = -26, }, + [15] = { skill_lightningMin = 17, skill_lightningMax = 314, durationInc = -28, }, + [16] = { skill_lightningMin = 19, skill_lightningMax = 364, durationInc = -30, }, + [17] = { skill_lightningMin = 22, skill_lightningMax = 420, durationInc = -32, }, + [18] = { skill_lightningMin = 26, skill_lightningMax = 485, durationInc = -34, }, + [19] = { skill_lightningMin = 28, skill_lightningMax = 534, durationInc = -36, }, + [20] = { skill_lightningMin = 31, skill_lightningMax = 586, durationInc = -38, }, + [21] = { skill_lightningMin = 34, skill_lightningMax = 644, durationInc = -40, }, + [22] = { skill_lightningMin = 37, skill_lightningMax = 707, durationInc = -42, }, + [23] = { skill_lightningMin = 41, skill_lightningMax = 775, durationInc = -44, }, + [24] = { skill_lightningMin = 45, skill_lightningMax = 850, durationInc = -46, }, + [25] = { skill_lightningMin = 49, skill_lightningMax = 931, durationInc = -48, }, + [26] = { skill_lightningMin = 54, skill_lightningMax = 1019, durationInc = -50, }, + [27] = { skill_lightningMin = 59, skill_lightningMax = 1116, durationInc = -52, }, + [28] = { skill_lightningMin = 64, skill_lightningMax = 1221, durationInc = -54, }, + [29] = { skill_lightningMin = 70, skill_lightningMax = 1335, durationInc = -56, }, + [30] = { skill_lightningMin = 77, skill_lightningMax = 1459, durationInc = -58, }, + } +} +gems["Vaal Molten Shell"] = { + unsupported = true +} +gems["Vaal Power Siphon"] = { + attack = true, + projectile = true, + vaal = true, + showAverage = true, + base = { + }, + quality = { + damageInc = 1, + }, + levels = { + [1] = { attack_damageMore = 1.25, }, + [2] = { attack_damageMore = 1.266, }, + [3] = { attack_damageMore = 1.282, }, + [4] = { attack_damageMore = 1.298, }, + [5] = { attack_damageMore = 1.314, }, + [6] = { attack_damageMore = 1.33, }, + [7] = { attack_damageMore = 1.346, }, + [8] = { attack_damageMore = 1.362, }, + [9] = { attack_damageMore = 1.378, }, + [10] = { attack_damageMore = 1.394, }, + [11] = { attack_damageMore = 1.41, }, + [12] = { attack_damageMore = 1.426, }, + [13] = { attack_damageMore = 1.442, }, + [14] = { attack_damageMore = 1.458, }, + [15] = { attack_damageMore = 1.474, }, + [16] = { attack_damageMore = 1.49, }, + [17] = { attack_damageMore = 1.506, }, + [18] = { attack_damageMore = 1.522, }, + [19] = { attack_damageMore = 1.538, }, + [20] = { attack_damageMore = 1.554, }, + [21] = { attack_damageMore = 1.57, }, + [22] = { attack_damageMore = 1.586, }, + [23] = { attack_damageMore = 1.602, }, + [24] = { attack_damageMore = 1.618, }, + [25] = { attack_damageMore = 1.634, }, + [26] = { attack_damageMore = 1.65, }, + [27] = { attack_damageMore = 1.666, }, + [28] = { attack_damageMore = 1.682, }, + [29] = { attack_damageMore = 1.698, }, + [30] = { attack_damageMore = 1.714, }, + } +} +gems["Vaal Rain of Arrows"] = { + attack = true, + bow = true, + projectile = true, + aoe = true, + duration = true, + vaal = true, + showAverage = true, + base = { + }, + quality = { + aoeRadiusInc = 0.5, + }, + levels = { + [1] = { attack_damageMore = 1.4, skill_durationBase = 3.4, aoeRadiusInc = 0, }, + [2] = { attack_damageMore = 1.415, skill_durationBase = 3.45, aoeRadiusInc = 1, }, + [3] = { attack_damageMore = 1.43, skill_durationBase = 3.5, aoeRadiusInc = 2, }, + [4] = { attack_damageMore = 1.445, skill_durationBase = 3.55, aoeRadiusInc = 3, }, + [5] = { attack_damageMore = 1.46, skill_durationBase = 3.6, aoeRadiusInc = 4, }, + [6] = { attack_damageMore = 1.475, skill_durationBase = 3.65, aoeRadiusInc = 5, }, + [7] = { attack_damageMore = 1.49, skill_durationBase = 3.7, aoeRadiusInc = 6, }, + [8] = { attack_damageMore = 1.505, skill_durationBase = 3.75, aoeRadiusInc = 7, }, + [9] = { attack_damageMore = 1.52, skill_durationBase = 3.8, aoeRadiusInc = 8, }, + [10] = { attack_damageMore = 1.535, skill_durationBase = 3.85, aoeRadiusInc = 9, }, + [11] = { attack_damageMore = 1.55, skill_durationBase = 3.9, aoeRadiusInc = 10, }, + [12] = { attack_damageMore = 1.565, skill_durationBase = 3.95, aoeRadiusInc = 11, }, + [13] = { attack_damageMore = 1.58, skill_durationBase = 4, aoeRadiusInc = 12, }, + [14] = { attack_damageMore = 1.595, skill_durationBase = 4.05, aoeRadiusInc = 13, }, + [15] = { attack_damageMore = 1.61, skill_durationBase = 4.1, aoeRadiusInc = 14, }, + [16] = { attack_damageMore = 1.625, skill_durationBase = 4.15, aoeRadiusInc = 15, }, + [17] = { attack_damageMore = 1.64, skill_durationBase = 4.2, aoeRadiusInc = 16, }, + [18] = { attack_damageMore = 1.655, skill_durationBase = 4.25, aoeRadiusInc = 17, }, + [19] = { attack_damageMore = 1.67, skill_durationBase = 4.3, aoeRadiusInc = 18, }, + [20] = { attack_damageMore = 1.685, skill_durationBase = 4.35, aoeRadiusInc = 19, }, + [21] = { attack_damageMore = 1.7, skill_durationBase = 4.4, aoeRadiusInc = 20, }, + [22] = { attack_damageMore = 1.715, skill_durationBase = 4.45, aoeRadiusInc = 21, }, + [23] = { attack_damageMore = 1.73, skill_durationBase = 4.5, aoeRadiusInc = 22, }, + [24] = { attack_damageMore = 1.745, skill_durationBase = 4.55, aoeRadiusInc = 23, }, + [25] = { attack_damageMore = 1.76, skill_durationBase = 4.6, aoeRadiusInc = 24, }, + [26] = { attack_damageMore = 1.775, skill_durationBase = 4.65, aoeRadiusInc = 25, }, + [27] = { attack_damageMore = 1.79, skill_durationBase = 4.7, aoeRadiusInc = 26, }, + [28] = { attack_damageMore = 1.805, skill_durationBase = 4.75, aoeRadiusInc = 27, }, + [29] = { attack_damageMore = 1.82, skill_durationBase = 4.8, aoeRadiusInc = 28, }, + [30] = { attack_damageMore = 1.835, skill_durationBase = 4.85, aoeRadiusInc = 29, }, + } +} +gems["Vaal Reave"] = { + attack = true, + melee = true, + aoe = true, + vaal = true, + base = { + attackSpeedMore = 2.5, + }, + quality = { + attackSpeedInc = 0.5, + }, + levels = { + [1] = { attack_damageMore = 1, }, + [2] = { attack_damageMore = 1.012, }, + [3] = { attack_damageMore = 1.024, }, + [4] = { attack_damageMore = 1.036, }, + [5] = { attack_damageMore = 1.048, }, + [6] = { attack_damageMore = 1.06, }, + [7] = { attack_damageMore = 1.072, }, + [8] = { attack_damageMore = 1.084, }, + [9] = { attack_damageMore = 1.096, }, + [10] = { attack_damageMore = 1.108, }, + [11] = { attack_damageMore = 1.12, }, + [12] = { attack_damageMore = 1.132, }, + [13] = { attack_damageMore = 1.144, }, + [14] = { attack_damageMore = 1.156, }, + [15] = { attack_damageMore = 1.168, }, + [16] = { attack_damageMore = 1.18, }, + [17] = { attack_damageMore = 1.192, }, + [18] = { attack_damageMore = 1.204, }, + [19] = { attack_damageMore = 1.216, }, + [20] = { attack_damageMore = 1.228, }, + [21] = { attack_damageMore = 1.24, }, + [22] = { attack_damageMore = 1.252, }, + [23] = { attack_damageMore = 1.264, }, + [24] = { attack_damageMore = 1.276, }, + [25] = { attack_damageMore = 1.288, }, + [26] = { attack_damageMore = 1.3, }, + [27] = { attack_damageMore = 1.312, }, + [28] = { attack_damageMore = 1.324, }, + [29] = { attack_damageMore = 1.336, }, + [30] = { attack_damageMore = 1.348, }, + } +} +gems["Vaal Righteous Fire"] = { + spell = true, + aoe = true, + fire = true, + vaal = true, + showAverage = true, + setupFunc = function(mergeMod, output) + mergeMod("skill_fireMin", output.total_energyShield + output.total_life - 1) + mergeMod("skill_fireMax", output.total_energyShield + output.total_life - 1) + end, + base = { + skill_castTime = 1, + skill_critChanceBase = 5, + }, + quality = { + spell_damageInc = 1, + }, + levels = { + [1] = { spell_damageMore = 0.2, }, + [2] = { spell_damageMore = 0.21, }, + [3] = { spell_damageMore = 0.22, }, + [4] = { spell_damageMore = 0.23, }, + [5] = { spell_damageMore = 0.24, }, + [6] = { spell_damageMore = 0.25, }, + [7] = { spell_damageMore = 0.26, }, + [8] = { spell_damageMore = 0.27, }, + [9] = { spell_damageMore = 0.28, }, + [10] = { spell_damageMore = 0.29, }, + [11] = { spell_damageMore = 0.3, }, + [12] = { spell_damageMore = 0.31, }, + [13] = { spell_damageMore = 0.32, }, + [14] = { spell_damageMore = 0.33, }, + [15] = { spell_damageMore = 0.34, }, + [16] = { spell_damageMore = 0.35, }, + [17] = { spell_damageMore = 0.36, }, + [18] = { spell_damageMore = 0.37, }, + [19] = { spell_damageMore = 0.38, }, + [20] = { spell_damageMore = 0.39, }, + [21] = { spell_damageMore = 0.4, }, + [22] = { spell_damageMore = 0.41, }, + [23] = { spell_damageMore = 0.42, }, + [24] = { spell_damageMore = 0.43, }, + [25] = { spell_damageMore = 0.44, }, + [26] = { spell_damageMore = 0.45, }, + [27] = { spell_damageMore = 0.46, }, + [28] = { spell_damageMore = 0.47, }, + [29] = { spell_damageMore = 0.48, }, + [30] = { spell_damageMore = 0.49, }, + } +} +gems["Vaal Spark"] = { + spell = true, + projectile = true, + duration = true, + lightning = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.65, + skill_damageEff = 0.4, + skill_critChanceBase = 5, + skill_durationBase = 2, + }, + quality = { + projectileSpeedInc = 2, + }, + levels = { + [1] = { skill_lightningMin = 1, skill_lightningMax = 11, }, + [2] = { skill_lightningMin = 1, skill_lightningMax = 12, }, + [3] = { skill_lightningMin = 1, skill_lightningMax = 15, }, + [4] = { skill_lightningMin = 1, skill_lightningMax = 19, }, + [5] = { skill_lightningMin = 1, skill_lightningMax = 27, }, + [6] = { skill_lightningMin = 2, skill_lightningMax = 37, }, + [7] = { skill_lightningMin = 3, skill_lightningMax = 48, }, + [8] = { skill_lightningMin = 3, skill_lightningMax = 60, }, + [9] = { skill_lightningMin = 4, skill_lightningMax = 74, }, + [10] = { skill_lightningMin = 5, skill_lightningMax = 91, }, + [11] = { skill_lightningMin = 6, skill_lightningMax = 110, }, + [12] = { skill_lightningMin = 7, skill_lightningMax = 133, }, + [13] = { skill_lightningMin = 8, skill_lightningMax = 159, }, + [14] = { skill_lightningMin = 10, skill_lightningMax = 188, }, + [15] = { skill_lightningMin = 12, skill_lightningMax = 223, }, + [16] = { skill_lightningMin = 14, skill_lightningMax = 263, }, + [17] = { skill_lightningMin = 16, skill_lightningMax = 308, }, + [18] = { skill_lightningMin = 19, skill_lightningMax = 361, }, + [19] = { skill_lightningMin = 21, skill_lightningMax = 405, }, + [20] = { skill_lightningMin = 24, skill_lightningMax = 454, }, + [21] = { skill_lightningMin = 26, skill_lightningMax = 489, }, + [22] = { skill_lightningMin = 28, skill_lightningMax = 527, }, + [23] = { skill_lightningMin = 30, skill_lightningMax = 568, }, + [24] = { skill_lightningMin = 32, skill_lightningMax = 611, }, + [25] = { skill_lightningMin = 35, skill_lightningMax = 658, }, + [26] = { skill_lightningMin = 37, skill_lightningMax = 707, }, + [27] = { skill_lightningMin = 40, skill_lightningMax = 760, }, + [28] = { skill_lightningMin = 43, skill_lightningMax = 816, }, + [29] = { skill_lightningMin = 46, skill_lightningMax = 877, }, + [30] = { skill_lightningMin = 50, skill_lightningMax = 941, }, + } +} +gems["Vaal Spectral Throw"] = { + attack = true, + projectile = true, + vaal = true, + showAverage = true, + base = { + }, + quality = { + attackSpeedInc = 0.5, + }, + levels = { + [1] = { attack_damageMore = 0.7, }, + [2] = { attack_damageMore = 0.718, }, + [3] = { attack_damageMore = 0.736, }, + [4] = { attack_damageMore = 0.754, }, + [5] = { attack_damageMore = 0.772, }, + [6] = { attack_damageMore = 0.79, }, + [7] = { attack_damageMore = 0.808, }, + [8] = { attack_damageMore = 0.826, }, + [9] = { attack_damageMore = 0.844, }, + [10] = { attack_damageMore = 0.862, }, + [11] = { attack_damageMore = 0.88, }, + [12] = { attack_damageMore = 0.898, }, + [13] = { attack_damageMore = 0.916, }, + [14] = { attack_damageMore = 0.934, }, + [15] = { attack_damageMore = 0.952, }, + [16] = { attack_damageMore = 0.97, }, + [17] = { attack_damageMore = 0.988, }, + [18] = { attack_damageMore = 1.006, }, + [19] = { attack_damageMore = 1.024, }, + [20] = { attack_damageMore = 1.042, }, + [21] = { attack_damageMore = 1.06, }, + [22] = { attack_damageMore = 1.078, }, + [23] = { attack_damageMore = 1.096, }, + [24] = { attack_damageMore = 1.114, }, + [25] = { attack_damageMore = 1.132, }, + [26] = { attack_damageMore = 1.15, }, + [27] = { attack_damageMore = 1.168, }, + [28] = { attack_damageMore = 1.186, }, + [29] = { attack_damageMore = 1.204, }, + [30] = { attack_damageMore = 1.222, }, + } +} +gems["Vaal Storm Call"] = { + spell = true, + aoe = true, + duration = true, + lightning = true, + vaal = true, + showAverage = true, + base = { + skill_castTime = 0.5, + skill_damageEff = 0.8, + skill_critChanceBase = 6, + skill_durationBase = 3, + }, + quality = { + aoeRadiusInc = 0.5, + }, + levels = { + [1] = { skill_lightningMin = 13, skill_lightningMax = 25, }, + [2] = { skill_lightningMin = 17, skill_lightningMax = 31, }, + [3] = { skill_lightningMin = 22, skill_lightningMax = 41, }, + [4] = { skill_lightningMin = 29, skill_lightningMax = 53, }, + [5] = { skill_lightningMin = 36, skill_lightningMax = 67, }, + [6] = { skill_lightningMin = 46, skill_lightningMax = 85, }, + [7] = { skill_lightningMin = 57, skill_lightningMax = 105, }, + [8] = { skill_lightningMin = 67, skill_lightningMax = 124, }, + [9] = { skill_lightningMin = 78, skill_lightningMax = 144, }, + [10] = { skill_lightningMin = 90, skill_lightningMax = 168, }, + [11] = { skill_lightningMin = 105, skill_lightningMax = 194, }, + [12] = { skill_lightningMin = 121, skill_lightningMax = 225, }, + [13] = { skill_lightningMin = 140, skill_lightningMax = 259, }, + [14] = { skill_lightningMin = 161, skill_lightningMax = 298, }, + [15] = { skill_lightningMin = 184, skill_lightningMax = 343, }, + [16] = { skill_lightningMin = 211, skill_lightningMax = 393, }, + [17] = { skill_lightningMin = 231, skill_lightningMax = 429, }, + [18] = { skill_lightningMin = 253, skill_lightningMax = 470, }, + [19] = { skill_lightningMin = 276, skill_lightningMax = 513, }, + [20] = { skill_lightningMin = 302, skill_lightningMax = 560, }, + [21] = { skill_lightningMin = 329, skill_lightningMax = 611, }, + [22] = { skill_lightningMin = 359, skill_lightningMax = 666, }, + [23] = { skill_lightningMin = 391, skill_lightningMax = 726, }, + [24] = { skill_lightningMin = 426, skill_lightningMax = 791, }, + [25] = { skill_lightningMin = 464, skill_lightningMax = 861, }, + [26] = { skill_lightningMin = 504, skill_lightningMax = 937, }, + [27] = { skill_lightningMin = 549, skill_lightningMax = 1019, }, + [28] = { skill_lightningMin = 596, skill_lightningMax = 1108, }, + [29] = { skill_lightningMin = 648, skill_lightningMax = 1204, }, + [30] = { skill_lightningMin = 704, skill_lightningMax = 1307, }, + } +} +gems["Vaal Summon Skeletons"] = { + unsupported = true, +} \ No newline at end of file diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index e27be1fd..ee826c2e 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -11,8 +11,6 @@ local m_floor = math.floor local t_insert = table.insert local t_remove = table.remove -LoadModule("Classes/Grid", launch) - local calcs = { } function calcs:Init(build) @@ -35,30 +33,6 @@ function calcs:Shutdown() self.undo = nil end -function calcs:DrawGrid(viewPort, inputEvents) - self.grid.offX = viewPort.x + m_floor((viewPort.width - self.grid.realWidth) / 2) - self.grid.offY = viewPort.y + 2 - for id, event in ipairs(inputEvents) do - if event.type == "KeyDown" then - if event.key == "r" and IsKeyDown("CTRL") then - self:LoadControl() - self.buildFlag = true - elseif event.key == "z" and IsKeyDown("CTRL") then - self:Undo() - elseif event.key == "y" and IsKeyDown("CTRL") then - self:Redo() - else - self.grid:OnKeyDown(event.key, event.doubleClick) - end - elseif event.type == "KeyUp" then - self.grid:OnKeyUp(event.key) - elseif event.type == "Char" then - self.grid:OnChar(event.key) - end - end - self.grid:Draw() -end - function calcs:Load(xml, dbFileName) for _, node in ipairs(xml) do if type(node) == "table" then @@ -100,6 +74,30 @@ function calcs:Save(xml) end end +function calcs:DrawGrid(viewPort, inputEvents) + self.grid.offX = viewPort.x + m_floor((viewPort.width - self.grid.realWidth) / 2) + self.grid.offY = viewPort.y + 2 + for id, event in ipairs(inputEvents) do + if event.type == "KeyDown" then + if event.key == "r" and IsKeyDown("CTRL") then + self:LoadControl() + self.buildFlag = true + elseif event.key == "z" and IsKeyDown("CTRL") then + self:Undo() + elseif event.key == "y" and IsKeyDown("CTRL") then + self:Redo() + else + self.grid:OnKeyDown(event.key, event.doubleClick) + end + elseif event.type == "KeyUp" then + self.grid:OnKeyUp(event.key) + elseif event.type == "Char" then + self.grid:OnChar(event.key) + end + end + self.grid:Draw() +end + function calcs:LoadControl() self.grid:Clear() local errMsg diff --git a/Modules/Data.lua b/Modules/Data.lua index df7ddd29..45b5d40c 100644 --- a/Modules/Data.lua +++ b/Modules/Data.lua @@ -7,25 +7,13 @@ data = { } data.gems = { } -data.gems["_default"] = { - attack = true, - melee = true, - bow = true, - projectile = true, - base = { - }, - quality = { - }, - levels = { - [1] = { } - }, -} LoadModule("Gems/act_str", data.gems) LoadModule("Gems/act_dex", data.gems) LoadModule("Gems/act_int", data.gems) LoadModule("Gems/sup_str", data.gems) LoadModule("Gems/sup_dex", data.gems) LoadModule("Gems/sup_int", data.gems) +LoadModule("Gems/other", data.gems) data.colorCodes = { NORMAL = "^xC8C8C8", @@ -34,7 +22,7 @@ data.colorCodes = { UNIQUE = "^xAF6025", FIRE = "^x960000", COLD = "^x366492", - LIGHT = "^xFFD700", + LIGHTNING = "^xFFD700", CHAOS = "^xD02090", } diff --git a/Modules/Items.lua b/Modules/Items.lua index cfea448e..3093f32e 100644 --- a/Modules/Items.lua +++ b/Modules/Items.lua @@ -9,8 +9,6 @@ local t_insert = table.insert local m_floor = math.floor local s_format = string.format -LoadModule("Classes/ItemSlot", launch, main) - local baseSlots = { "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring 1", "Ring 2", "Belt", "Weapon 1", "Weapon 2" } local items = { } @@ -40,6 +38,9 @@ function items:Init(build) end function items:Shutdown() + self.controls = nil + self.slots = nil + self.list = nil end function items:Load(xml, dbFileName) @@ -165,7 +166,7 @@ function items:UpdateJewels() local slot = self.sockets[nodeId] self.controls["socket"..nodeId] = slot slot.inactive = false - slot.y = (#baseSlots + index - 1) * 20 + slot.baseY = (#baseSlots + index - 1) * 20 end end @@ -254,9 +255,23 @@ function items:ParseItemRaw(item) item.type = data.itemBases[item.baseName].type end item.modLines = { } + item.implicitLines = 0 + local gameModeStage = "FINDIMPLICIT" + local gameModeSection = 1 + local foundExplicit while item.rawLines[l] do local line = item.rawLines[l] - if data.weaponTypeInfo[line] then + if line == "--------" then + gameModeSection = gameModeSection + 1 + if gameModeStage == "IMPLICIT" then + item.implicitLines = #item.modLines + gameModeStage = "FINDEXPLICIT" + elseif gameModeStage == "EXPLICIT" then + gameModeStage = "DONE" + end + elseif line == "Corrupted" then + item.corrupted = true + elseif data.weaponTypeInfo[line] then item.weaponType = line else local specName, specVal = line:match("^([%a ]+): %+?([%d%-%.]+)") @@ -280,11 +295,33 @@ function items:ParseItemRaw(item) local modList, extra = mod.parseMod(rangedLine or line) if modList then t_insert(item.modLines, { line = line, extra = extra, mods = modList, range = rangedLine and 1 }) + if mode == "GAME" then + if gameModeStage == "FINDIMPLICIT" then + gameModeStage = "IMPLICIT" + elseif gameModeStage == "FINDEXPLICIT" then + foundExplicit = true + gameModeStage = "EXPLICIT" + end + end + elseif mode == "GAME" then + if gameModeStage == "IMPLICIT" or gameModeStage == "EXPLICIT" then + t_insert(item.modLines, { line = line, extra = line, mods = { } }) + elseif gameModeStage == "FINDEXPLICIT" then + gameModeStage = "DONE" + end end end end l = l + 1 end + local base = data.itemBases[item.baseName] + if base and base.implicit then + if item.implicitLines == 0 then + item.implicitLines = 1 + end + elseif mode == "GAME" and not foundExplicit then + item.implicitLines = 0 + end self:BuildItemModList(item) end @@ -385,21 +422,39 @@ function items:AddItemTooltip(item) main:AddTooltipSeperator(10) main:AddTooltipLine(16, s_format("^x7F7F7F%s", base.type)) main:AddTooltipLine(16, "^x7F7F7FQuality: "..data.colorCodes.MAGIC.."+20%") + local totalDamage = 0 + local totalDamageTypes = 0 if modList.weaponX_physicalMin then - main:AddTooltipLine(16, s_format("^x7F7F7FPhysical Damage: "..data.colorCodes.MAGIC.."%d-%d", modList.weaponX_physicalMin, modList.weaponX_physicalMax)) + totalDamage = totalDamage + (modList.weaponX_physicalMin + modList.weaponX_physicalMax) / 2 + local physicalDPS = (modList.weaponX_physicalMin + modList.weaponX_physicalMax) / 2 * modList.weaponX_attackRate + main:AddTooltipLine(16, s_format("^x7F7F7FPhysical Damage: "..data.colorCodes.MAGIC.."%d-%d (%.1f DPS)", modList.weaponX_physicalMin, modList.weaponX_physicalMax, physicalDPS)) + totalDamageTypes = totalDamageTypes + 1 end local elemLine + local elemTotal = 0 for _, var in ipairs({"fire","cold","lightning"}) do - if modList["weaponX_"..var.."Min"] then + local min = modList["weaponX_"..var.."Min"] + local max = modList["weaponX_"..var.."Max"] + if min and max then elemLine = elemLine and elemLine.."^x7F7F7F, " or "^x7F7F7FElemental Damage: " - elemLine = elemLine..s_format("%s%d-%d", data.colorCodes[var:upper()], modList["weaponX_"..var.."Min"], modList["weaponX_"..var.."Max"]) + elemLine = elemLine..s_format("%s%d-%d", data.colorCodes[var:upper()], min, max) + elemTotal = elemTotal + (min + max) / 2 end end + totalDamage = totalDamage + elemTotal if elemLine then main:AddTooltipLine(16, elemLine) + main:AddTooltipLine(16, s_format("^x7F7F7FElemental DPS: "..data.colorCodes.MAGIC.."%.1f", elemTotal * modList.weaponX_attackRate)) + totalDamageTypes = totalDamageTypes + 1 end if modList.weaponX_chaosMin then - main:AddTooltipLine(16, s_format("^x7F7F7FChaos Damage: "..data.colorCodes.CHAOS.."%d-%d", modList.weaponX_chaosMin, modList.weaponX_chaosMax)) + totalDamage = totalDamage + (modList.weaponX_chaosMin + modList.weaponX_chaosMax) / 2 + local chaosDPS = (modList.weaponX_chaosMin + modList.weaponX_chaosMax) / 2 * modList.weaponX_attackRate + main:AddTooltipLine(16, s_format("^x7F7F7FChaos Damage: "..data.colorCodes.CHAOS.."%d-%d "..data.colorCodes.MAGIC.."(%.1f DPS)", modList.weaponX_chaosMin, modList.weaponX_chaosMax, chaosDPS)) + totalDamageTypes = totalDamageTypes + 1 + end + if totalDamageTypes > 1 then + main:AddTooltipLine(16, s_format("^x7F7F7FTotal DPS: "..data.colorCodes.MAGIC.."%.1f", totalDamage * modList.weaponX_attackRate)) end main:AddTooltipLine(16, s_format("^x7F7F7FCritical Strike Chance: %s%.2f%%", modList.weaponX_critChanceBase ~= base.weapon.critChanceBase and data.colorCodes.MAGIC or "^7", modList.weaponX_critChanceBase)) main:AddTooltipLine(16, s_format("^x7F7F7FAttacks per Second: %s%.2f", modList.weaponX_attackRate ~= base.weapon.attackRateBase and data.colorCodes.MAGIC or "^7", modList.weaponX_attackRate)) @@ -424,11 +479,17 @@ function items:AddItemTooltip(item) for index, modLine in pairs(item.modLines) do local line = modLine.range and self:ApplyRange(modLine.line, modLine.range) or modLine.line main:AddTooltipLine(16, (modLine.extra and data.colorCodes.NORMAL or data.colorCodes.MAGIC)..line) - if index == 1 and base.implicit and item.modLines[2] then + if index == item.implicitLines and item.modLines[index + 1] then main:AddTooltipSeperator(10) end end end + if item.corrupted then + if #item.modLines == item.implicitLines then + main:AddTooltipSeperator(10) + end + main:AddTooltipLine(16, "^1Corrupted") + end self:UpdateJewels() for slotName, slot in pairs(self.slots) do local selItem = self.list[slot.selItem] diff --git a/Modules/Main.lua b/Modules/Main.lua index 60d97be8..d221e5f5 100644 --- a/Modules/Main.lua +++ b/Modules/Main.lua @@ -13,12 +13,14 @@ local t_insert = table.insert LoadModule("Modules/Data") LoadModule("Modules/ModTools") -LoadModule("Classes/PassiveTree", launch) -LoadModule("Classes/PassiveSpec", launch) -LoadModule("Classes/PassiveTreeView", launch) - local main = { } +LoadModule("Classes/PassiveTree", launch, main) +LoadModule("Classes/PassiveSpec", launch, main) +LoadModule("Classes/PassiveTreeView", launch, main) +LoadModule("Classes/Grid", launch, main) +LoadModule("Classes/ItemSlot", launch, main) + function main:Init() self.modes = { } self.modes["LIST"] = LoadModule("Modules/BuildList", launch, self) diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 028d043e..fa6912f2 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -33,6 +33,7 @@ local modNameList = { ["strength and dexterity"] = { "str{suf}", "dex{suf}" }, ["strength and intelligence"] = { "str{suf}", "int{suf}" }, ["dexterity and intelligence"] = { "dex{suf}", "int{suf}" }, + ["attributes"] = { "str{suf}", "dex{suf}", "int{suf}" }, ["all attributes"] = { "str{suf}", "dex{suf}", "int{suf}" }, -- Life/mana ["maximum life"] = "life{suf}", @@ -47,6 +48,7 @@ local modNameList = { ["energy shield recharge rate"] = "energyShieldRecharge{suf}", ["armour"] = "armour{suf}", ["evasion rating"] = "evasion{suf}", + ["global evasion rating"] = "global_evasion{suf}", ["energy shield"] = "energyShield{suf}", ["armour and evasion"] = "armourAndEvasion{suf}", ["armour and evasion rating"] = "armourAndEvasion{suf}", @@ -67,6 +69,7 @@ local modNameList = { ["cold and lightning resistances"] = { "coldResist", "lightningResist" }, ["elemental resistances"] = "elemResist", ["all elemental resistances"] = "elemResist", + ["all maximum resistances"] = { "fireResistMax", "coldResistMax", "lightningResistMax", "chaosResistMax" }, ["chaos resistance"] = "chaosResist", -- Other defences ["to dodge attacks"] = "dodgeAttack", @@ -154,6 +157,7 @@ local modNameList = { ["melee physical damage"] = "melee_physical{suf}", ["wand damage"] = "wand_damage{suf}", ["wand physical damage"] = "wand_physical{suf}", + ["claw physical damage"] = "claw_physical{suf}", ["damage over time"] = "dot_damage{suf}", ["physical damage over time"] = "dot_physical{suf}", ["burning damage"] = "degen_fire{suf}", @@ -223,6 +227,7 @@ local namespaceList = { ["with traps"] = "trap_", ["totem"] = "totem_", ["with totem skills"] = "totem_", + ["with movement skills"] = "movement_", ["with lightning skills"] = "lightning_", ["with cold skills"] = "cold_", ["with fire skills"] = "fire_", @@ -275,6 +280,7 @@ local specialSpaceList = { ["against bleeding enemies"] = "condMod_EnemyBleeding_", ["against poisoned enemies"] = "condMod_EnemyPoisoned_", ["against burning enemies"] = "condMod_EnemyBurning_", + ["against ignited enemies"] = "condMod_EnemyIgnited_", ["enemies which are chilled"] = "condMod_EnemyChilled_", ["against frozen, shocked or ignited enemies"] = "condMod_EnemyFrozenShockedIgnited_", ["against enemies that are affected by elemental status ailments"] = "condMod_EnemyElementalStatus_", @@ -316,8 +322,8 @@ local specialModList = { ["cannot be ignited"] = { avoidIgnite = 100 }, ["cannot be stunned"] = { stunImmunity = true }, ["deal no physical damage"] = { physicalFinalMore = 0 }, + ["your critical strikes do not deal extra damage"] = { noCritMult = true }, ["iron will"] = { ironWill = true }, - ["extra gore"] = { }, -- Special item local modifiers ["no physical damage"] = { weaponNoPhysical = true }, ["all attacks with this weapon are critical strikes"] = { weaponAlwaysCrit = true }, @@ -326,9 +332,11 @@ local specialModList = { ["causes bleeding on hit"] = { bleedChance = 100 }, ["poisonous hit"] = { poisonChance = 100 }, ["your chaos damage poisons enemies"] = { poisonChance = 100 }, + ["has no sockets"] = { }, ["has 1 socket"] = { }, ["socketed gems have (.+)"] = { }, - ["socketed gems are Supported by (.+)"] = { }, + ["socketed gems are supported by (.+)"] = { }, + ["+(%d) to level of socketed gems"] = { }, ["+(%d) to level of socketed (%a+) gems"] = { }, ["grants level (%d+) (.+) skill"] = { }, -- Unique item modifiers diff --git a/PathOfBuilding.sln b/PathOfBuilding.sln index 89ceca1c..da2a5f59 100644 --- a/PathOfBuilding.sln +++ b/PathOfBuilding.sln @@ -14,6 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Gem DB", "Gem DB", "{EE9D06 Gems\act_dex.lua = Gems\act_dex.lua Gems\act_int.lua = Gems\act_int.lua Gems\act_str.lua = Gems\act_str.lua + Gems\other.lua = Gems\other.lua Gems\sup_dex.lua = Gems\sup_dex.lua Gems\sup_int.lua = Gems\sup_int.lua Gems\sup_str.lua = Gems\sup_str.lua