From b1c9eb5cb6d124695ee0bd5c16b495f661f92ccb Mon Sep 17 00:00:00 2001 From: Openarl Date: Sat, 11 Feb 2017 00:24:29 +1000 Subject: [PATCH] Release 1.2.40 - Added movement speed calculation - Fixed ignite breakdown - Changed "frozen, shocked, or ignited enemies", and similar, to use varLists (to fix condition detection) - Many changes for flask support --- Classes/ConfigTab.lua | 11 +- Classes/ImportTab.lua | 30 +++-- Classes/ItemsTab.lua | 35 ++++- Data/Bases/body.lua | 202 ++++++++++++++--------------- Data/Bases/flask.lua | 234 +++++++++++++++++++++++++++++++++ Data/Bases/shield.lua | 176 ++++++++++++------------- Data/Uniques/flask.lua | 270 +++++++++++++++++++++++++++++++++++++++ Launch.lua | 1 + Modules/Build.lua | 127 +++++++++--------- Modules/CalcSections.lua | 1 + Modules/Calcs.lua | 33 +++-- Modules/Data.lua | 2 + Modules/ItemTools.lua | 62 ++++++++- Modules/Main.lua | 4 +- Modules/ModParser.lua | 39 +++++- PathOfBuilding.sln | 2 + README.md | 5 + changelog.txt | 4 + manifest.xml | 32 ++--- 19 files changed, 969 insertions(+), 301 deletions(-) create mode 100644 Data/Bases/flask.lua create mode 100644 Data/Uniques/flask.lua diff --git a/Classes/ConfigTab.lua b/Classes/ConfigTab.lua index 6157afbb..8dd8900c 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) + { var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", ifCond = "UsingFlask", apply = function(val, modList, enemyModList) -- FIXME Flask release (autocondition note) 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) @@ -179,6 +179,13 @@ local varList = { modList:NewMod("Misc", "LIST", { type = "EnemyCondition", var = "HitByLightningDamage" }, "Config") end }, } +if launch.enableFlasks then -- FIXME Flask release + t_insert(varList, { var = "enableFlask1", type = "check", label = "Flask 1", }) + t_insert(varList, { var = "enableFlask2", type = "check", label = "Flask 2", }) + t_insert(varList, { var = "enableFlask3", type = "check", label = "Flask 3", }) + t_insert(varList, { var = "enableFlask4", type = "check", label = "Flask 4", }) + t_insert(varList, { var = "enableFlask5", type = "check", label = "Flask 5", }) +end local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost", "Control", function(self, build) self.UndoHandler() @@ -246,7 +253,7 @@ local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost" return self.build.calcsTab.mainEnv.conditionsUsed[varData.ifCond] end control.tooltip = function() - if launch.devMode and IsKeyDown("CTRL") then + if launch.devMode and IsKeyDown("ALT") then local out = varData.tooltip or "" for _, mod in ipairs(self.build.calcsTab.mainEnv.conditionsUsed[varData.ifCond]) do out = (#out > 0 and out.."\n" or out) .. modLib.formatMod(mod) .. "|" .. mod.source diff --git a/Classes/ImportTab.lua b/Classes/ImportTab.lua index 654d35de..c63c77bd 100644 --- a/Classes/ImportTab.lua +++ b/Classes/ImportTab.lua @@ -327,6 +327,8 @@ 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 + slotName = "Flask "..(itemData.x + 1) else slotName = slotMap[itemData.inventoryId] end @@ -403,31 +405,35 @@ function ImportTabClass:ImportItem(itemData, sockets) if itemData.implicitMods then item.implicitLines = item.implicitLines + #itemData.implicitMods for _, line in ipairs(itemData.implicitMods) do - line = line:gsub("\n"," ") - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { } }) + 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 end end if itemData.enchantMods then item.implicitLines = item.implicitLines + #itemData.enchantMods for _, line in ipairs(itemData.enchantMods) do - line = line:gsub("\n"," ") - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { }, crafted = true }) + 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 end end if itemData.explicitMods then for _, line in ipairs(itemData.explicitMods) do - line = line:gsub("\n"," ") - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { } }) + 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 end end if itemData.craftedMods then for _, line in ipairs(itemData.craftedMods) do - line = line:gsub("\n"," ") - local modList, extra = modLib.parseMod(line) - t_insert(item.modLines, { line = line, extra = extra, mods = modList or { }, crafted = true }) + 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 end end diff --git a/Classes/ItemsTab.lua b/Classes/ItemsTab.lua index 7bab8209..2cc8c59d 100644 --- a/Classes/ItemsTab.lua +++ b/Classes/ItemsTab.lua @@ -12,6 +12,13 @@ local t_remove = table.remove local s_format = string.format 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 ItemsTabClass = common.NewClass("ItemsTab", "UndoHandler", "ControlHost", "Control", function(self, build) self.UndoHandler() @@ -513,6 +520,32 @@ function ItemsTabClass:AddItemTooltip(item, slot, dbMode) main:AddTooltipLine(16, s_format("^x7F7F7F%s: %s%d", def.label, itemVal ~= base.armour[def.var.."Base"] and data.colorCodes.MAGIC or "^7", itemVal)) end end + elseif base.flask then + -- Flask-specific info + local flaskData = item.flaskData + if item.quality > 0 then + main:AddTooltipLine(16, s_format("^x7F7F7FQuality: "..data.colorCodes.MAGIC.."+%d%%", item.quality)) + end + if flaskData.lifeTotal then + main:AddTooltipLine(16, s_format("^x7F7F7FRecovers %s%d ^x7F7F7FLife over %s%.1f0 ^x7F7F7FSeconds", flaskData.lifeTotal ~= base.flask.life and data.colorCodes.MAGIC or "^7", flaskData.lifeTotal, flaskData.lifeDuration ~= base.flask.duration and data.colorCodes.MAGIC or "^7", flaskData.lifeDuration)) + end + if flaskData.manaTotal then + main:AddTooltipLine(16, s_format("^x7F7F7FRecovers %s%d ^x7F7F7FMana over %s%.1f0 ^x7F7F7FSeconds", flaskData.manaTotal ~= base.flask.mana and data.colorCodes.MAGIC or "^7", flaskData.manaTotal, flaskData.manaDuration ~= base.flask.duration and data.colorCodes.MAGIC or "^7", flaskData.manaDuration)) + end + if not flaskData.lifeTotal and not flaskData.manaTotal then + main:AddTooltipLine(16, s_format("^x7F7F7FLasts %s%.2f ^x7F7F7FSeconds", flaskData.duration ~= base.flask.duration and data.colorCodes.MAGIC or "^7", flaskData.duration)) + end + main:AddTooltipLine(16, s_format("^x7F7F7FConsumes %s%d ^x7F7F7Fof %s%d ^x7F7F7FCharges on use", + flaskData.chargesUsed ~= base.flask.chargesUsed and data.colorCodes.MAGIC or "^7", + flaskData.chargesUsed, + flaskData.chargesMax ~= base.flask.chargesMax and data.colorCodes.MAGIC or "^7", + flaskData.chargesMax + )) + for _, modLine in pairs(item.modLines) do + if modLine.buff then + main:AddTooltipLine(16, (modLine.extra and data.colorCodes.UNSUPPORTED or data.colorCodes.MAGIC) .. modLine.line) + end + end elseif item.type == "Jewel" then -- Jewel-specific info if item.jewelRadiusIndex then @@ -540,7 +573,7 @@ function ItemsTabClass:AddItemTooltip(item, slot, dbMode) -- Implicit/explicit modifiers if item.modLines[1] then for index, modLine in pairs(item.modLines) do - if not modLine.variantList or modLine.variantList[item.variant] then + if not modLine.buff and (not modLine.variantList or modLine.variantList[item.variant]) then local line = (not dbMode and modLine.range and itemLib.applyRange(modLine.line, modLine.range)) or modLine.line if not line:match("^%+?0[^%.]") and not line:match(" 0%-0 ") and not line:match(" 0 to 0 ") then -- Hack to hide 0-value modifiers local colorCode diff --git a/Data/Bases/body.lua b/Data/Bases/body.lua index 0bd2cc9d..e8bbebd6 100644 --- a/Data/Bases/body.lua +++ b/Data/Bases/body.lua @@ -3,83 +3,83 @@ local itemBases = ... itemBases["Plate Vest"] = { type = "Body Armour", - armour = { armourBase = 14, }, + armour = { armourBase = 14, movementPenalty = 3, }, req = { }, } itemBases["Chestplate"] = { type = "Body Armour", armour = { armourBase = 49, }, - req = { level = 6, str = 25, }, + req = { level = 6, str = 25, movementPenalty = 5, }, } itemBases["Copper Plate"] = { type = "Body Armour", - armour = { armourBase = 126, }, + armour = { armourBase = 126, movementPenalty = 5, }, req = { level = 17, str = 53, }, } itemBases["War Plate"] = { type = "Body Armour", - armour = { armourBase = 154, }, + armour = { armourBase = 154, movementPenalty = 5, }, req = { level = 21, str = 63, }, } itemBases["Full Plate"] = { type = "Body Armour", - armour = { armourBase = 203, }, + armour = { armourBase = 203, movementPenalty = 5, }, req = { level = 28, str = 81, }, } itemBases["Arena Plate"] = { type = "Body Armour", - armour = { armourBase = 231, }, + armour = { armourBase = 231, movementPenalty = 5, }, req = { level = 32, str = 91, }, } itemBases["Lordly Plate"] = { type = "Body Armour", - armour = { armourBase = 252, }, + armour = { armourBase = 252, movementPenalty = 5, }, req = { level = 35, str = 99, }, } itemBases["Bronze Plate"] = { type = "Body Armour", - armour = { armourBase = 266, }, + armour = { armourBase = 266, movementPenalty = 5, }, req = { level = 37, str = 104, }, } itemBases["Battle Plate"] = { type = "Body Armour", - armour = { armourBase = 294, }, + armour = { armourBase = 294, movementPenalty = 5, }, req = { level = 41, str = 114, }, } itemBases["Sun Plate"] = { type = "Body Armour", - armour = { armourBase = 322, }, + armour = { armourBase = 322, movementPenalty = 5, }, req = { level = 45, str = 124, }, } itemBases["Colosseum Plate"] = { type = "Body Armour", - armour = { armourBase = 350, }, + armour = { armourBase = 350, movementPenalty = 5, }, req = { level = 49, str = 134, }, } itemBases["Majestic Plate"] = { type = "Body Armour", - armour = { armourBase = 378, }, + armour = { armourBase = 378, movementPenalty = 5, }, req = { level = 53, str = 144, }, } itemBases["Golden Plate"] = { type = "Body Armour", - armour = { armourBase = 399, }, + armour = { armourBase = 399, movementPenalty = 5, }, req = { level = 56, str = 152, }, } itemBases["Crusader Plate"] = { type = "Body Armour", - armour = { armourBase = 428, }, + armour = { armourBase = 428, movementPenalty = 5, }, req = { level = 59, str = 160, }, } itemBases["Astral Plate"] = { type = "Body Armour", implicit = "+(8 to 12)% to all Elemental Resistances", - armour = { armourBase = 507, }, + armour = { armourBase = 507, movementPenalty = 5, }, req = { level = 62, str = 180, }, } itemBases["Gladiator Plate"] = { type = "Body Armour", - armour = { armourBase = 526, }, + armour = { armourBase = 526, movementPenalty = 5, }, req = { level = 65, str = 177, }, } itemBases["Glorious Plate"] = { @@ -91,82 +91,82 @@ itemBases["Glorious Plate"] = { itemBases["Shabby Jerkin"] = { type = "Body Armour", - armour = { evasionBase = 21, }, + armour = { evasionBase = 21, movementPenalty = 3, }, req = { dex = 14, }, } itemBases["Strapped Leather"] = { type = "Body Armour", - armour = { evasionBase = 70, }, + armour = { evasionBase = 70, movementPenalty = 3, }, req = { level = 9, dex = 32, }, } itemBases["Buckskin Tunic"] = { type = "Body Armour", - armour = { evasionBase = 126, }, + armour = { evasionBase = 126, movementPenalty = 3, }, req = { level = 17, dex = 53, }, } itemBases["Wild Leather"] = { type = "Body Armour", - armour = { evasionBase = 182, }, + armour = { evasionBase = 182, movementPenalty = 3, }, req = { level = 25, dex = 73, }, } itemBases["Full Leather"] = { type = "Body Armour", - armour = { evasionBase = 203, }, + armour = { evasionBase = 203, movementPenalty = 3, }, req = { level = 28, dex = 81, }, } itemBases["Sun Leather"] = { type = "Body Armour", - armour = { evasionBase = 231, }, + armour = { evasionBase = 231, movementPenalty = 3, }, req = { level = 32, dex = 91, }, } itemBases["Thief's Garb"] = { type = "Body Armour", - armour = { evasionBase = 252, }, + armour = { evasionBase = 252, movementPenalty = 3, }, req = { level = 35, dex = 99, }, } itemBases["Eelskin Tunic"] = { type = "Body Armour", - armour = { evasionBase = 266, }, + armour = { evasionBase = 266, movementPenalty = 3, }, req = { level = 37, dex = 104, }, } itemBases["Frontier Leather"] = { type = "Body Armour", - armour = { evasionBase = 294, }, + armour = { evasionBase = 294, movementPenalty = 3, }, req = { level = 41, dex = 114, }, } itemBases["Glorious Leather"] = { type = "Body Armour", - armour = { evasionBase = 322, }, + armour = { evasionBase = 322, movementPenalty = 3, }, req = { level = 45, dex = 124, }, } itemBases["Coronal Leather"] = { type = "Body Armour", - armour = { evasionBase = 350, }, + armour = { evasionBase = 350, movementPenalty = 3, }, req = { level = 49, dex = 134, }, } itemBases["Cutthroat's Garb"] = { type = "Body Armour", - armour = { evasionBase = 378, }, + armour = { evasionBase = 378, movementPenalty = 3, }, req = { level = 53, dex = 144, }, } itemBases["Sharkskin Tunic"] = { type = "Body Armour", - armour = { evasionBase = 399, }, + armour = { evasionBase = 399, movementPenalty = 3, }, req = { level = 56, dex = 152, }, } itemBases["Destiny Leather"] = { type = "Body Armour", - armour = { evasionBase = 428, }, + armour = { evasionBase = 428, movementPenalty = 3, }, req = { level = 59, dex = 160, }, } itemBases["Exquisite Leather"] = { type = "Body Armour", - armour = { evasionBase = 502, }, + armour = { evasionBase = 502, movementPenalty = 3, }, req = { level = 62, dex = 170, }, } itemBases["Zodiac Leather"] = { type = "Body Armour", - armour = { evasionBase = 609, }, + armour = { evasionBase = 609, movementPenalty = 3, }, req = { level = 65, dex = 197, }, } itemBases["Assassin's Garb"] = { @@ -179,356 +179,356 @@ itemBases["Assassin's Garb"] = { itemBases["Simple Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 11, }, + armour = { energyShieldBase = 11, movementPenalty = 3, }, req = { int = 17, }, } itemBases["Silken Vest"] = { type = "Body Armour", - armour = { energyShieldBase = 27, }, + armour = { energyShieldBase = 27, movementPenalty = 3, }, req = { level = 11, int = 37, }, } itemBases["Scholar's Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 41, }, + armour = { energyShieldBase = 41, movementPenalty = 3, }, req = { level = 18, int = 55, }, } itemBases["Silken Garb"] = { type = "Body Armour", - armour = { energyShieldBase = 55, }, + armour = { energyShieldBase = 55, movementPenalty = 3, }, req = { level = 25, int = 73, }, } itemBases["Mage's Vestment"] = { type = "Body Armour", - armour = { energyShieldBase = 61, }, + armour = { energyShieldBase = 61, movementPenalty = 3, }, req = { level = 28, int = 81, }, } itemBases["Silk Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 69, }, + armour = { energyShieldBase = 69, movementPenalty = 3, }, req = { level = 32, int = 91, }, } itemBases["Cabalist Regalia"] = { type = "Body Armour", - armour = { energyShieldBase = 75, }, + armour = { energyShieldBase = 75, movementPenalty = 3, }, req = { level = 35, int = 99, }, } itemBases["Sage's Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 79, }, + armour = { energyShieldBase = 79, movementPenalty = 3, }, req = { level = 37, int = 104, }, } itemBases["Silken Wrap"] = { type = "Body Armour", - armour = { energyShieldBase = 87, }, + armour = { energyShieldBase = 87, movementPenalty = 3, }, req = { level = 41, int = 114, }, } itemBases["Conjurer's Vestment"] = { type = "Body Armour", - armour = { energyShieldBase = 95, }, + armour = { energyShieldBase = 95, movementPenalty = 3, }, req = { level = 45, int = 124, }, } itemBases["Spidersilk Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 103, }, + armour = { energyShieldBase = 103, movementPenalty = 3, }, req = { level = 49, int = 134, }, } itemBases["Destroyer Regalia"] = { type = "Body Armour", - armour = { energyShieldBase = 111, }, + armour = { energyShieldBase = 111, movementPenalty = 3, }, req = { level = 53, int = 144, }, } itemBases["Savant's Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 117, }, + armour = { energyShieldBase = 117, movementPenalty = 3, }, req = { level = 56, int = 152, }, } itemBases["Necromancer Silks"] = { type = "Body Armour", - armour = { energyShieldBase = 125, }, + armour = { energyShieldBase = 125, movementPenalty = 3, }, req = { level = 59, int = 160, }, } itemBases["Occultist's Vestment"] = { type = "Body Armour", implicit = "(3 to 10)% increased Spell Damage", - armour = { energyShieldBase = 140, }, + armour = { energyShieldBase = 140, movementPenalty = 3, }, req = { level = 62, int = 180, }, } itemBases["Widowsilk Robe"] = { type = "Body Armour", - armour = { energyShieldBase = 161, }, + armour = { energyShieldBase = 161, movementPenalty = 3, }, req = { level = 65, int = 187, }, } itemBases["Vaal Regalia"] = { type = "Body Armour", - armour = { energyShieldBase = 175, }, + armour = { energyShieldBase = 175, movementPenalty = 3, }, req = { level = 68, int = 194, }, } itemBases["Scale Vest"] = { type = "Body Armour", - armour = { armourBase = 19, evasionBase = 19, }, + armour = { armourBase = 19, evasionBase = 19, movementPenalty = 3, }, req = { }, } itemBases["Light Brigandine"] = { type = "Body Armour", - armour = { armourBase = 35, evasionBase = 35, }, + armour = { armourBase = 35, evasionBase = 35, movementPenalty = 3, }, req = { level = 8, str = 16, dex = 16, }, } itemBases["Scale Doublet"] = { type = "Body Armour", - armour = { armourBase = 69, evasionBase = 69, }, + armour = { armourBase = 69, evasionBase = 69, movementPenalty = 3, }, req = { level = 17, str = 28, dex = 28, }, } itemBases["Infantry Brigandine"] = { type = "Body Armour", - armour = { armourBase = 85, evasionBase = 85, }, + armour = { armourBase = 85, evasionBase = 85, movementPenalty = 3, }, req = { level = 21, str = 34, dex = 34, }, } itemBases["Full Scale Armour"] = { type = "Body Armour", - armour = { armourBase = 112, evasionBase = 112, }, + armour = { armourBase = 112, evasionBase = 112, movementPenalty = 3, }, req = { level = 28, str = 43, dex = 43, }, } itemBases["Soldier's Brigandine"] = { type = "Body Armour", - armour = { armourBase = 127, evasionBase = 127, }, + armour = { armourBase = 127, evasionBase = 127, movementPenalty = 3, }, req = { level = 32, str = 48, dex = 48, }, } itemBases["Field Lamellar"] = { type = "Body Armour", - armour = { armourBase = 138, evasionBase = 138, }, + armour = { armourBase = 138, evasionBase = 138, movementPenalty = 3, }, req = { level = 35, str = 53, dex = 53, }, } itemBases["Wyrmscale Doublet"] = { type = "Body Armour", - armour = { armourBase = 150, evasionBase = 150, }, + armour = { armourBase = 150, evasionBase = 150, movementPenalty = 3, }, req = { level = 38, str = 57, dex = 57, }, } itemBases["Hussar Brigandine"] = { type = "Body Armour", - armour = { armourBase = 165, evasionBase = 165, }, + armour = { armourBase = 165, evasionBase = 165, movementPenalty = 3, }, req = { level = 42, str = 62, dex = 62, }, } itemBases["Full Wyrmscale"] = { type = "Body Armour", - armour = { armourBase = 181, evasionBase = 181, }, + armour = { armourBase = 181, evasionBase = 181, movementPenalty = 3, }, req = { level = 46, str = 68, dex = 68, }, } itemBases["Commander's Brigandine"] = { type = "Body Armour", - armour = { armourBase = 196, evasionBase = 196, }, + armour = { armourBase = 196, evasionBase = 196, movementPenalty = 3, }, req = { level = 50, str = 73, dex = 73, }, } itemBases["Battle Lamellar"] = { type = "Body Armour", - armour = { armourBase = 212, evasionBase = 212, }, + armour = { armourBase = 212, evasionBase = 212, movementPenalty = 3, }, req = { level = 54, str = 79, dex = 79, }, } itemBases["Dragonscale Doublet"] = { type = "Body Armour", - armour = { armourBase = 223, evasionBase = 223, }, + armour = { armourBase = 223, evasionBase = 223, movementPenalty = 3, }, req = { level = 57, str = 83, dex = 83, }, } itemBases["Desert Brigandine"] = { type = "Body Armour", - armour = { armourBase = 268, evasionBase = 268, }, + armour = { armourBase = 268, evasionBase = 268, movementPenalty = 3, }, req = { level = 60, str = 96, dex = 96, }, } itemBases["Full Dragonscale"] = { type = "Body Armour", - armour = { armourBase = 335, evasionBase = 266, }, + armour = { armourBase = 335, evasionBase = 266, movementPenalty = 3, }, req = { level = 63, str = 115, dex = 94, }, } itemBases["General's Brigandine"] = { type = "Body Armour", - armour = { armourBase = 296, evasionBase = 296, }, + armour = { armourBase = 296, evasionBase = 296, movementPenalty = 3, }, req = { level = 66, str = 103, dex = 103, }, } itemBases["Triumphant Lamellar"] = { type = "Body Armour", - armour = { armourBase = 271, evasionBase = 340, }, + armour = { armourBase = 271, evasionBase = 340, movementPenalty = 3, }, req = { level = 69, str = 95, dex = 116, }, } itemBases["Chainmail Vest"] = { type = "Body Armour", - armour = { armourBase = 19, energyShieldBase = 7, }, + armour = { armourBase = 19, energyShieldBase = 7, movementPenalty = 5, }, req = { }, } itemBases["Chainmail Tunic"] = { type = "Body Armour", - armour = { armourBase = 35, energyShieldBase = 11, }, + armour = { armourBase = 35, energyShieldBase = 11, movementPenalty = 5, }, req = { level = 8, str = 16, int = 16, }, } itemBases["Ringmail Coat"] = { type = "Body Armour", - armour = { armourBase = 69, energyShieldBase = 21, }, + armour = { armourBase = 69, energyShieldBase = 21, movementPenalty = 5, }, req = { level = 17, str = 28, int = 28, }, } itemBases["Chainmail Doublet"] = { type = "Body Armour", - armour = { armourBase = 85, energyShieldBase = 26, }, + armour = { armourBase = 85, energyShieldBase = 26, movementPenalty = 5, }, req = { level = 21, str = 34, int = 34, }, } itemBases["Full Ringmail"] = { type = "Body Armour", - armour = { armourBase = 112, energyShieldBase = 33, }, + armour = { armourBase = 112, energyShieldBase = 33, movementPenalty = 5, }, req = { level = 28, str = 43, int = 43, }, } itemBases["Full Chainmail"] = { type = "Body Armour", - armour = { armourBase = 127, energyShieldBase = 38, }, + armour = { armourBase = 127, energyShieldBase = 38, movementPenalty = 5, }, req = { level = 32, str = 48, int = 48, }, } itemBases["Holy Chainmail"] = { type = "Body Armour", - armour = { armourBase = 138, energyShieldBase = 41, }, + armour = { armourBase = 138, energyShieldBase = 41, movementPenalty = 5, }, req = { level = 35, str = 53, int = 53, }, } itemBases["Latticed Ringmail"] = { type = "Body Armour", - armour = { armourBase = 154, energyShieldBase = 46, }, + armour = { armourBase = 154, energyShieldBase = 46, movementPenalty = 5, }, req = { level = 39, str = 59, int = 59, }, } itemBases["Crusader Chainmail"] = { type = "Body Armour", - armour = { armourBase = 169, energyShieldBase = 50, }, + armour = { armourBase = 169, energyShieldBase = 50, movementPenalty = 5, }, req = { level = 43, str = 64, int = 64, }, } itemBases["Ornate Ringmail"] = { type = "Body Armour", - armour = { armourBase = 185, energyShieldBase = 54, }, + armour = { armourBase = 185, energyShieldBase = 54, movementPenalty = 5, }, req = { level = 47, str = 69, int = 69, }, } itemBases["Chain Hauberk"] = { type = "Body Armour", - armour = { armourBase = 200, energyShieldBase = 59, }, + armour = { armourBase = 200, energyShieldBase = 59, movementPenalty = 5, }, req = { level = 51, str = 75, int = 75, }, } itemBases["Devout Chainmail"] = { type = "Body Armour", - armour = { armourBase = 215, energyShieldBase = 63, }, + armour = { armourBase = 215, energyShieldBase = 63, movementPenalty = 5, }, req = { level = 55, str = 80, int = 80, }, } itemBases["Loricated Ringmail"] = { type = "Body Armour", - armour = { armourBase = 232, energyShieldBase = 68, }, + armour = { armourBase = 232, energyShieldBase = 68, movementPenalty = 5, }, req = { level = 58, str = 84, int = 84, }, } itemBases["Conquest Chainmail"] = { type = "Body Armour", - armour = { armourBase = 276, energyShieldBase = 81, }, + armour = { armourBase = 276, energyShieldBase = 81, movementPenalty = 5, }, req = { level = 61, str = 96, int = 96, }, } itemBases["Elegant Ringmail"] = { type = "Body Armour", - armour = { armourBase = 269, energyShieldBase = 94, }, + armour = { armourBase = 269, energyShieldBase = 94, movementPenalty = 5, }, req = { level = 64, str = 90, int = 105, }, } itemBases["Saint's Hauberk"] = { type = "Body Armour", - armour = { armourBase = 315, energyShieldBase = 78, }, + armour = { armourBase = 315, energyShieldBase = 78, movementPenalty = 5, }, req = { level = 67, str = 109, int = 94, }, } itemBases["Saintly Chainmail"] = { type = "Body Armour", - armour = { armourBase = 286, energyShieldBase = 98, }, + armour = { armourBase = 286, energyShieldBase = 98, movementPenalty = 5, }, req = { level = 70, str = 99, int = 115, }, } itemBases["Padded Vest"] = { type = "Body Armour", - armour = { evasionBase = 19, energyShieldBase = 7, }, + armour = { evasionBase = 19, energyShieldBase = 7, movementPenalty = 3, }, req = { }, } itemBases["Oiled Vest"] = { type = "Body Armour", - armour = { evasionBase = 38, energyShieldBase = 13, }, + armour = { evasionBase = 38, energyShieldBase = 13, movementPenalty = 3, }, req = { level = 9, dex = 17, int = 17, }, } itemBases["Padded Jacket"] = { type = "Body Armour", - armour = { evasionBase = 73, energyShieldBase = 22, }, + armour = { evasionBase = 73, energyShieldBase = 22, movementPenalty = 3, }, req = { level = 18, dex = 30, int = 30, }, } itemBases["Oiled Coat"] = { type = "Body Armour", - armour = { evasionBase = 88, energyShieldBase = 27, }, + armour = { evasionBase = 88, energyShieldBase = 27, movementPenalty = 3, }, req = { level = 22, dex = 35, int = 35, }, } itemBases["Scarlet Raiment"] = { type = "Body Armour", - armour = { evasionBase = 112, energyShieldBase = 33, }, + armour = { evasionBase = 112, energyShieldBase = 33, movementPenalty = 3, }, req = { level = 28, dex = 43, int = 43, }, } itemBases["Waxed Garb"] = { type = "Body Armour", - armour = { evasionBase = 127, energyShieldBase = 38, }, + armour = { evasionBase = 127, energyShieldBase = 38, movementPenalty = 3, }, req = { level = 32, dex = 48, int = 48, }, } itemBases["Bone Armour"] = { type = "Body Armour", - armour = { evasionBase = 138, energyShieldBase = 41, }, + armour = { evasionBase = 138, energyShieldBase = 41, movementPenalty = 3, }, req = { level = 35, dex = 53, int = 53, }, } itemBases["Quilted Jacket"] = { type = "Body Armour", - armour = { evasionBase = 158, energyShieldBase = 47, }, + armour = { evasionBase = 158, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 40, dex = 60, int = 60, }, } itemBases["Sleek Coat"] = { type = "Body Armour", - armour = { evasionBase = 173, energyShieldBase = 51, }, + armour = { evasionBase = 173, energyShieldBase = 51, movementPenalty = 3, }, req = { level = 44, dex = 65, int = 65, }, } itemBases["Crimson Raiment"] = { type = "Body Armour", - armour = { evasionBase = 189, energyShieldBase = 55, }, + armour = { evasionBase = 189, energyShieldBase = 55, movementPenalty = 3, }, req = { level = 48, dex = 71, int = 71, }, } itemBases["Lacquered Garb"] = { type = "Body Armour", - armour = { evasionBase = 204, energyShieldBase = 60, }, + armour = { evasionBase = 204, energyShieldBase = 60, movementPenalty = 3, }, req = { level = 52, dex = 76, int = 76, }, } itemBases["Crypt Armour"] = { type = "Body Armour", - armour = { evasionBase = 219, energyShieldBase = 64, }, + armour = { evasionBase = 219, energyShieldBase = 64, movementPenalty = 3, }, req = { level = 56, dex = 82, int = 82, }, } itemBases["Sentinel Jacket"] = { type = "Body Armour", - armour = { evasionBase = 235, energyShieldBase = 69, }, + armour = { evasionBase = 235, energyShieldBase = 69, movementPenalty = 3, }, req = { level = 59, dex = 86, int = 86, }, } itemBases["Varnished Coat"] = { type = "Body Armour", - armour = { evasionBase = 276, energyShieldBase = 81, }, + armour = { evasionBase = 276, energyShieldBase = 81, movementPenalty = 3, }, req = { level = 62, dex = 96, int = 96, }, } itemBases["Blood Raiment"] = { type = "Body Armour", - armour = { evasionBase = 311, energyShieldBase = 75, }, + armour = { evasionBase = 311, energyShieldBase = 75, movementPenalty = 3, }, req = { level = 65, dex = 107, int = 90, }, } itemBases["Sadist Garb"] = { type = "Body Armour", - armour = { evasionBase = 304, energyShieldBase = 95, }, + armour = { evasionBase = 304, energyShieldBase = 95, movementPenalty = 3, }, req = { level = 68, dex = 103, int = 109, }, } itemBases["Carnal Armour"] = { type = "Body Armour", implicit = "+(20 to 25) to maximum Mana", - armour = { evasionBase = 251, energyShieldBase = 105, }, + armour = { evasionBase = 251, energyShieldBase = 105, movementPenalty = 3, }, req = { level = 71, dex = 88, int = 122, }, } itemBases["Sacrificial Garb"] = { type = "Body Armour", - armour = { armourBase = 234, evasionBase = 234, energyShieldBase = 69, }, + armour = { armourBase = 234, evasionBase = 234, energyShieldBase = 69, movementPenalty = 3 }, req = { level = 72, str = 66, dex = 66, int = 66, }, } diff --git a/Data/Bases/flask.lua b/Data/Bases/flask.lua new file mode 100644 index 00000000..d88b49e9 --- /dev/null +++ b/Data/Bases/flask.lua @@ -0,0 +1,234 @@ +-- Item data (c) Grinding Gear Games +local itemBases = ... + +itemBases["Small Life Flask"] = { + type = "Flask", + flask = { life = 70, duration = 6, chargesUsed = 7, chargesMax = 21, }, + req = { level = 1, }, +} +itemBases["Medium Life Flask"] = { + type = "Flask", + flask = { life = 150, duration = 6.5, chargesUsed = 8, chargesMax = 28, }, + req = { level = 3, }, +} +itemBases["Large Life Flask"] = { + type = "Flask", + flask = { life = 250, duration = 7, chargesUsed = 9, chargesMax = 30, }, + req = { level = 6, }, +} +itemBases["Greater Life Flask"] = { + type = "Flask", + flask = { life = 360, duration = 7, chargesUsed = 10, chargesMax = 32, }, + req = { level = 12, }, +} +itemBases["Grand Life Flask"] = { + type = "Flask", + flask = { life = 640, duration = 6, chargesUsed = 10, chargesMax = 25, }, + req = { level = 18, }, +} +itemBases["Giant Life Flask"] = { + type = "Flask", + flask = { life = 830, duration = 8, chargesUsed = 10, chargesMax = 30, }, + req = { level = 24, }, +} +itemBases["Colossal Life Flask"] = { + type = "Flask", + flask = { life = 1000, duration = 7, chargesUsed = 10, chargesMax = 32, }, + req = { level = 30, }, +} +itemBases["Sacred Life Flask"] = { + type = "Flask", + flask = { life = 1200, duration = 6, chargesUsed = 10, chargesMax = 25, }, + req = { level = 36, }, +} +itemBases["Hallowed Life Flask"] = { + type = "Flask", + flask = { life = 1990, duration = 8, chargesUsed = 10, chargesMax = 30, }, + req = { level = 42, }, +} +itemBases["Sanctified Life Flask"] = { + type = "Flask", + flask = { life = 1460, duration = 3, chargesUsed = 15, chargesMax = 30, }, + req = { level = 50, }, +} +itemBases["Divine Life Flask"] = { + type = "Flask", + flask = { life = 2400, duration = 7, chargesUsed = 15, chargesMax = 45, }, + req = { level = 60, }, +} +itemBases["Eternal Life Flask"] = { + type = "Flask", + flask = { life = 2080, duration = 4, chargesUsed = 15, chargesMax = 45, }, + req = { level = 65, }, +} + + +itemBases["Small Mana Flask"] = { + type = "Flask", + flask = { mana = 60, duration = 5, chargesUsed = 10, chargesMax = 30, }, + req = { level = 1, }, +} +itemBases["Medium Mana Flask"] = { + type = "Flask", + flask = { mana = 90, duration = 6, chargesUsed = 12, chargesMax = 36, }, + req = { level = 3, }, +} +itemBases["Large Mana Flask"] = { + type = "Flask", + flask = { mana = 110, duration = 7, chargesUsed = 10, chargesMax = 35, }, + req = { level = 6, }, +} +itemBases["Greater Mana Flask"] = { + type = "Flask", + flask = { mana = 140, duration = 5.6, chargesUsed = 12, chargesMax = 32, }, + req = { level = 12, }, +} +itemBases["Grand Mana Flask"] = { + type = "Flask", + flask = { mana = 210, duration = 10, chargesUsed = 8, chargesMax = 30, }, + req = { level = 18, }, +} +itemBases["Giant Mana Flask"] = { + type = "Flask", + flask = { mana = 340, duration = 7, chargesUsed = 10, chargesMax = 40, }, + req = { level = 24, }, +} +itemBases["Colossal Mana Flask"] = { + type = "Flask", + flask = { mana = 200, duration = 5.6, chargesUsed = 5, chargesMax = 25, }, + req = { level = 30, }, +} +itemBases["Sacred Mana Flask"] = { + type = "Flask", + flask = { mana = 660, duration = 9, chargesUsed = 10, chargesMax = 40, }, + req = { level = 36, }, +} +itemBases["Hallowed Mana Flask"] = { + type = "Flask", + flask = { mana = 290, duration = 7, chargesUsed = 4, chargesMax = 20, }, + req = { level = 42, }, +} +itemBases["Sanctified Mana Flask"] = { + type = "Flask", + flask = { mana = 1050, duration = 14, chargesUsed = 10, chargesMax = 40, }, + req = { level = 50, }, +} +itemBases["Divine Mana Flask"] = { + type = "Flask", + flask = { mana = 400, duration = 5, chargesUsed = 5, chargesMax = 30, }, + req = { level = 60, }, +} +itemBases["Eternal Mana Flask"] = { + type = "Flask", + flask = { mana = 960, duration = 10, chargesUsed = 8, chargesMax = 40, }, + req = { level = 65, }, +} + + +itemBases["Small Hybrid Flask"] = { + type = "Flask", + flask = { life = 100, mana = 70, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 10, }, +} +itemBases["Medium Hybrid Flask"] = { + type = "Flask", + flask = { life = 230, mana = 100, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 20, }, +} +itemBases["Large Hybrid Flask"] = { + type = "Flask", + flask = { life = 510, mana = 140, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 30, }, +} +itemBases["Colossal Hybrid Flask"] = { + type = "Flask", + flask = { life = 690, mana = 200, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 40, }, +} +itemBases["Sacred Hybrid Flask"] = { + type = "Flask", + flask = { life = 1440, mana = 400, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 50, }, +} +itemBases["Hallowed Hybrid Flask"] = { + type = "Flask", + flask = { life = 1740, mana = 480, duration = 5, chargesUsed = 20, chargesMax = 40, }, + req = { level = 60, }, +} + + +itemBases["Quicksilver Flask"] = { + type = "Flask", + flask = { duration = 4, chargesUsed = 20, chargesMax = 50, buff = { "40% increased Movement Speed" }, }, + req = { level = 1, }, +} +itemBases["Bismuth Flask"] = { + type = "Flask", + flask = { duration = 5, chargesUsed = 20, chargesMax = 50, buff = { "+35% to all Elemental Resistances" }, }, + req = { level = 8, }, +} +itemBases["Stibnite Flask"] = { + type = "Flask", + flask = { duration = 5, chargesUsed = 10, chargesMax = 30, buff = { "100% increased Evasion Rating" }, }, + req = { level = 14, }, +} +itemBases["Amethyst Flask"] = { + type = "Flask", + flask = { duration = 3.5, chargesUsed = 30, chargesMax = 60, buff = { "+35% to Chaos Resistance" }, }, + req = { level = 18, }, +} +itemBases["Ruby Flask"] = { + type = "Flask", + 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", + 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", + 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", + flask = { duration = 5, chargesUsed = 40, chargesMax = 60, buff = { "Onslaught" }, }, + req = { level = 22, }, +} +itemBases["Aquamarine Flask"] = { + type = "Flask", + flask = { duration = 5, chargesUsed = 15, chargesMax = 40, buff = { "20% chance to Avoid Cold Damage when Hit" }, }, + req = { level = 27, }, +} +itemBases["Diamond Flask"] = { + type = "Flask", + flask = { duration = 4, chargesUsed = 20, chargesMax = 40, buff = { "Your Critical Strike Chance is Lucky" }, }, + req = { level = 27, }, +} +itemBases["Granite Flask"] = { + type = "Flask", + flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+3000 to Armour" }, }, + req = { level = 27, }, +} +itemBases["Jade Flask"] = { + type = "Flask", + flask = { duration = 4, chargesUsed = 30, chargesMax = 60, buff = { "+3000 to Evasion Rating" }, }, + req = { level = 27, }, +} +itemBases["Quartz Flask"] = { + type = "Flask", + 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", + flask = { duration = 4, chargesUsed = 20, chargesMax = 60, buff = { "40% increased Damage" }, }, + req = { level = 35, }, +} +itemBases["Basalt Flask"] = { + type = "Flask", + 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/shield.lua b/Data/Bases/shield.lua index da59a5ef..66d39ea5 100644 --- a/Data/Bases/shield.lua +++ b/Data/Bases/shield.lua @@ -3,169 +3,169 @@ local itemBases = ... itemBases["Splintered Tower Shield"] = { type = "Shield", - armour = { blockChance = 24, armourBase = 8, }, + armour = { blockChance = 24, armourBase = 8, movementPenalty = 3, }, req = { }, } itemBases["Corroded Tower Shield"] = { type = "Shield", - armour = { blockChance = 23, armourBase = 40, }, + armour = { blockChance = 23, armourBase = 40, movementPenalty = 3, }, req = { level = 5, str = 20, }, } itemBases["Rawhide Tower Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 46, }, + armour = { blockChance = 26, armourBase = 46, movementPenalty = 3, }, req = { level = 11, str = 33, }, } itemBases["Cedar Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 94, }, + armour = { blockChance = 25, armourBase = 94, movementPenalty = 3, }, req = { level = 17, str = 46, }, } itemBases["Copper Tower Shield"] = { type = "Shield", - armour = { blockChance = 24, armourBase = 166, }, + armour = { blockChance = 24, armourBase = 166, movementPenalty = 3, }, req = { level = 24, str = 62, }, } itemBases["Reinforced Tower Shield"] = { type = "Shield", - armour = { blockChance = 23, armourBase = 249, }, + armour = { blockChance = 23, armourBase = 249, movementPenalty = 3, }, req = { level = 30, str = 76, }, } itemBases["Painted Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 189, }, + armour = { blockChance = 25, armourBase = 189, movementPenalty = 3, }, req = { level = 35, str = 87, }, } itemBases["Buckskin Tower Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 154, }, + armour = { blockChance = 26, armourBase = 154, movementPenalty = 3, }, req = { level = 39, str = 96, }, } itemBases["Mahogany Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 231, }, + armour = { blockChance = 25, armourBase = 231, movementPenalty = 3, }, req = { level = 43, str = 105, }, } itemBases["Bronze Tower Shield"] = { type = "Shield", - armour = { blockChance = 24, armourBase = 319, }, + armour = { blockChance = 24, armourBase = 319, movementPenalty = 3, }, req = { level = 47, str = 114, }, } itemBases["Girded Tower Shield"] = { type = "Shield", - armour = { blockChance = 23, armourBase = 418, }, + armour = { blockChance = 23, armourBase = 418, movementPenalty = 3, }, req = { level = 51, str = 123, }, } itemBases["Crested Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 294, }, + armour = { blockChance = 25, armourBase = 294, movementPenalty = 3, }, req = { level = 55, str = 132, }, } itemBases["Shagreen Tower Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 227, }, + armour = { blockChance = 26, armourBase = 227, movementPenalty = 3, }, req = { level = 58, str = 139, }, } itemBases["Ebony Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 358, }, + armour = { blockChance = 25, armourBase = 358, movementPenalty = 3, }, req = { level = 61, str = 159, }, } itemBases["Ezomyte Tower Shield"] = { type = "Shield", - armour = { blockChance = 24, armourBase = 454, }, + armour = { blockChance = 24, armourBase = 454, movementPenalty = 3, }, req = { level = 64, str = 159, }, } itemBases["Colossal Tower Shield"] = { type = "Shield", - armour = { blockChance = 23, armourBase = 550, }, + armour = { blockChance = 23, armourBase = 550, movementPenalty = 3, }, req = { level = 67, str = 159, }, } itemBases["Pinnacle Tower Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 406, }, + armour = { blockChance = 25, armourBase = 406, movementPenalty = 3, }, req = { level = 70, str = 159, }, } itemBases["Goathide Buckler"] = { type = "Shield", - armour = { blockChance = 25, evasionBase = 10, }, + armour = { blockChance = 25, evasionBase = 10, movementPenalty = 3, }, req = { }, } itemBases["Pine Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 38, }, + armour = { blockChance = 26, evasionBase = 38, movementPenalty = 3, }, req = { level = 8, dex = 26, }, } itemBases["Painted Buckler"] = { type = "Shield", - armour = { blockChance = 24, evasionBase = 95, }, + armour = { blockChance = 24, evasionBase = 95, movementPenalty = 3, }, req = { level = 16, dex = 44, }, } itemBases["Hammered Buckler"] = { type = "Shield", - armour = { blockChance = 27, evasionBase = 84, }, + armour = { blockChance = 27, evasionBase = 84, movementPenalty = 3, }, req = { level = 23, dex = 60, }, } itemBases["War Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 126, }, + armour = { blockChance = 26, evasionBase = 126, movementPenalty = 3, }, req = { level = 29, dex = 74, }, } itemBases["Gilded Buckler"] = { type = "Shield", - armour = { blockChance = 25, evasionBase = 171, }, + armour = { blockChance = 25, evasionBase = 171, movementPenalty = 3, }, req = { level = 34, dex = 85, }, } itemBases["Oak Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 164, }, + armour = { blockChance = 26, evasionBase = 164, movementPenalty = 3, }, req = { level = 38, dex = 94, }, } itemBases["Enameled Buckler"] = { type = "Shield", - armour = { blockChance = 24, evasionBase = 241, }, + armour = { blockChance = 24, evasionBase = 241, movementPenalty = 3, }, req = { level = 42, dex = 103, }, } itemBases["Corrugated Buckler"] = { type = "Shield", - armour = { blockChance = 27, evasionBase = 164, }, + armour = { blockChance = 27, evasionBase = 164, movementPenalty = 3, }, req = { level = 46, dex = 112, }, } itemBases["Battle Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 214, }, + armour = { blockChance = 26, evasionBase = 214, movementPenalty = 3, }, req = { level = 50, dex = 121, }, } itemBases["Golden Buckler"] = { type = "Shield", - armour = { blockChance = 25, evasionBase = 269, }, + armour = { blockChance = 25, evasionBase = 269, movementPenalty = 3, }, req = { level = 54, dex = 130, }, } itemBases["Ironwood Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 243, }, + armour = { blockChance = 26, evasionBase = 243, movementPenalty = 3, }, req = { level = 57, dex = 136, }, } itemBases["Lacquered Buckler"] = { type = "Shield", - armour = { blockChance = 24, evasionBase = 382, }, + armour = { blockChance = 24, evasionBase = 382, movementPenalty = 3, }, req = { level = 60, dex = 159, }, } itemBases["Vaal Buckler"] = { type = "Shield", - armour = { blockChance = 27, evasionBase = 239, }, + armour = { blockChance = 27, evasionBase = 239, movementPenalty = 3, }, req = { level = 63, dex = 159, }, } itemBases["Crusader Buckler"] = { type = "Shield", - armour = { blockChance = 26, evasionBase = 287, }, + armour = { blockChance = 26, evasionBase = 287, movementPenalty = 3, }, req = { level = 66, dex = 159, }, } itemBases["Imperial Buckler"] = { type = "Shield", - armour = { blockChance = 25, evasionBase = 335, }, + armour = { blockChance = 25, evasionBase = 335, movementPenalty = 3, }, req = { level = 69, dex = 159, }, } @@ -173,94 +173,94 @@ itemBases["Imperial Buckler"] = { itemBases["Twig Spirit Shield"] = { type = "Shield", implicit = "10% increased Spell Damage", - armour = { blockChance = 22, energyShieldBase = 5, }, + armour = { blockChance = 22, energyShieldBase = 5, movementPenalty = 3, }, req = { int = 15, }, } itemBases["Yew Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 11, }, + armour = { blockChance = 24, energyShieldBase = 11, movementPenalty = 3, }, req = { level = 9, int = 28, }, } itemBases["Bone Spirit Shield"] = { type = "Shield", implicit = "15% increased Spell Damage", - armour = { blockChance = 22, energyShieldBase = 17, }, + armour = { blockChance = 22, energyShieldBase = 17, movementPenalty = 3, }, req = { level = 15, int = 42, }, } itemBases["Tarnished Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 25, }, + armour = { blockChance = 24, energyShieldBase = 25, movementPenalty = 3, }, req = { level = 23, int = 60, }, } itemBases["Jingling Spirit Shield"] = { type = "Shield", implicit = "10% increased Spell Damage", - armour = { blockChance = 23, energyShieldBase = 30, }, + armour = { blockChance = 23, energyShieldBase = 30, movementPenalty = 3, }, req = { level = 28, int = 71, }, } itemBases["Brass Spirit Shield"] = { type = "Shield", - armour = { blockChance = 25, energyShieldBase = 43, }, + armour = { blockChance = 25, energyShieldBase = 43, movementPenalty = 3, }, req = { level = 33, int = 82, }, } itemBases["Walnut Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 39, }, + armour = { blockChance = 24, energyShieldBase = 39, movementPenalty = 3, }, req = { level = 37, int = 92, }, } itemBases["Ivory Spirit Shield"] = { type = "Shield", implicit = "15% increased Spell Damage", - armour = { blockChance = 22, energyShieldBase = 43, }, + armour = { blockChance = 22, energyShieldBase = 43, movementPenalty = 3, }, req = { level = 41, int = 100, }, } itemBases["Ancient Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 47, }, + armour = { blockChance = 24, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 45, int = 110, }, } itemBases["Chiming Spirit Shield"] = { type = "Shield", implicit = "10% increased Spell Damage", - armour = { blockChance = 23, energyShieldBase = 51, }, + armour = { blockChance = 23, energyShieldBase = 51, movementPenalty = 3, }, req = { level = 49, int = 118, }, } itemBases["Thorium Spirit Shield"] = { type = "Shield", - armour = { blockChance = 25, energyShieldBase = 67, }, + armour = { blockChance = 25, energyShieldBase = 67, movementPenalty = 3, }, req = { level = 53, int = 128, }, } itemBases["Lacewood Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 58, }, + armour = { blockChance = 24, energyShieldBase = 58, movementPenalty = 3, }, req = { level = 56, int = 134, }, } itemBases["Fossilised Spirit Shield"] = { type = "Shield", implicit = "15% increased Spell Damage", - armour = { blockChance = 22, energyShieldBase = 61, }, + armour = { blockChance = 22, energyShieldBase = 61, movementPenalty = 3, }, req = { level = 59, int = 141, }, } itemBases["Vaal Spirit Shield"] = { type = "Shield", implicit = "5% increased Spell Damage", - armour = { blockChance = 24, energyShieldBase = 70, }, + armour = { blockChance = 24, energyShieldBase = 70, movementPenalty = 3, }, req = { level = 62, int = 159, }, } itemBases["Harmonic Spirit Shield"] = { type = "Shield", implicit = "10% increased Spell Damage", - armour = { blockChance = 23, energyShieldBase = 72, }, + armour = { blockChance = 23, energyShieldBase = 72, movementPenalty = 3, }, req = { level = 65, int = 159, }, } itemBases["Titanium Spirit Shield"] = { type = "Shield", - armour = { blockChance = 25, energyShieldBase = 84, }, + armour = { blockChance = 25, energyShieldBase = 84, movementPenalty = 3, }, req = { level = 68, int = 159, }, } @@ -268,76 +268,76 @@ itemBases["Titanium Spirit Shield"] = { itemBases["Rotted Round Shield"] = { type = "Shield", implicit = "60% increased Block Recovery", - armour = { blockChance = 23, armourBase = 11, evasionBase = 11, }, + armour = { blockChance = 23, armourBase = 11, evasionBase = 11, movementPenalty = 3, }, req = { level = 5, }, } itemBases["Fir Round Shield"] = { type = "Shield", implicit = "180% increased Block Recovery", - armour = { blockChance = 23, armourBase = 25, evasionBase = 25, }, + armour = { blockChance = 23, armourBase = 25, evasionBase = 25, movementPenalty = 3, }, req = { level = 12, str = 19, dex = 19, }, } itemBases["Studded Round Shield"] = { type = "Shield", implicit = "60% increased Block Recovery", - armour = { blockChance = 26, armourBase = 40, evasionBase = 40, }, + armour = { blockChance = 26, armourBase = 40, evasionBase = 40, movementPenalty = 3, }, req = { level = 20, str = 28, dex = 28, }, } itemBases["Scarlet Round Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 75, evasionBase = 75, }, + armour = { blockChance = 25, armourBase = 75, evasionBase = 75, movementPenalty = 3, }, req = { level = 27, str = 37, dex = 37, }, } itemBases["Splendid Round Shield"] = { type = "Shield", implicit = "120% increased Block Recovery", - armour = { blockChance = 24, armourBase = 65, evasionBase = 65, }, + armour = { blockChance = 24, armourBase = 65, evasionBase = 65, movementPenalty = 3, }, req = { level = 33, str = 44, dex = 44, }, } itemBases["Maple Round Shield"] = { type = "Shield", implicit = "180% increased Block Recovery", - armour = { blockChance = 23, armourBase = 77, evasionBase = 77, }, + armour = { blockChance = 23, armourBase = 77, evasionBase = 77, movementPenalty = 3, }, req = { level = 39, str = 52, dex = 52, }, } itemBases["Spiked Round Shield"] = { type = "Shield", implicit = "60% increased Block Recovery", - armour = { blockChance = 26, armourBase = 88, evasionBase = 88, }, + armour = { blockChance = 26, armourBase = 88, evasionBase = 88, movementPenalty = 3, }, req = { level = 45, str = 58, dex = 58, }, } itemBases["Crimson Round Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 135, evasionBase = 135, }, + armour = { blockChance = 25, armourBase = 135, evasionBase = 135, movementPenalty = 3, }, req = { level = 49, str = 64, dex = 64, }, } itemBases["Baroque Round Shield"] = { type = "Shield", implicit = "120% increased Block Recovery", - armour = { blockChance = 24, armourBase = 106, evasionBase = 106, }, + armour = { blockChance = 24, armourBase = 106, evasionBase = 106, movementPenalty = 3, }, req = { level = 54, str = 70, dex = 70, }, } itemBases["Teak Round Shield"] = { type = "Shield", implicit = "180% increased Block Recovery", - armour = { blockChance = 23, armourBase = 114, evasionBase = 114, }, + armour = { blockChance = 23, armourBase = 114, evasionBase = 114, movementPenalty = 3, }, req = { level = 58, str = 74, dex = 74, }, } itemBases["Spiny Round Shield"] = { type = "Shield", implicit = "60% increased Block Recovery", - armour = { blockChance = 26, armourBase = 134, evasionBase = 134, }, + armour = { blockChance = 26, armourBase = 134, evasionBase = 134, movementPenalty = 3, }, req = { level = 62, str = 85, dex = 85, }, } itemBases["Cardinal Round Shield"] = { type = "Shield", - armour = { blockChance = 25, armourBase = 181, evasionBase = 181, }, + armour = { blockChance = 25, armourBase = 181, evasionBase = 181, movementPenalty = 3, }, req = { level = 66, str = 85, dex = 85, }, } itemBases["Elegant Round Shield"] = { type = "Shield", implicit = "120% increased Block Recovery", - armour = { blockChance = 24, armourBase = 129, evasionBase = 129, }, + armour = { blockChance = 24, armourBase = 129, evasionBase = 129, movementPenalty = 3, }, req = { level = 70, str = 85, dex = 85, }, } @@ -345,76 +345,76 @@ itemBases["Elegant Round Shield"] = { itemBases["Plank Kite Shield"] = { type = "Shield", implicit = "+4% to all Elemental Resistances", - armour = { blockChance = 22, armourBase = 15, energyShieldBase = 5, }, + armour = { blockChance = 22, armourBase = 15, energyShieldBase = 5, movementPenalty = 3, }, req = { level = 7, }, } itemBases["Linden Kite Shield"] = { type = "Shield", implicit = "+4% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 38, energyShieldBase = 12, }, + armour = { blockChance = 24, armourBase = 38, energyShieldBase = 12, movementPenalty = 3, }, req = { level = 13, str = 20, int = 20, }, } itemBases["Reinforced Kite Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 56, energyShieldBase = 17, }, + armour = { blockChance = 26, armourBase = 56, energyShieldBase = 17, movementPenalty = 3, }, req = { level = 20, str = 28, int = 28, }, } itemBases["Layered Kite Shield"] = { type = "Shield", implicit = "+8% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 54, energyShieldBase = 16, }, + armour = { blockChance = 24, armourBase = 54, energyShieldBase = 16, movementPenalty = 3, }, req = { level = 27, str = 37, int = 37, }, } itemBases["Ceremonial Kite Shield"] = { type = "Shield", implicit = "+12% to all Elemental Resistances", - armour = { blockChance = 22, armourBase = 67, energyShieldBase = 20, }, + armour = { blockChance = 22, armourBase = 67, energyShieldBase = 20, movementPenalty = 3, }, req = { level = 34, str = 46, int = 46, }, } itemBases["Etched Kite Shield"] = { type = "Shield", implicit = "+4% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 110, energyShieldBase = 33, }, + armour = { blockChance = 24, armourBase = 110, energyShieldBase = 33, movementPenalty = 3, }, req = { level = 40, str = 52, int = 52, }, } itemBases["Steel Kite Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 127, energyShieldBase = 37, }, + armour = { blockChance = 26, armourBase = 127, energyShieldBase = 37, movementPenalty = 3, }, req = { level = 46, str = 60, int = 60, }, } itemBases["Laminated Kite Shield"] = { type = "Shield", implicit = "+8% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 98, energyShieldBase = 29, }, + armour = { blockChance = 24, armourBase = 98, energyShieldBase = 29, movementPenalty = 3, }, req = { level = 50, str = 64, int = 64, }, } itemBases["Angelic Kite Shield"] = { type = "Shield", implicit = "+12% to all Elemental Resistances", - armour = { blockChance = 22, armourBase = 108, energyShieldBase = 32, }, + armour = { blockChance = 22, armourBase = 108, energyShieldBase = 32, movementPenalty = 3, }, req = { level = 55, str = 70, int = 70, }, } itemBases["Branded Kite Shield"] = { type = "Shield", implicit = "+4% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 162, energyShieldBase = 47, }, + armour = { blockChance = 24, armourBase = 162, energyShieldBase = 47, movementPenalty = 3, }, req = { level = 59, str = 76, int = 76, }, } itemBases["Champion Kite Shield"] = { type = "Shield", - armour = { blockChance = 26, armourBase = 187, energyShieldBase = 55, }, + armour = { blockChance = 26, armourBase = 187, energyShieldBase = 55, movementPenalty = 3, }, req = { level = 62, str = 85, int = 85, }, } itemBases["Mosaic Kite Shield"] = { type = "Shield", implicit = "+8% to all Elemental Resistances", - armour = { blockChance = 24, armourBase = 127, energyShieldBase = 37, }, + armour = { blockChance = 24, armourBase = 127, energyShieldBase = 37, movementPenalty = 3, }, req = { level = 65, str = 85, int = 85, }, } itemBases["Archon Kite Shield"] = { type = "Shield", implicit = "+12% to all Elemental Resistances", - armour = { blockChance = 22, armourBase = 135, energyShieldBase = 40, }, + armour = { blockChance = 22, armourBase = 135, energyShieldBase = 40, movementPenalty = 3, }, req = { level = 68, str = 85, int = 85, }, } @@ -422,78 +422,78 @@ itemBases["Archon Kite Shield"] = { itemBases["Spiked Bundle"] = { type = "Shield", implicit = "Reflects (2 to 5) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 11, energyShieldBase = 4, }, + armour = { blockChance = 24, evasionBase = 11, energyShieldBase = 4, movementPenalty = 3, }, req = { level = 5, }, } itemBases["Driftwood Spiked Shield"] = { type = "Shield", implicit = "Reflects (2 to 5) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 40, energyShieldBase = 13, }, + armour = { blockChance = 24, evasionBase = 40, energyShieldBase = 13, movementPenalty = 3, }, req = { level = 12, dex = 19, int = 19, }, } itemBases["Alloyed Spiked Shield"] = { type = "Shield", implicit = "Reflects (5 to 12) Physical Damage to Melee Attackers", - armour = { blockChance = 25, evasionBase = 48, energyShieldBase = 15, }, + armour = { blockChance = 25, evasionBase = 48, energyShieldBase = 15, movementPenalty = 3, }, req = { level = 20, dex = 28, int = 28, }, } itemBases["Burnished Spiked Shield"] = { type = "Shield", implicit = "Reflects (10 to 23) Physical Damage to Melee Attackers", - armour = { blockChance = 26, evasionBase = 54, energyShieldBase = 16, }, + armour = { blockChance = 26, evasionBase = 54, energyShieldBase = 16, movementPenalty = 3, }, req = { level = 27, dex = 37, int = 37, }, } itemBases["Ornate Spiked Shield"] = { type = "Shield", implicit = "Reflects (24 to 35) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 105, energyShieldBase = 31, }, + armour = { blockChance = 24, evasionBase = 105, energyShieldBase = 31, movementPenalty = 3, }, req = { level = 33, dex = 44, int = 44, }, } itemBases["Redwood Spiked Shield"] = { type = "Shield", implicit = "Reflects (36 to 50) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 123, energyShieldBase = 36, }, + armour = { blockChance = 24, evasionBase = 123, energyShieldBase = 36, movementPenalty = 3, }, req = { level = 39, dex = 52, int = 52, }, } itemBases["Compound Spiked Shield"] = { type = "Shield", implicit = "Reflects (51 to 70) Physical Damage to Melee Attackers", - armour = { blockChance = 25, evasionBase = 106, energyShieldBase = 31, }, + armour = { blockChance = 25, evasionBase = 106, energyShieldBase = 31, movementPenalty = 3, }, req = { level = 45, dex = 58, int = 58, }, } itemBases["Polished Spiked Shield"] = { type = "Shield", implicit = "Reflects (71 to 90) Physical Damage to Melee Attackers", - armour = { blockChance = 26, evasionBase = 96, energyShieldBase = 28, }, + armour = { blockChance = 26, evasionBase = 96, energyShieldBase = 28, movementPenalty = 3, }, req = { level = 49, dex = 64, int = 64, }, } itemBases["Sovereign Spiked Shield"] = { type = "Shield", implicit = "Reflects (91 to 120) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 169, energyShieldBase = 50, }, + armour = { blockChance = 24, evasionBase = 169, energyShieldBase = 50, movementPenalty = 3, }, req = { level = 54, dex = 70, int = 70, }, } itemBases["Alder Spiked Shield"] = { type = "Shield", implicit = "Reflects (121 to 150) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 182, energyShieldBase = 53, }, + armour = { blockChance = 24, evasionBase = 182, energyShieldBase = 53, movementPenalty = 3, }, req = { level = 58, dex = 74, int = 74, }, } itemBases["Ezomyte Spiked Shield"] = { type = "Shield", implicit = "Reflects (151 to 180) Physical Damage to Melee Attackers", - armour = { blockChance = 25, evasionBase = 158, energyShieldBase = 46, }, + armour = { blockChance = 25, evasionBase = 158, energyShieldBase = 46, movementPenalty = 3, }, req = { level = 62, dex = 85, int = 85, }, } itemBases["Mirrored Spiked Shield"] = { type = "Shield", implicit = "Reflects (181 to 220) Physical Damage to Melee Attackers", - armour = { blockChance = 26, evasionBase = 131, energyShieldBase = 38, }, + armour = { blockChance = 26, evasionBase = 131, energyShieldBase = 38, movementPenalty = 3, }, req = { level = 66, dex = 85, int = 85, }, } itemBases["Supreme Spiked Shield"] = { type = "Shield", implicit = "Reflects (221 to 260) Physical Damage to Melee Attackers", - armour = { blockChance = 24, evasionBase = 210, energyShieldBase = 62, }, + armour = { blockChance = 24, evasionBase = 210, energyShieldBase = 62, movementPenalty = 3, }, req = { level = 70, dex = 85, int = 85, }, } diff --git a/Data/Uniques/flask.lua b/Data/Uniques/flask.lua new file mode 100644 index 00000000..f5fc0e37 --- /dev/null +++ b/Data/Uniques/flask.lua @@ -0,0 +1,270 @@ +-- Item data (c) Grinding Gear Games + +return { +-- Flask: Life +[[ +Blood of the Karui +Sanctified Life Flask +Recovers 1460 Life over (2.86 to 2.50) seconds +Consumes 15 of 30 Charges on use +Requires Level 50 +(5-20)% increased Recovery Speed +No Life Recovery Applies during Flask effect +Recover Full Life at the end of the Flask effect +]], +-- Flask: Mana +[[ +Doedre's Elixir +Greater Mana Flask +Variant: Pre 2.0.0 +Variant: Current +Recovers 140 Mana over 5.60 seconds +Consumes (26 to 30) of 32 Charges on use +Requires Level 12 +Removes 20% of your maximum Energy Shield on use +You take 10% of your maximum Life as Chaos Damage on use +You gain a Power Charge on use +You gain a Frenzy Charge on use +You gain an Endurance Charge on use +{variant:1}(50-100)% increased Charges used +{variant:2}(120-150)% increased Charges used +]],[[ +Lavianga's Spirit +Sanctified Mana Flask +Recovers (1365 to 1575) Mana over 7.00 seconds +Consumes 10 of 40 Charges on use +Requires Level 50 +(30-50)% increased Amount Recovered +100% increased Recovery Speed +Your Skills have no Mana Cost during Flask effect +]],[[ +Zerphi's Last Breath +Grand Mana Flask +Recovers 210 Mana over 10.00 seconds +Consumes 12 of 30 Charges on use +Requires Level 18 +50% increased Charges used +Skills used during Flask effect grant 800% of Mana Cost as Life +]], +-- Flask: Hybrid +[[ +Divination Distillate +Large Hybrid Flask +Variant: Pre 1.1.0 +Variant: Pre 2.2.0 +Variant: Current +Recovers 140 Mana over 5.00 seconds +Recovers 510 Life over 5.00 seconds +Consumes 20 of 40 Charges on use +Requires Level 30 +(40-60)% increased Rarity of Items found during Flask effect +{variant:1}(20-25)% increased Quantity of Items found during Flask effect +{variant:2,3}(12-18)% increased Quantity of Items found during Flask effect +25% increased Light Radius during Flask effect +{variant:1,2}+6% to all maximum Elemental Resistances during Flask effect +{variant:3}+4% to all maximum Elemental Resistances during Flask effect +]],[[ +The Writhing Jar +Hallowed Hybrid Flask +Recovers (120 to 168) Mana over 5.00 seconds +Recovers (435 to 609) Life over 5.00 seconds +Consumes (16 to 18) of 40 Charges on use +Requires Level 60 +(75-65)% reduced Amount Recovered + Instant Recovery +2 Enemy Writhing Worms escape the Flask when used +(20-10)% reduced Charges used +]], +-- Flask: Utility +[[ +Atziri's Promise +Amethyst Flask +Lasts 3.50 Seconds +Consumes 30 of 60 Charges on use ++35% to Chaos Resistance +Requires Level 68 +2% of Chaos Damage Leeched as Life during Flask effect +Gain (22-25)% of Physical Damage as Extra Chaos Damage during effect +Gain (13-15)% of Elemental Damage as Extra Chaos Damage during effect +]],[[ +Coruscating Elixir +Ruby Flask +Lasts 4.00 Seconds +Consumes 30 of 60 Charges on use ++50% to Fire Resistance ++6% to maximum Fire Resistance +Requires Level 18 +Chaos Damage does not bypass Energy Shield during effect +Removes all but one Life on use +Removed life is regenerated as Energy Shield over 2 seconds +]],[[ +Dying Sun +Ruby Flask +Lasts 4.00 Seconds +Consumes (27 to 33) of 60 Charges on use ++50% to Fire Resistance ++6% to maximum Fire Resistance +Requires Level 68 +(-10-10)% increased Charges used +30% increased Area of Effect during Flask Effect +2 additional Projectiles during Flask Effect +]],[[ +Forbidden Taste +Quartz Flask +Variant: Pre 1.2.3 +Variant: Current +Lasts 4.00 Seconds +Consumes 45 of 60 Charges on use +10% chance to Dodge Attacks +10% chance to Dodge Spell Damage +Phasing +Requires Level 27 +50% increased Charges used +{variant:1}Recover 50% of your maximum Life on use +{variant:2}Recover 75% of your maximum Life on use +{variant:1}15% of maximum Life taken as Chaos Damage per second +{variant:2}8% of maximum Life taken as Chaos Damage per second +]],[[ +Kiara's Determination +Silver Flask +Lasts 2.50 Seconds +Consumes 40 of 60 Charges on use +Onslaught +Requires Level 22 +Immune to Freeze, Chill, Curses and Stuns during Flask Effect +50% reduced Duration +]],[[ +Lion's Roar +Granite Flask +Variant: Pre 2.2.0 +Variant: Current +Lasts 4.00 Seconds +Consumes 30 of 60 Charges on use ++3000 to Armour +Requires Level 27 +Adds Knockback during Flask effect +75% chance to cause Enemies to Flee on use +{variant:1}(70 to 100)% increased Charges used +{variant:1}30% more Melee Physical Damage during effect +{variant:2}(30-35)% more Melee Physical Damage during effect +Knocks Back Enemies in an Area on Flask use +]],[[ +Rotgut +Quicksilver Flask +Variant: Pre 2.2.0 +Variant: Current +Lasts 4.00 Seconds +Consumes (30 to 40) of 50 Charges on use +40% increased Movement Speed +Requires Level 40 +{variant:1}(100-150)% increased Charges used +{variant:2}(50-100)% increased Charges used +15% chance to gain a Flask Charge when you deal a Critical Strike +(10-30)% increased Movement Speed during Flask effect +Consumes Frenzy Charges on use +Gain Onslaught for 1 second per Frenzy Charge on use +]],[[ +Rumi's Concoction +Granite Flask +Variant: Pre 1.3.0 +Variant: Pre 2.5.0 +Variant: Current +Lasts 4.00 Seconds +Consumes 30 of 60 Charges on use ++3000 to Armour +Requires Level 68 +{variant:1}(30-40)% Chance to Block during Flask effect +{variant:2}(20-30)% Chance to Block during Flask effect +{variant:3}(14-20)% Chance to Block during Flask effect +{variant:1}(15-20)% Chance to Block Spells during Flask effect +{variant:2}(10-15)% Chance to Block Spells during Flask effect +{variant:3}(6-10)% Chance to Block Spells during Flask effect +]],[[ +Sin's Rebirth +Stibnite Flask +Lasts 5.00 Seconds +Consumes 10 of 30 Charges on use +100% increased Evasion Rating +Requires Level 14 +Creates a Smoke Cloud on Use +Gain Unholy Might during Flask Effect +Immunity to Ignite during Flask effect +Removes Burning on use +]],[[ +Taste of Hate +Sapphire Flask +Variant: Pre 2.2.0 +Variant: Current +Lasts 4.00 Seconds +Consumes 30 of 60 Charges on use ++50% to Cold Resistance ++6% to maximum Cold Resistance +Requires Level 18 +{variant:1}30% of Physical Damage taken as Cold Damage during Flask effect +{variant:2}20% of Physical Damage taken as Cold Damage during Flask effect +Gain (20-30)% of Physical Damage as Extra Cold Damage during effect +30% chance to Avoid being Chilled during Flask effect +30% chance to Avoid being Frozen during Flask effect +]],[[ +The Overflowing Chalice +Sulphur Flask +Lasts (4.40 to 4.80) Seconds +Consumes 20 of 60 Charges on use +40% increased Damage +Requires Level 35 +Creates Consecrated Ground on Use +100% increased Charge Recovery +(10-20)% increased Duration +Gains no Charges during Effect of any Overflowing Chalice Flask +100% increased Charges gained by Other Flasks during Flask Effect +]],[[ +The Sorrow of the Divine +Sulphur Flask +Lasts (5.00 to 6.00) Seconds +Consumes 20 of 60 Charges on use +40% increased Damage +Requires Level 35 +Creates Consecrated Ground on Use +(25-50)% increased Duration +Zealot's Oath during Flask effect +]],[[ +Vessel of Vinktar +Topaz Flask +Variant: Pre 2.2.0 (Penetration) +Variant: Pre 2.2.0 (Spells) +Variant: Pre 2.2.0 (Attacks) +Variant: Pre 2.2.0 (Conversion) +Variant: Current (Penetration) +Variant: Current (Spells) +Variant: Current (Attacks) +Variant: Current (Conversion) +Lasts 4.00 Seconds +Consumes (54 to 60) of 60 Charges on use ++50% to Lightning Resistance ++6% to maximum Lightning Resistance +Requires Level 68 +{variant:5,6,7,8}(80-100)% increased Charges used +Shocks nearby Enemies during Flask effect +You are Shocked during Flask effect +{variant:1,2,3,4}30% of Lightning Damage Leeched as Life during Flask effect +{variant:5,6,7,8}20% of Lightning Damage Leeched as Life during Flask effect +{variant:1,2,3,4}30% of Lightning Damage Leeched as Mana during Flask effect +{variant:5,6,7,8}20% of Lightning Damage Leeched as Mana during Flask effect +{variant:1,2,3,4}Leech applies instantly during Flask effect +{variant:1,5}Damage Penetrates 10% Lightning Resistance during Flask effect +{variant:2,6}Adds (15-25) to (70-90) Lightning Damage to Spells during Flask effect +{variant:3,7}Adds (25-35) to (110-130) Lightning Damage to Attacks during Flask effect +{variant:4,8}20% of Physical Damage Converted to Lightning during Flask effect +]],[[ +Witchfire Brew +Stibnite Flask +Lasts 5.00 Seconds +Consumes 15 of 30 Charges on use +100% increased Evasion Rating +Requires Level 48 +Creates a Smoke Cloud on Use +50% increased Charges used +(50-70)% increased Damage Over Time during Flask Effect +Grants level 21 Vulnerability Curse Aura during Flask Effect +]], +} \ No newline at end of file diff --git a/Launch.lua b/Launch.lua index 08c2c042..93b67e68 100644 --- a/Launch.lua +++ b/Launch.lua @@ -52,6 +52,7 @@ 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 b1e3f347..fd86a816 100644 --- a/Modules/Build.lua +++ b/Modules/Build.lua @@ -225,64 +225,65 @@ function buildMode:Init(dbFileName, buildName) -- This defines the stats in the side bar, and also which stats show in node/item comparisons -- This may be user-customisable in the future self.displayStats = { - { mod = "AverageHit", label = "Average Hit", fmt = ".1f", compPercent = true }, - { mod = "AverageDamage", label = "Average Damage", fmt = ".1f", compPercent = true, flag = "attack" }, - { mod = "Speed", label = "Attack Rate", fmt = ".2f", compPercent = true, flag = "attack" }, - { mod = "Speed", label = "Cast Rate", fmt = ".2f", compPercent = true, flag = "spell" }, - { mod = "HitSpeed", label = "Hit Rate", fmt = ".2f" }, - { mod = "CritChance", label = "Crit Chance", fmt = ".2f%%" }, - { mod = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return o.CritChance > 0 end }, - { mod = "HitChance", label = "Hit Chance", fmt = ".0f%%", flag = "attack" }, - { mod = "TotalDPS", label = "Total DPS", fmt = ".1f", compPercent = true, flag = "notAverage" }, - { mod = "TotalDot", label = "DoT DPS", fmt = ".1f", compPercent = true }, - { mod = "BleedDPS", label = "Bleed DPS", fmt = ".1f", compPercent = true }, - { mod = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true }, - { mod = "IgniteDamage", label = "Total Damage per Ignite", fmt = ".1f", compPercent = true }, - { mod = "WithIgniteDPS", label = "Total DPS inc. Ignite", fmt = ".1f", compPercent = true }, - { mod = "WithIgniteAverageDamage", label = "Average Dmg. inc. Ignite", fmt = ".1f", compPercent = true }, - { mod = "PoisonDPS", label = "Poison DPS", fmt = ".1f", compPercent = true }, - { mod = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true }, - { mod = "WithPoisonDPS", label = "Total DPS inc. Poison", fmt = ".1f", compPercent = true }, - { mod = "WithPoisonAverageDamage", label = "Average Dmg. inc. Poison", fmt = ".1f", compPercent = true }, - { mod = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, lowerIsBetter = true, condFunc = function() return true end }, + { stat = "AverageHit", label = "Average Hit", fmt = ".1f", compPercent = true }, + { stat = "AverageDamage", label = "Average Damage", fmt = ".1f", compPercent = true, flag = "attack" }, + { stat = "Speed", label = "Attack Rate", fmt = ".2f", compPercent = true, flag = "attack" }, + { stat = "Speed", label = "Cast Rate", fmt = ".2f", compPercent = true, flag = "spell" }, + { stat = "HitSpeed", label = "Hit Rate", fmt = ".2f" }, + { stat = "CritChance", label = "Crit Chance", fmt = ".2f%%" }, + { stat = "CritMultiplier", label = "Crit Multiplier", fmt = "d%%", pc = true, condFunc = function(v,o) return o.CritChance > 0 end }, + { stat = "HitChance", label = "Hit Chance", fmt = ".0f%%", flag = "attack" }, + { stat = "TotalDPS", label = "Total DPS", fmt = ".1f", compPercent = true, flag = "notAverage" }, + { stat = "TotalDot", label = "DoT DPS", fmt = ".1f", compPercent = true }, + { stat = "BleedDPS", label = "Bleed DPS", fmt = ".1f", compPercent = true }, + { stat = "IgniteDPS", label = "Ignite DPS", fmt = ".1f", compPercent = true }, + { stat = "IgniteDamage", label = "Total Damage per Ignite", fmt = ".1f", compPercent = true }, + { stat = "WithIgniteDPS", label = "Total DPS inc. Ignite", fmt = ".1f", compPercent = true }, + { stat = "WithIgniteAverageDamage", label = "Average Dmg. inc. Ignite", fmt = ".1f", compPercent = true }, + { stat = "PoisonDPS", label = "Poison DPS", fmt = ".1f", compPercent = true }, + { stat = "PoisonDamage", label = "Total Damage per Poison", fmt = ".1f", compPercent = true }, + { stat = "WithPoisonDPS", label = "Total DPS inc. Poison", fmt = ".1f", compPercent = true }, + { stat = "WithPoisonAverageDamage", label = "Average Dmg. inc. Poison", fmt = ".1f", compPercent = true }, + { stat = "ManaCost", label = "Mana Cost", fmt = "d", compPercent = true, lowerIsBetter = true, condFunc = function() return true end }, { }, - { mod = "Str", label = "Strength", fmt = "d" }, - { mod = "Dex", label = "Dexterity", fmt = "d" }, - { mod = "Int", label = "Intelligence", fmt = "d" }, + { stat = "Str", label = "Strength", fmt = "d" }, + { stat = "Dex", label = "Dexterity", fmt = "d" }, + { stat = "Int", label = "Intelligence", fmt = "d" }, { }, - { mod = "Life", label = "Total Life", fmt = "d", compPercent = true }, - { mod = "Spec:LifeInc", label = "%Inc Life from Tree", fmt = "d%%", condFunc = function(v,o) return v > 0 and o.Life > 1 end }, - { mod = "LifeUnreserved", label = "Unreserved Life", fmt = "d", condFunc = function(v,o) return v < o.Life end, compPercent = true }, - { mod = "LifeUnreservedPercent", label = "Unreserved Life", fmt = "d%%", condFunc = function(v,o) return v < 100 end }, - { mod = "LifeRegen", label = "Life Regen", fmt = ".1f" }, + { stat = "Life", label = "Total Life", fmt = "d", compPercent = true }, + { stat = "Spec:LifeInc", label = "%Inc Life from Tree", fmt = "d%%", condFunc = function(v,o) return v > 0 and o.Life > 1 end }, + { stat = "LifeUnreserved", label = "Unreserved Life", fmt = "d", condFunc = function(v,o) return v < o.Life end, compPercent = true }, + { stat = "LifeUnreservedPercent", label = "Unreserved Life", fmt = "d%%", condFunc = function(v,o) return v < 100 end }, + { stat = "LifeRegen", label = "Life Regen", fmt = ".1f" }, { }, - { mod = "Mana", label = "Total Mana", fmt = "d", compPercent = true }, - { mod = "Spec:ManaInc", label = "%Inc Mana from Tree", fmt = "d%%" }, - { mod = "ManaUnreserved", label = "Unreserved Mana", fmt = "d", condFunc = function(v,o) return v < o.Mana end, compPercent = true }, - { mod = "ManaUnreservedPercent", label = "Unreserved Mana", fmt = "d%%", condFunc = function(v,o) return v < 100 end }, - { mod = "ManaRegen", label = "Mana Regen", fmt = ".1f" }, + { stat = "Mana", label = "Total Mana", fmt = "d", compPercent = true }, + { stat = "Spec:ManaInc", label = "%Inc Mana from Tree", fmt = "d%%" }, + { stat = "ManaUnreserved", label = "Unreserved Mana", fmt = "d", condFunc = function(v,o) return v < o.Mana end, compPercent = true }, + { stat = "ManaUnreservedPercent", label = "Unreserved Mana", fmt = "d%%", condFunc = function(v,o) return v < 100 end }, + { stat = "ManaRegen", label = "Mana Regen", fmt = ".1f" }, { }, - { mod = "EnergyShield", label = "Energy Shield", fmt = "d", compPercent = true }, - { mod = "Spec:EnergyShieldInc", label = "%Inc ES from Tree", fmt = "d%%" }, - { mod = "EnergyShieldRegen", label = "Energy Shield Regen", fmt = ".1f" }, - { mod = "Evasion", label = "Evasion rating", fmt = "d", compPercent = true }, - { mod = "Spec:EvasionInc", label = "%Inc Evasion from Tree", fmt = "d%%" }, - { mod = "EvadeChance", label = "Evade Chance", fmt = "d%%" }, - { mod = "Armour", label = "Armour", fmt = "d", compPercent = true }, - { mod = "Spec:ArmourInc", label = "%Inc Armour from Tree", fmt = "d%%" }, - { mod = "BlockChance", label = "Block Chance", fmt = "d%%" }, - { mod = "SpellBlockChance", label = "Spell Block Chance", fmt = "d%%" }, - { mod = "AttackDodgeChance", label = "Attack Dodge Chance", fmt = "d%%" }, - { mod = "SpellDodgeChance", label = "Spell Dodge Chance", fmt = "d%%" }, + { stat = "EnergyShield", label = "Energy Shield", fmt = "d", compPercent = true }, + { stat = "Spec:EnergyShieldInc", label = "%Inc ES from Tree", fmt = "d%%" }, + { stat = "EnergyShieldRegen", label = "Energy Shield Regen", fmt = ".1f" }, + { stat = "Evasion", label = "Evasion rating", fmt = "d", compPercent = true }, + { stat = "Spec:EvasionInc", label = "%Inc Evasion from Tree", fmt = "d%%" }, + { stat = "EvadeChance", label = "Evade Chance", fmt = "d%%" }, + { stat = "Armour", label = "Armour", fmt = "d", compPercent = true }, + { stat = "Spec:ArmourInc", label = "%Inc Armour from Tree", fmt = "d%%" }, + { stat = "MovementSpeedMod", label = "Movement Speed Modifier", fmt = "+d%%", mod = true }, + { stat = "BlockChance", label = "Block Chance", fmt = "d%%" }, + { stat = "SpellBlockChance", label = "Spell Block Chance", fmt = "d%%" }, + { stat = "AttackDodgeChance", label = "Attack Dodge Chance", fmt = "d%%" }, + { stat = "SpellDodgeChance", label = "Spell Dodge Chance", fmt = "d%%" }, { }, - { mod = "FireResist", label = "Fire Resistance", fmt = "d%%", condFunc = function() return true end }, - { mod = "ColdResist", label = "Cold Resistance", fmt = "d%%", condFunc = function() return true end }, - { mod = "LightningResist", label = "Lightning Resistance", fmt = "d%%", condFunc = function() return true end }, - { mod = "ChaosResist", label = "Chaos Resistance", fmt = "d%%", condFunc = function() return true end }, - { mod = "FireResistOverCap", label = "Fire Res. Over Max", fmt = "d%%" }, - { mod = "ColdResistOverCap", label = "Cold Res. Over Max", fmt = "d%%" }, - { mod = "LightningResistOverCap", label = "Lightning Res. Over Max", fmt = "d%%" }, - { mod = "ChaosResistOverCap", label = "Chaos Res. Over Max", fmt = "d%%" }, + { stat = "FireResist", label = "Fire Resistance", fmt = "d%%", condFunc = function() return true end }, + { stat = "ColdResist", label = "Cold Resistance", fmt = "d%%", condFunc = function() return true end }, + { stat = "LightningResist", label = "Lightning Resistance", fmt = "d%%", condFunc = function() return true end }, + { stat = "ChaosResist", label = "Chaos Resistance", fmt = "d%%", condFunc = function() return true end }, + { stat = "FireResistOverCap", label = "Fire Res. Over Max", fmt = "d%%" }, + { stat = "ColdResistOverCap", label = "Cold Res. Over Max", fmt = "d%%" }, + { stat = "LightningResistOverCap", label = "Lightning Res. Over Max", fmt = "d%%" }, + { stat = "ChaosResistOverCap", label = "Chaos Res. Over Max", fmt = "d%%" }, } self.viewMode = "TREE" @@ -584,11 +585,15 @@ function buildMode:RefreshStatList() -- Build list of side bar stats wipeTable(self.controls.statBox.list) for index, statData in ipairs(self.displayStats) do - if statData.mod then + if statData.stat then if not statData.flag or self.calcsTab.mainEnv.mainSkill.skillFlags[statData.flag] then - local modVal = self.calcsTab.mainOutput[statData.mod] + local modVal = self.calcsTab.mainOutput[statData.stat] if modVal and ((statData.condFunc and statData.condFunc(modVal,self.calcsTab.mainOutput)) or (not statData.condFunc and modVal ~= 0)) then - t_insert(self.controls.statBox.list, { height = 16, "^7"..statData.label..":", string.format("%s%"..statData.fmt, modVal >= 0 and "^7" or data.colorCodes.NEGATIVE, modVal * (statData.pc and 100 or 1)) }) + t_insert(self.controls.statBox.list, { + height = 16, + "^7"..statData.label..":", + string.format("%s%"..statData.fmt, modVal >= 0 and "^7" or data.colorCodes.NEGATIVE, modVal * ((statData.pc or statData.mod) and 100 or 1) - (statData.mod and 100 or 0)) + }) end end else @@ -603,16 +608,16 @@ end function buildMode:AddStatComparesToTooltip(baseOutput, compareOutput, header) local count = 0 for _, statData in ipairs(self.displayStats) do - if statData.mod and (not statData.flag or self.calcsTab.mainEnv.mainSkill.skillFlags[statData.flag]) then - local diff = (compareOutput[statData.mod] or 0) - (baseOutput[statData.mod] or 0) + if statData.stat and (not statData.flag or self.calcsTab.mainEnv.mainSkill.skillFlags[statData.flag]) then + local diff = (compareOutput[statData.stat] or 0) - (baseOutput[statData.stat] or 0) if diff > 0.001 or diff < -0.001 then if count == 0 then main:AddTooltipLine(14, header) end local color = ((statData.lowerIsBetter and diff < 0) or (not statData.lowerIsBetter and diff > 0)) and data.colorCodes.POSITIVE or data.colorCodes.NEGATIVE - local line = string.format("%s%+"..statData.fmt.." %s", color, diff * (statData.pc and 100 or 1), statData.label) - if statData.compPercent and (baseOutput[statData.mod] or 0) ~= 0 and (compareOutput[statData.mod] or 0) ~= 0 then - line = line .. string.format(" (%+.1f%%)", (compareOutput[statData.mod] or 0) / (baseOutput[statData.mod] or 0) * 100 - 100) + local line = string.format("%s%+"..statData.fmt.." %s", color, diff * ((statData.pc or statData.mod) and 100 or 1), statData.label) + 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 main:AddTooltipLine(14, line) count = count + 1 diff --git a/Modules/CalcSections.lua b/Modules/CalcSections.lua index fc42ea93..f513adbc 100644 --- a/Modules/CalcSections.lua +++ b/Modules/CalcSections.lua @@ -622,6 +622,7 @@ return { }, }, } }, { 1, "MiscDefences", 3, "Other Defences", data.colorCodes.DEFENCE, { + { label = "Movement Speed", { format = "x {2:output:MovementSpeedMod}", { modName = "MovementSpeed" }, }, }, { label = "Dodge Chance", { format = "{0:output:AttackDodgeChance}%", { modName = "AttackDodgeChance" }, }, }, { label = "Spell Ddg. Chance", { format = "{0:output:SpellDodgeChance}%", { modName = "SpellDodgeChance" }, }, }, { label = "Block Chance", { format = "{0:output:BlockChance}%", diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index b46e9ec7..d51c90b9 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -726,12 +726,20 @@ local function mergeMainMods(env, repSlotName, repItem) end end end + if item and item.type == "Flask" then + if env.configInput["enableFlask"..slot.slotNum] then + -- FIXME dunno lol + env.modDB.conditions["UsingFlask"] = true + else + item = nil + end + end env.itemList[slotName] = item if item then -- Merge mods for this item local srcList = item.modList or item.slotModList[slot.slotNum] env.modDB:AddList(srcList) - if item.type ~= "Jewel" then + if item.type ~= "Jewel" and item.type ~= "Flask" then -- Update item counts local key if item.rarity == "UNIQUE" then @@ -1169,13 +1177,8 @@ local function performCalcs(env) end -- Process conditions that can depend on other conditions - if env.mode_effective then - if condList["EnemyIgnited"] then - condList["EnemyBurning"] = true - end - condList["EnemyFrozenShockedIgnited"] = condList["EnemyFrozen"] or condList["EnemyShocked"] or condList["EnemyIgnited"] - condList["EnemyElementalStatus"] = condList["EnemyChilled"] or condList["EnemyFrozen"] or condList["EnemyShocked"] or condList["EnemyIgnited"] - condList["NotEnemyElementalStatus"] = not condList["EnemyElementalStatus"] + if condList["EnemyIgnited"] then + condList["EnemyBurning"] = true end -- Calculate current and maximum charges @@ -1588,6 +1591,10 @@ local function performCalcs(env) -- Other defences: block, dodge, stun recovery/avoidance do + output.MovementSpeedMod = calcMod(modDB, nil, "MovementSpeed") + if modDB:Sum("FLAG", nil, "MovementSpeedCannotBeBelowBase") then + output.MovementSpeedMod = m_max(output.MovementSpeedMod, 1) + end output.BlockChanceMax = modDB:Sum("BASE", nil, "BlockChanceMax") local shieldData = env.itemList["Weapon 2"] and env.itemList["Weapon 2"].armourData output.BlockChance = m_min(((shieldData and shieldData.BlockChance or 0) + modDB:Sum("BASE", nil, "BlockChance")) * calcMod(modDB, nil, "BlockChance"), output.BlockChanceMax) @@ -2586,6 +2593,11 @@ local function performCalcs(env) if igniteMode == "CRIT" then output.IgniteChanceOnHit = 0 end + if globalBreakdown then + globalBreakdown.IgniteDPS = { + s_format("Ignite mode: %s ^8(can be changed in the Configuration tab)", igniteMode == "CRIT" and "Crit Damage" or "Average Damage") + } + end local baseVal = calcSecondaryEffectBase("Ignite", sourceHitDmg, sourceCritDmg) * 0.2 if baseVal > 0 then skillFlags.ignite = true @@ -2597,11 +2609,6 @@ local function performCalcs(env) } end local dotCfg = env.mainSkill.igniteCfg - if globalBreakdown then - globalBreakdown.IgniteDPS = { - s_format("Ignite mode: %s ^8(can be changed in the Configuration tab)", igniteMode == "CRIT" and "Crit Damage" or "Average Damage") - } - end local effMult = 1 if env.mode_effective then local resist = m_min(enemyDB:Sum("BASE", nil, "FireResist", "ElementalResist"), 75) diff --git a/Modules/Data.lua b/Modules/Data.lua index 920b1e57..0a398a0f 100644 --- a/Modules/Data.lua +++ b/Modules/Data.lua @@ -3,6 +3,7 @@ -- Module: Data -- Contains static data used by other modules. -- +local launch = ... data = { } @@ -257,6 +258,7 @@ local itemTypes = { "ring", "belt", "jewel", + launch.enableFlasks and "flask" or nil, } for _, type in pairs(itemTypes) do LoadModule("Data/Bases/"..type, data.itemBases) diff --git a/Modules/ItemTools.lua b/Modules/ItemTools.lua index a25c0299..035bda8e 100644 --- a/Modules/ItemTools.lua +++ b/Modules/ItemTools.lua @@ -98,12 +98,22 @@ function itemLib.parseItemRaw(item) item.base = data.itemBases[item.baseName] item.modLines = { } item.implicitLines = 0 + local flaskBuffLines = { } + if item.base and item.base.flask and item.base.flask.buff then + for _, line in ipairs(item.base.flask.buff) do + flaskBuffLines[line] = true + local modList, extra = modLib.parseMod(line) + t_insert(item.modLines, { line = line, extra = extra, modList = modList or { }, buff = true }) + end + end local gameModeStage = "FINDIMPLICIT" local gameModeSection = 1 local foundExplicit while item.rawLines[l] do local line = item.rawLines[l] - if line == "--------" then + if flaskBuffLines[line] then + flaskBuffLines[line] = nil + elseif line == "--------" then gameModeSection = gameModeSection + 1 if gameModeStage == "IMPLICIT" then item.implicitLines = #item.modLines @@ -228,7 +238,7 @@ function itemLib.parseItemRaw(item) elseif mode == "GAME" and not foundExplicit then item.implicitLines = 0 end - if not item.corrupted and not item.uniqueID and item.base and (item.base.armour or item.base.weapon) then + 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 if item.variantList then @@ -316,6 +326,8 @@ function itemLib.getPrimarySlotForItem(item) return "Weapon 2" elseif item.type == "Ring" then return "Ring 1" + elseif item.type == "Flask" then + return "Flask 1" else return item.type end @@ -425,11 +437,52 @@ function itemLib.buildItemModListForSlotNum(item, baseList, slotNum) if item.base.armour.blockChance then armourData.BlockChance = item.base.armour.blockChance + sumLocal(modList, "BlockChance", "BASE", 0) end + if item.base.armour.movementPenalty then + modList:NewMod("MovementSpeed", "INC", -item.base.armour.movementPenalty, item.modSource, { type = "Condition", var = "IgnoreMovementPenalties", neg = true }) + end for _, value in ipairs(modList:Sum("LIST", nil, "Misc")) do if value.type == "ArmourData" then armourData[value.key] = value.value end end + elseif item.base.flask then + local flaskData = item.flaskData + local durationInc = sumLocal(modList, "Duration", "INC", 0) + if item.base.flask.life or item.base.flask.mana then + -- Recovery flask + local recoveryMod = 1 + sumLocal(modList, "FlaskRecovery", "INC", 0) / 100 + local rateMod = 1 + sumLocal(modList, "FlaskRecoveryRate", "INC", 0) / 100 + local instant = sumLocal(modList, "FlaskInstantRecovery", "BASE", 0) + local durBase = item.base.flask.duration * (1 + durationInc / 100) + if item.base.flask.life then + local base = item.base.flask.life * (1 + item.quality / 100) * recoveryMod + local inst = base * instant / 100 + local grad = base * (1 - instant / 100) * (1 + durationInc / 100) + flaskData.lifeTotal = inst + grad + flaskData.lifeDuration = durBase / rateMod + end + if item.base.flask.mana then + local base = item.base.flask.mana * (1 + item.quality / 100) * recoveryMod + local inst = base * instant / 100 + local grad = base * (1 - instant / 100) * (1 + durationInc / 100) + flaskData.manaTotal = inst + grad + flaskData.manaDuration = durBase / rateMod + end + else + -- Utility flask + flaskData.duration = round(item.base.flask.duration * (1 + (durationInc + item.quality) / 100), 1) + end + local extra = sumLocal(modList, "FlaskCharges", "BASE", 0) + local usedInc = sumLocal(modList, "FlaskChargesUsed", "INC", 0) + local gainedInc = sumLocal(modList, "FlaskChargeRecovery", "INC", 0) + flaskData.chargesMax = item.base.flask.chargesMax + extra + flaskData.chargesUsed = m_floor(item.base.flask.chargesUsed * (1 + usedInc / 100)) + flaskData.gainMod = 1 + gainedInc / 100 + for _, value in ipairs(modList:Sum("LIST", nil, "Misc")) do + if value.type == "FlaskData" then + flaskData[value.key] = value.value + end + end elseif item.type == "Jewel" then item.jewelFunc = nil for _, value in ipairs(modList:Sum("LIST", nil, "Misc")) do @@ -450,6 +503,7 @@ function itemLib.buildItemModList(item) local baseList = { } item.baseModList = baseList item.rangeLineList = { } + item.modSource = "Item:"..(item.id or -1)..":"..item.name for _, modLine in ipairs(item.modLines) do if not modLine.extra and (not modLine.variantList or modLine.variantList[item.variant]) then if modLine.range then @@ -461,7 +515,7 @@ function itemLib.buildItemModList(item) end end for _, mod in ipairs(modLine.modList) do - mod.source = "Item:"..(item.id or -1)..":"..item.name + mod.source = item.modSource if type(mod.value) == "table" and mod.value.mod then mod.value.mod.source = mod.source end @@ -477,6 +531,8 @@ function itemLib.buildItemModList(item) item.weaponData = { } elseif item.base.armour then item.armourData = { } + elseif item.base.flask then + item.flaskData = { } end if item.base.weapon or item.type == "Ring" then item.slotModList = { } diff --git a/Modules/Main.lua b/Modules/Main.lua index a373fd3c..604ed0cd 100644 --- a/Modules/Main.lua +++ b/Modules/Main.lua @@ -13,7 +13,7 @@ local m_max = math.max local m_min = math.min LoadModule("Modules/Common") -LoadModule("Modules/Data") +LoadModule("Modules/Data", launch) LoadModule("Modules/ModTools") LoadModule("Modules/ItemTools") @@ -486,7 +486,7 @@ function main:DrawTooltip(x, y, w, h, viewPort, col, center) DrawString(ttX + 6, y, "LEFT", data.size, "VAR", data.text) end y = y + data.size + 2 - elseif self.tooltipLines[i + 1] and self.tooltipLines[i - 1] and self.tooltipLines[i - 1].text then + elseif self.tooltipLines[i + 1] and self.tooltipLines[i - 1] and self.tooltipLines[i + 1].text then if type(col) == "string" then SetDrawColor(col) else diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 92e7e9c4..d65ce81e 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -91,6 +91,7 @@ local modNameList = { ["cold and lightning resistances"] = { "ColdResist", "LightningResist" }, ["elemental resistances"] = "ElementalResist", ["all elemental resistances"] = "ElementalResist", + ["all maximum elemental resistances"] = { "FireResistMax", "ColdResistMax", "LightningResistMax" }, ["all maximum resistances"] = { "FireResistMax", "ColdResistMax", "LightningResistMax", "ChaosResistMax" }, -- Other defences ["to dodge attacks"] = "AttackDodgeChance", @@ -231,6 +232,22 @@ local modNameList = { ["light radius"] = "LightRadius", ["rarity of items found"] = "LootRarity", ["quantity of items found"] = "LootQuantity", + -- Flask modifiers + ["effect"] = "FlaskEffect", + ["effect of flasks"] = "FlaskEffect", + ["amount recovered"] = "FlaskRecovery", + ["life recovery from flasks"] = "FlaskLifeRecovery", + ["mana recovery from flasks"] = "FlaskManaRecovery", + ["flask effect duration"] = "FlaskDuration", + ["recovery speed"] = "FlaskRecoveryRate", + ["flask recovery speed"] = "FlaskRecoveryRate", + ["flask life recovery rate"] = "FlaskLifeRecoveryRate", + ["flask mana recovery rate"] = "FlaskManaRecoveryRate", + ["extra charges"] = "FlaskCharges", + ["charges used"] = "FlaskChargesUsed", + ["flask charges used"] = "FlaskChargesUsed", + ["flask charges gained"] = "FlaskChargesGained", + ["charge recovery"] = "FlaskChargeRecovery", } -- List of modifier flags @@ -367,6 +384,7 @@ local modTagList = { ["while you have onslaught"] = { tag = { type = "Condition", var = "Onslaught" } }, ["while phasing"] = { tag = { type = "Condition", var = "Phasing" } }, ["while using a flask"] = { tag = { type = "Condition", var = "UsingFlask" } }, + ["during effect"] = { tag = { type = "Condition", var = "UsingFlask" } }, ["during flask effect"] = { tag = { type = "Condition", var = "UsingFlask" } }, ["while on consecrated ground"] = { tag = { type = "Condition", var = "OnConsecratedGround" } }, ["on burning ground"] = { tag = { type = "Condition", var = "OnBurningGround" } }, @@ -416,9 +434,9 @@ local modTagList = { ["against frozen enemies"] = { tag = { type = "Condition", var = "EnemyFrozen" }, flags = ModFlag.Hit }, ["against chilled enemies"] = { tag = { type = "Condition", var = "EnemyChilled" }, flags = ModFlag.Hit }, ["enemies which are chilled"] = { tag = { type = "Condition", var = "EnemyChilled" }, flags = ModFlag.Hit }, - ["against frozen, shocked or ignited enemies"] = { tag = { type = "Condition", var = "EnemyFrozenShockedIgnited" }, flags = ModFlag.Hit }, - ["against enemies that are affected by elemental status ailments"] = { tag = { type = "Condition", var = "EnemyElementalStatus" }, flags = ModFlag.Hit }, - ["against enemies that are affected by no elemental status ailments"] = { tag = { type = "Condition", var = "NotEnemyElementalStatus" }, flags = ModFlag.Hit }, + ["against frozen, shocked or ignited enemies"] = { tag = { type = "Condition", varList = {"EnemyFrozen","EnemyShocked","EnemyIgnited"} }, flags = ModFlag.Hit }, + ["against enemies that are affected by elemental status ailments"] = { tag = { type = "Condition", varList = {"EnemyFrozen","EnemyChilled","EnemyShocked","EnemyIgnited"} }, flags = ModFlag.Hit }, + ["against enemies that are affected by no elemental status ailments"] = { tagList = { { type = "Condition", varList = {"EnemyFrozen","EnemyChilled","EnemyShocked","EnemyIgnited"}, neg = true }, { type = "Condition", var = "Effective" } }, flags = ModFlag.Hit }, } local mod = modLib.createMod @@ -485,6 +503,7 @@ local specialModList = { ["bleeding you inflict on maimed enemies deals (%d+)%% more damage"] = function(num) return { mod("Damage", "MORE", num, nil, 0, KeywordFlag.Bleed, { type = "Condition", var = "EnemyMaimed"}) } end, ["critical strikes ignore enemy monster elemental resistances"] = { flag("IgnoreElementalResistances", { type = "Condition", var = "CriticalStrike" }) }, ["non%-critical strikes penetrate (%d+)%% of enemy elemental resistances"] = function(num) return { mod("ElementalPenetration", "BASE", num, { type = "Condition", var = "CriticalStrike", neg = true }) } end, + ["movement speed cannot be modified to below base value"] = { flag("MovementSpeedCannotBeBelowBase") }, -- Special node types ["(%d+)%% of block chance applied to spells"] = function(num) return { mod("BlockChanceConv", "BASE", num) } end, ["(%d+)%% additional block chance with staves"] = function(num) return { mod("BlockChance", "BASE", num, { type = "Condition", var = "UsingStaff" }) } end, @@ -499,6 +518,13 @@ local specialModList = { ["cannot be frozen"] = { mod("AvoidFreeze", "BASE", 100) }, ["cannot be chilled"] = { mod("AvoidChill", "BASE", 100) }, ["cannot be ignited"] = { mod("AvoidIgnite", "BASE", 100) }, + ["you are immune to bleeding"] = { mod("AvoidBleed", "BASE", 100) }, + ["immunity to shock during flask effect"] = { mod("AvoidShock", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, + ["immunity to freeze and chill during flask effect"] = { mod("AvoidFreeze", "BASE", 100, { type = "Condition", var = "UsingFlask" }), mod("AvoidChill", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, + ["immunity to ignite during flask effect"] = { mod("AvoidIgnite", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, + ["immunity to bleeding during flask effect"] = { mod("AvoidBleed", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, + ["immune to poison during flask effect"] = { mod("AvoidPoison", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, + ["immune to curses during flask effect"] = { mod("AvoidCurse", "BASE", 100, { type = "Condition", var = "UsingFlask" }) }, ["cannot evade enemy attacks"] = { flag("CannotEvade") }, ["deal no physical damage"] = { flag("DealNoPhysical") }, ["deal no elemental damage"] = { flag("DealNoLightning"), flag("DealNoCold"), flag("DealNoFire") }, @@ -511,6 +537,10 @@ local specialModList = { ["skills chain %+(%d) times"] = function(num) return { mod("ChainCount", "BASE", num) } end, ["reflects (%d+) physical damage to melee attackers"] = { }, ["critical strikes with daggers have a (%d+)%% chance to poison the enemy"] = function(num) return { mod("PoisonChance", "BASE", num, nil, ModFlag.Dagger, { type = "Condition", var = "CriticalStrike" }) } end, + ["ignore all movement penalties from armour"] = { mod("Misc", "LIST", { type = "Condition", var = "IgnoreMovementPenalties" }) }, + ["your critical strike chance is lucky"] = { flag("CritChanceLucky") }, + ["phasing"] = { mod("Misc", "LIST", { type = "Condition", var = "Phasing" }) }, + ["onslaught"] = { mod("Misc", "LIST", { type = "Condition", var = "Onslaught" }) }, -- Special item local modifiers ["no physical damage"] = { mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalMin" }), mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalMax" }), mod("Misc", "LIST", { type = "WeaponData", key = "PhysicalDPS" }) }, ["all attacks with this weapon are critical strikes"] = { mod("Misc", "LIST", { type = "WeaponData", key = "critChance", value = 100 }) }, @@ -540,6 +570,8 @@ local specialModList = { ["socketed gems have blood magic"] = { flag("SkillBloodMagic", { type = "SocketedIn" }) }, ["socketed gems gain (%d+)%% of physical damage as extra lightning damage"] = function(num) return { mod("PhysicalDamageGainAsLightning", "BASE", num, { type = "SocketedIn" }) } end, ["socketed red gems get (%d+)%% physical damage as extra fire damage"] = function(num) return { mod("PhysicalDamageGainAsFire", "BASE", num, { type = "SocketedIn", keyword = "strength" }) } end, + ["instant recovery"] = { mod("FlaskInstantRecovery", "BASE", 100) }, + ["(%d+)%% of recovery applied instantly"] = function(num) return { mod("FlaskInstantRecovery", "BASE", num) } end, -- Unique item modifiers ["your cold damage can ignite"] = { flag("ColdCanIgnite") }, ["your fire damage can shock but not ignite"] = { flag("FireCanShock"), flag("FireCannotIgnite") }, @@ -633,6 +665,7 @@ local convTypes = { ["as extra chaos damage"] = "GainAsChaos", ["added as chaos damage"] = "GainAsChaos", ["gained as extra chaos damage"] = "GainAsChaos", + ["converted to lightning"] = "ConvertToLightning", ["converted to lightning damage"] = "ConvertToLightning", ["converted to cold damage"] = "ConvertToCold", ["converted to fire damage"] = "ConvertToFire", diff --git a/PathOfBuilding.sln b/PathOfBuilding.sln index 0caee3d0..864e0f9f 100644 --- a/PathOfBuilding.sln +++ b/PathOfBuilding.sln @@ -33,6 +33,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Item bases", "Item bases", Data\Bases\bow.lua = Data\Bases\bow.lua Data\Bases\claw.lua = Data\Bases\claw.lua Data\Bases\dagger.lua = Data\Bases\dagger.lua + Data\Bases\flask.lua = Data\Bases\flask.lua Data\Bases\gloves.lua = Data\Bases\gloves.lua Data\Bases\helmet.lua = Data\Bases\helmet.lua Data\Bases\jewel.lua = Data\Bases\jewel.lua @@ -113,6 +114,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Unique items", "Unique item Data\Uniques\bow.lua = Data\Uniques\bow.lua Data\Uniques\claw.lua = Data\Uniques\claw.lua Data\Uniques\dagger.lua = Data\Uniques\dagger.lua + Data\Uniques\flask.lua = Data\Uniques\flask.lua Data\Uniques\gloves.lua = Data\Uniques\gloves.lua Data\Uniques\helmet.lua = Data\Uniques\helmet.lua Data\Uniques\jewel.lua = Data\Uniques\jewel.lua diff --git a/README.md b/README.md index 72fecf3b..c09655f9 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ 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.2.40 - 2017/02/11 + * Movement Speed is now calculated and displayed in the sidebar and Calcs tab (in Other Defences) + * Fixed display issue in the breakdown for ignite DPS + * Fixed issue preventing some condition toggles from showing when related passive nodes are allocated + ### 1.2.39 - 2017/02/08 This update adds full support for Dual Wielding: * DPS calculations for dual wield skills will now use both weapons if they are usable with the skill diff --git a/changelog.txt b/changelog.txt index 346b2871..cb9abbba 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,7 @@ +VERSION[1.2.40][2017/02/11] + * Movement Speed is now calculated and displayed in the sidebar and Calcs tab (in Other Defences) + * Fixed display issue in the breakdown for ignite DPS + * Fixed issue preventing some condition toggles from showing when related passive nodes are allocated VERSION[1.2.39][2017/02/08] This update adds full support for Dual Wielding: * DPS calculations for dual wield skills will now use both weapons if they are usable with the skill diff --git a/manifest.xml b/manifest.xml index a0f24b39..ec9f73dc 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,30 +1,30 @@ - + - + - + - + - + - + @@ -42,15 +42,15 @@ - + - - + + - - - - + + + + @@ -66,18 +66,19 @@ - + + - + @@ -89,6 +90,7 @@ +