From 09ac2682924dbb9d8547297a8671682b6942c174 Mon Sep 17 00:00:00 2001 From: Thomas Dannenberg Date: Wed, 5 Nov 2025 20:17:31 +0000 Subject: [PATCH] =?UTF-8?q?adventskalender/shared/js/lock.js=20hinzugef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adventskalender/shared/js/lock.js | 135 ++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 adventskalender/shared/js/lock.js diff --git a/adventskalender/shared/js/lock.js b/adventskalender/shared/js/lock.js new file mode 100644 index 0000000..bb3d379 --- /dev/null +++ b/adventskalender/shared/js/lock.js @@ -0,0 +1,135 @@ +// ============================================================ +// Bratonien Adventskalender – Türchen-Sperrlogik & Dev-Overlay +// ============================================================ +// 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"); + + // Lokale Speicherkeys + const KEY_SIM_DAY = `bratonien_${YEAR}_sim_day`; + const KEY_UNLOCKED = `bratonien_${YEAR}_dev_unlock`; + + // === Aktuellen Tag bestimmen === + function getCurrentDay() { + if (DEV_MODE) { + const simDay = parseInt(localStorage.getItem(KEY_SIM_DAY), 10) || 1; + return simDay; + } + + const now = new Date(); + const month = now.getMonth() + 1; // Dez = 12 + const day = now.getDate(); + + // Nur im Dezember relevant + if (month !== 12) return 0; + if (day >= 25) return 25; // Nach dem 24.12. alles offen + return day; + } + + // === Türchen-Freigabe prüfen === + window.isDoorUnlocked = function (day) { + const current = getCurrentDay(); + const unlocked = localStorage.getItem(KEY_UNLOCKED) === "true"; + + if (unlocked) return true; + if (current >= 25) return true; // Nach 24. alles frei + return parseInt(day, 10) <= current; + }; + + // === 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."); + location.reload(); + }; + + actions.appendChild(unlockBtn); + actions.appendChild(resetBtn); + overlay.appendChild(actions); + + document.body.appendChild(overlay); + } + + console.log(`[Lock.js] Initialisiert – aktueller Tag: ${getCurrentDay()} (Dev=${DEV_MODE})`); +})(); \ No newline at end of file