Add mixed damage lifesteal optimization target

This commit is contained in:
Jan Bader
2026-06-22 01:27:01 +02:00
parent 4b1b3a7379
commit 509e78223d
2 changed files with 9 additions and 8 deletions
+8 -8
View File
@@ -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();
+1
View File
@@ -101,6 +101,7 @@
<select id="optimizationTarget">
<option value="damage">Raw damage</option>
<option value="lifestealRegen">Lifesteal regen</option>
<option value="damageLifestealMix">2x damage + 1x lifesteal</option>
</select>
</label>
</div>