Map-Pools: Overpass, Vertigo und Cache für Competitive, Map-Auswahl im Admin, Veto-Ablauf passend zur Map-Anzahl
This commit is contained in:
1 parent
e3834bb071
commit
2d65634d6e
13 files changed
+459
-45
No files matched your search
+40
-16
@@ -1,5 +1,5 @@
|
||||
import fs from 'node:fs';
|
||||
import { BEST_OF, validateFlow } from './veto.js';
|
||||
import { BEST_OF, generateFlow, validateFlow } from './veto.js';
|
||||
|
||||
/**
|
||||
* Lädt die Map-Pools und markiert jede Kombination aus Modus und Format als unterstützt oder nicht.
|
||||
@@ -22,32 +22,56 @@ export function buildMapPools(raw) {
|
||||
}
|
||||
ids.add(map.id);
|
||||
}
|
||||
const formats = {};
|
||||
for (const format of Object.keys(BEST_OF)) {
|
||||
const flow = pool.flows?.[format];
|
||||
if (!flow) {
|
||||
formats[format] = { supported: false, reason: 'Kein Veto-Ablauf für dieses Format hinterlegt' };
|
||||
continue;
|
||||
}
|
||||
const errors = validateFlow(flow, pool.maps.length, format);
|
||||
formats[format] = errors.length
|
||||
? { supported: false, reason: errors.join('; ') }
|
||||
: { supported: true, flow };
|
||||
if (errors.length) console.warn(`[map-pools] ${mode}/${format} deaktiviert: ${errors.join('; ')}`);
|
||||
}
|
||||
// "active": false = Map ist im Katalog, wird aber erst nach Auswahl im Admin-Bereich gespielt
|
||||
const active = pool.maps.filter((m) => m.active !== false).map((m) => m.id);
|
||||
pools[mode] = {
|
||||
mode,
|
||||
label: pool.label ?? mode,
|
||||
teamSize: pool.teamSize,
|
||||
gameType: pool.gameType,
|
||||
gameMode: pool.gameMode,
|
||||
maps: pool.maps,
|
||||
formats,
|
||||
allMaps: pool.maps.map(({ active: _ignored, ...m }) => m),
|
||||
flows: pool.flows ?? {},
|
||||
maps: [],
|
||||
formats: {},
|
||||
};
|
||||
setActiveMaps(pools[mode], active, { warn: true });
|
||||
}
|
||||
return pools;
|
||||
}
|
||||
|
||||
/**
|
||||
* Veto-Abläufe für die aktiven Maps: Ein in der Konfiguration hinterlegter Ablauf gilt, wenn er zur Map-Anzahl passt,
|
||||
* sonst erzeugt die Anwendung einen passenden Ablauf.
|
||||
*/
|
||||
export function formatsFor(pool, mapCount, { warn = false } = {}) {
|
||||
const formats = {};
|
||||
for (const format of Object.keys(BEST_OF)) {
|
||||
const configured = pool.flows?.[format];
|
||||
if (configured && validateFlow(configured, mapCount, format).length === 0) {
|
||||
formats[format] = { supported: true, flow: configured, generated: false };
|
||||
continue;
|
||||
}
|
||||
const flow = generateFlow(mapCount, format);
|
||||
if (!flow) {
|
||||
formats[format] = { supported: false, reason: `${format.toUpperCase()} braucht mindestens ${Math.max(BEST_OF[format], 2)} Maps` };
|
||||
continue;
|
||||
}
|
||||
const errors = validateFlow(flow, mapCount, format);
|
||||
formats[format] = errors.length ? { supported: false, reason: errors.join('; ') } : { supported: true, flow, generated: true };
|
||||
if (errors.length && warn) console.warn(`[map-pools] ${pool.mode}/${format} deaktiviert: ${errors.join('; ')}`);
|
||||
}
|
||||
return formats;
|
||||
}
|
||||
|
||||
/** Aktive Maps eines Pools setzen (Reihenfolge wie im Katalog) und die Formate neu berechnen. */
|
||||
export function setActiveMaps(pool, ids, options) {
|
||||
const wanted = new Set(ids);
|
||||
pool.maps = pool.allMaps.filter((m) => wanted.has(m.id));
|
||||
pool.formats = formatsFor(pool, pool.maps.length, options);
|
||||
return pool;
|
||||
}
|
||||
|
||||
export function publicPools(pools) {
|
||||
return Object.values(pools).map((p) => ({
|
||||
mode: p.mode,
|
||||
|
||||
Reference in new issue
Block a user