Banner
Version 1.0.11
Background
Intro Background

COLD MEMORIES

const PWADownloader_DISABLED = { failedUrls: [], downloadApproved: false, // Cria modal de confirmação createConfirmDialog() { if (document.getElementById("pwa-confirm-dialog")) return; const dialog = document.createElement("div"); dialog.id = "pwa-confirm-dialog"; dialog.innerHTML = `
📱 Download Game Files?
This will download ~50MB of game files to play offline without an internet connection. You can cancel anytime.
`; document.body.appendChild(dialog); document.getElementById("pwa-accept-btn").onclick = () => { dialog.remove(); this.downloadApproved = true; this.createStatusOverlay(); navigator.serviceWorker.controller?.postMessage({ type: "START_CACHE", }); }; document.getElementById("pwa-decline-btn").onclick = () => { dialog.remove(); }; }, // Cria o overlay de status createStatusOverlay() { if (document.getElementById("pwa-status-overlay")) return; const overlay = document.createElement("div"); overlay.id = "pwa-status-overlay"; overlay.innerHTML = `
Setting up offline game...
Downloading files to play without internet
`; document.body.appendChild(overlay); document.getElementById("pwa-close-btn").onclick = () => overlay.remove(); document.getElementById("pwa-retry-btn").onclick = () => this.retryDownload(); }, // Atualiza status updateStatus(title, message, type = "loading") { const overlay = document.getElementById("pwa-status-overlay"); if (!overlay) return; const spinner = document.getElementById("pwa-spinner"); const titleText = document.getElementById("pwa-title-text"); const messageEl = document.getElementById("pwa-status-message"); const buttons = document.getElementById("pwa-buttons"); overlay.className = ""; if (type === "success") { overlay.classList.add("success"); spinner.style.display = "none"; titleText.textContent = "✅ " + title; buttons.style.display = "none"; // Auto-fecha após 5 segundos setTimeout(() => overlay.remove(), 5000); } else if (type === "error") { overlay.classList.add("error"); spinner.style.display = "none"; titleText.textContent = "❌ " + title; buttons.style.display = "block"; } else { spinner.style.display = "inline-block"; titleText.textContent = title; buttons.style.display = "none"; } messageEl.textContent = message; }, // Retry download retryDownload() { if (this.failedUrls.length === 0) return; this.updateStatus( "Recovering files...", `Trying to download ${this.failedUrls.length} file(s)`, "loading" ); navigator.serviceWorker.controller?.postMessage({ type: "RETRY_FAILED", urls: this.failedUrls, }); }, // Verifica integridade do cache verifyCache() { navigator.serviceWorker.controller?.postMessage({ type: "VERIFY_CACHE", }); }, }; if ("serviceWorker" in navigator) { window.addEventListener("load", () => { navigator.serviceWorker .register("/service-worker.js") .then((registration) => { console.log( "Service Worker registered successfully:", registration.scope ); // Shows confirmation dialog if installing if (registration.installing) { PWADownloader.createConfirmDialog(); } }) .catch((error) => { console.log("Failed to register Service Worker:", error); }); // Escuta mensagens do Service Worker navigator.serviceWorker.addEventListener("message", (event) => { const data = event.data; switch (data.type) { case "CACHE_COMPLETE": PWADownloader.createStatusOverlay(); PWADownloader.updateStatus( "Download complete!", `${data.cached}/${data.total} files ready to play offline`, "success" ); break; case "CACHE_FAILED": PWADownloader.failedUrls = data.failedUrls; PWADownloader.createStatusOverlay(); PWADownloader.updateStatus( "Some files failed", `${data.cached}/${data.total} downloaded. ${data.failedUrls.length} failed. Click to retry.`, "error" ); break; case "CACHE_ERROR": PWADownloader.createStatusOverlay(); PWADownloader.updateStatus( "Download error", `Error: ${data.error}. Check your connection and try again.`, "error" ); break; case "RETRY_SUCCESS": PWADownloader.failedUrls = []; PWADownloader.updateStatus( "Recovery complete!", "All files have been downloaded successfully!", "success" ); break; case "RETRY_PARTIAL": PWADownloader.failedUrls = data.failedUrls; PWADownloader.updateStatus( "Partial recovery", `${data.recovered} recovered, ${data.failedUrls.length} still failing.`, "error" ); break; case "VERIFY_RESULT": if (data.complete) { console.log("✅ Cache intact! All files present."); } else { console.warn( `⚠️ Cache incomplete! Missing ${data.missingUrls.length} files.` ); PWADownloader.failedUrls = data.missingUrls; } break; case "CACHE_INCOMPLETE_ON_ACTIVATE": console.warn( `⚠️ Incomplete cache detected (${data.missingCount}/${data.totalExpected}). Attempting to recover...` ); PWADownloader.createStatusOverlay(); PWADownloader.updateStatus( "Checking cache...", `${data.totalExpected - data.missingCount}/${ data.totalExpected } files ready. Looking for missing ones...`, "loading" ); break; case "AUTO_RECOVERY_COMPLETE": if (data.failed === 0) { PWADownloader.updateStatus( "✅ Everything recovered!", `${data.recovered} files have been downloaded successfully!`, "success" ); } else { PWADownloader.failedUrls = []; // Limpa lista PWADownloader.createStatusOverlay(); PWADownloader.updateStatus( "Partial recovery", `${data.recovered} recovered, ${data.failed} still failing. Click to retry.`, "error" ); } break; } }); }); }