diff --git a/Classes/ButtonControl.lua b/Classes/ButtonControl.lua index 0b27cffd1..49104f7b9 100644 --- a/Classes/ButtonControl.lua +++ b/Classes/ButtonControl.lua @@ -9,6 +9,12 @@ local ButtonClass = common.NewClass("ButtonControl", "Control", function(self, a self.Control(anchor, x, y, width, height) self.label = label self.onClick = onClick + self.tooltipFunc = function() + local tooltip = self:GetProperty("tooltip") + if tooltip then + main:AddTooltipLine(14, tooltip) + end + end end) function ButtonClass:Click() @@ -66,13 +72,10 @@ function ButtonClass:Draw(viewPort) local overSize = self.overSizeText or 0 DrawString(x + width / 2, y + 2 - overSize, "CENTER_X", height - 4 + overSize * 2, "VAR",label ) end - if mOver and self.tooltip then - local tooltip = self:GetProperty("tooltip") - if tooltip then - main:AddTooltipLine(16, tooltip) - end + if mOver then SetDrawLayer(nil, 100) - main:DrawTooltip(x, y, width, height, viewPort) + local col, center = self.tooltipFunc() + main:DrawTooltip(x, y, width, height, viewPort, col, center) SetDrawLayer(nil, 0) end end diff --git a/Classes/CheckBoxControl.lua b/Classes/CheckBoxControl.lua index 89b0ffa4a..44c0cb583 100644 --- a/Classes/CheckBoxControl.lua +++ b/Classes/CheckBoxControl.lua @@ -9,6 +9,12 @@ local CheckBoxClass = common.NewClass("CheckBoxControl", "Control", function(sel self.Control(anchor, x, y, size, size) self.label = label self.changeFunc = changeFunc + self.tooltipFunc = function(state) + local tooltip = self:GetProperty("tooltip") + if tooltip then + main:AddTooltipLine(14, tooltip) + end + end end) function CheckBoxClass:IsMouseOver() @@ -60,14 +66,11 @@ function CheckBoxClass:Draw(viewPort) if label then DrawString(x - 5, y + 2, "RIGHT_X", size - 4, "VAR", label) end - if mOver and self.tooltip then - local tooltip = self:GetProperty("tooltip") - if tooltip then - main:AddTooltipLine(16, tooltip) - SetDrawLayer(nil, 100) - main:DrawTooltip(x, y, size, size, viewPort) - SetDrawLayer(nil, 0) - end + if mOver then + SetDrawLayer(nil, 100) + local col, center = self.tooltipFunc(self.state) + main:DrawTooltip(x, y, size, size, viewPort, col, center) + SetDrawLayer(nil, 0) end end diff --git a/Classes/ConfigTab.lua b/Classes/ConfigTab.lua index af8ac12be..5065e2ea3 100644 --- a/Classes/ConfigTab.lua +++ b/Classes/ConfigTab.lua @@ -34,7 +34,7 @@ local varList = { { var = "buffFortify", type = "check", label = "Do you have Fortify?", ifCond = "Fortify", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "Fortify" }, "Config", { type = "Condition", var = "Combat" }) end }, - { var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", ifCond = "UsingFlask", apply = function(val, modList, enemyModList) -- FIXME Flask release (autocondition note) + { var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", ifCond = "UsingFlask", tooltip = "This is automatically enabled if you have a flask active,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsingFlask" }, "Config", { type = "Condition", var = "Combat" }) end }, { var = "conditionOnConsecratedGround", type = "check", label = "Are you on Consecrated Ground?", tooltip = "In addition to allowing any 'while on Consecrated Ground' modifiers to apply,\nthis will apply the 4% life regen modifier granted by Consecrated Ground.", apply = function(val, modList, enemyModList) diff --git a/Classes/DropDownControl.lua b/Classes/DropDownControl.lua index 320a8c985..58e2935fc 100644 --- a/Classes/DropDownControl.lua +++ b/Classes/DropDownControl.lua @@ -27,6 +27,12 @@ local DropDownClass = common.NewClass("DropDownControl", "Control", "ControlHost self.sel = 1 self.selFunc = selFunc self.tooltip = tooltip + self.tooltipFunc = function(mode, sel, selVal) + local tooltip = self:GetProperty("tooltip") + if tooltip then + main:AddTooltipLine(14, self.tooltip) + end + end end) function DropDownClass:SelByValue(val) @@ -140,13 +146,13 @@ function DropDownClass:Draw(viewPort) SetDrawLayer(nil, 0) end if enabled then - SetDrawColor(1, 1, 1) - if (mOver or self.dropped) and self.tooltip then + if (mOver or self.dropped) and mOverComp ~= "DROP" then + local col, center = self.tooltipFunc(mOver and "BODY" or "OUT", self.sel, self.list[self.sel]) SetDrawLayer(nil, 10) - main:AddTooltipLine(14, self.tooltip) - main:DrawTooltip(x, y - (self.dropped and self.dropUp and dropExtra or 0), width, height + (self.dropped and dropExtra or 0), viewPort) + main:DrawTooltip(x, y - (self.dropped and self.dropUp and dropExtra or 0), width, height + (self.dropped and dropExtra or 0), viewPort, col, center) SetDrawLayer(nil, 0) end + SetDrawColor(1, 1, 1) else SetDrawColor(0.66, 0.66, 0.66) end @@ -162,9 +168,13 @@ function DropDownClass:Draw(viewPort) self:DrawControls(viewPort) local cursorX, cursorY = GetCursorPos() self.hoverSel = mOver and not scrollBar:IsMouseOver() and math.floor((cursorY - dropY + scrollBar.offset) / (height - 4)) + 1 - if self.hoverSel and self.hoverSel < 1 then + if self.hoverSel and not self.list[self.hoverSel] then self.hoverSel = nil end + if self.hoverSel then + local col, center = self.tooltipFunc("HOVER", self.hoverSel, self.list[self.hoverSel]) + main:DrawTooltip(x, dropY + 2 + (self.hoverSel - 1) * (height - 4) - scrollBar.offset, width, height - 4, viewPort, col, center) + end SetViewport(x + 2, dropY + 2, scrollBar.enabled and width - 22 or width - 4, dropHeight) for index, listVal in ipairs(self.list) do local y = (index - 1) * (height - 4) - scrollBar.offset diff --git a/Classes/EditControl.lua b/Classes/EditControl.lua index fe5b651ed..8d723b2d2 100644 --- a/Classes/EditControl.lua +++ b/Classes/EditControl.lua @@ -81,6 +81,12 @@ local EditClass = common.NewClass("EditControl", "ControlHost", "Control", "Undo self.controls.scrollBarH.shown = false self.controls.scrollBarV.shown = false end + self.tooltipFunc = function() + local tooltip = self:GetProperty("tooltip") + if tooltip then + main:AddTooltipLine(14, tooltip) + end + end end) function EditClass:SetText(text, notify) @@ -221,10 +227,10 @@ function EditClass:Draw(viewPort) if not enabled then return end - if mOver and self.tooltip then - main:AddTooltipLine(16, self:GetProperty("tooltip")) + if mOver then SetDrawLayer(nil, 100) - main:DrawTooltip(x, y, width, height, viewPort) + local col, center = self.tooltipFunc() + main:DrawTooltip(x, y, width, height, viewPort, col, center) SetDrawLayer(nil, 0) end self:UpdateScrollBars() diff --git a/Classes/GemSelectControl.lua b/Classes/GemSelectControl.lua index 5eec34025..7dab9d4cd 100644 --- a/Classes/GemSelectControl.lua +++ b/Classes/GemSelectControl.lua @@ -182,6 +182,20 @@ function GemSelectClass:Draw(viewPort) end SetViewport() self:DrawControls(viewPort) + if self.hoverSel then + local calcFunc, calcBase = self.skillsTab.build.calcsTab:GetMiscCalculator(self.build) + if calcFunc then + local gemList = self.skillsTab.displayGroup.gemList + local oldGem = gemList[self.index] + gemList[self.index] = copyTable(oldGem or { level = 20, quality = 0, enabled = true }, true) + gemList[self.index].name = self.list[self.hoverSel] + gemList[self.index].data = data.gems[self.list[self.hoverSel]] + local output = calcFunc() + gemList[self.index] = oldGem + self.skillsTab.build:AddStatComparesToTooltip(calcBase, output, "^7Selecting this gem will give you:") + main:DrawTooltip(x, y + height + 2 + (self.hoverSel - 1) * (height - 4) - scrollBar.offset, width, height - 4, viewPort) + end + end SetDrawLayer(nil, 0) else local hoverControl diff --git a/Classes/ImportTab.lua b/Classes/ImportTab.lua index c63c77bd0..49febe35f 100644 --- a/Classes/ImportTab.lua +++ b/Classes/ImportTab.lua @@ -327,7 +327,7 @@ function ImportTabClass:ImportItem(itemData, sockets) local slotName if itemData.inventoryId == "PassiveJewels" and sockets then slotName = "Jewel "..sockets[itemData.x + 1] - elseif launch.enableFlasks and itemData.inventoryId == "Flask" then -- FIXME Flask release + elseif itemData.inventoryId == "Flask" then slotName = "Flask "..(itemData.x + 1) else slotName = slotMap[itemData.inventoryId] @@ -405,19 +405,17 @@ function ImportTabClass:ImportItem(itemData, sockets) if itemData.implicitMods then item.implicitLines = item.implicitLines + #itemData.implicitMods for _, line in ipairs(itemData.implicitMods) do - for line in line:gmatch("[^\n]+") do - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { } }) - end + line = line:gsub("\n"," ") + local modList, extra = modLib.parseMod(line) + t_insert(item.modLines, { line = line, extra = extra, mods = modList or { } }) end end if itemData.enchantMods then item.implicitLines = item.implicitLines + #itemData.enchantMods for _, line in ipairs(itemData.enchantMods) do - for line in line:gmatch("[^\n]+") do - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { }, crafted = true }) - end + line = line:gsub("\n"," ") + local modList, extra = modLib.parseMod(line) + t_insert(item.modLines, { line = line, extra = extra, mods = modList or { }, crafted = true }) end end if itemData.explicitMods then diff --git a/Classes/ItemsTab.lua b/Classes/ItemsTab.lua index 8f06959cd..45990a88a 100644 --- a/Classes/ItemsTab.lua +++ b/Classes/ItemsTab.lua @@ -14,14 +14,7 @@ local m_max = math.max local m_min = math.min local m_floor = math.floor -local baseSlots = { "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring 1", "Ring 2", "Belt" } -if launch.enableFlasks then -- FIXME Flask release - t_insert(baseSlots, "Flask 1") - t_insert(baseSlots, "Flask 2") - t_insert(baseSlots, "Flask 3") - t_insert(baseSlots, "Flask 4") - t_insert(baseSlots, "Flask 5") -end +local baseSlots = { "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring 1", "Ring 2", "Belt", "Flask 1", "Flask 2", "Flask 3", "Flask 4", "Flask 5" } local ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost", "Control", function(self, build) self.UndoHandler() @@ -35,6 +28,37 @@ local ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost", self.list = { } self.orderList = { } + -- Build lists of item bases, separated by type + self.baseLists = { } + for name, base in pairs(data.itemBases) do + local type = base.type + if base.subType then + type = type .. ": " .. base.subType + end + self.baseLists[type] = self.baseLists[type] or { } + t_insert(self.baseLists[type], { label = name, name = name, base = base }) + end + self.baseTypeList = { } + for type, list in pairs(self.baseLists) do + t_insert(self.baseTypeList, type) + table.sort(list, function(a, b) + if a.base.req and b.base.req then + if a.base.req.level == b.base.req.level then + return a.name < b.name + else + return (a.base.req.level or 1) > (b.base.req.level or 1) + end + elseif a.base.req and not b.base.req then + return true + elseif b.base.req and not a.base.req then + return false + else + return a.name < b.name + end + end) + end + table.sort(self.baseTypeList) + -- Item slots self.slots = { } self.orderedSlots = { } @@ -56,6 +80,7 @@ local ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost", return self.slotOrder[a.slotName] < self.slotOrder[b.slotName] end) self.controls.slotHeader = common.New("LabelControl", {"BOTTOMLEFT",self.orderedSlots[1],"TOPLEFT"}, 0, -4, 0, 16, "^7Equipped items:") + self:PopulateSlots() -- Build item list self.controls.itemList = common.New("ItemList", {"TOPLEFT",self.orderedSlots[1],"TOPRIGHT"}, 20, 0, 360, 308, self) @@ -86,13 +111,16 @@ local ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost", end -- Display item - self.controls.newDisplayItem = common.New("ButtonControl", {"TOPLEFT",self.controls.itemList,"TOPRIGHT"}, 20, 0, 120, 20, "Create custom...", function() - self:EditDisplayItemText() + self.controls.craftDisplayItem = common.New("ButtonControl", {"TOPLEFT",self.controls.itemList,"TOPRIGHT"}, 20, 0, 120, 20, "Craft item...", function() + self:CraftItem() end) - self.controls.newDisplayItem.shown = function() + self.controls.craftDisplayItem.shown = function() return self.displayItem == nil end - self.controls.displayItemTip = common.New("LabelControl", {"TOPLEFT",self.controls.newDisplayItem,"BOTTOMLEFT"}, 0, 8, 100, 16, + self.controls.newDisplayItem = common.New("ButtonControl", {"TOPLEFT",self.controls.craftDisplayItem,"TOPRIGHT"}, 8, 0, 120, 20, "Create custom...", function() + self:EditDisplayItemText() + end) + self.controls.displayItemTip = common.New("LabelControl", {"TOPLEFT",self.controls.craftDisplayItem,"BOTTOMLEFT"}, 0, 8, 100, 16, [[^7Double-click an item from one of the lists, or copy and paste an item from in game (hover over the item and Ctrl+C) to view/edit the item and add it to your build. @@ -123,9 +151,35 @@ 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.displayItemRangeLine = common.New("DropDownControl", {"TOPLEFT",self.controls.addDisplayItem,"BOTTOMLEFT"}, 0, 8, 350, 18, nil, function(sel) + 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) + self.displayItem[drop.outputTable][drop.outputIndex] = value.value + itemLib.craftItem(self.displayItem) + self:UpdateDisplayItemRangeLines() + end) + drop.tooltipFunc = function(mode, sel, value) + if mode ~= "OUT" and self.displayItem.affixes[value.value] and (not self.selControl or self.selControl == drop) then + for _, line in ipairs(self.displayItem.affixes[value.value]) do + main:AddTooltipLine(16, "^7"..line) + end + end + end + drop.shown = function() + return self.displayItem.craftable and i <= self.displayItem.affixLimit + end + self.controls["displayItemAffix"..i] = drop + self.controls["displayItemAffixLabel"..i] = common.New("LabelControl", {"RIGHT",drop,"LEFT"}, -4, 0, 0, 14, function() + return drop.outputTable == "prefixes" and "^7Prefix:" or "^7Suffix:" + end) + end + self.controls.displayItemRangeLine = common.New("DropDownControl", {"TOPLEFT",self.controls.addDisplayItem,"BOTTOMLEFT"}, 0, 0, 350, 18, nil, function(sel) 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) + end self.controls.displayItemRangeLine.shown = function() return self.displayItem.rangeLineList[1] ~= nil end @@ -189,7 +243,7 @@ function ItemsTabClass:Save(xml) t_insert(xml, child) end for name, slot in pairs(self.slots) do - if slot.selItemId ~= 0 then + if slot.selItemId ~= 0 and not slot.nodeId then t_insert(xml, { elem = "Slot", attrib = { name = name, itemId = tostring(slot.selItemId), active = slot.active and "true" }}) end end @@ -234,6 +288,9 @@ function ItemsTabClass:Draw(viewPort, inputEvents) if self.displayItem then local extraOffset = self.controls.displayItemRangeLine:IsShown() and 26 or 0 + if self.displayItem.craftable then + extraOffset = extraOffset + self.displayItem.affixLimit * 22 + 6 + end self:AddItemTooltip(self.displayItem) local baseX, baseY = self.anchorDisplayItem:GetPos() main:DrawTooltip(baseX, baseY + 28 + extraOffset, nil, nil, viewPort, data.colorCodes[self.displayItem.rarity]) @@ -277,6 +334,77 @@ function ItemsTabClass:GetSocketAndJewelForNodeID(nodeId) return self.sockets[nodeId], self.list[self.sockets[nodeId].selItemId] end +-- Opens the item crafting popup +function ItemsTabClass:CraftItem() + local popup + local function makeItem(base) + local item = { name = base.name, base = base.base, modLines = { }, quality = 0 } + local raritySel = popup.controls.rarity.sel + if base.base.flask then + if raritySel == 3 then + raritySel = 2 + end + end + 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 + if raritySel >= 3 then + item.baseName = base.name + item.title = popup.controls.title.buf:match("%S") and popup.controls.title.buf or "New Item" + end + if base.base.implicit then + local modList, extra = modLib.parseMod(base.base.implicit) + t_insert(item.modLines, { line = base.base.implicit, extra = extra, modList = modList or { } }) + item.implicitLines = 1 + else + item.implicitLines = 0 + end + 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), + }) + 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) + if mode ~= "OUT" then + local item = makeItem(selVal) + self:AddItemTooltip(item, nil, true) + return data.colorCodes[item.rarity], true + end + end +end + +-- Opens the item text editor popup function ItemsTabClass:EditDisplayItemText() local popup local function buildRaw() @@ -311,19 +439,19 @@ function ItemsTabClass:EditDisplayItemText() local item = itemLib.makeItemFromRaw(buildRaw()) return item ~= nil end - popup.controls.save.tooltip = function() + popup.controls.save.tooltipFunc = function() local item = itemLib.makeItemFromRaw(buildRaw()) if item then self:AddItemTooltip(item, nil, true) + return data.colorCodes[item.rarity], true else - return -[[The item is invalid. -Check that the item's title and base name are in the correct format. -For Rare and Unique items, the first 2 lines must be the title and base name. E.g: -Abberath's Horn -Goat's Horn -For Normal and Magic items, the base name must be somewhere in the first line. E.g: -Scholar's Platinum Kris of Joy]] + main:AddTooltipLine(14, "The item is invalid.") + main:AddTooltipLine(14, "Check that the item's title and base name are in the correct format.") + main:AddTooltipLine(14, "For Rare and Unique items, the first 2 lines must be the title and base name. E.g:") + main:AddTooltipLine(14, "Abberath's Horn") + main:AddTooltipLine(14, "Goat's Horn") + main:AddTooltipLine(14, "For Normal and Magic items, the base name must be somewhere in the first line. E.g:") + main:AddTooltipLine(14, "Scholar's Platinum Kris of Joy") end end end @@ -345,6 +473,49 @@ function ItemsTabClass:SetDisplayItem(item) self.controls.displayItemVariant.sel = item.variant self:UpdateDisplayItemRangeLines() self.controls.scrollBarH:SetOffset(self.controls.scrollBarH.offsetMax) + item.craftable = item.crafted and item.affixes and item.affixLimit > 0 + if item.craftable then + local prefixList = { } + local suffixList = { } + for name, data in pairs(item.affixes) do + if not data.exclude or (not data.exclude[item.base.subType] and not data.exclude[item.baseName]) then + if data.type == "Prefix" then + t_insert(prefixList, name) + elseif data.type == "Suffix" then + t_insert(suffixList, name) + end + end + end + table.sort(prefixList) + t_insert(prefixList, 1, "None") + table.sort(suffixList) + t_insert(suffixList, 1, "None") + local prefixTable = { } + local suffixTable = { } + for list, out in pairs({[prefixList] = prefixTable, [suffixList] = suffixTable}) do + for i, name in pairs(list) do + out[i] = { + label = name, + value = name, + } + if item.affixes[name] then + out[i].label = out[i].label .. " ^8[" .. table.concat(item.affixes[name], "/") .. "]" + end + end + end + for i = 1, item.affixLimit/2 do + local pre = self.controls["displayItemAffix"..i] + pre.list = prefixTable + pre.outputTable = "prefixes" + pre.outputIndex = i + pre.sel = isValueInArray(prefixList, item.prefixes[i] or "None") or 1 + local suf = self.controls["displayItemAffix"..(i+item.affixLimit/2)] + suf.list = suffixTable + suf.outputTable = "suffixes" + suf.outputIndex = i + suf.sel = isValueInArray(suffixList, item.suffixes[i] or "None") or 1 + end + end else self.controls.scrollBarH:SetOffset(0) end @@ -414,6 +585,13 @@ function ItemsTabClass:DeleteItem(item) break end end + for _, spec in pairs(self.build.treeTab.specList) do + for nodeId, itemId in pairs(spec.jewels) do + if itemId == item.id then + spec.jewels[nodeId] = 0 + end + end + end self.list[item.id] = nil self:PopulateSlots() self:AddUndoState() @@ -525,7 +703,7 @@ function ItemsTabClass:AddItemTooltip(item, slot, dbMode) for _, def in ipairs({{var="Armour",label="Armour"},{var="Evasion",label="Evasion Rating"},{var="EnergyShield",label="Energy Shield"}}) do local itemVal = armourData[def.var] if itemVal and itemVal > 0 then - main:AddTooltipLine(16, s_format("^x7F7F7F%s: %s%d", def.label, itemVal ~= base.armour[def.var.."Base"] and data.colorCodes.MAGIC or "^7", itemVal)) + main:AddTooltipLine(16, s_format("^x7F7F7F%s: %s%d", def.label, itemVal ~= base.armour[def.var:sub(1,1):lower()..def.var:sub(2,-1).."Base"] and data.colorCodes.MAGIC or "^7", itemVal)) end end elseif base.flask then @@ -593,7 +771,7 @@ function ItemsTabClass:AddItemTooltip(item, slot, dbMode) main:AddTooltipLine(16, colorCode..line) end end - if index == item.implicitLines and item.modLines[index + 1] then + if index == item.implicitLines + item.buffLines and item.modLines[index + 1] then -- Add separator between implicit and explicit modifiers main:AddTooltipSeparator(10) end @@ -602,7 +780,7 @@ function ItemsTabClass:AddItemTooltip(item, slot, dbMode) -- Corrupted item label if item.corrupted then - if #item.modLines == item.implicitLines then + if #item.modLines == item.implicitLines + item.buffLines then main:AddTooltipSeparator(10) end main:AddTooltipLine(16, "^1Corrupted") diff --git a/Classes/PassiveSpec.lua b/Classes/PassiveSpec.lua index 26762447b..f1b9e826d 100644 --- a/Classes/PassiveSpec.lua +++ b/Classes/PassiveSpec.lua @@ -37,6 +37,10 @@ local PassiveSpecClass = common.NewClass("PassiveSpec", "UndoHandler", function( -- Keys are node IDs, values are nodes self.allocNodes = { } + -- Table of jewels equipped in this tree + -- Keys are node IDs, values are items + self.jewels = { } + self:SelectClass(0) end) @@ -46,10 +50,24 @@ function PassiveSpecClass:Load(xml, dbFileName) if type(node) == "table" then if node.elem == "URL" then if type(node[1]) ~= "string" then - launch:ShowErrMsg("^1Error parsing '%s': 'URL' element missing content", fileName) + launch:ShowErrMsg("^1Error parsing '%s': 'URL' element missing content", dbFileName) return true end self:DecodeURL(node[1]) + elseif node.elem == "Sockets" then + for _, child in ipairs(node) do + if child.elem == "Socket" then + if not child.attrib.nodeId then + launch:ShowErrMsg("^1Error parsing '%s': 'Socket' element missing 'nodeId' attribute", dbFileName) + return true + end + if not child.attrib.itemId then + launch:ShowErrMsg("^1Error parsing '%s': 'Socket' element missing 'itemId' attribute", dbFileName) + return true + end + self.jewels[tonumber(child.attrib.nodeId)] = tonumber(child.attrib.itemId) + end + end end end end @@ -64,6 +82,13 @@ function PassiveSpecClass:Save(xml) elem = "URL", [1] = self:EncodeURL("https://www.pathofexile.com/passive-skill-tree/") }) + local sockets = { + elem = "Sockets" + } + for nodeId, itemId in pairs(self.jewels) do + t_insert(sockets, { elem = "Socket", attrib = { nodeId = tostring(nodeId), itemId = tostring(itemId) } }) + end + t_insert(xml, sockets) self.modFlag = false end diff --git a/Classes/PassiveSpecListControl.lua b/Classes/PassiveSpecListControl.lua new file mode 100644 index 000000000..9e80d5fa2 --- /dev/null +++ b/Classes/PassiveSpecListControl.lua @@ -0,0 +1,250 @@ +-- Path of Building +-- +-- Class: Passive Spec List +-- Passive spec list control. +-- +local launch, main = ... + +local t_insert = table.insert +local t_remove = table.remove +local m_min = math.min +local m_max = math.max +local m_floor = math.floor + +local PassiveSpecListClass = common.NewClass("PassiveSpecList", "Control", "ControlHost", function(self, anchor, x, y, width, height, treeTab) + self.Control(anchor, x, y, width, height) + self.ControlHost() + self.treeTab = treeTab + self.controls.scrollBar = common.New("ScrollBarControl", {"RIGHT",self,"RIGHT"}, -1, 0, 16, 0, 32) + self.controls.scrollBar.height = function() + local width, height = self:GetSize() + return height - 2 + end + self.controls.copy = common.New("ButtonControl", {"BOTTOMLEFT",self,"TOP"}, 2, -4, 60, 18, "Copy", function() + local prevSel = self.selSpec + self.selSpec = common.New("PassiveSpec", treeTab.build) + self.selSpec.title = prevSel.title + self.selSpec.jewels = copyTable(prevSel.jewels) + self.selSpec:DecodeURL(prevSel:EncodeURL()) + self:RenameSel(true) + end) + self.controls.copy.enabled = function() + return self.selSpec ~= nil + end + self.controls.delete = common.New("ButtonControl", {"LEFT",self.controls.copy,"RIGHT"}, 4, 0, 60, 18, "Delete", function() + self:OnKeyUp("DELETE") + end) + self.controls.delete.enabled = function() + return self.selSpec ~= nil and #treeTab.specList > 1 + end + self.controls.rename = common.New("ButtonControl", {"BOTTOMRIGHT",self,"TOP"}, -2, -4, 60, 18, "Rename", function() + self:RenameSel() + end) + self.controls.rename.enabled = function() + return self.selSpec ~= nil + end + self.controls.new = common.New("ButtonControl", {"RIGHT",self.controls.rename,"LEFT"}, -4, 0, 60, 18, "New", function() + self.selSpec = common.New("PassiveSpec", treeTab.build) + self:RenameSel(true) + end) +end) + +function PassiveSpecListClass:SelectIndex(index) + self.selSpec = self.treeTab.specList[index] + if self.selSpec then + self.selSpec = index + self.controls.scrollBar:ScrollIntoView((index - 2) * 16, 48) + end +end + +function PassiveSpecListClass:RenameSel(addOnName) + local popup + popup = main:OpenPopup(370, 100, self.selSpec.title and "Rename" or "Set Name", { + common.New("LabelControl", nil, 0, 20, 0, 16, "^7Enter name for this passive tree:"), + edit = common.New("EditControl", nil, 0, 40, 350, 20, self.selSpec.title, nil, nil, 100, function(buf) + popup.controls.save.enabled = buf:match("%S") + end), + save = common.New("ButtonControl", nil, -45, 70, 80, 20, "Save", function() + self.selSpec.title = popup.controls.edit.buf + self.treeTab.modFlag = true + if addOnName then + t_insert(self.treeTab.specList, self.selSpec) + self.selIndex = #self.treeTab.specList + end + main:ClosePopup() + end), + cancel = common.New("ButtonControl", nil, 45, 70, 80, 20, "Cancel", function() + if addOnName then + self.selSpec = nil + end + main:ClosePopup() + end), + }, "save", "edit", "cancel") + popup.controls.save.enabled = false +end + +function PassiveSpecListClass:IsMouseOver() + if not self:IsShown() then + return + end + return self:IsMouseInBounds() or self:GetMouseOverControl() +end + +function PassiveSpecListClass:Draw(viewPort) + local x, y = self:GetPos() + local width, height = self:GetSize() + local list = self.treeTab.specList + local scrollBar = self.controls.scrollBar + scrollBar:SetContentDimension(#list * 16, height - 4) + self.selDragIndex = nil + if self.selSpec and self.selDragging then + local cursorX, cursorY = GetCursorPos() + if not self.selDragActive and (cursorX-self.selCX)*(cursorX-self.selCX)+(cursorY-self.selCY)*(cursorY-self.selCY) > 100 then + self.selDragActive = true + end + if self.selDragActive then + if cursorX >= x + 2 and cursorY >= y + 2 and cursorX < x + width - 18 and cursorY < y + height - 2 then + local index = math.floor((cursorY - y - 2 + scrollBar.offset) / 16 + 0.5) + 1 + if index < self.selIndex or index > self.selIndex + 1 then + self.selDragIndex = m_min(index, #list + 1) + end + end + end + end + if self.hasFocus then + SetDrawColor(1, 1, 1) + else + SetDrawColor(0.5, 0.5, 0.5) + end + DrawImage(nil, x, y, width, height) + SetDrawColor(0, 0, 0) + DrawImage(nil, x + 1, y + 1, width - 2, height - 2) + self:DrawControls(viewPort) + SetViewport(x + 2, y + 2, width - 20, height - 4) + local ttSpec, ttY, ttWidth + local minIndex = m_floor(scrollBar.offset / 16 + 1) + local maxIndex = m_min(m_floor((scrollBar.offset + height) / 16 + 1), #list) + for index = minIndex, maxIndex do + local spec = list[index] + local lineY = 16 * (index - 1) - scrollBar.offset + local used = spec:CountAllocNodes() + local label = (spec.title or "Default") .. " (" .. (spec.curAscendClassName ~= "None" and spec.curAscendClassName or spec.curClassName) .. ", " .. used .. " points)" + local nameWidth = DrawStringWidth(16, "VAR", label) + if not scrollBar.dragging and not self.selDragActive then + local cursorX, cursorY = GetCursorPos() + local relX = cursorX - (x + 2) + local relY = cursorY - (y + 2) + if relX >= 0 and relX < width - 17 and relY >= 0 and relY >= lineY and relY < height - 2 and relY < lineY + 16 then + ttSpec = spec + ttWidth = m_max(nameWidth + 8, relX) + ttY = lineY + y + 2 + end + end + if spec == ttSpec or spec == self.selSpec then + if self.hasFocus then + SetDrawColor(1, 1, 1) + else + SetDrawColor(0.5, 0.5, 0.5) + end + DrawImage(nil, 0, lineY, width - 20, 16) + SetDrawColor(0.15, 0.15, 0.15) + DrawImage(nil, 0, lineY + 1, width - 20, 14) + end + SetDrawColor(1, 1, 1) + DrawString(0, lineY, "LEFT", 16, "VAR", label) + end + if self.selDragIndex then + local lineY = 16 * (self.selDragIndex - 1) - scrollBar.offset + SetDrawColor(1, 1, 1) + DrawImage(nil, 0, lineY - 1, width - 20, 3) + SetDrawColor(0, 0, 0) + DrawImage(nil, 0, lineY, width - 20, 1) + end + SetViewport() +end + +function PassiveSpecListClass:OnKeyDown(key, doubleClick) + if not self:IsShown() or not self:IsEnabled() then + return + end + local mOverControl = self:GetMouseOverControl() + if mOverControl and mOverControl.OnKeyDown then + return mOverControl:OnKeyDown(key) + end + if not self:IsMouseOver() and key:match("BUTTON") then + return + end + if key == "LEFTBUTTON" then + self.selSpec = nil + self.selIndex = nil + local x, y = self:GetPos() + local width, height = self:GetSize() + local cursorX, cursorY = GetCursorPos() + if cursorX >= x + 2 and cursorY >= y + 2 and cursorX < x + width - 18 and cursorY < y + height - 2 then + local index = math.floor((cursorY - y - 2 + self.controls.scrollBar.offset) / 16) + 1 + local selSpec = self.treeTab.specList[index] + if selSpec then + self.selSpec = selSpec + self.selIndex = index + end + end + if self.selSpec then + self.selCX = cursorX + self.selCY = cursorY + self.selDragging = true + self.selDragActive = false + end + elseif #self.treeTab.specList > 0 then + if key == "UP" then + self:SelectIndex(((self.selIndex or 1) - 2) % #self.treeTab.specList + 1) + elseif key == "DOWN" then + self:SelectIndex((self.selIndex or #self.treeTab.specList) % #self.treeTab.specList + 1) + elseif key == "HOME" then + self:SelectIndex(1) + elseif key == "END" then + self:SelectIndex(#self.treeTab.specList) + end + end + return self +end + +function PassiveSpecListClass:OnKeyUp(key) + if not self:IsShown() or not self:IsEnabled() then + return + end + if key == "WHEELDOWN" then + self.controls.scrollBar:Scroll(1) + elseif key == "WHEELUP" then + self.controls.scrollBar:Scroll(-1) + elseif self.selSpec then + if key == "BACK" or key == "DELETE" then + if #self.treeTab.specList > 1 then + main:OpenConfirmPopup("Delete Spec", "Are you sure you want to delete '"..(self.selSpec.title or "Default").."'?", "Delete", function() + t_remove(self.treeTab.specList, self.selIndex) + self.selSpec = nil + if self.selIndex == self.treeTab.activeSpec then + self.treeTab:SetActiveSpec(m_max(1, self.selIndex - 1)) + end + end) + end + elseif key == "F2" then + self:RenameSel() + elseif key == "LEFTBUTTON" then + self.selDragging = false + if self.selDragActive then + self.selDragActive = false + if self.selDragIndex and self.selDragIndex ~= self.selIndex then + local activeSpec = self.treeTab.specList[self.treeTab.activeSpec] + t_remove(self.treeTab.specList, self.selIndex) + if self.selDragIndex > self.selIndex then + self.selDragIndex = self.selDragIndex - 1 + end + t_insert(self.treeTab.specList, self.selDragIndex, self.selSpec) + self.selSpec = nil + self.treeTab.activeSpec = isValueInArray(self.treeTab.specList, activeSpec) + end + end + end + end + return self +end \ No newline at end of file diff --git a/Classes/PassiveTreeView.lua b/Classes/PassiveTreeView.lua index 45d628f9a..d082f9c40 100644 --- a/Classes/PassiveTreeView.lua +++ b/Classes/PassiveTreeView.lua @@ -600,7 +600,7 @@ function PassiveTreeViewClass:AddNodeTooltip(node, build) end local count = build:AddStatComparesToTooltip(calcBase, nodeOutput, node.alloc and "^7Unallocating this node will give you:" or "^7Allocating this node will give you:") if pathLength > 1 then - count = count + build:AddStatComparesToTooltip(calcBase, pathOutput, node.alloc and "^7Unallocating this node and all nodes depending on it will give you:" or "^7Allocating this node and all nodes leading to it will give you:") + count = count + build:AddStatComparesToTooltip(calcBase, pathOutput, node.alloc and "^7Unallocating this node and all nodes depending on it will give you:" or "^7Allocating this node and all nodes leading to it will give you:", pathLength) end if count == 0 then main:AddTooltipLine(14, string.format("^7No changes from %s this node%s.", node.alloc and "unallocating" or "allocating", pathLength > 1 and " or the nodes leading to it" or "")) diff --git a/Classes/PopupDialog.lua b/Classes/PopupDialog.lua index 377501c68..451036f16 100644 --- a/Classes/PopupDialog.lua +++ b/Classes/PopupDialog.lua @@ -7,7 +7,7 @@ local launch, main = ... local m_floor = math.floor -local PopupDialogClass = common.NewClass("PopupDialog", "ControlHost", "Control", function(self, width, height, title, controls, enterControl, defaultControl) +local PopupDialogClass = common.NewClass("PopupDialog", "ControlHost", "Control", function(self, width, height, title, controls, enterControl, defaultControl, escapeControl) self.ControlHost() self.Control(nil, 0, 0, width, height) self.x = function() @@ -19,6 +19,7 @@ local PopupDialogClass = common.NewClass("PopupDialog", "ControlHost", "Control" self.title = title self.controls = controls self.enterControl = enterControl + self.escapeControl = escapeControl for id, control in pairs(self.controls) do if not control.anchor.point then control:SetAnchor("TOP", self, "TOP") @@ -59,7 +60,11 @@ function PopupDialogClass:ProcessInput(inputEvents, viewPort) for id, event in ipairs(inputEvents) do if event.type == "KeyDown" then if event.key == "ESCAPE" then - main:ClosePopup() + if self.escapeControl then + self.controls[self.escapeControl]:Click() + else + main:ClosePopup() + end return elseif event.key == "RETURN" then if self.enterControl then diff --git a/Classes/SkillsTab.lua b/Classes/SkillsTab.lua index a12031476..5ba404d6f 100644 --- a/Classes/SkillsTab.lua +++ b/Classes/SkillsTab.lua @@ -36,7 +36,7 @@ local SkillsTabClass = common.NewClass("SkillsTab", "UndoHandler", "ControlHost" self.build.buildFlag = true end) self.controls.groupSlotLabel = common.New("LabelControl", {"TOPLEFT",self.anchorGroupDetail,"TOPLEFT"}, 0, 30, 0, 16, "^7Socketed in:") - self.controls.groupSlot = common.New("SlotSelectControl", {"TOPLEFT",self.anchorGroupDetail,"TOPLEFT"}, 85, 28, 110, 20, self.build, function(sel, selVal) + self.controls.groupSlot = common.New("DropDownControl", {"TOPLEFT",self.anchorGroupDetail,"TOPLEFT"}, 85, 28, 110, 20, { "None", "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring 1", "Ring 2" }, function(sel, selVal) if sel > 1 then self.displayGroup.slot = selVal else @@ -45,6 +45,21 @@ local SkillsTabClass = common.NewClass("SkillsTab", "UndoHandler", "ControlHost" self:AddUndoState() self.build.buildFlag = true end) + self.controls.groupSlot.tooltipFunc = function(mode, sel, selVal) + if mode == "OUT" or sel == 1 then + main:AddTooltipLine(16, "Select the item in which this skill is socketed.") + main:AddTooltipLine(16, "This will allow the skill to benefit from modifiers on the item that affect socketed gems.") + else + local slot = self.build.itemsTab.slots[selVal] + local ttItem = self.build.itemsTab.list[slot.selItemId] + if ttItem then + self.build.itemsTab:AddItemTooltip(ttItem, slot) + return data.colorCodes[ttItem.rarity], true + else + main:AddTooltipLine(16, "No item is equipped in this slot.") + end + end + end self.controls.groupSlot.enabled = function() return self.displayGroup.source == nil end @@ -275,6 +290,17 @@ function SkillsTabClass:CreateGemSlot(index) self:AddUndoState() self.build.buildFlag = true end) + slot.enabled.tooltipFunc = function() + if self.displayGroup.gemList[index] then + local calcFunc, calcBase = self.build.calcsTab:GetMiscCalculator(self.build) + if calcFunc then + self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled + local output = calcFunc() + self.displayGroup.gemList[index].enabled = not self.displayGroup.gemList[index].enabled + self.build:AddStatComparesToTooltip(calcBase, output, self.displayGroup.gemList[index].enabled and "^7Disabling this gem will give you:" or "^7Enabling this gem will give you:") + end + end + end self.controls["gemSlotEnable"..index] = slot.enabled -- Parser/calculator error message @@ -351,7 +377,7 @@ function SkillsTabClass:ProcessSocketGroup(socketGroup) -- Gem name has been specified, try to find the matching skill gem if data.gems[gem.nameSpec] then if data.gems[gem.nameSpec].unsupported then - gem.errMsg = gem.nameSpec.." is unsupported" + gem.errMsg = gem.nameSpec.." is not supported yet" gem.name = nil gem.data = nil else diff --git a/Classes/SlotSelectControl.lua b/Classes/SlotSelectControl.lua deleted file mode 100644 index 9bdf3d5ee..000000000 --- a/Classes/SlotSelectControl.lua +++ /dev/null @@ -1,43 +0,0 @@ --- Path of Building --- --- Class: Slot Select Control --- Slot selector control, extends the basic dropdown control. --- -local launch, main = ... - -local SlotSelectControlClass = common.NewClass("SlotSelectControl", "DropDownControl", function(self, anchor, x, y, width, height, build, selFunc) - self.DropDownControl(anchor, x, y, width, height, { "None", "Weapon 1", "Weapon 2", "Helmet", "Body Armour", "Gloves", "Boots", "Amulet", "Ring 1", "Ring 2" }, selFunc) - self.build = build -end) - -function SlotSelectControlClass:Draw(viewPort) - local x, y = self:GetPos() - local width, height = self:GetSize() - self.DropDownControl:Draw(viewPort) - if self:IsMouseOver() then - local ttSlot - if self.dropped then - if self.hoverSel and self.hoverSel > 1 then - ttSlot = self.list[self.hoverSel] - end - elseif self.sel > 1 then - ttSlot = self.list[self.sel] - end - SetDrawLayer(nil, 100) - if ttSlot then - local ttItem = self.build.itemsTab.list[self.build.itemsTab.slots[ttSlot].selItemId] - if ttItem then - self.build.itemsTab:AddItemTooltip(ttItem, self) - main:DrawTooltip(x, y, width, height, viewPort, data.colorCodes[ttItem.rarity], true) - else - main:AddTooltipLine(16, "No item is equipped in this slot.") - main:DrawTooltip(x, y, width, height, viewPort) - end - else - main:AddTooltipLine(16, "Select the item in which this skill is socketed.") - main:AddTooltipLine(16, "This will allow the skill to benefit from modifiers on the item that affect socketed gems.") - main:DrawTooltip(x, y, width, height, viewPort) - end - SetDrawLayer(nil, 0) - end -end \ No newline at end of file diff --git a/Classes/TreeTab.lua b/Classes/TreeTab.lua index 695a640c7..979f19fef 100644 --- a/Classes/TreeTab.lua +++ b/Classes/TreeTab.lua @@ -21,15 +21,33 @@ local TreeTabClass = common.NewClass("TreeTab", "ControlHost", function(self, bu self:SetActiveSpec(1) self.anchorControls = common.New("Control", nil, 0, 0, 0, 20) - --[[self.controls.specSelect = common.New("DropDownControl", {"LEFT",self.anchorControls,"RIGHT"}, 0, 0, 150, 20, nil, function(sel) + self.controls.specSelect = common.New("DropDownControl", {"LEFT",self.anchorControls,"RIGHT"}, 0, 0, 150, 20, nil, function(sel, selVal) if self.specList[sel] then + self.build.modFlag = true self:SetActiveSpec(sel) else self:OpenSpecManagePopup() end - end)]] - --self.controls.reset = common.New("ButtonControl", {"LEFT",self.controls.specSelect,"RIGHT"}, 8, 0, 60, 20, "Reset", function() - self.controls.reset = common.New("ButtonControl", {"LEFT",self.anchorControls,"RIGHT"}, 0, 0, 60, 20, "Reset", function() + end) + self.controls.specSelect.tooltipFunc = function(mode, sel, selVal) + if mode ~= "OUT" then + local spec = self.specList[sel] + if spec then + local used = spec:CountAllocNodes() + main:AddTooltipLine(16, "Class: "..spec.curClassName) + main:AddTooltipLine(16, "Ascendancy: "..spec.curAscendClassName) + main:AddTooltipLine(16, "Points used: "..used) + if sel ~= self.activeSpec then + local calcFunc, calcBase = self.build.calcsTab:GetMiscCalculator() + if calcFunc then + local output = calcFunc({ spec = spec }) + self.build:AddStatComparesToTooltip(calcBase, output, "^7Switching to this tree will give you:") + end + end + end + end + end + self.controls.reset = common.New("ButtonControl", {"LEFT",self.controls.specSelect,"RIGHT"}, 8, 0, 60, 20, "Reset", function() main:OpenConfirmPopup("Reset Tree", "Are you sure you want to reset your passive tree?", "Reset", function() self.build.spec:ResetNodes() self.build.spec:AddUndoState() @@ -73,12 +91,12 @@ function TreeTabClass:Draw(viewPort, inputEvents) local treeViewPort = { x = viewPort.x, y = viewPort.y, width = viewPort.width, height = viewPort.height - 32 } self.viewer:Draw(self.build, treeViewPort, inputEvents) - --[[self.controls.specSelect.sel = self.activeSpec + self.controls.specSelect.sel = self.activeSpec wipeTable(self.controls.specSelect.list) for id, spec in ipairs(self.specList) do t_insert(self.controls.specSelect.list, spec.title or "Default") end - t_insert(self.controls.specSelect.list, "Manage trees...")]] + t_insert(self.controls.specSelect.list, "Manage trees...") if not self.controls.treeSearch.hasFocus then self.controls.treeSearch:SetText(self.viewer.searchStr) end @@ -123,7 +141,15 @@ function TreeTabClass:Save(xml) xml.attrib = { activeSpec = tostring(self.activeSpec) } - for _, spec in ipairs(self.specList) do + for specId, spec in ipairs(self.specList) do + if specId == self.activeSpec then + -- Update this spec's jewels from the socket slots + for _, slot in pairs(self.build.itemsTab.slots) do + if slot.nodeId then + spec.jewels[slot.nodeId] = slot.selItemId + end + end + end local child = { elem = "Spec" } @@ -133,13 +159,35 @@ function TreeTabClass:Save(xml) end function TreeTabClass:SetActiveSpec(specId) + local prevSpec = self.build.spec self.activeSpec = m_min(specId, #self.specList) - self.build.spec = self.specList[self.activeSpec] + local curSpec = self.specList[self.activeSpec] + self.build.spec = curSpec self.build.buildFlag = true + for _, slot in pairs(self.build.itemsTab.slots) do + if slot.nodeId then + if prevSpec then + -- Update the previous spec's jewel for this slot + prevSpec.jewels[slot.nodeId] = slot.selItemId + end + if curSpec.jewels[slot.nodeId] then + -- Socket the jewel for the new spec + slot.selItemId = curSpec.jewels[slot.nodeId] + end + end + end + if self.build.itemsTab.orderList[1] then + -- Update item slots if items have been loaded already + self.build.itemsTab:PopulateSlots() + end end function TreeTabClass:OpenSpecManagePopup() - main:OpenPopup(500, 400, "Manage Passive Trees", { + main:OpenPopup(370, 290, "Manage Passive Trees", { + common.New("PassiveSpecList", nil, 0, 50, 350, 200, self), + common.New("ButtonControl", nil, 0, 260, 90, 20, "Done", function() + main:ClosePopup() + end), }) end diff --git a/Data/Bases/amulet.lua b/Data/Bases/amulet.lua index 9dff46ee8..24d35fe86 100644 --- a/Data/Bases/amulet.lua +++ b/Data/Bases/amulet.lua @@ -70,109 +70,136 @@ itemBases["Blue Pearl Amulet"] = { itemBases["Ashscale Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Fire Damage", } itemBases["Black Maw Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "Has 1 Socket", } itemBases["Bonespire Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased maximum Mana", } itemBases["Breakrib Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Physical Damage", } itemBases["Chrysalis Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Spell Damage", } itemBases["Deadhand Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(19 to 31)% increased Chaos Damage", } itemBases["Deep One Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Cold Damage", } itemBases["Lone Antler Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Lightning Damage", } itemBases["Mandible Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(6 to 10)% increased Attack and Cast Speed", } itemBases["Undying Flesh Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "+1 to maximum number of Zombies", } itemBases["Writhing Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(20 to 30)% increased Attack Damage", } itemBases["Avian Twins Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "", } itemBases["Clutching Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(15 to 25)% increased Global Defences", } itemBases["Fangjaw Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(8 to 12)% increased maximum Life", } itemBases["Hexclaw Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(40 to 50)% increased Global Critical Strike Chance", } itemBases["Horned Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(25 to 35)% chance of Projectiles Piercing", } itemBases["Primal Skull Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "2% of Life Regenerated per Second", } itemBases["Splitnewt Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(4 to 6)% chance to Freeze, Shock and Ignite", } itemBases["Wereclaw Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "+(16 to 24)% to Global Critical Strike Multiplier", } itemBases["Longtooth Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(4 to 6)% additional Physical Damage Reduction", } itemBases["Monkey Paw Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "", } itemBases["Monkey Twins Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(5 to 8)% increased Radius of Area Skills", } itemBases["Rotfeather Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(25 to 35)% increased Damage", } itemBases["Spinefuse Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(6 to 10)% increased Quantity of Items found", } itemBases["Three Hands Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "Gain (6 to 12)% of Physical Damage as Extra Damage of a random Element", } itemBases["Three Rat Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "(12 to 16)% increased Attributes", } itemBases["Greatwolf Talisman"] = { type = "Amulet", + subType = "Talisman", implicit = "", } \ No newline at end of file diff --git a/Data/Bases/body.lua b/Data/Bases/body.lua index e8bbebd6b..6e83bf8ae 100644 --- a/Data/Bases/body.lua +++ b/Data/Bases/body.lua @@ -3,87 +3,104 @@ local itemBases = ... itemBases["Plate Vest"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 14, movementPenalty = 3, }, req = { }, } itemBases["Chestplate"] = { type = "Body Armour", - armour = { armourBase = 49, }, - req = { level = 6, str = 25, movementPenalty = 5, }, + subType = "Armour", + armour = { armourBase = 49, movementPenalty = 5, }, + req = { level = 6, str = 25, }, } itemBases["Copper Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 126, movementPenalty = 5, }, req = { level = 17, str = 53, }, } itemBases["War Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 154, movementPenalty = 5, }, req = { level = 21, str = 63, }, } itemBases["Full Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 203, movementPenalty = 5, }, req = { level = 28, str = 81, }, } itemBases["Arena Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 231, movementPenalty = 5, }, req = { level = 32, str = 91, }, } itemBases["Lordly Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 252, movementPenalty = 5, }, req = { level = 35, str = 99, }, } itemBases["Bronze Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 266, movementPenalty = 5, }, req = { level = 37, str = 104, }, } itemBases["Battle Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 294, movementPenalty = 5, }, req = { level = 41, str = 114, }, } itemBases["Sun Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 322, movementPenalty = 5, }, req = { level = 45, str = 124, }, } itemBases["Colosseum Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 350, movementPenalty = 5, }, req = { level = 49, str = 134, }, } itemBases["Majestic Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 378, movementPenalty = 5, }, req = { level = 53, str = 144, }, } itemBases["Golden Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 399, movementPenalty = 5, }, req = { level = 56, str = 152, }, } itemBases["Crusader Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 428, movementPenalty = 5, }, req = { level = 59, str = 160, }, } itemBases["Astral Plate"] = { type = "Body Armour", + subType = "Armour", implicit = "+(8 to 12)% to all Elemental Resistances", armour = { armourBase = 507, movementPenalty = 5, }, req = { level = 62, str = 180, }, } itemBases["Gladiator Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 526, movementPenalty = 5, }, req = { level = 65, str = 177, }, } itemBases["Glorious Plate"] = { type = "Body Armour", + subType = "Armour", armour = { armourBase = 553, }, req = { level = 68, str = 191, }, } @@ -91,86 +108,103 @@ itemBases["Glorious Plate"] = { itemBases["Shabby Jerkin"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 21, movementPenalty = 3, }, req = { dex = 14, }, } itemBases["Strapped Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 70, movementPenalty = 3, }, req = { level = 9, dex = 32, }, } itemBases["Buckskin Tunic"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 126, movementPenalty = 3, }, req = { level = 17, dex = 53, }, } itemBases["Wild Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 182, movementPenalty = 3, }, req = { level = 25, dex = 73, }, } itemBases["Full Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 203, movementPenalty = 3, }, req = { level = 28, dex = 81, }, } itemBases["Sun Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 231, movementPenalty = 3, }, req = { level = 32, dex = 91, }, } itemBases["Thief's Garb"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 252, movementPenalty = 3, }, req = { level = 35, dex = 99, }, } itemBases["Eelskin Tunic"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 266, movementPenalty = 3, }, req = { level = 37, dex = 104, }, } itemBases["Frontier Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 294, movementPenalty = 3, }, req = { level = 41, dex = 114, }, } itemBases["Glorious Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 322, movementPenalty = 3, }, req = { level = 45, dex = 124, }, } itemBases["Coronal Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 350, movementPenalty = 3, }, req = { level = 49, dex = 134, }, } itemBases["Cutthroat's Garb"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 378, movementPenalty = 3, }, req = { level = 53, dex = 144, }, } itemBases["Sharkskin Tunic"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 399, movementPenalty = 3, }, req = { level = 56, dex = 152, }, } itemBases["Destiny Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 428, movementPenalty = 3, }, req = { level = 59, dex = 160, }, } itemBases["Exquisite Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 502, movementPenalty = 3, }, req = { level = 62, dex = 170, }, } itemBases["Zodiac Leather"] = { type = "Body Armour", + subType = "Evasion", armour = { evasionBase = 609, movementPenalty = 3, }, req = { level = 65, dex = 197, }, } itemBases["Assassin's Garb"] = { type = "Body Armour", + subType = "Evasion", implicit = "3% increased Movement Speed", armour = { evasionBase = 525, }, req = { level = 68, dex = 183, }, @@ -179,87 +213,104 @@ itemBases["Assassin's Garb"] = { itemBases["Simple Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 11, movementPenalty = 3, }, req = { int = 17, }, } itemBases["Silken Vest"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 27, movementPenalty = 3, }, req = { level = 11, int = 37, }, } itemBases["Scholar's Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 41, movementPenalty = 3, }, req = { level = 18, int = 55, }, } itemBases["Silken Garb"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 55, movementPenalty = 3, }, req = { level = 25, int = 73, }, } itemBases["Mage's Vestment"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 61, movementPenalty = 3, }, req = { level = 28, int = 81, }, } itemBases["Silk Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 69, movementPenalty = 3, }, req = { level = 32, int = 91, }, } itemBases["Cabalist Regalia"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 75, movementPenalty = 3, }, req = { level = 35, int = 99, }, } itemBases["Sage's Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 79, movementPenalty = 3, }, req = { level = 37, int = 104, }, } itemBases["Silken Wrap"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 87, movementPenalty = 3, }, req = { level = 41, int = 114, }, } itemBases["Conjurer's Vestment"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 95, movementPenalty = 3, }, req = { level = 45, int = 124, }, } itemBases["Spidersilk Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 103, movementPenalty = 3, }, req = { level = 49, int = 134, }, } itemBases["Destroyer Regalia"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 111, movementPenalty = 3, }, req = { level = 53, int = 144, }, } itemBases["Savant's Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 117, movementPenalty = 3, }, req = { level = 56, int = 152, }, } itemBases["Necromancer Silks"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 125, movementPenalty = 3, }, req = { level = 59, int = 160, }, } itemBases["Occultist's Vestment"] = { type = "Body Armour", + subType = "Energy Shield", implicit = "(3 to 10)% increased Spell Damage", armour = { energyShieldBase = 140, movementPenalty = 3, }, req = { level = 62, int = 180, }, } itemBases["Widowsilk Robe"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 161, movementPenalty = 3, }, req = { level = 65, int = 187, }, } itemBases["Vaal Regalia"] = { type = "Body Armour", + subType = "Energy Shield", armour = { energyShieldBase = 175, movementPenalty = 3, }, req = { level = 68, int = 194, }, } @@ -267,86 +318,103 @@ itemBases["Vaal Regalia"] = { itemBases["Scale Vest"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 19, evasionBase = 19, movementPenalty = 3, }, req = { }, } itemBases["Light Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 35, evasionBase = 35, movementPenalty = 3, }, req = { level = 8, str = 16, dex = 16, }, } itemBases["Scale Doublet"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 69, evasionBase = 69, movementPenalty = 3, }, req = { level = 17, str = 28, dex = 28, }, } itemBases["Infantry Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 85, evasionBase = 85, movementPenalty = 3, }, req = { level = 21, str = 34, dex = 34, }, } itemBases["Full Scale Armour"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 112, evasionBase = 112, movementPenalty = 3, }, req = { level = 28, str = 43, dex = 43, }, } itemBases["Soldier's Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 127, evasionBase = 127, movementPenalty = 3, }, req = { level = 32, str = 48, dex = 48, }, } itemBases["Field Lamellar"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 138, evasionBase = 138, movementPenalty = 3, }, req = { level = 35, str = 53, dex = 53, }, } itemBases["Wyrmscale Doublet"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 150, evasionBase = 150, movementPenalty = 3, }, req = { level = 38, str = 57, dex = 57, }, } itemBases["Hussar Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 165, evasionBase = 165, movementPenalty = 3, }, req = { level = 42, str = 62, dex = 62, }, } itemBases["Full Wyrmscale"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 181, evasionBase = 181, movementPenalty = 3, }, req = { level = 46, str = 68, dex = 68, }, } itemBases["Commander's Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 196, evasionBase = 196, movementPenalty = 3, }, req = { level = 50, str = 73, dex = 73, }, } itemBases["Battle Lamellar"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 212, evasionBase = 212, movementPenalty = 3, }, req = { level = 54, str = 79, dex = 79, }, } itemBases["Dragonscale Doublet"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 223, evasionBase = 223, movementPenalty = 3, }, req = { level = 57, str = 83, dex = 83, }, } itemBases["Desert Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 268, evasionBase = 268, movementPenalty = 3, }, req = { level = 60, str = 96, dex = 96, }, } itemBases["Full Dragonscale"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 335, evasionBase = 266, movementPenalty = 3, }, req = { level = 63, str = 115, dex = 94, }, } itemBases["General's Brigandine"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 296, evasionBase = 296, movementPenalty = 3, }, req = { level = 66, str = 103, dex = 103, }, } itemBases["Triumphant Lamellar"] = { type = "Body Armour", + subType = "Armour/Evasion", armour = { armourBase = 271, evasionBase = 340, movementPenalty = 3, }, req = { level = 69, str = 95, dex = 116, }, } @@ -354,86 +422,103 @@ itemBases["Triumphant Lamellar"] = { itemBases["Chainmail Vest"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 19, energyShieldBase = 7, movementPenalty = 5, }, req = { }, } itemBases["Chainmail Tunic"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 35, energyShieldBase = 11, movementPenalty = 5, }, req = { level = 8, str = 16, int = 16, }, } itemBases["Ringmail Coat"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 69, energyShieldBase = 21, movementPenalty = 5, }, req = { level = 17, str = 28, int = 28, }, } itemBases["Chainmail Doublet"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 85, energyShieldBase = 26, movementPenalty = 5, }, req = { level = 21, str = 34, int = 34, }, } itemBases["Full Ringmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 112, energyShieldBase = 33, movementPenalty = 5, }, req = { level = 28, str = 43, int = 43, }, } itemBases["Full Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 127, energyShieldBase = 38, movementPenalty = 5, }, req = { level = 32, str = 48, int = 48, }, } itemBases["Holy Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 138, energyShieldBase = 41, movementPenalty = 5, }, req = { level = 35, str = 53, int = 53, }, } itemBases["Latticed Ringmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 154, energyShieldBase = 46, movementPenalty = 5, }, req = { level = 39, str = 59, int = 59, }, } itemBases["Crusader Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 169, energyShieldBase = 50, movementPenalty = 5, }, req = { level = 43, str = 64, int = 64, }, } itemBases["Ornate Ringmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 185, energyShieldBase = 54, movementPenalty = 5, }, req = { level = 47, str = 69, int = 69, }, } itemBases["Chain Hauberk"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 200, energyShieldBase = 59, movementPenalty = 5, }, req = { level = 51, str = 75, int = 75, }, } itemBases["Devout Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 215, energyShieldBase = 63, movementPenalty = 5, }, req = { level = 55, str = 80, int = 80, }, } itemBases["Loricated Ringmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 232, energyShieldBase = 68, movementPenalty = 5, }, req = { level = 58, str = 84, int = 84, }, } itemBases["Conquest Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 276, energyShieldBase = 81, movementPenalty = 5, }, req = { level = 61, str = 96, int = 96, }, } itemBases["Elegant Ringmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 269, energyShieldBase = 94, movementPenalty = 5, }, req = { level = 64, str = 90, int = 105, }, } itemBases["Saint's Hauberk"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 315, energyShieldBase = 78, movementPenalty = 5, }, req = { level = 67, str = 109, int = 94, }, } itemBases["Saintly Chainmail"] = { type = "Body Armour", + subType = "Armour/Energy Shield", armour = { armourBase = 286, energyShieldBase = 98, movementPenalty = 5, }, req = { level = 70, str = 99, int = 115, }, } @@ -441,86 +526,103 @@ itemBases["Saintly Chainmail"] = { itemBases["Padded Vest"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 19, energyShieldBase = 7, movementPenalty = 3, }, req = { }, } itemBases["Oiled Vest"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 38, energyShieldBase = 13, movementPenalty = 3, }, req = { level = 9, dex = 17, int = 17, }, } itemBases["Padded Jacket"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 73, energyShieldBase = 22, movementPenalty = 3, }, req = { level = 18, dex = 30, int = 30, }, } itemBases["Oiled Coat"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 88, energyShieldBase = 27, movementPenalty = 3, }, req = { level = 22, dex = 35, int = 35, }, } itemBases["Scarlet Raiment"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 112, energyShieldBase = 33, movementPenalty = 3, }, req = { level = 28, dex = 43, int = 43, }, } itemBases["Waxed Garb"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 127, energyShieldBase = 38, movementPenalty = 3, }, req = { level = 32, dex = 48, int = 48, }, } itemBases["Bone Armour"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 138, energyShieldBase = 41, movementPenalty = 3, }, req = { level = 35, dex = 53, int = 53, }, } itemBases["Quilted Jacket"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 158, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 40, dex = 60, int = 60, }, } itemBases["Sleek Coat"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 173, energyShieldBase = 51, movementPenalty = 3, }, req = { level = 44, dex = 65, int = 65, }, } itemBases["Crimson Raiment"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 189, energyShieldBase = 55, movementPenalty = 3, }, req = { level = 48, dex = 71, int = 71, }, } itemBases["Lacquered Garb"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 204, energyShieldBase = 60, movementPenalty = 3, }, req = { level = 52, dex = 76, int = 76, }, } itemBases["Crypt Armour"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 219, energyShieldBase = 64, movementPenalty = 3, }, req = { level = 56, dex = 82, int = 82, }, } itemBases["Sentinel Jacket"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 235, energyShieldBase = 69, movementPenalty = 3, }, req = { level = 59, dex = 86, int = 86, }, } itemBases["Varnished Coat"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 276, energyShieldBase = 81, movementPenalty = 3, }, req = { level = 62, dex = 96, int = 96, }, } itemBases["Blood Raiment"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 311, energyShieldBase = 75, movementPenalty = 3, }, req = { level = 65, dex = 107, int = 90, }, } itemBases["Sadist Garb"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", armour = { evasionBase = 304, energyShieldBase = 95, movementPenalty = 3, }, req = { level = 68, dex = 103, int = 109, }, } itemBases["Carnal Armour"] = { type = "Body Armour", + subType = "Evasion/Energy Shield", implicit = "+(20 to 25) to maximum Mana", armour = { evasionBase = 251, energyShieldBase = 105, movementPenalty = 3, }, req = { level = 71, dex = 88, int = 122, }, @@ -529,6 +631,7 @@ itemBases["Carnal Armour"] = { itemBases["Sacrificial Garb"] = { type = "Body Armour", + subType = "Armour/Evasion/Energy Shield", armour = { armourBase = 234, evasionBase = 234, energyShieldBase = 69, movementPenalty = 3 }, req = { level = 72, str = 66, dex = 66, int = 66, }, } diff --git a/Data/Bases/boots.lua b/Data/Bases/boots.lua index d01874259..dc8c5a746 100644 --- a/Data/Bases/boots.lua +++ b/Data/Bases/boots.lua @@ -3,46 +3,55 @@ local itemBases = ... itemBases["Iron Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 6, }, req = { }, } itemBases["Steel Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 28, }, req = { level = 9, str = 21, }, } itemBases["Plated Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 67, }, req = { level = 23, str = 44, }, } itemBases["Reinforced Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 95, }, req = { level = 33, str = 60, }, } itemBases["Antique Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 106, }, req = { level = 37, str = 67, }, } itemBases["Ancient Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 132, }, req = { level = 46, str = 82, }, } itemBases["Goliath Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 154, }, req = { level = 54, str = 95, }, } itemBases["Vaal Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 191, }, req = { level = 62, str = 117, }, } itemBases["Titan Greaves"] = { type = "Boots", + subType = "Armour", armour = { armourBase = 210, }, req = { level = 68, str = 120, }, } @@ -50,46 +59,55 @@ itemBases["Titan Greaves"] = { itemBases["Rawhide Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 11, }, req = { }, } itemBases["Goathide Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 36, }, req = { level = 12, dex = 26, }, } itemBases["Deerskin Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 64, }, req = { level = 22, dex = 42, }, } itemBases["Nubuck Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 98, }, req = { level = 34, dex = 62, }, } itemBases["Eelskin Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 112, }, req = { level = 39, dex = 70, }, } itemBases["Sharkskin Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 126, }, req = { level = 44, dex = 79, }, } itemBases["Shagreen Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 157, }, req = { level = 55, dex = 97, }, } itemBases["Stealth Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 191, }, req = { level = 62, dex = 117, }, } itemBases["Slink Boots"] = { type = "Boots", + subType = "Evasion", armour = { evasionBase = 214, }, req = { level = 69, dex = 120, }, } @@ -97,46 +115,55 @@ itemBases["Slink Boots"] = { itemBases["Wool Shoes"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 4, }, req = { }, } itemBases["Velvet Slippers"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 9, }, req = { level = 9, int = 21, }, } itemBases["Silk Slippers"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 20, }, req = { level = 22, int = 42, }, } itemBases["Scholar Boots"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 28, }, req = { level = 32, int = 59, }, } itemBases["Satin Slippers"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 32, }, req = { level = 38, int = 69, }, } itemBases["Samite Slippers"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 37, }, req = { level = 44, int = 79, }, } itemBases["Conjurer Boots"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 44, }, req = { level = 53, int = 94, }, } itemBases["Arcanist Slippers"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 59, }, req = { level = 61, int = 119, }, } itemBases["Sorcerer Boots"] = { type = "Boots", + subType = "Energy Shield", armour = { energyShieldBase = 64, }, req = { level = 67, int = 123, }, } @@ -144,41 +171,49 @@ itemBases["Sorcerer Boots"] = { itemBases["Leatherscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 11, evasionBase = 11, }, req = { level = 6, }, } itemBases["Ironscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 29, evasionBase = 29, }, req = { level = 18, str = 19, dex = 19, }, } itemBases["Bronzescale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 48, evasionBase = 48, }, req = { level = 30, str = 30, dex = 30, }, } itemBases["Steelscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 57, evasionBase = 57, }, req = { level = 36, str = 35, dex = 35, }, } itemBases["Serpentscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 66, evasionBase = 66, }, req = { level = 42, str = 40, dex = 40, }, } itemBases["Wyrmscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 80, evasionBase = 80, }, req = { level = 51, str = 48, dex = 48, }, } itemBases["Hydrascale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 92, evasionBase = 92, }, req = { level = 59, str = 56, dex = 56, }, } itemBases["Dragonscale Boots"] = { type = "Boots", + subType = "Armour/Evasion", armour = { armourBase = 105, evasionBase = 105, }, req = { level = 65, str = 62, dex = 62, }, } @@ -186,46 +221,55 @@ itemBases["Dragonscale Boots"] = { itemBases["Chain Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 9, energyShieldBase = 3, }, req = { level = 5, }, } itemBases["Ringmail Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 22, energyShieldBase = 7, }, req = { level = 13, str = 15, int = 15, }, } itemBases["Mesh Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 45, energyShieldBase = 13, }, req = { level = 28, str = 28, int = 28, }, } itemBases["Riveted Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 57, energyShieldBase = 17, }, req = { level = 36, str = 35, int = 35, }, } itemBases["Zealot Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 63, energyShieldBase = 19, }, req = { level = 40, str = 38, int = 38, }, } itemBases["Soldier Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 77, energyShieldBase = 23, }, req = { level = 49, str = 47, int = 47, }, } itemBases["Legion Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 91, energyShieldBase = 27, }, req = { level = 58, str = 54, int = 54, }, } itemBases["Crusader Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", armour = { armourBase = 105, energyShieldBase = 31, }, req = { level = 64, str = 62, int = 62, }, } itemBases["Two-Toned Boots"] = { type = "Boots", + subType = "Armour/Energy Shield", implicit = "", armour = { armourBase = 109, energyShieldBase = 32 }, req = { level = 72, str = 62, int = 62 }, @@ -234,46 +278,55 @@ itemBases["Two-Toned Boots"] = { itemBases["Wrapped Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 11, energyShieldBase = 4, }, req = { level = 6, }, } itemBases["Strapped Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 26, energyShieldBase = 8, }, req = { level = 16, dex = 18, int = 18, }, } itemBases["Clasped Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 43, energyShieldBase = 13, }, req = { level = 27, dex = 27, int = 27, }, } itemBases["Shackled Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 54, energyShieldBase = 16, }, req = { level = 34, dex = 34, int = 34, }, } itemBases["Trapper Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 65, energyShieldBase = 19, }, req = { level = 41, dex = 40, int = 40, }, } itemBases["Ambush Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 74, energyShieldBase = 22, }, req = { level = 47, dex = 45, int = 45, }, } itemBases["Carnal Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 86, energyShieldBase = 25, }, req = { level = 55, dex = 52, int = 52, }, } itemBases["Assassin's Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 105, energyShieldBase = 31, }, req = { level = 63, dex = 62, int = 62, }, } itemBases["Murder Boots"] = { type = "Boots", + subType = "Evasion/Energy Shield", armour = { evasionBase = 161, energyShieldBase = 22, }, req = { level = 69, dex = 82, int = 42, }, } diff --git a/Data/Bases/flask.lua b/Data/Bases/flask.lua index d88b49e98..c1f47dda2 100644 --- a/Data/Bases/flask.lua +++ b/Data/Bases/flask.lua @@ -3,61 +3,73 @@ local itemBases = ... itemBases["Small Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 70, duration = 6, chargesUsed = 7, chargesMax = 21, }, req = { level = 1, }, } itemBases["Medium Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 150, duration = 6.5, chargesUsed = 8, chargesMax = 28, }, req = { level = 3, }, } itemBases["Large Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 250, duration = 7, chargesUsed = 9, chargesMax = 30, }, req = { level = 6, }, } itemBases["Greater Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 360, duration = 7, chargesUsed = 10, chargesMax = 32, }, req = { level = 12, }, } itemBases["Grand Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 640, duration = 6, chargesUsed = 10, chargesMax = 25, }, req = { level = 18, }, } itemBases["Giant Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 830, duration = 8, chargesUsed = 10, chargesMax = 30, }, req = { level = 24, }, } itemBases["Colossal Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 1000, duration = 7, chargesUsed = 10, chargesMax = 32, }, req = { level = 30, }, } itemBases["Sacred Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 1200, duration = 6, chargesUsed = 10, chargesMax = 25, }, req = { level = 36, }, } itemBases["Hallowed Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 1990, duration = 8, chargesUsed = 10, chargesMax = 30, }, req = { level = 42, }, } itemBases["Sanctified Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 1460, duration = 3, chargesUsed = 15, chargesMax = 30, }, req = { level = 50, }, } itemBases["Divine Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 2400, duration = 7, chargesUsed = 15, chargesMax = 45, }, req = { level = 60, }, } itemBases["Eternal Life Flask"] = { type = "Flask", + subType = "Life", flask = { life = 2080, duration = 4, chargesUsed = 15, chargesMax = 45, }, req = { level = 65, }, } @@ -65,61 +77,73 @@ itemBases["Eternal Life Flask"] = { itemBases["Small Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 60, duration = 5, chargesUsed = 10, chargesMax = 30, }, req = { level = 1, }, } itemBases["Medium Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 90, duration = 6, chargesUsed = 12, chargesMax = 36, }, req = { level = 3, }, } itemBases["Large Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 110, duration = 7, chargesUsed = 10, chargesMax = 35, }, req = { level = 6, }, } itemBases["Greater Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 140, duration = 5.6, chargesUsed = 12, chargesMax = 32, }, req = { level = 12, }, } itemBases["Grand Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 210, duration = 10, chargesUsed = 8, chargesMax = 30, }, req = { level = 18, }, } itemBases["Giant Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 340, duration = 7, chargesUsed = 10, chargesMax = 40, }, req = { level = 24, }, } itemBases["Colossal Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 200, duration = 5.6, chargesUsed = 5, chargesMax = 25, }, req = { level = 30, }, } itemBases["Sacred Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 660, duration = 9, chargesUsed = 10, chargesMax = 40, }, req = { level = 36, }, } itemBases["Hallowed Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 290, duration = 7, chargesUsed = 4, chargesMax = 20, }, req = { level = 42, }, } itemBases["Sanctified Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 1050, duration = 14, chargesUsed = 10, chargesMax = 40, }, req = { level = 50, }, } itemBases["Divine Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 400, duration = 5, chargesUsed = 5, chargesMax = 30, }, req = { level = 60, }, } itemBases["Eternal Mana Flask"] = { type = "Flask", + subType = "Mana", flask = { mana = 960, duration = 10, chargesUsed = 8, chargesMax = 40, }, req = { level = 65, }, } @@ -127,31 +151,37 @@ itemBases["Eternal Mana Flask"] = { itemBases["Small Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 100, mana = 70, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 10, }, } itemBases["Medium Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 230, mana = 100, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 20, }, } itemBases["Large Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 510, mana = 140, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 30, }, } itemBases["Colossal Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 690, mana = 200, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 40, }, } itemBases["Sacred Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 1440, mana = 400, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 50, }, } itemBases["Hallowed Hybrid Flask"] = { type = "Flask", + subType = "Hybrid", flask = { life = 1740, mana = 480, duration = 5, chargesUsed = 20, chargesMax = 40, }, req = { level = 60, }, } @@ -159,76 +189,94 @@ itemBases["Hallowed Hybrid Flask"] = { itemBases["Quicksilver Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 20, chargesMax = 50, buff = { "40% increased Movement Speed" }, }, req = { level = 1, }, } itemBases["Bismuth Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 5, chargesUsed = 20, chargesMax = 50, buff = { "+35% to all Elemental Resistances" }, }, req = { level = 8, }, } itemBases["Stibnite Flask"] = { type = "Flask", + subType = "Utility", + implicit = "Creates a Smoke Cloud on Use", flask = { duration = 5, chargesUsed = 10, chargesMax = 30, buff = { "100% increased Evasion Rating" }, }, req = { level = 14, }, } itemBases["Amethyst Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 3.5, chargesUsed = 30, chargesMax = 60, buff = { "+35% to Chaos Resistance" }, }, req = { level = 18, }, } itemBases["Ruby Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+6% to maximum Fire Resistance", "+50% to Fire Resistance" }, }, req = { level = 18, }, } itemBases["Sapphire Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+6% to maximum Cold Resistance", "+50% to Cold Resistance" }, }, req = { level = 18, }, } itemBases["Topaz Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+6% to maximum Lightning Resistance", "+50% to Lightning Resistance" }, }, req = { level = 18, }, } itemBases["Silver Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 5, chargesUsed = 40, chargesMax = 60, buff = { "Onslaught" }, }, req = { level = 22, }, } itemBases["Aquamarine Flask"] = { type = "Flask", + subType = "Utility", + implicit = "Creates Chilled Ground on Use", flask = { duration = 5, chargesUsed = 15, chargesMax = 40, buff = { "20% chance to Avoid Cold Damage when Hit" }, }, req = { level = 27, }, } itemBases["Diamond Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 20, chargesMax = 40, buff = { "Your Critical Strike Chance is Lucky" }, }, req = { level = 27, }, } itemBases["Granite Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+3000 to Armour" }, }, req = { level = 27, }, } itemBases["Jade Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+3000 to Evasion Rating" }, }, req = { level = 27, }, } itemBases["Quartz Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "10% chance to Dodge Attacks", "10% chance to Dodge Spell Damage", "Phasing" }, }, req = { level = 27, }, } itemBases["Sulphur Flask"] = { type = "Flask", + subType = "Utility", + implicit = "Creates Consecrated Ground on Use", flask = { duration = 4, chargesUsed = 20, chargesMax = 60, buff = { "40% increased Damage" }, }, req = { level = 35, }, } itemBases["Basalt Flask"] = { type = "Flask", + subType = "Utility", flask = { duration = 5, chargesUsed = 40, chargesMax = 60, buff = { "20% additional Physical Damage Reduction", "20% of Melee Physical Damage taken reflected to Attacker" }, }, req = { level = 40, }, } diff --git a/Data/Bases/gloves.lua b/Data/Bases/gloves.lua index b1a76ef5e..f38376996 100644 --- a/Data/Bases/gloves.lua +++ b/Data/Bases/gloves.lua @@ -3,51 +3,61 @@ local itemBases = ... itemBases["Iron Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 6, }, req = { }, } itemBases["Plated Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 34, }, req = { level = 11, str = 20, }, } itemBases["Bronze Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 67, }, req = { level = 23, str = 36, }, } itemBases["Steel Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 101, }, req = { level = 35, str = 52, }, } itemBases["Antique Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 112, }, req = { level = 39, str = 58, }, } itemBases["Ancient Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 134, }, req = { level = 47, str = 68, }, } itemBases["Goliath Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 151, }, req = { level = 53, str = 76, }, } itemBases["Vaal Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 201, }, req = { level = 63, str = 100, }, } itemBases["Titan Gauntlets"] = { type = "Gloves", + subType = "Armour", armour = { armourBase = 210, }, req = { level = 69, str = 98, }, } itemBases["Spiked Gloves"] = { type = "Gloves", + subType = "Armour", implicit = "(16-20)% increased Melee Damage", armour = { armourBase = 191 }, req = { level = 73, str = 95 }, @@ -56,51 +66,61 @@ itemBases["Spiked Gloves"] = { itemBases["Rawhide Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 11, }, req = { }, } itemBases["Goathide Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 28, }, req = { level = 9, dex = 17, }, } itemBases["Deerskin Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 62, }, req = { level = 21, dex = 33, }, } itemBases["Nubuck Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 95, }, req = { level = 33, dex = 50, }, } itemBases["Eelskin Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 109, }, req = { level = 38, dex = 56, }, } itemBases["Sharkskin Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 129, }, req = { level = 45, dex = 66, }, } itemBases["Shagreen Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 154, }, req = { level = 54, dex = 78, }, } itemBases["Stealth Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 200, }, req = { level = 62, dex = 97, }, } itemBases["Slink Gloves"] = { type = "Gloves", + subType = "Evasion", armour = { evasionBase = 210, }, req = { level = 70, dex = 95, }, } itemBases["Gripped Gloves"] = { type = "Gloves", + subType = "Evasion", implicit = "(14-18)% increased Projectile Attack Damage", armour = { evasionBase = 191 }, req = { level = 73, dex = 95 }, @@ -109,51 +129,61 @@ itemBases["Gripped Gloves"] = { itemBases["Wool Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 4, }, req = { }, } itemBases["Velvet Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 12, }, req = { level = 12, int = 21, }, } itemBases["Silk Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 22, }, req = { level = 25, int = 39, }, } itemBases["Embroidered Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 31, }, req = { level = 36, int = 54, }, } itemBases["Satin Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 35, }, req = { level = 41, int = 60, }, } itemBases["Samite Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 40, }, req = { level = 47, int = 68, }, } itemBases["Conjurer Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 46, }, req = { level = 55, int = 79, }, } itemBases["Arcanist Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 56, }, req = { level = 60, int = 95, }, } itemBases["Sorcerer Gloves"] = { type = "Gloves", + subType = "Energy Shield", armour = { energyShieldBase = 61, }, req = { level = 69, int = 97, }, } itemBases["Fingerless Silk Gloves"] = { type = "Gloves", + subType = "Energy Shield", implicit = "(12-16)% increased Spell Damage", armour = { energyShieldBase = 56 }, req = { level = 73, int = 95 }, @@ -162,41 +192,49 @@ itemBases["Fingerless Silk Gloves"] = { itemBases["Fishscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 8, evasionBase = 8, }, req = { }, } itemBases["Ironscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 25, evasionBase = 25, }, req = { level = 15, }, } itemBases["Bronzescale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 43, evasionBase = 43, }, req = { level = 27, str = 22, dex = 22, }, } itemBases["Steelscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 57, evasionBase = 57, }, req = { level = 36, str = 29, dex = 29, }, } itemBases["Serpentscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 68, evasionBase = 68, }, req = { level = 43, str = 34, dex = 34, }, } itemBases["Wyrmscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 77, evasionBase = 77, }, req = { level = 49, str = 38, dex = 38, }, } itemBases["Hydrascale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 92, evasionBase = 92, }, req = { level = 59, str = 45, dex = 45, }, } itemBases["Dragonscale Gauntlets"] = { type = "Gloves", + subType = "Armour/Evasion", armour = { armourBase = 105, evasionBase = 105, }, req = { level = 67, str = 51, dex = 51, }, } @@ -204,41 +242,49 @@ itemBases["Dragonscale Gauntlets"] = { itemBases["Chain Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 12, energyShieldBase = 4, }, req = { level = 7, }, } itemBases["Ringmail Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 31, energyShieldBase = 9, }, req = { level = 19, str = 16, int = 16, }, } itemBases["Mesh Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 51, energyShieldBase = 15, }, req = { level = 32, str = 26, int = 26, }, } itemBases["Riveted Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 58, energyShieldBase = 17, }, req = { level = 37, str = 29, int = 29, }, } itemBases["Zealot Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 68, energyShieldBase = 20, }, req = { level = 43, str = 34, int = 34, }, } itemBases["Soldier Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 80, energyShieldBase = 24, }, req = { level = 51, str = 40, int = 40, }, } itemBases["Legion Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 89, energyShieldBase = 26, }, req = { level = 57, str = 44, int = 44, }, } itemBases["Crusader Gloves"] = { type = "Gloves", + subType = "Armour/Energy Shield", armour = { armourBase = 105, energyShieldBase = 31, }, req = { level = 66, str = 51, int = 51, }, } @@ -246,41 +292,49 @@ itemBases["Crusader Gloves"] = { itemBases["Wrapped Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 9, energyShieldBase = 3, }, req = { level = 5, }, } itemBases["Strapped Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 26, energyShieldBase = 8, }, req = { level = 16, dex = 14, int = 14, }, } itemBases["Clasped Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 49, energyShieldBase = 15, }, req = { level = 31, dex = 25, int = 25, }, } itemBases["Trapper Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 57, energyShieldBase = 17, }, req = { level = 36, dex = 29, int = 29, }, } itemBases["Ambush Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 71, energyShieldBase = 21, }, req = { level = 45, dex = 35, int = 35, }, } itemBases["Carnal Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 78, energyShieldBase = 23, }, req = { level = 50, dex = 39, int = 39, }, } itemBases["Assassin's Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 91, energyShieldBase = 27, }, req = { level = 58, dex = 45, int = 45, }, } itemBases["Murder Mitts"] = { type = "Gloves", + subType = "Evasion/Energy Shield", armour = { evasionBase = 105, energyShieldBase = 31, }, req = { level = 67, dex = 51, int = 51, }, -} +} \ No newline at end of file diff --git a/Data/Bases/helmet.lua b/Data/Bases/helmet.lua index 067db0cd1..4519ff188 100644 --- a/Data/Bases/helmet.lua +++ b/Data/Bases/helmet.lua @@ -3,56 +3,67 @@ local itemBases = ... itemBases["Iron Hat"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 8, }, req = { }, } itemBases["Cone Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 33, }, req = { level = 7, str = 21, }, } itemBases["Barbute Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 80, }, req = { level = 18, str = 42, }, } itemBases["Close Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 113, }, req = { level = 26, str = 58, }, } itemBases["Gladiator Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 151, }, req = { level = 35, str = 75, }, } itemBases["Reaver Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 172, }, req = { level = 40, str = 85, }, } itemBases["Siege Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 206, }, req = { level = 48, str = 101, }, } itemBases["Samite Helmet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 240, }, req = { level = 55, str = 114, }, } itemBases["Ezomyte Burgonet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 301, }, req = { level = 60, str = 138, }, } itemBases["Royal Burgonet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 328, }, req = { level = 65, str = 148, }, } itemBases["Eternal Burgonet"] = { type = "Helmet", + subType = "Armour", armour = { armourBase = 324, }, req = { level = 69, str = 138, }, } @@ -60,51 +71,61 @@ itemBases["Eternal Burgonet"] = { itemBases["Leather Cap"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 17, }, req = { }, } itemBases["Tricorne"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 46, }, req = { level = 10, dex = 27, }, } itemBases["Leather Hood"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 88, }, req = { level = 20, dex = 46, }, } itemBases["Wolf Pelt"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 130, }, req = { level = 30, dex = 66, }, } itemBases["Hunter Hood"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 176, }, req = { level = 41, dex = 87, }, } itemBases["Noble Tricorne"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 201, }, req = { level = 47, dex = 99, }, } itemBases["Ursine Pelt"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 240, }, req = { level = 55, dex = 114, }, } itemBases["Silken Hood"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 301, }, req = { level = 60, dex = 138, }, } itemBases["Sinner Tricorne"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 321, }, req = { level = 64, dex = 138, }, } itemBases["Lion Pelt"] = { type = "Helmet", + subType = "Evasion", armour = { evasionBase = 331, }, req = { level = 70, dex = 150, }, } @@ -112,56 +133,67 @@ itemBases["Lion Pelt"] = { itemBases["Vine Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 7, }, req = { }, } itemBases["Iron Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 13, }, req = { level = 8, int = 23, }, } itemBases["Torture Cage"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 23, }, req = { level = 17, int = 40, }, } itemBases["Tribal Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 34, }, req = { level = 26, int = 58, }, } itemBases["Bone Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 44, }, req = { level = 34, int = 73, }, } itemBases["Lunaris Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 50, }, req = { level = 39, int = 83, }, } itemBases["Steel Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 61, }, req = { level = 48, int = 101, }, } itemBases["Necromancer Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 68, }, req = { level = 54, int = 112, }, } itemBases["Solaris Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 75, }, req = { level = 59, int = 122, }, } itemBases["Mind Cage"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 91, }, req = { level = 65, int = 138, }, } itemBases["Hubris Circlet"] = { type = "Helmet", + subType = "Energy Shield", armour = { energyShieldBase = 100, }, req = { level = 69, int = 154, }, } @@ -169,51 +201,61 @@ itemBases["Hubris Circlet"] = { itemBases["Battered Helm"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 11, evasionBase = 11, }, req = { }, } itemBases["Sallet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 32, evasionBase = 32, }, req = { level = 13, str = 18, dex = 18, }, } itemBases["Visored Sallet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 55, evasionBase = 55, }, req = { level = 23, str = 28, dex = 28, }, } itemBases["Gilded Sallet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 78, evasionBase = 78, }, req = { level = 33, str = 38, dex = 38, }, } itemBases["Secutor Helm"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 85, evasionBase = 85, }, req = { level = 36, str = 42, dex = 42, }, } itemBases["Fencer Helm"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 102, evasionBase = 102, }, req = { level = 43, str = 49, dex = 49, }, } itemBases["Lacquered Helmet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 120, evasionBase = 120, }, req = { level = 51, str = 57, dex = 57, }, } itemBases["Fluted Bascinet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 139, evasionBase = 139, }, req = { level = 58, str = 64, dex = 64, }, } itemBases["Pig-Faced Bascinet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 199, evasionBase = 139, }, req = { level = 63, str = 85, dex = 62, }, } itemBases["Nightmare Bascinet"] = { type = "Helmet", + subType = "Armour/Evasion", armour = { armourBase = 141, evasionBase = 203, }, req = { level = 67, str = 62, dex = 85, }, } @@ -221,56 +263,67 @@ itemBases["Nightmare Bascinet"] = { itemBases["Rusted Coif"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 14, energyShieldBase = 5, }, req = { level = 5, }, } itemBases["Soldier Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 30, energyShieldBase = 10, }, req = { level = 12, str = 16, int = 16, }, } itemBases["Great Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 53, energyShieldBase = 16, }, req = { level = 22, str = 27, int = 27, }, } itemBases["Crusader Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 74, energyShieldBase = 22, }, req = { level = 31, str = 36, int = 36, }, } itemBases["Aventail Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 88, energyShieldBase = 26, }, req = { level = 37, str = 42, int = 42, }, } itemBases["Zealot Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 104, energyShieldBase = 31, }, req = { level = 44, str = 50, int = 50, }, } itemBases["Great Crown"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 125, energyShieldBase = 37, }, req = { level = 53, str = 59, int = 59, }, } itemBases["Magistrate Crown"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 139, energyShieldBase = 41, }, req = { level = 58, str = 64, int = 64, }, } itemBases["Prophet Crown"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 195, energyShieldBase = 40, }, req = { level = 63, str = 85, int = 62, }, } itemBases["Praetor Crown"] = { type = "Helmet", + subType = "Armour/Energy Shield", armour = { armourBase = 140, energyShieldBase = 63, }, req = { level = 68, str = 62, int = 91, }, } itemBases["Bone Helmet"] = { type = "Helmet", + subType = "Armour/Energy Shield", implicit = "Minions deal (30-40)% increased Damage", armour = { armourBase = 172, energyShieldBase = 50, }, req = { level = 75, str = 76, int = 76, }, @@ -279,56 +332,67 @@ itemBases["Bone Helmet"] = { itemBases["Scare Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 11, energyShieldBase = 4, }, req = { }, } itemBases["Plague Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 25, energyShieldBase = 8, }, req = { level = 10, dex = 14, int = 14, }, } itemBases["Iron Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 41, energyShieldBase = 13, }, req = { level = 17, dex = 21, int = 21, }, } itemBases["Festival Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 67, energyShieldBase = 20, }, req = { level = 28, dex = 33, int = 33, }, } itemBases["Golden Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 83, energyShieldBase = 25, }, req = { level = 35, dex = 40, int = 40, }, } itemBases["Raven Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 90, energyShieldBase = 27, }, req = { level = 38, dex = 44, int = 44, }, } itemBases["Callous Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 106, energyShieldBase = 31, }, req = { level = 45, dex = 51, int = 51, }, } itemBases["Regicide Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 122, energyShieldBase = 36, }, req = { level = 52, dex = 58, int = 58, }, } itemBases["Harlequin Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 137, energyShieldBase = 40, }, req = { level = 57, dex = 64, int = 64, }, } itemBases["Vaal Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 180, energyShieldBase = 47, }, req = { level = 62, dex = 79, int = 72, }, } itemBases["Deicide Mask"] = { type = "Helmet", + subType = "Evasion/Energy Shield", armour = { evasionBase = 166, energyShieldBase = 59, }, req = { level = 67, dex = 73, int = 88, }, } diff --git a/Data/Bases/mace.lua b/Data/Bases/mace.lua index 4c5372c51..c74a156c5 100644 --- a/Data/Bases/mace.lua +++ b/Data/Bases/mace.lua @@ -155,150 +155,175 @@ itemBases["Behemoth Mace"] = { itemBases["Driftwood Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 5, PhysicalMax = 7, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 1, str = 8, int = 8, }, } itemBases["Darkwood Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 7, PhysicalMax = 10, critChanceBase = 6, attackRateBase = 1.5, }, req = { level = 5, str = 14, int = 14, }, } itemBases["Bronze Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 10, PhysicalMax = 19, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 10, str = 22, int = 22, }, } itemBases["Quartz Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "20% increased Elemental Damage", weapon = { PhysicalMin = 14, PhysicalMax = 21, critChanceBase = 7, attackRateBase = 1.25, }, req = { level = 15, str = 25, int = 35, }, } itemBases["Iron Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 18, PhysicalMax = 27, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 20, str = 38, int = 38, }, } itemBases["Ochre Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 15, PhysicalMax = 28, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 24, str = 44, int = 44, }, } itemBases["Ritual Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 18, PhysicalMax = 41, critChanceBase = 6, attackRateBase = 1.2, }, req = { level = 28, str = 51, int = 51, }, } itemBases["Shadow Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "15% increased Elemental Damage", weapon = { PhysicalMin = 25, PhysicalMax = 37, critChanceBase = 6.5, attackRateBase = 1.25, }, req = { level = 32, str = 52, int = 62, }, } itemBases["Grinning Fetish"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 21, PhysicalMax = 32, critChanceBase = 6, attackRateBase = 1.5, }, req = { level = 35, str = 62, int = 62, }, } itemBases["Horned Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "Damage Penetrates 1% Elemental Resistances", weapon = { PhysicalMin = 22, PhysicalMax = 42, critChanceBase = 6, attackRateBase = 1.3, }, req = { level = 36, str = 66, int = 66, }, } itemBases["Sekhem"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 25, PhysicalMax = 46, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 38, str = 67, int = 67, }, } itemBases["Crystal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "20% increased Elemental Damage", weapon = { PhysicalMin = 29, PhysicalMax = 43, critChanceBase = 7, attackRateBase = 1.25, }, req = { level = 41, str = 59, int = 85, }, } itemBases["Lead Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 32, PhysicalMax = 48, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 44, str = 77, int = 77, }, } itemBases["Blood Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 25, PhysicalMax = 47, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 47, str = 81, int = 81, }, } itemBases["Royal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 29, PhysicalMax = 67, critChanceBase = 6, attackRateBase = 1.2, }, req = { level = 50, str = 86, int = 86, }, } itemBases["Abyssal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "15% increased Elemental Damage", weapon = { PhysicalMin = 38, PhysicalMax = 57, critChanceBase = 6.5, attackRateBase = 1.25, }, req = { level = 53, str = 83, int = 99, }, } itemBases["Stag Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "Damage Penetrates 1% Elemental Resistances", weapon = { PhysicalMin = 32, PhysicalMax = 60, critChanceBase = 6, attackRateBase = 1.3, }, req = { level = 55, str = 98, int = 98, }, } itemBases["Karui Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 32, PhysicalMax = 47, critChanceBase = 6, attackRateBase = 1.5, }, req = { level = 56, str = 96, int = 96, }, } itemBases["Tyrant's Sekhem"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 36, PhysicalMax = 67, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 58, str = 99, int = 99, }, } itemBases["Opal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "20% increased Elemental Damage", weapon = { PhysicalMin = 40, PhysicalMax = 60, critChanceBase = 7, attackRateBase = 1.25, }, req = { level = 60, str = 95, int = 131, }, } itemBases["Platinum Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 42, PhysicalMax = 63, critChanceBase = 6, attackRateBase = 1.25, }, req = { level = 62, str = 113, int = 113, }, } itemBases["Vaal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 31, PhysicalMax = 58, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 64, str = 113, int = 113, }, } itemBases["Carnal Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "10% increased Elemental Damage", weapon = { PhysicalMin = 34, PhysicalMax = 78, critChanceBase = 6, attackRateBase = 1.2, }, req = { level = 66, str = 113, int = 113, }, } itemBases["Void Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "15% increased Elemental Damage", weapon = { PhysicalMin = 42, PhysicalMax = 63, critChanceBase = 6.5, attackRateBase = 1.25, }, req = { level = 68, str = 104, int = 122, }, } itemBases["Sambar Sceptre"] = { type = "One Handed Mace", + subType = "Sceptre", implicit = "Damage Penetrates 2% Elemental Resistances", weapon = { PhysicalMin = 35, PhysicalMax = 65, critChanceBase = 6, attackRateBase = 1.3, }, req = { level = 70, str = 121, int = 112, }, diff --git a/Data/Bases/shield.lua b/Data/Bases/shield.lua index 66d39ea5c..a81368cd8 100644 --- a/Data/Bases/shield.lua +++ b/Data/Bases/shield.lua @@ -3,86 +3,103 @@ local itemBases = ... itemBases["Splintered Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 24, armourBase = 8, movementPenalty = 3, }, req = { }, } itemBases["Corroded Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 23, armourBase = 40, movementPenalty = 3, }, req = { level = 5, str = 20, }, } itemBases["Rawhide Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 26, armourBase = 46, movementPenalty = 3, }, req = { level = 11, str = 33, }, } itemBases["Cedar Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 94, movementPenalty = 3, }, req = { level = 17, str = 46, }, } itemBases["Copper Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 24, armourBase = 166, movementPenalty = 3, }, req = { level = 24, str = 62, }, } itemBases["Reinforced Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 23, armourBase = 249, movementPenalty = 3, }, req = { level = 30, str = 76, }, } itemBases["Painted Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 189, movementPenalty = 3, }, req = { level = 35, str = 87, }, } itemBases["Buckskin Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 26, armourBase = 154, movementPenalty = 3, }, req = { level = 39, str = 96, }, } itemBases["Mahogany Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 231, movementPenalty = 3, }, req = { level = 43, str = 105, }, } itemBases["Bronze Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 24, armourBase = 319, movementPenalty = 3, }, req = { level = 47, str = 114, }, } itemBases["Girded Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 23, armourBase = 418, movementPenalty = 3, }, req = { level = 51, str = 123, }, } itemBases["Crested Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 294, movementPenalty = 3, }, req = { level = 55, str = 132, }, } itemBases["Shagreen Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 26, armourBase = 227, movementPenalty = 3, }, req = { level = 58, str = 139, }, } itemBases["Ebony Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 358, movementPenalty = 3, }, req = { level = 61, str = 159, }, } itemBases["Ezomyte Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 24, armourBase = 454, movementPenalty = 3, }, req = { level = 64, str = 159, }, } itemBases["Colossal Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 23, armourBase = 550, movementPenalty = 3, }, req = { level = 67, str = 159, }, } itemBases["Pinnacle Tower Shield"] = { type = "Shield", + subType = "Armour", armour = { blockChance = 25, armourBase = 406, movementPenalty = 3, }, req = { level = 70, str = 159, }, } @@ -90,81 +107,97 @@ itemBases["Pinnacle Tower Shield"] = { itemBases["Goathide Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 25, evasionBase = 10, movementPenalty = 3, }, req = { }, } itemBases["Pine Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 38, movementPenalty = 3, }, req = { level = 8, dex = 26, }, } itemBases["Painted Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 24, evasionBase = 95, movementPenalty = 3, }, req = { level = 16, dex = 44, }, } itemBases["Hammered Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 27, evasionBase = 84, movementPenalty = 3, }, req = { level = 23, dex = 60, }, } itemBases["War Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 126, movementPenalty = 3, }, req = { level = 29, dex = 74, }, } itemBases["Gilded Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 25, evasionBase = 171, movementPenalty = 3, }, req = { level = 34, dex = 85, }, } itemBases["Oak Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 164, movementPenalty = 3, }, req = { level = 38, dex = 94, }, } itemBases["Enameled Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 24, evasionBase = 241, movementPenalty = 3, }, req = { level = 42, dex = 103, }, } itemBases["Corrugated Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 27, evasionBase = 164, movementPenalty = 3, }, req = { level = 46, dex = 112, }, } itemBases["Battle Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 214, movementPenalty = 3, }, req = { level = 50, dex = 121, }, } itemBases["Golden Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 25, evasionBase = 269, movementPenalty = 3, }, req = { level = 54, dex = 130, }, } itemBases["Ironwood Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 243, movementPenalty = 3, }, req = { level = 57, dex = 136, }, } itemBases["Lacquered Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 24, evasionBase = 382, movementPenalty = 3, }, req = { level = 60, dex = 159, }, } itemBases["Vaal Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 27, evasionBase = 239, movementPenalty = 3, }, req = { level = 63, dex = 159, }, } itemBases["Crusader Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 26, evasionBase = 287, movementPenalty = 3, }, req = { level = 66, dex = 159, }, } itemBases["Imperial Buckler"] = { type = "Shield", + subType = "Evasion", armour = { blockChance = 25, evasionBase = 335, movementPenalty = 3, }, req = { level = 69, dex = 159, }, } @@ -172,94 +205,110 @@ itemBases["Imperial Buckler"] = { itemBases["Twig Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "10% increased Spell Damage", armour = { blockChance = 22, energyShieldBase = 5, movementPenalty = 3, }, req = { int = 15, }, } itemBases["Yew Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 11, movementPenalty = 3, }, req = { level = 9, int = 28, }, } itemBases["Bone Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "15% increased Spell Damage", armour = { blockChance = 22, energyShieldBase = 17, movementPenalty = 3, }, req = { level = 15, int = 42, }, } itemBases["Tarnished Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 25, movementPenalty = 3, }, req = { level = 23, int = 60, }, } itemBases["Jingling Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "10% increased Spell Damage", armour = { blockChance = 23, energyShieldBase = 30, movementPenalty = 3, }, req = { level = 28, int = 71, }, } itemBases["Brass Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", armour = { blockChance = 25, energyShieldBase = 43, movementPenalty = 3, }, req = { level = 33, int = 82, }, } itemBases["Walnut Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 39, movementPenalty = 3, }, req = { level = 37, int = 92, }, } itemBases["Ivory Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "15% increased Spell Damage", armour = { blockChance = 22, energyShieldBase = 43, movementPenalty = 3, }, req = { level = 41, int = 100, }, } itemBases["Ancient Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 45, int = 110, }, } itemBases["Chiming Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "10% increased Spell Damage", armour = { blockChance = 23, energyShieldBase = 51, movementPenalty = 3, }, req = { level = 49, int = 118, }, } itemBases["Thorium Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", armour = { blockChance = 25, energyShieldBase = 67, movementPenalty = 3, }, req = { level = 53, int = 128, }, } itemBases["Lacewood Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 58, movementPenalty = 3, }, req = { level = 56, int = 134, }, } itemBases["Fossilised Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "15% increased Spell Damage", armour = { blockChance = 22, energyShieldBase = 61, movementPenalty = 3, }, req = { level = 59, int = 141, }, } itemBases["Vaal Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "5% increased Spell Damage", armour = { blockChance = 24, energyShieldBase = 70, movementPenalty = 3, }, req = { level = 62, int = 159, }, } itemBases["Harmonic Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", implicit = "10% increased Spell Damage", armour = { blockChance = 23, energyShieldBase = 72, movementPenalty = 3, }, req = { level = 65, int = 159, }, } itemBases["Titanium Spirit Shield"] = { type = "Shield", + subType = "Energy Shield", armour = { blockChance = 25, energyShieldBase = 84, movementPenalty = 3, }, req = { level = 68, int = 159, }, } @@ -267,75 +316,88 @@ itemBases["Titanium Spirit Shield"] = { itemBases["Rotted Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "60% increased Block Recovery", armour = { blockChance = 23, armourBase = 11, evasionBase = 11, movementPenalty = 3, }, req = { level = 5, }, } itemBases["Fir Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "180% increased Block Recovery", armour = { blockChance = 23, armourBase = 25, evasionBase = 25, movementPenalty = 3, }, req = { level = 12, str = 19, dex = 19, }, } itemBases["Studded Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "60% increased Block Recovery", armour = { blockChance = 26, armourBase = 40, evasionBase = 40, movementPenalty = 3, }, req = { level = 20, str = 28, dex = 28, }, } itemBases["Scarlet Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", armour = { blockChance = 25, armourBase = 75, evasionBase = 75, movementPenalty = 3, }, req = { level = 27, str = 37, dex = 37, }, } itemBases["Splendid Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "120% increased Block Recovery", armour = { blockChance = 24, armourBase = 65, evasionBase = 65, movementPenalty = 3, }, req = { level = 33, str = 44, dex = 44, }, } itemBases["Maple Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "180% increased Block Recovery", armour = { blockChance = 23, armourBase = 77, evasionBase = 77, movementPenalty = 3, }, req = { level = 39, str = 52, dex = 52, }, } itemBases["Spiked Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "60% increased Block Recovery", armour = { blockChance = 26, armourBase = 88, evasionBase = 88, movementPenalty = 3, }, req = { level = 45, str = 58, dex = 58, }, } itemBases["Crimson Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", armour = { blockChance = 25, armourBase = 135, evasionBase = 135, movementPenalty = 3, }, req = { level = 49, str = 64, dex = 64, }, } itemBases["Baroque Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "120% increased Block Recovery", armour = { blockChance = 24, armourBase = 106, evasionBase = 106, movementPenalty = 3, }, req = { level = 54, str = 70, dex = 70, }, } itemBases["Teak Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "180% increased Block Recovery", armour = { blockChance = 23, armourBase = 114, evasionBase = 114, movementPenalty = 3, }, req = { level = 58, str = 74, dex = 74, }, } itemBases["Spiny Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "60% increased Block Recovery", armour = { blockChance = 26, armourBase = 134, evasionBase = 134, movementPenalty = 3, }, req = { level = 62, str = 85, dex = 85, }, } itemBases["Cardinal Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", armour = { blockChance = 25, armourBase = 181, evasionBase = 181, movementPenalty = 3, }, req = { level = 66, str = 85, dex = 85, }, } itemBases["Elegant Round Shield"] = { type = "Shield", + subType = "Armour/Evasion", implicit = "120% increased Block Recovery", armour = { blockChance = 24, armourBase = 129, evasionBase = 129, movementPenalty = 3, }, req = { level = 70, str = 85, dex = 85, }, @@ -344,75 +406,88 @@ itemBases["Elegant Round Shield"] = { itemBases["Plank Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+4% to all Elemental Resistances", armour = { blockChance = 22, armourBase = 15, energyShieldBase = 5, movementPenalty = 3, }, req = { level = 7, }, } itemBases["Linden Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+4% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 38, energyShieldBase = 12, movementPenalty = 3, }, req = { level = 13, str = 20, int = 20, }, } itemBases["Reinforced Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", armour = { blockChance = 26, armourBase = 56, energyShieldBase = 17, movementPenalty = 3, }, req = { level = 20, str = 28, int = 28, }, } itemBases["Layered Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+8% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 54, energyShieldBase = 16, movementPenalty = 3, }, req = { level = 27, str = 37, int = 37, }, } itemBases["Ceremonial Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+12% to all Elemental Resistances", armour = { blockChance = 22, armourBase = 67, energyShieldBase = 20, movementPenalty = 3, }, req = { level = 34, str = 46, int = 46, }, } itemBases["Etched Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+4% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 110, energyShieldBase = 33, movementPenalty = 3, }, req = { level = 40, str = 52, int = 52, }, } itemBases["Steel Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", armour = { blockChance = 26, armourBase = 127, energyShieldBase = 37, movementPenalty = 3, }, req = { level = 46, str = 60, int = 60, }, } itemBases["Laminated Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+8% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 98, energyShieldBase = 29, movementPenalty = 3, }, req = { level = 50, str = 64, int = 64, }, } itemBases["Angelic Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+12% to all Elemental Resistances", armour = { blockChance = 22, armourBase = 108, energyShieldBase = 32, movementPenalty = 3, }, req = { level = 55, str = 70, int = 70, }, } itemBases["Branded Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+4% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 162, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 59, str = 76, int = 76, }, } itemBases["Champion Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", armour = { blockChance = 26, armourBase = 187, energyShieldBase = 55, movementPenalty = 3, }, req = { level = 62, str = 85, int = 85, }, } itemBases["Mosaic Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+8% to all Elemental Resistances", armour = { blockChance = 24, armourBase = 127, energyShieldBase = 37, movementPenalty = 3, }, req = { level = 65, str = 85, int = 85, }, } itemBases["Archon Kite Shield"] = { type = "Shield", + subType = "Armour/Energy Shield", implicit = "+12% to all Elemental Resistances", armour = { blockChance = 22, armourBase = 135, energyShieldBase = 40, movementPenalty = 3, }, req = { level = 68, str = 85, int = 85, }, @@ -421,79 +496,92 @@ itemBases["Archon Kite Shield"] = { itemBases["Spiked Bundle"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (2 to 5) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 11, energyShieldBase = 4, movementPenalty = 3, }, req = { level = 5, }, } itemBases["Driftwood Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (2 to 5) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 40, energyShieldBase = 13, movementPenalty = 3, }, req = { level = 12, dex = 19, int = 19, }, } itemBases["Alloyed Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (5 to 12) Physical Damage to Melee Attackers", armour = { blockChance = 25, evasionBase = 48, energyShieldBase = 15, movementPenalty = 3, }, req = { level = 20, dex = 28, int = 28, }, } itemBases["Burnished Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (10 to 23) Physical Damage to Melee Attackers", armour = { blockChance = 26, evasionBase = 54, energyShieldBase = 16, movementPenalty = 3, }, req = { level = 27, dex = 37, int = 37, }, } itemBases["Ornate Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (24 to 35) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 105, energyShieldBase = 31, movementPenalty = 3, }, req = { level = 33, dex = 44, int = 44, }, } itemBases["Redwood Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (36 to 50) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 123, energyShieldBase = 36, movementPenalty = 3, }, req = { level = 39, dex = 52, int = 52, }, } itemBases["Compound Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (51 to 70) Physical Damage to Melee Attackers", armour = { blockChance = 25, evasionBase = 106, energyShieldBase = 31, movementPenalty = 3, }, req = { level = 45, dex = 58, int = 58, }, } itemBases["Polished Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (71 to 90) Physical Damage to Melee Attackers", armour = { blockChance = 26, evasionBase = 96, energyShieldBase = 28, movementPenalty = 3, }, req = { level = 49, dex = 64, int = 64, }, } itemBases["Sovereign Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (91 to 120) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 169, energyShieldBase = 50, movementPenalty = 3, }, req = { level = 54, dex = 70, int = 70, }, } itemBases["Alder Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (121 to 150) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 182, energyShieldBase = 53, movementPenalty = 3, }, req = { level = 58, dex = 74, int = 74, }, } itemBases["Ezomyte Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (151 to 180) Physical Damage to Melee Attackers", armour = { blockChance = 25, evasionBase = 158, energyShieldBase = 46, movementPenalty = 3, }, req = { level = 62, dex = 85, int = 85, }, } itemBases["Mirrored Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (181 to 220) Physical Damage to Melee Attackers", armour = { blockChance = 26, evasionBase = 131, energyShieldBase = 38, movementPenalty = 3, }, req = { level = 66, dex = 85, int = 85, }, } itemBases["Supreme Spiked Shield"] = { type = "Shield", + subType = "Evasion/Energy Shield", implicit = "Reflects (221 to 260) Physical Damage to Melee Attackers", armour = { blockChance = 24, evasionBase = 210, energyShieldBase = 62, movementPenalty = 3, }, req = { level = 70, dex = 85, int = 85, }, -} +} \ No newline at end of file diff --git a/Data/Bases/sword.lua b/Data/Bases/sword.lua index f06a1aacc..b7361d6de 100644 --- a/Data/Bases/sword.lua +++ b/Data/Bases/sword.lua @@ -155,150 +155,175 @@ itemBases["Tiger Hook"] = { itemBases["Rusted Spike"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 4, PhysicalMax = 10, critChanceBase = 5.5, attackRateBase = 1.4, }, req = { dex = 20, }, } itemBases["Whalebone Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 4, PhysicalMax = 15, critChanceBase = 5.5, attackRateBase = 1.55, }, req = { level = 7, dex = 32, }, } itemBases["Battered Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 10, PhysicalMax = 18, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 12, dex = 47, }, } itemBases["Basket Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 9, PhysicalMax = 22, critChanceBase = 5.5, attackRateBase = 1.5, }, req = { level = 17, dex = 62, }, } itemBases["Jagged Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 11, PhysicalMax = 25, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 22, dex = 77, }, } itemBases["Antique Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 10, PhysicalMax = 40, critChanceBase = 6.5, attackRateBase = 1.3, }, req = { level = 26, dex = 89, }, } itemBases["Elegant Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 15, PhysicalMax = 28, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 30, dex = 101, }, } itemBases["Thorn Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+50% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 16, PhysicalMax = 37, critChanceBase = 5.7, attackRateBase = 1.4, }, req = { level = 34, dex = 113, }, } itemBases["Smallsword"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "8% chance to cause Bleeding on Hit", weapon = { PhysicalMin = 17, PhysicalMax = 36, critChanceBase = 6, attackRateBase = 1.55, }, req = { level = 36, dex = 124, }, } itemBases["Wyrmbone Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 11, PhysicalMax = 44, critChanceBase = 5.5, attackRateBase = 1.5, }, req = { level = 37, dex = 122, }, } itemBases["Burnished Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 22, PhysicalMax = 41, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 40, dex = 131, }, } itemBases["Estoc"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 19, PhysicalMax = 44, critChanceBase = 5.5, attackRateBase = 1.5, }, req = { level = 43, dex = 140, }, } itemBases["Serrated Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 19, PhysicalMax = 43, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 46, dex = 149, }, } itemBases["Primeval Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 17, PhysicalMax = 67, critChanceBase = 6.5, attackRateBase = 1.3, }, req = { level = 49, dex = 158, }, } itemBases["Fancy Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 24, PhysicalMax = 45, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 52, dex = 167, }, } itemBases["Apex Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+50% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 24, PhysicalMax = 55, critChanceBase = 5.7, attackRateBase = 1.4, }, req = { level = 55, dex = 176, }, } itemBases["Courtesan Sword"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "8% chance to cause Bleeding on Hit", weapon = { PhysicalMin = 26, PhysicalMax = 53, critChanceBase = 6, attackRateBase = 1.55, }, req = { level = 57, dex = 190, }, } itemBases["Dragonbone Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 16, PhysicalMax = 65, critChanceBase = 5.5, attackRateBase = 1.5, }, req = { level = 58, dex = 185, }, } itemBases["Tempered Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 31, PhysicalMax = 58, critChanceBase = 6, attackRateBase = 1.4, }, req = { level = 60, dex = 212, }, } itemBases["Pecoraro"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 25, PhysicalMax = 59, critChanceBase = 5.5, attackRateBase = 1.5, }, req = { level = 62, dex = 212, }, } itemBases["Spiraled Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 24, PhysicalMax = 55, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 64, dex = 212, }, } itemBases["Vaal Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 20, PhysicalMax = 80, critChanceBase = 6.5, attackRateBase = 1.3, }, req = { level = 66, dex = 212, }, } itemBases["Jewelled Foil"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+30% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 27, PhysicalMax = 51, critChanceBase = 5.5, attackRateBase = 1.6, }, req = { level = 68, dex = 212, }, } itemBases["Harpy Rapier"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "+50% to Global Critical Strike Multiplier", weapon = { PhysicalMin = 26, PhysicalMax = 60, critChanceBase = 5.7, attackRateBase = 1.4, }, req = { level = 70, dex = 212, }, } itemBases["Dragoon Sword"] = { type = "One Handed Sword", + subType = "Thrusting", implicit = "12% chance to cause Bleeding on Hit", weapon = { PhysicalMin = 28, PhysicalMax = 58, critChanceBase = 6, attackRateBase = 1.5, }, req = { level = 72, dex = 220, }, diff --git a/Data/ModFlask.lua b/Data/ModFlask.lua new file mode 100644 index 000000000..1f1c305bd --- /dev/null +++ b/Data/ModFlask.lua @@ -0,0 +1,34 @@ +-- Item data (c) Grinding Gear Games + +return { + ["Perpetual"] = { type = "Prefix", "(20-40)% increased Charge Recovery" }, + ["Ample"] = { type = "Prefix", "+(10-20) Extra Charges" }, + ["Chemist's"] = { type = "Prefix", "(20-25)% reduced Charges Used" }, + ["Saturated"] = { type = "Prefix", "50% increased Amount Recovered", "33% reduced Recovery Speed", exclude = { ["Utility"] = true } }, + ["Cautious"] = { type = "Prefix", "100% increased Recovery when on Low Life", exclude = { ["Utility"] = true } }, + ["Sapping"] = { type = "Prefix", "40% increased Life Recovered", "Removes 10% of Life Recovered from Mana when used", exclude = { ["Mana"] = true, ["Hybrid"] = true, ["Utility"] = true } }, + ["Caustic"] = { type = "Prefix", "60% increased Mana Recovered", "Removes 15% of Mana Recovered from Life when used", exclude = { ["Life"] = true, ["Hybrid"] = true, ["Utility"] = true } }, + ["Panicked"] = { type = "Prefix", "25% reduced Amount Recovered", "Instant Recovery when on Low Life", exclude = { ["Utility"] = true } }, + ["Seething"] = { type = "Prefix", "66% reduced Amount Recovered", "Instant Recovery", exclude = { ["Utility"] = true } }, + ["Bubbling"] = { type = "Prefix", "50% reduced Amount Recovered", "135% increased Recovery Speed", "50% of Recovery applied Instantly", exclude = { ["Utility"] = true } }, + ["Catalysed"] = { type = "Prefix", "50% increased Recovery Speed", exclude = { ["Utility"] = true } }, + ["Experimenter's"] = { type = "Prefix", "(30-40)% increased Duration", exclude = { ["Life"] = true, ["Mana"] = true, ["Hybrid"] = true } }, + ["Alchemist's"] = { type = "Prefix", "25% increased effect", "33% reduced Duration", exclude = { ["Life"] = true, ["Mana"] = true, ["Hybrid"] = true } }, + ["Surgeon's"] = { type = "Prefix", "20% chance to gain a Flask Charge when you deal a Critical Strike", exclude = { ["Diamond Flask"] = true } }, + ["Avenger's"] = { type = "Prefix", "Recharges 3 Charges when you take a Critical Strike" }, + ["of Fending"] = { type = "Suffix", "Adds Knockback to Melee Attacks during Flask effect" }, + ["of Iron Skin"] = { type = "Suffix", "(60-100)% increased Armour during Flask effect" }, + ["of Reflexes"] = { type = "Suffix", "(60-100)% increased Evasion Rating during Flask effect" }, + ["of Gluttony"] = { type = "Suffix", "0.4% of Physical Attack Damage Leeched as Life during Flask effect" }, + ["of Craving"] = { type = "Suffix", "0.4% of Physical Attack Damage Leeched as Mana during Flask effect" }, + ["of Animation"] = { type = "Suffix", "Grants (40-60)% of Life Recovery to Minions", exclude = { ["Mana"] = true, ["Utility"] = true } }, + ["of Adrenaline"] = { type = "Suffix", "(20-30)% increased Movement Speed during Flask effect" }, + ["of Resistance"] = { type = "Suffix", "(20-30)% additional Elemental Resistances during Flask effect" }, + ["of Steadiness"] = { type = "Suffix", "(40-60)% increased Block and Stun Recovery during Flask effect" }, + ["of Warding"] = { type = "Suffix", "Immune to Curses during Flask effect", "Removes Curses on use" }, + ["of Staunching"] = { type = "Suffix", "Immunity to Bleeding during Flask effect", "Removes Bleeding on use" }, + ["of Grounding"] = { type = "Suffix", "Immunity to Shock during Flask effect", "Removes Shock on use" }, + ["of Dousing"] = { type = "Suffix", "Immunity to Ignite during Flask effect", "Removes Burning on use" }, + ["of Heat"] = { type = "Suffix", "Immunity to Freeze and Chill during Flask effect", "Removes Freeze and Chill on use" }, + ["of Curing"] = { type = "Suffix", "Immune to Poison during Flask Effect", "Removes Poison on use" }, +} \ No newline at end of file diff --git a/Data/ModJewel.lua b/Data/ModJewel.lua new file mode 100644 index 000000000..8e849f537 --- /dev/null +++ b/Data/ModJewel.lua @@ -0,0 +1,127 @@ +-- Item data (c) Grinding Gear Games + +return { + ["Arctic"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier with Cold Skills", exclude = { } }, + ["Arming"] = { type = "Prefix", "(6-8)% increased Mine Laying Speed", exclude = { ["Crimson Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Armoured"] = { type = "Prefix", "(14-18)% increased Armour", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Avalanching"] = { type = "Prefix", "(14-18)% increased Critical Strike Chance with Cold Skills", exclude = { } }, + ["Bandit's"] = { type = "Prefix", "(4-6)% increased Attack Speed with One Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Battlemage's"] = { type = "Prefix", "(14-16)% increased Spell Damage while holding a Shield", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Beating"] = { type = "Prefix", "(6-8)% increased Attack Speed with Maces", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Blunt"] = { type = "Prefix", "(6-8)% increased Attack Speed with Staves", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Brutal"] = { type = "Prefix", "(14-16)% increased Physical Damage with Maces", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Carved"] = { type = "Prefix", "(8-12)% increased Totem Life", exclude = { } }, + ["Champion's"] = { type = "Prefix", "(12-14)% increased Physical Damage with Two Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Chaotic"] = { type = "Prefix", "(9-13)% increased Chaos Damage", exclude = { } }, + ["Charging"] = { type = "Prefix", "(4-6)% increased Attack Speed while holding a Shield", exclude = { } }, + ["Chilling"] = { type = "Prefix", "(14-16)% increased Cold Damage", exclude = { } }, + ["Cleaving"] = { type = "Prefix", "(6-8)% increased Attack Speed with Axes", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Cruel"] = { type = "Prefix", "(14-16)% increased Physical Damage with Wands", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Cyromantic"] = { type = "Prefix", "(3-5)% increased Cast Speed with Cold Skills", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Deflecting"] = { type = "Prefix", "1% additional Chance to Block with Staves", exclude = { ["Viridian Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Dissipating"] = { type = "Prefix", "1% additional Chance to Block Spells while Dual Wielding", exclude = { } }, + ["Electromantic"] = { type = "Prefix", "(3-5)% increased Cast Speed with Lightning Skills", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Energetic"] = { type = "Prefix", "(12-15)% increased Mana Regeneration Rate", exclude = { } }, + ["Enlightened"] = { type = "Prefix", "(6-8)% increased maximum Mana", exclude = { } }, + ["Evasive"] = { type = "Prefix", "(14-18)% increased Evasion Rating", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Fencing"] = { type = "Prefix", "(6-8)% increased Attack Speed with Swords", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Fevered"] = { type = "Prefix", "(6-8)% increased Energy Shield Recharge Rate", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Fierce"] = { type = "Prefix", "(14-16)% increased Physical Damage with Bows", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Flaming"] = { type = "Prefix", "(14-16)% increased Fire Damage", exclude = { } }, + ["Flanking"] = { type = "Prefix", "(12-14)% increased Melee Physical Damage while holding a Shield", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Gladiator's"] = { type = "Prefix", "(12-14)% increased Physical Weapon Damage while Dual Wielding", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Halting"] = { type = "Prefix", "1% additional Chance to Block Spells with Staves", exclude = { ["Viridian Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Harming"] = { type = "Prefix", "(14-18)% increased Critical Strike Chance with One Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Harmonic"] = { type = "Prefix", "(4-6)% increased Attack Speed while Dual Wielding", exclude = { } }, + ["Honed"] = { type = "Prefix", "(6-8)% increased Trap Throwing Speed", exclude = { ["Crimson Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Humming"] = { type = "Prefix", "(14-16)% increased Lightning Damage", exclude = { } }, + ["Hungering"] = { type = "Prefix", "(0.2-0.4)% of Physical Attack Damage Leeched as Life", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Incinerating"] = { type = "Prefix", "(14-18)% increased Critical Strike Chance with Fire Skills", exclude = { } }, + ["Infernal"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier with Fire Skills", exclude = { } }, + ["Jinxing"] = { type = "Prefix", "(6-8)% increased Attack Speed with Wands", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Judging"] = { type = "Prefix", "(14-16)% increased Physical Damage with Staves", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["Leadership"] = { type = "Prefix", "Minions deal (14-16)% increased Damage", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Lethal"] = { type = "Prefix", "(14-16)% increased Physical Damage with Daggers", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Master's"] = { type = "Prefix", "Minions have (8-12)% increased maximum Life", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Parrying"] = { type = "Prefix", "1% additional Block Chance while Dual Wielding", exclude = { } }, + ["Piercing"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier with One Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Puncturing"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier while Dual Wielding", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Pyromantic"] = { type = "Prefix", "(3-5)% increased Cast Speed with Fire Skills", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Resonant"] = { type = "Prefix", "(3-5)% increased Cast Speed while Dual Wielding", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Ripping"] = { type = "Prefix", "(6-8)% increased Attack Speed with Claws", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Rupturing"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier with Two Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Sabotage"] = { type = "Prefix", "(14-16)% increased Mine Damage", exclude = { ["Crimson Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Savage"] = { type = "Prefix", "(14-16)% increased Physical Damage with Claws", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Serene"] = { type = "Prefix", "(4-6)% faster start of Energy Shield Recharge", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Shaman's"] = { type = "Prefix", "(12-16)% increased Totem Damage", exclude = { } }, + ["Sharpened"] = { type = "Prefix", "(14-16)% increased Physical Damage", exclude = { } }, + ["Shielding"] = { type = "Prefix", "+1% Chance to Block with Shields", exclude = { } }, + ["Shimmering"] = { type = "Prefix", "(6-8)% increased maximum Energy Shield", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Sinister"] = { type = "Prefix", "(14-16)% increased Physical Damage with Axes", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Slicing"] = { type = "Prefix", "(6-8)% increased Attack Speed with Daggers", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Soldier's"] = { type = "Prefix", "(12-14)% increased Physical Damage with One Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Sorcerer's"] = { type = "Prefix", "(14-16)% increased Spell Damage while Dual Wielding", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Sundering"] = { type = "Prefix", "(14-18)% increased Critical Strike Chance with Two Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Surging"] = { type = "Prefix", "+(15-18)% to Critical Strike Multiplier with Lightning Skills", exclude = { } }, + ["Technical"] = { type = "Prefix", "(14-18)% increased Weapon Critical Strike Chance while Dual Wielding", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Thirsting"] = { type = "Prefix", "(0.2-0.4)% of Physical Attack Damage Leeched as Mana", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Thundering"] = { type = "Prefix", "(14-18)% increased Critical Strike Chance with Lightning Skills", exclude = { } }, + ["Thwarting"] = { type = "Prefix", "1% additional Chance to Block Spells with Shields", exclude = { } }, + ["Trapping"] = { type = "Prefix", "(14-16)% increased Trap Damage", exclude = { ["Crimson Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Vicious"] = { type = "Prefix", "(14-16)% increased Physical Damage with Swords", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Vivid"] = { type = "Prefix", "(5-7)% increased maximum Life", exclude = { } }, + ["Volleying"] = { type = "Prefix", "(6-8)% increased Attack Speed with Bows", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Warding"] = { type = "Prefix", "(3-5)% increased Cast Speed while holding a Shield", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Warrior's"] = { type = "Prefix", "(4-6)% increased Attack Speed with Two Handed Melee Weapons", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["Wizard's"] = { type = "Prefix", "(14-16)% increased Spell Damage while wielding a Staff", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["Wright's"] = { type = "Prefix", "(3-5)% increased Cast Speed while wielding a Staff", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Absorption"] = { type = "Suffix", "+(1-2) Mana gained for each Enemy hit by your Attacks", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Adaption"] = { type = "Suffix", "+(6-8) to all Attributes", exclude = { } }, + ["of Annihilation"] = { type = "Suffix", "(10-14)% increased Critical Strike Chance for Spells", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Archery"] = { type = "Suffix", "(10-12)% increased Projectile Damage", exclude = { } }, + ["of Athletics"] = { type = "Suffix", "+(8-10) to Strength and Dexterity", exclude = { } }, + ["of Berserking"] = { type = "Suffix", "(3-5)% increased Attack Speed", exclude = { } }, + ["of Blasting"] = { type = "Suffix", "(10-12)% increased Area Damage", exclude = { } }, + ["of Burning"] = { type = "Suffix", "(2-3)% chance to Ignite", "(3-5)% increased Ignite Duration on Enemies", exclude = { } }, + ["of Combat"] = { type = "Suffix", "(10-12)% increased Melee Damage", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["of Cunning"] = { type = "Suffix", "+(8-10) to Dexterity and Intelligence", exclude = { } }, + ["of Deadliness"] = { type = "Suffix", "(6-10)% increased Accuracy Rating", "(6-10)% increased Global Critical Strike Chance", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Demolishing"] = { type = "Suffix", "+(12-15)% to Melee Critical Strike Multiplier", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["of Dexterity"] = { type = "Suffix", "+(12-16) to Dexterity", exclude = { } }, + ["of Efficiency"] = { type = "Suffix", "(3-5)% reduced Mana Cost of Skills", exclude = { } }, + ["of Enchanting"] = { type = "Suffix", "(2-4)% increased Cast Speed", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Entropy"] = { type = "Suffix", "(10-12)% increased Damage over Time", exclude = { } }, + ["of Fending"] = { type = "Suffix", "(4-6)% chance to Knock Enemies Back on hit", exclude = { } }, + ["of Focus"] = { type = "Suffix", "+(2-3) Energy Shield gained for each Enemy hit by your Attacks", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Freezing"] = { type = "Suffix", "(2-3)% chance to Freeze", "(12-16)% increased Freeze Duration on Enemies", exclude = { } }, + ["of Grounding"] = { type = "Suffix", "+(12-15)% to Lightning Resistance", exclude = { } }, + ["of Insulation"] = { type = "Suffix", "+(10-12)% to Fire and Lightning Resistances", exclude = { } }, + ["of Intelligence"] = { type = "Suffix", "+(12-16) to Intelligence", exclude = { } }, + ["of Menace"] = { type = "Suffix", "(8-12)% increased Global Critical Strike Chance", exclude = { } }, + ["of Mysticism"] = { type = "Suffix", "(10-12)% increased Spell Damage", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Order"] = { type = "Suffix", "+(7-13)% to Chaos Resistance", exclude = { } }, + ["of Potency"] = { type = "Suffix", "+(9-12)% to Global Critical Strike Multiplier", exclude = { } }, + ["of Precision"] = { type = "Suffix", "(10-14)% increased Accuracy Rating", exclude = { ["Cobalt Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Raiding"] = { type = "Suffix", "(4-6)% increased Rarity of Items found", exclude = { } }, + ["of Recovery"] = { type = "Suffix", "(10-14)% increased Stun and Block Recovery", exclude = { } }, + ["of Rejuvenation"] = { type = "Suffix", "+(2-3) Life gained for each Enemy hit by your Attacks", exclude = { ["Viridian Jewel"] = true, ["Cobalt Jewel"] = true } }, + ["of Resilience"] = { type = "Suffix", "Minions have +(6-10)% to all Elemental Resistances", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Resistance"] = { type = "Suffix", "+(8-10)% to all Elemental Resistances", exclude = { } }, + ["of Runes"] = { type = "Suffix", "Totems gain +(6-10)% to all Elemental Resistances", exclude = { } }, + ["of Shelter"] = { type = "Suffix", "+(10-12)% to Cold and Lightning Resistances", exclude = { } }, + ["of Shocking"] = { type = "Suffix", "(2-3)% chance to Shock", "(12-16)% increased Shock Duration on Enemies", exclude = { } }, + ["of Soaring"] = { type = "Suffix", "(6-8)% increased Projectile Speed", exclude = { } }, + ["of Spirit"] = { type = "Suffix", "+(8-10) to Strength and Intelligence", exclude = { } }, + ["of Strength"] = { type = "Suffix", "+(12-16) to Strength", exclude = { } }, + ["of Stunning"] = { type = "Suffix", "(10-14)% increased Stun Duration on Enemies", exclude = { } }, + ["of Unmaking"] = { type = "Suffix", "+(12-15)% to Critical Strike Multiplier for Spells", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, + ["of Weight"] = { type = "Suffix", "(10-14)% increased Melee Critical Strike Chance", exclude = { ["Cobalt Jewel"] = true, ["Prismatic Jewel"] = true } }, + ["of Wounding"] = { type = "Suffix", "(8-10)% increased Damage", exclude = { } }, + ["of Zeal"] = { type = "Suffix", "(2-4)% increased Attack and Cast Speed", exclude = { } }, + ["of the Apocalypse"] = { type = "Suffix", "(10-14)% increased Critical Strike Chance with Elemental Skills", exclude = { } }, + ["of the Beast"] = { type = "Suffix", "+(12-15)% to Cold Resistance", exclude = { } }, + ["of the Dragon"] = { type = "Suffix", "+(12-15)% to Fire Resistance", exclude = { } }, + ["of the Elements"] = { type = "Suffix", "+(12-15)% to Critical Strike Multiplier with Elemental Skills", exclude = { } }, + ["of the Hearth"] = { type = "Suffix", "+(10-12)% to Fire and Cold Resistances", exclude = { } }, + ["of the Wall"] = { type = "Suffix", "Minions have (2-4)% Chance to Block", exclude = { ["Viridian Jewel"] = true, ["Crimson Jewel"] = true } }, +} \ No newline at end of file diff --git a/Data/Rares.lua b/Data/Rares.lua index 44e3f6575..a3157720f 100644 --- a/Data/Rares.lua +++ b/Data/Rares.lua @@ -108,9 +108,14 @@ Prefixes: {range:0}+(0 to 51) to maximum Energy Shield {range:0}+(0 to 460) to Armour {range:0}(0 to 42)% increased Elemental Damage with Weapons +{range:0}(0 to 20)% increased Flask Life Recovery rate +{range:0}(0 to 20)% increased Flask Mana Recovery rate Suffixes: {str} -{res}]], +{res} +{range:0}(0 to 20)% increased Flask Charges gained +{range:0}(0 to 20)% reduced Flask Charges used +{range:0}(0 to 20)% increased Flask effect duration]], ["phys 1h pre"] = [[ Prefixes: {range:.5}(0 to 179)% increased Physical Damage diff --git a/Data/Uniques/flask.lua b/Data/Uniques/flask.lua index 7fe083ac5..d9c299fc5 100644 --- a/Data/Uniques/flask.lua +++ b/Data/Uniques/flask.lua @@ -158,7 +158,7 @@ Sin's Rebirth Stibnite Flask 100% increased Evasion Rating Requires Level 14 -Implicits: 2 +Implicits: 1 Creates a Smoke Cloud on Use Gain Unholy Might during Flask Effect Immunity to Ignite during Flask effect @@ -181,7 +181,7 @@ The Overflowing Chalice Sulphur Flask 40% increased Damage Requires Level 35 -Implicits: 2 +Implicits: 1 Creates Consecrated Ground on Use 100% increased Charge Recovery (10-20)% increased Duration @@ -192,7 +192,7 @@ The Sorrow of the Divine Sulphur Flask 40% increased Damage Requires Level 35 -Implicits: 2 +Implicits: 1 Creates Consecrated Ground on Use (25-50)% increased Duration Zealot's Oath during Flask effect @@ -227,7 +227,7 @@ Witchfire Brew Stibnite Flask 100% increased Evasion Rating Requires Level 48 -Implicits: 2 +Implicits: 1 Creates a Smoke Cloud on Use 50% increased Charges used (50-70)% increased Damage Over Time during Flask Effect diff --git a/Launch.lua b/Launch.lua index 93b67e689..08c2c042d 100644 --- a/Launch.lua +++ b/Launch.lua @@ -52,7 +52,6 @@ function launch:OnInit() -- Looks like a remote manifest, so we're probably running from a repository -- Enable dev mode to disable updates and set user path to be the script path self.devMode = true - --self.enableFlasks = true end local errMsg errMsg, self.main = PLoadModule("Modules/Main", self) diff --git a/Modules/Build.lua b/Modules/Build.lua index 3dd3616c7..0a284e535 100644 --- a/Modules/Build.lua +++ b/Modules/Build.lua @@ -22,9 +22,9 @@ function buildMode:Init(dbFileName, buildName) self.importTab = common.New("ImportTab", self) self.notesTab = common.New("NotesTab", self) self.configTab = common.New("ConfigTab", self) + self.itemsTab = common.New("ItemsTab", self) self.treeTab = common.New("TreeTab", self) self.skillsTab = common.New("SkillsTab", self) - self.itemsTab = common.New("ItemsTab", self) self.calcsTab = common.New("CalcsTab", self) -- Controls: top bar, left side @@ -90,8 +90,8 @@ function buildMode:Init(dbFileName, buildName) self.modFlag = true self.buildFlag = true end) - self.controls.characterLevel.tooltip = function() - local ret = "Experience multiplier:" + self.controls.characterLevel.tooltipFunc = function() + main:AddTooltipLine(16, "Experience multiplier:") local playerLevel = self.characterLevel local safeZone = 3 + m_floor(playerLevel / 16) for level, expLevel in ipairs(data.monsterExperienceLevelMap) do @@ -106,16 +106,14 @@ function buildMode:Init(dbFileName, buildName) mult = mult * (1 / (1 + 0.1 * (playerLevel - 94))) end if mult > 0.01 then - ret = ret .. "\n" .. level + local line = level if level >= 68 then - ret = ret .. string.format(" (Tier %d)", level - 67) - else - + line = line .. string.format(" (Tier %d)", level - 67) end - ret = ret .. string.format(": %.1f%%", mult * 100) + line = line .. string.format(": %.1f%%", mult * 100) + main:AddTooltipLine(14, line) end end - return ret end self.controls.classDrop = common.New("DropDownControl", {"LEFT",self.controls.characterLevel,"RIGHT"}, 8, 0, 100, 20, nil, function(index, val) local classId = self.tree.classNameMap[val] @@ -612,7 +610,7 @@ end -- Compare values of all display stats between the two output tables, and add any changed stats to the tooltip -- Adds the provided header line before the first stat line, if any are added -- Returns the number of stat lines added -function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header) +function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header, nodeCount) local count = 0 for _, statData in ipairs(self.displayStats) do if statData.stat and (not statData.flag or self.calcsTab.mainEnv.mainSkill.skillFlags[statData.flag]) then @@ -626,6 +624,9 @@ function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header) if statData.compPercent and (baseOutput[statData.stat] or 0) ~= 0 and (compareOutput[statData.stat] or 0) ~= 0 then line = line .. string.format(" (%+.1f%%)", (compareOutput[statData.stat] or 0) / (baseOutput[statData.stat] or 0) * 100 - 100) end + if nodeCount then + line = line .. string.format(" ^8(%+"..statData.fmt.." per point)", diff * ((statData.pc or statData.mod) and 100 or 1) / nodeCount) + end main:AddTooltipLine(14, line) count = count + 1 end diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index be4a50568..208007b64 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -571,13 +571,11 @@ end -- The following functions perform various steps in the calculations process. -- Depending on what is being done with the output, other code may run inbetween steps, however the steps must always be performed in order: -- 1. Initialise environment (initEnv) --- 2. Merge main modifiers (mergeMainMods) --- 3. Run calculations (performCalcs) +-- 2. Run calculations (performCalcs) -- -- Thus a basic calculation pass would look like this: -- -- local env = initEnv(build, mode) --- mergeMainMods(env) -- performCalcs(env) -- @@ -585,15 +583,23 @@ local tempTable1 = { } local tempTable2 = { } local tempTable3 = { } --- Initialise environment --- This will initialise the modifier databases -local function initEnv(build, mode) +-- Initialise environment: +-- 1. Initialises the modifier databases +-- 2. Merges modifiers for all items +-- 3. Builds a list of jewels with radius functions +-- 4. Merges modifiers for all allocated passive nodes +-- 5. Builds a list of active skills and their supports +-- 6. Builds modifier lists for all active skills +local function initEnv(build, mode, override) + override = override or { } + local env = { } env.build = build env.configInput = build.configTab.input env.calcsInput = build.calcsTab.input env.mode = mode - env.classId = build.spec.curClassId + env.spec = override.spec or build.spec + env.classId = env.spec.curClassId -- Initialise modifier database with base values local modDB = common.New("ModDB") @@ -675,19 +681,6 @@ local function initEnv(build, mode) modDB:AddList(build.configTab.modList) enemyDB:AddList(build.configTab.enemyModList) - return env -end - --- This function: --- 1. Merges modifiers for all items --- 2. Builds a list of jewels with radius functions --- 3. Merges modifiers for all allocated passive nodes --- 4. Builds a list of active skills and their supports --- 5. Builds modifier lists for all active skills -local function mergeMainMods(env, override) - local build = env.build - override = override or { } - -- Build list of passive nodes local nodes if override.addNodes or override.removeNodes then @@ -697,13 +690,13 @@ local function mergeMainMods(env, override) nodes[node.id] = node end end - for _, node in pairs(build.spec.allocNodes) do + for _, node in pairs(env.spec.allocNodes) do if not override.removeNodes or not override.removeNodes[node] then nodes[node.id] = node end end else - nodes = build.spec.allocNodes + nodes = env.spec.allocNodes end -- Build and merge item modifiers, and create list of radius jewels @@ -715,6 +708,8 @@ local function mergeMainMods(env, override) local item if slotName == override.repSlotName then item = override.repItem + elseif slot.nodeId and override.spec then + item = build.itemsTab.list[env.spec.jewels[slot.nodeId]] else item = build.itemsTab.list[slot.selItemId] end @@ -995,6 +990,8 @@ local function mergeMainMods(env, override) for _, activeSkill in pairs(env.activeSkillList) do buildActiveSkillModList(env, activeSkill) end + + return env end -- Finalise environment and perform the calculations @@ -1115,6 +1112,24 @@ local function performCalcs(env) condList["Effective"] = true end + -- Check for extra curses + for _, value in ipairs(modDB:Sum("LIST", nil, "ExtraCurse")) do + local modList = common.New("ModList") + mergeGemMods(modList, { + level = value.level, + quality = 0, + data = data.gems[value.name], + }) + for _, mod in ipairs(modList) do + for _, tag in ipairs(mod.tagList) do + if tag.type == "GlobalEffect" and tag.effectType == "Curse" then + enemyDB:AddMod(mod) + break + end + end + end + end + -- Check for extra modifiers to apply to aura skills local extraAuraModList = { } if modDB.mods.ExtraAuraEffect then @@ -1123,7 +1138,7 @@ local function performCalcs(env) t_insert(extraAuraModList, mod.value) end end - + -- Merge auxillary skill modifiers and calculate skill life and mana reservations env.reserved_LifeBase = 0 env.reserved_LifePercent = 0 @@ -2243,10 +2258,12 @@ local function performCalcs(env) output.TotalMin = totalHitMin output.TotalMax = totalHitMax - -- Update enemy hit-by-damage-type conditions - enemyDB.conditions.HitByFireDamage = output.FireHitAverage > 0 - enemyDB.conditions.HitByColdDamage = output.ColdHitAverage > 0 - enemyDB.conditions.HitByLightningDamage = output.LightningHitAverage > 0 + if output.FireHitAverage + output.ColdHitAverage + output.LightningHitAverage > 0 then + -- Update enemy hit-by-damage-type conditions + enemyDB.conditions.HitByFireDamage = output.FireHitAverage > 0 + enemyDB.conditions.HitByColdDamage = output.ColdHitAverage > 0 + enemyDB.conditions.HitByLightningDamage = output.LightningHitAverage > 0 + end -- Calculate average damage and final DPS output.AverageHit = (totalHitMin + totalHitMax) / 2 * (1 - output.CritChance / 100) + (totalCritMin + totalCritMax) / 2 * output.CritChance / 100 @@ -2888,9 +2905,6 @@ local function getCalculator(build, fullInit, modFunc) local env = initEnv(build, "CALCULATOR") -- Save a copy of the initial mod database - if fullInit then - mergeMainMods(env) - end local initModDB = common.New("ModDB") initModDB:AddDB(env.modDB) initModDB.conditions = copyTable(env.modDB.conditions) @@ -2899,9 +2913,6 @@ local function getCalculator(build, fullInit, modFunc) initEnemyDB:AddDB(env.enemyDB) initEnemyDB.conditions = copyTable(env.enemyDB.conditions) initEnemyDB.multipliers = copyTable(env.enemyDB.multipliers) - if not fullInit then - mergeMainMods(env) - end -- Run base calculation pass performCalcs(env) @@ -2959,16 +2970,22 @@ end -- Get calculator for other changes (adding/removing nodes, items, gems, etc) function calcs.getMiscCalculator(build) - return getCalculator(build, false, function(env, override) - mergeMainMods(env, override) - end) + -- Run base calculation pass + local env = initEnv(build, "CALCULATOR") + performCalcs(env) + local baseOutput = env.output + + return function(override) + env = initEnv(build, "CALCULATOR", override) + performCalcs(env) + return env.output + end, baseOutput end -- Build output for display in the side bar or calcs tab function calcs.buildOutput(build, mode) -- Build output local env = initEnv(build, mode) - mergeMainMods(env) performCalcs(env) local output = env.output @@ -3042,6 +3059,9 @@ function calcs.buildOutput(build, mode) end end end + for _, value in ipairs(env.modDB:Sum("LIST", nil, "ExtraCurse")) do + t_insert(curseList, value.name) + end output.BuffList = table.concat(buffList, ", ") output.CombatList = table.concat(combatList, ", ") output.CurseList = table.concat(curseList, ", ") diff --git a/Modules/Data.lua b/Modules/Data.lua index 0a398a0f1..39d6dc6e0 100644 --- a/Modules/Data.lua +++ b/Modules/Data.lua @@ -120,6 +120,10 @@ SkillType = { ColdSpell = 60, -- Used for Cospri's Malice } +data.itemMods = { } +data.itemMods.Flask = LoadModule("Data/ModFlask") +data.itemMods.Jewel = LoadModule("Data/ModJewel") + data.gems = { } local function makeGemMod(modName, modType, modVal, flags, keywordFlags, ...) return { @@ -258,7 +262,7 @@ local itemTypes = { "ring", "belt", "jewel", - launch.enableFlasks and "flask" or nil, + "flask", } for _, type in pairs(itemTypes) do LoadModule("Data/Bases/"..type, data.itemBases) diff --git a/Modules/ItemTools.lua b/Modules/ItemTools.lua index 6a6727b6a..1cb534727 100644 --- a/Modules/ItemTools.lua +++ b/Modules/ItemTools.lua @@ -98,8 +98,13 @@ function itemLib.parseItemRaw(item) item.base = data.itemBases[item.baseName] item.modLines = { } item.implicitLines = 0 + item.buffLines = 0 + item.affixes = data.itemMods[item.base and item.base.type] + item.prefixes = { } + item.suffixes = { } local flaskBuffLines = { } if item.base and item.base.flask and item.base.flask.buff then + item.buffLines = #item.base.flask.buff for _, line in ipairs(item.base.flask.buff) do flaskBuffLines[line] = true local modList, extra = modLib.parseMod(line) @@ -116,7 +121,7 @@ function itemLib.parseItemRaw(item) elseif line == "--------" then gameModeSection = gameModeSection + 1 if gameModeStage == "IMPLICIT" then - item.implicitLines = #item.modLines + item.implicitLines = #item.modLines - item.buffLines gameModeStage = "FINDEXPLICIT" elseif gameModeStage == "EXPLICIT" then gameModeStage = "DONE" @@ -166,6 +171,12 @@ function itemLib.parseItemRaw(item) item.variant = tonumber(specVal) elseif specName == "League" then item.league = specVal + elseif specName == "Crafted" then + item.crafted = true + elseif specName == "Prefix" then + t_insert(item.prefixes, specVal) + elseif specName == "Suffix" then + t_insert(item.suffixes, specVal) elseif specName == "Implicits" then item.implicitLines = tonumber(specVal) gameModeStage = "EXPLICIT" @@ -238,6 +249,14 @@ function itemLib.parseItemRaw(item) elseif mode == "GAME" and not foundExplicit then item.implicitLines = 0 end + item.affixLimit = 0 + if item.crafted and item.affixes then + if item.rarity == "MAGIC" then + item.affixLimit = 2 + elseif item.rarity == "RARE" then + item.affixLimit = (item.base.type == "Jewel" and 4 or 6) + end + end if not item.corrupted and not item.uniqueID and item.base and (item.base.armour or item.base.weapon or item.base.flask) then item.quality = 20 end @@ -266,6 +285,15 @@ function itemLib.createItemRaw(item) if item.unreleased then t_insert(rawLines, "Unreleased: true") end + if item.crafted then + t_insert(rawLines, "Crafted: true") + for _, name in ipairs(item.prefixes or { }) do + t_insert(rawLines, "Prefix: "..name) + end + for _, name in ipairs(item.suffixes or { }) do + t_insert(rawLines, "Suffix: "..name) + end + end if item.itemLevel then t_insert(rawLines, "Item Level: "..item.itemLevel) end @@ -296,21 +324,23 @@ function itemLib.createItemRaw(item) end t_insert(rawLines, "Implicits: "..item.implicitLines) for _, modLine in ipairs(item.modLines) do - local line = modLine.line - if modLine.range then - line = "{range:"..round(modLine.range,2).."}" .. line - end - if modLine.crafted then - line = "{crafted}" .. line - end - if modLine.variantList then - local varSpec - for varId in pairs(modLine.variantList) do - varSpec = (varSpec and varSpec.."," or "") .. varId + if not modLine.buff then + local line = modLine.line + if modLine.range then + line = "{range:"..round(modLine.range,2).."}" .. line + end + if modLine.crafted then + line = "{crafted}" .. line + end + if modLine.variantList then + local varSpec + for varId in pairs(modLine.variantList) do + varSpec = (varSpec and varSpec.."," or "") .. varId + end + line = "{variant:"..varSpec.."}"..line end - line = "{variant:"..varSpec.."}"..line + t_insert(rawLines, line) end - t_insert(rawLines, line) end if item.corrupted then t_insert(rawLines, "Corrupted") @@ -318,6 +348,40 @@ function itemLib.createItemRaw(item) return table.concat(rawLines, "\n") end +-- Rebuild explicit modifiers using the item's affixes +function itemLib.craftItem(item) + local ranges = { } + for l = item.buffLines + item.implicitLines + 1, #item.modLines do + ranges[item.modLines[l].line] = item.modLines[l].range + item.modLines[l] = nil + end + local newName = item.baseName + for _, list in ipairs({item.prefixes,item.suffixes}) do + for i = 1, item.affixLimit/2 do + local name = list[i] + if not name then + list[i] = "None" + end + local mod = item.affixes[name] + if mod then + if mod.type == "Prefix" then + newName = name .. " " .. newName + elseif mod.type == "Suffix" then + newName = newName .. " " .. name + end + for _, line in ipairs(mod) do + t_insert(item.modLines, { line = line, range = ranges[line] }) + end + end + end + end + if item.rarity == "MAGIC" then + item.name = newName + end + item.raw = itemLib.createItemRaw(item) + itemLib.parseItemRaw(item) +end + -- Return the name of the slot this item is equipped in function itemLib.getPrimarySlotForItem(item) if item.base.weapon then diff --git a/Modules/Main.lua b/Modules/Main.lua index 0f2ed8979..0fe942539 100644 --- a/Modules/Main.lua +++ b/Modules/Main.lua @@ -48,9 +48,9 @@ local classList = { "PassiveTree", "PassiveSpec", "PassiveTreeView", + "PassiveSpecListControl", "SkillsTab", "SkillListControl", - "SlotSelectControl", "GemSelectControl", "ItemsTab", "ItemSlotControl", @@ -389,9 +389,9 @@ function main:DrawCheckMark(x, y, size) DrawImageQuad(nil, x + size * 0.40, y + size * 0.90, x + size * 0.35, y + size * 0.75, x + size * 0.80, y + size * 0.10, x + size * 0.90, y + size * 0.20) end -function main:OpenPopup(width, height, title, controls, enterControl, defaultControl) - local popup = common.New("PopupDialog", width, height, title, controls, enterControl, defaultControl) - t_insert(self.popups, popup) +function main:OpenPopup(width, height, title, controls, enterControl, defaultControl, escapeControl) + local popup = common.New("PopupDialog", width, height, title, controls, enterControl, defaultControl, escapeControl) + t_insert(self.popups, 1, popup) return popup end @@ -440,6 +440,9 @@ function main:AddTooltipSeparator(size) end function main:DrawTooltip(x, y, w, h, viewPort, col, center) + if #self.tooltipLines == 0 then + return + end local ttW, ttH = 0, 0 for i, data in ipairs(self.tooltipLines) do if data.text or (self.tooltipLines[i - 1] and self.tooltipLines[i + 1] and self.tooltipLines[i + 1].text) then diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 6bc959315..853573169 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -57,6 +57,7 @@ local modNameList = { ["maximum life"] = "Life", ["mana"] = "Mana", ["maximum mana"] = "Mana", + ["mana regeneration"] = "ManaRegen", ["mana regeneration rate"] = "ManaRegen", ["mana cost"] = "ManaCost", ["mana cost of skills"] = "ManaCost", @@ -633,6 +634,8 @@ local specialModList = { ["ignited enemies burn (%d+)%% faster"] = function(num) return { mod("IgniteBurnRate", "INC", num) } end, ["enemies ignited by an attack burn (%d+)%% faster"] = function(num) return { mod("IgniteBurnRate", "INC", num, nil, ModFlag.Attack) } end, ["gain unholy might during flask effect"] = { mod("Misc", "LIST", { type = "Condition", var = "UnholyMight" }, { type = "Condition", var = "UsingFlask" }) }, + ["zealot's oath during flask effect"] = { mod("ZealotsOath", "FLAG", true, { type = "Condition", var = "UsingFlask" }) }, + ["grants level (%d+) (.+) curse aura during flask effect"] = function(num, _, skill) return { mod("ExtraCurse", "LIST", { name = gemNameLookup[skill:gsub(" skill","")] or "Unknown", level = num }, { type = "Condition", var = "UsingFlask" }) } end, } local keystoneList = { -- List of keystones that can be found on uniques @@ -825,12 +828,14 @@ local jewelFuncs = { -- If a match is found, returns the corresponding value from the pattern list, plus the remainder of the line and a table of captures local function scan(line, patternList, plain) local bestIndex, bestEndIndex + local bestPattern = "" local bestMatch = { nil, line, nil } for pattern, patternVal in pairs(patternList) do local index, endIndex, cap1, cap2, cap3, cap4, cap5 = line:lower():find(pattern, 1, plain) - if index and (not bestIndex or index < bestIndex or (index == bestIndex and endIndex > bestEndIndex)) then + if index and (not bestIndex or index < bestIndex or (index == bestIndex and (endIndex > bestEndIndex or (endIndex == bestEndIndex and #pattern > #bestPattern)))) then bestIndex = index bestEndIndex = endIndex + bestPattern = pattern bestMatch = { patternVal, line:sub(1, index - 1)..line:sub(endIndex + 1, -1), { cap1, cap2, cap3, cap4, cap5 } } end end @@ -861,7 +866,7 @@ local function parseMod(line, order) local modForm, formCap modForm, line, formCap = scan(line, formList) if not modForm then - return + return nil, line end local num = tonumber(formCap[1]) diff --git a/PathOfBuilding.sln b/PathOfBuilding.sln index 864e0f9f7..b96f27c78 100644 --- a/PathOfBuilding.sln +++ b/PathOfBuilding.sln @@ -84,6 +84,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{7EE4 Classes\ModList.lua = Classes\ModList.lua Classes\NotesTab.lua = Classes\NotesTab.lua Classes\PassiveSpec.lua = Classes\PassiveSpec.lua + Classes\PassiveSpecListControl.lua = Classes\PassiveSpecListControl.lua Classes\PassiveTree.lua = Classes\PassiveTree.lua Classes\PassiveTreeView.lua = Classes\PassiveTreeView.lua Classes\PopupDialog.lua = Classes\PopupDialog.lua @@ -92,7 +93,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{7EE4 Classes\SkillListControl.lua = Classes\SkillListControl.lua Classes\SkillsTab.lua = Classes\SkillsTab.lua Classes\SliderControl.lua = Classes\SliderControl.lua - Classes\SlotSelectControl.lua = Classes\SlotSelectControl.lua Classes\TextListControl.lua = Classes\TextListControl.lua Classes\TreeTab.lua = Classes\TreeTab.lua Classes\UndoHandler.lua = Classes\UndoHandler.lua @@ -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\ModFlask.lua = Data\ModFlask.lua + Data\ModJewel.lua = Data\ModJewel.lua Data\New.lua = Data\New.lua Data\Rares.lua = Data\Rares.lua EndProjectSection diff --git a/README.md b/README.md index bfb38659e..a10569f62 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,28 @@ 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.0 - 2017/02/15 +This update adds support for Flasks: + * Flask slots have been added to the Items tab. Checkboxes next to each slot allow the flasks to be individually activated. + * All flask-related modifiers are now supported + * Flask modifiers have been added to the belt templates; this will not affect items previously created from templates + * All unique flasks have been added to the Uniques database + * There will not be templates for flasks; custom flasks can be created using the new crafting system +Additionally, a new item crafting system has been added: + * You can access it by clicking "Craft item..." in the Items tab + * You can choose the rarity and base type of the item from lists + * For flasks and jewels, you can choose the item's affixes from lists once you've created the item + * For other items, modifiers must be added manually for now, so you may continue to use templates for them +Other changes: + * You can now have multiple passive trees within one build! + * To add more trees, select "Manage trees..." from the new dropdown at the bottom left corner of the Tree tab + * Different trees may have different jewels socketed in them + * Hovering over a passive tree in the dropdown will show you the stat differences from switching to that tree + * Hovering over gem names in the gem dropdown now shows the stat differences from selecting that gem + * Hovering over the gem enable checkbox now shows the stat differences from enabling/disabling that gem + * Passive node stat differences now show the value per point when showing the difference from multiple passives + * Fixed issue preventing Elemental Equilibrium from functioning correctly with skills that don't hit + ### 1.2.41 - 2017/02/13 * The program now shows the save prompt before updating if there are unsaved changes * Added options to the Configuration tab for: Enemy Blinded, Dealt Non-Crit Recently, Ignited/Frozen an Enemy Recently diff --git a/changelog.txt b/changelog.txt index 19f961a65..7abf088d5 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,24 @@ +VERSION[1.3.0][2017/02/15] +This update adds support for Flasks: + * Flask slots have been added to the Items tab. Checkboxes next to each slot allow the flasks to be individually activated. + * All flask-related modifiers are now supported + * Flask modifiers have been added to the belt templates; this will not affect items previously created from templates + * All unique flasks have been added to the Uniques database + * There will not be templates for flasks; custom flasks can be created using the new crafting system +Additionally, a new item crafting system has been added: + * You can access it by clicking "Craft item..." in the Items tab + * You can choose the rarity and base type of the item from lists + * For flasks and jewels, you can choose the item's affixes from lists once you've created the item + * For other items, modifiers must be added manually for now, so you may continue to use templates for them +Other changes: + * You can now have multiple passive trees within one build! + * To add more trees, select "Manage trees..." from the new dropdown at the bottom left corner of the Tree tab + * Different trees may have different jewels socketed in them + * Hovering over a passive tree in the dropdown will show you the stat differences from switching to that tree + * Hovering over gem names in the gem dropdown now shows the stat differences from selecting that gem + * Hovering over the gem enable checkbox now shows the stat differences from enabling/disabling that gem + * Passive node stat differences now show the value per point when showing the difference from multiple passives + * Fixed issue preventing Elemental Equilibrium from functioning correctly with skills that don't hit VERSION[1.2.41][2017/02/13] * The program now shows the save prompt before updating if there are unsaved changes * Added options to the Configuration tab for: Enemy Blinded, Dealt Non-Crit Recently, Ignited/Frozen an Enemy Recently diff --git a/manifest.xml b/manifest.xml index ae47ce7ec..ea3938719 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,61 +1,63 @@ - + - + - + - + - - + + - - - - + + + + - + - + + - - + + - + - - + - + - + - - - - + + + + + + - + @@ -63,24 +65,24 @@ - + - - + + - - - + + + - + - + - + @@ -90,7 +92,7 @@ - + @@ -103,7 +105,7 @@ - + diff --git a/runtime-win32.zip b/runtime-win32.zip index 7633beb03..9623a2768 100644 Binary files a/runtime-win32.zip and b/runtime-win32.zip differ