Files
microw8/v0.1.1/index.html
2025-03-02 19:46:42 +00:00

1 line
11 KiB
HTML

<!doctype html><html><head><meta charset="utf8"><title>MicroW8</title><link href="https://fonts.googleapis.com/css2?family=Josefin+Sans:wght@500&display=swap" rel="stylesheet"><style>body,canvas,html{margin:0;padding:0}html{background-color:#202024;color:#808070;font-family:Josefin Sans,Verdana,Arial Black,sans-serif}body,html{height:100%}body{display:grid;grid-template-rows:1fr 0fr}#uw8{position:absolute}#uw8 a{font-size:130%}#centered{align-self:center;justify-self:center}a{color:#303630}a:hover{color:#405040}#screen{background-color:#202428;border:4px solid #303040;box-shadow:5px 5px 20px #000;cursor:none;height:240px;image-rendering:pixelated;margin-bottom:8px;width:320px}#timer:before{background-color:red;border-radius:6px;content:"";display:inline-block;height:12px;margin-right:3px;width:12px}#message{margin-bottom:8px}.error{color:#e04030}button{background-color:#303440;border:1px solid #404040;border-radius:4px;color:#808070;font-family:inherit;padding:4px}button:hover{background-color:#202010}button:active{background-color:#504450}@media (min-width:680px) and (min-height:620px){#screen{height:480px;width:640px}}@media (min-width:1000px) and (min-height:800px){#screen{height:720px;width:960px}}@media (width:640px) and (height:480px){#screen{border:0;height:480px;margin:0;width:640px}body{overflow:hidden}}</style></head><body> <div id="uw8"> <a href="https://exoticorn.github.io/microw8">MicroW8</a> 0.1.1 </div> <div id="centered"> <canvas id="screen" width="320" height="240"> </canvas> <div id="timer" hidden></div> <div id="message"></div> <button id="cartButton" style="visibility:hidden">Load cart...</button> </div> <div id="footer"> <a href="http://unlicense.org/" ref="license">Unlicense</a> </div> </body><script type="module">function e(e){return e&&e.__esModule?e.default:e}function A(e,A){let t=e?`${e} bytes`:"Insert cart";A&&(t+=` - <span class="error">${A.replaceAll("<","&lt;")}</span>`),document.getElementById("message").innerHTML=t}let t,a,n,r,B,o=document.getElementById("screen"),i=o.getContext("2d"),s=i.createImageData(320,240),l=e=>new Uint8Array(e),c=e=>new Uint32Array(e),F=0,Q=e=>{let A,t="keydown"==e.type;switch(e.code){case"ArrowUp":A=1;break;case"ArrowDown":A=2;break;case"ArrowLeft":A=4;break;case"ArrowRight":A=8;break;case"KeyZ":A=16;break;case"KeyX":A=32;break;case"KeyA":A=64;break;case"KeyS":A=128;break;case"KeyR":t&&f(n,!0);break;case"F9":t&&o.toBlob((e=>{E(e,".png")})),e.preventDefault();break;case"F10":t&&function(){if(r)return r.stop(),void(r=null);r=new MediaRecorder(o.captureStream(),{mimeType:"video/webm",videoBitsPerSecond:25e6});let e=[];r.ondataavailable=A=>{e.push(A.data)};let A=document.getElementById("timer");function t(){if(!B)return;let e=Math.floor((Date.now()-B)/1e3);A.innerText=Math.floor(e/60).toString().padStart(2,"0")+":"+(e%60).toString().padStart(2,"0"),setTimeout(t,1e3)}A.hidden=!1,A.innerText="00:00",r.onstop=()=>{A.hidden=!0,E(new Blob(e,{type:"video/webm"}),".webm")},r.start(),B=Date.now(),setTimeout(t,1e3)}(),e.preventDefault()}t?F|=A:F&=~A};async function f(r,B){a&&(a(),a=null);let Q=r.byteLength;if(A(Q),0==Q)return;n=r;let E=window.location.pathname;if(Q<=1024&&!B){let e="";for(let A of l(r))e+=String.fromCharCode(A);E+="#"+btoa(e),E!=window.location.pathname+window.location.hash&&history.pushState(null,null,E)}o.width=o.width;try{let B={initial:4};t||(B.maximum=4);let o,E=new WebAssembly.Memory({initial:4,maximum:t?16:4}),g=l(E.buffer),w={env:{memory:E}},I=e=>{if(o&&(!t||0!=l(e)[0])){g.set(l(e));let A=o.exports.load_uw8(e.byteLength);e=new ArrayBuffer(A),l(e).set(g.slice(0,A))}return e},d=async e=>(await WebAssembly.instantiate(e,w)).instance,h=async e=>d(I(await(await fetch(e)).arrayBuffer()));o=await h(e("data:application/wasm;base64,AGFzbQEAAAABFQRgAX8Bf2ACf38Bf2ADf39%2FAGAAAAIPAQNlbnYGbWVtb3J5AgAEAwkIAAABAgEAAAMGEAN%2FAUEAC38BQQALfwFBAAsHGQIIbG9hZF91dzgAAAp1bmNvbXByZXNzAAQIAQcKngUIxwEBB39BAC0AAEEBayIBQQBIBEAgAA8LQYDAByAAaiECIAFBAXEEQEEBQYHABxAEIQIFQYDAB0EAIAAQAwtBAEGAhA9BCBADQYiEDyEDQQghBEGBwAchBQNAIAUgAkggAyMATiAFLQAAIAMtAABMcnEEQCAEIAQgBRACIgZqIQQgAyMASCAFLQAAIAMtAABGcQRAIAMgAxABaiEDCyAFIAZqIQUMAQsgAyMASARAIAQgBCADEAIiB2ohBCADIAdqIQMMAQsLIAQLPAEEfyAAIQEDQCACIAFBAWoiAS0AACIEQf8AcSADdHIhAiADQQdqIQMgBEEHdQ0ACyABQQFqIABrIAJqCxIBAX8gACABIAEQASICEAMgAgskAANAIAJBAEoEQCAAIAJBAWsiAmogASACai0AADoAAAwBCwsLqQEBBn8gACQBQQAkAgNAIANBgAE6AICADyADQQFqIgNBgQNIDQALAkADQEEAEAYiBQRAIAQEf0EBBUGAAhAGCwRAQYECEAVBAWsiAkUNAwtBwQIQBSEGA0AgASABIAJrLQAAOgAAIAFBAWohASAGQQFrIgYNAAsFQQEhBwNAIAdBAXQgBxAGciIHQYACSA0ACyABIAc6AAAgAUEBaiEBCyAFIQQMAAsLIAELNAECfwNAIAAgAmoQBgRAIAEgACACakEgahAGIAJ0ciEBIAJBAWohAgwBCwsgAUEBIAJ0cgtxAQR%2FA0AjAkGAIEgEQCMCQQh0IwEtAAByJAIjAUEBaiQBDAELCyMCQf8BcSICIAAtAICADyIBIwJBCHUiA2xBgAIgAWsgA2wgAWsgAiABSCIEG2okAiAAIAFBByAEQYECbGogAWtBBHVqOgCAgA8gBAsMAEEAQYCEDxAEJAALC9IDAQBBAAvLA6eP%2Fw9olPgPXPcNZ6GH4sK0YVAeGZhY8FzSxDxK%2Fvv32QOMdeZ4QLHNI9NAW9hr%2B1lpXqgkXw%2FZJ2xueSKrTWbsgq9bIaIhjByG5VC2EE%2Bp0mUsRwQzi7oRDC02b4ywHappXJZHhDLuZKhnjylLE4X%2F9%2FZ66bwxYl1h%2BNAL%2BQh0zt3iSqNerI7l0QMOySt%2FPOFO3hXwdaMgxln646dVGVLPhHQbMoREgNzLIYMv4gBUU6Cr%2BR0QYi3tDAXJ4SoSxKCyLsv7cfb5Cl%2BYC5Jus5xElZgiDlIIHBqFDldTRQ5nBJl5es0ZDmEl3WiHmM1UA8QeePxqNrYic7ifdP3EBFW5S6xR2jJ3ck%2BXX1DdwcNjNkIkxbPKNFOeqWZ%2FJ72Bz14fhYzfrX%2FfCvJQ2mBNrPbSIjF%2B6V1RUKuyzvSVyFXaomCpe3Y3V7yP5iFDf7QCB30gL0F9spf8BoPYv9hjE6Q3ZkqKBvEmZicrDv16JtFEfFeGz74RiGn3in3LRJfDC6flml3%2F7XqPZEDOkp7EYlesgbP3QvOHwrGA75RCRmGCkYt5vQiaDM%2F6Ya1SMp%2B0hSKoL1CaVam1YNyC2eUiph32Ag6cicueJ5xp%2Bg%3D%3D"));for(let e of["acos","asin","atan","atan2","cos","exp","log","sin","tan","pow"])w.env[e]=Math[e];for(let e=9;e<64;++e)w.env["reserved"+e]=()=>{};for(let e=0;e<16;++e)w.env["g_reserved"+e]=0;r=I(r);let y=await h(e("data:;base64,AnevpqDvapimRNPOGhqee07n%2Bv1yTm1n5XES6y7%2BqPUQFqw5livsDo%2Fkram7E1zzZg6qmLzXsUswfnD9AZjEuJOrUjm2TzbQ%2BWO1hv6bvL0OA5NLPFH8ZGmL%2BQuU9%2BzJKrrbrtlCG5CF9XtS0qCkoIio9oeYfmSVxOA0y%2FJSfYQk40bvdrHXrFnxJFiottxFT%2FLepVgrZE1lBV2uUHz%2Fm8jczeF0kKEUpYn4qQfne4XupG2DSs0kLa3WXNHBwG0ViOo4f1B4B4X%2F1rf9O1yJZwLAqxFM1w2EeBreIqf9raWm6MMcuP8Q%2Bs5SmF1qu1YfCCyRNpKXp%2F3s3pdHfSBqlRkEL4jCiZWjXvWtvWJtnL6gyrjr4ZA2KREn7GNxZzPYPI6FOSKGyvRH2UrubtDjfOlsq42cAfBhf3WA8FxMBdfo1gr7naubzcVCFebQCSoCrdMrFnB4nKdoZ7FRc4rUeNTfhuqN82XawKi3Sii2EsRJxPNvd8MwX%2BcgKnSrLcg00iVly%2Fc9Kv%2BVzmQgXqpzHKxT5OqydhJdO3Xg%2FWkYDSoLk2KM5iTxh2BsvdgqQYSsbbSjcrMgR2CSm3m1h2T7tulpQznvIN%2BOz7wP6uvYF7iIWFWQoNjf3RtRA%2F4WQmfvG5r0KHuTofQKbt2ULV7%2Fv8V1j1Ki5Y8KEcPDyglKFVMcPSG%2Bv%2FkK0syRPFWYo7moohpMPgUGQQeYGebuzfVEZrdE54zGwZvRChYaJieWHBxY1%2B0mkjdisfDIkrbL9bRlZOb1JzZBlGELw%2FdErHCkreGFlqCuI9B1arfxZ3xbTvQkIfRB9S4SMVngcSICb831hbLFybYEmJSkKkF3eDyUQt8jXt9TA31jVj7fkQYuuqPZClwIdqWozCii%2Byi93c9CjE8VH3PWYojeyOpJg1jFzc8LOe2n6YqFpEbXYqEwxyKfbz67oQraXiALTjc0D7Sj5FkOrBkOsyTkFFEMWGJwOyF75mppy5OemTzQrNLcj%2BPShAsnxhSI94YP2IBL9eNnXXeYVaTHnyXhvEArxNC4gf9b2w2H%2FJUKTtBX9EpF7wbq86SeKkp4BPsucHEo6yQaVYuy%2BUPUAwRinloIwYF%2FLKcGE73%2F5YNX4GSWqwd%2BQInaUkrhqTa7m9rINoQWlr3cs65k6VSewKFOq6Yz3Mnvj3D5VdIFvy3FDfn3s%2BJyCHnMftBjSkhCsHkI69GOkeMv5U0RNk8C7%2FpmV4A4hk12L9je2oXO80Aqa9e3zjFADhOXCfS1cNAXvcX%2FFXL50DLFR3TvqAjsd%2B4eZ%2BtrmQ05Av28uNP5EcUliesq3dvbwKcHIORx%2FXAd8kHh%2F%2By4z6tW9dwtFOycrr%2FbCUDWUy1WCdLB2bnn12uk5Oi0IOnn%2BqvIgrqtN7%2F0%2FhED5uMpbUkQ5LLE9NyzfCkF4brecSUTMKTTFAmc1nx%2F7H0E7e8onY6sPwrQc%2FX3rDpx7XjT5aXCyX7PcyoP43uMcOga%2FZviGh7XYU1Dspqtj8xElGvd6%2FPI14WXG6YiPehnrg3%2FU8rRBv1GBLdTYbcPDkziK6ZRispg6JpwEK6cislh5wEBEEk56l1%2FOLuNd3t6LV%2B0c13jayBzFfa0joMWpwrAr9k8bt7HW4XTTnJg3OUmEezJjNPs%2BT8BhHUz01XS5cig1WdDUuUhWc4ZB7Ffs50%2FFazmQexAJViTMJBfi1Rp%2FiIPRoduK%2BSt0hkqCtKbIGPxrx6an8HwUdO%2FYHBQXk9CT%2BQXHzbXS21aUCoM6I0%2F9%2Bi%2ByhfWFkz0WAfkaE9QXukTfiFzihLPTFL7BBIXPw4ab10wuJX%2Fi3I7cDbFHjeMdD8kKiATOkUJitBPx0VquVubGcUJfXslfTVTkvp%2F97Ezdkyndpm9D5tjq%2F8jKl0DCsCvjgeoW9I7O9Iqao7sUx3HKFrq8vEWTCsg4qsBRJfgpZMkhCWUdxnJZlun00wl%2BjAzjPsasMn9Kw%2Bjln1duhBDNjC%2BCeN8j5fE%2B%2BzUYva2A0orE4Cd7wkOK5UJt2sPPeo6C7dduehmQ1sTXCbahyEykkoqm6I%2BNzMMona28q7sLrnk7XTH6Btl49YoGMCNIUmvdy2JJZTWXQcjWJTAzB9QCeuf%2FVDlyIgGDGsRaoAWBeTPZb11iQyMxIbDxBHGo7NB%2FcGxShKxzvO3lIAyWyUqgC3RM4ZUcK%2F7Fowmh31TLA9Odv77fL1ljkUbpkUPxtpCrc5CsUSbR46aOjxd5CQ9k1sjKnj1qAoVqA3J9K89q0RkPE87cueQiNAncDMASv9woVsV3uTz6s0qo2Dr8iLn2CIWe8vt66YPHgWOsJM2NgusqGnlzO3cM%2BT8Z7X%2Fy4%2FGVP6fr7er%2BRAKrugR7PJ6QvUBWOjXTaHgdZkT0%2BbvR0AIZ64m%2BrrgBaio3hYGWg8lUcEc%2FN2qf5DDqgQ03vTlzuMcQV5r5MO0f8D%2BFJEuhP8WYoqQwAmiff%2BDbuGyKP1VAiwxEZkTtN9LJpfQ63tNCnE6yHqLtInVrlSH1Ei5M9htJUJ00yWDTEp0nb6ZEg%2BRqE29BiTF2seIgKFIbIstsu8K6WEM5vWAyoZ7dTHEKka508SOKy3fsTcg%2FfPxlDUwGLe59An5GBxOUyIcYwthtDkA28QBvpFZ5%2BSSGNUuo4k01X%2FSrQP0TQXnS7rUSd7crL6mFSdJrnArBXG%2Fts5ZlDOIq04Mfl0CZVewRkcLuyS44XcAZY94TCQ2dZeBJIYwt2cjy6QFljkQBP7kjirsgo0pR%2Bx%2FVW5%2BVvuR7IOfPRxbF4puMQUapbjh36JQgJHyDf6ZR4PcXwgY2%2BKsStxTOtdXJPrEmGlFUNWpQohkHDbtk0GtRJCLPqBsgui9AGmGYJfXk6LEx5337BYI9vMdM4U8XzQ7pwNa0%2BgErrO2SdDTrv%2B2lZxOM3OyHqq1ruAB0ARMjPEqt8fsE1oqPk%2FDDF4wghDrNUlQIAP9YOXsv%2BHrAWSlxakt9LrL5%2BsMVoN%2FQyh7c85MGYXK5PnCJhgGs0Jfy7yKpdNuX%2BO65VszAvhl22ID0UXCA1FWNHvLId6chZX1blmXpTOgtBUy99lbUS41K39a78NYED8HmWBSGkZNPKthJdzBw2pJEa5u1EP8xNOwxpE5f4lpjfxkcrgrh3LxYdurdfDTx76Y8s3zjzmohBd0JE25jxCe%2FoKDm5emvsQERvzu8YqhscSJKbNMq%2Fa1b10%2Fmq4qZwx7dGuSCIj7CPJ6GinhEE6r1QF4ss3%2BgsNlCYmDAQW%2FOZpNnFAlVIDrKi89JRYZThfouw7WqBMufS1SZ8zlOuFr97dw6LVbvegFc7vDyPL7q3f5hdUp4w7crB1qIma7kpbyKIlUU4wKB%2B1ZLtts0S8fD4zYvVwwtK%2BMZHkwYZUOptdlqHvlFdWBcl%2Fal8ZJXyt5v187hfgaQGFVrdLYOAnXynXsx4WC8MkkGOIcAsf5%2FUUzhGIDXXtI0JSrDhkE1uqMLOLQK6YRtA4aQJazIGSlpEgIJwb9XxHoqMigPYgUYJQ%2F30KEUceT8BQOKjOWR4o8QgCvwcogh5qnALJZSibKp5n%2Fqpn1CaOnXrtP3hrueDICnjj7nNzCkdeH662dvcVCwowydP8yXL1ao0nwMA%3D%3D"));for(let e in y.exports)w.env[e]=y.exports[e];let u=await d(r),C=c(s.data.buffer),b=Date.now(),k=!0;a=()=>k=!1;const D=1e3/60;let m=b;!function e(){if(k)try{let A=Date.now(),t=!1;if(A>=m){let e=navigator.getGamepads(),a=0;for(let A=0;A<4;++A){let n=e[A];if(n){for(let e=0;e<8;++e){let t=(e+12)%16;n.buttons.length>t&&n.buttons[t].pressed&&(a|=1<<8*A+e)}if(n.axes.length>1)for(let e=0;e<4;++e){let t=n.axes[1-(e>>1)];(1&e?t:-t)>.5&&(a|=1<<8*A+e)}n.buttons.length>9&&n.buttons[9].pressed&&(t=!0)}}let n=c(E.buffer);n[16]=A-b,n[17]=F|a,u.exports.upd(),y.exports.endFrame();let r=c(E.buffer.slice(77824,78848));for(let e=0;e<76800;++e)C[e]=4278190080|r[g[e+120]];i.putImageData(s,0,0),m=Math.max(m+D,A)}t?f(n):window.requestAnimationFrame(e)}catch(e){A(Q,e.toString())}}()}catch(e){A(Q,e.toString())}}function E(e,A){let t=document.createElement("a");t.href=URL.createObjectURL(e),t.download="microw8_"+(new Date).toISOString()+A,t.click(),URL.revokeObjectURL(t.href)}async function g(e,A){let a=await fetch(e),n=a.headers.get("Content-Type");if(n&&n.includes("html"))throw!1;f(await a.arrayBuffer(),A||t)}function w(){let e=window.location.hash.slice(1);"devkit"!=e?(t=!1,e.length>0?e.startsWith("url=")?g(e.slice(4),!0):g("data:;base64,"+e):f(new ArrayBuffer(0))):t=!0}window.onkeydown=Q,window.onkeyup=Q,window.onhashchange=w;let I=()=>{let e=document.getElementById("cartButton");e.style="",e.onclick=()=>{let e=document.createElement("input");e.type="file",e.accept=".wasm,.uw8,application/wasm",e.onchange=()=>{e.files.length>0&&g(URL.createObjectURL(e.files[0]))},e.click()},o.ondragover=e=>{e.preventDefault()},o.ondrop=e=>{let A=e.dataTransfer&&e.dataTransfer.files;A&&1==A.length&&(e.preventDefault(),g(URL.createObjectURL(e.dataTransfer.files[0])))},w()},d=window.location;0!=d.hash.length?I():(async()=>{let e=d.href;e.endsWith(".html")?e=e.slice(0,e.length-4)+"uw8":(e.endsWith("/")||(e+="/"),e+="cart.uw8");try{await g(e,!0)}catch(e){I()}})();</script></html>