diff --git a/spec/System/TestItemMods_spec.lua b/spec/System/TestItemMods_spec.lua index 114605aa5a..bb2029102d 100644 --- a/spec/System/TestItemMods_spec.lua +++ b/spec/System/TestItemMods_spec.lua @@ -684,7 +684,6 @@ describe("TetsItemMods", function() {variant:2}{range:0.5}Adds (8-12) to (16-18) Physical Damage {range:0.5}+(10-15) to Strength Causes Bleeding on Hit - {range:0.5}(4-5) to (8-10) Physical Thorns damage ]]) build.itemsTab:AddDisplayItem() runCallback("OnFrame") diff --git a/src/Data/Global.lua b/src/Data/Global.lua index 942ba72842..ea262f7458 100644 --- a/src/Data/Global.lua +++ b/src/Data/Global.lua @@ -225,6 +225,7 @@ ModFlag.Spell = 0x0000000000000002 ModFlag.Hit = 0x0000000000000004 ModFlag.Dot = 0x0000000000000008 ModFlag.Cast = 0x0000000000000010 +ModFlag.Thorns = 0x0000000000000020 -- Damage sources ModFlag.Melee = 0x0000000000000100 ModFlag.Area = 0x0000000000000200 diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 210b031fd6..9724787345 100644 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -78,14 +78,12 @@ c["+(9-14)% to Cold Resistance"]={nil,"+(9-14)% to Cold Resistance "} c["+(9-14)% to Fire Resistance"]={nil,"+(9-14)% to Fire Resistance "} c["+(9-14)% to Lightning Resistance"]={nil,"+(9-14)% to Lightning Resistance "} c["+0.1% to Critical Hit Chance per 10 Item Energy Shield on Equipped Armour Items"]={{[1]={[1]={div=10,stat="EnergyShieldOnAllArmourItems",type="PerStat"},flags=0,keywordFlags=0,name="CritChance",type="BASE",value=0.1}},nil} -c["+0.15% to Thorns Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=0.15}}," Thorns "} -c["+0.15% to Thorns Critical Hit Chance +25% to Thorns Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=0.15}}," Thorns +25% to Thorns Critical Hit Chance "} +c["+0.15% to Thorns Critical Hit Chance"]={{[1]={flags=32,keywordFlags=0,name="CritChance",type="BASE",value=0.15}},nil} c["+0.2 metres to Melee Strike Range"]={{[1]={flags=0,keywordFlags=0,name="MeleeWeaponRangeMetre",type="BASE",value=0.2},[2]={flags=0,keywordFlags=0,name="UnarmedRangeMetre",type="BASE",value=0.2}},nil} c["+0.4 metres to Melee Strike Range if you've dealt a Projectile Attack Hit in the past eight seconds"]={{[1]={[1]={type="Condition",var="HitProjectileRecently"},flags=0,keywordFlags=0,name="MeleeWeaponRangeMetre",type="BASE",value=0.4},[2]={[1]={type="Condition",var="HitProjectileRecently"},flags=0,keywordFlags=0,name="UnarmedRangeMetre",type="BASE",value=0.4}},nil} c["+0.5 metres to Dodge Roll distance while Surrounded"]={{}," metres to Dodge Roll distance "} c["+0.5 metres to Dodge Roll distance while Surrounded 10% increased Movement Speed while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},[2]={type="Condition",var="Surrounded"},flags=0,keywordFlags=0,name="MovementSpeed",type="BASE",value=0.5}}," metres to Dodge Roll distance 10% increased "} -c["+0.5% to Thorns Critical Hit Chance per 50 Tribute"]={{[1]={[1]={actor="parent",div=50,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="CritChance",type="BASE",value=0.5}}," Thorns "} -c["+0.5% to Thorns Critical Hit Chance per 50 Tribute 2% increased Thorns damage per 10 Tribute"]={{[1]={[1]={actor="parent",div=50,stat="Tribute",type="PerStat"},[2]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="CritChance",type="BASE",value=0.5}}," Thorns 2% increased Thorns damage "} +c["+0.5% to Thorns Critical Hit Chance per 50 Tribute"]={{[1]={[1]={actor="parent",div=50,stat="Tribute",type="PerStat"},flags=32,keywordFlags=0,name="CritChance",type="BASE",value=0.5}},nil} c["+0.6% to Unarmed Melee Attack Critical Hit Chance"]={{[1]={flags=16777477,keywordFlags=0,name="CritChance",type="BASE",value=0.6}},nil} c["+1 Charm Slot"]={{[1]={flags=0,keywordFlags=0,name="CharmLimit",type="BASE",value=1}},nil} c["+1 Life per 4 Dexterity"]={{[1]={[1]={div=4,stat="Dex",type="PerStat"},flags=0,keywordFlags=0,name="Life",type="BASE",value=1}},nil} @@ -371,8 +369,7 @@ c["+25% to Critical Damage Bonus against Stunned Enemies"]={{[1]={[1]={actor="en c["+25% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="BASE",value=25}},nil} c["+25% to Fire Resistance while on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=0,keywordFlags=0,name="FireResist",type="BASE",value=25}},nil} c["+25% to Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResist",type="BASE",value=25}},nil} -c["+25% to Thorns Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=25}}," Thorns "} -c["+25% to Thorns Critical Hit Chance 15 to 25 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=25}}," Thorns 15 to 25 Physical Thorns damage "} +c["+25% to Thorns Critical Hit Chance"]={{[1]={flags=32,keywordFlags=0,name="CritChance",type="BASE",value=25}},nil} c["+250 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="BASE",value=250}},nil} c["+250 to Accuracy against Bleeding Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Bleeding"},flags=0,keywordFlags=0,name="AccuracyVsEnemy",type="BASE",value=250}},nil} c["+250 to Ailment Threshold"]={{[1]={flags=0,keywordFlags=0,name="AilmentThreshold",type="BASE",value=250}},nil} @@ -705,8 +702,7 @@ c["+4% to Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance", c["+4% to Maximum Cold Resistance"]={{[1]={flags=0,keywordFlags=0,name="ColdResistMax",type="BASE",value=4}},nil} c["+4% to Maximum Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResistMax",type="BASE",value=4}},nil} c["+4% to Maximum Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResistMax",type="BASE",value=4}},nil} -c["+4% to Thorns Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=4}}," Thorns "} -c["+4% to Thorns Critical Hit Chance Gain Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=4}}," Thorns Gain Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour "} +c["+4% to Thorns Critical Hit Chance"]={{[1]={flags=32,keywordFlags=0,name="CritChance",type="BASE",value=4}},nil} c["+4% to all Elemental Resistances per socketed Grand Spectrum"]={{[1]={[1]={type="Multiplier",var="GrandSpectrum"},flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=4}},nil} c["+4% to maximum Block chance"]={{[1]={flags=0,keywordFlags=0,name="BlockChanceMax",type="BASE",value=4}},nil} c["+40 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="BASE",value=40}},nil} @@ -795,7 +791,7 @@ c["+6 to all Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE",v c["+6 to all Attributes per Socket filled"]={{[1]={[1]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Str",type="BASE",value=6},[2]={[1]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Dex",type="BASE",value=6},[3]={[1]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="Int",type="BASE",value=6},[4]={[1]={type="Multiplier",var="RunesSocketedIn{SlotName}"},flags=0,keywordFlags=0,name="All",type="BASE",value=6}},nil} c["+6% of Armour also applies to Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ArmourAppliesToFireDamageTaken",type="BASE",value=6},[2]={flags=0,keywordFlags=0,name="ArmourAppliesToColdDamageTaken",type="BASE",value=6},[3]={flags=0,keywordFlags=0,name="ArmourAppliesToLightningDamageTaken",type="BASE",value=6}},nil} c["+6% to Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=6}},nil} -c["+6% to Thorns Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=6}}," Thorns "} +c["+6% to Thorns Critical Hit Chance"]={{[1]={flags=32,keywordFlags=0,name="CritChance",type="BASE",value=6}},nil} c["+6% to all Elemental Resistances per socketed Grand Spectrum"]={{[1]={[1]={type="Multiplier",var="GrandSpectrum"},flags=0,keywordFlags=0,name="ElementalResist",type="BASE",value=6}},nil} c["+6.5% to Critical Hit Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="BASE",value=6.5}},nil} c["+60 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="BASE",value=60}},nil} @@ -1161,7 +1157,7 @@ c["10% increased Strength"]={{[1]={flags=0,keywordFlags=0,name="Str",type="INC", c["10% increased Stun Buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="INC",value=10}},nil} c["10% increased Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=10}},nil} c["10% increased Stun Threshold for each time you've been Hit by an Enemy Recently, up to 100%"]={{[1]={[1]={limit=100,limitTotal=true,type="Multiplier",var="BeenHitRecently"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=10}},nil} -c["10% increased Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=10}},nil} +c["10% increased Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=10}},nil} c["10% increased Trap Damage"]={{[1]={flags=0,keywordFlags=4096,name="Damage",type="INC",value=10}},nil} c["10% increased Warcry Cooldown Recovery Rate"]={{[1]={flags=0,keywordFlags=4,name="CooldownRecovery",type="INC",value=10}},nil} c["10% increased Weapon Damage per 10 Strength"]={{[1]={[1]={div=10,stat="Str",type="PerStat"},flags=8192,keywordFlags=0,name="Damage",type="INC",value=10}},nil} @@ -1196,7 +1192,7 @@ c["10% of Physical Damage prevented Recouped as Life 14% increased speed of Reco c["10% of Physical Damage taken Recouped as Life"]={{[1]={flags=0,keywordFlags=0,name="PhysicalLifeRecoup",type="BASE",value=10}},nil} c["10% of Skill Mana Costs Converted to Life Costs"]={{[1]={flags=0,keywordFlags=0,name="HybridManaAndLifeCost_Life",type="BASE",value=10}},nil} c["10% of Spell Damage Leeched as Life"]={{[1]={flags=2,keywordFlags=0,name="DamageLifeLeech",type="BASE",value=10}},nil} -c["10% of Thorns Damage Leeched as Life"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamageLifeLeech",type="BASE",value=10}},nil} +c["10% of Thorns Damage Leeched as Life"]={{[1]={flags=32,keywordFlags=0,name="DamageLifeLeech",type="BASE",value=10}},nil} c["10% reduced Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=-10}},nil} c["10% reduced Cast Speed when on Full Life"]={{[1]={[1]={type="Condition",var="FullLife"},flags=16,keywordFlags=0,name="Speed",type="INC",value=-10}},nil} c["10% reduced Charm Charges used"]={{[1]={flags=0,keywordFlags=0,name="CharmChargesUsed",type="INC",value=-10}},nil} @@ -1277,7 +1273,7 @@ c["100% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="Physical c["100% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type="INC",value=100}},nil} c["100% increased Stun Threshold during Empowered Attacks"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=100}}," during Empowered Attacks "} c["100% increased Stun Threshold for each time you've been Stunned Recently"]={{[1]={[1]={type="Multiplier",var="StunnedRecently"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=100}},nil} -c["100% increased Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=100}},nil} +c["100% increased Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=100}},nil} c["100% increased amount of Life Leeched"]={{[1]={flags=0,keywordFlags=0,name="MaxLifeLeechRate",type="INC",value=100}},nil} c["100% increased chance to Shock"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockChance",type="INC",value=100}},nil} c["100% increased effect of Socketed Items"]={{[1]={flags=0,keywordFlags=0,name="LocalEffect",type="INC",value=100}}," of Socketed Items "} @@ -1390,7 +1386,7 @@ c["12% increased Spell Damage with Spells that cost Life"]={{[1]={[1]={stat="Lif c["12% increased Stun Buildup"]={{[1]={flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="INC",value=12}},nil} c["12% increased Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=12}},nil} c["12% increased Stun Threshold if you haven't been Stunned Recently"]={{[1]={[1]={neg=true,type="Condition",var="StunnedRecently"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=12}},nil} -c["12% increased Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=12}},nil} +c["12% increased Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=12}},nil} c["12% increased amount of Life Leeched"]={{[1]={flags=0,keywordFlags=0,name="MaxLifeLeechRate",type="INC",value=12}},nil} c["12% increased chance to Shock"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockChance",type="INC",value=12}},nil} c["12% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=12}},nil} @@ -1417,6 +1413,7 @@ c["125% increased Charges per use"]={{[1]={flags=0,keywordFlags=0,name="FlaskCha c["125% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=125}},nil} c["125% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=125}},nil} c["125% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=125}},nil} +c["13 to 23 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=13},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=23}},nil} c["13% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=13}},nil} c["13% increased Block chance"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="INC",value=13}},nil} c["13% increased Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=13}},nil} @@ -1453,8 +1450,7 @@ c["140% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShie c["140% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=140}},nil} c["140% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=140}},nil} c["15 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=15}},nil} -c["15 to 25 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=15}}," to 25 Physical "} -c["15 to 25 Physical Thorns damage Thorns can Retaliate against all Hits"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=15}}," to 25 Physical Thorns can Retaliate against all Hits "} +c["15 to 25 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=15},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=25}},nil} c["15% Surpassing Chance to gain a Puppet Master stack whenever you use a Command Skill"]={{},"% Surpassing Chance to gain a Puppet Master stack whenever you use a Command Skill "} c["15% additional Physical Damage Reduction"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageReduction",type="BASE",value=15}},nil} c["15% chance for Remnants you create to grant their effects twice"]={{[1]={flags=0,keywordFlags=0,name="LocalEffect",type="BASE",value=15}}," for Remnants you create to grant their s twice "} @@ -1699,7 +1695,7 @@ c["16% increased Rarity of Items found"]={{[1]={flags=0,keywordFlags=0,name="Loo c["16% increased Skill Effect Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=16}},nil} c["16% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type="INC",value=16}},nil} c["16% increased Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=16}},nil} -c["16% increased Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=16}},nil} +c["16% increased Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=16}},nil} c["16% increased Totem Life"]={{[1]={flags=0,keywordFlags=0,name="TotemLife",type="INC",value=16}},nil} c["16% increased Warcry Speed"]={{[1]={flags=0,keywordFlags=4,name="WarcrySpeed",type="INC",value=16}},nil} c["16% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=16}},nil} @@ -1724,6 +1720,7 @@ c["175% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlag c["175% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=175}},nil} c["175% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=175}},nil} c["175% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=175}},nil} +c["18 to 28 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=18},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=28}},nil} c["18% increased Area of Effect for Attacks"]={{[1]={flags=1,keywordFlags=0,name="AreaOfEffect",type="INC",value=18}},nil} c["18% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=18}},nil} c["18% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=18}},nil} @@ -1785,7 +1782,7 @@ c["2% increased Spell Damage per 10 Intelligence"]={{[1]={[1]={div=10,stat="Int" c["2% increased Spell Damage per 10 Strength"]={{[1]={[1]={div=10,stat="Str",type="PerStat"},flags=2,keywordFlags=0,name="Damage",type="INC",value=2}},nil} c["2% increased Spirit per socketed Grand Spectrum"]={{[1]={[1]={type="Multiplier",var="GrandSpectrum"},flags=0,keywordFlags=0,name="Spirit",type="INC",value=2}},nil} c["2% increased Stun Buildup per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="INC",value=2}},nil} -c["2% increased Thorns damage per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=2}},nil} +c["2% increased Thorns damage per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=32,keywordFlags=0,name="Damage",type="INC",value=2}},nil} c["2% increased maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="INC",value=2}},nil} c["2% increased maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="INC",value=2}},nil} c["2% reduced Energy Shield Recharge Rate per 25 Tribute"]={{[1]={[1]={actor="parent",div=25,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="EnergyShieldRecharge",type="INC",value=-2}},nil} @@ -1793,7 +1790,7 @@ c["2% reduced Light Radius per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,st c["2% reduced Movement Speed Penalty from using Skills while moving"]={{[1]={flags=0,keywordFlags=0,name="MovementSpeedPenalty",type="INC",value=-2}},nil} c["2% reduced Presence Area of Effect per 10 Tribute"]={{[1]={[1]={actor="parent",div=10,stat="Tribute",type="PerStat"},flags=0,keywordFlags=0,name="PresenceArea",type="INC",value=-2}},nil} c["20 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=20}},nil} -c["20 to 30 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=20}}," to 30 Physical "} +c["20 to 30 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=20},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=30}},nil} c["20% Chance to build an additional Combo on Hit"]={{}," to build an additional Combo "} c["20% chance for Attack Hits to apply Incision"]={{[1]={flags=0,keywordFlags=0,name="Condition:CanInflictIncision",type="FLAG",value=true}},nil} c["20% chance for Bleeding to be Aggravated when Inflicted against Enemies on Jagged Ground"]={{}," to be Aggravated when Inflicted against Enemies on Jagged Ground "} @@ -1991,7 +1988,7 @@ c["20% increased Stun Threshold if you haven't been Stunned Recently"]={{[1]={[1 c["20% increased Stun Threshold while Parrying"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=20}}," while Parrying "} c["20% increased Stun Threshold while on Full Life"]={{[1]={[1]={type="Condition",var="FullLife"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=20}},nil} c["20% increased Stun buildup if you have Shapeshifted to an Animal form Recently"]={{[1]={[1]={type="Condition",var="ShapeshiftToAnimal"},flags=0,keywordFlags=0,name="EnemyHeavyStunBuildup",type="INC",value=20}},nil} -c["20% increased Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=20}},nil} +c["20% increased Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=20}},nil} c["20% increased Totem Damage"]={{[1]={flags=0,keywordFlags=16384,name="Damage",type="INC",value=20}},nil} c["20% increased Totem Life"]={{[1]={flags=0,keywordFlags=0,name="TotemLife",type="INC",value=20}},nil} c["20% increased Totem Placement range"]={{[1]={flags=0,keywordFlags=16384,name="WeaponRange",type="INC",value=20}}," Placement "} @@ -2109,8 +2106,8 @@ c["24% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keyw c["24% reduced Slowing Potency of Debuffs on You"]={{}," Slowing Potency of Debuffs on You "} c["240% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=240}},nil} c["25 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=25}},nil} -c["25 to 35 Cold Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=25}}," to 35 Cold "} -c["25 to 35 Fire Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=25}}," to 35 Fire "} +c["25 to 35 Cold Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="ColdMin",type="BASE",value=25},[2]={flags=32,keywordFlags=0,name="ColdMax",type="BASE",value=35}},nil} +c["25 to 35 Fire Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="FireMin",type="BASE",value=25},[2]={flags=32,keywordFlags=0,name="FireMax",type="BASE",value=35}},nil} c["25% Chance to gain a Charge when you kill an enemy"]={nil,"a Charge "} c["25% Chance to gain a Charge when you kill an enemy Creates Ignited Ground for 4 seconds when used, Igniting enemies as though dealing Fire damage equal to 500% of your maximum Life"]={nil,"a Charge Creates Ignited Ground when used, Igniting enemies as though dealing Fire damage equal to 500% of your maximum Life "} c["25% Chance to gain a Charge when you kill an enemy Energy Shield Recharge starts on use"]={nil,"a Charge Energy Shield Recharge starts on use "} @@ -2317,8 +2314,10 @@ c["250% increased bonuses gained from Equipped Quiver"]={{[1]={flags=0,keywordFl c["250% of Melee Physical Damage taken reflected to Attacker"]={{[1]={flags=256,keywordFlags=0,name="PhysicalDamage",type="BASE",value=250}}," taken reflected to Attacker "} c["250% of Melee Physical Damage taken reflected to Attacker Regenerate 5% of maximum Life per second while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=256,keywordFlags=0,name="PhysicalDamage",type="BASE",value=250}}," taken reflected to Attacker Regenerate 5% of maximum Life per second "} c["253% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type="INC",value=253}},nil} +c["26 to 40 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=26},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=40}},nil} c["26% reduced Charges per use"]={{[1]={flags=0,keywordFlags=0,name="FlaskChargesUsed",type="INC",value=-26}},nil} c["275% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=275}},nil} +c["28 to 38 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=28},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=38}},nil} c["28% increased maximum Energy Shield"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=28}},nil} c["29% increased Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="ChaosDamage",type="INC",value=29}},nil} c["3 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=3}},nil} @@ -2380,7 +2379,8 @@ c["3% reduced Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="AreaOfEffect" c["3% reduced Movement Speed Penalty from using Skills while moving"]={{[1]={flags=0,keywordFlags=0,name="MovementSpeedPenalty",type="INC",value=-3}},nil} c["3% reduced Skill Speed"]={{[1]={flags=0,keywordFlags=0,name="Speed",type="INC",value=-3},[2]={flags=0,keywordFlags=0,name="WarcrySpeed",type="INC",value=-3},[3]={flags=0,keywordFlags=0,name="TotemPlacementSpeed",type="INC",value=-3}},nil} c["30 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=30}},nil} -c["30 to 40 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=30}}," to 40 Physical "} +c["30 to 40 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=30},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=40}},nil} +c["30 to 44 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=30},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=44}},nil} c["30% chance for Lightning Damage with Hits to be Lucky"]={{[1]={flags=0,keywordFlags=0,name="LightningLuckyHitsChance",type="BASE",value=30}},nil} c["30% chance to Avoid Chaos Damage from Hits"]={{[1]={flags=0,keywordFlags=0,name="AvoidChaosDamageChance",type="BASE",value=30}},nil} c["30% chance to Avoid Cold Damage from Hits"]={{[1]={flags=0,keywordFlags=0,name="AvoidColdDamageChance",type="BASE",value=30}},nil} @@ -2516,7 +2516,7 @@ c["30% increased Stun Buildup with Quarterstaves"]={{[1]={flags=2097156,keywordF c["30% increased Stun Recovery"]={{[1]={flags=0,keywordFlags=0,name="StunRecovery",type="INC",value=30}},nil} c["30% increased Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=30}},nil} c["30% increased Stun Threshold while on Full Life"]={{[1]={[1]={type="Condition",var="FullLife"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=30}},nil} -c["30% increased Thorns Critical Damage Bonus"]={{[1]={flags=0,keywordFlags=0,name="CritMultiplier",type="INC",value=30}}," Thorns "} +c["30% increased Thorns Critical Damage Bonus"]={{[1]={flags=32,keywordFlags=0,name="CritMultiplier",type="INC",value=30}},nil} c["30% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=30}},nil} c["30% increased Totem Life"]={{[1]={flags=0,keywordFlags=0,name="TotemLife",type="INC",value=30}},nil} c["30% increased Totem Placement speed"]={{[1]={flags=0,keywordFlags=0,name="TotemPlacementSpeed",type="INC",value=30}},nil} @@ -2578,7 +2578,7 @@ c["300% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="Armou c["300% increased Armour, Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="Defences",type="INC",value=300}},nil} c["300% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=300}},nil} c["300% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=300}},nil} -c["31 to 49 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=31}}," to 49 Physical "} +c["31 to 49 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=31},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=49}},nil} c["32% increased Spell Damage while wielding a Melee Weapon"]={{[1]={[1]={type="Condition",var="UsingMeleeWeapon"},flags=2,keywordFlags=0,name="Damage",type="INC",value=32}},nil} c["325% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=325}},nil} c["33% increased Damage with Hits against Enemies affected by Ailments"]={{[1]={[1]={actor="enemy",type="ActorCondition",varList={[1]="Frozen",[2]="Chilled",[3]="Shocked",[4]="Ignited",[5]="Scorched",[6]="Brittle",[7]="Sapped",[8]="Poisoned",[9]="Bleeding"}},flags=0,keywordFlags=262144,name="Damage",type="INC",value=33}},nil} @@ -2589,7 +2589,7 @@ c["33% of Elemental Damage Converted to Fire Damage"]={{[1]={flags=0,keywordFlag c["33% of Elemental Damage Converted to Lightning Damage"]={{[1]={flags=0,keywordFlags=0,name="ElementalDamageConvertToLightning",type="BASE",value=33}},nil} c["333% increased effect of Socketed Soul Cores"]={{[1]={flags=0,keywordFlags=0,name="SocketedSoulCoreEffect",type="INC",value=333}},nil} c["35 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=35}},nil} -c["35 to 53 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=35}}," to 53 Physical "} +c["35 to 53 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=35},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=53}},nil} c["35% Surpassing Chance to gain a Puppet Master stack whenever you use a Command Skill"]={{},"% Surpassing Chance to gain a Puppet Master stack whenever you use a Command Skill "} c["35% increased Attack Damage while you have an Ally in your Presence"]={{[1]={[1]={threshold=1,type="MultiplierThreshold",var="NearbyAlly"},flags=1,keywordFlags=0,name="Damage",type="INC",value=35}},nil} c["35% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=35}},nil} @@ -2634,6 +2634,7 @@ c["38% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC" c["38% increased Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=38}},nil} c["4 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=4}},nil} c["4 seconds after being Damaged by an Enemy Hit, take Damage equal to 30% of that Hit's Damage"]={{[1]={flags=0,keywordFlags=0,name="Damage",type="BASE",value=4}}," seconds after being d by an Enemy Hit, take Damage equal to 30% of that Hit's Damage "} +c["4 to 8 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=4},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=8}},nil} c["4% chance for Spell Skills to fire 2 additional Projectiles"]={{[1]={flags=2,keywordFlags=0,name="TwoAdditionalProjectilesChance",type="BASE",value=4}},nil} c["4% chance that if you would gain Rage on Hit, you instead gain up to your maximum Rage"]={{[1]={flags=4,keywordFlags=0,name="MaximumRage",type="BASE",value=4}}," that if you would gain Rage , you instead gain up to your "} c["4% faster start of Energy Shield Recharge"]={{[1]={flags=0,keywordFlags=0,name="EnergyShieldRechargeFaster",type="INC",value=4}},nil} @@ -2837,8 +2838,8 @@ c["450% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="Armou c["48% increased Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="INC",value=48}},nil} c["5 Life Regeneration per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=5}},nil} c["5 Mana gained when you Block"]={{[1]={flags=0,keywordFlags=0,name="ManaOnBlock",type="BASE",value=5}},nil} -c["5 to 10 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=5}}," to 10 Physical "} -c["5 to 10 Physical Thorns damage Pain Attunement"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="BASE",value=5}}," to 10 Physical Pain Attunement "} +c["5 to 10 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=5},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=10}},nil} +c["5 to 9 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=5},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=9}},nil} c["5% Chance to build an additional Combo on Hit"]={{}," to build an additional Combo "} c["5% additional Physical Damage Reduction while you have at least 150 Devotion"]={{[1]={[1]={stat="Devotion",threshold=150,type="StatThreshold"},flags=0,keywordFlags=0,name="PhysicalDamageReduction",type="BASE",value=5}},nil} c["5% chance for Slam Skills you use yourself to cause an additional Aftershock"]={{}," for Slam Skills you use yourself to cause an additional Aftershock "} @@ -3012,7 +3013,7 @@ c["50% increased Spirit"]={{[1]={flags=0,keywordFlags=0,name="Spirit",type="INC" c["50% increased Strength Requirement"]={{[1]={flags=0,keywordFlags=0,name="StrRequirement",type="INC",value=50}},nil} c["50% increased Stun Threshold while Channelling"]={{[1]={[1]={type="Condition",var="Channelling"},flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=50}},nil} c["50% increased Surrounded Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="SurroundedArea",type="INC",value=50}},nil} -c["50% increased Thorns damage if you've consumed an Endurance Charge Recently"]={{[1]={[1]={limit=1,type="Multiplier",var="RemovableEnduranceCharge"},flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=50}},nil} +c["50% increased Thorns damage if you've consumed an Endurance Charge Recently"]={{[1]={[1]={limit=1,type="Multiplier",var="RemovableEnduranceCharge"},flags=32,keywordFlags=0,name="Damage",type="INC",value=50}},nil} c["50% increased Totem Placement range"]={{[1]={flags=0,keywordFlags=16384,name="WeaponRange",type="INC",value=50}}," Placement "} c["50% increased amount of Mana Leeched"]={{[1]={flags=0,keywordFlags=0,name="MaxManaLeechRate",type="INC",value=50}},nil} c["50% increased effect of Incision"]={{[1]={flags=0,keywordFlags=0,name="IncisionEffect",type="INC",value=50}},nil} @@ -3072,7 +3073,7 @@ c["50% reduced Projectile Range Adds 98 to 193 Fire Damage"]={{[1]={flags=0,keyw c["50% reduced Reload Speed"]={{[1]={flags=1,keywordFlags=0,name="ReloadSpeed",type="INC",value=-50}},nil} c["50% reduced Shock duration on you"]={{[1]={flags=0,keywordFlags=0,name="SelfShockDuration",type="INC",value=-50}},nil} c["50% reduced Slowing Potency of Debuffs on You"]={{}," Slowing Potency of Debuffs on You "} -c["50% reduced Slowing Potency of Debuffs on You 20 to 30 Physical Thorns damage"]={{[1]={flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=-50}}," Slowing Potency of Debuffs on You 20 to 30 Physical "} +c["50% reduced Slowing Potency of Debuffs on You 20 to 30 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="Damage",type="INC",value=-50}}," Slowing Potency of Debuffs on You 20 to 30 Physical "} c["50% reduced bonuses gained from Equipped Focus"]={{[1]={flags=0,keywordFlags=0,name="EffectOfBonusesFromFocus",type="INC",value=-50}},nil} c["50% reduced effect of Curses on you"]={{[1]={flags=0,keywordFlags=0,name="CurseEffectOnSelf",type="INC",value=-50}},nil} c["50% reduced effect of Shock on you"]={{[1]={flags=0,keywordFlags=0,name="SelfShockEffect",type="INC",value=-50}},nil} @@ -3230,7 +3231,7 @@ c["75% increased Energy Shield from Equipped Focus"]={{[1]={[1]={slotName="Weapo c["75% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=75}},nil} c["75% increased Mana Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="ManaRegen",type="INC",value=75}},nil} c["75% increased Melee Damage with Spears while Surrounded"]={{[1]={[1]={type="Condition",var="Surrounded"},flags=268435716,keywordFlags=0,name="Damage",type="INC",value=75}},nil} -c["75% increased Thorns damage if you've Blocked Recently"]={{[1]={[1]={type="Condition",var="BlockedRecently"},flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=75}},nil} +c["75% increased Thorns damage if you've Blocked Recently"]={{[1]={[1]={type="Condition",var="BlockedRecently"},flags=32,keywordFlags=0,name="Damage",type="INC",value=75}},nil} c["75% increased chance to Shock"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockChance",type="INC",value=75}},nil} c["75% of Damage Converted to Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="DamageConvertToFire",type="BASE",value=75}},nil} c["75% reduced Amount Recovered"]={{[1]={flags=0,keywordFlags=0,name="FlaskRecovery",type="INC",value=-75}},nil} @@ -3753,7 +3754,7 @@ c["Blue: Skills have 30% less cost"]={{[1]={[1]={type="Condition",var="MostNumer c["Body Armour grants +100% of Armour also applies to Chaos Damage"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="ArmourAppliesToChaosDamageTaken",type="BASE",value=100}},nil} c["Body Armour grants +50% of Armour also applies to Elemental Damage"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="ArmourAppliesToElementalDamageTaken",type="BASE",value=50}},nil} c["Body Armour grants +75% to Fire Resistance"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="FireResist",type="BASE",value=75}},nil} -c["Body Armour grants 100% increased Thorns damage"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="ThornsDamage",type="INC",value=100}},nil} +c["Body Armour grants 100% increased Thorns damage"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=32,keywordFlags=0,name="Damage",type="INC",value=100}},nil} c["Body Armour grants 15% increased maximum Life"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="Life",type="INC",value=15}},nil} c["Body Armour grants 20% increased Strength"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="Str",type="INC",value=20}},nil} c["Body Armour grants 25% of Physical Damage from Hits taken as Fire Damage"]={{[1]={[1]={itemSlot="Body Armour",rarityCond="NORMAL",type="ItemCondition"},flags=0,keywordFlags=0,name="PhysicalDamageFromHitsTakenAsFire",type="BASE",value=25}},nil} @@ -3938,7 +3939,7 @@ c["Crimson Assault"]={{[1]={flags=0,keywordFlags=0,name="Keystone",type="LIST",v c["Critical Hits Ignore Enemy Monster Lightning Resistance"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="IgnoreLightningResistance",type="FLAG",value=true}},nil} c["Critical Hits Poison the enemy"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="PoisonChance",type="OVERRIDE",value=100}},nil} c["Critical Hits cannot Extract Impale"]={nil,"Critical Hits cannot Extract Impale "} -c["Critical Hits cannot Extract Impale 31 to 49 Physical Thorns damage"]={nil,"Critical Hits cannot Extract Impale 31 to 49 Physical Thorns damage "} +c["Critical Hits cannot Extract Impale 31 to 49 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=31},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=49}},"Critical Hits cannot Extract Impale "} c["Critical Hits do not deal extra Damage"]={{[1]={flags=0,keywordFlags=0,name="NoCritMultiplier",type="FLAG",value=true}},nil} c["Critical Hits ignore Enemy Monster Elemental Resistances"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="IgnoreElementalResistances",type="FLAG",value=true}},nil} c["Critical Hits ignore non-negative Enemy Monster Elemental Resistances"]={{[1]={[1]={type="Condition",var="CriticalStrike"},flags=0,keywordFlags=0,name="IgnoreNonNegativeEleRes",type="FLAG",value=true}},nil} @@ -4022,7 +4023,7 @@ c["Deal no Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="DealNoLightnin c["Deal no Non-Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="DealNoPhysical",type="FLAG",value=true},[2]={flags=0,keywordFlags=0,name="DealNoLightning",type="FLAG",value=true},[3]={flags=0,keywordFlags=0,name="DealNoCold",type="FLAG",value=true},[4]={flags=0,keywordFlags=0,name="DealNoChaos",type="FLAG",value=true}},nil} c["Deal up to 40% more Damage to Enemies based on their missing Concentration"]={nil,"up to 40% more Damage to Enemies based on their missing Concentration "} c["Deal your Thorns Damage to Enemies you Stun with Melee Attacks"]={nil,"your Thorns Damage to Enemies you Stun with Melee Attacks "} -c["Deal your Thorns Damage to Enemies you Stun with Melee Attacks 35 to 53 Physical Thorns damage"]={nil,"your Thorns Damage to Enemies you Stun with Melee Attacks 35 to 53 Physical Thorns damage "} +c["Deal your Thorns Damage to Enemies you Stun with Melee Attacks 35 to 53 Physical Thorns damage"]={{[1]={flags=256,keywordFlags=0,name="PhysicalMin",type="BASE",value=35},[2]={flags=256,keywordFlags=0,name="PhysicalMax",type="BASE",value=53}},"your to Enemies you Stun "} c["Deals 25% of current Mana as Chaos Damage to you when Effect ends"]={nil,"Deals 25% of current Mana as Chaos Damage to you when Effect ends "} c["Debuffs inflicted by Hazards have 30% increased Slow Magnitude"]={nil,"Debuffs inflicted by Hazards have 30% increased Slow Magnitude "} c["Debuffs inflicted by Hazards have 30% increased Slow Magnitude 30% increased Hazard Immobilisation buildup"]={nil,"Debuffs inflicted by Hazards have 30% increased Slow Magnitude 30% increased Hazard Immobilisation buildup "} @@ -4392,7 +4393,8 @@ c["Gain Arcane Surge when a Minion Dies 40% increased maximum Energy Shield"]={{ c["Gain Arcane Surge when you Shapeshift to Human form after"]={{[1]={flags=0,keywordFlags=0,name="Condition:ArcaneSurge",type="FLAG",value=true}}," when you Shapeshift to Human form after "} c["Gain Arcane Surge when you Shapeshift to Human form after being Shapeshifted for at least 8 seconds"]={{[1]={flags=0,keywordFlags=0,name="Condition:ArcaneSurge",type="FLAG",value=true}}," when you Shapeshift to Human form after being Shapeshifted for at least 8 seconds "} c["Gain Armour equal to 150% of total Strength Requirements of Equipped Boots, Gloves and Helmet"]={{[1]={[1]={percent=150,stat="StrRequirementsOnBoots",type="PercentStat"},flags=0,keywordFlags=0,name="Armour",type="BASE",value=1},[2]={[1]={percent=150,stat="StrRequirementsOnGloves",type="PercentStat"},flags=0,keywordFlags=0,name="Armour",type="BASE",value=1},[3]={[1]={percent=150,stat="StrRequirementsOnHelmet",type="PercentStat"},flags=0,keywordFlags=0,name="Armour",type="BASE",value=1}},nil} -c["Gain Cold Thorns Damage equal to 18% of your maximum Mana"]={nil,"Cold Thorns Damage equal to 18% of your maximum Mana "} +c["Gain Cold Thorns Damage equal to 14% of your maximum Mana"]={{[1]={[1]={percent=14,stat="Mana",type="PercentStat"},flags=32,keywordFlags=0,name="ColdMin",type="BASE",value=1},[2]={[1]={percent=14,stat="Mana",type="PercentStat"},flags=32,keywordFlags=0,name="ColdMax",type="BASE",value=1}},nil} +c["Gain Cold Thorns Damage equal to 18% of your maximum Mana"]={{[1]={[1]={percent=18,stat="Mana",type="PercentStat"},flags=32,keywordFlags=0,name="ColdMin",type="BASE",value=1},[2]={[1]={percent=18,stat="Mana",type="PercentStat"},flags=32,keywordFlags=0,name="ColdMax",type="BASE",value=1}},nil} c["Gain Combo from all Attack Hits"]={nil,"Combo from all Attack Hits "} c["Gain Deflection Rating equal to 10% of Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="EvasionGainAsDeflection",type="BASE",value=10}},nil} c["Gain Deflection Rating equal to 12% of Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="EvasionGainAsDeflection",type="BASE",value=12}},nil} @@ -4425,10 +4427,9 @@ c["Gain Infernal Flame instead of spending Mana for Skill costs Take maximum Lif c["Gain Onslaught for 4 seconds when a Minion Dies"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}}}," when a Dies "} c["Gain Onslaught for 4 seconds when a Minion Dies 18% increased Area of Effect for Attacks"]={{[1]={flags=0,keywordFlags=0,name="MinionModifier",type="LIST",value={mod={flags=0,keywordFlags=0,name="Condition:Onslaught",type="FLAG",value=true}}}}," when a Dies 18% increased for Attacks "} c["Gain Owl Feathers 50% faster"]={nil,"Owl Feathers 50% faster "} -c["Gain Physical Thorns damage equal to 10% of Item Armour on Equipped Body Armour"]={nil,"Physical Thorns damage equal to 10% of Item Armour on Equipped Body Armour "} -c["Gain Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour"]={nil,"Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour "} -c["Gain Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour 12% chance for Trigger skills to refund half of Energy Spent"]={nil,"Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour 12% chance for Trigger skills to refund half of Energy Spent "} -c["Gain Physical Thorns damage equal to 8% of maximum Life while Shapeshifted"]={nil,"Physical Thorns damage equal to 8% of maximum Life while Shapeshifted "} +c["Gain Physical Thorns damage equal to 10% of Item Armour on Equipped Body Armour"]={{[1]={[1]={percent=10,stat="ArmourOnBody Armour",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=1},[2]={[1]={percent=10,stat="ArmourOnBody Armour",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=1}},nil} +c["Gain Physical Thorns damage equal to 6% of Item Armour on Equipped Body Armour"]={{[1]={[1]={percent=6,stat="ArmourOnBody Armour",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=1},[2]={[1]={percent=6,stat="ArmourOnBody Armour",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=1}},nil} +c["Gain Physical Thorns damage equal to 8% of maximum Life while Shapeshifted"]={{[1]={[1]={type="Condition",var="Shapeshifted"},[2]={percent=8,stat="Life",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=1},[2]={[1]={type="Condition",var="Shapeshifted"},[2]={percent=8,stat="Life",type="PercentStat"},flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=1}},nil} c["Gain Power Charges instead of Frenzy Charges"]={nil,"Power Charges instead of Frenzy Charges "} c["Gain Power Charges instead of Frenzy Charges Gain Frenzy Charges instead of Endurance Charges"]={nil,"Power Charges instead of Frenzy Charges Gain Frenzy Charges instead of Endurance Charges "} c["Gain Power Charges instead of Frenzy Charges Gain Frenzy Charges instead of Endurance Charges Gain Endurance Charges instead of Power Charges"]={nil,"Power Charges instead of Frenzy Charges Gain Frenzy Charges instead of Endurance Charges Gain Endurance Charges instead of Power Charges "} @@ -4844,7 +4845,7 @@ c["Life Recharges instead of Energy Shield"]={{[1]={flags=0,keywordFlags=0,name= c["Life Recovery from Flasks also applies to Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="LifeFlaskAppliesToEnergyShield",type="FLAG",value=true}},nil} c["Life Recovery from Flasks can Overflow Maximum Life"]={nil,"Life Recovery from Flasks can Overflow Maximum Life "} c["Life Recovery from Flasks is instant"]={nil,"Life Recovery from Flasks is instant "} -c["Life Recovery from Flasks is instant 30 to 40 Physical Thorns damage"]={nil,"Life Recovery from Flasks is instant 30 to 40 Physical Thorns damage "} +c["Life Recovery from Flasks is instant 30 to 40 Physical Thorns damage"]={{[1]={flags=32,keywordFlags=0,name="PhysicalMin",type="BASE",value=30},[2]={flags=32,keywordFlags=0,name="PhysicalMax",type="BASE",value=40}}," is instant "} c["Life Recovery from Regeneration is not applied"]={{[1]={flags=0,keywordFlags=0,name="UnaffectedByLifeRegen",type="FLAG",value=true}},nil} c["Life Recovery from your Flasks also applies to your Companions"]={nil,"Life Recovery from your Flasks also applies to your Companions "} c["Life Regeneration is applied to Energy Shield instead"]={{[1]={flags=0,keywordFlags=0,name="ZealotsOath",type="FLAG",value=true}},nil} @@ -5466,8 +5467,8 @@ c["This item gains bonuses from Socketed Soul Cores as though it was also a Helm c["This item gains bonuses from Socketed Soul Cores as though it was also a Helmet This item gains bonuses from Socketed Soul Cores as though it was also a Shield"]={nil,"This item gains bonuses from Socketed Soul Cores as though it was also a Helmet This item gains bonuses from Socketed Soul Cores as though it was also a Shield "} c["This item gains bonuses from Socketed Soul Cores as though it was also a Shield"]={nil,"This item gains bonuses from Socketed Soul Cores as though it was also a Shield "} c["This item gains bonuses from Socketed Soul Cores as though it was also a Shield Has no Attribute Requirements"]={nil,"This item gains bonuses from Socketed Soul Cores as though it was also a Shield Has no Attribute Requirements "} -c["Thorns Damage has 25% chance to ignore Enemy Armour"]={nil,"Thorns Damage has 25% chance to ignore Enemy Armour "} -c["Thorns Damage has 50% chance to ignore Enemy Armour"]={nil,"Thorns Damage has 50% chance to ignore Enemy Armour "} +c["Thorns Damage has 25% chance to ignore Enemy Armour"]={{[1]={flags=32,keywordFlags=0,name="ChanceToIgnoreEnemyArmour",type="BASE",value=25}},nil} +c["Thorns Damage has 50% chance to ignore Enemy Armour"]={{[1]={flags=32,keywordFlags=0,name="ChanceToIgnoreEnemyArmour",type="BASE",value=50}},nil} c["Thorns can Retaliate against all Hits"]={nil,"Thorns can Retaliate against all Hits "} c["Totems Regenerate 3% of maximum Life per second"]={nil,"Totems Regenerate 3% of maximum Life per second "} c["Totems die 6 seconds after their Life is reduced to 0"]={nil,"Totems die 6 seconds after their Life is reduced to 0 "} diff --git a/src/Data/SkillStatMap.lua b/src/Data/SkillStatMap.lua index 1015ed3c91..8aacda5619 100644 --- a/src/Data/SkillStatMap.lua +++ b/src/Data/SkillStatMap.lua @@ -1023,7 +1023,7 @@ return { mod("ImprovedSpellDamageAppliesToAttacks", "MAX", nil), }, ["additive_thorns_damage_modifiers_apply_to_attack_damage"] = { - flag("ThornsDamageAppliesToHits"), + flag("ThornsDamageApplyToAttackDamage"), }, ["active_skill_main_hand_weapon_damage_+%_final"] = { mod("Damage", "MORE", nil, 0, 0, { type = "Condition", var = "MainHandAttack" }), diff --git a/src/Data/Skills/act_str.lua b/src/Data/Skills/act_str.lua index 351a1f4b7e..bf5f9c8baa 100644 --- a/src/Data/Skills/act_str.lua +++ b/src/Data/Skills/act_str.lua @@ -16047,6 +16047,7 @@ skills["RollingSlamPlayer"] = { skills["ScavengedPlatingPlayer"] = { name = "Scavenged Plating", baseTypeName = "Scavenged Plating", + grantsThornsDamage = true, icon = "Art/2DArt/SkillIcons/BruteScavengedPlating.dds", color = 1, description = "While active, uses fragments of armour scavenged from enemies to bolster your own. Fully Breaking an enemy's Armour grants you stacks of Scavenged Plating for a duration based on the enemy's rarity, and you gain Armour and Thorns per stack. Normal enemies grant 1 stack, Magic enemies grant 2 stacks, Rare enemies grant 5 stacks and Unique enemies grant 10 stacks.", @@ -16107,6 +16108,12 @@ skills["ScavengedPlatingPlayer"] = { ["scavenged_plating_armour_+%_final_per_stack"] = { mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), }, + ["scavenged_plating_thorns_minimum_physical_damage"] = { + mod("PhysicalMin", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), + }, + ["scavenged_plating_thorns_maximum_physical_damage"] = { + mod("PhysicalMax", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), + }, ["scavenged_plating_maximum_stacks_display"] = { mod("Multiplier:ScavengedPlatingStacksLimit", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating"}), }, @@ -20753,4 +20760,4 @@ skills["WolfPackPlayer"] = { }, }, } -} \ No newline at end of file +} diff --git a/src/Data/Skills/other.lua b/src/Data/Skills/other.lua index c54fa07b60..f3fb76f8bd 100644 --- a/src/Data/Skills/other.lua +++ b/src/Data/Skills/other.lua @@ -9377,6 +9377,34 @@ skills["VoidIllusionSpawnPlayer"] = { }, } } + skills["ThornsPlayer"] = { + name = "Thorns", + hidden = true, + fromItem = true, + skillTypes = { [SkillType.Damage] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Thorns", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + } + } skills["MetaMirageDeadeyePlayer"] = { name = "Mirage Deadeye", diff --git a/src/Data/Skills/sup_int.lua b/src/Data/Skills/sup_int.lua index 13d5198a09..a2db60f222 100644 --- a/src/Data/Skills/sup_int.lua +++ b/src/Data/Skills/sup_int.lua @@ -2347,6 +2347,7 @@ skills["TriggeredDeadlyCurrentPlayer"] = { skills["SupportCracklingBarrierPlayer"] = { name = "Crackling Barrier", description = "Supports Channelling Skills. While Channelling Supported Skills, you gain Lightning Thorns based off of your maximum Mana.", + grantsThornsDamage = true, color = 3, support = true, requireSkillTypes = { SkillType.Channel, }, @@ -2362,6 +2363,12 @@ skills["SupportCracklingBarrierPlayer"] = { label = "Crackling Barrier", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["return_%_of_maximum_mana_as_lightning_damage_to_attacker_while_channelling"] = { + mod("LightningMin", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }), + mod("LightningMax", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }), + }, + }, baseFlags = { }, constantStats = { @@ -7991,4 +7998,4 @@ skills["SupportZenithPlayerTwo"] = { }, }, } -} \ No newline at end of file +} diff --git a/src/Data/Skills/sup_str.lua b/src/Data/Skills/sup_str.lua index 012054998d..9249228c7f 100644 --- a/src/Data/Skills/sup_str.lua +++ b/src/Data/Skills/sup_str.lua @@ -541,6 +541,11 @@ skills["SupportBarbsPlayer"] = { label = "Barbs I", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayer as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, + }, baseFlags = { }, constantStats = { @@ -554,6 +559,35 @@ skills["SupportBarbsPlayer"] = { }, } } + skills["TriggeredBarbsPlayer"] = { + name = "Barbs I", + hidden = true, + description = "Deal your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs I", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, + } + skills["SupportBarbsPlayerTwo"] = { name = "Barbs II", description = "Supports Melee Strike Skills. Supported Skills deal your Thorns Damage on Hit after you've Retaliated with Thorns Damage.", @@ -572,6 +606,11 @@ skills["SupportBarbsPlayerTwo"] = { label = "Barbs II", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayerTwo as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, + }, baseFlags = { }, constantStats = { @@ -585,6 +624,35 @@ skills["SupportBarbsPlayerTwo"] = { }, } } + skills["TriggeredBarbsPlayerTwo"] = { + name = "Barbs II", + hidden = true, + description = "Deal your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs II", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, + } + skills["SupportBarbsPlayerThree"] = { name = "Barbs III", description = "Supports Melee Strike Skills. Supported Skills deal your Thorns Damage on Hit twice after you've Retaliated with Thorns Damage.", @@ -603,6 +671,11 @@ skills["SupportBarbsPlayerThree"] = { label = "Barbs III", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["deal_thorns_damage_twice_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayerThree as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, + }, baseFlags = { }, constantStats = { @@ -616,6 +689,36 @@ skills["SupportBarbsPlayerThree"] = { }, } } + skills["TriggeredBarbsPlayerThree"] = { + name = "Barbs III", + hidden = true, + description = "Deal twice your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs III", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + }, + baseMods = { + mod("DoubleDamageChance", "BASE", 100, 0, 0), + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, + } + skills["SupportBattershoutPlayer"] = { name = "Battershout", description = "Supports Warcry Skills. Supported Skills Consume Fully Broken Armour to trigger Physical Damage explosions on Enemies within their range but cannot themselves Break Armour. ", @@ -4976,6 +5079,11 @@ skills["SupportQuillburstPlayer"] = { label = "Quill Burst", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "gem_stat_descriptions", + statMap = { + ["trigger_spiked_gauntlets_for_X_hits_after_thorns_trigger"] = { + flag("EnableTriggeredQuillburst"), + }, + }, baseFlags = { }, constantStats = { @@ -5006,7 +5114,13 @@ skills["TriggeredQuillburstPlayer"] = { label = "Quill Burst", incrementalEffectiveness = 0.054999999701977, statDescriptionScope = "triggered_spiked_gauntlets", + statMap = { + ["display_skill_deals_thorns_damage"] = { + -- display only + }, + }, baseFlags = { + thorns = true, }, constantStats = { { "triggered_by_spiked_gauntlets_support_%", 100 }, @@ -6714,7 +6828,7 @@ skills["SupportThornskinPlayer"] = { statDescriptionScope = "gem_stat_descriptions", statMap = { ["support_thorns_spirit_cost_thorns_damage_+%"] = { - mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }), + mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }), }, }, baseFlags = { @@ -6749,7 +6863,7 @@ skills["SupportThornskinPlayerTwo"] = { statDescriptionScope = "gem_stat_descriptions", statMap = { ["support_thorns_spirit_cost_thorns_damage_+%"] = { - mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }), + mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }), }, }, baseFlags = { diff --git a/src/Export/Skills/act_str.txt b/src/Export/Skills/act_str.txt index f2877f1ec4..76da855fff 100644 --- a/src/Export/Skills/act_str.txt +++ b/src/Export/Skills/act_str.txt @@ -925,12 +925,19 @@ end, #skillEnd #skill ScavengedPlatingPlayer +grantsThornsDamage = true, #set ScavengedPlatingPlayer #flags duration statMap = { ["scavenged_plating_armour_+%_final_per_stack"] = { mod("Armour", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), }, + ["scavenged_plating_thorns_minimum_physical_damage"] = { + mod("PhysicalMin", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), + }, + ["scavenged_plating_thorns_maximum_physical_damage"] = { + mod("PhysicalMax", "BASE", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating" }, { type = "Multiplier", var = "ScavengedPlatingStacks", limitVar = "ScavengedPlatingStacksLimit" }), + }, ["scavenged_plating_maximum_stacks_display"] = { mod("Multiplier:ScavengedPlatingStacksLimit", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Scavenged Plating"}), }, @@ -1231,4 +1238,4 @@ statMap = { #set WolfPackPlayer #flags minion #mods -#skillEnd \ No newline at end of file +#skillEnd diff --git a/src/Export/Skills/other.txt b/src/Export/Skills/other.txt index 2b5b8d74b5..8a3228f914 100644 --- a/src/Export/Skills/other.txt +++ b/src/Export/Skills/other.txt @@ -801,3 +801,32 @@ statMap = { #flags #mods #skillEnd + +skills["ThornsPlayer"] = { + name = "Thorns", + hidden = true, + fromItem = true, + skillTypes = { [SkillType.Damage] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Thorns", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + } +} \ No newline at end of file diff --git a/src/Export/Skills/sup_int.txt b/src/Export/Skills/sup_int.txt index e703524e9e..3540b3bc75 100644 --- a/src/Export/Skills/sup_int.txt +++ b/src/Export/Skills/sup_int.txt @@ -413,7 +413,14 @@ statMap = { #skillEnd #skill SupportCracklingBarrierPlayer +grantsThornsDamage = true, #set SupportCracklingBarrierPlayer +statMap = { + ["return_%_of_maximum_mana_as_lightning_damage_to_attacker_while_channelling"] = { + mod("LightningMin", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }), + mod("LightningMax", "BASE", nil, ModFlag.Thorns, 0, { type = "PercentStat", stat = "Mana", percent = 1 }, { type = "GlobalEffect", effectType = "Buff", effectName = "Crackling Barrier" }, { type = "Condition", var = "Channelling" }), + }, +}, #mods #skillEnd @@ -1515,4 +1522,4 @@ statMap = { #skill SupportZenithPlayerTwo #set SupportZenithPlayerTwo #mods -#skillEnd \ No newline at end of file +#skillEnd diff --git a/src/Export/Skills/sup_str.txt b/src/Export/Skills/sup_str.txt index d7d4a3a9fb..13b832bbfa 100644 --- a/src/Export/Skills/sup_str.txt +++ b/src/Export/Skills/sup_str.txt @@ -107,19 +107,125 @@ statMap = { #skill SupportBarbsPlayer #set SupportBarbsPlayer +statMap = { + ["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayer as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, +}, #mods #skillEnd +skills["TriggeredBarbsPlayer"] = { + name = "Barbs I", + hidden = true, + description = "Deal your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs I", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + triggeredOnHitBySupportedSkill = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, +} + #skill SupportBarbsPlayerTwo #set SupportBarbsPlayerTwo +statMap = { + ["deal_thorns_damage_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayerTwo as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, +}, #mods #skillEnd +skills["TriggeredBarbsPlayerTwo"] = { + name = "Barbs II", + hidden = true, + description = "Deal your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs II", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + triggeredOnHitBySupportedSkill = true, + }, + baseMods = { + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, +} + #skill SupportBarbsPlayerThree #set SupportBarbsPlayerThree +statMap = { + ["deal_thorns_damage_twice_on_hit_for_X_hits_after_thorns_trigger"] = { + -- handled by TriggeredBarbsPlayerThree as an additionalGrantedEffect hard-coded in Modules/Data.lua + }, +}, #mods #skillEnd +skills["TriggeredBarbsPlayerThree"] = { + name = "Barbs III", + hidden = true, + description = "Deal twice your thorns damage.", + skillTypes = { [SkillType.Damage] = true, [SkillType.SkillGrantedBySupport] = true, [SkillType.AttackInPlace] = true }, + cannotBeSupported = true, + qualityStats = {}, + levels = { + [1] = { levelRequirement = 0 }, + }, + statSets = { + [1] = { + label = "Barbs III", + incrementalEffectiveness = 0, + statDescriptionScope = "skill_stat_descriptions", + baseFlags = { + thorns = true, + triggeredOnHitBySupportedSkill = true, + }, + baseMods = { + mod("DoubleDamageChance", "BASE", 100, 0, 0), + }, + constantStats = {}, + stats = {}, + levels = { + [1] = {}, + }, + }, + }, +} + #skill SupportBattershoutPlayer #set SupportBattershoutPlayer #mods @@ -1140,11 +1246,22 @@ statMap = { #skill SupportQuillburstPlayer #set SupportQuillburstPlayer +statMap = { + ["trigger_spiked_gauntlets_for_X_hits_after_thorns_trigger"] = { + -- display only + }, +}, #mods #skillEnd #skill TriggeredQuillburstPlayer #set TriggeredQuillburstPlayer +#flags thorns +statMap = { + ["display_skill_deals_thorns_damage"] = { + -- display only + }, +}, #mods thorns area #skillEnd @@ -1516,7 +1633,7 @@ statMap = { #set SupportThornskinPlayer statMap = { ["support_thorns_spirit_cost_thorns_damage_+%"] = { - mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }), + mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin I" }), }, }, #mods @@ -1526,7 +1643,7 @@ statMap = { #set SupportThornskinPlayerTwo statMap = { ["support_thorns_spirit_cost_thorns_damage_+%"] = { - mod("ThornsDamage", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }), + mod("Damage", "INC", nil, ModFlag.Thorns, 0, { type = "GlobalEffect", effectType = "Buff", effectName = "Thornskin II" }), }, }, #mods diff --git a/src/Modules/CalcActiveSkill.lua b/src/Modules/CalcActiveSkill.lua index 36ea2d7f41..cfea75c786 100644 --- a/src/Modules/CalcActiveSkill.lua +++ b/src/Modules/CalcActiveSkill.lua @@ -510,6 +510,8 @@ function calcs.buildActiveSkillModList(env, activeSkill) end if skillFlags.attack or skillFlags.nonWeaponAttack then skillModFlags = bor(skillModFlags, ModFlag.Attack) + elseif skillFlags.thorns then + skillModFlags = bor(skillModFlags, ModFlag.Thorns) else skillModFlags = bor(skillModFlags, ModFlag.Cast) if skillFlags.spell then diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index 16111547f3..38e79e58bd 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -759,13 +759,15 @@ function calcs.offence(env, actor, activeSkill) end end end - if skillModList:Flag(nil, "ThornsDamageAppliesToHits") then - -- Caltrops mod - for i, value in ipairs(skillModList:Tabulate("INC", { }, "ThornsDamage")) do + + -- Apply thorns-derived modifiers to hits + if skillModList:Flag(nil, "ThornsDamageApplyToAttackDamage") then + for _, value in ipairs(skillModList:Tabulate("INC", { flags = ModFlag.Thorns }, "Damage")) do local mod = value.mod - skillModList:NewMod("Damage", "INC", mod.value, mod.source, ModFlag.Hit, mod.keywordFlags, unpack(mod)) + skillModList:NewMod("Damage", "INC", mod.value, mod.source, bor(band(mod.flags, bnot(ModFlag.Thorns)), ModFlag.Attack), mod.keywordFlags, unpack(mod)) end end + if skillModList:Flag(nil, "CastSpeedAppliesToAttacks") then -- Get all increases for this; assumption is that multiple sources would not stack, so find the max local multiplier = (skillModList:Max(skillCfg, "ImprovedCastSpeedAppliesToAttacks") or 100) / 100 @@ -4074,6 +4076,7 @@ function calcs.offence(env, actor, activeSkill) enemyDB:ReplaceMod("Armour", "OVERRIDE", -enemyDB:Sum("BASE", { source = "Config" }, "Armour"), "ArmourBreak", { type = "Condition", var = "ArmourBrokenBelowZeroMax" }, { type = "GlobalEffect", effectType= "Debuff", effectName = "ArmourBreak" }) -- if Config is set to Max, add mod with max value (use replace to avoid doubling) end local enemyArmour = enemyDB:Override(nil, "Armour") or m_max(calcLib.val(enemyDB, "Armour"), enemyArmourMin) + local chanceIgnoreEnemyArmour = m_min(skillModList:Sum("BASE", cfg, "ChanceToIgnoreEnemyArmour") / 100, 1) local ignoreEnemyArmour = skillModList:Flag(cfg, "IgnoreEnemyArmour") and enemyArmour or calcLib.val(enemyDB, "IgnoreArmour") -- check for mods that ignore Armour if ignoreEnemyArmour and (enemyArmour > 0) then enemyArmour = m_max(enemyArmour - ignoreEnemyArmour, 0) end -- subtract ignored value up to zero, if Armour is still positive (to allow future support of negative Armour) local armourReduction = calcs.armourReductionF(enemyArmour, damageTypeHitAvg * skillModList:More(cfg, "CalcArmourAsThoughDealing")) @@ -4088,7 +4091,7 @@ function calcs.offence(env, actor, activeSkill) if skillModList:Flag(cfg, "IgnoreEnemyPhysicalDamageReduction") or ChanceToIgnoreEnemyPhysicalDamageReduction >= 100 then resist = 0 else - resist = m_min(m_max(-data.misc.NegArmourDmgBonusCap, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyPhysicalDamageReduction") + armourReduction), data.misc.EnemyPhysicalDamageReductionCap) + resist = m_min(m_max(-data.misc.NegArmourDmgBonusCap, enemyDB:Sum("BASE", nil, "PhysicalDamageReduction") + skillModList:Sum("BASE", cfg, "EnemyPhysicalDamageReduction") + armourReduction * (1 - chanceIgnoreEnemyArmour)), data.misc.EnemyPhysicalDamageReductionCap) resist = resist > 0 and resist * (1 - (skillModList:Sum("BASE", nil, "PartialIgnoreEnemyPhysicalDamageReduction") / 100 + ChanceToIgnoreEnemyPhysicalDamageReduction / 100)) or resist end else diff --git a/src/Modules/CalcPerform.lua b/src/Modules/CalcPerform.lua index 85a87429ef..5e80d8abb7 100644 --- a/src/Modules/CalcPerform.lua +++ b/src/Modules/CalcPerform.lua @@ -265,6 +265,11 @@ local function doActorAttribsConditions(env, actor) condList["Channelling"] = true end end + + if env.configInput.conditionShapeshifted then + condList["Shapeshifted"] = true + end + if actor.mainSkill.skillTypes[SkillType.Bear] then condList["Shapeshifted"] = true condList["BearForm"] = true diff --git a/src/Modules/CalcSections.lua b/src/Modules/CalcSections.lua index fa4d73baeb..1792e3e71b 100644 --- a/src/Modules/CalcSections.lua +++ b/src/Modules/CalcSections.lua @@ -651,7 +651,7 @@ return { } } } }, { 1, "SkillTypeStats", 1, colorCodes.OFFENCE, {{ defaultCollapsed = false, label = "Skill type-specific Stats", data = { - { label = "Gem Level", haveOutput = "GemHasLevel", { format = "{0:output:GemLevel}", { breakdown = "GemLevel" }, { modName = { "GemLevel" }, cfg = "skill" },{ modName = { "GemSupportLevel" }, cfg = "skill" }, { modName = { "GemItemLevel" }, cfg = "skill" }, { modName = { "GemCorruptionLevel" }, cfg = "skill" } }, }, + { label = "Gem Level", notFlag = "thorns", haveOutput = "GemHasLevel", { format = "{0:output:GemLevel}", { breakdown = "GemLevel" }, { modName = { "GemLevel" }, cfg = "skill" },{ modName = { "GemSupportLevel" }, cfg = "skill" }, { modName = { "GemItemLevel" }, cfg = "skill" }, { modName = { "GemCorruptionLevel" }, cfg = "skill" } }, }, { label = "Spirit Cost", color = colorCodes.SPIRIT, haveOutput = "SpiritHasCost", { format = "{0:output:SpiritCost}", { breakdown = "SpiritCost" }, { modName = { "SpiritCost", "Cost", "SpiritCostNoMult" }, cfg = "skill" }, }, }, { label = "Spirit % Cost", color = colorCodes.SPIRIT, haveOutput = "SpiritPercentHasCost", { format = "{0:output:SpiritPercentCost}", { breakdown = "SpiritPercentCost" }, { modName = { "SpiritCost", "Cost", "SpiritCostNoMult" }, cfg = "skill" }, }, }, { label = "Mana Cost", color = colorCodes.MANA, haveOutput = "ManaHasCost", { format = "{0:output:ManaCost}", { breakdown = "ManaCost" }, { modName = { "ManaCost", "Cost", "ManaCostNoMult" }, cfg = "skill" }, }, }, @@ -752,7 +752,7 @@ return { { modName = { "CurseDelay" }, cfg = "skill" }, { modName = { "CurseActivation" }, cfg = "skill" }, } }, - { label = "Curse Limit", haveOutput = "EnemyCurseLimit", { format = "{0:output:EnemyCurseLimit}", + { label = "Curse Limit", notFlag = "thorns", haveOutput = "EnemyCurseLimit", { format = "{0:output:EnemyCurseLimit}", { breakdown = "EnemyCurseLimit" }, { modName = { "CurseLimitIsMaximumPowerCharges", "EnemyCurseLimit" } }, }, }, diff --git a/src/Modules/CalcSetup.lua b/src/Modules/CalcSetup.lua index 7d5f215b9f..d7e22ed7ea 100644 --- a/src/Modules/CalcSetup.lua +++ b/src/Modules/CalcSetup.lua @@ -11,6 +11,7 @@ local t_insert = table.insert local t_remove = table.remove local m_min = math.min local m_max = math.max +local band = AND64 local tempTable1 = { } @@ -848,6 +849,7 @@ function calcs.initEnv(build, mode, override, specEnv) if item and item.baseModList and item.baseModList:Flag(nil, "CanExplode") then t_insert(env.explodeSources, item) end + if slot.weaponSet and slot.weaponSet ~= (build.itemsTab.activeItemSet.useSecondWeaponSet and 2 or 1) then goto continue end @@ -1489,6 +1491,69 @@ function calcs.initEnv(build, mode, override, specEnv) build.skillsTab:ProcessSocketGroup(group) end + do + local function modDBHasThornsDamage(modDB) + for _, stat in ipairs({ "PhysicalMin", "PhysicalMax", "FireMin", "FireMax", "ColdMin", "ColdMax", "LightningMin", "LightningMax", "ChaosMin", "ChaosMax" }) do + for _, mod in ipairs(modDB.mods[stat] or { }) do + if mod.type == "BASE" and band(mod.flags or 0, ModFlag.Thorns) ~= 0 then + return true + end + end + end + return modDB.parent and modDBHasThornsDamage(modDB.parent) + end + local hasThornsDamage = modDBHasThornsDamage(env.modDB) + if not hasThornsDamage then + for _, socketGroup in pairs(build.skillsTab.socketGroupList) do + if socketGroup.source ~= "Thorns" and socketGroup.enabled ~= false then + for _, gem in ipairs(socketGroup.gemList) do + local grantedEffect = gem.enabled ~= false and env.data.skills[gem.skillId] + if grantedEffect and grantedEffect.grantsThornsDamage then + hasThornsDamage = true + break + end + end + end + if hasThornsDamage then + break + end + end + end + + local group + for _, socketGroup in pairs(build.skillsTab.socketGroupList) do + if socketGroup.source == "Thorns" then + group = socketGroup + break + end + end + if not hasThornsDamage then + if group then + wipeTable(group.gemList) + end + else + if not group then + group = { label = "Thorns", enabled = true, gemList = { }, source = "Thorns", noSupports = true } + t_insert(build.skillsTab.socketGroupList, group) + end + + group.thornsSources = env.thornsSources + wipeTable(group.gemList) + + local activeGemInstance = { + skillId = "ThornsPlayer", + quality = 0, + enabled = true, + level = 1, + triggered = true, + } + t_insert(group.gemList, activeGemInstance) + markList[group] = true + build.skillsTab:ProcessSocketGroup(group) + end + end + + -- Remove any socket groups that no longer have a matching item local i = 1 while build.skillsTab.socketGroupList[i] do diff --git a/src/Modules/ConfigOptions.lua b/src/Modules/ConfigOptions.lua index 6632661c52..120288fca1 100644 --- a/src/Modules/ConfigOptions.lua +++ b/src/Modules/ConfigOptions.lua @@ -1247,6 +1247,11 @@ Huge sets the radius to 11. { var = "multiplierStunnedRecently", type = "count", label = "# of times Stunned Recently:", ifOption = "conditionStunnedRecently", defaultPlaceholderState = 1, apply = function(val, modList, enemyModList) modList:NewMod("Multiplier:StunnedRecently", "BASE", m_min(val, 100), "Config", { type = "Condition", var = "Combat" }, { type = "Condition", var = "StunnedRecently" } ) end }, + { var = "conditionShapeshifted", type = "check", label = "Currently Shapeshifted?", apply = function(val, modList, enemyModList) + if val then + modList:NewMod("Condition:Shapeshifted", "FLAG", true, "Config") + end + end }, { var = "conditionShapeshiftToAnimal", type = "check", label = "Shapeshifted to animal recently?", ifSkillType = { SkillType.Bear, SkillType.Wolf, SkillType.Wyvern }, apply = function(val, modList, enemyModList) modList:NewMod("Condition:ShapeshiftToAnimal", "FLAG", true, "Config", { type = "Condition", var = "Combat" }) end }, diff --git a/src/Modules/Data.lua b/src/Modules/Data.lua index a365481aa4..8fc98820d9 100644 --- a/src/Modules/Data.lua +++ b/src/Modules/Data.lua @@ -933,6 +933,21 @@ local function setupGem(gem, gemId) table.insert(gem.additionalGrantedEffects, skill) i = i + 1 end + --handle Barbs + if gem.name:sub(1, 7) == "Barbs I" then -- also covers Barbs II and Barbs III + local additionalGrantedEffectId = "TriggeredBarbsPlayer" + if gem.name == "Barbs II" then + additionalGrantedEffectId = additionalGrantedEffectId .. "Two" + else + if gem.name == "Barbs III" then + additionalGrantedEffectId = additionalGrantedEffectId .. "Three" + end + end + gem["additionalGrantedEffectId"..i] = additionalGrantedEffectId + table.insert(gem.grantedEffectList, data.skills[gem["additionalGrantedEffectId"..i]]) + table.insert(gem.additionalGrantedEffects, data.skills[gem["additionalGrantedEffectId"..i]]) + i = i + 1 + end if gem.grantedEffectDisplayOrder then local tempTable = {} local moved = false diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index d09affd2db..afbeb68a6b 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -133,6 +133,8 @@ local formList = { ["adds (%d+) to (%d+) (%a+) spell damage"] = "DMGSPELLS", ["adds (%d+)%-(%d+) (%a+) spell damage"] = "DMGSPELLS", ["(%d+) to (%d+) added spell (%a+) damage"] = "DMGSPELLS", + ["(%d+) to (%d+) (%a+) thorns damage"] = "DMGTHORNS", + ["gain (%a+) thorns damage"] = "DMGTHORNSBASE", ["adds (%d+) to (%d+) (%a+) damage to attacks and spells"] = "DMGBOTH", ["adds (%d+)%-(%d+) (%a+) damage to attacks and spells"] = "DMGBOTH", ["adds (%d+) to (%d+) (%a+) damage to spells and attacks"] = "DMGBOTH", -- o_O @@ -698,7 +700,6 @@ local modNameList = { ["chaos damage"] = "ChaosDamage", ["non-chaos damage"] = "NonChaosDamage", ["elemental damage"] = "ElementalDamage", - ["thorns damage"] = "ThornsDamage", -- Other damage forms ["attack damage"] = { "Damage", flags = ModFlag.Attack }, ["attack physical damage"] = { "PhysicalDamage", flags = ModFlag.Attack }, @@ -736,6 +737,7 @@ local modNameList = { ["damage with bleed"] = { "Damage", keywordFlags = KeywordFlag.Bleed }, ["damage with bleeding"] = { "Damage", keywordFlags = KeywordFlag.Bleed }, ["damage with poison"] = { "Damage", keywordFlags = KeywordFlag.Poison }, + ["thorns damage"] = { "Damage", flags = ModFlag.Thorns }, ["incinerate damage for each stage"] = { "Damage", tagList = { { type = "Multiplier", var = "IncinerateStage" }, { type = "SkillName", skillName = "Incinerate" } } }, ["physical damage over time multiplier"] = "PhysicalDotMultiplier", ["fire damage over time multiplier"] = "FireDotMultiplier", @@ -745,9 +747,11 @@ local modNameList = { -- Crit/accuracy/speed modifiers ["critical hit chance"] = "CritChance", ["attack critical hit chance"] = { "CritChance", flags = ModFlag.Attack }, + ["thorns critical hit chance"] = { "CritChance", flags = ModFlag.Thorns }, ["critical damage bonus"] = "CritMultiplier", ["attack critical damage bonus"] = { "CritMultiplier", flags = ModFlag.Attack }, ["critical spell damage bonus"] = { "CritMultiplier", flags = ModFlag.Spell }, + ["thorns critical damage bonus"] = { "CritMultiplier", flags = ModFlag.Thorns }, ["accuracy"] = "Accuracy", ["accuracy rating"] = "Accuracy", ["minion accuracy rating"] = { "Accuracy", addToMinion = true }, @@ -884,6 +888,7 @@ local modNameList = { ["to inflict lightning exposure"] = "LightningExposureChance", ["to apply lightning exposure on hit"] = "LightningExposureChance", ["to ignore enemy physical damage reduction"] = "ChanceToIgnoreEnemyPhysicalDamageReduction", + ["to ignore enemy armour"] = "ChanceToIgnoreEnemyArmour", ["weapon swap speed"] = "WeaponSwapSpeed", ["to chain an additional time from terrain"] = "TerrainChainChance", ["to apply lightning exposure on hit"] = "LightningExposureChance", @@ -1187,6 +1192,7 @@ local preFlagList = { ["^attacks with ranged weapons [hd][ae][va][el] "] = { flags = ModFlag.WeaponRanged }, -- Damage types ["^attack damage "] = { flags = ModFlag.Attack }, + ["^thorns damage has "] = { flags = ModFlag.Thorns }, ["^hits deal "] = { keywordFlags = KeywordFlag.Hit }, ["^melee weapon damage"] = { flags = ModFlag.WeaponMelee }, ["^deal "] = { }, @@ -1572,6 +1578,9 @@ local modTagList = { ["per (%d+) maximum mana"] = function(num) return { tag = { type = "PerStat", stat = "Mana", div = num } } end, ["per (%d+) maximum mana, up to (%d+)%%"] = function(num, _, limit) return { tag = { type = "PerStat", stat = "Mana", div = num, limit = tonumber(limit), limitTotal = true } } end, ["per (%d+) maximum mana, up to a maximum of (%d+)%%"] = function(num, _, limit) return { tag = { type = "PerStat", stat = "Mana", div = num, limit = tonumber(limit), limitTotal = true } } end, + ["equal to (%d+)%% of maximum life"] = function(num) return { tag = { type = "PercentStat", stat = "Life", percent = num } } end, + ["equal to (%d+)%% of (y?o?u?r? ?) maximum mana"] = function(num) return { tag = { type = "PercentStat", stat = "Mana", percent = num } } end, + ["equal to (%d+)%% of (i?t?e?m? ?)armour on equipped body armour"] = function(num) return { tag = { type = "PercentStat", stat = "ArmourOnBody Armour", percent = num } } end, ["per (%d+) spirit"] = function(num) return { tag = { type = "PerStat", stat = "Spirit", div = num } } end, ["per (%d+) unreserved darkness"] = function(num) return { tag = { type = "PerStat", stat = "UnreservedDarkness", div = num } } end, ["per (%d+) accuracy rating"] = function(num) return { tag = { type = "PerStat", stat = "Accuracy", div = num } } end, @@ -3508,10 +3517,10 @@ local specialModList = { }end, ["take (%d+) (.+) damage when herald of thunder hits an enemy"] = function(dmg, _, dmgType) return { mod("StormSecretSelfDamage", "LIST", {baseDamage = dmg, damageType = dmgType}) - }end, + } end, ["your skills deal you (%d+)%% of mana cost as (.+) damage"] = function(dmgMult, _, dmgType) return { mod("ScoldsBridleSelfDamage", "LIST", {dmgMult = dmgMult, damageType = dmgType}) - }end, + } end, -- Extra skill/support ["grants skill: (%D+)"] = function(_, skill) return grantedExtraSkill(skill, 1) end, ["grants skill: level (%d+) (.+)"] = function(num, _, skill) return grantedExtraSkill(skill, num) end, @@ -6564,6 +6573,22 @@ local function parseMod(line, order) modValue = { tonumber(formCap[1]), tonumber(formCap[2]) } modName = { damageType.."Min", damageType.."Max" } modFlag = modFlag or { keywordFlags = KeywordFlag.Spell } + elseif modForm == "DMGTHORNS" then + local damageType = dmgTypes[formCap[3]] + if not damageType then + return { }, line + end + modValue = { tonumber(formCap[1]), tonumber(formCap[2]) } + modName = { damageType.."Min", damageType.."Max" } + modFlag = modFlag or { flags = ModFlag.Thorns } + elseif modForm == "DMGTHORNSBASE" then + local damageType = dmgTypes[formCap[1]] + if not damageType then + return { }, line + end + modValue = { 1, 1 } + modName = { damageType.."Min", damageType.."Max", flags = ModFlag.Thorns } + modFlag = modFlag or { flags = ModFlag.Thorns } elseif modForm == "DMGBOTH" then local damageType = dmgTypes[formCap[3]] if not damageType then