From e1285e39974350189b56b35d29e94a86d4e09f2b Mon Sep 17 00:00:00 2001 From: Openarl Date: Mon, 28 Nov 2016 21:00:21 +1000 Subject: [PATCH] Release 1.2.17 - Added more uniques - Support for Mastermind of Discord - Added conversion mods to hit breakdown - Added 2x multiplier to Cyclone - Fixed Lightning Golem buff --- Classes/CalcBreakdownControl.lua | 2 +- Classes/ConfigTab.lua | 55 +++++- Classes/ModDB.lua | 13 +- Classes/ModList.lua | 13 +- Data/Bases/amulet.lua | 10 ++ Data/Bases/belt.lua | 12 +- Data/Bases/boots.lua | 6 + Data/Bases/gloves.lua | 18 ++ Data/Bases/helmet.lua | 6 + Data/Bases/ring.lua | 54 +++--- Data/Gems/act_dex.lua | 1 + Data/Gems/act_int.lua | 2 +- Data/New.lua | 288 +++---------------------------- Data/Rares.lua | 6 +- Data/Uniques/amulet.lua | 9 + Data/Uniques/body.lua | 9 + Data/Uniques/boots.lua | 12 ++ Data/Uniques/bow.lua | 10 ++ Data/Uniques/claw.lua | 15 ++ Data/Uniques/gloves.lua | 13 ++ Data/Uniques/helmet.lua | 19 ++ Data/Uniques/jewel.lua | 6 + Data/Uniques/mace.lua | 15 ++ Data/Uniques/ring.lua | 34 ++++ Data/Uniques/sword.lua | 56 ++++++ Modules/CalcSections.lua | 12 +- Modules/Calcs.lua | 12 +- Modules/ItemTools.lua | 4 + Modules/ModParser.lua | 34 +++- README.md | 8 + changelog.txt | 7 + manifest.xml | 62 +++---- 32 files changed, 477 insertions(+), 346 deletions(-) diff --git a/Classes/CalcBreakdownControl.lua b/Classes/CalcBreakdownControl.lua index 2a3151d2..2c2f1275 100644 --- a/Classes/CalcBreakdownControl.lua +++ b/Classes/CalcBreakdownControl.lua @@ -331,7 +331,7 @@ function CalcBreakdownClass:AddModSection(sectionData) for _, tag in ipairs(row.mod.tagList) do local desc if tag.type == "Condition" then - desc = "Condition: "..self:FormatModName(tag.var) + desc = "Condition: "..(tag.varList and table.concat(tag.varList, "/") or self:FormatModName(tag.var)) elseif tag.type == "Multiplier" then if tag.base then desc = (row.mod.type == "BASE" and string.format("%+g", tag.base) or tag.base.."%").." + "..math.abs(row.mod.value).." per "..self:FormatModName(tag.var) diff --git a/Classes/ConfigTab.lua b/Classes/ConfigTab.lua index 018570dd..973e7aa6 100644 --- a/Classes/ConfigTab.lua +++ b/Classes/ConfigTab.lua @@ -36,9 +36,6 @@ local varList = { { var = "conditionUsingFlask", type = "check", label = "Do you have a Flask active?", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsingFlask" }, "Config", { type = "Condition", var = "Combat" }) end }, - { var = "buffPendulum", type = "check", label = "Is Pendulum of Destruction active?", ifNode = 57197, apply = function(val, modList, enemyModList) - modList:NewMod("Misc", "LIST", { type = "Condition", var = "PendulumOfDestruction" }, "Config", { type = "Condition", var = "Combat" }) - end }, { var = "conditionOnConsecratedGround", type = "check", label = "Are you on Consecrated Ground?", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "OnConsecratedGround" }, "Config", { type = "Condition", var = "Combat" }) end }, @@ -51,10 +48,37 @@ local varList = { { var = "conditionKilledRecently", type = "check", label = "Have you Killed Recently?", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "KilledRecently" }, "Config", { type = "Condition", var = "Combat" }) end }, + { var = "conditionTotemsKilledRecently", type = "check", label = "Have your Totems Killed Recently?", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "TotemsKilledRecently" }, "Config", { type = "Condition", var = "Combat" }) + end }, { var = "conditionBeenHitRecently", type = "check", label = "Have you been Hit Recently?", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "BeenHitRecently" }, "Config", { type = "Condition", var = "Combat" }) end }, + { var = "buffPendulum", type = "check", label = "Is Pendulum of Destruction active?", ifNode = 57197, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "PendulumOfDestruction" }, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionAttackedRecently", type = "check", label = "Have you Attacked Recently?", ifNode = 3154, tooltip = "You will automatically be considered to have Attacked Recently if your main skill is an attack,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "AttackedRecently" }, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionCastSpellRecently", type = "check", label = "Have you Cast a Spell Recently?", ifNode = 3154, tooltip = "You will automatically be considered to have Cast a Spell Recently if your main skill is a spell,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "CastSpellRecently" }, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionUsedFireSkillInPast10Sec", type = "check", label = "Used a Fire Skill in the past 10s?", ifNode = 61259, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsedFireSkillInPast10Sec" }, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionUsedColdSkillInPast10Sec", type = "check", label = "Used a Cold Skill in the past 10s?", ifNode = 61259, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsedColdSkillInPast10Sec" }, "Config", { type = "Condition", var = "Combat" }) + end }, + { var = "conditionUsedLightningSkillInPast10Sec", type = "check", label = "Used a Light. Skill in the past 10s?", ifNode = 61259, apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "UsedLightningSkillInPast10Sec" }, "Config", { type = "Condition", var = "Combat" }) + end }, { section = "For Effective DPS" }, + { var = "conditionEnemyFullLife", type = "check", label = "Is the enemy on Full Life?", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyFullLife" }, "Config", { type = "Condition", var = "Effective" }) + end }, + { var = "conditionEnemyLowLife", type = "check", label = "Is the enemy on Low Life?", apply = function(val, modList, enemyModList) + modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyLowLife" }, "Config", { type = "Condition", var = "Effective" }) + end }, { var = "conditionEnemyCursed", type = "check", label = "Is the enemy Cursed?", tooltip = "Your enemy will automatically be considered to be Cursed if you have at least one curse enabled,\nbut you can use this option to force it if necessary.", apply = function(val, modList, enemyModList) modList:NewMod("Misc", "LIST", { type = "Condition", var = "EnemyCursed" }, "Config", { type = "Condition", var = "Effective" }) end }, @@ -121,11 +145,7 @@ local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost" local lastSection for _, varData in ipairs(varList) do if varData.section then - if lastSection then - lastSection = common.New("SectionControl", {"TOPLEFT",lastSection,"BOTTOMLEFT"}, 0, 18, 300, 0, varData.section) - else - lastSection = common.New("SectionControl", {"TOPLEFT",self,"TOPLEFT"}, 10, 18, 300, 0, varData.section) - end + lastSection = common.New("SectionControl", {"TOPLEFT",self,"TOPLEFT"}, 0, 0, 300, 0, varData.section) lastSection.varControlList = { } lastSection.height = function(self) local height = 20 @@ -155,11 +175,15 @@ local ConfigTabClass = common.NewClass("ConfigTab", "UndoHandler", "ControlHost" self.build.buildFlag = true end) end - control.tooltip = varData.tooltip if varData.ifNode then control.shown = function() return self.build.spec.allocNodes[varData.ifNode] end + control.tooltip = function() + return "This option is specific to '"..self.build.spec.nodes[varData.ifNode].dn.."'."..(varData.tooltip and "\n"..varData.tooltip or "") + end + else + control.tooltip = varData.tooltip end t_insert(self.controls, common.New("LabelControl", {"RIGHT",control,"LEFT"}, -4, 2, 0, 14, "^7"..varData.label)) self.varControls[varData.var] = control @@ -238,6 +262,7 @@ function ConfigTabClass:Draw(viewPort, inputEvents) self:ProcessControlsInput(inputEvents, viewPort) + local colY = { } for _, section in ipairs(self.sectionList) do local y = 14 for _, varControl in ipairs(section.varControlList) do @@ -246,6 +271,18 @@ function ConfigTabClass:Draw(viewPort, inputEvents) y = y + 20 end end + local width, height = section:GetSize() + local col = 1 + while true do + colY[col] = colY[col] or 18 + if colY[col] + height + 10 <= viewPort.height then + break + end + col = col + 1 + end + section.x = 10 + (col - 1) * 310 + section.y = colY[col] + colY[col] = colY[col] + height + 18 end main:DrawBackground(viewPort) diff --git a/Classes/ModDB.lua b/Classes/ModDB.lua index f97e1e3b..6ab8ee5b 100644 --- a/Classes/ModDB.lua +++ b/Classes/ModDB.lua @@ -154,7 +154,18 @@ function ModDBClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, value = value * mult + (tag.base or 0) end elseif tag.type == "Condition" then - if not self.conditions[tag.var] then + local match = false + if tag.varList then + for _, var in pairs(tag.varList) do + if self.conditions[var] then + match = true + break + end + end + else + match = self.conditions[tag.var] + end + if not match then value = nullValue end elseif tag.type == "SocketedIn" then diff --git a/Classes/ModList.lua b/Classes/ModList.lua index 17ef3b4f..0b28ea24 100644 --- a/Classes/ModList.lua +++ b/Classes/ModList.lua @@ -124,7 +124,18 @@ function ModListClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7 value = value * mult + (tag.base or 0) end elseif tag.type == "Condition" then - if not self.conditions[tag.var] then + local match = false + if tag.varList then + for _, var in pairs(tag.varList) do + if self.conditions[var] then + match = true + break + end + end + else + match = self.conditions[tag.var] + end + if not match then value = nullValue end elseif tag.type == "SocketedIn" then diff --git a/Data/Bases/amulet.lua b/Data/Bases/amulet.lua index a71f60c1..9dff46ee 100644 --- a/Data/Bases/amulet.lua +++ b/Data/Bases/amulet.lua @@ -56,6 +56,16 @@ itemBases["Ruby Amulet"] = { implicit = "+(20 to 30)% to Fire Resistance", req = { level = 35, }, } +itemBases["Marble Amulet"] = { + type = "Amulet", + implicit = "(1.2-1.6)% of Life Regenerated per second", + req = { level = 74 }, +} +itemBases["Blue Pearl Amulet"] = { + type = "Amulet", + implicit = "(48-56)% increased Mana Regeneration Rate", + req = { level = 77 }, +} itemBases["Ashscale Talisman"] = { diff --git a/Data/Bases/belt.lua b/Data/Bases/belt.lua index 416a6d27..a83125a9 100644 --- a/Data/Bases/belt.lua +++ b/Data/Bases/belt.lua @@ -30,4 +30,14 @@ itemBases["Cloth Belt"] = { type = "Belt", implicit = "(15 to 25)% increased Stun Recovery", req = { level = 16, }, -} \ No newline at end of file +} +itemBases["Vanguard Belt"] = { + type = "Belt", + implicit = "+(260-320) to Armour and Evasion Rating", + req = { level = 70 }, +} +itemBases["Crystal Belt"] = { + type = "Belt", + implicit = "+(60-80) to maximum Energy Shield", + req = { level = 79 }, +} diff --git a/Data/Bases/boots.lua b/Data/Bases/boots.lua index ab82ca30..d0187425 100644 --- a/Data/Bases/boots.lua +++ b/Data/Bases/boots.lua @@ -224,6 +224,12 @@ itemBases["Crusader Boots"] = { armour = { armourBase = 105, energyShieldBase = 31, }, req = { level = 64, str = 62, int = 62, }, } +itemBases["Two-Toned Boots"] = { + type = "Boots", + implicit = "", + armour = { armourBase = 109, energyShieldBase = 32 }, + req = { level = 72, str = 62, int = 62 }, +} itemBases["Wrapped Boots"] = { diff --git a/Data/Bases/gloves.lua b/Data/Bases/gloves.lua index f62b2374..b1a76ef5 100644 --- a/Data/Bases/gloves.lua +++ b/Data/Bases/gloves.lua @@ -46,6 +46,12 @@ itemBases["Titan Gauntlets"] = { armour = { armourBase = 210, }, req = { level = 69, str = 98, }, } +itemBases["Spiked Gloves"] = { + type = "Gloves", + implicit = "(16-20)% increased Melee Damage", + armour = { armourBase = 191 }, + req = { level = 73, str = 95 }, +} itemBases["Rawhide Gloves"] = { @@ -93,6 +99,12 @@ itemBases["Slink Gloves"] = { armour = { evasionBase = 210, }, req = { level = 70, dex = 95, }, } +itemBases["Gripped Gloves"] = { + type = "Gloves", + implicit = "(14-18)% increased Projectile Attack Damage", + armour = { evasionBase = 191 }, + req = { level = 73, dex = 95 }, +} itemBases["Wool Gloves"] = { @@ -140,6 +152,12 @@ itemBases["Sorcerer Gloves"] = { armour = { energyShieldBase = 61, }, req = { level = 69, int = 97, }, } +itemBases["Fingerless Silk Gloves"] = { + type = "Gloves", + implicit = "(12-16)% increased Spell Damage", + armour = { energyShieldBase = 56 }, + req = { level = 73, int = 95 }, +} itemBases["Fishscale Gauntlets"] = { diff --git a/Data/Bases/helmet.lua b/Data/Bases/helmet.lua index 66df413b..067db0cd 100644 --- a/Data/Bases/helmet.lua +++ b/Data/Bases/helmet.lua @@ -269,6 +269,12 @@ itemBases["Praetor Crown"] = { armour = { armourBase = 140, energyShieldBase = 63, }, req = { level = 68, str = 62, int = 91, }, } +itemBases["Bone Helmet"] = { + type = "Helmet", + implicit = "Minions deal (30-40)% increased Damage", + armour = { armourBase = 172, energyShieldBase = 50, }, + req = { level = 75, str = 76, int = 76, }, +} itemBases["Scare Mask"] = { diff --git a/Data/Bases/ring.lua b/Data/Bases/ring.lua index 4a765683..5c54d802 100644 --- a/Data/Bases/ring.lua +++ b/Data/Bases/ring.lua @@ -16,15 +16,10 @@ itemBases["Paua Ring"] = { implicit = "+(20 to 25) to Maximum Mana", req = { }, } -itemBases["Gold Ring"] = { +itemBases["Unset Ring"] = { type = "Ring", - implicit = "(6 to 15)% increased Rarity of Items found", - req = { level = 20, }, -} -itemBases["Ruby Ring"] = { - type = "Ring", - implicit = "+(20 to 30)% to Fire Resistance", - req = { level = 16, }, + implicit = "Has 1 Socket", + req = { level = 5, }, } itemBases["Sapphire Ring"] = { type = "Ring", @@ -36,6 +31,16 @@ itemBases["Topaz Ring"] = { implicit = "+(20 to 30)% to Lightning Resistance", req = { level = 12, }, } +itemBases["Ruby Ring"] = { + type = "Ring", + implicit = "+(20 to 30)% to Fire Resistance", + req = { level = 16, }, +} +itemBases["Gold Ring"] = { + type = "Ring", + implicit = "(6 to 15)% increased Rarity of Items found", + req = { level = 20, }, +} itemBases["Diamond Ring"] = { type = "Ring", implicit = "(20 to 30)% increased Global Critical Strike Chance", @@ -46,16 +51,6 @@ itemBases["Moonstone Ring"] = { implicit = "+(15 to 25) to maximum Energy Shield", req = { level = 20, }, } -itemBases["Prismatic Ring"] = { - type = "Ring", - implicit = "+(8 to 10)% to all Elemental Resistances", - req = { level = 30, }, -} -itemBases["Amethyst Ring"] = { - type = "Ring", - implicit = "+(9 to 13)% to Chaos Resistance", - req = { level = 30, }, -} itemBases["Two-Stone Ring"] = { type = "Ring", implicit = "+(12 to 16)% to Fire and Cold Resistances", @@ -71,8 +66,23 @@ itemBases["Two-Stone Ring"] = { implicit = "+(12 to 16)% to Fire and Lightning Resistances", req = { level = 20, }, } -itemBases["Unset Ring"] = { +itemBases["Prismatic Ring"] = { type = "Ring", - implicit = "Has 1 Socket", - req = { level = 5, }, -} \ No newline at end of file + implicit = "+(8 to 10)% to all Elemental Resistances", + req = { level = 30, }, +} +itemBases["Amethyst Ring"] = { + type = "Ring", + implicit = "+(9 to 13)% to Chaos Resistance", + req = { level = 30, }, +} +itemBases["Steel Ring"] = { + type = "Ring", + implicit = "Adds (3-4) to (10-14) Physical Damage to Attacks", + req = { level = 80 }, +} +itemBases["Opal Ring"] = { + type = "Ring", + implicit = "(15-25)% increased Elemental Damage", + req = { level = 80 }, +} diff --git a/Data/Gems/act_dex.lua b/Data/Gems/act_dex.lua index 75cbc80c..ef1c868a 100644 --- a/Data/Gems/act_dex.lua +++ b/Data/Gems/act_dex.lua @@ -740,6 +740,7 @@ gems["Cyclone"] = { --"base_skill_number_of_additional_hits" = 1 --"cyclone_first_hit_damage_+%_final" = -50 --"is_area_damage" = ? + skill("dpsMultiplier", 2), }, qualityMods = { mod("AreaRadius", "INC", 0.5), --"base_skill_area_of_effect_+%" = 0.5 diff --git a/Data/Gems/act_int.lua b/Data/Gems/act_int.lua index c7a6223a..622ac640 100644 --- a/Data/Gems/act_int.lua +++ b/Data/Gems/act_int.lua @@ -3925,7 +3925,7 @@ gems["Summon Lightning Golem"] = { levelMods = { [1] = skill("manaCost", nil), --[2] = "base_actor_scale_+%" - [3] = mod("Speed", "INC", nil), --"lightning_golem_grants_attack_and_cast_speed_+%" + [3] = mod("Speed", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff" }), --"lightning_golem_grants_attack_and_cast_speed_+%" [4] = mod("MinionLife", "INC", nil), --"minion_maximum_life_+%" --[5] = "display_minion_monster_level" }, diff --git a/Data/New.lua b/Data/New.lua index f34bb492..63f29fc5 100644 --- a/Data/New.lua +++ b/Data/New.lua @@ -6,72 +6,13 @@ local gems = data.gems local itemBases = data.itemBases -itemBases["Blue Pearl Amulet"] = { - type = "Amulet", - implicit = "(48-56)% increased Mana Regeneration Rate", - req = { level = 77 }, -} -itemBases["Marble Amulet"] = { - type = "Amulet", - implicit = "(1.2-1.6)% of Life Regenerated per second", - req = { level = 74 }, -} -itemBases["Steel Ring"] = { - type = "Ring", - implicit = "Adds (3-4) to (10-14) Physical Damage to Attacks", - req = { level = 80 }, -} -itemBases["Opal Ring"] = { - type = "Ring", - implicit = "(15-25)% increased Elemental Damage", - req = { level = 80 }, -} -itemBases["Vanguard Belt"] = { - type = "Belt", - implicit = "+(260-320) to Armour and Evasion Rating", - req = { level = 70 }, -} -itemBases["Crystal Belt"] = { - type = "Belt", - implicit = "+(60-80) to maximum Energy Shield", - req = { level = 79 }, -} -itemBases["Bone Helmet"] = { - type = "Helmet", - implicit = "Minions deal (30 to 40)% increased Damage", - armour = { armourBase = 172, energyShieldBase = 50, }, - req = { level = 75, str = 76, int = 76, }, -} -itemBases["Fingerless Silk Gloves"] = { - type = "Gloves", - implicit = "(12-16)% increased Spell Damage", - armour = { energyShieldBase = 56 }, - req = { level = 73, int = 95 }, -} -itemBases["Gripped Gloves"] = { - type = "Gloves", - implicit = "(14-18)% increased Projectile Attack Damage", - armour = { evasionBase = 191 }, - req = { level = 73, dex = 95 }, -} -itemBases["Spiked Gloves"] = { - type = "Gloves", - implicit = "(16-20)% increased Melee Damage", - armour = { armourBase = 191 }, - req = { level = 73, str = 95 }, -} -itemBases["Two-Toned Boots"] = { - type = "Boots", - implicit = "", - armour = { armourBase = 109, energyShieldBase = 32 }, - req = { level = 72, str = 62, int = 62 }, -} itemBases["Breach Ring"] = { type = "Ring", implicit = "Properties are doubled while in a Breach", req = { level = 48 }, } + data.uniques.new = { [[ Ngamahu's Flame @@ -121,7 +62,7 @@ Shade of Solaris Sage Wand Unreleased: true Requires Level 30, 119 Int -(17 to 21)% increased Spell Damage +(17-21)% increased Spell Damage Gain 20% of Elemental Damage as Extra Chaos Damage Critical Strikes deal no Damage 120% increased Spell Damage if you've dealt a Critical Strike Recently @@ -152,7 +93,7 @@ Amber Amulet Unreleased: true League: Breach Requires Level 35 -+(20 to 30) to Strength ++(20-30) to Strength +27 to Strength 21% increased Fire Damage +28 to maximum Life @@ -164,7 +105,7 @@ Amber Amulet Unreleased: true League: Breach Requires Level 64 -+(20 to 30) to Strength ++(20-30) to Strength 10% increased maximum Life +30% to Fire Resistance 10% increased Strength @@ -217,206 +158,25 @@ Gain a Frenzy Charge on Hit while Bleeding 15% increased Movement Speed while Bleeding 10% increased Physical Damage Reduction while Stationary 50% chance to be inflicted with Bleeding when Hit by an Attack +]],[[ +Voice of the Storm +Lapis Amulet +Unreleased: true +League: Breach ++(20-30) to Intelligence ++15 to all Attributes +14% increased maximum Mana +Critical Strike Chance is increased by Uncapped Lightning Resistance +Lightning strikes when you deal a Critical Strike +]],[[ +Tulborn +Spiraled Wand +Unreleased: true +League: Breach +(15-19)% increased Spell Damage +12% increased Cast Speed +50% chance to gain a Power Charge on Killing a Frozen Enemy +Adds 10 to 20 Cold Damage to Spells per Power Charge ++21 Mana gained on Killing a Frozen Enemy ]], - - -[[ -The Brass Dome -Gladiator Plate -Requires Level 65, 177 Str -30% reduced Chance to Block Attacks and Spells -(600 to 650)% increased Armour -10% reduced Movement Speed -50% increased Shock Duration on You -Take no Extra Damage from Critical Strikes -]],[[ -Voidwalker -Murder Boots -Evasion: (386 to 450) -Energy Shield: (52 to 61) -Requires Level 69, 82 Dex, 42 Int -+(30 to 50) to Dexterity -(140 to 180)% increased Evasion and Energy Shield -30% increased Movement Speed -20% chance to Avoid Projectiles while Phasing -You have Phasing if you've Killed Recently -Projectiles Pierce while Phasing -]],[[ -Kitava's Thirst -Zealot Helmet -Armour: (177–187) -Energy Shield: (53–56) -Requires Level 44, 50 Str, 50 Int -15% reduced Cast Speed -(70 to 80)% increased Armour and Energy Shield -+(30 to 50) to maximum Mana -30% chance to Cast Socketed Spells when -you Spend at least 100 Mana to Use a Skill -]],[[ -Kondo's Pride -Ezomyte Blade -Two Handed Sword -Physical Damage: (226–418 to 256–475) -Critical Strike Chance: 5.00% -Attacks per Second: 1.25 -Requires Level 61, 113 Str, 113 Dex -18% increased Accuracy Rating -(270 to 320)% increased Physical Damage -0.6% of Physical Attack Damage Leeched as Life -50% increased Melee Damage against Bleeding Enemies -Cannot Leech Life from Critical Strikes -30% chance to Blind Enemies on Critical Strike -Causes Bleeding on Melee Critical Strike -]],[[ -Obscurantis -Lion Pelt -Requires Level 70, 150 Dex -+(300 to 500) to Accuracy Rating -(100 to 120)% increased Evasion Rating -+(50 to 80) to maximum Life -1% increased Projectile Attack Damage per 200 Accuracy Rating -]],[[ -Slivertongue -Harbinger Bow -Bow -Requires Level 68, 212 Dex -(30 to 50)% increased Critical Strike Chance -Adds (60-75) to (170-220) Physical Damage -100% increased Critical Strike Chance with arrows that Fork -Arrows that Pierce cause Bleeding -Arrows always Pierce after Chaining -]],[[ -Snakepit -Sapphire Ring -Requires Level 68 -+(20 to 30)% to Cold Resistance -(20 to 40)% increased Cold Damage -(5 to 10)% increased Cast Speed -Spells have an additional Projectile -]],[[ -Brain Rattler -Meatgrinder -Two Handed Mace -Physical Damage: (143–437 to 163–487) -Critical Strike Chance: 5.00% -Attacks per Second: 1.25 -Requires Level 63, 212 Str -20% increased Stun Duration on Enemies -Adds (80-100) to (320–370) Physical Damage -50% of Physical Damage Converted to Lightning Damage -15% chance to Shock -10% chance to Cause Monsters to Flee -Enemies you Shock have 30% reduced Cast Speed -Enemies you Shock have 20% reduced Movement Speed -]],[[ -Razor of the Seventh Sun -Midnight Blade -One Handed Sword -Requires Level 68, 113 Str, 113 Dex -18% increased Accuracy Rating -Adds (65-75) to (110-130) Physical Damage -100% increased Burning Damage if you've Ignited an Enemy Recently -Recovery 1% of Maximum Life when you Ignite an Enemy -100% increased Melee Physical Damage against Ignited Enemies -]],[[ -Eye of Innocence -Citrine Amulet -Requires Level 68 -+(16 to 24) to Strength and Dexterity -10% chance to Ignite -(50 to 70)% increased Damage while Ignited -Take 100 Fire Damage when you Ignite an Enemy -2% of Fire Damage Leeched as Life while Ignited -]],[[ -Cospri's Malice -Jewelled Foil -One Handed Sword -Elemental Damage: (80–160 to 100–200) -Critical Strike Chance: 5.50% -Attacks per Second: (1.73–1.82) -Requires Level 68, 212 Dex, 257 Int -+30% to Global Critical Strike Multiplier -No Physical Damage -Adds (80–100) to (160–200) Cold Damage -Adds (40–60) to (90–110) Cold Damage to Spells -(8 to 14)% increased Attack Speed -+257 Intelligence Requirement -60% increased Critical Strike Chance against Chilled Enemies -Cast a Socketed Cold Skill on Melee Critical Strike -]],[[ -The Scourge -Terror Claw -Claws -Physical Damage: 15–60 -Critical Strike Chance: 6.30% -Attacks per Second: 1.50 -Requires Level 70, 113 Dex, 113 Int -2% of Physical Attack Damage Leeched as Life -Adds (35-50) to (100-125) Physical Damage -(10 to 15)% increased Attack Speed -Minions have (10 to 15)% increased Attack Speed -10% Chance to summon a Spectral Wolf on Kill -Increases and reductions to Minion Damage also affects you -70% increased Minion Damage if you have Hit Recently -]],[[ -Unending Hunger -Cobalt Jewel -Minions have (5 to 8)% increased Radius of Area Skills -20% chance for Spectres to gain Soul Eater on Kill for 30 seconds -with 50 Intelligence from Allocated Passives in Radius -]],[[ -The Warden's Brand -Iron Ring -Requires Level 30 -Adds 1 to 4 Physical Damage to Attacks -Adds (5–15) to (25–50) Physical Damage to Attacks -30% reduced Attack Speed -15% chance to gain a Frenzy Charge when you Stun an Enemy -]],[[ -Praxis -Paua Ring -Requires Level 22 -+(20 to 25) to maximum Mana -+(30 to 60) to maximum Mana -(3 to 6) Mana Regenerated per second -−(4 to 8) to Mana Cost of Skills -8% of Damage taken gained as Mana when Hit -]],[[ -Valyrium -Moonstone Ring -Requires Level 38 -+(15 to 25) to maximum Energy Shield -+(10 to 20) to maximum Energy Shield -+(20 to 30)% to Fire Resistance -−40% to Cold Resistance -Stun Threshold is based on Energy Shield instead of Life -]],[[ -Shaper's Touch -Crusader Gloves -Armour: (194) -Energy Shield: (57) -Requires Level 66, 51 Str, 51 Int -(80 to 120)% increased Armour and Energy Shield -+2 Accuracy Rating per 2 Intelligence -+1 Life per 4 Dexterity -+1 Mana per 4 Strength -1% increased Energy Shield per 10 Strength -1% increased Evasion Rating per 10 Intelligence -1% increased Melee Physical Damage per 10 Dexterity -]],[[ -Starforge -Infernal Sword -Two Handed Sword -Physical Damage: (285–590 to 342–708) -Critical Strike Chance: 5.00% -Attacks per Second: (1.31–1.35) -Requires Level 67, 113 Str, 113 Dex -30% increased Accuracy Rating -(400 to 500)% increased Physical Damage -(5 to 8)% increased Attack Speed -+(90 to 100) to maximum Life -20% increased Area of Effect for Attacks -Deal no Elemental Damage -Your Physical Damage can Shock -]] } \ No newline at end of file diff --git a/Data/Rares.lua b/Data/Rares.lua index 51f03a0b..c40eb663 100644 --- a/Data/Rares.lua +++ b/Data/Rares.lua @@ -647,17 +647,17 @@ Suffixes: [[ Amulet Amber Amulet -+(20 to 30) Strength ++(20 to 30) to Strength {amulet} ]],[[ Amulet Jade Amulet -+(20 to 30) Dexterity ++(20 to 30) to Dexterity {amulet} ]],[[ Amulet Lapis Amulet -+(20 to 30) Intelligence ++(20 to 30) to Intelligence {amulet} ]],[[ Amulet diff --git a/Data/Uniques/amulet.lua b/Data/Uniques/amulet.lua index 741917e1..7d91e46f 100644 --- a/Data/Uniques/amulet.lua +++ b/Data/Uniques/amulet.lua @@ -141,6 +141,15 @@ Requires Level 20 30% increased Rarity of Items found Cannot be Stunned ]],[[ +Eye of Innocence +Citrine Amulet +Requires Level 68 ++(16-24) to Strength and Dexterity +10% chance to Ignite +(50-70)% increased Damage while Ignited +Take 100 Fire Damage when you Ignite an Enemy +2% of Fire Damage Leeched as Life while Ignited +]],[[ Hinekora's Sight Onyx Amulet Requires Level 20 diff --git a/Data/Uniques/body.lua b/Data/Uniques/body.lua index bb534b6a..1a4012f7 100644 --- a/Data/Uniques/body.lua +++ b/Data/Uniques/body.lua @@ -11,6 +11,15 @@ Adds 2 to 4 Physical Damage to Attacks −2 Physical Damage taken from Attacks 40% of Melee Physical Damage taken reflected to Attacker ]],[[ +The Brass Dome +Gladiator Plate +Requires Level 65, 177 Str +30% reduced Chance to Block Attacks and Spells +(600-650)% increased Armour +10% reduced Movement Speed +50% increased Shock Duration on You +Take no Extra Damage from Critical Strikes +]],[[ Death's Oath Astral Plate Variant: Pre 2.0.0 diff --git a/Data/Uniques/boots.lua b/Data/Uniques/boots.lua index ac8a68e7..35b3b239 100644 --- a/Data/Uniques/boots.lua +++ b/Data/Uniques/boots.lua @@ -385,5 +385,17 @@ Requires Level 27, 27 Dex, 27 Int (20 to 30)% increased Rarity of Items found +(30 to 40)% to Fire Resistance 10% increased Movement Speed +]],[[ +Voidwalker +Murder Boots +Evasion: (386 to 450) +Energy Shield: (52 to 61) +Requires Level 69, 82 Dex, 42 Int ++(30-50) to Dexterity +(140-180)% increased Evasion and Energy Shield +30% increased Movement Speed +20% chance to Avoid Projectiles while Phasing +You have Phasing if you've Killed Recently +Projectiles Pierce while Phasing ]], } diff --git a/Data/Uniques/bow.lua b/Data/Uniques/bow.lua index 6ac52c4e..99623f32 100644 --- a/Data/Uniques/bow.lua +++ b/Data/Uniques/bow.lua @@ -255,6 +255,16 @@ Attacks per Second: 1.54 +30 to Accuracy Rating +10 Mana gained on Kill ]],[[ +Slivertongue +Harbinger Bow +Bow +Requires Level 68, 212 Dex +(30-50)% increased Critical Strike Chance +Adds (60-75) to (170-220) Physical Damage +100% increased Critical Strike Chance with arrows that Fork +Arrows that Pierce cause Bleeding +Arrows always Pierce after Chaining +]],[[ Storm Cloud Long Bow Variant: Pre 2.0.0 diff --git a/Data/Uniques/claw.lua b/Data/Uniques/claw.lua index 546bb6f4..879a3142 100644 --- a/Data/Uniques/claw.lua +++ b/Data/Uniques/claw.lua @@ -183,6 +183,21 @@ Causes Bleeding on Hit 1% increased Bleed Duration per 12 Intelligence 30% Chance to cause Bleeding Enemies to Flee on hit ]],[[ +The Scourge +Terror Claw +Claws +Physical Damage: 15–60 +Critical Strike Chance: 6.30% +Attacks per Second: 1.50 +Requires Level 70, 113 Dex, 113 Int +2% of Physical Attack Damage Leeched as Life +Adds (35-50) to (100-125) Physical Damage +(10-15)% increased Attack Speed +Minions have (10-15)% increased Attack Speed +10% Chance to summon a Spectral Wolf on Kill +Increases and reductions to Minion Damage also affects you +70% increased Minion Damage if you have Hit Recently +]],[[ Touch of Anguish Imperial Claw Claw diff --git a/Data/Uniques/gloves.lua b/Data/Uniques/gloves.lua index 141dbbdc..3ec51d94 100644 --- a/Data/Uniques/gloves.lua +++ b/Data/Uniques/gloves.lua @@ -277,6 +277,19 @@ You cannot be Ignited for 3 seconds after being Ignited {variant:2}You cannot be Shocked for 3 seconds after being Shocked You grant (4 to 6) Frenzy Charges to allies on Death ]],[[ +Shaper's Touch +Crusader Gloves +Armour: (194) +Energy Shield: (57) +Requires Level 66, 51 Str, 51 Int +(80-120)% increased Armour and Energy Shield ++2 Accuracy Rating per 2 Intelligence ++1 Life per 4 Dexterity ++1 Mana per 4 Strength +1% increased Energy Shield per 10 Strength +1% increased Evasion Rating per 10 Intelligence +1% increased Melee Physical Damage per 10 Dexterity +]],[[ Southbound Soldier Gloves Armour: 80 diff --git a/Data/Uniques/helmet.lua b/Data/Uniques/helmet.lua index 8c05249c..af88f3e3 100644 --- a/Data/Uniques/helmet.lua +++ b/Data/Uniques/helmet.lua @@ -91,6 +91,14 @@ Requires Level 20, 46 Dex −(20 to 10)% to Fire Resistance −(20 to 10)% to Cold Resistance ]],[[ +Obscurantis +Lion Pelt +Requires Level 70, 150 Dex ++(300-500) to Accuracy Rating +(100-120)% increased Evasion Rating ++(50-80) to maximum Life +1% increased Projectile Attack Damage per 200 Accuracy Rating +]],[[ Rat's Nest Ursine Pelt Evasion: 600 @@ -345,6 +353,17 @@ Adds 1 to 13 Lightning Damage to Attacks 20% increased Elemental Resistances while on Low Life 20% reduced Mana Cost of Skills when on Low Life ]],[[ +Kitava's Thirst +Zealot Helmet +Armour: (177–187) +Energy Shield: (53–56) +Requires Level 44, 50 Str, 50 Int +15% reduced Cast Speed +(70-80)% increased Armour and Energy Shield ++(30-50) to maximum Mana +30% chance to Cast Socketed Spells when +you Spend at least 100 Mana to Use a Skill +]],[[ Mindspiral Aventail Helmet Armour: 88 diff --git a/Data/Uniques/jewel.lua b/Data/Uniques/jewel.lua index 31919ca3..3d1cabaf 100644 --- a/Data/Uniques/jewel.lua +++ b/Data/Uniques/jewel.lua @@ -284,6 +284,12 @@ Radius: Medium (6 to 10)% increased Projectile Damage With at least 50 Dexterity Allocated in Radius, each Spectral Throw Projectile gains 4% increased Damage each time it Hits. ]],[[ +Unending Hunger +Cobalt Jewel +Minions have (5-8)% increased Radius of Area Skills +20% chance for Spectres to gain Soul Eater on Kill for 30 seconds +with 50 Intelligence from Allocated Passives in Radius +]],[[ Unstable Payload Cobalt Jewel (8 to 12)% Chance for Traps to Trigger an additional time diff --git a/Data/Uniques/mace.lua b/Data/Uniques/mace.lua index a95a25ee..488f06f1 100644 --- a/Data/Uniques/mace.lua +++ b/Data/Uniques/mace.lua @@ -390,6 +390,21 @@ Implicits: 2 ]], -- Weapon: Two Handed Mace [[ +Brain Rattler +Meatgrinder +Two Handed Mace +Physical Damage: (143–437 to 163–487) +Critical Strike Chance: 5.00% +Attacks per Second: 1.25 +Requires Level 63, 212 Str +20% increased Stun Duration on Enemies +Adds (80-100) to (320–370) Physical Damage +50% of Physical Damage Converted to Lightning Damage +15% chance to Shock +10% chance to Cause Monsters to Flee +Enemies you Shock have 30% reduced Cast Speed +Enemies you Shock have 20% reduced Movement Speed +]],[[ Chober Chaber Great Mallet Two Handed Mace diff --git a/Data/Uniques/ring.lua b/Data/Uniques/ring.lua index fbce7c7f..dd30a4fb 100644 --- a/Data/Uniques/ring.lua +++ b/Data/Uniques/ring.lua @@ -282,6 +282,15 @@ Variant: Current {variant:2}2% increased Intelligence for each Unique Item you have equipped 3% additional chance for Slain monsters to drop Scrolls of Wisdom ]],[[ +Praxis +Paua Ring +Requires Level 22 ++(20-25) to maximum Mana ++(30-60) to maximum Mana +(3-6) Mana Regenerated per second +−(4-8) to Mana Cost of Skills +8% of Damage taken gained as Mana when Hit +]],[[ Pyre Sapphire Ring Requires Level 11 @@ -358,6 +367,14 @@ Adds (8-15 to 20-28) Fire Damage to Attacks Left ring slot: 30% reduced Reflected Elemental Damage taken Right ring slot: 30% reduced Reflected Physical Damage taken ]],[[ +Snakepit +Sapphire Ring +Requires Level 68 ++(20-30)% to Cold Resistance +(20-40)% increased Cold Damage +(5-10)% increased Cast Speed +Spells have an additional Projectile +]],[[ The Taming Prismatic Ring League: Domination, Nemesis @@ -418,6 +435,15 @@ Requires Level 38 0.2% of Damage Leeched as Life against Shocked Enemies 5% chance to Shock ]],[[ +Valyrium +Moonstone Ring +Requires Level 38 ++(15-25) to maximum Energy Shield ++(10-20) to maximum Energy Shield ++(20-30)% to Fire Resistance +−40% to Cold Resistance +Stun Threshold is based on Energy Shield instead of Life +]],[[ Ventor's Gamble Gold Ring Requires Level 65 @@ -451,5 +477,13 @@ Adds 1 to 3 Chaos Damage to Attacks {variant:2}(30 to 50)% chance to cause Bleeding on Melee Hit {variant:1}Melee Attacks Poison on Hit {variant:2}(20 to 40)% chance to Poison on Melee Hit +]],[[ +The Warden's Brand +Iron Ring +Requires Level 30 +Adds 1 to 4 Physical Damage to Attacks +Adds (5–15) to (25–50) Physical Damage to Attacks +30% reduced Attack Speed +15% chance to gain a Frenzy Charge when you Stun an Enemy ]], } \ No newline at end of file diff --git a/Data/Uniques/sword.lua b/Data/Uniques/sword.lua index 9deb8bcb..99f0699c 100644 --- a/Data/Uniques/sword.lua +++ b/Data/Uniques/sword.lua @@ -176,6 +176,16 @@ Adds (20-30 to 31-40) Physical Damage 0.4% of Physical Attack Damage Leeched as Mana per Blue Socket +2 to Melee Weapon Range per White Socket ]],[[ +Razor of the Seventh Sun +Midnight Blade +One Handed Sword +Requires Level 68, 113 Str, 113 Dex +18% increased Accuracy Rating +Adds (65-75) to (110-130) Physical Damage +100% increased Burning Damage if you've Ignited an Enemy Recently +Recovery 1% of Maximum Life when you Ignite an Enemy +100% increased Melee Physical Damage against Ignited Enemies +]],[[ Rebuke of the Vaal Vaal Blade One Handed Sword @@ -306,6 +316,22 @@ Implicits: 2 30% increased Elemental Damage +2 to Weapon Range ]],[[ +Cospri's Malice +Jewelled Foil +One Handed Sword +Elemental Damage: (80–160 to 100–200) +Critical Strike Chance: 5.50% +Attacks per Second: (1.73–1.82) +Requires Level 68, 212 Dex, 257 Int ++30% to Global Critical Strike Multiplier +No Physical Damage +Adds (80–100) to (160–200) Cold Damage +Adds (40–60) to (90–110) Cold Damage to Spells +(8-14)% increased Attack Speed ++257 Intelligence Requirement +60% increased Critical Strike Chance against Chilled Enemies +Cast a Socketed Cold Skill on Melee Critical Strike +]],[[ Daresso's Passion Estoc One Handed Sword @@ -425,6 +451,21 @@ Adds (90-115 to 230-260) Physical Damage Enemies you Attack Reflect 100 Physical Damage to you +2 to Weapon range ]],[[ +Kondo's Pride +Ezomyte Blade +Two Handed Sword +Physical Damage: (226–418 to 256–475) +Critical Strike Chance: 5.00% +Attacks per Second: 1.25 +Requires Level 61, 113 Str, 113 Dex +18% increased Accuracy Rating +(270-320)% increased Physical Damage +0.6% of Physical Attack Damage Leeched as Life +50% increased Melee Damage against Bleeding Enemies +Cannot Leech Life from Critical Strikes +30% chance to Blind Enemies on Critical Strike +Causes Bleeding on Melee Critical Strike +]],[[ Oro's Sacrifice Infernal Sword Variant: Pre 1.3.0 @@ -506,6 +547,21 @@ Adds 35 to 70 Cold Damage 0.6% of Physical Attack Damage Leeched as Mana Cannot be Frozen ]],[[ +Starforge +Infernal Sword +Two Handed Sword +Physical Damage: (285–590 to 342–708) +Critical Strike Chance: 5.00% +Attacks per Second: (1.31–1.35) +Requires Level 67, 113 Str, 113 Dex +30% increased Accuracy Rating +(400-500)% increased Physical Damage +(5-8)% increased Attack Speed ++(90-100) to maximum Life +20% increased Area of Effect for Attacks +Deal no Elemental Damage +Your Physical Damage can Shock +]],[[ Terminus Est Tiger Sword Two Handed Sword diff --git a/Modules/CalcSections.lua b/Modules/CalcSections.lua index a978fdae..27a09d42 100644 --- a/Modules/CalcSections.lua +++ b/Modules/CalcSections.lua @@ -77,10 +77,10 @@ return { }, { label = "Hit Damage", textSize = 12, { format = "{0:output:TotalMin} to {0:output:TotalMax}", }, - { format = "{0:output:PhysicalMin} to {0:output:PhysicalMax}", { breakdown = "Physical" }, }, - { format = "{0:output:LightningMin} to {0:output:LightningMax}", { breakdown = "Lightning" }, }, - { format = "{0:output:ColdMin} to {0:output:ColdMax}", { breakdown = "Cold" }, }, - { format = "{0:output:FireMin} to {0:output:FireMax}", { breakdown = "Fire" }, }, + { format = "{0:output:PhysicalMin} to {0:output:PhysicalMax}", { breakdown = "Physical" }, { label = "Conversions", modName = { "PhysicalDamageConvertToLightning", "PhysicalDamageConvertToCold", "PhysicalDamageConvertToFire", "PhysicalDamageConvertToChaos", "PhysicalDamageGainAsLightning", "PhysicalDamageGainAsCold", "PhysicalDamageGainAsFire", "PhysicalDamageGainAsChaos" }, modType = "BASE", skill = true }, }, + { format = "{0:output:LightningMin} to {0:output:LightningMax}", { breakdown = "Lightning" }, { label = "Conversions", modName = { "LightningDamageConvertToCold", "LightningDamageConvertToFire", "LightningDamageConvertToChaos", "LightningDamageGainAsCold", "LightningDamageGainAsFire", "LightningDamageGainAsChaos" }, modType = "BASE", skill = true }, }, + { format = "{0:output:ColdMin} to {0:output:ColdMax}", { breakdown = "Cold" }, { label = "Conversions", modName = { "ColdDamageConvertToFire", "ColdDamageConvertToChaos", "ColdDamageGainAsFire", "ColdDamageGainAsChaos" }, modType = "BASE", skill = true }, }, + { format = "{0:output:FireMin} to {0:output:FireMax}", { breakdown = "Fire" }, { label = "Conversions", modName = { "FireDamageConvertToChaos", "FireDamageGainAsChaos" }, modType = "BASE", skill = true }, }, { format = "{0:output:ChaosMin} to {0:output:ChaosMax}", { breakdown = "Chaos" }, }, }, { label = "Average Hit", { format = "{1:output:AverageHit}", { breakdown = "AverageHit" }, }, }, @@ -125,7 +125,7 @@ return { }, { format = "x {3:output:FireDotEffMult}", { breakdown = "FireDotEffMult" }, - { label = "Enemy modifiers", modName = { "DamageTaken", "DotTaken", "FireDamageTaken", "ElementalDamageTaken", "FireResist", "ElementalResist" }, enemy = true }, + { label = "Enemy modifiers", modName = { "DamageTaken", "DotTaken", "FireDamageTaken", "BurningDamageTaken", "ElementalDamageTaken", "FireResist", "ElementalResist" }, enemy = true }, }, { format = "x {3:output:ChaosDotEffMult}", { breakdown = "ChaosDotEffMult" }, @@ -208,7 +208,7 @@ return { { label = "Chance to Ignite", { format = "{0:output:IgniteChance}%", { label = "Player modifiers", modName = "EnemyIgniteChance", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfIgniteChance", enemy = true }, }, }, { label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Damage", "FireDamage", "ElementalDamage" }, modType = "INC", cfg = "ignite" }, }, }, { label = "Total More", { format = "{0:mod:1}%", { modName = { "Damage", "FireDamage", "ElementalDamage" }, modType = "MORE", cfg = "ignite" }, }, }, - { label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:IgniteEffMult}", { breakdown = "IgniteEffMult" }, { label = "Enemy modifiers", modName = { "FireResist", "ElementalResist", "DamageTaken", "DotTaken", "FireDamageTaken", "ElementalDamageTaken" }, enemy = true }, }, }, + { label = "Effective DPS Mod", flag = "effective", { format = "x {3:output:IgniteEffMult}", { breakdown = "IgniteEffMult" }, { label = "Enemy modifiers", modName = { "FireResist", "ElementalResist", "DamageTaken", "DotTaken", "FireDamageTaken", "BurningDamageTaken", "ElementalDamageTaken" }, enemy = true }, }, }, { label = "Ignite DPS", { format = "{1:output:IgniteDPS}", { breakdown = "IgniteDPS" }, }, }, { label = "Ignite Duration", { format = "{2:output:IgniteDuration}s", { breakdown = "IgniteDuration" }, { label = "Player modifiers", modName = "EnemyIgniteDuration", cfg = "skill" }, { label = "Enemy modifiers", modName = "SelfIgniteDuration", enemy = true }, }, }, } }, diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index 2258dca0..dfc787bb 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -988,6 +988,9 @@ local function performCalcs(env) if env.weaponData1.type and env.weaponData2.type then condList["DualWielding"] = true end + if env.mode_skillType == "ATTACK" then + condList["MainHandAttack"] = true + end if not env.weaponData1.type then condList["Unarmed"] = true end @@ -1290,7 +1293,7 @@ local function performCalcs(env) -- Life/mana pools if modDB:Sum("FLAG", nil, "ChaosInoculation") then output.Life = 1 - modDB.conditions["FullLife"] = true + condList["FullLife"] = true else output.Life = round(calcVal(modDB, "Life")) if breakdown then @@ -1298,7 +1301,7 @@ local function performCalcs(env) end end output.Mana = round(calcVal(modDB, "Mana")) - output.ManaRegen = round(modDB:Sum("BASE", nil, "ManaRegen") * calcMod(modDB, nil, "ManaRegen", "ManaRecovery"), 1) + output.ManaRegen = round((modDB:Sum("BASE", nil, "ManaRegen") + output.Mana * modDB:Sum("BASE", nil, "ManaRegenPercent") / 100) * calcMod(modDB, nil, "ManaRegen", "ManaRecovery"), 1) if breakdown then simpleBreakdown(nil, nil, "Mana") simpleBreakdown(nil, nil, "ManaRegen", "ManaRecovery") @@ -2030,6 +2033,9 @@ local function performCalcs(env) if isElemental[damageType] then taken = taken + enemyDB:Sum("INC", nil, "ElementalDamageTaken") end + if damageType == "Fire" then + taken = taken + enemyDB:Sum("INC", nil, "BurningDamageTaken") + end resist = output["Enemy"..damageType.."Resist"] end effMult = (1 - resist / 100) * (1 + taken / 100) @@ -2201,7 +2207,7 @@ local function performCalcs(env) local effMult = 1 if env.mode_effective then local resist = output["EnemyFireResist"] - local taken = enemyDB:Sum("INC", dotCfg, "DamageTaken", "FireDamageTaken", "ElementalDamageTaken", "DotTaken") + local taken = enemyDB:Sum("INC", dotCfg, "DamageTaken", "FireDamageTaken", "ElementalDamageTaken", "BurningDamageTaken", "DotTaken") effMult = (1 - resist / 100) * (1 + taken / 100) output["IgniteEffMult"] = effMult if breakdown then diff --git a/Modules/ItemTools.lua b/Modules/ItemTools.lua index 20d5e5a3..979f9c93 100644 --- a/Modules/ItemTools.lua +++ b/Modules/ItemTools.lua @@ -91,6 +91,7 @@ function itemLib.parseItemRaw(item) item.title = item.name item.name = item.title .. ", " .. item.baseName item.type = data.itemBases[item.baseName].type + l = l + 1 end item.base = data.itemBases[item.baseName] item.modLines = { } @@ -438,6 +439,9 @@ function itemLib.buildItemModList(item) end for _, mod in ipairs(modLine.modList) do mod.source = "Item:"..(item.id or -1)..":"..item.name + if type(mod.value) == "table" and mod.value.mod then + mod.value.mod.source = mod.source + end t_insert(baseList, mod) end end diff --git a/Modules/ModParser.lua b/Modules/ModParser.lua index 2e4d028c..459939b9 100644 --- a/Modules/ModParser.lua +++ b/Modules/ModParser.lua @@ -283,6 +283,7 @@ local modFlagList = { -- List of modifier flags/tags that appear at the start of a line local preFlagList = { + ["^hits deal "] = { flags = ModFlag.Hit }, ["^minions have "] = { keywordFlags = KeywordFlag.Minion }, ["^minions deal "] = { keywordFlags = KeywordFlag.Minion }, ["^attacks used by totems have "] = { keywordFlags = KeywordFlag.Totem }, @@ -332,6 +333,8 @@ local modTagList = { ["with a rare item equipped"] = { tag = { type = "Condition", var = "UsingRareItem" } }, ["with a unique item equipped"] = { tag = { type = "Condition", var = "UsingUniqueItem" } }, ["if you wear no corrupted items"] = { tag = { type = "Condition", var = "NotUsingCorruptedItem" } }, + ["with main hand"] = { tag = { type = "Condition", var = "MainHandAttack" } }, + ["with off hand"] = { tag = { type = "Condition", var = "OffHandAttack" } }, -- Player status conditions ["when on low life"] = { tag = { type = "Condition", var = "LowLife" } }, ["while on low life"] = { tag = { type = "Condition", var = "LowLife" } }, @@ -356,17 +359,27 @@ local modTagList = { ["if you haven't crit recently"] = { tag = { type = "Condition", var = "NotCritRecently" } }, ["if you've killed recently"] = { tag = { type = "Condition", var = "KilledRecently" } }, ["if you haven't killed recently"] = { tag = { type = "Condition", var = "NotKilledRecently" } }, + ["if you or your totems have killed recently"] = { tag = { type = "Condition", varList = {"KilledRecently","TotemsKilledRecently"} } }, ["if you've been hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } }, ["if you were hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } }, + ["if you were damaged by a hit recently"] = { tag = { type = "Condition", var = "BeenHitRecently" } }, ["if you haven't been hit recently"] = { tag = { type = "Condition", var = "NotBeenHitRecently" } }, + ["if you've taken no damage from hits recently"] = { tag = { type = "Condition", var = "NotBeenHitRecently" } }, ["if you've attacked recently"] = { tag = { type = "Condition", var = "AttackedRecently" } }, ["if you've cast a spell recently"] = { tag = { type = "Condition", var = "CastSpellRecently" } }, + ["if you've used a fire skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedFireSkillInPast10Sec" } }, + ["if you've used a cold skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedColdSkillInPast10Sec" } }, + ["if you've used a lightning skill in the past 10 seconds"] = { tag = { type = "Condition", var = "UsedLightningSkillInPast10Sec" } }, ["if you've summoned a totem recently"] = { tag = { type = "Condition", var = "SummonedTotemRecently" } }, ["if you've used a movement skill recently"] = { tag = { type = "Condition", var = "UsedMovementSkillRecently" } }, ["if you detonated mines recently"] = { tag = { type = "Condition", var = "DetonatedMinesRecently" } }, ["if you've crit in the past 8 seconds"] = { tag = { type = "Condition", var = "CritInPast8Sec" } }, ["if energy shield recharge has started recently"] = { tag = { type = "Condition", var = "EnergyShieldRechargeRecently" } }, -- Enemy status conditions + ["against enemies on full life"] = { tag = { type = "Condition", var = "EnemyFullLife" }, flags = ModFlag.Hit }, + ["against enemies that are on full life"] = { tag = { type = "Condition", var = "EnemyFullLife" }, flags = ModFlag.Hit }, + ["against enemies on low life"] = { tag = { type = "Condition", var = "EnemyLowLife" }, flags = ModFlag.Hit }, + ["against enemies that are on low life"] = { tag = { type = "Condition", var = "EnemyLowLife" }, flags = ModFlag.Hit }, ["against bleeding enemies"] = { tag = { type = "Condition", var = "EnemyBleeding" }, flags = ModFlag.Hit }, ["against poisoned enemies"] = { tag = { type = "Condition", var = "EnemyPoisoned" }, flags = ModFlag.Hit }, ["against burning enemies"] = { tag = { type = "Condition", var = "EnemyBurning" }, flags = ModFlag.Hit }, @@ -417,6 +430,7 @@ local specialModList = { ["every 10 seconds, gain (%d+)%% increased elemental damage for 4 seconds"] = function(num) return { mod("ElementalDamage", "INC", num, { type = "Condition", var = "PendulumOfDestruction" }) } end, ["every 10 seconds, gain (%d+)%% increased radius of area skills for 4 seconds"] = function(num) return { mod("AreaRadius", "INC", num, { type = "Condition", var = "PendulumOfDestruction" }) } end, ["enemies you curse take (%d+)%% increased damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("DamageTaken", "INC", num) }, { type = "Condition", var = "EnemyCursed" }) } end, + ["enemies you curse have (%-%d+)%% to chaos resistance"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("ChaosResist", "BASE", num) }, { type = "Condition", var = "EnemyCursed" }) } end, ["nearby enemies have (%-%d+)%% to chaos resistance"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("ChaosResist", "BASE", num) }) } end, ["nearby enemies take (%d+)%% increased elemental damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("ElementalDamageTaken", "INC", num) }) } end, ["enemies near your totems take (%d+)%% increased physical and fire damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("PhysicalDamageTaken", "INC", num) }), mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("FireDamageTaken", "INC", num) }) } end, @@ -509,7 +523,10 @@ local specialModList = { ["projectiles pierce while phasing"] = { mod("PierceChance", "BASE", 100, { type = "Condition", var = "Phasing" }) }, ["increases and reductions to minion damage also affects you"] = { flag("MinionDamageAppliesToPlayer") }, ["armour is increased by uncapped fire resistance"] = { mod("Armour", "INC", 1, { type = "PerStat", stat = "FireResistTotal", div = 1 }) }, + ["critical strike chance is increased by uncapped lightning resistance"] = { mod("CritChance", "INC", 1, { type = "PerStat", stat = "LightningResistTotal", div = 1 }) }, ["critical strikes deal no damage"] = { flag("NoCritDamage") }, + ["enemies chilled by you take (%d+)%% increased burning damage"] = function(num) return { mod("Misc", "LIST", { type = "EnemyModifier", mod = mod("BurningDamageTaken", "INC", num) }, { type = "Condition", var = "EnemyChilled" }) } end, + ["attacks with this weapon penetrate (%d+)%% elemental resistances"] = function(num) return { mod("ElementalPenetration", "BASE", num, nil, ModFlag.Weapon) } end, } local keystoneList = { -- List of keystones that can be found on uniques @@ -565,6 +582,7 @@ local regenTypes = { ["maximum life"] = "LifeRegen", ["mana"] = "ManaRegen", ["energy shield"] = "EnergyShieldRegen", + ["maximum mana and energy shield"] = { "ManaRegen", "EnergyShieldRegen" }, } -- Build active skill name lookup @@ -767,11 +785,11 @@ local function parseMod(line) return { }, line end elseif modForm == "REGENPERCENT" then - local pool = regenTypes[formCap[2]] - if not pool then + modName = regenTypes[formCap[2]] + if not modName then return { }, line end - modName = pool .. "Percent" + modSuffix = "Percent" elseif modForm == "REGENFLAT" then modName = regenTypes[formCap[2]] if not modName then @@ -833,9 +851,19 @@ local function parseMod(line) end local cache = { } +local unsupported = { } +local count = 0 return function(line) if not cache[line] then cache[line] = { parseMod(line) } + --[[if not cache[line][1] then + local form = line:gsub("[%+%-]?%d+%.?%d*","{num}") + if not unsupported[form] then + unsupported[form] = true + count = count + 1 + ConPrintf("%d %s", count, form) + end + end]] end return unpack(copyTable(cache[line])) end \ No newline at end of file diff --git a/README.md b/README.md index cd5954e6..2aec7c39 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,14 @@ 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.17 - 2016/11/28 + * Added 'Tulborn' and 'Voice of the Storm' + * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the + Configuration tab to allow you to indicate which skill types you are using + * Conversion modifiers are now listed in the breakdowns for hit damage in the Calcs tab + * Added 2x multiplier to Cyclone's DPS to match the in-game tooltip + * Fixed bug preventing the buff from Summon Lightning Golem from applying correctly + ### 1.2.16 - 2016/11/25 * The build list can now be sorted by name, class or time of last edit * The save prompt will now show when closing the program if there are unsaved changes diff --git a/changelog.txt b/changelog.txt index 4fbdc78f..9d5e9e32 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,10 @@ +VERSION[1.2.17][2016/11/28] + * Added 'Tulborn' and 'Voice of the Storm' + * Added 2x multiplier to Cyclone's DPS to match the in-game tooltip + * Added support for Mastermind of Discord; when this passive is allocated, new options will appear in the + Configuration tab to allow you to indicate which skill types you are using + * Conversion modifiers are now listed in the breakdowns for hit damage in the Calcs tab + * Fixed bug preventing the buff from Summon Lightning Golem from applying correctly VERSION[1.2.16][2016/11/25] * The build list can now be sorted by name, class or time of last edit * The save prompt will now show when closing the program if there are unsaved changes diff --git a/manifest.xml b/manifest.xml index 4b25ed92..6e3b6ac5 100644 --- a/manifest.xml +++ b/manifest.xml @@ -1,20 +1,20 @@ - + - + - + - + @@ -26,8 +26,8 @@ - - + + @@ -44,60 +44,60 @@ - - + + - + - + - - - - + + + + - + - + - + - - + + - + - + - - - - + + + + - - - - + + + + - + - +