diff --git a/css/planner.css b/css/planner.css index dd7f516..9477db9 100644 --- a/css/planner.css +++ b/css/planner.css @@ -279,6 +279,11 @@ font-size: 13px; color: var(--t2); } +.mechanic-avg-hp { + font-size: 12px; + color: var(--t3); + margin-left: 6px; +} .mechanic-assignments { display: flex; diff --git a/js/planner.js b/js/planner.js index d3a11a4..cb1d817 100644 --- a/js/planner.js +++ b/js/planner.js @@ -355,6 +355,17 @@ function renderPlanDetail(plan) { renderInfoPanel(plan); } +function avgNonTankMaxHp(plan) { + const roster = plan.playerRoster ?? []; + const jobComp = plan.jobComposition ?? []; + const hps = jobComp + .map((job, i) => ({ job, maxHp: roster[i]?.maxHp ?? 0 })) + .filter(p => p.job && JOB_ROLE[p.job] !== 'tank' && p.maxHp > 0) + .map(p => p.maxHp); + if (!hps.length) return 0; + return Math.round(hps.reduce((s, v) => s + v, 0) / hps.length); +} + function renderMechanicListHtml(plan) { if (plan.mechanics.length === 0) { return ` @@ -369,6 +380,7 @@ function renderMechanicListHtml(plan) { } const activeJobSet = new Set(plan.jobComposition.filter(j => j)); + const avgHp = avgNonTankMaxHp(plan); return plan.mechanics.map(m => { const sorted = sortedAssignments(m.assignments); @@ -408,7 +420,7 @@ function renderMechanicListHtml(plan) { ${m.phase ? `