From a41f9ebe4db8d44c855ecef6957607c5513ce9ec Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 19 Dec 2021 00:12:26 +0100 Subject: [PATCH] add support for load from url --- site/static/v0.1pre4/index.html | 2 +- web/src/main.js | 116 +++++++++++++++++--------------- 2 files changed, 61 insertions(+), 57 deletions(-) diff --git a/site/static/v0.1pre4/index.html b/site/static/v0.1pre4/index.html index 2fda0e6..6e704bd 100644 --- a/site/static/v0.1pre4/index.html +++ b/site/static/v0.1pre4/index.html @@ -1 +1 @@ -MicroW8
\ No newline at end of file +MicroW8
\ No newline at end of file diff --git a/web/src/main.js b/web/src/main.js index 270bc6c..d6d5d1f 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -24,40 +24,39 @@ let pad = 0; let keyHandler = (e) => { let isKeyDown = e.type == 'keydown'; let mask; - switch(e.code) { - case 'ArrowUp': - mask = 1; - break; - case 'ArrowDown': - mask = 2; - break; - case 'ArrowLeft': - mask = 4; - break; - case 'ArrowRight': - mask = 8; - break; - case 'KeyZ': - mask = 16; - break; - case 'KeyX': - mask = 32; - break; - case 'KeyA': - mask = 64; - break; - case 'KeyS': - mask = 128; - break; - case 'KeyR': - if(isKeyDown) - { - runModule(currentData); - } - break; + switch (e.code) { + case 'ArrowUp': + mask = 1; + break; + case 'ArrowDown': + mask = 2; + break; + case 'ArrowLeft': + mask = 4; + break; + case 'ArrowRight': + mask = 8; + break; + case 'KeyZ': + mask = 16; + break; + case 'KeyX': + mask = 32; + break; + case 'KeyA': + mask = 64; + break; + case 'KeyS': + mask = 128; + break; + case 'KeyR': + if (isKeyDown) { + runModule(currentData); + } + break; } - if(isKeyDown) { + if (isKeyDown) { pad |= mask; } else { pad &= ~mask; @@ -66,7 +65,7 @@ let keyHandler = (e) => { window.onkeydown = keyHandler; window.onkeyup = keyHandler; -async function runModule(data) { +async function runModule(data, keepUrl) { if (cancelFunction) { cancelFunction(); cancelFunction = null; @@ -82,15 +81,16 @@ async function runModule(data) { currentData = data; let newURL = window.location.pathname; - if (cartridgeSize <= 1024) { + if (cartridgeSize <= 1024 && !keepUrl) { let dataString = ''; for (let byte of U8(data)) { dataString += String.fromCharCode(byte); } newURL += '#' + btoa(dataString); - } - if (newURL != window.location.pathname + window.location.hash) { - history.pushState(null, null, newURL); + + if (newURL != window.location.pathname + window.location.hash) { + history.pushState(null, null, newURL); + } } screen.width = screen.width; @@ -139,7 +139,7 @@ async function runModule(data) { let platform_instance = await loadModuleURL(platformUrl); - for(let name in platform_instance.exports) { + for (let name in platform_instance.exports) { importObject.env[name] = platform_instance.exports[name] } @@ -163,29 +163,29 @@ async function runModule(data) { try { let now = Date.now(); let restart = false; - if(now >= nextFrame) { + if (now >= nextFrame) { let gamepads = navigator.getGamepads(); let gamepad = 0; - for(let i = 0; i < 4; ++i) { + for (let i = 0; i < 4; ++i) { let pad = gamepads[i]; - if(!pad) { + if (!pad) { continue; } - for(let j = 0; j < 8; ++j) { - let buttonIdx = (j+12) % 16; - if(pad.buttons.length > buttonIdx && pad.buttons[buttonIdx].pressed) { + for (let j = 0; j < 8; ++j) { + let buttonIdx = (j + 12) % 16; + if (pad.buttons.length > buttonIdx && pad.buttons[buttonIdx].pressed) { gamepad |= 1 << (i * 8 + j); } } - if(pad.axes.length > 1) { - for(let j = 0; j < 4; ++j) { - let v = pad.axes[1-(j>>1)]; - if(((j & 1) ? v : -v) > 0.5) { + if (pad.axes.length > 1) { + for (let j = 0; j < 4; ++j) { + let v = pad.axes[1 - (j >> 1)]; + if (((j & 1) ? v : -v) > 0.5) { gamepad |= 1 << (i * 8 + j); } } } - if(pad.buttons.length > 9 && pad.buttons[9].pressed) { + if (pad.buttons.length > 9 && pad.buttons[9].pressed) { restart = true; } } @@ -203,8 +203,8 @@ async function runModule(data) { canvasCtx.putImageData(imageData, 0, 0); nextFrame = Math.max(nextFrame + timePerFrame, now); } - - if(restart) { + + if (restart) { runModule(currentData); } else { window.requestAnimationFrame(mainloop); @@ -220,14 +220,18 @@ async function runModule(data) { } } -async function runModuleFromURL(url) { - runModule(await (await fetch(url)).arrayBuffer()); +async function runModuleFromURL(url, keepUrl) { + runModule(await (await fetch(url)).arrayBuffer(), keepUrl); } function runModuleFromHash() { - let base64Data = window.location.hash.slice(1); - if (base64Data.length > 0) { - runModuleFromURL('data:;base64,' + base64Data); + let hash = window.location.hash.slice(1); + if (hash.length > 0) { + if (hash.startsWith("url=")) { + runModuleFromURL(hash.slice(4), true); + } else { + runModuleFromURL('data:;base64,' + hash); + } } else { runModule(new ArrayBuffer(0)); }