From 6d9a8c402821847d18da2819dae1e2c99e12a7a2 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Mon, 20 Jul 2026 21:20:11 +0300 Subject: [PATCH 1/7] Add support for increased mod magnitude mods --- spec/System/TestItemParse_spec.lua | 162 +++++++++++++++++++++++++++++ src/Classes/Item.lua | 143 +++++++++++++++++++++---- src/Data/ModCache.lua | 20 ++-- src/Modules/ItemTools.lua | 3 + src/Modules/ModParser.lua | 3 + 5 files changed, 302 insertions(+), 29 deletions(-) diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 5e5d0b6dc56..284bd1f62f9 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -666,4 +666,166 @@ describe("TestAdvancedItemParse #item", function() Note: ~b/o 2 chaos ]]) end) + describe("mod magnitude scaling", function() + before_each(function() + newBuild() + runCallback("onFrame") + end) + local function chaosDamageInc() + return build.calcsTab.mainEnv.modDB:Sum("INC", nil, "ChaosDamage") + end + + local function chaosResist() + return build.calcsTab.mainEnv.modDB:Sum("BASE", nil, "ChaosResist") + end + + local function spellCrit() + return build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Spell }, "CritChance") + end + + local function spellDamage() + return build.calcsTab.mainEnv.modDB:Sum("INC", { flags = ModFlag.Spell }, "Damage") + end + + it("scales matching implicit mods by modifier magnitude", function() + -- 130% * 1.7 = 221 + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Void Sceptre + LevelReq: 60 + Implicits: 1 + {range:0.5}(100-160)% increased Chaos Damage + {range:0.5}70% increased implicit Modifier magnitudes + ]]) + local item = build.itemsTab.displayItem + assert.is_true(item.advancedCopy) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(221, chaosDamageInc()) + end) + + it("does not rescale old format (baked) copies", function() + -- magnitude already baked in, so no rescale + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Baked Subject + Imperial Staff + LevelReq: 60 + Implicits: 0 + {tags:chaos,damage}130% increased Chaos Damage + 70% increased Chaos Modifier magnitudes + ]]) + local item = build.itemsTab.displayItem + assert.is_false(item.advancedCopy) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(130, chaosDamageInc()) + end) + + it("only scales mods that share the magnitude mod's tags", function() + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 0 + {tags:chaos,damage}{range:0.5}(100-160)% increased Chaos Damage + {tags:resistance}{range:0.5}+(20-40)% to Chaos Resistance + {range:0.5}100% increased resistance modifier magnitudes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + print(build.calcsTab.mainEnv.player.modDB:Sum("BASE", nil, "ChaosResist")) + assert.are.equals(0, chaosResist()) + assert.are.equals(130, chaosDamageInc()) + end) + + it("only scales the modifier type named by the magnitude mod", function() + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 1 + {range:0.5}(100-160)% increased Chaos Damage + {range:0.5}+(20-40)% to Chaos Resistance + {range:0.5}100% increased explicit modifier magnitudes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(0, chaosResist()) + assert.are.equals(130, chaosDamageInc()) + end) + + it("scales only prefixes for increased effect of prefixes", function() + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 0 + {prefix}{range:0.5}(100-160)% increased Chaos Damage + {suffix}{range:0.5}+(20-40)% to Chaos Resistance + {range:0.5}50% increased effect of prefixes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(-30, chaosResist()) + assert.are.equals(195, chaosDamageInc()) + end) + + -- actually a ring so we don't have to allocate a socket + local realJewel = [[ + Rarity: Rare + Pandemonium Desire + Ruby Ring + -------- + Quality (Caster Modifiers): +20% (augmented) + -------- + Item Level: 80 + -------- + { Corruption Enhancement — Elemental, Cold, Resistance } + +7(5-10)% to Cold Resistance + { Corruption Enhancement — Attribute } + +6(4-6) to Intelligence + -------- + { Fractured Crafted Prefix Modifier "" } + 60(40-60)% increased Effect of Suffixes — Unscalable Value + { Prefix Modifier "Mystic" (Tier: 1) — Damage, Caster — 20% Increased } + 7(5-15)% increased Spell Damage + { Suffix Modifier "of Unmaking" (Tier: 1) — Damage, Caster, Critical — 80% Increased } + 20(10-20)% increased Critical Spell Damage Bonus + { Desecrated Suffix Modifier "of Annihilating" (Tier: 1) — Caster, Critical — 80% Increased } + 15(5-15)% increased Critical Hit Chance for Spells + { Suffix Modifier "of Potency" (Tier: 1) — Damage, Critical — 60% Increased } + 20(10-20)% increased Critical Strike Multiplier + -------- + Place into an allocated Jewel Socket on the Passive Skill Tree. Right click to remove from the Socket. + -------- + Twice Corrupted + -------- + Fractured Item + -------- + Note: ~b/o 1 mirror + ]] + it("scales only prefixes for increased effect of prefixes for advanced copy format", function() + assert.equal(0, spellCrit()) + local item = new("Item", realJewel) + build.itemsTab:AddItem(item) + build.itemsTab:EquipItemInSet(item, build.itemsTab.activeItemSetId) + runCallback("OnFrame") + assert.equal(27, spellCrit()) + assert.equal(8, spellDamage()) + end) + + it("does not apply scaling twice when saving and loading", function() + local item = new("Item", new("Item", realJewel):BuildRaw()) + build.itemsTab:AddItem(item) + build.itemsTab:EquipItemInSet(item, build.itemsTab.activeItemSetId) + runCallback("OnFrame") + assert.equal(27, spellCrit()) + assert.equal(8, spellDamage()) + end) + end) end) \ No newline at end of file diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index 6d9c0c5062b..f356c972f07 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -80,9 +80,20 @@ for _, curInfluenceInfo in ipairs(influenceInfo) do end local lineFlags = { - ["crafted"] = true, ["crucible"] = true, ["custom"] = true, ["eater"] = true, ["enchant"] = true, - ["exarch"] = true, ["fractured"] = true, ["implicit"] = true, ["scourge"] = true, ["synthesis"] = true, - ["mutated"] = true, ["unscalable"] = true + ["crafted"] = true, + ["crucible"] = true, + ["custom"] = true, + ["eater"] = true, + ["enchant"] = true, + ["exarch"] = true, + ["fractured"] = true, + ["implicit"] = true, + ["scourge"] = true, + ["synthesis"] = true, + ["mutated"] = true, + ["unscalable"] = true, + ["prefix"] = true, + ["suffix"] = true } -- Special function to store unique instances of modifier on specific item slots @@ -368,6 +379,12 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.implicitModLines = { } self.explicitModLines = { } self.crucibleModLines = { } + -- old items or trade-sourced items have increases to modifiers baked in to the item text, which + -- means that we can't add e.g. quality or mod magnitude effect to them during parsing. we will + -- assume an item to be an advanced copy format if either has mod roll information, a modifier + -- line with a range, or advanced copy lines + self.advancedCopy = false + self.modMagnitudeMods = {} local implicitLines = 0 self.variantList = nil self.prefixes = { } @@ -423,6 +440,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) end elseif line:match("^{ ") then -- We're parsing advanced copy/paste format + self.advancedCopy = true linePrefix = "" linePostfix = "" self.crafted = true @@ -511,7 +529,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.itemLevel = specToNumber(specVal) elseif specName == "Requires Class" then self.classRestriction = specVal - elseif specName:match("Quality %(%a+ Modifiers%)") then + elseif specName:match("Quality %([%a%s]+ Modifiers%)") then self.catalystQuality = specToNumber(specVal:match("(%d+)%%")) for i=1, #catalystDescriptorList do if specName:match("Quality %(([%a%s]+) Modifiers%)") == catalystDescriptorList[i] then @@ -696,6 +714,7 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) t_insert(modLine.modTags, tag) end elseif k == "range" then + self.advancedCopy = true modLine.range = tonumber(val) elseif k == "corruptedRange" then modLine.corruptedRange = tonumber(val) @@ -719,6 +738,10 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) end local baseName + -- items containing (#-#) lines are marked since the values won't have catalyst or mod magnitudes applied + if line:find("%((%-?%d+%.?%d*)%-(%-?%d+%.?%d*)%)") then + self.advancedCopy = true + end if not self.base and (self.rarity == "NORMAL" or self.rarity == "MAGIC") then -- Exact match (affix-less magic and normal items) if self.name:match("Energy Blade") and itemClass then -- Special handling for energy blade base. @@ -907,6 +930,10 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) end local lineLower = line:lower() + -- \d+% increased/decreased explicit/implicit/ *tags* modifier magnitudes + local modMagnitudePattern = { "(%d+)%% ([id][ne]creased) ?([%a%s]*) modifier magnitudes", + -- \d+% increased/decreased effect of suffixes/prefixes + "(%d+)%% ([id][ne]creased) effect of ([sp][ur][fe]fix)es" } if lineLower == "implicit modifiers cannot be changed" then self.implicitsCannotBeChanged = true elseif lineLower:match(" prefix modifiers? allowed") then @@ -962,6 +989,28 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.onlyPhysicalDamage = true end + for _, pattern in ipairs(modMagnitudePattern) do + if rangedLine:lower():find(pattern) then + local rangedLine = itemLib.applyRange(line, modLine.range or main.defaultItemAffixQuality or 1, catalystScalar, modLine.corruptedRange) + local amount, increaseOrDecrease, modTagsString = rangedLine:lower():match(pattern) + if amount and modTagsString and (increaseOrDecrease == "increased" or increaseOrDecrease == "decreased") then + local modTags = {} + local modType + -- explicit elemental damage -> tags = {elemental, damage}, modType = explicit + for word in (modTagsString .. " "):gmatch("%S+") do + word = word:lower() + if word == "implicit" or word == "explicit" or word == "enchant" then + modType = word + else + table.insert(modTags, word) + end + end + local quality = increaseOrDecrease == "increased" and tonumber(amount) or -tonumber(amount) + table.insert(self.modMagnitudeMods, { tags = modTags, quality = quality, modType = modType }) + break + end + end + end local modLines if modLine.enchant or (modLine.crafted and #self.enchantModLines + #self.implicitModLines < implicitLines) then modLines = self.enchantModLines @@ -1024,6 +1073,50 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.requirements.level = self.base.req.level end end + if self.advancedCopy then + -- apply mod magnitude boost to matching mods + if #self.modMagnitudeMods > 0 then + for _, modMagnitudeMod in ipairs(self.modMagnitudeMods) do + local modLists + if modMagnitudeMod.modType then + modLists = { self[modMagnitudeMod.modType .. "ModLines"] } + else + modLists = { self.implicitModLines, self.explicitModLines, self.enchantModLines } + end + for _, mods in ipairs(modLists) do + for _, mod in ipairs(mods or {}) do + -- Create a fast lookup table for all provided tags + local tagLookup = {} + for _, curTag in ipairs(mod.modTags) do + tagLookup[curTag] = true; + end + -- these aren't actual mod tags but do appear in mod magnitude mods + for _, lineFlag in ipairs({ "desecrated", "prefix", "suffix" }) do + if mod[lineFlag] then + tagLookup[lineFlag] = true + end + end + local match = true + for _, magnitudeTag in ipairs(modMagnitudeMod.tags) do + if not tagLookup[magnitudeTag] then + match = false + end + end + if match then + mod.valueScalar = (mod.valueScalar or 1) + (modMagnitudeMod.quality / 100) + end + if mod.valueScalar and mod.valueScalar ~= 1 then + local rangedLine = itemLib.applyRange(mod.line, mod.range, mod.valueScalar, 1) + local modList, extra = modLib.parseMod(rangedLine) + mod.displayValueScalar = 1 + mod.modList = modList + mod.extra = extra + end + end + end + end + end + end self.affixLimit = 0 if self.crafted then if not self.affixes then @@ -1285,6 +1378,12 @@ function ItemClass:BuildRaw() if modLine.fractured then line = "{fractured}" .. line end + if modLine.prefix then + line = "{prefix}" .. line + end + if modLine.suffix then + line = "{suffix}" .. line + end if modLine.exarch then line = "{exarch}" .. line end @@ -1451,7 +1550,12 @@ function ItemClass:Craft() return tonumber(num) + tonumber(other) end) else - local modLine = { line = line, order = order } + local modLine = { line = line, order = order, type = mod.type } + if mod.type == "Prefix" then + modLine.prefix = true + elseif mod.type == "Suffix" then + modLine.suffix = true + end for l = 1, #self.explicitModLines + 1 do if not self.explicitModLines[l] or self.explicitModLines[l].order > order then t_insert(self.explicitModLines, l, modLine) @@ -1824,6 +1928,17 @@ function ItemClass:BuildModListForSlotNum(baseList, slotNum) return { unpack(modList) } end +local function getRangedModList(item, modLine) + if not modLine.range or not modLine.line:find("%((%-?%d+%.?%d*)%-(%-?%d+%.?%d*)%)") then + return + end + local line = itemLib.applyRange(modLine.line:gsub("\n", " "), modLine.range, modLine.valueScalar, modLine.corruptedRange) + local list, extra = modLib.parseMod(line) + if itemLib.isZeroValueLine(line) then + return {} + end + return not extra and list +end -- Build lists of modifiers for each slot the item can occupy function ItemClass:BuildModList() if not self.base then @@ -1862,20 +1977,10 @@ function ItemClass:BuildModList() end -- handle understood modifier variable properties if not modLine.extra then - if modLine.range then - -- Check if line actually has a range - if modLine.line:find("%((%-?%d+%.?%d*)%-(%-?%d+%.?%d*)%)") then - local strippedModeLine = modLine.line:gsub("\n"," ") - local catalystScalar = getCatalystScalar(self.catalyst, modLine, self.catalystQuality) - -- Put the modified value into the string - local line = itemLib.applyRange(strippedModeLine, modLine.range, catalystScalar, modLine.corruptedRange) - -- Check if we can parse it before adding the mods - local list, extra = modLib.parseMod(line) - if list and not extra then - modLine.modList = list - t_insert(self.rangeLineList, modLine) - end - end + local rangedModList = getRangedModList(self, modLine) + if rangedModList then + modLine.modList = rangedModList + t_insert(self.rangeLineList, modLine) end for _, mod in ipairs(modLine.modList) do mod = modLib.setSource(mod, self.modSource) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 18082b7621c..7685d45bab6 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -2795,7 +2795,7 @@ c["100% increased Evasion Rating from Equipped Body Armour"]={{[1]={[1]={slotNam c["100% increased Evasion Rating if Energy Shield Recharge has started in the past 2 seconds"]={{[1]={[1]={type="Condition",var="EnergyShieldRechargePastTwoSec"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=100}},nil} c["100% increased Evasion Rating if you have been Hit Recently"]={{[1]={[1]={type="Condition",var="BeenHitRecently"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=100}},nil} c["100% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=100}},nil} -c["100% increased Explicit Modifier magnitudes"]={{}," Explicit Modifier magnitudes "} +c["100% increased Explicit Modifier magnitudes"]={{},nil} c["100% increased Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamage",type="INC",value=100}},nil} c["100% increased Fire Damage with Hits and Ailments against Bleeding Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Bleeding"},flags=0,keywordFlags=786432,name="FireDamage",type="INC",value=100}},nil} c["100% increased Freeze Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeDuration",type="INC",value=100}},nil} @@ -3038,8 +3038,7 @@ c["120% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShie c["120% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=120}},nil} c["120% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=120}},nil} c["120% increased Frenzy Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="FrenzyChargesDuration",type="INC",value=120}},nil} -c["120% increased Implicit Modifier magnitudes"]={{}," Implicit Modifier magnitudes "} -c["120% increased Implicit Modifier magnitudes 20% increased Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=120}}," Implicit Modifier magnitudes 20% increased "} +c["120% increased Implicit Modifier magnitudes"]={{},nil} c["120% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=120}},nil} c["120% increased Power Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="PowerChargesDuration",type="INC",value=120}},nil} c["120% increased Spell Critical Strike Chance"]={{[1]={flags=2,keywordFlags=0,name="CritChance",type="INC",value=120}},nil} @@ -4449,7 +4448,7 @@ c["25% increased Physical Damage with One Handed Melee Weapons"]={{[1]={flags=33 c["25% increased Physical Damage with Two Handed Melee Weapons"]={{[1]={flags=603979780,keywordFlags=0,name="PhysicalDamage",type="INC",value=25}},nil} c["25% increased Poison Duration"]={{[1]={flags=0,keywordFlags=0,name="EnemyPoisonDuration",type="INC",value=25}},nil} c["25% increased Poison Duration if you have at least 150 Intelligence"]={{[1]={[1]={stat="Int",threshold=150,type="StatThreshold"},flags=0,keywordFlags=0,name="EnemyPoisonDuration",type="INC",value=25}},nil} -c["25% increased Prefix Modifier magnitudes"]={{}," Prefix Modifier magnitudes "} +c["25% increased Prefix Modifier magnitudes"]={{},nil} c["25% increased Projectile Damage"]={{[1]={flags=1024,keywordFlags=0,name="Damage",type="INC",value=25}},nil} c["25% increased Projectile Speed"]={{[1]={flags=0,keywordFlags=0,name="ProjectileSpeed",type="INC",value=25}},nil} c["25% increased Quantity of Items Dropped by Slain Frozen Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Frozen"},flags=0,keywordFlags=0,name="LootQuantity",type="INC",value=25}},nil} @@ -4473,8 +4472,7 @@ c["25% increased Stun Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name=" c["25% increased Stun Duration with Melee Weapons"]={{[1]={flags=67108864,keywordFlags=0,name="EnemyStunDuration",type="INC",value=25}},nil} c["25% increased Stun Duration with Two Handed Melee Weapons on Enemies"]={{[1]={flags=603979780,keywordFlags=0,name="EnemyStunDuration",type="INC",value=25}},nil} c["25% increased Stun and Block Recovery"]={{[1]={flags=0,keywordFlags=0,name="StunRecovery",type="INC",value=25}},nil} -c["25% increased Suffix Modifier magnitudes"]={{}," Suffix Modifier magnitudes "} -c["25% increased Suffix Modifier magnitudes +27% to Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist",type="INC",value=25}}," Suffix Modifier magnitudes +27% to "} +c["25% increased Suffix Modifier magnitudes"]={{},nil} c["25% increased Tincture Cooldown Recovery Rate"]={{[1]={flags=0,keywordFlags=0,name="TinctureCooldownRecovery",type="INC",value=25}},nil} c["25% increased Totem Damage"]={{[1]={flags=0,keywordFlags=16384,name="Damage",type="INC",value=25}},nil} c["25% increased Totem Life"]={{[1]={flags=0,keywordFlags=0,name="TotemLife",type="INC",value=25}},nil} @@ -5759,7 +5757,7 @@ c["50% increased Melee Damage against Bleeding Enemies"]={{[1]={[1]={actor="enem c["50% increased Movement Speed"]={{[1]={flags=0,keywordFlags=0,name="MovementSpeed",type="INC",value=50}},nil} c["50% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=50}},nil} c["50% increased Physical Damage taken"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageTaken",type="INC",value=50}},nil} -c["50% increased Prefix Modifier magnitudes"]={{}," Prefix Modifier magnitudes "} +c["50% increased Prefix Modifier magnitudes"]={{},nil} c["50% increased Projectile Attack Damage while you have at least 200 Dexterity"]={{[1]={[1]={stat="Dex",threshold=200,type="StatThreshold"},flags=1025,keywordFlags=0,name="Damage",type="INC",value=50}},nil} c["50% increased Projectile Damage"]={{[1]={flags=1024,keywordFlags=0,name="Damage",type="INC",value=50}},nil} c["50% increased Projectile Damage while in Blood Stance"]={{[1]={[1]={type="Condition",var="BloodStance"},flags=1024,keywordFlags=0,name="Damage",type="INC",value=50}},nil} @@ -5784,7 +5782,7 @@ c["50% increased Stun Duration on you"]={{[1]={flags=0,keywordFlags=0,name="Stun c["50% increased Stun Duration with Bows on Enemies"]={{[1]={flags=131076,keywordFlags=0,name="EnemyStunDuration",type="INC",value=50}},nil} c["50% increased Stun Threshold"]={{[1]={flags=0,keywordFlags=0,name="StunThreshold",type="INC",value=50}},nil} c["50% increased Stun and Block Recovery"]={{[1]={flags=0,keywordFlags=0,name="StunRecovery",type="INC",value=50}},nil} -c["50% increased Suffix Modifier magnitudes"]={{}," Suffix Modifier magnitudes "} +c["50% increased Suffix Modifier magnitudes"]={{},nil} c["50% increased Totem Duration"]={{[1]={flags=0,keywordFlags=0,name="TotemDuration",type="INC",value=50}},nil} c["50% increased Totem Life"]={{[1]={flags=0,keywordFlags=0,name="TotemLife",type="INC",value=50}},nil} c["50% increased Totem Placement speed"]={{[1]={flags=0,keywordFlags=0,name="TotemPlacementSpeed",type="INC",value=50}},nil} @@ -6199,6 +6197,7 @@ c["75% increased Ignite Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name c["75% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=75}},nil} c["75% increased Projectile Speed"]={{[1]={flags=0,keywordFlags=0,name="ProjectileSpeed",type="INC",value=75}},nil} c["75% increased Spell Critical Strike Chance per Raised Spectre"]={{[1]={[1]={stat="ActiveSpectreLimit",type="PerStat"},flags=2,keywordFlags=0,name="CritChance",type="INC",value=75}},nil} +c["75% increased Unveiled Modifier magnitudes"]={{},nil} c["75% increased bonuses gained from Equipped Quiver"]={{[1]={flags=0,keywordFlags=0,name="EffectOfBonusesFromQuiver",type="INC",value=75}},nil} c["75% increased maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="INC",value=75}},nil} c["75% more Main Hand attack speed"]={{[1]={[1]={type="Condition",var="MainHandAttack"},[2]={skillType=1,type="SkillType"},flags=1,keywordFlags=0,name="Speed",type="MORE",value=75}},nil} @@ -6221,6 +6220,7 @@ c["76% chance to Freeze"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeChance" c["76% chance to Ignite"]={{[1]={flags=0,keywordFlags=0,name="EnemyIgniteChance",type="BASE",value=76}},nil} c["76% chance to Shock"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockChance",type="BASE",value=76}},nil} c["76% chance to deal Double Damage while Focused"]={{[1]={[1]={type="Condition",var="Focused"},flags=0,keywordFlags=0,name="DoubleDamageChance",type="BASE",value=76}},nil} +c["76% increased Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ElementalDamage",type="INC",value=76}},nil} c["76% increased Mana Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="ManaRegen",type="INC",value=76}},nil} c["777% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=777}},nil} c["79% increased Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=79}},nil} @@ -6448,6 +6448,7 @@ c["90% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShiel c["90% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=90}},nil} c["90% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=90}},nil} c["90% increased Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamage",type="INC",value=90}},nil} +c["90% increased Implicit Modifier magnitudes"]={{},nil} c["90% increased Lightning Damage"]={{[1]={flags=0,keywordFlags=0,name="LightningDamage",type="INC",value=90}},nil} c["90% increased Mana Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="ManaRegen",type="INC",value=90}},nil} c["90% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=90}},nil} @@ -6455,8 +6456,7 @@ c["90% increased Power Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="Pow c["90% increased Rarity of Items found"]={{[1]={flags=0,keywordFlags=0,name="LootRarity",type="INC",value=90}},nil} c["90% increased Rarity of Items found with a Normal Item Equipped"]={{[1]={[1]={threshold=1,type="MultiplierThreshold",var="NormalItem"},flags=0,keywordFlags=0,name="LootRarity",type="INC",value=90}},nil} c["90% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type="INC",value=90}},nil} -c["90% increased Unveiled Modifier magnitudes"]={{}," Unveiled Modifier magnitudes "} -c["90% increased Unveiled Modifier magnitudes 188% increased Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="ChaosDamage",type="INC",value=90}}," Unveiled Modifier magnitudes 188% increased "} +c["90% increased Unveiled Modifier magnitudes"]={{},nil} c["90% less Power Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="PowerChargesDuration",type="MORE",value=-90}},nil} c["90% of Damage taken Recouped as Life"]={{[1]={flags=0,keywordFlags=0,name="LifeRecoup",type="BASE",value=90}},nil} c["90% reduced Duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=-90}},nil} diff --git a/src/Modules/ItemTools.lua b/src/Modules/ItemTools.lua index 9f2a14fc014..70331dad442 100644 --- a/src/Modules/ItemTools.lua +++ b/src/Modules/ItemTools.lua @@ -85,6 +85,9 @@ local function antonymFunc(num, word) return antonym and (num.." "..antonym) or ("-"..num.." "..word) end +function itemLib.isZeroValueLine(line) + return line:match("^%+?0%%? ") or (line:match(" %+?0%%? ") and not line:match("0 to [1-9]") and not line:match("0%% to %d+%%")) or line:match(" 0%-0 ") or line:match(" 0 to 0 ") +end -- Apply range value (0 to 1) to a modifier that has a range: "(x-x)" or "(x-x) to (x-x)" function itemLib.applyRange(line, range, valueScalar, baseValueScalar) -- stripLines down to # in place of any number and store numbers inside values also remove all + signs are kept if value is positive diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index bc4a0ccf005..e7fb0628135 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -5751,6 +5751,9 @@ local specialModList = { end, ["immun[ei]t?y? to elemental ailments while bleeding"] = { flag("ElementalAilmentImmune", { type = "Condition", var = "Bleeding" }) }, ["mana is increased by (%d+)%% of overcapped lightning resistance"] = function(num) return { flag("ManaIncreasedByOvercappedLightningRes"), mod("Mana", "INC", num / 100, { type = "PerStat", stat = "LightningResistOverCap" }) } end, + -- handled in item parsing + ["%d+%% [id][ne]creased ?[%a%s]* modifier magnitudes"] = {}, + ["%d+%% [id][ne]creased effect of [sp][ur][fe]fixes"] = {}, } for _, name in ipairs(data.keystones) do specialModList[name:lower()] = { mod("Keystone", "LIST", name) } From 19fe30ae4f455ab6fe6b53c46f28c045234bb29d Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Mon, 20 Jul 2026 21:33:23 +0300 Subject: [PATCH 2/7] Fix prefix/suffix catalyst --- src/Classes/Item.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index f356c972f07..ea76b388eab 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -33,7 +33,6 @@ local function getCatalystScalar(catalystId, mod, quality) return 1 end local tags = mod.modTags - local affixType = mod.type if not catalystId or type(catalystId) ~= "number" or not catalystTags[catalystId] or not tags or type(tags) ~= "table" or #tags == 0 then return 1 end @@ -46,8 +45,11 @@ local function getCatalystScalar(catalystId, mod, quality) for _, curTag in ipairs(tags) do tagLookup[curTag] = true; end - if affixType == "Prefix" or affixType == "Suffix" then -- Sinistral/Dextral - tagLookup[affixType:lower()] = true + -- these aren't actual mod tags but do sinistral/dextral catalyst + for _, lineFlag in ipairs({ "prefix", "suffix" }) do + if mod[lineFlag] then + tagLookup[lineFlag] = true + end end -- Find if any of the catalyst's tags match the provided tags From 2f96d26f7fcbfa6cd3635fe12d4a951f197cc87a Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Mon, 20 Jul 2026 21:51:53 +0300 Subject: [PATCH 3/7] Remove debug print --- spec/System/TestItemParse_spec.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 284bd1f62f9..7b90a5f0d0d 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -736,7 +736,6 @@ describe("TestAdvancedItemParse #item", function() ]]) build.itemsTab:AddDisplayItem() runCallback("OnFrame") - print(build.calcsTab.mainEnv.player.modDB:Sum("BASE", nil, "ChaosResist")) assert.are.equals(0, chaosResist()) assert.are.equals(130, chaosDamageInc()) end) From 7d90a8fb70bbf831cb19f7008f1855b44ead3ae8 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Tue, 21 Jul 2026 10:59:00 +0300 Subject: [PATCH 4/7] Fix review issues and add tests for them --- spec/System/TestItemParse_spec.lua | 34 ++++++++++++++++++++++++++ src/Classes/Item.lua | 38 +++++++++++++++++++----------- src/Modules/ModParser.lua | 4 ++-- 3 files changed, 60 insertions(+), 16 deletions(-) diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 7b90a5f0d0d..049b71bdff8 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -738,6 +738,40 @@ describe("TestAdvancedItemParse #item", function() runCallback("OnFrame") assert.are.equals(0, chaosResist()) assert.are.equals(130, chaosDamageInc()) + newBuild() + + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 0 + {tags:chaos,damage}{range:0.5}(100-160)% increased Chaos Damage + {tags:defences}{range:0.5}+(20-40)% to Chaos Resistance + {range:0.5}100% increased defence modifier magnitudes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(0, chaosResist()) + assert.are.equals(130, chaosDamageInc()) + newBuild() + + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 0 + {tags:chaos,damage}{range:0.5}(100-160)% increased Chaos Damage + {tags:physical,damage}{range:0.5}+(20-40)% to Chaos Resistance + {tags:caster,damage}{range:0.5}(10-30)% increased spell damage + {range:0.5}100% increased physical and chaos damage modifier magnitudes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(0, chaosResist()) + assert.are.equals(260, chaosDamageInc()) + assert.are.equals(20, spellDamage()) end) it("only scales the modifier type named by the magnitude mod", function() diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index ea76b388eab..01ea261c9be 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -932,10 +932,10 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) end local lineLower = line:lower() - -- \d+% increased/decreased explicit/implicit/ *tags* modifier magnitudes - local modMagnitudePattern = { "(%d+)%% ([id][ne]creased) ?([%a%s]*) modifier magnitudes", - -- \d+% increased/decreased effect of suffixes/prefixes - "(%d+)%% ([id][ne]creased) effect of ([sp][ur][fe]fix)es" } + -- \d+% increased/reduced explicit/implicit/ *tags* modifier magnitudes + local modMagnitudePattern = { "(%d+)%% ([ir][ne][cd][ru][ec][ae][sd]e?d?) ?([%a%s]*) modifier magnitudes", + -- \d+% increased/reduced effect of suffixes/prefixes + "(%d+)%% ([ir][ne][cd][ru][ec][ae][sd]e?d?) effect of ([sp][ur][fe]fix)es" } if lineLower == "implicit modifiers cannot be changed" then self.implicitsCannotBeChanged = true elseif lineLower:match(" prefix modifiers? allowed") then @@ -991,24 +991,34 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.onlyPhysicalDamage = true end + -- some tags might not match up exactly to tag strings + local modMagnitudeTagMap = { + defence = "defences" + } for _, pattern in ipairs(modMagnitudePattern) do if rangedLine:lower():find(pattern) then local rangedLine = itemLib.applyRange(line, modLine.range or main.defaultItemAffixQuality or 1, catalystScalar, modLine.corruptedRange) local amount, increaseOrDecrease, modTagsString = rangedLine:lower():match(pattern) - if amount and modTagsString and (increaseOrDecrease == "increased" or increaseOrDecrease == "decreased") then + if amount and modTagsString and (increaseOrDecrease == "increased" or increaseOrDecrease == "reduced") then local modTags = {} local modType - -- explicit elemental damage -> tags = {elemental, damage}, modType = explicit - for word in (modTagsString .. " "):gmatch("%S+") do - word = word:lower() - if word == "implicit" or word == "explicit" or word == "enchant" then - modType = word - else - table.insert(modTags, word) + local quality = increaseOrDecrease == "increased" and tonumber(amount) or -tonumber(amount) + if modTagsString == "physical and chaos damage" then + table.insert(self.modMagnitudeMods, { tags = { "physical", "damage" }, quality = quality, modType = modType }) + table.insert(self.modMagnitudeMods, { tags = { "chaos", "damage" }, quality = quality, modType = modType }) + else + -- explicit elemental damage -> tags = {elemental, damage}, modType = explicit + for word in (modTagsString .. " "):gmatch("%S+") do + word = word:lower() + word = modMagnitudeTagMap[word] or word + if word == "implicit" or word == "explicit" or word == "enchant" then + modType = word + else + table.insert(modTags, word) + end end + table.insert(self.modMagnitudeMods, { tags = modTags, quality = quality, modType = modType }) end - local quality = increaseOrDecrease == "increased" and tonumber(amount) or -tonumber(amount) - table.insert(self.modMagnitudeMods, { tags = modTags, quality = quality, modType = modType }) break end end diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index e7fb0628135..1d023c57757 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -5752,8 +5752,8 @@ local specialModList = { ["immun[ei]t?y? to elemental ailments while bleeding"] = { flag("ElementalAilmentImmune", { type = "Condition", var = "Bleeding" }) }, ["mana is increased by (%d+)%% of overcapped lightning resistance"] = function(num) return { flag("ManaIncreasedByOvercappedLightningRes"), mod("Mana", "INC", num / 100, { type = "PerStat", stat = "LightningResistOverCap" }) } end, -- handled in item parsing - ["%d+%% [id][ne]creased ?[%a%s]* modifier magnitudes"] = {}, - ["%d+%% [id][ne]creased effect of [sp][ur][fe]fixes"] = {}, + ["%d+%% [ir][ne][cd][ru][ec][ae][sd]e?d? ?[%a%s]* modifier magnitudes"] = {}, + ["%d+%% [ir][ne][cd][ru][ec][ae][sd]e?d? effect of [sp][ur][fe]fixes"] = {}, } for _, name in ipairs(data.keystones) do specialModList[name:lower()] = { mod("Keystone", "LIST", name) } From 36544bb97fc17c2ab7018ce80f044cece45e7d71 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Tue, 21 Jul 2026 11:00:17 +0300 Subject: [PATCH 5/7] Reduction test --- spec/System/TestItemParse_spec.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 049b71bdff8..7c51801ed96 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -791,6 +791,22 @@ describe("TestAdvancedItemParse #item", function() assert.are.equals(130, chaosDamageInc()) end) + it("reduces the modifier magnitude correctly", function() + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Sapphire Ring + LevelReq: 20 + Implicits: 0 + {range:0.5}(100-160)% increased Chaos Damage + {range:0.5}+(20-40)% to Chaos Resistance + {range:0.5}50% reduced explicit modifier magnitudes + ]]) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(-45, chaosResist()) + assert.are.equals(65, chaosDamageInc()) + end) it("scales only prefixes for increased effect of prefixes", function() build.itemsTab:CreateDisplayItemFromRaw([[ Rarity: RARE From 90ff93719b095f2650bbfa8286d05a2cde66b2c6 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Tue, 21 Jul 2026 20:04:21 +0300 Subject: [PATCH 6/7] Add eyes of the greatwolf lines --- spec/System/TestItemParse_spec.lua | 35 ++++++++++++++++++++++++++++++ src/Classes/Item.lua | 16 +++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/spec/System/TestItemParse_spec.lua b/spec/System/TestItemParse_spec.lua index 7c51801ed96..540e6dd4001 100644 --- a/spec/System/TestItemParse_spec.lua +++ b/spec/System/TestItemParse_spec.lua @@ -705,6 +705,41 @@ describe("TestAdvancedItemParse #item", function() assert.are.equals(221, chaosDamageInc()) end) + it("scales properly using old Eyes of the Greatwolf line", function() + -- 130% * 1.7 = 221 + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Void Sceptre + LevelReq: 60 + Implicits: 1 + {range:0.5}(100-160)% increased Chaos Damage + {range:0.5}Implicit Modifier magnitudes are doubled + ]]) + local item = build.itemsTab.displayItem + assert.is_true(item.advancedCopy) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(260, chaosDamageInc()) + end) + + it("scales properly using new Eyes of the Greatwolf line", function() + -- 130% * 1.7 = 221 + build.itemsTab:CreateDisplayItemFromRaw([[ + Rarity: RARE + Test Subject + Void Sceptre + LevelReq: 60 + Implicits: 1 + {range:0.5}{crafted}(100-160)% increased Chaos Damage + {range:0.5}(50-100)% increased Enchantment Modifier magnitudes + ]]) + local item = build.itemsTab.displayItem + assert.is_true(item.advancedCopy) + build.itemsTab:AddDisplayItem() + runCallback("OnFrame") + assert.are.equals(227, chaosDamageInc()) + end) it("does not rescale old format (baked) copies", function() -- magnitude already baked in, so no rescale build.itemsTab:CreateDisplayItemFromRaw([[ diff --git a/src/Classes/Item.lua b/src/Classes/Item.lua index 01ea261c9be..4933132c5c8 100644 --- a/src/Classes/Item.lua +++ b/src/Classes/Item.lua @@ -935,7 +935,9 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) -- \d+% increased/reduced explicit/implicit/ *tags* modifier magnitudes local modMagnitudePattern = { "(%d+)%% ([ir][ne][cd][ru][ec][ae][sd]e?d?) ?([%a%s]*) modifier magnitudes", -- \d+% increased/reduced effect of suffixes/prefixes - "(%d+)%% ([ir][ne][cd][ru][ec][ae][sd]e?d?) effect of ([sp][ur][fe]fix)es" } + "(%d+)%% ([ir][ne][cd][ru][ec][ae][sd]e?d?) effect of ([sp][ur][fe]fix)es", + -- eyes of the greatwolf + "([%a%s]*) modifier magnitudes are doubled" } if lineLower == "implicit modifiers cannot be changed" then self.implicitsCannotBeChanged = true elseif lineLower:match(" prefix modifiers? allowed") then @@ -991,14 +993,22 @@ function ItemClass:ParseRaw(raw, rarity, highQuality) self.onlyPhysicalDamage = true end - -- some tags might not match up exactly to tag strings + -- some tags might not match up exactly to tag strings. this has a list of exceptions local modMagnitudeTagMap = { - defence = "defences" + defence = "defences", + -- 3.29 eyes of the greatwolf + enchantment = "enchant", } for _, pattern in ipairs(modMagnitudePattern) do if rangedLine:lower():find(pattern) then local rangedLine = itemLib.applyRange(line, modLine.range or main.defaultItemAffixQuality or 1, catalystScalar, modLine.corruptedRange) local amount, increaseOrDecrease, modTagsString = rangedLine:lower():match(pattern) + -- "are doubled" format -> swap variables + if amount and not (increaseOrDecrease or modTagsString) then + modTagsString = amount + amount = 100 + increaseOrDecrease = "increased" + end if amount and modTagsString and (increaseOrDecrease == "increased" or increaseOrDecrease == "reduced") then local modTags = {} local modType From 7e6cb6edd2370a28aabc050153f69db4d17e7a26 Mon Sep 17 00:00:00 2001 From: vaisest <4550061+vaisest@users.noreply.github.com> Date: Tue, 21 Jul 2026 20:09:45 +0300 Subject: [PATCH 7/7] Add magnitude doubled line to modparser --- src/Data/ModCache.lua | 27 ++++++++++++++++++++++++++- src/Modules/ModParser.lua | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Data/ModCache.lua b/src/Data/ModCache.lua index 7685d45bab6..26063426aeb 100755 --- a/src/Data/ModCache.lua +++ b/src/Data/ModCache.lua @@ -396,6 +396,7 @@ c["+120 to Strength"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE",value c["+120 to maximum Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=120}},nil} c["+120 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=120}},nil} c["+120 to maximum Mana"]={{[1]={flags=0,keywordFlags=0,name="Mana",type="BASE",value=120}},nil} +c["+120% to Global Critical Strike Multiplier"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="CritMultiplier",type="BASE",value=120}},nil} c["+1200 to Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="BASE",value=1200}},nil} c["+122 to maximum Life"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=122}},nil} c["+125 to Accuracy Rating"]={{[1]={flags=0,keywordFlags=0,name="Accuracy",type="BASE",value=125}},nil} @@ -1342,6 +1343,7 @@ c["+4 to Minimum Endurance Charges"]={{[1]={flags=0,keywordFlags=0,name="Enduran c["+4 to Minimum Power Charges"]={{[1]={flags=0,keywordFlags=0,name="PowerChargesMin",type="BASE",value=4}},nil} c["+4 to Ward per 10 Evasion Rating on Equipped Gloves"]={{[1]={[1]={div=10,stat="EvasionOnGloves",type="PerStat"},flags=0,keywordFlags=0,name="Ward",type="BASE",value=4}},nil} c["+4 to all Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="BASE",value=4},[2]={flags=0,keywordFlags=0,name="Dex",type="BASE",value=4},[3]={flags=0,keywordFlags=0,name="Int",type="BASE",value=4},[4]={flags=0,keywordFlags=0,name="All",type="BASE",value=4}},nil} +c["+4 to maximum number of Raised Zombies"]={{[1]={flags=0,keywordFlags=0,name="ActiveZombieLimit",type="BASE",value=4}},nil} c["+4 to maximum number of Summoned Totems"]={{[1]={flags=0,keywordFlags=0,name="ActiveTotemLimit",type="BASE",value=4}},nil} c["+4% Chance to Block"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="BASE",value=4}},nil} c["+4% Chance to Block Attack Damage"]={{[1]={flags=0,keywordFlags=0,name="BlockChance",type="BASE",value=4}},nil} @@ -2743,6 +2745,7 @@ c["100% increased Armour and Evasion"]={{[1]={flags=0,keywordFlags=0,name="Armou c["100% increased Armour from Equipped Boots and Gloves"]={{[1]={[1]={slotNameList={[1]="Gloves",[2]="Boots"},type="SlotName"},flags=0,keywordFlags=0,name="Armour",type="INC",value=100}},nil} c["100% increased Aspect of the Avian Buff Effect"]={{[1]={[1]={skillName="Aspect of the Avian",type="SkillName"},flags=0,keywordFlags=0,name="BuffEffect",type="INC",value=100}},nil} c["100% increased Attack Critical Strike Chance while Dual Wielding"]={{[1]={[1]={type="Condition",var="DualWielding"},flags=1,keywordFlags=0,name="CritChance",type="INC",value=100}},nil} +c["100% increased Attack Damage"]={{[1]={flags=1,keywordFlags=0,name="Damage",type="INC",value=100}},nil} c["100% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=100}},nil} c["100% increased Blind duration"]={{[1]={flags=0,keywordFlags=0,name="Duration",type="INC",value=100}}," Blind "} c["100% increased Burning Damage if you've Ignited an Enemy Recently"]={{[1]={[1]={type="Condition",var="IgnitedEnemyRecently"},flags=0,keywordFlags=134217728,name="FireDamage",type="INC",value=100}},nil} @@ -2755,6 +2758,7 @@ c["100% increased Charges gained by Other Flasks during Effect Gains no Charges c["100% increased Charges per use"]={{[1]={flags=0,keywordFlags=0,name="FlaskChargesUsed",type="INC",value=100}},nil} c["100% increased Chill Duration on Enemies when in Off Hand"]={{[1]={[1]={num=2,type="SlotNumber"},flags=0,keywordFlags=0,name="EnemyChillDuration",type="INC",value=100}},nil} c["100% increased Claw Physical Damage when on Low Life"]={{[1]={[1]={type="Condition",var="LowLife"},flags=262148,keywordFlags=0,name="PhysicalDamage",type="INC",value=100}},nil} +c["100% increased Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=100}},nil} c["100% increased Cold Damage while your Off Hand is empty"]={{[1]={[1]={type="Condition",var="OffHandIsEmpty"},flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=100}},nil} c["100% increased Critical Strike Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="INC",value=100}},nil} c["100% increased Critical Strike Chance against Enemies that are on Full Life"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="FullLife"},flags=0,keywordFlags=0,name="CritChance",type="INC",value=100}},nil} @@ -3031,6 +3035,7 @@ c["120% increased Critical Strike Chance while you have Avatar of Fire"]={{[1]={ c["120% increased Critical Strike Chance with Swords"]={{[1]={flags=4194308,keywordFlags=0,name="CritChance",type="INC",value=120}},nil} c["120% increased Critical Strike Chance with Traps"]={{[1]={flags=0,keywordFlags=4096,name="CritChance",type="INC",value=120}},nil} c["120% increased Critical Strike Chance with Vaal Skills during effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=512,name="CritChance",type="INC",value=120}},nil} +c["120% increased Damage"]={{[1]={flags=0,keywordFlags=0,name="Damage",type="INC",value=120}},nil} c["120% increased Damage with Vaal Skills"]={{[1]={flags=0,keywordFlags=512,name="Damage",type="INC",value=120}},nil} c["120% increased Damage with Vaal Skills during effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=512,name="Damage",type="INC",value=120}},nil} c["120% increased Endurance Charge Duration"]={{[1]={flags=0,keywordFlags=0,name="EnduranceChargesDuration",type="INC",value=120}},nil} @@ -3620,6 +3625,7 @@ c["180% increased Duration of Ailments you inflict while Focused"]={{[1]={[1]={t c["180% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=180}},nil} c["180% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=180}},nil} c["180% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=180}},nil} +c["180% increased Global Critical Strike Chance"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="CritChance",type="INC",value=180}},nil} c["180% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=180}},nil} c["185% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=185}},nil} c["185% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=185}},nil} @@ -3711,6 +3717,7 @@ c["20 Life gained on Kill per Frenzy Charge"]={{[1]={[1]={type="Condition",var=" c["20 Life gained when you Block"]={{[1]={flags=0,keywordFlags=0,name="LifeOnBlock",type="BASE",value=20}},nil} c["20 Mana gained when you Block"]={{[1]={flags=0,keywordFlags=0,name="ManaOnBlock",type="BASE",value=20}},nil} c["20% Chance to Block Spell Damage"]={{[1]={flags=0,keywordFlags=0,name="SpellBlockChance",type="BASE",value=20}},nil} +c["20% additional Physical Damage Reduction"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageReduction",type="BASE",value=20}},nil} c["20% additional Physical Damage Reduction while affected by a Non-Vaal Guard Skill"]={{[1]={[1]={type="Condition",var="AffectedByNonVaalGuardSkill"},flags=0,keywordFlags=0,name="PhysicalDamageReduction",type="BASE",value=20}},nil} c["20% chance for Energy Shield Recharge to start when you Block"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=20}}," for Recharge to start when you Block "} c["20% chance for Energy Shield Recharge to start when you Block 35% chance for Energy Shield Recharge to start when you Block"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="BASE",value=20}}," for Recharge to start when you Block 35% chance for Energy Shield Recharge to start when you Block "} @@ -3750,6 +3757,7 @@ c["20% chance to Curse non-Cursed Enemies with a random Hex on Hit"]={{[1]={flag c["20% chance to Defend with 200% of Armour"]={{[1]={[1]={type="Condition",var="ArmourMax"},flags=0,keywordFlags=0,name="ArmourDefense",source="Armour Mastery: Max Calc",type="MAX",value=100},[2]={[1]={type="Condition",var="ArmourAvg"},flags=0,keywordFlags=0,name="ArmourDefense",source="Armour Mastery: Average Calc",type="MAX",value=20},[3]={[1]={neg=true,type="Condition",var="ArmourMax"},[2]={neg=true,type="Condition",var="ArmourAvg"},flags=0,keywordFlags=0,name="ArmourDefense",source="Armour Mastery: Min Calc",type="MAX",value=0}},nil} c["20% chance to Freeze"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeChance",type="BASE",value=20}},nil} c["20% chance to Freeze Enemies for 1 second when they Hit you"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeChance",type="BASE",value=20}}," Enemies for 1 second when they Hit you "} +c["20% chance to Freeze, Shock and Ignite"]={{[1]={flags=0,keywordFlags=0,name="EnemyFreezeChance",type="BASE",value=20},[2]={flags=0,keywordFlags=0,name="EnemyShockChance",type="BASE",value=20},[3]={flags=0,keywordFlags=0,name="EnemyIgniteChance",type="BASE",value=20}},nil} c["20% chance to Ignite"]={{[1]={flags=0,keywordFlags=0,name="EnemyIgniteChance",type="BASE",value=20}},nil} c["20% chance to Impale Enemies on Hit with Attacks"]={{[1]={flags=0,keywordFlags=65536,name="ImpaleChance",type="BASE",value=20}},nil} c["20% chance to Impale Enemies on Hit with Two Handed Weapons"]={{[1]={flags=536870916,keywordFlags=0,name="ImpaleChance",type="BASE",value=20}},nil} @@ -4118,8 +4126,14 @@ c["200% increased Spell Damage if you've dealt a Critical Strike in the past 8 s c["200% increased Stun Duration on Enemies"]={{[1]={flags=0,keywordFlags=0,name="EnemyStunDuration",type="INC",value=200}},nil} c["200% increased Stun and Block Recovery"]={{[1]={flags=0,keywordFlags=0,name="StunRecovery",type="INC",value=200}},nil} c["200% increased bonuses gained from Equipped Quiver"]={{[1]={flags=0,keywordFlags=0,name="EffectOfBonusesFromQuiver",type="INC",value=200}},nil} +c["200% of Cold Damage from Hits taken as Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamageFromHitsTakenAsFire",type="BASE",value=200}},nil} +c["200% of Cold Damage from Hits taken as Lightning Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamageFromHitsTakenAsLightning",type="BASE",value=200}},nil} +c["200% of Fire Damage from Hits taken as Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamageFromHitsTakenAsCold",type="BASE",value=200}},nil} +c["200% of Fire Damage from Hits taken as Lightning Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamageFromHitsTakenAsLightning",type="BASE",value=200}},nil} c["200% of Life Leech applies to Enemies as Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="LifeAsChaos",type="BASE",value=200}}," Leech applies to Enemies "} c["200% of Life Leech applies to Enemies as Chaos Damage 15% increased Movement Speed during any Flask Effect"]={{[1]={[1]={type="Condition",var="UsingFlask"},flags=0,keywordFlags=0,name="LifeAsChaos",type="BASE",value=200}}," Leech applies to Enemies 15% increased Movement Speed "} +c["200% of Lightning Damage from Hits taken as Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="LightningDamageFromHitsTakenAsCold",type="BASE",value=200}},nil} +c["200% of Lightning Damage from Hits taken as Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="LightningDamageFromHitsTakenAsFire",type="BASE",value=200}},nil} c["205% increased Armour"]={{[1]={flags=0,keywordFlags=0,name="Armour",type="INC",value=205}},nil} c["205% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=205}},nil} c["207% increased Cold Damage"]={{[1]={flags=0,keywordFlags=0,name="ColdDamage",type="INC",value=207}},nil} @@ -4553,6 +4567,7 @@ c["250% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name c["250% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=250}},nil} c["250% increased bonuses gained from Equipped Quiver"]={{[1]={flags=0,keywordFlags=0,name="EffectOfBonusesFromQuiver",type="INC",value=250}},nil} c["26% chance to deal Double Damage"]={{[1]={flags=0,keywordFlags=0,name="DoubleDamageChance",type="BASE",value=26}},nil} +c["26% increased Area of Effect"]={{[1]={flags=0,keywordFlags=0,name="AreaOfEffect",type="INC",value=26}},nil} c["26% increased Attack Speed"]={{[1]={flags=1,keywordFlags=0,name="Speed",type="INC",value=26}},nil} c["26% increased Critical Strike Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="INC",value=26}},nil} c["26% increased Effect of Lightning Ailments"]={{[1]={flags=0,keywordFlags=0,name="EnemyShockEffect",type="INC",value=26},[2]={flags=0,keywordFlags=0,name="EnemySapEffect",type="INC",value=26}},nil} @@ -4996,12 +5011,14 @@ c["31% increased Light Radius"]={{[1]={flags=0,keywordFlags=0,name="LightRadius" c["31% increased Minion Duration"]={{[1]={[1]={skillType=88,type="SkillType"},[2]={skillType=9,type="SkillType"},flags=0,keywordFlags=0,name="Duration",type="INC",value=31}},nil} c["31% increased Spell Damage"]={{[1]={flags=2,keywordFlags=0,name="Damage",type="INC",value=31}},nil} c["310% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=310}},nil} +c["32% increased Attack and Cast Speed"]={{[1]={flags=0,keywordFlags=0,name="Speed",type="INC",value=32}},nil} c["32% increased Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="INC",value=32},[2]={flags=0,keywordFlags=0,name="Dex",type="INC",value=32},[3]={flags=0,keywordFlags=0,name="Int",type="INC",value=32},[4]={flags=0,keywordFlags=0,name="All",type="INC",value=32}},nil} c["32% increased Critical Strike Chance"]={{[1]={flags=0,keywordFlags=0,name="CritChance",type="INC",value=32}},nil} c["32% increased Damage if you've used a Travel Skill Recently"]={{[1]={[1]={type="Condition",var="UsedTravelSkillRecently"},flags=0,keywordFlags=0,name="Damage",type="INC",value=32}},nil} c["32% increased Elemental Damage"]={{[1]={flags=0,keywordFlags=0,name="ElementalDamage",type="INC",value=32}},nil} c["32% increased Evasion Rating while Focused"]={{[1]={[1]={type="Condition",var="Focused"},flags=0,keywordFlags=0,name="Evasion",type="INC",value=32}},nil} c["32% increased Movement Speed while affected by a Magic Abyss Jewel"]={{[1]={[1]={threshold=1,type="MultiplierThreshold",var="MagicAbyssJewels"},flags=0,keywordFlags=0,name="MovementSpeed",type="INC",value=32}},nil} +c["32% increased Quantity of Items found"]={{[1]={flags=0,keywordFlags=0,name="LootQuantity",type="INC",value=32}},nil} c["320% increased Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EnergyShield",type="INC",value=320}},nil} c["320% increased Evasion Rating"]={{[1]={flags=0,keywordFlags=0,name="Evasion",type="INC",value=320}},nil} c["320% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=320}},nil} @@ -5207,6 +5224,9 @@ c["40% chance to Chill Attackers for 4 seconds on Block 40% chance to Shock Atta c["40% chance to Shock Attackers for 4 seconds on Block"]={{[1]={flags=0,keywordFlags=0,name="ShockBase",type="BASE",value=15}},nil} c["40% chance to deal Double Damage while Focused"]={{[1]={[1]={type="Condition",var="Focused"},flags=0,keywordFlags=0,name="DoubleDamageChance",type="BASE",value=40}},nil} c["40% chance to gain a Frenzy Charge for each Enemy you hit with a Critical Strike"]={nil,"a Frenzy Charge for each Enemy you hit with a Critical Strike "} +c["40% chance to gain a Frenzy Charge on Kill"]={nil,"a Frenzy Charge "} +c["40% chance to gain a Power Charge on Kill"]={nil,"a Power Charge "} +c["40% chance to gain an Endurance Charge on Kill"]={nil,"an Endurance Charge "} c["40% chance to inflict an additional Poison on the same Target when you inflict Poison"]={{[1]={flags=0,keywordFlags=0,name="AdditionalPoisonChance",type="BASE",value=40}},nil} c["40% chance when you Kill a Scorched Enemy to Burn Each surrounding"]={{}," when you Kill a Scorched Enemy to Burn Each surrounding "} c["40% chance when you Kill a Scorched Enemy to Burn Each surrounding Enemy for 4 seconds, dealing 8% of the Killed Enemy's Life as Fire Damage per second"]={{[1]={flags=0,keywordFlags=0,name="Life",type="BASE",value=40}}," when you Kill a Scorched Enemy to Burn Each surrounding Enemy , dealing 8% of the Killed Enemy's as Fire Damage per second "} @@ -5893,6 +5913,7 @@ c["55% reduced Fire Resistance"]={{[1]={flags=0,keywordFlags=0,name="FireResist" c["55% reduced Lightning Resistance"]={{[1]={flags=0,keywordFlags=0,name="LightningResist",type="INC",value=-55}},nil} c["550% increased Evasion and Energy Shield"]={{[1]={flags=0,keywordFlags=0,name="EvasionAndEnergyShield",type="INC",value=550}},nil} c["550% increased Physical Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamage",type="INC",value=550}},nil} +c["56% increased Attributes"]={{[1]={flags=0,keywordFlags=0,name="Str",type="INC",value=56},[2]={flags=0,keywordFlags=0,name="Dex",type="INC",value=56},[3]={flags=0,keywordFlags=0,name="Int",type="INC",value=56},[4]={flags=0,keywordFlags=0,name="All",type="INC",value=56}},nil} c["56% increased Mana Regeneration Rate"]={{[1]={flags=0,keywordFlags=0,name="ManaRegen",type="INC",value=56}},nil} c["57% increased Attack Speed while a Rare or Unique Enemy is Nearby"]={{[1]={[1]={actor="enemy",type="ActorCondition",varList={[1]="NearbyRareOrUniqueEnemy",[2]="RareOrUnique"}},flags=1,keywordFlags=0,name="Speed",type="INC",value=57}},nil} c["58% increased Cast Speed"]={{[1]={flags=16,keywordFlags=0,name="Speed",type="INC",value=58}},nil} @@ -6371,6 +6392,7 @@ c["80% increased Evasion Rating while moving"]={{[1]={[1]={type="Condition",var= c["80% increased Fire Damage"]={{[1]={flags=0,keywordFlags=0,name="FireDamage",type="INC",value=80}},nil} c["80% increased Fire Damage with Attack Skills"]={{[1]={flags=0,keywordFlags=65536,name="FireDamage",type="INC",value=80}},nil} c["80% increased Global Critical Strike Chance when in Main Hand"]={{[1]={[1]={type="Global"},[2]={num=1,type="SlotNumber"},flags=0,keywordFlags=0,name="CritChance",type="INC",value=80}},nil} +c["80% increased Global Defences"]={{[1]={[1]={type="Global"},flags=0,keywordFlags=0,name="Defences",type="INC",value=80}},nil} c["80% increased Lightning Damage with Attack Skills"]={{[1]={flags=0,keywordFlags=65536,name="LightningDamage",type="INC",value=80}},nil} c["80% increased Mana Cost of Skills"]={{[1]={flags=0,keywordFlags=0,name="ManaCost",type="INC",value=80}},nil} c["80% increased Mana Recovery from Flasks"]={{[1]={flags=0,keywordFlags=0,name="FlaskManaRecovery",type="INC",value=80}},nil} @@ -8794,6 +8816,7 @@ c["Gain 35% of Missing Unreserved Life before being Hit by an Enemy"]={{[1]={fla c["Gain 35% of Physical Attack Damage as Extra Fire Damage"]={{[1]={flags=1,keywordFlags=0,name="PhysicalDamageGainAsFire",type="BASE",value=35}},nil} c["Gain 35% of Physical Damage as Extra Chaos Damage"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageGainAsChaos",type="BASE",value=35}},nil} c["Gain 35% of Physical Damage as Extra Damage of a random Element while you are Ignited"]={{[1]={[1]={type="Condition",var="Ignited"},flags=0,keywordFlags=0,name="PhysicalDamageGainAsRandom",type="BASE",value=35}},nil} +c["Gain 36% of Physical Damage as Extra Damage of a random Element"]={{[1]={flags=0,keywordFlags=0,name="PhysicalDamageGainAsRandom",type="BASE",value=36}},nil} c["Gain 4 Life per Enemy Hit with Attacks"]={{[1]={flags=4,keywordFlags=65536,name="LifeOnHit",type="BASE",value=4}},nil} c["Gain 4 Mana per Enemy Hit with Attacks if you've used a Mana Flask in the past 10 seconds"]={{[1]={[1]={type="Condition",var="UsingManaFlask"},flags=4,keywordFlags=65536,name="ManaOnHit",type="BASE",value=4}},nil} c["Gain 4% of Elemental Damage as Extra Chaos Damage per Shaper Item Equipped"]={{[1]={[1]={type="Multiplier",var="ShaperItem"},flags=0,keywordFlags=0,name="ElementalDamageGainAsChaos",type="BASE",value=4}},nil} @@ -9387,7 +9410,7 @@ c["Impales removed this way multiply their Reflected Damage for this Hit by the c["Impales you inflict gain 50% increased Effect once 1 second of Duration has expired"]={nil,"Impales you inflict gain 50% increased Effect once 1 second of Duration has expired "} c["Impales you inflict last 1 additional Hit"]={{[1]={flags=0,keywordFlags=0,name="ImpaleStacksMax",type="BASE",value=1}},nil} c["Impales you inflict last 2 additional Hits while using Pride"]={{[1]={[1]={type="Condition",var="AffectedByPride"},flags=0,keywordFlags=0,name="ImpaleStacksMax",type="BASE",value=2}},nil} -c["Implicit Modifier magnitudes are doubled"]={{},"Implicit Modifier magnitudes are d "} +c["Implicit Modifier magnitudes are doubled"]={{},nil} c["Implicit Modifier magnitudes are tripled"]={nil,"Implicit Modifier magnitudes are tripled "} c["Implicit Modifier magnitudes are tripled Corrupted"]={nil,"Implicit Modifier magnitudes are tripled Corrupted "} c["Implicit Modifiers Cannot Be Changed"]={{},nil} @@ -10344,6 +10367,7 @@ c["Projectiles Pierce 2 additional Targets"]={{[1]={flags=0,keywordFlags=0,name= c["Projectiles Pierce 2 additional Targets if 2 Hunter Items are Equipped"]={{[1]={[1]={threshold=2,type="MultiplierThreshold",var="HunterItem"},flags=0,keywordFlags=0,name="PierceCount",type="BASE",value="2"}},nil} c["Projectiles Pierce 4 additional Targets"]={{[1]={flags=0,keywordFlags=0,name="PierceCount",type="BASE",value=4}},nil} c["Projectiles Pierce 5 additional Targets while you have Phasing"]={{[1]={[1]={type="Condition",var="Phasing"},flags=0,keywordFlags=0,name="PierceCount",type="BASE",value=5}},nil} +c["Projectiles Pierce 8 additional Targets"]={{[1]={flags=0,keywordFlags=0,name="PierceCount",type="BASE",value=8}},nil} c["Projectiles Pierce all Burning Enemies"]={{[1]={[1]={actor="enemy",type="ActorCondition",var="Burning"},flags=0,keywordFlags=0,name="PierceAllTargets",type="FLAG",value=true}},nil} c["Projectiles Pierce all Targets while you have Phasing"]={{[1]={[1]={type="Condition",var="Phasing"},flags=0,keywordFlags=0,name="PierceAllTargets",type="FLAG",value=true}},nil} c["Projectiles Pierce an additional Target"]={{[1]={flags=0,keywordFlags=0,name="PierceCount",type="BASE",value=1}},nil} @@ -10749,6 +10773,7 @@ c["Regenerate 75 Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegen c["Regenerate 75 Life per second per Endurance Charge"]={{[1]={[1]={type="Multiplier",var="EnduranceCharge"},flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=75}},nil} c["Regenerate 8 Life over 1 second for each Spell you Cast"]={{[1]={[1]={type="Condition",var="CastLast1Seconds"},flags=0,keywordFlags=0,name="LifeRegen",type="BASE",value=8}},nil} c["Regenerate 8% of Energy Shield over 2 seconds when you Consume a corpse"]={{[1]={[1]={type="Condition",var="ConsumedCorpseInPast2Sec"},flags=0,keywordFlags=0,name="EnergyShieldRegenPercent",type="BASE",value=4}},nil} +c["Regenerate 8% of Life per second"]={{[1]={flags=0,keywordFlags=0,name="LifeRegenPercent",type="BASE",value=8}},nil} c["Regenerate 80 Energy Shield per Second per Poison on you, up to 400 per second"]={{[1]={[1]={limit=400,limitTotal=true,type="Multiplier",var="PoisonStack"},flags=0,keywordFlags=0,name="EnergyShieldRegen",type="BASE",value=80}},nil} c["Regenerate 9 Mana per second"]={{[1]={flags=0,keywordFlags=0,name="ManaRegen",type="BASE",value=9}},nil} c["Regenerate 90 Energy Shield per second"]={{[1]={flags=0,keywordFlags=0,name="EnergyShieldRegen",type="BASE",value=90}},nil} diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 1d023c57757..2194f47d499 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -5754,6 +5754,7 @@ local specialModList = { -- handled in item parsing ["%d+%% [ir][ne][cd][ru][ec][ae][sd]e?d? ?[%a%s]* modifier magnitudes"] = {}, ["%d+%% [ir][ne][cd][ru][ec][ae][sd]e?d? effect of [sp][ur][fe]fixes"] = {}, + ["[%a%s]* modifier magnitudes are doubled"] = {}, } for _, name in ipairs(data.keystones) do specialModList[name:lower()] = { mod("Keystone", "LIST", name) }