🎮 Tetris
Source on GitHub
⇧ Rotate
⏸ Start / Pause
⇩ Soft Drop
Downloading...
loads) means the // fix survives `make web` rebuilds. (function () { var origDecode = TextDecoder.prototype.decode; TextDecoder.prototype.decode = function (input, options) { if (input && input.buffer && input.buffer.resizable) { var copy = new Uint8Array(input.byteLength); for (var i = 0; i < input.byteLength; i++) copy[i] = input[i]; return origDecode.call(this, copy, options); } return origDecode.call(this, input, options); }; })(); window.onerror = function () { Module.setStatus('Exception thrown, see JavaScript console'); spinnerElement.style.display = 'none'; Module.setStatus = function (text) { if (text) Module.printErr('[post-exception status] ' + text); }; }; var create_and_fire_event = function (event, type) { var control_event = new Event(type, { bubbles: true }); control_event.code = event.target.dataset.key; control_event.key = event.target.dataset.key; control_event.keyCode = event.target.dataset.which; control_event.which = event.target.dataset.which; Module.canvas.dispatchEvent(control_event); }; Module.postRun.push(function () { Array.from(document.querySelectorAll('.controls')).forEach( function (control) { if ('ontouchstart' in window || navigator.maxTouchPoints > 0) { control.addEventListener('touchstart', function (event) { event.preventDefault(); // Prevent emulated mouse events create_and_fire_event(event, 'keydown'); }); control.addEventListener('touchend', function (event) { event.preventDefault(); // Prevent emulated mouse events create_and_fire_event(event, 'keyup'); }); } else { control.addEventListener('click', function (event) { create_and_fire_event(event, 'keydown'); window.setTimeout(function () { create_and_fire_event(event, 'keyup'); }, 100); }); } } ); });