diff --git a/Classes/ItemsTab.lua b/Classes/ItemsTab.lua index d22d5e5d8..ad77e4817 100644 --- a/Classes/ItemsTab.lua +++ b/Classes/ItemsTab.lua @@ -151,10 +151,16 @@ If there's 2 slots an item can go in, holding Shift will put it in the second.]] self.controls.displayItemVariant.shown = function() return self.displayItem.variantList and #self.displayItem.variantList > 1 end + self.controls.displayItemEnchant = common.New("ButtonControl", {"TOPLEFT",self.controls.addDisplayItem,"BOTTOMLEFT"}, 0, 8, 160, 20, "Apply Enchantment...", function() + self:EnchantDisplayItem() + end) + self.controls.displayItemEnchant.shown = function() + return self.displayItem.enchantments + end for i = 1, 6 do local prev = self.controls["displayItemAffix"..(i-1)] or self.controls.addDisplayItem local drop - drop = common.New("DropDownControl", {"TOPLEFT",prev,"BOTTOMLEFT"}, i==1 and 40 or 0, i == 1 and 8 or 2, 418, 20, nil, function(sel, value) + drop = common.New("DropDownControl", {"TOPLEFT",prev,"BOTTOMLEFT"}, i==1 and 40 or 0, i == 1 and function() return self.displayItem.enchantments and 28 or 8 end or 2, 418, 20, nil, function(sel, value) self.displayItem[drop.outputTable][drop.outputIndex] = value.value itemLib.craftItem(self.displayItem) self:UpdateDisplayItemRangeLines() @@ -178,7 +184,7 @@ If there's 2 slots an item can go in, holding Shift will put it in the second.]] self.controls.displayItemRangeSlider.val = self.displayItem.rangeLineList[sel].range end) self.controls.displayItemRangeLine.y = function() - return 8 + (self.displayItem and self.displayItem.craftable and (self.displayItem.affixLimit * 22 + 6) or 0) + return 8 + (self.displayItem and self.displayItem.enchantments and 28 or 0) + (self.displayItem and self.displayItem.craftable and (self.displayItem.affixLimit * 22 + 6) or 0) end self.controls.displayItemRangeLine.shown = function() return self.displayItem.rangeLineList[1] ~= nil @@ -288,6 +294,9 @@ function ItemsTabClass:Draw(viewPort, inputEvents) if self.displayItem then local extraOffset = self.controls.displayItemRangeLine:IsShown() and 26 or 0 + if self.displayItem.enchantments then + extraOffset = extraOffset + 28 + end if self.displayItem.craftable then extraOffset = extraOffset + self.displayItem.affixLimit * 22 + 6 end @@ -336,10 +345,10 @@ end -- Opens the item crafting popup function ItemsTabClass:CraftItem() - local popup + local controls = { } local function makeItem(base) local item = { name = base.name, base = base.base, baseName = base.name, modLines = { }, quality = 0 } - local raritySel = popup.controls.rarity.sel + local raritySel = controls.rarity.sel if base.base.flask then if raritySel == 3 then raritySel = 2 @@ -348,9 +357,9 @@ function ItemsTabClass:CraftItem() if data.itemMods[base.base.type] and (raritySel == 2 or raritySel == 3) then item.crafted = true end - item.rarity = popup.controls.rarity.list[raritySel].val + item.rarity = controls.rarity.list[raritySel].val if raritySel >= 3 then - item.title = popup.controls.title.buf:match("%S") and popup.controls.title.buf or "New Item" + item.title = controls.title.buf:match("%S") and controls.title.buf or "New Item" end item.implicitLines = 0 if base.base.implicit then @@ -363,84 +372,88 @@ function ItemsTabClass:CraftItem() itemLib.normaliseQuality(item) return itemLib.makeItemFromRaw(itemLib.createItemRaw(item)) end - popup = main:OpenPopup(370, 130, "Craft Item", { - common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 20, 0, 16, "Rarity:"), - title = common.New("EditControl", nil, 70, 20, 190, 18, "", "Name"), - rarity = common.New("DropDownControl", nil, -80, 20, 100, 18, { {val = "NORMAL",label=data.colorCodes.NORMAL.."Normal"},{val="MAGIC",label=data.colorCodes.MAGIC.."Magic"},{val="RARE",label=data.colorCodes.RARE.."Rare"},{val="UNIQUE",label=data.colorCodes.UNIQUE.."Unique"} }), - common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 45, 0, 16, "Type:"), - type = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 55, 45, 295, 18, self.baseTypeList, function(sel, value) - popup.controls.base.list = self.baseLists[self.baseTypeList[sel]] - popup.controls.base.sel = 1 - end), - common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 70, 0, 16, "Base:"), - base = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 55, 70, 200, 18), - save = common.New("ButtonControl", nil, -45, 100, 80, 20, "Create", function() - main:ClosePopup() - local item = makeItem(popup.controls.base.list[popup.controls.base.sel]) - self:SetDisplayItem(item) - if not item.craftable and item.rarity ~= "NORMAL" then - self:EditDisplayItemText() - end - self.lastCraftRaritySel = popup.controls.rarity.sel - self.lastCraftTypeSel = popup.controls.type.sel - self.lastCraftBaseSel = popup.controls.base.sel - end), - common.New("ButtonControl", nil, 45, 100, 80, 20, "Cancel", function() - main:ClosePopup() - end), + controls.rarityLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 20, 0, 16, "Rarity:") + controls.rarity = common.New("DropDownControl", nil, -80, 20, 100, 18, { + {val = "NORMAL",label=data.colorCodes.NORMAL.."Normal"}, + {val="MAGIC",label=data.colorCodes.MAGIC.."Magic"}, + {val="RARE",label=data.colorCodes.RARE.."Rare"}, + {val="UNIQUE",label=data.colorCodes.UNIQUE.."Unique"} }) - popup.controls.rarity.sel = self.lastCraftRaritySel or 3 - popup.controls.type.sel = self.lastCraftTypeSel or 1 - popup.controls.base.list = self.baseLists[self.baseTypeList[popup.controls.type.sel]] - popup.controls.base.sel = self.lastCraftBaseSel or 1 - popup.controls.title.shown = function() - return popup.controls.rarity.sel >= 3 - end - popup.controls.base.tooltipFunc = function(mode, sel, selVal) + controls.rarity.sel = self.lastCraftRaritySel or 3 + controls.title = common.New("EditControl", nil, 70, 20, 190, 18, "", "Name") + controls.title.shown = function() + return controls.rarity.sel >= 3 + end + controls.typeLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 45, 0, 16, "Type:") + controls.type = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 55, 45, 295, 18, self.baseTypeList, function(sel, value) + controls.base.list = self.baseLists[self.baseTypeList[sel]] + controls.base.sel = 1 + end) + controls.type.sel = self.lastCraftTypeSel or 1 + controls.baseLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 50, 70, 0, 16, "Base:") + controls.base = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 55, 70, 200, 18, self.baseLists[self.baseTypeList[controls.type.sel]]) + controls.base.sel = self.lastCraftBaseSel or 1 + controls.base.tooltipFunc = function(mode, sel, selVal) if mode ~= "OUT" then local item = makeItem(selVal) self:AddItemTooltip(item, nil, true) return data.colorCodes[item.rarity], true end end + controls.save = common.New("ButtonControl", nil, -45, 100, 80, 20, "Create", function() + main:ClosePopup() + local item = makeItem(controls.base.list[controls.base.sel]) + self:SetDisplayItem(item) + if not item.craftable and item.rarity ~= "NORMAL" then + self:EditDisplayItemText() + end + self.lastCraftRaritySel = controls.rarity.sel + self.lastCraftTypeSel = controls.type.sel + self.lastCraftBaseSel = controls.base.sel + end) + controls.cancel = common.New("ButtonControl", nil, 45, 100, 80, 20, "Cancel", function() + main:ClosePopup() + end) + main:OpenPopup(370, 130, "Craft Item", controls) end -- Opens the item text editor popup function ItemsTabClass:EditDisplayItemText() - local popup + local controls = { } local function buildRaw() - local editBuf = popup.controls.edit.buf + local editBuf = controls.edit.buf if editBuf:match("^Rarity: ") then return editBuf else - return "Rarity: "..popup.controls.rarity.list[popup.controls.rarity.sel].val.."\n"..popup.controls.edit.buf - end - end - popup = main:OpenPopup(500, 500, self.displayItem and "Edit Item Text" or "Create Custom Item from Text", { - rarity = common.New("DropDownControl", nil, -190, 10, 100, 18, { {val="NORMAL",label=data.colorCodes.NORMAL.."Normal"},{val="MAGIC",label=data.colorCodes.MAGIC.."Magic"},{val="RARE",label=data.colorCodes.RARE.."Rare"},{val="UNIQUE",label=data.colorCodes.UNIQUE.."Unique"},{val="RELIC",label=data.colorCodes.RELIC.."Relic"} }), - edit = common.New("EditControl", nil, 0, 40, 480, 420, "", nil, "^%C\t\n", nil, nil, 14), - save = common.New("ButtonControl", nil, -45, 470, 80, 20, self.displayItem and "Save" or "Create", function() - local id = self.displayItem and self.displayItem.id - self:CreateDisplayItemFromRaw(buildRaw(), not self.displayItem) - self.displayItem.id = id - main:ClosePopup() - end), - common.New("ButtonControl", nil, 45, 470, 80, 20, "Cancel", function() - main:ClosePopup() - end), - }, nil, "edit") + return "Rarity: "..controls.rarity.list[controls.rarity.sel].val.."\n"..controls.edit.buf + end + end + controls.rarity = common.New("DropDownControl", nil, -190, 10, 100, 18, { + {val="NORMAL",label=data.colorCodes.NORMAL.."Normal"}, + {val="MAGIC",label=data.colorCodes.MAGIC.."Magic"}, + {val="RARE",label=data.colorCodes.RARE.."Rare"}, + {val="UNIQUE",label=data.colorCodes.UNIQUE.."Unique"}, + {val="RELIC",label=data.colorCodes.RELIC.."Relic"} + }) + controls.edit = common.New("EditControl", nil, 0, 40, 480, 420, "", nil, "^%C\t\n", nil, nil, 14) if self.displayItem then - popup.controls.edit:SetText(itemLib.createItemRaw(self.displayItem):gsub("Rarity: %w+\n","")) - popup.controls.rarity:SelByValue(self.displayItem.rarity) + controls.edit:SetText(itemLib.createItemRaw(self.displayItem):gsub("Rarity: %w+\n","")) + controls.rarity:SelByValue(self.displayItem.rarity) else - popup.controls.rarity.sel = 3 + controls.rarity.sel = 3 end - popup.controls.edit.font = "FIXED" - popup.controls.save.enabled = function() + controls.edit.font = "FIXED" + controls.save = common.New("ButtonControl", nil, -45, 470, 80, 20, self.displayItem and "Save" or "Create", function() + local id = self.displayItem and self.displayItem.id + self:CreateDisplayItemFromRaw(buildRaw(), not self.displayItem) + self.displayItem.id = id + main:ClosePopup() + end) + controls.save.enabled = function() local item = itemLib.makeItemFromRaw(buildRaw()) return item ~= nil end - popup.controls.save.tooltipFunc = function() + controls.save.tooltipFunc = function() local item = itemLib.makeItemFromRaw(buildRaw()) if item then self:AddItemTooltip(item, nil, true) @@ -455,6 +468,112 @@ function ItemsTabClass:EditDisplayItemText() main:AddTooltipLine(14, "Scholar's Platinum Kris of Joy") end end + controls.cancel = common.New("ButtonControl", nil, 45, 470, 80, 20, "Cancel", function() + main:ClosePopup() + end) + main:OpenPopup(500, 500, self.displayItem and "Edit Item Text" or "Create Custom Item from Text", controls, nil, "edit") +end + +-- Opens the item enchanting popup +function ItemsTabClass:EnchantDisplayItem() + local controls = { } + local enchantments = self.displayItem.enchantments + local haveSkills = not self.displayItem.enchantments[data.labyrinths[1].name] + local skillList = { } + local skillsUsed = { } + if haveSkills then + for _, socketGroup in ipairs(self.build.skillsTab.socketGroupList) do + for _, gem in ipairs(socketGroup.gemList) do + if gem.data and not gem.data.support then + skillsUsed[gem.name] = true + break + end + end + end + end + local function buildSkillList(onlyUsedSkills) + wipeTable(skillList) + for skillName in pairs(enchantments) do + if not onlyUsedSkills or not next(skillsUsed) or skillsUsed[skillName] then + t_insert(skillList, skillName) + end + end + table.sort(skillList) + end + local labyrinthList = { } + local function buildLabyrinthList() + wipeTable(labyrinthList) + local list = haveSkills and enchantments[skillList[controls.skill and controls.skill.sel or 1]] or enchantments + for _, lab in ipairs(data.labyrinths) do + if list[lab.name] then + t_insert(labyrinthList, lab) + end + end + end + local enchantmentList = { } + local function buildEnchantmentList() + wipeTable(enchantmentList) + local list = haveSkills and enchantments[skillList[controls.skill and controls.skill.sel or 1]] or enchantments + for _, enchantment in ipairs(list[labyrinthList[controls.labyrinth and controls.labyrinth.sel or 1].name]) do + t_insert(enchantmentList, enchantment) + end + end + if haveSkills then + buildSkillList(true) + end + buildLabyrinthList() + buildEnchantmentList() + local function enchantItem() + local item = itemLib.makeItemFromRaw(itemLib.createItemRaw(self.displayItem)) + item.id = self.displayItem.id + for i = 1, item.implicitLines do + t_remove(item.modLines, 1) + end + local list = haveSkills and enchantments[controls.skill.list[controls.skill.sel]] or enchantments + t_insert(item.modLines, 1, { crafted = true, line = list[controls.labyrinth.list[controls.labyrinth.sel].name][controls.enchantment.sel] }) + item.implicitLines = 1 + item.raw = itemLib.createItemRaw(item) + itemLib.parseItemRaw(item) + return item + end + if haveSkills then + controls.skillLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 95, 20, 0, 16, "Skill:") + controls.skill = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 100, 20, 180, 18, skillList, function(sel, value) + buildLabyrinthList() + buildEnchantmentList() + controls.enchantment:SetSel(1) + end) + controls.allSkills = common.New("CheckBoxControl", {"TOPLEFT",nil,"TOPLEFT"}, 350, 20, 18, "All skills:", function(state) + buildSkillList(not state) + controls.skill:SetSel(1) + buildEnchantmentList() + controls.enchantment:SetSel(1) + end) + controls.allSkills.tooltip = "Show all skills, not just those used by this build." + if not next(skillsUsed) then + controls.allSkills.state = true + controls.allSkills.enabled = false + end + end + controls.labyrinthLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 95, 45, 0, 16, "Labyrinth:") + controls.labyrinth = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 100, 45, 100, 18, labyrinthList, function(sel, value) + buildEnchantmentList() + end) + controls.enchantmentLabel = common.New("LabelControl", {"TOPRIGHT",nil,"TOPLEFT"}, 95, 70, 0, 16, "Enchantment:") + controls.enchantment = common.New("DropDownControl", {"TOPLEFT",nil,"TOPLEFT"}, 100, 70, 440, 18, enchantmentList) + controls.save = common.New("ButtonControl", nil, -45, 100, 80, 20, "Enchant", function() + self:SetDisplayItem(enchantItem()) + main:ClosePopup() + end) + controls.save.tooltipFunc = function() + local item = enchantItem() + self:AddItemTooltip(item, nil, true) + return data.colorCodes[item.rarity], true + end + controls.close = common.New("ButtonControl", nil, 45, 100, 80, 20, "Cancel", function() + main:ClosePopup() + end) + main:OpenPopup(550, 130, "Enchant Item", controls) end -- Attempt to create a new item from the given item raw text and sets it as the new display item diff --git a/Classes/TreeTab.lua b/Classes/TreeTab.lua index 24ee99deb..7b0913715 100644 --- a/Classes/TreeTab.lua +++ b/Classes/TreeTab.lua @@ -201,97 +201,91 @@ function TreeTabClass:OpenSpecManagePopup() end function TreeTabClass:OpenImportPopup() - local treeLink = "" - local showMsg - local popup - popup = main:OpenPopup(380, 110, "Import Tree", { - common.New("LabelControl", nil, 0, 20, 0, 16, "Enter passive tree link:"), - edit = common.New("EditControl", nil, 0, 40, 350, 18, "", nil, nil, nil, function(buf) - treeLink = buf - showMsg = nil - end), - common.New("LabelControl", nil, 0, 58, 0, 16, function() return showMsg or "" end), - import = common.New("ButtonControl", nil, -45, 80, 80, 20, "Import", function() - if #treeLink > 0 then - if treeLink:match("poeurl%.com/") then - popup.controls.import.enabled = false - showMsg = "Resolving PoEURL link..." - local id = LaunchSubScript([[ - local treeLink = ... - local curl = require("lcurl.safe") - local easy = curl.easy() - easy:setopt_url(treeLink) - easy:setopt_writefunction(function(data) - return true - end) - easy:perform() - local redirect = easy:getinfo(curl.INFO_REDIRECT_URL) - easy:close() - if not redirect or redirect:match("poeurl%.com/") then - return nil, "Failed to resolve PoEURL link" - end - return redirect - ]], "", "", treeLink) - if id then - launch:RegisterSubScript(id, function(treeLink, errMsg) - if errMsg then - showMsg = "^1"..errMsg - popup.controls.import.enabled = true - else - local errMsg = self.build.spec:DecodeURL(treeLink) - if errMsg then - showMsg = "^1"..errMsg - else - self.build.spec:AddUndoState() - self.build.buildFlag = true - main:ClosePopup() - end - end - end) - end - else - local errMsg = self.build.spec:DecodeURL(treeLink) + local controls = { } + local function decodeTreeLink(treeLink) + local errMsg = self.build.spec:DecodeURL(treeLink) + if errMsg then + controls.msg.label = "^1"..errMsg + else + self.build.spec:AddUndoState() + self.build.buildFlag = true + main:ClosePopup() + end + end + controls.editLabel = common.New("LabelControl", nil, 0, 20, 0, 16, "Enter passive tree link:") + controls.edit = common.New("EditControl", nil, 0, 40, 350, 18, "", nil, nil, nil, function(buf) + controls.msg.label = "" + end) + controls.msg = common.New("LabelControl", nil, 0, 58, 0, 16, "") + controls.import = common.New("ButtonControl", nil, -45, 80, 80, 20, "Import", function() + local treeLink = controls.edit.buf + if #treeLink == 0 then + return + end + if treeLink:match("poeurl%.com/") then + controls.import.enabled = false + controls.msg.label = "Resolving PoEURL link..." + local id = LaunchSubScript([[ + local treeLink = ... + local curl = require("lcurl.safe") + local easy = curl.easy() + easy:setopt_url(treeLink) + easy:setopt_writefunction(function(data) + return true + end) + easy:perform() + local redirect = easy:getinfo(curl.INFO_REDIRECT_URL) + easy:close() + if not redirect or redirect:match("poeurl%.com/") then + return nil, "Failed to resolve PoEURL link" + end + return redirect + ]], "", "", treeLink) + if id then + launch:RegisterSubScript(id, function(treeLink, errMsg) if errMsg then - showMsg = "^1"..errMsg + controls.msg.label = "^1"..errMsg + controls.import.enabled = true else - self.build.spec:AddUndoState() - self.build.buildFlag = true - main:ClosePopup() + decodeTreeLink(treeLink) end - end + end) end - end), - common.New("ButtonControl", nil, 45, 80, 80, 20, "Cancel", function() - main:ClosePopup() - end), - }, "import", "edit") + else + decodeTreeLink(treeLink) + end + end) + controls.cancel = common.New("ButtonControl", nil, 45, 80, 80, 20, "Cancel", function() + main:ClosePopup() + end) + main:OpenPopup(380, 110, "Import Tree", controls, "import", "edit") end function TreeTabClass:OpenExportPopup() local treeLink = self.build.spec:EncodeURL("https://www.pathofexile.com/passive-skill-tree/") local popup - popup = main:OpenPopup(380, 100, "Export Tree", { - common.New("LabelControl", nil, 0, 20, 0, 16, "Passive tree link:"), - edit = common.New("EditControl", nil, 0, 40, 350, 18, treeLink, nil, "%Z"), - shrink = common.New("ButtonControl", nil, -90, 70, 140, 20, "Shrink with PoEURL", function() - popup.controls.shrink.enabled = false - popup.controls.shrink.label = "Shrinking..." - launch:DownloadPage("http://poeurl.com/shrink.php?url="..treeLink, function(page, errMsg) - popup.controls.shrink.label = "Done" - if errMsg or not page:match("%S") then - main:OpenMessagePopup("PoEURL Shortener", "Failed to get PoEURL link. Try again later.") - else - treeLink = "http://poeurl.com/"..page - popup.controls.edit:SetText(treeLink) - popup:SelectControl(popup.controls.edit) - end - end) - end), - common.New("ButtonControl", nil, 30, 70, 80, 20, "Copy", function() - Copy(treeLink) - end), - done = common.New("ButtonControl", nil, 120, 70, 80, 20, "Done", function() - main:ClosePopup() - end), - }, "done", "edit") + local controls = { } + controls.label = common.New("LabelControl", nil, 0, 20, 0, 16, "Passive tree link:") + controls.edit = common.New("EditControl", nil, 0, 40, 350, 18, treeLink, nil, "%Z") + controls.shrink = common.New("ButtonControl", nil, -90, 70, 140, 20, "Shrink with PoEURL", function() + controls.shrink.enabled = false + controls.shrink.label = "Shrinking..." + launch:DownloadPage("http://poeurl.com/shrink.php?url="..treeLink, function(page, errMsg) + controls.shrink.label = "Done" + if errMsg or not page:match("%S") then + main:OpenMessagePopup("PoEURL Shortener", "Failed to get PoEURL link. Try again later.") + else + treeLink = "http://poeurl.com/"..page + controls.edit:SetText(treeLink) + popup:SelectControl(controls.edit) + end + end) + end) + controls.copy = common.New("ButtonControl", nil, 30, 70, 80, 20, "Copy", function() + Copy(treeLink) + end) + controls.done = common.New("ButtonControl", nil, 120, 70, 80, 20, "Done", function() + main:ClosePopup() + end) + popup = main:OpenPopup(380, 100, "Export Tree", controls, "done", "edit") end \ No newline at end of file diff --git a/Data/EnchantmentBoots.lua b/Data/EnchantmentBoots.lua new file mode 100644 index 000000000..82c1bc6c1 --- /dev/null +++ b/Data/EnchantmentBoots.lua @@ -0,0 +1,55 @@ +-- Item data (c) Grinding Gear Games + +return { + ["CRUEL"] = { + "Adds 16 to 24 Fire Damage if you've Killed Recently", + "Adds 16 to 24 Cold Damage if you've been Hit Recently", + "Adds 1 to 56 Lightning Damage if you haven't Killed Recently", + "Adds 44 to 64 Chaos Damage if you've taken a Critical Strike Recently", + "8% increased Attack and Cast Speed if you've Killed Recently", + "60% increased Critical Strike Chance if you haven't Crit Recently", + "6% chance to Freeze, Shock and Ignite if you haven't Crit Recently", + "Damage Penetrates 6% of Enemy Elemental Resistances if you haven't Killed Recently", + "10% reduced Mana Cost of Skills if you've been Hit Recently", + "0.4% of Damage Leeched as Life and Mana if you've Killed Recently", + "Regenerate 1% of Life and Mana per second if you were Hit Recently", + "6% Chance to Dodge if you've taken a Critical Strike Recently", + "5% chance to Dodge Spell Damage if you've taken Spell Damage Recently", + "6% increased Movement Speed if you haven't been Hit Recently", + "50% chance to Avoid being Stunned if you've Killed Recently", + }, + ["MERCILESS"] = { + "Adds 33 to 50 Fire Damage if you've Killed Recently", + "Adds 33 to 50 Cold Damage if you've been Hit Recently", + "Adds 1 to 120 Lightning Damage if you haven't Killed Recently", + "Adds 88 to 132 Chaos Damage if you've taken a Critical Strike Recently", + "12% increased Attack and Cast Speed if you've Killed Recently", + "90% increased Critical Strike Chance if you haven't Crit Recently", + "8% chance to Freeze, Shock and Ignite if you haven't Crit Recently", + "Damage Penetrates 8% of Enemy Elemental Resistances if you haven't Killed Recently", + "14% reduced Mana Cost of Skills if you've been Hit Recently", + "0.5% of Damage Leeched as Life and Mana if you've Killed Recently", + "Regenerate 1.5% of Life and Mana per second if you were Hit Recently", + "8% Chance to Dodge if you've taken a Critical Strike Recently", + "6% chance to Dodge Spell Damage if you've taken Spell Damage Recently", + "8% increased Movement Speed if you haven't been Hit Recently", + "65% chance to Avoid being Stunned if you've Killed Recently", + }, + ["ENDGAME"] = { + "Adds 45 to 68 Fire Damage if you've Killed Recently", + "Adds 45 to 68 Cold Damage if you've been Hit Recently", + "Adds 1 to 160 Lightning Damage if you haven't Killed Recently", + "Adds 120 to 180 Chaos Damage if you've taken a Critical Strike Recently", + "16% increased Attack and Cast Speed if you've Killed Recently", + "120% increased Critical Strike Chance if you haven't Crit Recently", + "10% chance to Freeze, Shock and Ignite if you haven't Crit Recently", + "Damage Penetrates 10% of Enemy Elemental Resistances if you haven't Killed Recently", + "18% reduced Mana Cost of Skills if you've been Hit Recently", + "0.6% of Damage Leeched as Life and Mana if you've Killed Recently", + "Regenerate 2% of Life and Mana per second if you were Hit Recently", + "10% Chance to Dodge if you've taken a Critical Strike Recently", + "8% chance to Dodge Spell Damage if you've taken Spell Damage Recently", + "10% increased Movement Speed if you haven't been Hit Recently", + "80% chance to Avoid being Stunned if you've Killed Recently", + }, +} \ No newline at end of file diff --git a/Data/EnchantmentHelmet.lua b/Data/EnchantmentHelmet.lua new file mode 100644 index 000000000..83d54b563 --- /dev/null +++ b/Data/EnchantmentHelmet.lua @@ -0,0 +1,1710 @@ +-- Item data (c) Grinding Gear Games + +return { + ["Abyssal Cry"] = { + ["MERCILESS"] = { + "25% increased Abyssal Cry Damage", + "24% increased Abyssal Cry Duration", + }, + ["ENDGAME"] = { + "40% increased Abyssal Cry Damage", + "36% increased Abyssal Cry Duration", + }, + }, + ["Ancestral Protector"] = { + ["MERCILESS"] = { + "Ancestral Protector Totem grants 12% increased Attack Speed while Active", + "Ancestral Protector Totem deals 25% increased Damage", + "+24% to Ancestral Protector Totem Elemental Resistances", + "12% increased Ancestral Protector Totem Placement Speed", + }, + ["ENDGAME"] = { + "Ancestral Protector Totem grants 18% increased Attack Speed while Active", + "Ancestral Protector Totem deals 40% increased Damage", + "+36% to Ancestral Protector Totem Elemental Resistances", + "18% increased Ancestral Protector Totem Placement Speed", + }, + }, + ["Ancestral Warchief"] = { + ["MERCILESS"] = { + "25% increased Ancestral Warchief Totem Damage", + "Ancestral Warchief Totem grants 20% increased Melee Damage while Active", + "8% increased Ancestral Warchief Totem Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Ancestral Warchief Totem Damage", + "Ancestral Warchief Totem grants 30% increased Melee Damage while Active", + "12% increased Ancestral Warchief Totem Area of Effect", + }, + }, + ["Anger"] = { + ["MERCILESS"] = { + "10% reduced Anger Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Anger Mana Reservation", + }, + }, + ["Animate Guardian"] = { + ["MERCILESS"] = { + "Animated Guardians deal 25% increased Damage", + "+24% to Animated Guardian Elemental Resistances", + }, + ["ENDGAME"] = { + "Animated Guardians deal 40% increased Damage", + "+36% to Animated Guardian Elemental Resistances", + }, + }, + ["Animate Weapon"] = { + ["MERCILESS"] = { + "16% chance to create an additional Animate Weapon copy", + "Animated Weapons deal 25% increased Damage", + "20% increased Animate Weapon Duration", + }, + ["ENDGAME"] = { + "24% chance to create an additional Animate Weapon copy", + "Animated Weapons deal 40% increased Damage", + "30% increased Animate Weapon Duration", + }, + }, + ["Arc"] = { + ["MERCILESS"] = { + "25% increased Arc Damage", + "Arc Chains an additional 2 times", + "Arc has +20% chance to Shock", + }, + ["ENDGAME"] = { + "40% increased Arc Damage", + "Arc Chains an additional 3 times", + "Arc has +30% chance to Shock", + }, + }, + ["Arctic Armour"] = { + ["MERCILESS"] = { + "24% increased Arctic Armour Buff Effect", + "20% reduced Arctic Armour Mana Reservation", + }, + ["ENDGAME"] = { + "36% increased Arctic Armour Buff Effect", + "30% reduced Arctic Armour Mana Reservation", + }, + }, + ["Arctic Breath"] = { + ["MERCILESS"] = { + "25% increased Arctic Breath Damage", + "24% increased Arctic Breath Duration", + "8% increased Arctic Breath Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Arctic Breath Damage", + "36% increased Arctic Breath Duration", + "12% increased Arctic Breath Area of Effect", + }, + }, + ["Assassin's Mark"] = { + ["MERCILESS"] = { + "20% increased Assassin's Mark Curse Effect", + "30% increased Assassin's Mark Duration", + }, + ["ENDGAME"] = { + "30% increased Assassin's Mark Curse Effect", + "45% increased Assassin's Mark Duration", + }, + }, + ["Ball Lightning"] = { + ["MERCILESS"] = { + "25% increased Ball Lightning Damage", + "30% reduced Ball Lightning Projectile Speed", + "8% increased Ball Lightning Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Ball Lightning Damage", + "45% reduced Ball Lightning Projectile Speed", + "12% increased Ball Lightning Area of Effect", + }, + }, + ["Barrage"] = { + ["MERCILESS"] = { + "10% increased Barrage Attack Speed", + "25% increased Barrage Damage", + "1 additional Barrage Projectile", + }, + ["ENDGAME"] = { + "15% increased Barrage Attack Speed", + "40% increased Barrage Damage", + "2 additional Barrage Projectiles", + }, + }, + ["Bear Trap"] = { + ["MERCILESS"] = { + "20% increased Bear Trap Cooldown Recovery Speed", + "25% increased Bear Trap Damage", + }, + ["ENDGAME"] = { + "30% increased Bear Trap Cooldown Recovery Speed", + "40% increased Bear Trap Damage", + }, + }, + ["Blade Vortex"] = { + ["MERCILESS"] = { + "25% increased Blade Vortex Spell Damage", + "20% increased Blade Vortex Duration", + "8% increased Blade Vortex Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Blade Vortex Spell Damage", + "30% increased Blade Vortex Duration", + "12% increased Blade Vortex Area of Effect", + }, + }, + ["Bladefall"] = { + ["MERCILESS"] = { + "60% increased Bladefall Critical Strike Chance", + "25% increased Bladefall Damage", + "8% increased Bladefall Area of Effect", + }, + ["ENDGAME"] = { + "90% increased Bladefall Critical Strike Chance", + "40% increased Bladefall Damage", + "12% increased Bladefall Area of Effect", + }, + }, + ["Blast Rain"] = { + ["MERCILESS"] = { + "Blast Rain has a 50% chance for an additional blast", + "25% increased Blast Rain Damage", + "8% increased Blast Rain Area of Effect", + }, + ["ENDGAME"] = { + "Blast Rain has a 75% chance for an additional blast", + "40% increased Blast Rain Damage", + "12% increased Blast Rain Area of Effect", + }, + }, + ["Blight"] = { + ["MERCILESS"] = { + "25% increased Blight Damage", + "8% increased Blight Area of Effect", + "20% increased Secondary Blight Effect Duration", + }, + ["ENDGAME"] = { + "40% increased Blight Damage", + "12% increased Blight Area of Effect", + "30% increased Secondary Blight Effect Duration", + }, + }, + ["Blink Arrow"] = { + ["MERCILESS"] = { + "Blink Arrow and Blink Arrow Clones have 10% increased Attack Speed", + "20% increased Blink Arrow Cooldown Recovery Speed", + "Blink Arrow and Blink Arrow Clones have 25% increased Damage", + }, + ["ENDGAME"] = { + "Blink Arrow and Blink Arrow Clones have 15% increased Attack Speed", + "30% increased Blink Arrow Cooldown Recovery Speed", + "Blink Arrow and Blink Arrow Clones have 40% increased Damage", + }, + }, + ["Blood Rage"] = { + ["MERCILESS"] = { + "Blood Rage grants additional 8% increased Attack Speed", + "Blood Rage grants additional 20% chance to gain a Frenzy Charge on Kill", + }, + ["ENDGAME"] = { + "Blood Rage grants additional 12% increased Attack Speed", + "Blood Rage grants additional 30% chance to gain a Frenzy Charge on Kill", + }, + }, + ["Bone Offering"] = { + ["MERCILESS"] = { + "Bone Offering grants an additional +6% Block Chance", + "30% increased Bone Offering Duration", + }, + ["ENDGAME"] = { + "Bone Offering grants an additional +9% Block Chance", + "45% increased Bone Offering Duration", + }, + }, + ["Burning Arrow"] = { + ["MERCILESS"] = { + "25% increased Burning Arrow Damage", + "Burning Arrow has +20% chance to Ignite", + "10% of Burning Arrow Physical Damage gained as Extra Fire Damage", + }, + ["ENDGAME"] = { + "40% increased Burning Arrow Damage", + "Burning Arrow has +30% chance to Ignite", + "15% of Burning Arrow Physical Damage gained as Extra Fire Damage", + }, + }, + ["Caustic Arrow"] = { + ["MERCILESS"] = { + "25% increased Caustic Arrow Damage", + "20% increased Caustic Arrow Duration", + "8% increased Caustic Arrow Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Caustic Arrow Damage", + "30% increased Caustic Arrow Duration", + "12% increased Caustic Arrow Area of Effect", + }, + }, + ["Blade Flurry"] = { + ["MERCILESS"] = { + "25% increased Blade Flurry Damage", + "6% chance to Dodge Attacks at Maximum Blade Flurry stages", + "8% increased Blade Flurry Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Blade Flurry Damage", + "9% chance to Dodge Attacks at Maximum Blade Flurry stages", + "12% increased Blade Flurry Area of Effect", + }, + }, + ["Clarity"] = { + ["MERCILESS"] = { + "20% reduced Clarity Mana Reservation", + }, + ["ENDGAME"] = { + "30% reduced Clarity Mana Reservation", + }, + }, + ["Cleave"] = { + ["MERCILESS"] = { + "10% increased Cleave Attack Speed", + "25% increased Cleave Damage", + "8% increased Cleave Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Cleave Attack Speed", + "40% increased Cleave Damage", + "12% increased Cleave Area of Effect", + }, + }, + ["Cold Snap"] = { + ["MERCILESS"] = { + "20% increased Cold Snap Cooldown Recovery Speed", + "25% increased Cold Snap Damage", + "8% increased Cold Snap Area of Effect", + }, + ["ENDGAME"] = { + "30% increased Cold Snap Cooldown Recovery Speed", + "40% increased Cold Snap Damage", + "12% increased Cold Snap Area of Effect", + }, + }, + ["Conductivity"] = { + ["MERCILESS"] = { + "20% increased Conductivity Curse Effect", + "30% increased Conductivity Duration", + }, + ["ENDGAME"] = { + "30% increased Conductivity Curse Effect", + "45% increased Conductivity Duration", + }, + }, + ["Contagion"] = { + ["MERCILESS"] = { + "25% increased Contagion Damage", + "20% increased Contagion Duration", + "8% increased Contagion Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Contagion Damage", + "30% increased Contagion Duration", + "12% increased Contagion Area of Effect", + }, + }, + ["Conversion Trap"] = { + ["MERCILESS"] = { + "20% increased Conversion Trap Cooldown Recovery Speed", + "Converted Enemies have 25% increased Damage", + }, + ["ENDGAME"] = { + "30% increased Conversion Trap Cooldown Recovery Speed", + "Converted Enemies have 40% increased Damage", + }, + }, + ["Convocation"] = { + ["MERCILESS"] = { + "20% increased Convocation Cooldown Recovery Speed", + "24% increased Convocation Buff Effect", + }, + ["ENDGAME"] = { + "30% increased Convocation Cooldown Recovery Speed", + "36% increased Convocation Buff Effect", + }, + }, + ["Cyclone"] = { + ["MERCILESS"] = { + "10% increased Cyclone Attack Speed", + "25% increased Cyclone Damage", + }, + ["ENDGAME"] = { + "15% increased Cyclone Attack Speed", + "40% increased Cyclone Damage", + }, + }, + ["Decoy Totem"] = { + ["MERCILESS"] = { + "40% increased Decoy Totem Life", + "16% increased Decoy Totem Area of Effect", + }, + ["ENDGAME"] = { + "60% increased Decoy Totem Life", + "24% increased Decoy Totem Area of Effect", + }, + }, + ["Desecrate"] = { + ["MERCILESS"] = { + "Desecrate summons 2 additional corpses", + "20% increased Desecrate Cooldown Recovery Speed", + }, + ["ENDGAME"] = { + "Desecrate summons 3 additional corpses", + "30% increased Desecrate Cooldown Recovery Speed", + }, + }, + ["Determination"] = { + ["MERCILESS"] = { + "10% reduced Determination Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Determination Mana Reservation", + }, + }, + ["Detonate Dead"] = { + ["MERCILESS"] = { + "25% increased Detonate Dead Damage", + "Detonate Dead has a 30% chance to detonate an additional Corpse", + "8% increased Detonate Dead Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Detonate Dead Damage", + "Detonate Dead has a 45% chance to detonate an additional Corpse", + "12% increased Detonate Dead Area of Effect", + }, + }, + ["Devouring Totem"] = { + ["MERCILESS"] = { + "24% increased Devouring Totem Leech per second", + "40% increased Chance to consume an additional Corpse with Devouring Totem", + }, + ["ENDGAME"] = { + "36% increased Devouring Totem Leech per second", + "60% increased Chance to consume an additional Corpse with Devouring Totem", + }, + }, + ["Discharge"] = { + ["MERCILESS"] = { + "20% chance for Discharge not to consume Charges", + "25% increased Discharge Damage", + "5% increased Discharge Radius", + }, + ["ENDGAME"] = { + "30% chance for Discharge not to consume Charges", + "40% increased Discharge Damage", + "8% increased Discharge Radius", + }, + }, + ["Discipline"] = { + ["MERCILESS"] = { + "14% reduced Discipline Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Discipline Mana Reservation", + }, + }, + ["Dominating Blow"] = { + ["MERCILESS"] = { + "24% increased Dominating Blow Damage", + "20% increased Dominating Blow Duration", + "Dominated Minions deal 20% increased Damage", + }, + ["ENDGAME"] = { + "36% increased Dominating Blow Damage", + "30% increased Dominating Blow Duration", + "Dominated Minions deal 30% increased Damage", + }, + }, + ["Lacerate"] = { + ["MERCILESS"] = { + "40% increased Lacerate Critical Strike Chance", + "25% increased Lacerate Damage", + "8% increased Lacerate Area of Effect", + }, + ["ENDGAME"] = { + "60% increased Lacerate Critical Strike Chance", + "40% increased Lacerate Damage", + "12% increased Lacerate Area of Effect", + }, + }, + ["Double Strike"] = { + ["MERCILESS"] = { + "10% increased Double Strike Attack Speed", + "60% increased Double Strike Critical Strike Chance", + "25% increased Double Strike Damage", + }, + ["ENDGAME"] = { + "15% increased Double Strike Attack Speed", + "90% increased Double Strike Critical Strike Chance", + "40% increased Double Strike Damage", + }, + }, + ["Dual Strike"] = { + ["MERCILESS"] = { + "10% increased Dual Strike Attack Speed", + "60% increased Dual Strike Critical Strike Chance", + "25% increased Dual Strike Damage", + }, + ["ENDGAME"] = { + "15% increased Dual Strike Attack Speed", + "90% increased Dual Strike Critical Strike Chance", + "40% increased Dual Strike Damage", + }, + }, + ["Earthquake"] = { + ["MERCILESS"] = { + "25% increased Earthquake Damage", + "20% reduced Earthquake Duration", + "8% increased Earthquake Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Earthquake Damage", + "30% reduced Earthquake Duration", + "12% increased Earthquake Area of Effect", + }, + }, + ["Elemental Hit"] = { + ["MERCILESS"] = { + "10% increased Elemental Hit Attack Speed", + "Elemental Hit has +20% chance to Freeze, Shock and Ignite", + "25% increased Elemental Hit Damage", + }, + ["ENDGAME"] = { + "15% increased Elemental Hit Attack Speed", + "Elemental Hit has +30% chance to Freeze, Shock and Ignite", + "40% increased Elemental Hit Damage", + }, + }, + ["Elemental Weakness"] = { + ["MERCILESS"] = { + "20% increased Elemental Weakness Curse Effect", + "30% increased Elemental Weakness Duration", + }, + ["ENDGAME"] = { + "30% increased Elemental Weakness Curse Effect", + "45% increased Elemental Weakness Duration", + }, + }, + ["Enduring Cry"] = { + ["MERCILESS"] = { + "20% increased Enduring Cry Cooldown Recovery Speed", + "24% increased Enduring Cry Buff Effect", + }, + ["ENDGAME"] = { + "30% increased Enduring Cry Cooldown Recovery Speed", + "36% increased Enduring Cry Buff Effect", + }, + }, + ["Enfeeble"] = { + ["MERCILESS"] = { + "20% increased Enfeeble Curse Effect", + "30% increased Enfeeble Duration", + }, + ["ENDGAME"] = { + "30% increased Enfeeble Curse Effect", + "45% increased Enfeeble Duration", + }, + }, + ["Essence Drain"] = { + ["MERCILESS"] = { + "25% increased Essence Drain Damage", + "20% increased Essence Drain Duration", + }, + ["ENDGAME"] = { + "40% increased Essence Drain Damage", + "30% increased Essence Drain Duration", + }, + }, + ["Ethereal Knives"] = { + ["MERCILESS"] = { + "25% increased Ethereal Knives Damage", + "20% increased Ethereal Knives Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Ethereal Knives Damage", + "30% increased Ethereal Knives Projectile Speed", + }, + }, + ["Explosive Arrow"] = { + ["MERCILESS"] = { + "10% increased Explosive Arrow Attack Speed", + "25% increased Explosive Arrow Damage", + "8% increased Explosive Arrow Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Explosive Arrow Attack Speed", + "40% increased Explosive Arrow Damage", + "12% increased Explosive Arrow Area of Effect", + }, + }, + ["Fire Nova Mine"] = { + ["MERCILESS"] = { + "20% increased Fire Nova Cast Speed", + "25% increased Fire Nova Mine Damage", + "Fire Nova Mine repeats an additional 1 times", + }, + ["ENDGAME"] = { + "30% increased Fire Nova Cast Speed", + "40% increased Fire Nova Mine Damage", + "Fire Nova Mine repeats an additional 2 times", + }, + }, + ["Firestorm"] = { + ["MERCILESS"] = { + "25% increased Firestorm Damage", + "20% increased Firestorm Duration", + "8% increased Firestorm explosion Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Firestorm Damage", + "30% increased Firestorm Duration", + "12% increased Firestorm explosion Area of Effect", + }, + }, + ["Fire Trap"] = { + ["MERCILESS"] = { + "40% increased Fire Trap Burning Damage", + "20% increased Fire Trap Cooldown Recovery Speed", + "25% increased Fire Trap Damage", + }, + ["ENDGAME"] = { + "60% increased Fire Trap Burning Damage", + "30% increased Fire Trap Cooldown Recovery Speed", + "40% increased Fire Trap Damage", + }, + }, + ["Fireball"] = { + ["MERCILESS"] = { + "8% increased Fireball Cast Speed", + "25% increased Fireball Damage", + "Fireball has +20% chance to Ignite", + }, + ["ENDGAME"] = { + "12% increased Fireball Cast Speed", + "40% increased Fireball Damage", + "Fireball has +30% chance to Ignite", + }, + }, + ["Flame Dash"] = { + ["MERCILESS"] = { + "20% increased Flame Dash Cooldown Recovery Speed", + "25% increased Flame Dash Damage", + }, + ["ENDGAME"] = { + "30% increased Flame Dash Cooldown Recovery Speed", + "40% increased Flame Dash Damage", + }, + }, + ["Flame Surge"] = { + ["MERCILESS"] = { + "60% increased Flame Surge Critical Strike Chance", + "25% increased Flame Surge Damage", + "40% increased Flame Surge Damage against Burning Enemies", + }, + ["ENDGAME"] = { + "90% increased Flame Surge Critical Strike Chance", + "40% increased Flame Surge Damage", + "60% increased Flame Surge Damage against Burning Enemies", + }, + }, + ["Flame Totem"] = { + ["MERCILESS"] = { + "25% increased Flame Totem Damage", + "1 additional Flame Totem Projectile", + "20% increased Flame Totem Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Flame Totem Damage", + "2 additional Flame Totem Projectiles", + "30% increased Flame Totem Projectile Speed", + }, + }, + ["Flameblast"] = { + ["MERCILESS"] = { + "60% increased Flameblast Critical Strike Chance", + "25% increased Flameblast Damage", + "8% increased Flameblast Area of Effect", + }, + ["ENDGAME"] = { + "90% increased Flameblast Critical Strike Chance", + "40% increased Flameblast Damage", + "12% increased Flameblast Area of Effect", + }, + }, + ["Flammability"] = { + ["MERCILESS"] = { + "20% increased Flammability Curse Effect", + "30% increased Flammability Duration", + }, + ["ENDGAME"] = { + "30% increased Flammability Curse Effect", + "45% increased Flammability Duration", + }, + }, + ["Flesh Offering"] = { + ["MERCILESS"] = { + "Flesh Offering grants an additional 14% increased Attack Speed", + "30% increased Flesh Offering Duration", + }, + ["ENDGAME"] = { + "Flesh Offering grants an additional 21% increased Attack Speed", + "45% increased Flesh Offering Duration", + }, + }, + ["Flicker Strike"] = { + ["MERCILESS"] = { + "20% increased Flicker Strike Cooldown Recovery Speed", + "25% increased Flicker Strike Damage", + "6% increased Flicker Strike Damage per Frenzy Charge", + }, + ["ENDGAME"] = { + "30% increased Flicker Strike Cooldown Recovery Speed", + "40% increased Flicker Strike Damage", + "9% increased Flicker Strike Damage per Frenzy Charge", + }, + }, + ["Freeze Mine"] = { + ["MERCILESS"] = { + "Freeze Mine causes Enemies to lose an additional 8% Cold Resistance while Frozen", + "8% increased Freeze Mine Area of Effect", + }, + ["ENDGAME"] = { + "Freeze Mine causes Enemies to lose an additional 12% Cold Resistance while Frozen", + "12% increased Freeze Mine Area of Effect", + }, + }, + ["Freezing Pulse"] = { + ["MERCILESS"] = { + "8% increased Freezing Pulse Cast Speed", + "25% increased Freezing Pulse Damage", + "20% increased Freezing Pulse Projectile Speed", + }, + ["ENDGAME"] = { + "12% increased Freezing Pulse Cast Speed", + "40% increased Freezing Pulse Damage", + "30% increased Freezing Pulse Projectile Speed", + }, + }, + ["Frenzy"] = { + ["MERCILESS"] = { + "25% increased Frenzy Damage", + "6% increased Frenzy Damage per Frenzy Charge", + "20% Chance on Frenzy to gain an additional Frenzy Charge", + }, + ["ENDGAME"] = { + "40% increased Frenzy Damage", + "9% increased Frenzy Damage per Frenzy Charge", + "30% Chance on Frenzy to gain an additional Frenzy Charge", + }, + }, + ["Frost Blades"] = { + ["MERCILESS"] = { + "25% increased Frost Blades Damage", + "20% increased Frost Blades Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Frost Blades Damage", + "30% increased Frost Blades Projectile Speed", + }, + }, + ["Frostbolt"] = { + ["MERCILESS"] = { + "10% increased Frostbolt Cast Speed", + "25% increased Frostbolt Damage", + "Frostbolt has +10% chance to Freeze", + }, + ["ENDGAME"] = { + "15% increased Frostbolt Cast Speed", + "40% increased Frostbolt Damage", + "Frostbolt has +15% chance to Freeze", + }, + }, + ["Frost Bomb"] = { + ["MERCILESS"] = { + "20% increased Frost Bomb Cooldown Recovery Speed", + "25% increased Frost Bomb Damage", + "8% increased Frost Bomb Area of Effect", + }, + ["ENDGAME"] = { + "30% increased Frost Bomb Cooldown Recovery Speed", + "40% increased Frost Bomb Damage", + "12% increased Frost Bomb Area of Effect", + }, + }, + ["Frost Wall"] = { + ["MERCILESS"] = { + "20% increased Frost Wall Cooldown Recovery Speed", + "24% increased Frost Wall Duration", + }, + ["ENDGAME"] = { + "30% increased Frost Wall Cooldown Recovery Speed", + "36% increased Frost Wall Duration", + }, + }, + ["Frostbite"] = { + ["MERCILESS"] = { + "20% increased Frostbite Curse Effect", + "30% increased Frostbite Duration", + }, + ["ENDGAME"] = { + "30% increased Frostbite Curse Effect", + "45% increased Frostbite Duration", + }, + }, + ["Glacial Cascade"] = { + ["MERCILESS"] = { + "25% increased Glacial Cascade Damage", + "60% of Glacial Cascade Physical Damage converted to Cold Damage", + "8% increased Glacial Cascade Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Glacial Cascade Damage", + "90% of Glacial Cascade Physical Damage converted to Cold Damage", + "12% increased Glacial Cascade Area of Effect", + }, + }, + ["Glacial Hammer"] = { + ["MERCILESS"] = { + "25% increased Glacial Hammer Damage", + "Glacial Hammer has +20% chance to Freeze", + "10% of Glacial Hammer Physical Damage gained as Extra Cold Damage", + }, + ["ENDGAME"] = { + "40% increased Glacial Hammer Damage", + "Glacial Hammer has +30% chance to Freeze", + "15% of Glacial Hammer Physical Damage gained as Extra Cold Damage", + }, + }, + ["Grace"] = { + ["MERCILESS"] = { + "10% reduced Grace Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Grace Mana Reservation", + }, + }, + ["Ground Slam"] = { + ["MERCILESS"] = { + "Ground Slam has a 16% increased angle", + "25% increased Ground Slam Damage", + "8% increased Ground Slam Area of Effect", + }, + ["ENDGAME"] = { + "Ground Slam has a 24% increased angle", + "40% increased Ground Slam Damage", + "12% increased Ground Slam Area of Effect", + }, + }, + ["Haste"] = { + ["MERCILESS"] = { + "10% reduced Haste Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Haste Mana Reservation", + }, + }, + ["Hatred"] = { + ["MERCILESS"] = { + "10% reduced Hatred Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Hatred Mana Reservation", + }, + }, + ["Heavy Strike"] = { + ["MERCILESS"] = { + "10% increased Heavy Strike Attack Speed", + "25% increased Heavy Strike Damage", + "Heavy Strike has a 8% chance to deal Double Damage", + }, + ["ENDGAME"] = { + "15% increased Heavy Strike Attack Speed", + "40% increased Heavy Strike Damage", + "Heavy Strike has a 12% chance to deal Double Damage", + }, + }, + ["Herald of Ash"] = { + ["MERCILESS"] = { + "25% increased Herald of Ash Damage", + "20% reduced Herald of Ash Mana Reservation", + }, + ["ENDGAME"] = { + "40% increased Herald of Ash Damage", + "30% reduced Herald of Ash Mana Reservation", + }, + }, + ["Herald of Ice"] = { + ["MERCILESS"] = { + "25% increased Herald of Ice Damage", + "20% reduced Herald of Ice Mana Reservation", + }, + ["ENDGAME"] = { + "40% increased Herald of Ice Damage", + "30% reduced Herald of Ice Mana Reservation", + }, + }, + ["Herald of Thunder"] = { + ["MERCILESS"] = { + "25% increased Herald of Thunder Damage", + "20% reduced Herald of Thunder Mana Reservation", + }, + ["ENDGAME"] = { + "40% increased Herald of Thunder Damage", + "30% reduced Herald of Thunder Mana Reservation", + }, + }, + ["Ice Crash"] = { + ["MERCILESS"] = { + "25% increased Ice Crash Damage", + "10% of Ice Crash Physical Damage gained as Extra Cold Damage", + "8% increased Ice Crash Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Ice Crash Damage", + "15% of Ice Crash Physical Damage gained as Extra Cold Damage", + "12% increased Ice Crash Area of Effect", + }, + }, + ["Ice Nova"] = { + ["MERCILESS"] = { + "25% increased Ice Nova Damage", + "Ice Nova has +20% chance to Freeze", + "8% increased Ice Nova Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Ice Nova Damage", + "Ice Nova has +30% chance to Freeze", + "12% increased Ice Nova Area of Effect", + }, + }, + ["Ice Shot"] = { + ["MERCILESS"] = { + "25% increased Ice Shot Damage", + "24% increased Ice Shot Duration", + "8% increased Ice Shot Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Ice Shot Damage", + "36% increased Ice Shot Duration", + "12% increased Ice Shot Area of Effect", + }, + }, + ["Ice Spear"] = { + ["MERCILESS"] = { + "25% increased Ice Spear Damage", + "10% Chance to gain a Power Charge on Critical Strike with Ice Spear", + "200% increased Ice Spear Critical Strike Chance in second form", + }, + ["ENDGAME"] = { + "40% increased Ice Spear Damage", + "15% Chance to gain a Power Charge on Critical Strike with Ice Spear", + "300% increased Ice Spear Critical Strike Chance in second form", + }, + }, + ["Ice Trap"] = { + ["MERCILESS"] = { + "20% increased Ice Trap Cooldown Recovery Speed", + "25% increased Ice Trap Damage", + "8% increased Ice Trap Area of Effect", + }, + ["ENDGAME"] = { + "30% increased Ice Trap Cooldown Recovery Speed", + "40% increased Ice Trap Damage", + "12% increased Ice Trap Area of Effect", + }, + }, + ["Immortal Call"] = { + ["MERCILESS"] = { + "34% increased Immortal Call Duration", + "20% chance for Immortal Call to not consume Endurance Charges", + }, + ["ENDGAME"] = { + "36% increased Immortal Call Duration", + "30% chance for Immortal Call to not consume Endurance Charges", + }, + }, + ["Incinerate"] = { + ["MERCILESS"] = { + "25% increased Incinerate Damage", + "16% increased Incinerate Damage for each stage", + "20% increased Incinerate Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Incinerate Damage", + "24% increased Incinerate Damage for each stage", + "30% increased Incinerate Projectile Speed", + }, + }, + ["Infernal Blow"] = { + ["MERCILESS"] = { + "25% increased Infernal Blow Damage", + "10% of Infernal Blow Physical Damage gained as Extra Fire Damage", + "8% increased Infernal Blow Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Infernal Blow Damage", + "15% of Infernal Blow Physical Damage gained as Extra Fire Damage", + "12% increased Infernal Blow Area of Effect", + }, + }, + ["Kinetic Blast"] = { + ["MERCILESS"] = { + "25% increased Kinetic Blast Damage", + "Kinetic Blast has a 50% chance for an additional explosion", + "8% increased Kinetic Blast Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Kinetic Blast Damage", + "Kinetic Blast has a 75% chance for an additional explosion", + "12% increased Kinetic Blast Area of Effect", + }, + }, + ["Leap Slam"] = { + ["MERCILESS"] = { + "10% increased Leap Slam Attack Speed", + "25% increased Leap Slam Damage", + "8% increased Leap Slam Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Leap Slam Attack Speed", + "40% increased Leap Slam Damage", + "12% increased Leap Slam Area of Effect", + }, + }, + ["Lightning Arrow"] = { + ["MERCILESS"] = { + "25% increased Lightning Arrow Damage", + "Lightning Arrow hits an additional Enemy", + "8% increased Lightning Arrow Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Lightning Arrow Damage", + "Lightning Arrow hits 2 additional Enemies", + "12% increased Lightning Arrow Area of Effect", + }, + }, + ["Lightning Strike"] = { + ["MERCILESS"] = { + "25% increased Lightning Strike Damage", + "2 additional Lightning Strike Projectiles", + "+20% to Lightning Strike Pierce Chance", + }, + ["ENDGAME"] = { + "40% increased Lightning Strike Damage", + "3 additional Lightning Strike Projectiles", + "+30% to Lightning Strike Pierce Chance", + }, + }, + ["Lightning Tendrils"] = { + ["MERCILESS"] = { + "40% increased Lightning Tendrils Critical Strike Chance", + "25% increased Lightning Tendrils Damage", + "8% increased Lightning Tendrils Area of Effect", + }, + ["ENDGAME"] = { + "60% increased Lightning Tendrils Critical Strike Chance", + "40% increased Lightning Tendrils Damage", + "12% increased Lightning Tendrils Area of Effect", + }, + }, + ["Lightning Trap"] = { + ["MERCILESS"] = { + "20% increased Lightning Trap Cooldown Recovery Speed", + "25% increased Lightning Trap Damage", + "+20% Lightning Trap Pierce Chance", + }, + ["ENDGAME"] = { + "30% increased Lightning Trap Cooldown Recovery Speed", + "40% increased Lightning Trap Damage", + "+30% Lightning Trap Pierce Chance", + }, + }, + ["Lightning Warp"] = { + ["MERCILESS"] = { + "8% increased Lightning Warp Cast Speed", + "25% increased Lightning Warp Damage", + "20% reduced Lightning Warp Duration", + }, + ["ENDGAME"] = { + "12% increased Lightning Warp Cast Speed", + "40% increased Lightning Warp Damage", + "30% reduced Lightning Warp Duration", + }, + }, + ["Magma Orb"] = { + ["MERCILESS"] = { + "25% increased Magma Orb Damage", + "Magma Orb Chains an additional time", + "8% increased Magma Orb Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Magma Orb Damage", + "Magma Orb Chains an additional 2 times", + "12% increased Magma Orb Area of Effect", + }, + }, + ["Mirror Arrow"] = { + ["MERCILESS"] = { + "Mirror Arrow and Mirror Arrow Clones have 10% increased Attack Speed", + "20% increased Mirror Arrow Cooldown Recovery Speed", + "Mirror Arrow and Mirror Arrow Clones deal 25% increased Damage", + }, + ["ENDGAME"] = { + "Mirror Arrow and Mirror Arrow Clones have 15% increased Attack Speed", + "30% increased Mirror Arrow Cooldown Recovery Speed", + "Mirror Arrow and Mirror Arrow Clones deal 40% increased Damage", + }, + }, + ["Molten Shell"] = { + ["MERCILESS"] = { + "100% increased Molten Shell Buff Effect", + "25% increased Molten Shell Damage", + }, + ["ENDGAME"] = { + "150% increased Molten Shell Buff Effect", + "40% increased Molten Shell Damage", + }, + }, + ["Molten Strike"] = { + ["MERCILESS"] = { + "25% increased Molten Strike Damage", + "2 additional Molten Strike Projectiles", + "8% increased Molten Strike Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Molten Strike Damage", + "3 additional Molten Strike Projectiles", + "12% increased Molten Strike Area of Effect", + }, + }, + ["Orb of Storms"] = { + ["MERCILESS"] = { + "25% increased Orb of Storms Damage", + "60% increased Orb of Storms Critical Strike Chance", + "8% increased Orb of Storms Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Orb of Storms Damage", + "90% increased Orb of Storms Critical Strike Chance", + "12% increased Orb of Storms Area of Effect", + }, + }, + ["Phase Run"] = { + ["MERCILESS"] = { + "24% increased Phase Run Duration", + "20% chance for Phase Run to not consume Frenzy Charges", + }, + ["ENDGAME"] = { + "36% increased Phase Run Duration", + "30% chance for Phase Run to not consume Frenzy Charges", + }, + }, + ["Poacher's Mark"] = { + ["MERCILESS"] = { + "20% increased Poacher's Mark Curse Effect", + "30% increased Poacher's Mark Duration", + }, + ["ENDGAME"] = { + "30% increased Poacher's Mark Curse Effect", + "45% increased Poacher's Mark Duration", + }, + }, + ["Power Siphon"] = { + ["MERCILESS"] = { + "10% increased Power Siphon Attack Speed", + "25% increased Power Siphon Damage", + "30% Chance to gain an additional Power Charge on Kill with Power Siphon", + }, + ["ENDGAME"] = { + "15% increased Power Siphon Attack Speed", + "40% increased Power Siphon Damage", + "45% Chance to gain an additional Power Charge on Kill with Power Siphon", + }, + }, + ["Projectile Weakness"] = { + ["MERCILESS"] = { + "20% increased Projectile Weakness Curse Effect", + "30% increased Projectile Weakness Duration", + }, + ["ENDGAME"] = { + "30% increased Projectile Weakness Curse Effect", + "45% increased Projectile Weakness Duration", + }, + }, + ["Puncture"] = { + ["MERCILESS"] = { + "25% increased Puncture Damage", + "30% increased Puncture Duration", + "20% Chance for Puncture to Maim on hit", + }, + ["ENDGAME"] = { + "40% increased Puncture Damage", + "45% increased Puncture Duration", + "30% Chance for Puncture to Maim on hit", + }, + }, + ["Punishment"] = { + ["MERCILESS"] = { + "20% increased Punishment Curse Effect", + "30% increased Punishment Duration", + }, + ["ENDGAME"] = { + "30% increased Punishment Curse Effect", + "45% increased Punishment Duration", + }, + }, + ["Purity of Elements"] = { + ["MERCILESS"] = { + "14% reduced Purity of Elements Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Purity of Elements Mana Reservation", + }, + }, + ["Purity of Fire"] = { + ["MERCILESS"] = { + "14% reduced Purity of Fire Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Purity of Fire Mana Reservation", + }, + }, + ["Purity of Ice"] = { + ["MERCILESS"] = { + "14% reduced Purity of Ice Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Purity of Ice Mana Reservation", + }, + }, + ["Purity of Lightning"] = { + ["MERCILESS"] = { + "14% reduced Purity of Lightning Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Purity of Lightning Mana Reservation", + }, + }, + ["Rain of Arrows"] = { + ["MERCILESS"] = { + "10% increased Rain of Arrows Attack Speed", + "25% increased Rain of Arrows Damage", + "8% increased Rain of Arrows Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Rain of Arrows Attack Speed", + "40% increased Rain of Arrows Damage", + "12% increased Rain of Arrows Area of Effect", + }, + }, + ["Raise Spectre"] = { + ["MERCILESS"] = { + "Spectres have 25% increased Damage", + "Spectres have 8% increased Attack and Cast Speed", + "+24% to Raised Spectre Elemental Resistances", + }, + ["ENDGAME"] = { + "Spectres have 40% increased Damage", + "Spectres have 12% increased Attack and Cast Speed", + "+36% to Raised Spectre Elemental Resistances", + }, + }, + ["Raise Zombie"] = { + ["MERCILESS"] = { + "Zombies deal 25% increased Damage", + "Zombies have 10% increased Attack Speed", + "+24% to Raised Zombie Elemental Resistances", + }, + ["ENDGAME"] = { + "Zombies deal 40% increased Damage", + "Zombies have 15% increased Attack Speed", + "+36% to Raised Zombie Elemental Resistances", + }, + }, + ["Rallying Cry"] = { + ["MERCILESS"] = { + "50% increased Rallying Cry Buff Effect", + "30% increased Rallying Cry Duration", + }, + ["ENDGAME"] = { + "75% increased Rallying Cry Buff Effect", + "45% increased Rallying Cry Duration", + }, + }, + ["Reave"] = { + ["MERCILESS"] = { + "25% increased Reave Damage", + "8% increased Reave Radius", + }, + ["ENDGAME"] = { + "40% increased Reave Damage", + "12% increased Reave Radius", + }, + }, + ["Reckoning"] = { + ["MERCILESS"] = { + "20% increased Reckoning Cooldown Recovery Speed", + "25% increased Reckoning Damage", + }, + ["ENDGAME"] = { + "30% increased Reckoning Cooldown Recovery Speed", + "40% increased Reckoning Damage", + }, + }, + ["Rejuvenation Totem"] = { + ["MERCILESS"] = { + "30% increased Rejuvenation Totem Aura Effect", + "10% of Rejuvenation Totem Life Regeneration added as Mana Regeneration", + }, + ["ENDGAME"] = { + "45% increased Rejuvenation Totem Aura Effect", + "15% of Rejuvenation Totem Life Regeneration added as Mana Regeneration", + }, + }, + ["Righteous Fire"] = { + ["MERCILESS"] = { + "25% increased Righteous Fire Damage", + "8% increased Righteous Fire Area of Effect", + "Righteous Fire grants 20% increased Spell Damage", + }, + ["ENDGAME"] = { + "40% increased Righteous Fire Damage", + "12% increased Righteous Fire Area of Effect", + "Righteous Fire grants 30% increased Spell Damage", + }, + }, + ["Riposte"] = { + ["MERCILESS"] = { + "20% increased Riposte Cooldown Recovery Speed", + "25% increased Riposte Damage", + }, + ["ENDGAME"] = { + "30% increased Riposte Cooldown Recovery Speed", + "40% increased Riposte Damage", + }, + }, + ["Scorching Ray"] = { + ["MERCILESS"] = { + "8% increased Scorching Ray Cast Speed", + "25% increased Scorching Ray Damage", + "10% increased Scorching Ray beam length", + }, + ["ENDGAME"] = { + "12% increased Scorching Ray Cast Speed", + "40% increased Scorching Ray Damage", + "15% increased Scorching Ray beam length", + }, + }, + ["Searing Bond"] = { + ["MERCILESS"] = { + "25% increased Searing Bond Damage", + "24% increased Searing Bond Totem Elemental Resistances", + "40% increased Searing Bond Totem Placement Speed", + }, + ["ENDGAME"] = { + "40% increased Searing Bond Damage", + "36% increased Searing Bond Totem Elemental Resistances", + "60% increased Searing Bond Totem Placement Speed", + }, + }, + ["Shield Charge"] = { + ["MERCILESS"] = { + "10% increased Shield Charge Attack Speed", + "25% increased Shield Charge Damage", + }, + ["ENDGAME"] = { + "15% increased Shield Charge Attack Speed", + "40% increased Shield Charge Damage", + }, + }, + ["Shock Nova"] = { + ["MERCILESS"] = { + "25% increased Shock Nova Damage", + "Shock Nova ring deals 40% increased Damage", + "8% increased Shock Nova Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Shock Nova Damage", + "Shock Nova ring deals 60% increased Damage", + "12% increased Shock Nova Area of Effect", + }, + }, + ["Shockwave Totem"] = { + ["MERCILESS"] = { + "10% increased Shockwave Totem Cast Speed", + "25% increased Shockwave Totem Damage", + "8% increased Shockwave Totem Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Shockwave Totem Cast Speed", + "40% increased Shockwave Totem Damage", + "12% increased Shockwave Totem Area of Effect", + }, + }, + ["Shrapnel Shot"] = { + ["MERCILESS"] = { + "25% increased Shrapnel Shot Damage", + "10% of Shrapnel Shot Physical damage added as Lightning Damage", + "8% increased Shrapnel Shot Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Shrapnel Shot Damage", + "15% of Shrapnel Shot Physical damage added as Lightning Damage", + "12% increased Shrapnel Shot Area of Effect", + }, + }, + ["Siege Ballista"] = { + ["MERCILESS"] = { + "10% increased Siege Ballista Attack Speed", + "25% increased Siege Ballista Damage", + "30% increased Siege Ballista Totem Placement Speed", + }, + ["ENDGAME"] = { + "15% increased Siege Ballista Attack Speed", + "40% increased Siege Ballista Damage", + "45% increased Siege Ballista Totem Placement Speed", + }, + }, + ["Smoke Mine"] = { + ["MERCILESS"] = { + "20% increased Smoke Mine Duration", + "Smoke Mine grants additional 20% increased Movement Speed", + }, + ["ENDGAME"] = { + "30% increased Smoke Mine Duration", + "Smoke Mine grants additional 30% increased Movement Speed", + }, + }, + ["Spark"] = { + ["MERCILESS"] = { + "25% increased Spark Damage", + "2 additional Spark Projectiles", + "20% increased Spark Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Spark Damage", + "3 additional Spark Projectiles", + "30% increased Spark Projectile Speed", + }, + }, + ["Spectral Throw"] = { + ["MERCILESS"] = { + "25% increased Spectral Throw Damage", + "20% reduced Spectral Throw Projectile Deceleration", + "20% increased Spectral Throw Projectile Speed", + }, + ["ENDGAME"] = { + "40% increased Spectral Throw Damage", + "30% reduced Spectral Throw Projectile Deceleration", + "30% increased Spectral Throw Projectile Speed", + }, + }, + ["Spirit Offering"] = { + ["MERCILESS"] = { + "30% increased Spirit Offering Duration", + "Spirit Offering grants +8% of Physical Damage as Extra Chaos Damage", + }, + ["ENDGAME"] = { + "45% increased Spirit Offering Duration", + "Spirit Offering grants +12% of Physical Damage as Extra Chaos Damage", + }, + }, + ["Split Arrow"] = { + ["MERCILESS"] = { + "60% increased Split Arrow Critical Strike Chance", + "25% increased Split Arrow Damage", + "2 additional Split Arrow Projectiles", + }, + ["ENDGAME"] = { + "90% increased Split Arrow Critical Strike Chance", + "40% increased Split Arrow Damage", + "3 additional Split Arrow Projectiles", + }, + }, + ["Static Strike"] = { + ["MERCILESS"] = { + "25% increased Static Strike Damage", + "30% reduced Static Strike Duration", + "8% increased Static Strike Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Static Strike Damage", + "45% reduced Static Strike Duration", + "12% increased Static Strike Area of Effect", + }, + }, + ["Storm Call"] = { + ["MERCILESS"] = { + "25% increased Storm Call Damage", + "20% reduced Storm Call Duration", + "8% increased Storm Call Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Storm Call Damage", + "30% reduced Storm Call Duration", + "12% increased Storm Call Area of Effect", + }, + }, + ["Summon Chaos Golem"] = { + ["MERCILESS"] = { + "+24% to Chaos Golem Elemental Resistances", + "75% increased Effect of the Buff granted by your Chaos Golems", + "Chaos Golems deal 25% increased Damage", + }, + ["ENDGAME"] = { + "+36% to Chaos Golem Elemental Resistances", + "100% increased Effect of the Buff granted by your Chaos Golems", + "Chaos Golems deal 40% increased Damage", + }, + }, + ["Summon Flame Golem"] = { + ["MERCILESS"] = { + "+24% to increased Flame Golem Elemental Resistances", + "100% increased Effect of the Buff granted by your Flame Golems", + "Flame Golems have 25% increased Damage", + }, + ["ENDGAME"] = { + "+36% to increased Flame Golem Elemental Resistances", + "150% increased Effect of the Buff granted by your Flame Golems", + "Flame Golems have 40% increased Damage", + }, + }, + ["Summon Ice Golem"] = { + ["MERCILESS"] = { + "+24% to Ice Golem Elemental Resistances", + "100% increased Effect of the Buff granted by your Ice Golems", + "Ice Golems deal 25% increased Damage", + }, + ["ENDGAME"] = { + "+36% to Ice Golem Elemental Resistances", + "150% increased Effect of the Buff granted by your Ice Golems", + "Ice Golems deal 40% increased Damage", + }, + }, + ["Summon Lightning Golem"] = { + ["MERCILESS"] = { + "+24% to Lightning Golem Elemental Resistances", + "100% increased Effect of the Buff granted by your Lightning Golems", + "Lightning Golems deal 25% increased Damage", + }, + ["ENDGAME"] = { + "+36% to Lightning Golem Elemental Resistances", + "150% increased Effect of the Buff granted by your Lightning Golems", + "Lightning Golems deal 40% increased Damage", + }, + }, + ["Summon Raging Spirit"] = { + ["MERCILESS"] = { + "Raging Spirits have 25% increased Damage", + "Summon Raging Spirit has 12% chance to summon an extra Minion", + "20% increased Summon Raging Spirit Duration", + }, + ["ENDGAME"] = { + "Raging Spirits have 40% increased Damage", + "Summon Raging Spirit has 18% chance to summon an extra Minion", + "30% increased Summon Raging Spirit Duration", + }, + }, + ["Summon Skeletons"] = { + ["MERCILESS"] = { + "Skeletons deal 25% increased Damage", + "Summon 1 additional Skeleton Warrior with Summon Skeletons", + }, + ["ENDGAME"] = { + "Skeletons deal 40% increased Damage", + "Summon 2 additional Skeleton Warriors with Summon Skeletons", + }, + }, + ["Summon Stone Golem"] = { + ["MERCILESS"] = { + "+24% to Stone Golem Elemental Resistances", + "100% increased Effect of the Buff granted by your Stone Golems", + "Stone Golems deal 25% increased Damage", + }, + ["ENDGAME"] = { + "+36% to Stone Golem Elemental Resistances", + "150% increased Effect of the Buff granted by your Stone Golems", + "Stone Golems deal 40% increased Damage", + }, + }, + ["Sunder"] = { + ["MERCILESS"] = { + "10% increased Sunder Attack Speed", + "25% increased Sunder Damage", + "8% increased Sunder Area of Effect", + }, + ["ENDGAME"] = { + "15% increased Sunder Attack Speed", + "40% increased Sunder Damage", + "12% increased Sunder Area of Effect", + }, + }, + ["Sweep"] = { + ["MERCILESS"] = { + "25% increased Sweep Damage", + "+20% Sweep Knockback Chance", + "8% increased Sweep Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Sweep Damage", + "+30% Sweep Knockback Chance", + "12% increased Sweep Area of Effect", + }, + }, + ["Tempest Shield"] = { + ["MERCILESS"] = { + "25% increased Tempest Shield Damage", + "Tempest Shield chains an additional 2 times", + }, + ["ENDGAME"] = { + "40% increased Tempest Shield Damage", + "Tempest Shield chains an additional 3 times", + }, + }, + ["Temporal Chains"] = { + ["MERCILESS"] = { + "20% increased Temporal Chains Curse Effect", + "30% increased Temporal Chains Duration", + }, + ["ENDGAME"] = { + "30% increased Temporal Chains Curse Effect", + "45% increased Temporal Chains Duration", + }, + }, + ["Tornado Shot"] = { + ["MERCILESS"] = { + "60% increased Tornado Shot Critical Strike Chance", + "25% increased Tornado Shot Damage", + "1 secondary Tornado Shot Projectile", + }, + ["ENDGAME"] = { + "90% increased Tornado Shot Critical Strike Chance", + "40% increased Tornado Shot Damage", + "2 secondary Tornado Shot Projectiles", + }, + }, + ["Vengeance"] = { + ["MERCILESS"] = { + "20% increased Vengeance Cooldown Recovery Speed", + "25% increased Vengeance Damage", + }, + ["ENDGAME"] = { + "30% increased Vengeance Cooldown Recovery Speed", + "40% increased Vengeance Damage", + }, + }, + ["Vigilant Strike"] = { + ["MERCILESS"] = { + "25% increased Vigilant Strike Damage", + "30% increased Vigilant Strike Fortify Duration", + }, + ["ENDGAME"] = { + "40% increased Vigilant Strike Damage", + "45% increased Vigilant Strike Fortify Duration", + }, + }, + ["Viper Strike"] = { + ["MERCILESS"] = { + "60% increased Viper Strike Critical Strike Chance", + "25% increased Viper Strike Damage", + "20% increased Viper Strike Duration", + }, + ["ENDGAME"] = { + "90% increased Viper Strike Critical Strike Chance", + "40% increased Viper Strike Damage", + "30% increased Viper Strike Duration", + }, + }, + ["Vitality"] = { + ["MERCILESS"] = { + "14% reduced Vitality Mana Reservation", + }, + ["ENDGAME"] = { + "20% reduced Vitality Mana Reservation", + }, + }, + ["Vortex"] = { + ["MERCILESS"] = { + "25% increased Vortex Damage", + "20% increased Vortex Duration", + "8% increased Vortex Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Vortex Damage", + "30% increased Vortex Duration", + "12% increased Vortex Area of Effect", + }, + }, + ["Vulnerability"] = { + ["MERCILESS"] = { + "20% increased Vulnerability Curse Effect", + "30% increased Vulnerability Duration", + }, + ["ENDGAME"] = { + "30% increased Vulnerability Curse Effect", + "45% increased Vulnerability Duration", + }, + }, + ["Warlord's Mark"] = { + ["MERCILESS"] = { + "20% increased Warlord's Mark Curse Effect", + "30% increased Warlord's Mark Duration", + }, + ["ENDGAME"] = { + "30% increased Warlord's Mark Curse Effect", + "45% increased Warlord's Mark Duration", + }, + }, + ["Whirling Blades"] = { + ["MERCILESS"] = { + "10% increased Whirling Blades Attack Speed", + "25% increased Whirling Blades Damage", + }, + ["ENDGAME"] = { + "15% increased Whirling Blades Attack Speed", + "40% increased Whirling Blades Damage", + }, + }, + ["Wild Strike"] = { + ["MERCILESS"] = { + "25% increased Wild Strike Damage", + "Wild Strike Chains an additional 4 times", + "24% increased Wild Strike Area of Effect", + }, + ["ENDGAME"] = { + "40% increased Wild Strike Damage", + "Wild Strike Chains an additional 6 times", + "36% increased Wild Strike Area of Effect", + }, + }, + ["Wither"] = { + ["MERCILESS"] = { + "24% increased Wither Duration", + "8% increased Wither Area of Effect", + }, + ["ENDGAME"] = { + "36% increased Wither Duration", + "12% increased Wither Area of Effect", + }, + }, + ["Wrath"] = { + ["MERCILESS"] = { + "10% reduced Wrath Mana Reservation", + }, + ["ENDGAME"] = { + "15% reduced Wrath Mana Reservation", + }, + }, +} \ No newline at end of file diff --git a/Data/Uniques/shield.lua b/Data/Uniques/shield.lua index e4bde740b..d5a76d28c 100644 --- a/Data/Uniques/shield.lua +++ b/Data/Uniques/shield.lua @@ -54,7 +54,7 @@ Requires Level 70, 159 Str +5% Chance to Block ]],[[ Lycosidae -Splintered Tower Shield +Rawhide Tower Shield Requires Level 11, 33 Str +(120-160) to Armour +(30-40) to maximum Life diff --git a/Data/Uniques/sword.lua b/Data/Uniques/sword.lua index 7bf285d47..d6370914d 100644 --- a/Data/Uniques/sword.lua +++ b/Data/Uniques/sword.lua @@ -184,7 +184,7 @@ Implicits: 2 {variant:2}40% increased Accuracy Rating Adds (65-75) to (110-130) Physical Damage 100% increased Burning Damage if you've Ignited an Enemy Recently -Recovery 1% of Maximum Life when you Ignite an Enemy +Recover 1% of Maximum Life when you Ignite an Enemy 100% increased Melee Physical Damage against Ignited Enemies ]],[[ Rebuke of the Vaal diff --git a/Modules/CalcSections.lua b/Modules/CalcSections.lua index 7acd2a489..26a76644f 100644 --- a/Modules/CalcSections.lua +++ b/Modules/CalcSections.lua @@ -390,7 +390,7 @@ return { { label = "Active Trap Limit", flag = "trap", { format = "{0:output:ActiveTrapLimit}", { modName = "ActiveTrapLimit", cfg = "skill" }, }, }, { label = "Trap Cooldown", flag = "trap", { format = "{2:output:TrapCooldown}s", { breakdown = "TrapCooldown" }, - { modName = "TrapCooldownRecovery", cfg = "skill" }, + { modName = "CooldownRecovery", cfg = "skill" }, }, }, { label = "Active Mine Limit", flag = "mine", { format = "{0:output:ActiveMineLimit}", { modName = "ActiveMineLimit", cfg = "skill" }, }, }, { label = "Active Totem Limit", flag = "totem", { format = "{0:output:ActiveTotemLimit}", { modName = "ActiveTotemLimit", cfg = "skill" }, }, }, diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index 02cd37f9b..e36071825 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -391,6 +391,11 @@ local function buildActiveSkillModList(env, activeSkill) -- Add active gem modifiers mergeGemMods(skillModList, activeSkill.activeGem) + -- Add extra modifiers + for _, value in ipairs(env.modDB:Sum("LIST", activeSkill.skillCfg, "ExtraSkillMod")) do + skillModList:AddMod(value.mod) + end + -- Extract skill data for _, value in ipairs(skillModList:Sum("LIST", activeSkill.skillCfg, "Misc")) do if value.type == "SkillData" then @@ -420,7 +425,18 @@ local function buildActiveSkillModList(env, activeSkill) if not activeSkill[destList] then activeSkill[destList] = { } end - t_insert(activeSkill[destList], skillModList[i]) + local sig = modLib.formatModParams(skillModList[i]) + for d = 1, #activeSkill[destList] do + local destMod = activeSkill[destList][d] + if sig == modLib.formatModParams(destMod) and (destMod.type == "BASE" or destMod.type == "INC") then + destMod.value = destMod.value + skillModList[i].value + sig = nil + break + end + end + if sig then + t_insert(activeSkill[destList], skillModList[i]) + end t_remove(skillModList, i) else i = i + 1 @@ -1176,11 +1192,8 @@ local function performCalcs(env) -- Check for extra modifiers to apply to aura skills local extraAuraModList = { } - if modDB.mods.ExtraAuraEffect then - for _, mod in ipairs(modDB.mods.ExtraAuraEffect) do - mod.value.source = mod.source - t_insert(extraAuraModList, mod.value) - end + for _, value in ipairs(modDB:Sum("LIST", nil, "ExtraAuraEffect")) do + t_insert(extraAuraModList, value.mod) end -- Combine buffs/debuffs and calculate skill life and mana reservations @@ -1612,6 +1625,12 @@ local function performCalcs(env) } end end + condList.UncappedLightningResistIsLowest = (output.LightningResistTotal <= output.ColdResistTotal and output.LightningResistTotal <= output.FireResistTotal) + condList.UncappedColdResistIsLowest = (output.ColdResistTotal <= output.LightningResistTotal and output.ColdResistTotal <= output.FireResistTotal) + condList.UncappedFireResistIsLowest = (output.FireResistTotal <= output.LightningResistTotal and output.FireResistTotal <= output.ColdResistTotal) + condList.UncappedLightningResistIsHighest = (output.LightningResistTotal >= output.ColdResistTotal and output.LightningResistTotal >= output.FireResistTotal) + condList.UncappedColdResistIsHighest = (output.ColdResistTotal >= output.LightningResistTotal and output.ColdResistTotal >= output.FireResistTotal) + condList.UncappedFireResistIsHighest = (output.FireResistTotal >= output.LightningResistTotal and output.FireResistTotal >= output.ColdResistTotal) -- Primary defences: Energy shield, evasion and armour do @@ -1942,11 +1961,11 @@ local function performCalcs(env) end if skillFlags.trap then output.ActiveTrapLimit = modDB:Sum("BASE", skillCfg, "ActiveTrapLimit") - output.TrapCooldown = (skillData.trapCooldown or 4) / calcMod(modDB, skillCfg, "TrapCooldownRecovery") + output.TrapCooldown = (skillData.trapCooldown or 4) / calcMod(modDB, skillCfg, "CooldownRecovery") if breakdown then breakdown.TrapCooldown = { s_format("%.2fs ^8(base)", skillData.trapCooldown or 4), - s_format("/ %.2f ^8(increased/reduced cooldown recovery)", 1 + modDB:Sum("INC", skillCfg, "TrapCooldownRecovery") / 100), + s_format("/ %.2f ^8(increased/reduced cooldown recovery)", 1 + modDB:Sum("INC", skillCfg, "CooldownRecovery") / 100), s_format("= %.2fs", output.TrapCooldown) } end diff --git a/Modules/Data.lua b/Modules/Data.lua index ab3b772bb..338edc093 100644 --- a/Modules/Data.lua +++ b/Modules/Data.lua @@ -127,6 +127,17 @@ data.itemMods = { } data.itemMods.Flask = LoadModule("Data/ModFlask") data.itemMods.Jewel = LoadModule("Data/ModJewel") +data.enchantments = { } +data.enchantments.Helmet = LoadModule("Data/EnchantmentHelmet") +data.enchantments.Boots = LoadModule("Data/EnchantmentBoots") + +data.labyrinths = { + { name = "ENDGAME", label = "Endgame" }, + { name = "MERCILESS", label = "Merciless" }, + { name = "CRUEL", label = "Cruel" }, + { name = "NORMAL", label = "Normal" }, +} + data.gems = { } local function makeGemMod(modName, modType, modVal, flags, keywordFlags, ...) return { diff --git a/Modules/ItemTools.lua b/Modules/ItemTools.lua index e9e90b4f5..e976ca788 100644 --- a/Modules/ItemTools.lua +++ b/Modules/ItemTools.lua @@ -130,6 +130,7 @@ function itemLib.parseItemRaw(item) item.implicitLines = 0 item.buffLines = 0 item.affixes = data.itemMods[item.base and item.base.type] + item.enchantments = data.enchantments[item.base and item.base.type] item.prefixes = { } item.suffixes = { } local flaskBuffLines = { } diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index b12cd27c8..2accd1914 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -19,20 +19,20 @@ local formList = { ["^(%d+)%% less"] = "LESS", ["^([%+%-][%d%.]+)%%?"] = "BASE", ["^([%+%-][%d%.]+)%%? to"] = "BASE", - ["^([%+%-][%d%.]+)%%? of"] = "BASE", + ["^([%+%-]?[%d%.]+)%%? of"] = "BASE", ["^([%+%-][%d%.]+)%%? base"] = "BASE", ["^([%+%-]?[%d%.]+)%%? additional"] = "BASE", ["^you gain ([%d%.]+)"] = "BASE", + ["^gain ([%d%.]+)%% of"] = "BASE", ["^([%+%-]?%d+)%% chance"] = "CHANCE", ["^([%+%-]?%d+)%% additional chance"] = "CHANCE", - ["^([%d%.]+)%% of"] = "CONV", - ["^gain ([%d%.]+)%% of"] = "CONV", ["penetrates? (%d+)%%"] = "PEN", ["penetrates (%d+)%% of"] = "PEN", ["penetrates (%d+)%% of enemy"] = "PEN", - ["^([%d%.]+)%% of (.+) regenerated per second"] = "REGENPERCENT", ["^([%d%.]+) (.+) regenerated per second"] = "REGENFLAT", + ["^([%d%.]+)%% of (.+) regenerated per second"] = "REGENPERCENT", ["^regenerate ([%d%.]+) (.+) per second"] = "REGENFLAT", + ["^regenerate ([%d%.]+)%% of (.+) per second"] = "REGENPERCENT", ["(%d+) to (%d+) additional (%a+) damage"] = "DMG", ["adds (%d+)%-(%d+) (%a+) damage"] = "DMG", ["adds (%d+) to (%d+) (%a+) damage"] = "DMG", @@ -125,6 +125,7 @@ local modNameList = { ["stun duration on enemies"] = "EnemyStunDuration", ["stun duration"] = "EnemyStunDuration", -- Auras/curses + ["aura effect"] = "AuraEffect", ["effect of non-curse auras you cast"] = "AuraEffect", ["effect of your curses"] = "CurseEffect", ["curse effect"] = "CurseEffect", @@ -182,7 +183,7 @@ local modNameList = { ["trap throwing speed"] = "TrapThrowingSpeed", ["trap trigger area of effect"] = "TrapTriggerAreaOfEffect", ["trap duration"] = "TrapDuration", - ["cooldown recovery speed for throwing traps"] = "TrapCooldownRecovery", + ["cooldown recovery speed for throwing traps"] = { "CooldownRecovery", keywordFlags = KeywordFlag.Trap }, ["mine laying speed"] = "MineLayingSpeed", ["mine detonation area of effect"] = "MineDetonationAreaOfEffect", ["mine duration"] = "MineDuration", @@ -195,6 +196,7 @@ local modNameList = { ["duration"] = "Duration", ["skill effect duration"] = "Duration", ["chaos skill effect duration"] = { "Duration", keywordFlags = KeywordFlag.Chaos }, + ["cooldown recovery speed"] = "CooldownRecovery", -- Buffs ["onslaught effect"] = "OnslaughtEffect", ["fortify duration"] = "FortifyDuration", @@ -360,6 +362,7 @@ local preFlagList = { -- List of modifier tags local modTagList = { ["on enemies"] = { }, + ["while active"] = { }, [" on critical strike"] = { tag = { type = "Condition", var = "CriticalStrike" } }, -- Multipliers ["per power charge"] = { tag = { type = "Multiplier", var = "PowerCharge" } }, @@ -665,6 +668,11 @@ local specialModList = { ["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("PhysicalDamageGainAsFire", "BASE", num, { type = "SocketedIn", keyword = "strength" }) } end, ["instant recovery"] = { mod("FlaskInstantRecovery", "BASE", 100) }, ["(%d+)%% of recovery applied instantly"] = function(num) return { mod("FlaskInstantRecovery", "BASE", num) } end, + -- Enchantment modifiers + ["(%d+)%% increased decoy totem life"] = function(num) return { mod("TotemLife", "INC", num, { type = "SkillName", skillName = "Decoy Totem" }) } end, + ["(%d+)%% increased ice spear critical strike chance in second form"] = function(num) return { mod("CritChance", "INC", num, { type = "SkillName", skillName = "Ice Spear" }, { type = "SkillPart", skillPart = 2 }) } end, + ["(%d+)%% increased incinerate damage for each stage"] = function(num) return { mod("Damage", "INC", num * 3, { type = "SkillName", skillName = "Incinerate" }, { type = "SkillPart", skillPart = 2 }) } end, + ["shock nova ring deals (%d+)%% increased damage"] = function(num) return { mod("Damage", "INC", num, { type = "SkillName", skillName = "Shock Nova" }, { type = "SkillPart", skillPart = 1 }) } end, -- Unique item modifiers ["your cold damage can ignite"] = { flag("ColdCanIgnite") }, ["your fire damage can shock but not ignite"] = { flag("FireCanShock"), flag("FireCannotIgnite") }, @@ -726,6 +734,11 @@ local specialModList = { ["socketed lightning spells have (%d+)%% increased spell damage if triggered"] = function(num) return { mod("Damage", "INC", num, nil, ModFlag.Spell, { type = "SocketedIn", keyword = "lightning" }, { type = "Condition", var = "SkillIsTriggered" }) } end, ["arrows always pierce"] = { mod("PierceChance", "BASE", 100, nil, ModFlag.Attack) }, ["arrows that pierce cause bleeding"] = { flag("ArrowsThatPierceCauseBleeding") }, + ["during flask effect, damage penetrates (%d+)%% of resistance of each element for which your uncapped elemental resistance is highest"] = function(num) return { + mod("LightningPenetration", "BASE", num, { type = "Condition", var = "UncappedLightningResistIsHighest" }), + mod("ColdPenetration", "BASE", num, { type = "Condition", var = "UncappedColdResistIsHighest" }), + mod("FirePenetration", "BASE", num, { type = "Condition", var = "UncappedFireResistIsHighest" }), + } end, } local keystoneList = { -- List of keystones that can be found on uniques @@ -756,7 +769,7 @@ for _, name in pairs(keystoneList) do end -- Special lookups used for various modifier forms -local convTypes = { +local suffixTypes = { ["as extra lightning damage"] = "GainAsLightning", ["added as lightning damage"] = "GainAsLightning", ["gained as extra lightning damage"] = "GainAsLightning", @@ -795,6 +808,7 @@ local penTypes = { local regenTypes = { ["life"] = "LifeRegen", ["maximum life"] = "LifeRegen", + ["life and mana"] = { "LifeRegen", "ManaRegen" }, ["mana"] = "ManaRegen", ["energy shield"] = "EnergyShieldRegen", ["maximum mana and energy shield"] = { "ManaRegen", "EnergyShieldRegen" }, @@ -802,11 +816,18 @@ local regenTypes = { -- Build active skill name lookup local skillNameList = { } +local preSkillNameList = { } for skillName, data in pairs(data.gems) do if not data.support then skillNameList[" "..skillName:lower().." "] = { tag = { type = "SkillName", skillName = skillName } } + preSkillNameList["^"..skillName:lower().." has "] = { tag = { type = "SkillName", skillName = skillName } } + preSkillNameList["^"..skillName:lower().." totem deals "] = { tag = { type = "SkillName", skillName = skillName } } + preSkillNameList["^"..skillName:lower().." grants "] = { addToSkill = { type = "SkillName", skillName = skillName }, tag = { type = "GlobalEffect", effectType = "Buff" } } + preSkillNameList["^"..skillName:lower().." grants a?n? ?additional "] = { addToSkill = { type = "SkillName", skillName = skillName }, tag = { type = "GlobalEffect", effectType = "Buff" } } + preSkillNameList["^"..skillName:lower().." totem grants "] = { addToSkill = { type = "SkillName", skillName = skillName }, tag = { type = "GlobalEffect", effectType = "Buff" } } end end + local function getSimpleConv(srcList, dst, type, remove, factor) return function(nodeMods, out, data) if nodeMods then @@ -962,6 +983,10 @@ local function parseMod(line, order) local modFlag modFlag, line = scan(line, preFlagList) + -- Check for skill name at the start of the line + local skillTag + skillTag, line = scan(line, preSkillNameList) + -- Scan for modifier form local modForm, formCap modForm, line, formCap = scan(line, formList) @@ -984,8 +1009,8 @@ local function parseMod(line, order) end -- Scan for modifier name and skill name - local modName, skillTag - if order == 2 then + local modName + if order == 2 and not skillTag then skillTag, line = scan(line, skillNameList, true) end if modForm == "PEN" then @@ -998,7 +1023,7 @@ local function parseMod(line, order) else modName, line = scan(line, modNameList, true) end - if order == 1 then + if order == 1 and not skillTag then skillTag, line = scan(line, skillNameList, true) end @@ -1010,7 +1035,7 @@ local function parseMod(line, order) -- Find modifier value and type according to form local modValue = num local modType = "BASE" - local modSuffix = "" + local modSuffix if modForm == "INC" then modType = "INC" elseif modForm == "RED" then @@ -1022,13 +1047,8 @@ local function parseMod(line, order) modValue = -num modType = "MORE" elseif modForm == "BASE" then + modSuffix, line = scan(line, suffixTypes, true) elseif modForm == "CHANCE" then - elseif modForm == "CONV" then - modSuffix, line = scan(line, convTypes, true) - if not modSuffix then - modSuffix = "" - --return { }, line - end elseif modForm == "REGENPERCENT" then modName = regenTypes[formCap[2]] if not modName then @@ -1095,7 +1115,7 @@ local function parseMod(line, order) local modList = { } for i, name in ipairs(type(nameList) == "table" and nameList or { nameList }) do modList[i] = { - name = name .. modSuffix, + name = name .. (modSuffix or ""), type = modType, value = type(modValue) == "table" and modValue[i] or modValue, flags = flags, @@ -1103,10 +1123,17 @@ local function parseMod(line, order) tagList = tagList, } end - if modList[1] and modFlag and modFlag.addToAura then - -- Special handling for modifiers that add effects to your auras - for i, effectMod in ipairs(modList) do - modList[i] = mod("ExtraAuraEffect", "LIST", effectMod) + if modList[1] then + if modFlag and modFlag.addToAura then + -- Special handling for modifiers that add effects to your auras + for i, effectMod in ipairs(modList) do + modList[i] = mod("ExtraAuraEffect", "LIST", { mod = effectMod }) + end + elseif skillTag and skillTag.addToSkill then + -- Special handling for skill enchants that add additional effects + for i, effectMod in ipairs(modList) do + modList[i] = mod("ExtraSkillMod", "LIST", { mod = effectMod }, skillTag.addToSkill) + end end end return modList, line:match("%S") and line diff --git a/Modules/ModTools.lua b/Modules/ModTools.lua index 029e65219..1bbd34088 100644 --- a/Modules/ModTools.lua +++ b/Modules/ModTools.lua @@ -108,7 +108,11 @@ function modLib.formatValue(value) if i > 1 then ret = ret .. "/" end - ret = ret .. string.format("%s=%s", paramName, tostring(value[paramName])) + if paramName == "mod" then + ret = ret .. string.format("%s=[%s]", paramName, modLib.formatMod(value[paramName])) + else + ret = ret .. string.format("%s=%s", paramName, tostring(value[paramName])) + end end return "{"..ret.."}" end diff --git a/PathOfBuilding.sln b/PathOfBuilding.sln index dabb3ddd3..96096f16d 100644 --- a/PathOfBuilding.sln +++ b/PathOfBuilding.sln @@ -100,6 +100,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{7EE4 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{F2327651-CAA5-4DA0-91DB-EFA5E0E07A51}" ProjectSection(SolutionItems) = preProject + Data\EnchantmentBoots.lua = Data\EnchantmentBoots.lua + Data\EnchantmentHelmet.lua = Data\EnchantmentHelmet.lua Data\ModFlask.lua = Data\ModFlask.lua Data\ModJewel.lua = Data\ModJewel.lua Data\New.lua = Data\New.lua diff --git a/README.md b/README.md index 69918931a..0ed62cbd1 100644 --- a/README.md +++ b/README.md @@ -47,18 +47,25 @@ Head over to the [Releases](https://github.com/Openarl/PathOfBuilding/releases) ![ss3](https://cloud.githubusercontent.com/assets/19189971/18089780/f0ff234a-6f04-11e6-8c88-6193fe59a5c4.png) ## Changelog +### 1.3.23 - 2017/03/31 + * Helmets and Boots can now be enchanted via the new "Apply Enchantment..." button that appears when viewing the item + * Added support for more helmet enchants; the vast majority of them should now work + * Added support for the conditional penetration stat on The Wise Oak + * Corrected the base of Lycosidae + * The quality bonus on Blood Rage now applies correctly + ### 1.3.22 - 2017/03/28 * The sidebar can now displays two Crit Chance values: - 1. Crit Chance: + 1. Crit Chance: * This is the skill's "real" crit chance, as displayed in the in-game character sheet * If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower) - 2. Effective Crit Chance: + 2. Effective Crit Chance: * This is the value previously shown as "Crit Chance" * This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky" * Added an option to the Configuration tab for "Are you Leeching?" * Essence Drain now uses "Average Damage" mode * Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges - * The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster + * The Red/Green/Blue Nightmare jewels now correctly apply to the conditional resistance stats in the Sanctuary cluster * Corrected the crit chance modifier on Pre-2.0.0 Windripper * Updated "The Oak" to mirror the changes to Springleaf in 2.6 * The program should now correctly prompt to save the current build before updating diff --git a/changelog.txt b/changelog.txt index be10244d6..2e741de9d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,15 +1,21 @@ +VERSION[1.3.23][2017/03/31] + * Helmets and Boots can now be enchanted via the new "Apply Enchantment..." button that appears when viewing the item + * Added support for more helmet enchants; the vast majority of them should now work + * Added support for the conditional penetration stat on The Wise Oak + * Corrected the base of Lycosidae + * The quality bonus on Blood Rage now applies correctly VERSION[1.3.22][2017/03/28] * The sidebar can now displays two Crit Chance values: - 1. Crit Chance: + 1. Crit Chance: * This is the skill's "real" crit chance, as displayed in the in-game character sheet * If your crit chance is capped, this value will always be 95%, unlike your effective crit chance (which can be lower) - 2. Effective Crit Chance: + 2. Effective Crit Chance: * This is the value previously shown as "Crit Chance" * This estimates your true crit chance, factoring in accuracy and "Crit Chance is Lucky" * Added an option to the Configuration tab for "Are you Leeching?" * Essence Drain now uses "Average Damage" mode * Phasing is now enabled automatically if you have Quartz Infusion and maximum frenzy charges - * The Red/Green/Blue Nightmare jewels now correctly apply to the condition resistance stats in the Sanctuary cluster + * The Red/Green/Blue Nightmare jewels now correctly apply to the conditional resistance stats in the Sanctuary cluster * Corrected the crit chance modifier on Pre-2.0.0 Windripper * Updated "The Oak" to mirror the changes to Springleaf in 2.6 * The program should now correctly prompt to save the current build before updating diff --git a/manifest.xml b/manifest.xml index 24d74ba6d..3a08565f0 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,13 +1,13 @@ - + - + @@ -24,7 +24,7 @@ - + @@ -40,20 +40,22 @@ - + - - + + - - + + - - + + + + @@ -99,9 +101,9 @@ - + - +