Menu Toko/Karakter/Koleksi memuat script dan CSS sendiri bila cache lama

This commit is contained in:
rizkyaz0 2026-10-01 21:04:43 +07:00
parent db86e3c96f
commit ea6b803c2f
4 changed files with 13 additions and 4 deletions

View File

@ -1,6 +1,6 @@
{
"files": 216,
"bytes": 30918536,
"bytes": 30919213,
"list": [
{
"file": "index.html",
@ -28,7 +28,7 @@
},
{
"file": "menu.js",
"bytes": 22183
"bytes": 22860
},
{
"file": "match.js",

View File

@ -94,6 +94,13 @@
}
function back(){if(lockIn)return;game.stopAnnouncer();sfx('back',true);if(screen==='arena'){screen='select';step=1;hover=enemy;}else if(screen==='select'&&step===1){step=0;hover=player;}else screen='home';render();}
function start(){window.Meta?.cancelRun?.();if(game.startMatch({player,enemy,stage,level,mode})){if(p2){game.setP2(true);window.Meta?.event('twoplayer');window.Meta?.toast('P2: ← → jalan, ↑ lompat, N serang, M / , / . = skill 1 / 2 / ultimate');}document.querySelector('#arena').focus();}else {const error=root.querySelector('#setup-error');if(error)error.textContent='Aset belum siap. Tunggu sebentar lalu coba lagi.';sfx('locked',true);}}
// Opens the shop/locker/collection. If meta.js is missing (stale cached index.html) it is loaded on demand.
function openMeta(tab){
const go=()=>{try{window.Meta.open(tab);}catch(e){console.error(e);alert('Menu gagal dibuka: '+e.message);}};
if(window.Meta){go();return;}
if(!document.querySelector('link[href^="meta.css"]')){const l=document.createElement('link');l.rel='stylesheet';l.href='meta.css?'+Date.now();document.head.append(l);}
const sc=document.createElement('script');sc.src='meta.js?'+Date.now();sc.onload=go;sc.onerror=()=>alert('meta.js tidak ditemukan. Muat ulang dengan Cmd+Shift+R atau jalankan python3 serve.py.');document.head.append(sc);
}
function command(cmd){
if(lockIn)return;
if(cmd==='fullscreen'){sfx('move',true);dismissFullscreenHint();game.toggleFullscreen?.();return;}
@ -101,7 +108,7 @@
if(cmd==='versus'||cmd==='training'){mode=cmd;p2=false;runKind=null;screen='select';step=0;hover=player;render();}
if(cmd==='arcade'||cmd==='survival'){mode='versus';p2=false;runKind=cmd;screen='select';step=0;hover=player;render();}
if(cmd==='2p'){mode='versus';p2=true;runKind=null;screen='select';step=0;hover=player;render();}
if(cmd==='shop'||cmd==='locker'||cmd==='book')window.Meta?.open(cmd);if(cmd==='settings')game.openSettings();if(cmd==='about'){screen='about';render();}
if(cmd==='shop'||cmd==='locker'||cmd==='book')openMeta(cmd);if(cmd==='settings')game.openSettings();if(cmd==='about'){screen='about';render();}
if(cmd==='home'){game.stopAnnouncer();screen='home';render();}if(cmd==='start')start();
if(cmd==='rematch'){({player,enemy,stage,level,mode}=result);start();}
if(cmd==='reselect'){screen='select';step=0;hover=player;render();}

View File

@ -64,6 +64,8 @@
let save = blank();
try { const raw = JSON.parse(localStorage.getItem(KEY) || 'null'); if (raw && raw.v === 1) save = { ...blank(), ...raw, owned: { ...blank().owned, ...raw.owned }, stats: { ...blank().stats, ...raw.stats } }; } catch (_) {}
const persist = () => { try { localStorage.setItem(KEY, JSON.stringify(save)); } catch (_) {} };
// The styles are attached here too, so the overlay is never unstyled (and hidden under the menu) when index.html is stale.
if (!document.querySelector('link[href^="meta.css"]')) { const l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'meta.css?' + Date.now(); document.head.append(l); }
const $ = s => document.querySelector(s);
const esc = t => String(t).replace(/[&<>"]/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]));

File diff suppressed because one or more lines are too long