// The screensaver itself is a modified showcase; // it uses the same state to avoid repeats, // though it runs a lot slower and zooms in. // And of course, the UI is hidden! function screensaverNext() { showcaseMiku = nextShowcaseMiku; // I wrote a whole damn Newton-raphson equation solver to fit // setSize's lerping shenanigans to this so it'd be *poifect*. // It wasn't, reader. It was not poifect. // These magic constants will do well enough! ;-; let z = -6.5 - 1.75 * Math.log2(showcaseMiku.properties.clearance / IMGSIZE) console.log(showcaseMiku.properties.clearance, z) map.flyTo({ 'center': nextShowcaseMiku.geometry.coordinates, 'zoom': z, 'speed': 0.6, }); displayMiku(showcaseMiku, true); showcase_i += 1; nextShowcaseMiku = MIKUS.features[ showcase_i % MIKUS.features.length]; } // We hide the UI elements, block the showcase // and set a timer: let screensaverActive = false; let screensaverTimerID; function startScreensaver() { const FLIGHT_TIME_S = 5; const LINGER_TIME_S = 15; console.log("Starting screensaver") showcaseBlockers.add("screensaver"); document.body.classList.add('screensaver'); let startTime = 5; window.setTimeout(screensaverNext, startTime * 1000) let loopTime = FLIGHT_TIME_S + LINGER_TIME_S; screensaverTimerID = window.setInterval(screensaverNext, (loopTime + startTime) * 1000); screensaverActive = true; } function stopScreensaver() { if (!screensaverActive) return; screensaverActive = false; console.log("Stopping screensaver") window.clearInterval(screensaverTimerID); showcaseBlockers.delete("screensaver"); document.body.classList.remove('screensaver'); // TODO: return to original location! } // After a minute of no activity*, the screensaver kicks in. // When activity occurs again, the screen returns to its original location. // *activity is defined as one of: const TIMEOUT_MS = 60_000; let activityCheckTimerID; function activity(event) { // ignore maplibre-induced events if (event && !event.originalEvent) return; window.clearTimeout(activityCheckTimerID); activityCheckTimerID = window.setTimeout(startScreensaver, TIMEOUT_MS); stopScreensaver(); } activity(); map.on('zoomstart', activity) map.on('zoomend', activity) map.on('movestart', activity) map.on('moveend', activity) document.getElementById('map').addEventListener('keydown', activity)