diff --git a/src/Modules/CalcDefence.lua b/src/Modules/CalcDefence.lua index b3467f342..79600bb8c 100644 --- a/src/Modules/CalcDefence.lua +++ b/src/Modules/CalcDefence.lua @@ -1396,6 +1396,13 @@ function calcs.defence(env, actor) output.noSplitEvade = true end output.EvadeChance = m_min(output.EvadeChance, evadeMax) + if modDB:Flag(nil, "UnluckyEvade") then + output.EvadeChance = output.EvadeChance * output.EvadeChance / 100 + output.MeleeEvadeChance = output.MeleeEvadeChance * output.MeleeEvadeChance / 100 + output.ProjectileEvadeChance = output.ProjectileEvadeChance * output.ProjectileEvadeChance / 100 + output.SpellEvadeChance = output.SpellEvadeChance * output.SpellEvadeChance / 100 + output.SpellProjectileEvadeChance = output.SpellProjectileEvadeChance * output.SpellProjectileEvadeChance / 100 + end if breakdown then breakdown.EvadeChance = { s_format("Enemy level: %d ^8(%s the Configuration tab)", env.enemyLevel, env.configInput.enemyLevel and "overridden from" or "can be overridden in"), diff --git a/src/Modules/CalcOffence.lua b/src/Modules/CalcOffence.lua index d7a745415..1b5b2102c 100644 --- a/src/Modules/CalcOffence.lua +++ b/src/Modules/CalcOffence.lua @@ -3540,12 +3540,10 @@ function calcs.offence(env, actor, activeSkill) if skillModList:Flag(skillCfg, "LuckyHits") or (pass == 2 and damageType == "Lightning" and skillModList:Flag(skillCfg, "LightningNoCritLucky")) or (pass == 1 and skillModList:Flag(skillCfg, "CritLucky")) - or (damageType == "Lightning" and modDB:Flag(nil, "LightningLuckHits")) - or (damageType == "Chaos" and modDB:Flag(nil, "ChaosLuckyHits")) or ((damageType == "Lightning" or damageType == "Cold" or damageType == "Fire") and skillModList:Flag(skillCfg, "ElementalLuckHits")) then damageTypeLuckyChance = 1 else - damageTypeLuckyChance = m_min(skillModList:Sum("BASE", skillCfg, "LuckyHitsChance"), 100) / 100 + damageTypeLuckyChance = m_min(skillModList:Sum("BASE", skillCfg, damageType.."LuckyHitsChance", "LuckyHitsChance"), 100) / 100 end damageTypeHitAvgNotLucky = (damageTypeHitMin / 2 + damageTypeHitMax / 2) damageTypeHitAvgLucky = (damageTypeHitMin / 3 + 2 * damageTypeHitMax / 3) diff --git a/src/Modules/ModParser.lua b/src/Modules/ModParser.lua index 70353de36..c03e475af 100644 --- a/src/Modules/ModParser.lua +++ b/src/Modules/ModParser.lua @@ -2767,10 +2767,10 @@ local specialModList = { ["chance to block spell damage is equal to chance to block attack damage"] = { flag("SpellBlockChanceIsBlockChance") }, ["maximum chance to block spell damage is equal to maximum chance to block attack damage"] = { flag("SpellBlockChanceMaxIsBlockChanceMax") }, ["attack damage is lucky if you[' ]h?a?ve blocked in the past (%d+) seconds"] = { - flag("LuckyHits", nil, ModFlag.Attack, { type = "Condition", var = "BlockedRecently" }) + mod("LuckyHitsChance", "BASE", 100, nil, ModFlag.Attack, { type = "Condition", var = "BlockedRecently" }) }, ["attack damage while dual wielding is lucky if you[' ]h?a?ve blocked in the past (%d+) seconds"] = { - flag("LuckyHits", nil, ModFlag.Attack, { type = "Condition", var = "BlockedRecently" }, { type = "Condition", var = "DualWielding" }) + mod("LuckyHitsChance", "BASE", 100, nil, ModFlag.Attack, { type = "Condition", var = "BlockedRecently" }, { type = "Condition", var = "DualWielding" }) }, ["hits ignore enemy monster physical damage reduction if you[' ]h?a?ve blocked in the past (%d+) seconds"] = { flag("IgnoreEnemyPhysicalDamageReduction", { type = "Condition", var = "BlockedRecently" }) @@ -3823,11 +3823,12 @@ local specialModList = { ["%+(%d+)%% to off hand critical damage bonus per murderous eye jewel affecting you, up to a maximum of %+(%d+)%%"] = function(num, _, limit) return { mod("CritMultiplier", "BASE", num, { type = "Multiplier", var = "MurderousEyeJewel", globalLimit = tonumber(limit), globalLimitKey = "TecrodGazeOffHand" }, { type = "Condition", var = "OffHandAttack" }) } end, - ["nearby allies' damage with hits is lucky"] = { mod("ExtraAura", "LIST", { onlyAllies = true, mod = flag("LuckyHits") }) }, - ["damage with hits is lucky against heavy stunned enemies"] = { flag("LuckyHits", { type = "ActorCondition", actor = "enemy", var = "HeavyStunned" }) }, - ["damage with hits is lucky against enemies that are on low life"] = { flag("LuckyHits", { type = "ActorCondition", actor = "enemy", var = "LowLife" }) }, - ["your damage with hits is lucky"] = { flag("LuckyHits") }, - ["chaos damage with hits is lucky"] = { flag("ChaosLuckyHits") }, + ["nearby allies' damage with hits is lucky"] = { mod("ExtraAura", "LIST", { onlyAllies = true, mod = mod("LuckyHitsChance", "BASE", 100) }) }, + ["damage with hits is lucky against heavy stunned enemies"] = { mod("LuckyHitsChance", "BASE", 100, { type = "ActorCondition", actor = "enemy", var = "HeavyStunned" }) }, + ["damage with hits is lucky against enemies that are on low life"] = { mod("LuckyHitsChance", "BASE", 100, { type = "ActorCondition", actor = "enemy", var = "LowLife" }) }, + ["your damage with hits is lucky"] = { mod("LuckyHitsChance", "BASE", 100) }, + ["(%w+) damage with hits is lucky"] = function(_, damageType) return { mod(firstToUpper(damageType).."LuckyHitsChance", "BASE", 100) } end, + ["(%d+)%% chance for (%w*) ?damage with hits to be lucky"] = function(num, _, damageType) return { mod(firstToUpper(damageType).."LuckyHitsChance", "BASE", num) } end, ["elemental damage with hits is lucky while you are shocked"] = { flag("ElementalLuckHits", { type = "Condition", var = "Shocked" }) }, ["break (%d+)%% of armour on heavy stunning an enemy"] = { flag("Condition:CanArmourBreak", { type = "GlobalEffect", effectType = "Buff", effectName = "ArmourBreak" }) }, ["break (%d+)%% increased armour"] = function(num) return { mod("ArmourBreakPerHit", "INC", num)} end, @@ -3897,7 +3898,7 @@ local specialModList = { ["you are at maximum chance to block attack damage if you have not blocked recently"] = { flag("MaxBlockIfNotBlockedRecently", { type = "Condition", var = "BlockedRecently", neg = true }) }, ["you are at maximum chance to block spell damage if you have not blocked recently"] = { flag("MaxSpellBlockIfNotBlockedRecently", { type = "Condition", var = "BlockedRecently", neg = true }) }, ["%+(%d+)%% chance to block attack damage if you have not blocked recently"] = function(num) return { mod("BlockChance", "BASE", num, { type = "Condition", var = "BlockedRecently", neg = true }) } end, - ["block chance is lucky"] = { flag("BlockChanceIsLucky") }, + ["chance to block damage is lucky"] = { flag("BlockChanceIsLucky") }, ["y?o?u?r? ?chance to block is lucky"] = { flag("BlockChanceIsLucky"), flag("ProjectileBlockChanceIsLucky"),flag("SpellBlockChanceIsLucky"), flag("SpellProjectileBlockChanceIsLucky") }, ["y?o?u?r? ?chance to block is unlucky"] = { flag("BlockChanceIsUnlucky"), flag("ProjectileBlockChanceIsUnlucky"), flag("SpellBlockChanceIsUnlucky"), flag("SpellProjectileBlockChanceIsUnlucky") }, ["chance to block attack or spell damage is lucky if you've blocked recently"] = { @@ -4523,6 +4524,7 @@ local specialModList = { ["attacks cannot hit you"] = { flag("AlwaysEvade") }, ["attacks against you always hit"] = { flag("CannotEvade") }, ["maximum chance to evade is (%d+)%%"] = function(num) return { mod("EvadeChanceMax", "MAX", num) } end, + ["chance to evade is unlucky"] = { flag("UnluckyEvade") }, ["modifiers to maximum block chance instead apply to maximum resistances"] = { flag("MaxBlockChanceModsApplyMaxResist") }, ["you cannot block"] = { flag("CannotBlockAttacks")}, ["cannot block"] = { flag("CannotBlockAttacks"), flag("CannotBlockSpells") },