MINEFLAPPY-GAME/sw.js
Dave bc72c5dc30 Fullscreen PWA: no border, installs as an app, works offline
- canvas fills the entire screen on any device; the 480x640 world is
  scaled to fit and bottom-aligned so the ground always sits on the
  bottom edge, with the sky painted full-bleed behind it
- the canvas buffer now always matches its laid-out size, so the drawing
  can never drift out of step with the screen
- HUD (score, badge, buffs, toasts, biome banner) moved to screen space
  so it stays pinned to the real screen edges
- sun and stars drawn in screen space so the sky above the play area is
  not empty
- PWA: manifest, service worker (offline), generated app icons and an
  in-game INSTALL APP button
- overlays now dim the whole screen, not just the game strip
2026-10-23 19:52:18 +02:00

47 lines
1.2 KiB
JavaScript

/* Mineflappy offline cache.
Cache-first for the app shell, with a background refresh so a new
deploy is picked up on the next visit. */
const CACHE = 'mineflappy-v1';
const ASSETS = [
'./',
'./index.html',
'./manifest.webmanifest',
'./icon-192.png',
'./icon-512.png',
'./apple-touch-icon.png',
'./favicon-32.png'
];
self.addEventListener('install', e => {
e.waitUntil(
caches.open(CACHE)
.then(c => c.addAll(ASSETS))
.then(() => self.skipWaiting())
);
});
self.addEventListener('activate', e => {
e.waitUntil(
caches.keys()
.then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))
.then(() => self.clients.claim())
);
});
self.addEventListener('fetch', e => {
const req = e.request;
if (req.method !== 'GET' || new URL(req.url).origin !== location.origin) return;
e.respondWith(
caches.match(req).then(hit => {
const network = fetch(req).then(res => {
if (res && res.status === 200 && res.type === 'basic') {
const copy = res.clone();
caches.open(CACHE).then(c => c.put(req, copy));
}
return res;
}).catch(() => hit || caches.match('./index.html'));
return hit || network;
})
);
});