From 2dc369e77eb3b747855c1494a3919d6badd306a5 Mon Sep 17 00:00:00 2001 From: Stan Runge Date: Sun, 1 Mar 2026 19:52:57 +0100 Subject: [PATCH] allow near matched mappools --- src/lib/server/match/engine.ts | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/lib/server/match/engine.ts b/src/lib/server/match/engine.ts index af50c52..2fdd9e3 100644 --- a/src/lib/server/match/engine.ts +++ b/src/lib/server/match/engine.ts @@ -182,23 +182,21 @@ async function selectMappoolForRating(avgElo: number) { const targetStars = 3 + ((avgElo - 800) / 400) * 4; const clampedTarget = Math.max(2, Math.min(8, targetStars)); - let bestPool = pools[0]; - let bestDiff = Infinity; + // Score each pool by distance from target + const scored = pools + .filter((p) => p.slots.length > 0) + .map((p) => { + const avgStars = p.slots.reduce((sum, s) => sum + (s.starRating ?? 0), 0) / p.slots.length; + return { pool: p, diff: Math.abs(avgStars - clampedTarget) }; + }) + .sort((a, b) => a.diff - b.diff); - for (const pool of pools) { - if (pool.slots.length === 0) continue; + if (scored.length === 0) return null; - const avgStars = - pool.slots.reduce((sum, s) => sum + (s.starRating ?? 0), 0) / pool.slots.length; - const diff = Math.abs(avgStars - clampedTarget); - - if (diff < bestDiff) { - bestDiff = diff; - bestPool = pool; - } - } - - return bestPool; + // Allow any pool within 1 star of the closest match, then pick randomly + const threshold = scored[0].diff + 1.0; + const candidates = scored.filter((s) => s.diff <= threshold); + return candidates[Math.floor(Math.random() * candidates.length)].pool; } // ── Create Match ────────────────────────────────────────────────────────