From 1c875d139ae67d5b72a28fc428f6e630f954c5e4 Mon Sep 17 00:00:00 2001 From: Openarl Date: Tue, 1 Nov 2016 18:00:15 +1000 Subject: [PATCH] Minor tweaks - Enemy evasion and accuracy are now calculated using the enemy mod DB - Base per-level modifiers now use the Level multiplier --- Classes/CalcBreakdownControl.lua | 12 +++++++++-- Classes/ModDB.lua | 10 ++++----- Classes/ModList.lua | 10 ++++----- Data/Gems/act_int.lua | 12 +++++------ Data/Gems/sup_dex.lua | 4 ++-- Data/Gems/sup_int.lua | 14 ++++++------- Modules/CalcSections.lua | 4 ++-- Modules/Calcs.lua | 35 +++++++++++++++----------------- manifest.xml | 16 +++++++-------- 9 files changed, 61 insertions(+), 56 deletions(-) diff --git a/Classes/CalcBreakdownControl.lua b/Classes/CalcBreakdownControl.lua index 0ff54ca9..b085b6d9 100644 --- a/Classes/CalcBreakdownControl.lua +++ b/Classes/CalcBreakdownControl.lua @@ -307,9 +307,17 @@ function CalcBreakdownClass:AddModSection(sectionData) if tag.type == "Condition" then desc = "Condition: "..self:FormatModName(tag.var) elseif tag.type == "Multiplier" then - desc = baseVal.." per "..self:FormatModName(tag.var) + if tag.base then + desc = (row.mod.type == "BASE" and string.format("%+g", tag.base) or tag.base.."%").." + "..math.abs(row.mod.value).." per "..self:FormatModName(tag.var) + else + desc = baseVal.." per "..self:FormatModName(tag.var) + end elseif tag.type == "PerStat" then - desc = baseVal.." per "..tag.div.." "..self:FormatModName(tag.stat) + if tag.base then + desc = (row.mod.type == "BASE" and string.format("%+g", tag.base) or tag.base.."%").." + "..math.abs(row.mod.value).." per "..tag.div.." "..self:FormatModName(tag.var) + else + desc = baseVal.." per "..tag.div.." "..self:FormatModName(tag.stat) + end elseif tag.type == "SkillName" then desc = "Skill: "..tag.skillName elseif tag.type == "SlotNumber" then diff --git a/Classes/ModDB.lua b/Classes/ModDB.lua index fc5a397e..f97e1e3b 100644 --- a/Classes/ModDB.lua +++ b/Classes/ModDB.lua @@ -141,17 +141,17 @@ function ModDBClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7, local mult = (self.multipliers[tag.var] or 0) if type(value) == "table" then value = copyTable(value) - value.value = value.value * mult + value.value = value.value * mult + (tag.base or 0) else - value = value * mult + value = value * mult + (tag.base or 0) end elseif tag.type == "PerStat" then - local mult = m_floor((self.stats[tag.stat] or 0) / tag.div + 0.0001) + (tag.base or 0) + local mult = m_floor((self.stats[tag.stat] or 0) / tag.div + 0.0001) if type(value) == "table" then value = copyTable(value) - value.value = value.value * mult + value.value = value.value * mult + (tag.base or 0) else - value = value * mult + value = value * mult + (tag.base or 0) end elseif tag.type == "Condition" then if not self.conditions[tag.var] then diff --git a/Classes/ModList.lua b/Classes/ModList.lua index 4d806e41..4053b4a0 100644 --- a/Classes/ModList.lua +++ b/Classes/ModList.lua @@ -111,17 +111,17 @@ function ModListClass:Sum(modType, cfg, arg1, arg2, arg3, arg4, arg5, arg6, arg7 local mult = (self.multipliers[tag.var] or 0) if type(value) == "table" then value = copyTable(value) - value.value = value.value * mult + value.value = value.value * mult + (tag.base or 0) else - value = value * mult + value = value * mult + (tag.base or 0) end elseif tag.type == "PerStat" then - local mult = m_floor((self.stats[tag.stat] or 0) / tag.div + 0.0001) + (tag.base or 0) + local mult = m_floor((self.stats[tag.stat] or 0) / tag.div + 0.0001) if type(value) == "table" then value = copyTable(value) - value.value = value.value * mult + value.value = value.value * mult + (tag.base or 0) else - value = value * mult + value = value * mult + (tag.base or 0) end elseif tag.type == "Condition" then if not self.conditions[tag.var] then diff --git a/Data/Gems/act_int.lua b/Data/Gems/act_int.lua index 731efc21..19014d82 100644 --- a/Data/Gems/act_int.lua +++ b/Data/Gems/act_int.lua @@ -990,21 +990,21 @@ gems["Enfeeble"] = { skillTypes = { [2] = true, [11] = true, [12] = true, [17] = true, [18] = true, [19] = true, [26] = true, [32] = true, [36] = true, }, baseMods = { skill("castTime", 0.5), - mod("CritChance", "INC", -25), --"critical_strike_chance_+%" = -25 + mod("CritChance", "INC", -25, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"critical_strike_chance_+%" = -25 --"base_deal_no_damage" = ? skill("debuff", true), }, qualityMods = { - mod("Accuracy", "INC", -0.5), --"accuracy_rating_+%" = -0.5 - mod("CritChance", "INC", -0.5), --"critical_strike_chance_+%" = -0.5 + mod("Accuracy", "INC", -0.5, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"accuracy_rating_+%" = -0.5 + mod("CritChance", "INC", -0.5, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"critical_strike_chance_+%" = -0.5 }, levelMods = { [1] = skill("manaCost", nil), [2] = skill("duration", nil), --"base_skill_effect_duration" [3] = mod("AreaRadius", "INC", nil), --"base_skill_area_of_effect_+%" - [4] = mod("Accuracy", "INC", nil), --"accuracy_rating_+%" - --[5] = "enfeeble_damage_+%_final" - [6] = mod("CritMultiplier", "BASE", nil), --"base_critical_strike_multiplier_+" + [4] = mod("Accuracy", "INC", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"accuracy_rating_+%" + [5] = mod("Damage", "MORE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"enfeeble_damage_+%_final" + [6] = mod("CritMultiplier", "BASE", nil, 0, 0, { type = "GlobalEffect", effectType = "Curse" }), --"base_critical_strike_multiplier_+" }, levels = { [1] = { 24, 9, 0, -18, -21, -21, }, diff --git a/Data/Gems/sup_dex.lua b/Data/Gems/sup_dex.lua index b47d3d83..126df003 100644 --- a/Data/Gems/sup_dex.lua +++ b/Data/Gems/sup_dex.lua @@ -67,10 +67,10 @@ gems["Additional Accuracy"] = { baseMods = { }, qualityMods = { - mod("Accuracy", "INC", 1), --"accuracy_rating_+%" = 1 + mod("Accuracy", "INC", 1, 0, 0, nil), --"accuracy_rating_+%" = 1 }, levelMods = { - [1] = mod("Accuracy", "BASE", nil), --"accuracy_rating" + [1] = mod("Accuracy", "BASE", nil, 0, 0, nil), --"accuracy_rating" }, levels = { [1] = { 74, }, diff --git a/Data/Gems/sup_int.lua b/Data/Gems/sup_int.lua index 5284ed88..8c19256d 100644 --- a/Data/Gems/sup_int.lua +++ b/Data/Gems/sup_int.lua @@ -322,7 +322,7 @@ gems["Controlled Destruction"] = { excludeSkillTypes = { }, baseMods = { mod("ManaCost", "MORE", 30), - mod("CritChance", "INC", -100), --"critical_strike_chance_+%" = -100 + mod("CritChance", "INC", -100, 0, 0, nil), --"critical_strike_chance_+%" = -100 }, qualityMods = { mod("Damage", "INC", 0.5, ModFlag.Spell, 0, nil), --"spell_damage_+%" = 0.5 @@ -667,10 +667,10 @@ gems["Increased Critical Damage"] = { mod("ManaCost", "MORE", 30), }, qualityMods = { - mod("CritMultiplier", "BASE", 0.75), --"base_critical_strike_multiplier_+" = 0.75 + mod("CritMultiplier", "BASE", 0.75, 0, 0, nil), --"base_critical_strike_multiplier_+" = 0.75 }, levelMods = { - [1] = mod("CritMultiplier", "BASE", nil), --"base_critical_strike_multiplier_+" + [1] = mod("CritMultiplier", "BASE", nil, 0, 0, nil), --"base_critical_strike_multiplier_+" }, levels = { [1] = { 75, }, @@ -716,11 +716,11 @@ gems["Increased Critical Strikes"] = { mod("ManaCost", "MORE", 15), }, qualityMods = { - mod("CritChance", "INC", 1), --"critical_strike_chance_+%" = 1 + mod("CritChance", "INC", 1, 0, 0, nil), --"critical_strike_chance_+%" = 1 }, levelMods = { - [1] = mod("CritChance", "INC", nil), --"critical_strike_chance_+%" - [2] = mod("CritChance", "BASE", nil), --"additional_base_critical_strike_chance" + [1] = mod("CritChance", "INC", nil, 0, 0, nil), --"critical_strike_chance_+%" + [2] = mod("CritChance", "BASE", nil, 0, 0, nil), --"additional_base_critical_strike_chance" }, levels = { [1] = { 50, 1, }, @@ -1044,7 +1044,7 @@ gems["Power Charge On Critical"] = { mod("ManaCost", "MORE", 10), }, qualityMods = { - mod("CritChance", "INC", 1), --"critical_strike_chance_+%" = 1 + mod("CritChance", "INC", 1, 0, 0, nil), --"critical_strike_chance_+%" = 1 }, levelMods = { --[1] = "add_power_charge_on_critical_strike_%" diff --git a/Modules/CalcSections.lua b/Modules/CalcSections.lua index 5073d8fd..b2d3f203 100644 --- a/Modules/CalcSections.lua +++ b/Modules/CalcSections.lua @@ -165,7 +165,7 @@ return { extra = "{0:output:HitChance}%", flag = "attack", { label = "Accuracy", { format = "{0:output:Accuracy}", { breakdown = "Accuracy" }, { modName = "Accuracy", cfg = "skill" }, }, }, - { label = "Chance to Hit", { format = "{0:output:HitChance}%", { breakdown = "HitChance" }, }, }, + { label = "Chance to Hit", { format = "{0:output:HitChance}%", { breakdown = "HitChance" }, { label = "Enemy Evasion modifiers", modName = "Evasion", enemy = true }, }, }, } }, { 1, "SkillTypeStats", 1, "Skill type-specific Stats", data.colorCodes.OFFENCE, { { label = "Duration Mod", flag = "duration", { format = "x {2:output:DurationMod}", { breakdown = "DurationMod"}, { modName = "Duration", cfg = "skill" }, }, }, @@ -280,7 +280,7 @@ return { { label = "Total Increased", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "INC" }, }, }, { label = "Total More", { format = "{0:mod:1}%", { modName = { "Evasion", "ArmourAndEvasion", "Defences" }, modType = "MORE" }, }, }, { label = "Total", { format = "{0:output:Evasion}", { breakdown = "Evasion" }, }, }, - { label = "Evade Chance", { format = "{0:output:EvadeChance}%", { breakdown = "EvadeChance" }, }, }, + { label = "Evade Chance", { format = "{0:output:EvadeChance}%", { breakdown = "EvadeChance" }, { label = "Enemy Accuracy modifiers", modName = "Accuracy", enemy = true }, }, }, } }, { 1, "Resist", 3, "Resists", data.colorCodes.DEFENCE, { extra = data.colorCodes.FIRE.."{0:output:FireResist}+{0:output:FireResistOverCap}^7/"..data.colorCodes.COLD.."{0:output:ColdResist}+{0:output:ColdResistOverCap}^7/"..data.colorCodes.LIGHTNING.."{0:output:LightningResist}+{0:output:LightningResistOverCap}", diff --git a/Modules/Calcs.lua b/Modules/Calcs.lua index 76d8a301..866e1918 100644 --- a/Modules/Calcs.lua +++ b/Modules/Calcs.lua @@ -571,13 +571,12 @@ local function initEnv(build, mode) for _, stat in pairs({"Str","Dex","Int"}) do modDB:NewMod(stat, "BASE", classStats["base_"..stat:lower()], "Base") end - local level = build.characterLevel - modDB.multipliers["Level"] = level - modDB:NewMod("Life", "BASE", 38 + level * 12, "Base") - modDB:NewMod("Mana", "BASE", 34 + level * 6, "Base") + modDB.multipliers["Level"] = m_max(1, m_min(100, build.characterLevel)) + modDB:NewMod("Life", "BASE", 12, "Base", { type = "Multiplier", var = "Level", base = 38 }) + modDB:NewMod("Mana", "BASE", 6, "Base", { type = "Multiplier", var = "Level", base = 34 }) modDB:NewMod("ManaRegen", "BASE", 0.0175, "Base", { type = "PerStat", stat = "Mana", div = 1 }) - modDB:NewMod("Evasion", "BASE", 53 + level * 3, "Base") - modDB:NewMod("Accuracy", "BASE", (level - 1) * 2, "Base") + modDB:NewMod("Evasion", "BASE", 3, "Base", { type = "Multiplier", var = "Level", base = 53 }) + modDB:NewMod("Accuracy", "BASE", 2, "Base", { type = "Multiplier", var = "Level", base = -2 }) modDB:NewMod("FireResistMax", "BASE", 75, "Base") modDB:NewMod("FireResist", "BASE", -60, "Base") modDB:NewMod("ColdResistMax", "BASE", 75, "Base") @@ -635,6 +634,9 @@ local function initEnv(build, mode) -- Initialise enemy modifier database local enemyDB = common.New("ModDB") env.enemyDB = enemyDB + env.enemyLevel = m_max(1, m_min(100, env.configInput.enemyLevel and env.configInput.enemyLevel or m_min(env.build.characterLevel, 84))) + enemyDB:NewMod("Accuracy", "BASE", data.monsterAccuracyTable[env.enemyLevel], "Base") + enemyDB:NewMod("Evasion", "BASE", data.monsterEvasionTable[env.enemyLevel], "Base") -- Add mods from the config tab modDB:AddList(build.configTab.modList) @@ -1389,13 +1391,12 @@ local function performCalcs(env) if modDB:Sum("FLAG", nil, "CannotEvade") then output.EvadeChance = 0 else - local attackerLevel = m_max(1, m_min(#data.monsterAccuracyTable, env.configInput.enemyLevel and env.configInput.enemyLevel or m_min(env.build.characterLevel, 84))) - local attackerAccuracy = data.monsterAccuracyTable[attackerLevel] - output.EvadeChance = 100 - calcHitChance(output.Evasion, attackerAccuracy) + local enemyAccuracy = round(calcVal(enemyDB, "Accuracy")) + output.EvadeChance = 100 - calcHitChance(output.Evasion, enemyAccuracy) if breakdown then breakdown.EvadeChance = { - "^7Enemy level: "..attackerLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"), - "^7Average enemy accuracy: "..attackerAccuracy, + "^7Enemy level: "..env.enemyLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"), + "^7Average enemy accuracy: "..enemyAccuracy, "^7Approximate evade chance: "..output.EvadeChance.."%", } end @@ -1695,16 +1696,12 @@ local function performCalcs(env) if not isAttack or modDB:Sum("FLAG", skillCfg, "CannotBeEvaded") or env.weaponData1.CannotBeEvaded then output.HitChance = 100 else - local targetLevel = m_max(1, m_min(#data.monsterEvasionTable, env.configInput.enemyLevel and env.configInput.enemyLevel or m_min(env.build.characterLevel, 84))) - local targetEvasion = data.monsterEvasionTable[targetLevel] - if env.mode_effective then - targetEvasion = targetEvasion * calcMod(enemyDB, "Evasion") - end - output.HitChance = calcHitChance(targetEvasion, output.Accuracy) + local enemyEvasion = round(calcVal(enemyDB, "Evasion")) + output.HitChance = calcHitChance(enemyEvasion, output.Accuracy) if breakdown then breakdown.HitChance = { - "^7Enemy level: "..targetLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"), - "^7Average enemy evasion: "..targetEvasion, + "^7Enemy level: "..env.enemyLevel..(env.configInput.enemyLevel and " ^8(overridden from the Configuration tab" or " ^8(can be overridden in the Configuration tab)"), + "^7Average enemy evasion: "..enemyEvasion, "^7Approximate hit chance: "..output.HitChance.."%", } end diff --git a/manifest.xml b/manifest.xml index 921e3152..5c43abaf 100644 --- a/manifest.xml +++ b/manifest.xml @@ -10,7 +10,7 @@ - + @@ -26,8 +26,8 @@ - - + + @@ -43,8 +43,8 @@ - - + + @@ -56,11 +56,11 @@ - + - - + +