From 189379594ffedbb78076fa82409239a5e555abfb Mon Sep 17 00:00:00 2001 From: Thomas Dannenberg Date: Wed, 5 Nov 2025 20:24:50 +0000 Subject: [PATCH] adventskalender/shared/js/lock.js aktualisiert --- adventskalender/shared/js/lock.js | 214 +++++++++++++----------------- 1 file changed, 94 insertions(+), 120 deletions(-) diff --git a/adventskalender/shared/js/lock.js b/adventskalender/shared/js/lock.js index bb3d379..72aa76b 100644 --- a/adventskalender/shared/js/lock.js +++ b/adventskalender/shared/js/lock.js @@ -1,135 +1,109 @@ // ============================================================ -// Bratonien Adventskalender – Türchen-Sperrlogik & Dev-Overlay +// Bratonien Adventskalender – Türsperren / Dev-Konsole // ============================================================ -// Autor: Thomas Dannenberg & GPT-5 -// Pfad: shared/js/lock.js -// Zweck: Sperrt Türchen nach aktuellem Tag, mit Dev-Modus (?dev) -(() => { - const pathMatch = window.location.pathname.match(/\/(\d{4})\//); - const YEAR = pathMatch ? pathMatch[1] : new Date().getFullYear(); - const PARAMS = new URLSearchParams(window.location.search); - const DEV_MODE = PARAMS.has("dev"); +// Jahr automatisch aus Ordnernamen ableiten +const YEAR = window.location.pathname.match(/(\d{4})/)?.[1] || "0000"; +const STORAGE_KEY = `bratonien_lock_${YEAR}`; +let devMode = window.location.search.includes("?dev"); - // Lokale Speicherkeys - const KEY_SIM_DAY = `bratonien_${YEAR}_sim_day`; - const KEY_UNLOCKED = `bratonien_${YEAR}_dev_unlock`; +// =============================== +// Sperrlogik +// =============================== +function isDoorUnlocked(day) { + // Dev-Modus immer alles offen + if (devMode) return true; - // === Aktuellen Tag bestimmen === - function getCurrentDay() { - if (DEV_MODE) { - const simDay = parseInt(localStorage.getItem(KEY_SIM_DAY), 10) || 1; - return simDay; - } + // Nach 24.12. immer alles offen + const now = new Date(); + if (now.getFullYear() > YEAR || (now.getFullYear() == YEAR && now.getMonth() > 11 && now.getDate() > 24)) + return true; - const now = new Date(); - const month = now.getMonth() + 1; // Dez = 12 - const day = now.getDate(); + // Falls der Benutzer alles entsperrt hat + if (localStorage.getItem(`${STORAGE_KEY}_unlocked`) === "true") + return true; - // Nur im Dezember relevant - if (month !== 12) return 0; - if (day >= 25) return 25; // Nach dem 24.12. alles offen - return day; - } + // Normale Regel: Türchen <= aktueller Tag freigegeben + const today = now.getDate(); + return parseInt(day) <= today; +} - // === Türchen-Freigabe prüfen === - window.isDoorUnlocked = function (day) { - const current = getCurrentDay(); - const unlocked = localStorage.getItem(KEY_UNLOCKED) === "true"; +// =============================== +// Dev-Konsole (nur bei ?dev) +// =============================== +function createDevConsole() { + // Prüfen, ob Reset-Button existiert (von save-progress.js) + let resetBtn = document.getElementById("dev-reset"); + let devBox = document.createElement("div"); + devBox.className = "dev-console"; + devBox.style.cssText = ` + display:flex; flex-wrap:wrap; gap:6px; + margin:10px 0 0 0; padding:8px; + background:#111; border:1px solid #c8aa49; + border-radius:8px; color:#c8aa49; font-family:monospace; + justify-content:flex-start; + `; - if (unlocked) return true; - if (current >= 25) return true; // Nach 24. alles frei - return parseInt(day, 10) <= current; + // Sperrbutton + const lockBtn = document.createElement("button"); + lockBtn.textContent = "🔒 Alle sperren"; + lockBtn.onclick = () => { + localStorage.removeItem(`${STORAGE_KEY}_unlocked`); + localStorage.removeItem(`bratonien_opened_${YEAR}`); + console.log("Alle Türchen gesperrt."); + location.reload(); }; + devBox.appendChild(lockBtn); - // === Dev-Overlay aufbauen === - if (DEV_MODE) { - const overlay = document.createElement("div"); - overlay.id = "dev-overlay"; - overlay.style.cssText = ` - position: fixed; - bottom: 10px; - right: 10px; - background: rgba(0,0,0,0.7); - color: #fff; - font-family: monospace; - font-size: 13px; - padding: 10px; - border-radius: 8px; - z-index: 9999; - display: flex; - flex-direction: column; - gap: 6px; - align-items: center; - `; - - // Infozeile - const info = document.createElement("div"); - info.textContent = `DEV-MODUS: Simuliertag ${getCurrentDay()}`; - overlay.appendChild(info); - - // Buttonleiste - const grid = document.createElement("div"); - grid.style.cssText = ` - display: grid; - grid-template-columns: repeat(8, 1fr); - gap: 4px; - `; - - for (let i = 1; i <= 24; i++) { - const btn = document.createElement("button"); - btn.textContent = i; - btn.style.cssText = ` - padding: 3px 6px; - background: #444; - color: #fff; - border: 1px solid #777; - border-radius: 4px; - cursor: pointer; - `; - btn.onclick = () => { - localStorage.setItem(KEY_SIM_DAY, i); - info.textContent = `DEV-MODUS: Simuliertag ${i}`; - }; - grid.appendChild(btn); - } - overlay.appendChild(grid); - - // Unlock & Reset - const actions = document.createElement("div"); - actions.style.cssText = "display:flex;gap:6px;margin-top:6px;"; - - const unlockBtn = document.createElement("button"); - unlockBtn.textContent = "🔓 Sperre aufheben"; - unlockBtn.style.cssText = ` - background:#2c6e49;color:white;border:none; - padding:5px 10px;border-radius:4px;cursor:pointer; - `; - unlockBtn.onclick = () => { - localStorage.setItem(KEY_UNLOCKED, "true"); - alert("Alle Türchen entsperrt."); - }; - - const resetBtn = document.createElement("button"); - resetBtn.textContent = "⟳ Reset"; - resetBtn.style.cssText = ` - background:#8b0000;color:white;border:none; - padding:5px 10px;border-radius:4px;cursor:pointer; - `; - resetBtn.onclick = () => { - localStorage.removeItem(KEY_SIM_DAY); - localStorage.removeItem(KEY_UNLOCKED); - localStorage.removeItem(`bratonien_${YEAR}_progress`); - alert("Entwicklungseinstellungen & Fortschritt zurückgesetzt."); + // Tag-Buttons 1–24 + for (let i = 1; i <= 24; i++) { + const b = document.createElement("button"); + b.textContent = i; + b.style.minWidth = "32px"; + b.onclick = () => { + localStorage.setItem(`${STORAGE_KEY}_simulateDay`, i); + console.log(`Simuliere Tag ${i}`); location.reload(); }; - - actions.appendChild(unlockBtn); - actions.appendChild(resetBtn); - overlay.appendChild(actions); - - document.body.appendChild(overlay); + devBox.appendChild(b); } - console.log(`[Lock.js] Initialisiert – aktueller Tag: ${getCurrentDay()} (Dev=${DEV_MODE})`); -})(); \ No newline at end of file + // Sperre aufheben + const unlockBtn = document.createElement("button"); + unlockBtn.textContent = "🚪 Sperre aufheben"; + unlockBtn.onclick = () => { + localStorage.setItem(`${STORAGE_KEY}_unlocked`, "true"); + console.log("Alle Türchen entsperrt."); + location.reload(); + }; + devBox.appendChild(unlockBtn); + + // Einfügen unterhalb des Reset-Buttons (falls vorhanden) + if (resetBtn) { + resetBtn.insertAdjacentElement("afterend", devBox); + } else { + document.body.appendChild(devBox); + } +} + +// =============================== +// Simulationsfunktion (nur Dev) +// =============================== +function getSimulatedDay() { + if (!devMode) return null; + const simDay = parseInt(localStorage.getItem(`${STORAGE_KEY}_simulateDay`)); + return simDay || null; +} + +// =============================== +// Export (global für andere Skripte) +// =============================== +window.isDoorUnlocked = function (day) { + // Simulation berücksichtigen + const simDay = getSimulatedDay(); + if (devMode && simDay) return parseInt(day) <= simDay; + return isDoorUnlocked(day); +}; + +// Dev-Konsole aktivieren +if (devMode) createDevConsole(); \ No newline at end of file