Wimmel-Suchspiel: finde 3 versteckte Fuesse in einer randvollen Szene. - Node/Express-Server generiert Szenen prozedural aus einer gemeinsamen Library (library/props = Deko, library/feet = Fuesse); Spezial-Level (emoji) unter scenes/ - Serverseitige Trefferpruefung (nicht per DOM austrickbar) - Frontend rendert die Szene als ein Bild -> fluessiges Zoom/Pan (panzoom) - Dark Mode, kein Start-Screen, Installationsskript + Deploy-Doku (Proxmox LXC) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
30 lines
900 B
JavaScript
30 lines
900 B
JavaScript
// Haelt die Trefferzonen jeder generierten Szene serverseitig, damit Klicks
|
|
// geprueft werden koennen, ohne die Zielpositionen je ans Frontend zu schicken.
|
|
// Einfache Groessen- und Zeitbegrenzung verhindert ein Speicher-Leck bei vielen
|
|
// Aufrufen.
|
|
|
|
const MAX_ENTRIES = 500;
|
|
const TTL_MS = 1000 * 60 * 30; // 30 Minuten
|
|
|
|
const scenes = new Map(); // sceneId -> { targets, createdAt }
|
|
|
|
function evictIfNeeded() {
|
|
const now = Date.now();
|
|
for (const [id, entry] of scenes) {
|
|
if (now - entry.createdAt > TTL_MS) scenes.delete(id);
|
|
}
|
|
while (scenes.size > MAX_ENTRIES) {
|
|
const oldest = scenes.keys().next().value; // Map behaelt Einfuege-Reihenfolge
|
|
scenes.delete(oldest);
|
|
}
|
|
}
|
|
|
|
export function saveScene(sceneId, targets) {
|
|
scenes.set(sceneId, { targets, createdAt: Date.now() });
|
|
evictIfNeeded();
|
|
}
|
|
|
|
export function getScene(sceneId) {
|
|
return scenes.get(sceneId) || null;
|
|
}
|