From 135e19b798bf8cacc0c9d791df39fd3c2348555d Mon Sep 17 00:00:00 2001 From: Jan Bader Date: Mon, 22 Jun 2026 01:29:53 +0200 Subject: [PATCH] Balance mixed damage lifesteal optimizer --- app.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app.js b/app.js index 514d8b5..d99fc77 100644 --- a/app.js +++ b/app.js @@ -698,20 +698,20 @@ function calculateOptimizationMetric(candidateTotals, combatStyle, optimizationT const dps = calculateDps(candidateTotals, combatStyle); 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"; + if (optimizationTarget === OPTIMIZATION_TARGETS.DAMAGE_LIFESTEAL_MIX) return "Optimal DPS with 2:1 mix"; return optimizationTarget === OPTIMIZATION_TARGETS.LIFESTEAL_REGEN ? "Optimal lifesteal regen" : "Optimal DPS"; } function findOptimalDamageSetup(totals, effectCount, combatStyle, optimizationTarget) { const effectIds = getDamageOptimizationEffectIds(combatStyle, optimizationTarget); const emptyTotals = { ...totals, effects: createEmptyEffectTotals() }; + const requiredLifestealCount = optimizationTarget === OPTIMIZATION_TARGETS.DAMAGE_LIFESTEAL_MIX ? Math.round(effectCount / 3) : null; let best = { - metric: calculateOptimizationMetric(emptyTotals, combatStyle, optimizationTarget), + metric: requiredLifestealCount ? -Infinity : calculateOptimizationMetric(emptyTotals, combatStyle, optimizationTarget), counts: Object.fromEntries(effectIds.map((id) => [id, 0])), }; const counts = Object.fromEntries(effectIds.map((id) => [id, 0])); @@ -720,6 +720,10 @@ function findOptimalDamageSetup(totals, effectCount, combatStyle, optimizationTa const effectId = effectIds[effectIndex]; if (effectIndex === effectIds.length - 1) { counts[effectId] = remaining; + if (requiredLifestealCount !== null && counts.lifesteal !== requiredLifestealCount) { + counts[effectId] = 0; + return; + } const effects = createEmptyEffectTotals(); for (const id of effectIds) effects[id] = counts[id] * effectById(id).cap; const candidateTotals = { baseDamage: totals.baseDamage, baseHealth: totals.baseHealth, effects };