From 509e78223d9cc1d79155948d0ba037c70ab12d28 Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Mon, 22 Jun 2026 01:27:01 +0200 Subject: [PATCH] Add mixed damage lifesteal optimization target --- app.js | 16 ++++++++-------- index.html | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app.js b/app.js index b3d95d2..514d8b5 100644 --- a/app.js +++ b/app.js @@ -22,7 +22,7 @@ const PROFILE_IDS = Object.freeze({ LIFESTEAL: "lifesteal", REGEN: "regen" }); const COMBAT_STYLES = Object.freeze({ MELEE: "melee", RANGED: "ranged", SKILL: "skill" }); const PIECE_TYPES = Object.freeze({ ITEM: "item", MOUNT: "mount", PET: "pet", SKILL: "skill" }); const REPLACEMENT_TARGETS = Object.freeze({ MOUNT: "mount", PET: "pet" }); -const OPTIMIZATION_TARGETS = Object.freeze({ DAMAGE: "damage", LIFESTEAL_REGEN: "lifestealRegen" }); +const OPTIMIZATION_TARGETS = Object.freeze({ DAMAGE: "damage", LIFESTEAL_REGEN: "lifestealRegen", DAMAGE_LIFESTEAL_MIX: "damageLifestealMix" }); const PROFILES = { [PROFILE_IDS.LIFESTEAL]: { @@ -667,7 +667,7 @@ function renderEffectTotals(totals, currentDps, currentSurvivability) { function getDamageOptimizationEffectIds(combatStyle, optimizationTarget = OPTIMIZATION_TARGETS.DAMAGE) { const ids = ["critChance", "critDamage", "doubleChance", "damage", "attackSpeed"]; - if (optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN) ids.push("lifesteal"); + if ([OPTIMIZATION_TARGETS.LIFESTEAL_REGEN, OPTIMIZATION_TARGETS.DAMAGE_LIFESTEAL_MIX].includes(optimizationTarget)) ids.push("lifesteal"); if (combatStyle === COMBAT_STYLES.RANGED) ids.push("rangedDamage"); else if (combatStyle === COMBAT_STYLES.SKILL) ids.push("skillDamage", "skillCooldown"); else ids.push("meleeDamage"); @@ -696,12 +696,14 @@ function createEmptyEffectTotals() { function calculateOptimizationMetric(candidateTotals, combatStyle, optimizationTarget) { const dps = calculateDps(candidateTotals, combatStyle); - return optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN - ? calculateRegenDetails(candidateTotals, dps).lifesteal - : dps; + const lifestealRegen = calculateRegenDetails(candidateTotals, dps).lifesteal; + if (optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN) return lifestealRegen; + if (optimizationTarget === OPTIMIZATION_TARGETS.DAMAGE_LIFESTEAL_MIX) return (2 * dps) + lifestealRegen; + return dps; } function getOptimizationMetricLabel(optimizationTarget) { + if (optimizationTarget === OPTIMIZATION_TARGETS.DAMAGE_LIFESTEAL_MIX) return "Optimal weighted score"; return optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN ? "Optimal lifesteal regen" : "Optimal DPS"; } @@ -758,9 +760,7 @@ function renderEffectComparisonRows(optimumCounts, currentSummary) { function renderOptimalDamageSetup(totals, currentDps) { const effectCount = countActiveEffects(); const optimum = findOptimalDamageSetup(totals, effectCount, state.combatStyle, state.optimizationTarget); - const currentMetric = state.optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN - ? calculateRegenDetails(totals, currentDps).lifesteal - : currentDps; + const currentMetric = calculateOptimizationMetric(totals, state.combatStyle, state.optimizationTarget); const delta = percentChange(currentMetric, optimum.metric); const currentEffectSummary = summarizeCurrentEffects(); diff --git a/index.html b/index.html index 1e28468..0c31308 100644 --- a/index.html +++ b/index.html @@ -101,6 +101,7 @@