diff --git a/package-lock.json b/package-lock.json index f000871..5cbe14f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "diabloweb", - "version": "1.0.25", + "version": "1.0.27", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1386,6 +1386,11 @@ "@types/istanbul-lib-report": "*" } }, + "@types/node": { + "version": "10.14.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.15.tgz", + "integrity": "sha512-CBR5avlLcu0YCILJiDIXeU2pTw7UK/NIxfC63m7d7CVamho1qDEzXKkOtEauQRPMy6MI8mLozth+JJkas7HY6g==" + }, "@types/q": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", @@ -1396,6 +1401,11 @@ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==" }, + "@types/webrtc": { + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@types/webrtc/-/webrtc-0.0.25.tgz", + "integrity": "sha512-ep/e+p2uUKV1h96GBgRhwomrBch/bPDHPOKbCHODLGRUDuuKe2s7sErlFVKw+5BYUzvpxSmUNqoadaZ44MePoQ==" + }, "@types/yargs": { "version": "12.0.12", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", @@ -2183,6 +2193,28 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "requires": { + "babel-runtime": "^6.22.0", + "core-js": "^2.4.0", + "regenerator-runtime": "^0.10.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, "babel-preset-jest": { "version": "24.6.0", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", @@ -3978,6 +4010,14 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -7333,6 +7373,11 @@ "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, + "js-binarypack": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/js-binarypack/-/js-binarypack-0.0.9.tgz", + "integrity": "sha1-RUJD094hKWHMFRSi8Rnewvr2QDU=" + }, "js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -8226,6 +8271,15 @@ "lower-case": "^1.1.1" } }, + "node-fetch": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -8653,6 +8707,110 @@ "mimic-fn": "^1.0.0" } }, + "opencollective": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "inquirer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "requires": { + "ansi-escapes": "^1.1.0", + "chalk": "^1.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.1", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx": "^4.1.0", + "string-width": "^2.0.0", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -8937,6 +9095,21 @@ "sha.js": "^2.4.8" } }, + "peerjs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/peerjs/-/peerjs-1.0.2.tgz", + "integrity": "sha512-lVXh+R7KnrVt3WBhP+QNO8dhdezmhEF+wwJdVfxlayRG7jgi7D3vx+9UoW2wv5OlVzuAVL+NGJeYGQR9VrMhbQ==", + "requires": { + "@types/node": "^10.14.12", + "@types/webrtc": "^0.0.25", + "eventemitter3": "^3.1.2", + "js-binarypack": "0.0.9", + "opencollective": "^1.0.3", + "opencollective-postinstall": "^2.0.0", + "reliable": "git+https://github.com/michelle/reliable.git", + "webrtc-adapter": "^7.2.6" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -10439,6 +10612,13 @@ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" }, + "reliable": { + "version": "git+https://github.com/michelle/reliable.git#70604f577ae55a2eb015c17d73cc8d9dce5f9ec4", + "from": "git+https://github.com/michelle/reliable.git", + "requires": { + "js-binarypack": "0.0.9" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -10663,6 +10843,14 @@ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, + "rtcpeerconnection-shim": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rtcpeerconnection-shim/-/rtcpeerconnection-shim-1.2.15.tgz", + "integrity": "sha512-C6DxhXt7bssQ1nHb154lqeL0SXz5Dx4RczXZu2Aa/L1NJFnEVDxFwCBo3fqtuljhHIGceg5JKBV4XJ0gW5JKyw==", + "requires": { + "sdp": "^2.6.0" + } + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", @@ -10679,6 +10867,11 @@ "aproba": "^1.1.1" } }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", @@ -11061,6 +11254,11 @@ } } }, + "sdp": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-2.10.0.tgz", + "integrity": "sha512-H+VjfyQpRz9GezhshJmkXTtCAT9/2g9az3GFDPYfGOz0eAOQU1fCrL3S9Dq/eUT9FtOyLi/czdR9PzK3fKUYOQ==" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -12697,6 +12895,15 @@ } } }, + "webrtc-adapter": { + "version": "7.2.9", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-7.2.9.tgz", + "integrity": "sha512-98rcdbSqUBR+L+erotCFWgiPyYjCEq6NJYN/1Bl6cRl2CxSU3wanJlc4YdfWzaTGaK13ZVmHay2mlW4aOWXh0A==", + "requires": { + "rtcpeerconnection-shim": "^1.2.15", + "sdp": "^2.9.0" + } + }, "websocket-driver": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", diff --git a/package.json b/package.json index d0ed071..c03d583 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "diabloweb", - "version": "1.0.25", + "version": "1.0.27", "private": true, "dependencies": { "@babel/core": "7.4.3", @@ -39,6 +39,7 @@ "jest-watch-typeahead": "0.3.0", "mini-css-extract-plugin": "0.5.0", "optimize-css-assets-webpack-plugin": "5.0.1", + "peerjs": "^1.0.2", "pnp-webpack-plugin": "1.2.1", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", diff --git a/src/App.js b/src/App.js index 44ee026..14d225d 100644 --- a/src/App.js +++ b/src/App.js @@ -7,6 +7,10 @@ import create_fs from './fs'; import load_game from './api/loader'; import { SpawnSizes } from './api/load_spawn'; +import Peer from 'peerjs'; + +window.Peer = Peer; + if (process.env.NODE_ENV === 'production') { ReactGA.initialize('UA-43123589-6'); ReactGA.pageview('/'); diff --git a/src/api/Diablo.jscc b/src/api/Diablo.jscc index 54b40aa..d7302b4 100644 --- a/src/api/Diablo.jscc +++ b/src/api/Diablo.jscc @@ -5,20 +5,17 @@ var Diablo = (function() { function(Diablo) { Diablo = Diablo || {}; -var Module=typeof Diablo!=="undefined"?Diablo:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||134217728;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="Diablo.wast";var wasmBinaryFile="Diablo.wasm";var asmjsCodeFile="Diablo.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_free_exception(ptr){try{return _free(ptr)}catch(e){}}function ___cxa_end_catch(){Module["setThrew"](0);var ptr=EXCEPTIONS.caught.pop();if(ptr){EXCEPTIONS.decRef(EXCEPTIONS.deAdjust(ptr));EXCEPTIONS.last=0}}function ___cxa_find_matching_catch_2(){return ___cxa_find_matching_catch.apply(null,arguments)}function ___cxa_find_matching_catch_3(){return ___cxa_find_matching_catch.apply(null,arguments)}function ___cxa_get_exception_ptr(ptr){return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr}function ___lock(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=1112;Module["wasmMaxTableSize"]=1112;function invoke_i(index){var sp=stackSave();try{return Module["dynCall_i"](index)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return Module["dynCall_ji"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){var sp=stackSave();try{Module["dynCall_v"](index)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{Module["dynCall_viiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viji(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viji"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_i":invoke_i,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_ji":invoke_ji,"invoke_v":invoke_v,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiiii":invoke_viiiiiii,"invoke_viji":invoke_viji,"___assert_fail":___assert_fail,"___cxa_allocate_exception":___cxa_allocate_exception,"___cxa_begin_catch":___cxa_begin_catch,"___cxa_end_catch":___cxa_end_catch,"___cxa_find_matching_catch_2":___cxa_find_matching_catch_2,"___cxa_find_matching_catch_3":___cxa_find_matching_catch_3,"___cxa_free_exception":___cxa_free_exception,"___cxa_get_exception_ptr":___cxa_get_exception_ptr,"___cxa_pure_virtual":___cxa_pure_virtual,"___cxa_throw":___cxa_throw,"___lock":___lock,"___resumeException":___resumeException,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"___unlock":___unlock,"_abort":_abort,"_api_close_keyboard":_api_close_keyboard,"_api_create_sound":_api_create_sound,"_api_create_sound_float":_api_create_sound_float,"_api_delete_sound":_api_delete_sound,"_api_draw_begin":_api_draw_begin,"_api_draw_belt":_api_draw_belt,"_api_draw_blit":_api_draw_blit,"_api_draw_clip_text":_api_draw_clip_text,"_api_draw_end":_api_draw_end,"_api_draw_text":_api_draw_text,"_api_duplicate_sound":_api_duplicate_sound,"_api_exit_game":_api_exit_game,"_api_open_keyboard":_api_open_keyboard,"_api_play_sound":_api_play_sound,"_api_set_cursor":_api_set_cursor,"_api_set_volume":_api_set_volume,"_api_stop_sound":_api_stop_sound,"_api_websocket_closed":_api_websocket_closed,"_api_websocket_send":_api_websocket_send,"_emscripten_asm_const_ii":_emscripten_asm_const_ii,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_exit":_exit,"_exit_error":_exit_error,"_get_file_contents":_get_file_contents,"_get_file_size":_get_file_size,"_llvm_eh_typeid_for":_llvm_eh_typeid_for,"_llvm_trap":_llvm_trap,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_once":_pthread_once,"_pthread_setspecific":_pthread_setspecific,"_put_file_contents":_put_file_contents,"_remove_file":_remove_file,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var _DApi_AllocPacket=Module["_DApi_AllocPacket"]=(function(){return Module["asm"]["_DApi_AllocPacket"].apply(null,arguments)});var _DApi_Char=Module["_DApi_Char"]=(function(){return Module["asm"]["_DApi_Char"].apply(null,arguments)});var _DApi_Init=Module["_DApi_Init"]=(function(){return Module["asm"]["_DApi_Init"].apply(null,arguments)});var _DApi_Key=Module["_DApi_Key"]=(function(){return Module["asm"]["_DApi_Key"].apply(null,arguments)});var _DApi_Mouse=Module["_DApi_Mouse"]=(function(){return Module["asm"]["_DApi_Mouse"].apply(null,arguments)});var _DApi_Render=Module["_DApi_Render"]=(function(){return Module["asm"]["_DApi_Render"].apply(null,arguments)});var _DApi_SyncText=Module["_DApi_SyncText"]=(function(){return Module["asm"]["_DApi_SyncText"].apply(null,arguments)});var _SNet_InitWebsocket=Module["_SNet_InitWebsocket"]=(function(){return Module["asm"]["_SNet_InitWebsocket"].apply(null,arguments)});var __GLOBAL__sub_I_msgcmd_cpp=Module["__GLOBAL__sub_I_msgcmd_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_msgcmd_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_snet_cpp=Module["__GLOBAL__sub_I_snet_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_snet_cpp"].apply(null,arguments)});var ___cxa_can_catch=Module["___cxa_can_catch"]=(function(){return Module["asm"]["___cxa_can_catch"].apply(null,arguments)});var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=(function(){return Module["asm"]["___cxa_is_pointer_type"].apply(null,arguments)});var ___em_js__api_close_keyboard=Module["___em_js__api_close_keyboard"]=(function(){return Module["asm"]["___em_js__api_close_keyboard"].apply(null,arguments)});var ___em_js__api_create_sound=Module["___em_js__api_create_sound"]=(function(){return Module["asm"]["___em_js__api_create_sound"].apply(null,arguments)});var ___em_js__api_create_sound_float=Module["___em_js__api_create_sound_float"]=(function(){return Module["asm"]["___em_js__api_create_sound_float"].apply(null,arguments)});var ___em_js__api_delete_sound=Module["___em_js__api_delete_sound"]=(function(){return Module["asm"]["___em_js__api_delete_sound"].apply(null,arguments)});var ___em_js__api_draw_begin=Module["___em_js__api_draw_begin"]=(function(){return Module["asm"]["___em_js__api_draw_begin"].apply(null,arguments)});var ___em_js__api_draw_belt=Module["___em_js__api_draw_belt"]=(function(){return Module["asm"]["___em_js__api_draw_belt"].apply(null,arguments)});var ___em_js__api_draw_blit=Module["___em_js__api_draw_blit"]=(function(){return Module["asm"]["___em_js__api_draw_blit"].apply(null,arguments)});var ___em_js__api_draw_clip_text=Module["___em_js__api_draw_clip_text"]=(function(){return Module["asm"]["___em_js__api_draw_clip_text"].apply(null,arguments)});var ___em_js__api_draw_end=Module["___em_js__api_draw_end"]=(function(){return Module["asm"]["___em_js__api_draw_end"].apply(null,arguments)});var ___em_js__api_draw_text=Module["___em_js__api_draw_text"]=(function(){return Module["asm"]["___em_js__api_draw_text"].apply(null,arguments)});var ___em_js__api_duplicate_sound=Module["___em_js__api_duplicate_sound"]=(function(){return Module["asm"]["___em_js__api_duplicate_sound"].apply(null,arguments)});var ___em_js__api_exit_game=Module["___em_js__api_exit_game"]=(function(){return Module["asm"]["___em_js__api_exit_game"].apply(null,arguments)});var ___em_js__api_open_keyboard=Module["___em_js__api_open_keyboard"]=(function(){return Module["asm"]["___em_js__api_open_keyboard"].apply(null,arguments)});var ___em_js__api_play_sound=Module["___em_js__api_play_sound"]=(function(){return Module["asm"]["___em_js__api_play_sound"].apply(null,arguments)});var ___em_js__api_set_cursor=Module["___em_js__api_set_cursor"]=(function(){return Module["asm"]["___em_js__api_set_cursor"].apply(null,arguments)});var ___em_js__api_set_volume=Module["___em_js__api_set_volume"]=(function(){return Module["asm"]["___em_js__api_set_volume"].apply(null,arguments)});var ___em_js__api_stop_sound=Module["___em_js__api_stop_sound"]=(function(){return Module["asm"]["___em_js__api_stop_sound"].apply(null,arguments)});var ___em_js__api_websocket_closed=Module["___em_js__api_websocket_closed"]=(function(){return Module["asm"]["___em_js__api_websocket_closed"].apply(null,arguments)});var ___em_js__api_websocket_send=Module["___em_js__api_websocket_send"]=(function(){return Module["asm"]["___em_js__api_websocket_send"].apply(null,arguments)});var ___em_js__exit_error=Module["___em_js__exit_error"]=(function(){return Module["asm"]["___em_js__exit_error"].apply(null,arguments)});var ___em_js__get_file_contents=Module["___em_js__get_file_contents"]=(function(){return Module["asm"]["___em_js__get_file_contents"].apply(null,arguments)});var ___em_js__get_file_size=Module["___em_js__get_file_size"]=(function(){return Module["asm"]["___em_js__get_file_size"].apply(null,arguments)});var ___em_js__put_file_contents=Module["___em_js__put_file_contents"]=(function(){return Module["asm"]["___em_js__put_file_contents"].apply(null,arguments)});var ___em_js__remove_file=Module["___em_js__remove_file"]=(function(){return Module["asm"]["___em_js__remove_file"].apply(null,arguments)});var ___em_js__show_alert=Module["___em_js__show_alert"]=(function(){return Module["asm"]["___em_js__show_alert"].apply(null,arguments)});var ___em_js__trace_pop=Module["___em_js__trace_pop"]=(function(){return Module["asm"]["___em_js__trace_pop"].apply(null,arguments)});var ___em_js__trace_push=Module["___em_js__trace_push"]=(function(){return Module["asm"]["___em_js__trace_push"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var setTempRet0=Module["setTempRet0"]=(function(){return Module["asm"]["setTempRet0"].apply(null,arguments)});var setThrew=Module["setThrew"]=(function(){return Module["asm"]["setThrew"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_viji=Module["dynCall_viji"]=(function(){return Module["asm"]["dynCall_viji"].apply(null,arguments)});Module["asm"]=asm;Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();Module["ready"]=new Promise((function(resolve,reject){delete Module["then"];Module["onAbort"]=(function(what){reject(what)});addOnPostRun((function(){resolve(Module)}))})) +var Module=typeof Diablo!=="undefined"?Diablo:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=function(status,toThrow){throw toThrow};Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_HAS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_HAS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_NODE=ENVIRONMENT_HAS_NODE&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;read_=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);Module["quit"]=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=function(status){quit(status)}}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var asm2wasmImports={"f64-rem":function(x,y){return x%y},"debugger":function(){debugger}};var functionPointers=new Array(0);var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};if(typeof WebAssembly!=="object"){err("no native wasm support detected")}var wasmMemory;var wasmTable;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(u8Array[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var DYNAMIC_BASE=7117728,DYNAMICTOP_PTR=1874816;var TOTAL_STACK=5242880;var INITIAL_TOTAL_MEMORY=Module["TOTAL_MEMORY"]||134217728;if(INITIAL_TOTAL_MEMORY>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="Diablo.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(env){var info={"env":env,"global":{"NaN":NaN,Infinity:Infinity},"global.Math":Math,"asm2wasm":asm2wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){return WebAssembly.instantiateStreaming(response,info).then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}Module["asm"]=function(global,env,providedBuffer){env["memory"]=wasmMemory;env["table"]=wasmTable=new WebAssembly.Table({"initial":1114,"maximum":1114,"element":"anyfunc"});env["__memory_base"]=1024;env["__table_base"]=0;var exports=createWasm(env);return exports};var ASM_CONSTS=[function($0){self.DApi.current_save_id($0)}];function _emscripten_asm_const_ii(code,a0){return ASM_CONSTS[code](a0)}function _api_close_keyboard(){self.DApi.close_keyboard()}function _api_create_sound(id,ptr,size){self.DApi.create_sound(id,HEAPU8.slice(ptr,ptr+size))}function _api_create_sound_float(id,ptr,samples,channels,rate){self.DApi.create_sound_raw(id,HEAPF32.slice(ptr/4,ptr/4+samples*channels),samples,channels,rate)}function _api_delete_sound(id){self.DApi.delete_sound(id)}function _api_draw_begin(){self.DApi.draw_begin()}function _api_draw_belt(items){self.DApi.draw_belt(HEAP32.subarray(items/4,items/4+8))}function _api_draw_blit(x,y,w,h,ptr){self.DApi.draw_blit(x,y,w,h,HEAPU8.subarray(ptr,ptr+w*h*4))}function _api_draw_clip_text(x0,y0,x1,y1){self.DApi.draw_clip_text(x0,y0,x1,y1)}function _api_draw_end(){self.DApi.draw_end()}function _api_draw_text(x,y,ptr,color){var end=HEAPU8.indexOf(0,ptr);var text=String.fromCharCode.apply(null,HEAPU8.subarray(ptr,end));self.DApi.draw_text(x,y,text,color)}function _api_duplicate_sound(id,srcId){self.DApi.duplicate_sound(id,srcId)}function _api_exit_game(){self.DApi.exit_game()}function _api_open_keyboard(x0,y0,x1,y1){self.DApi.open_keyboard(x0,y0,x1,y1)}function _api_play_sound(id,volume,pan,loop){self.DApi.play_sound(id,volume,pan,loop)}function _api_set_cursor(x,y){self.DApi.set_cursor(x,y)}function _api_set_volume(id,volume){self.DApi.set_volume(id,volume)}function _api_stop_sound(id){self.DApi.stop_sound(id)}function _api_websocket_closed(){return self.DApi.websocket_closed()}function _api_websocket_send(ptr,size){self.DApi.websocket_send(HEAPU8.subarray(ptr,ptr+size))}function _exit_error(err){var end=HEAPU8.indexOf(0,err);var text=String.fromCharCode.apply(null,HEAPU8.subarray(err,end));self.DApi.exit_error(text)}function _get_file_contents(path,ptr,offset,size){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.get_file_contents(text,HEAPU8.subarray(ptr,ptr+size),offset)}function _get_file_size(path){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));return self.DApi.get_file_size(text)}function _put_file_contents(path,ptr,size){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.put_file_contents(text,HEAPU8.slice(ptr,ptr+size))}function _remove_file(path){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.remove_file(text)}__ATINIT__.push({func:function(){globalCtors()}});function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ___cxa_allocate_exception(size){return _malloc(size)}var ___exception_infos={};var ___exception_caught=[];function ___exception_addRef(ptr){if(!ptr)return;var info=___exception_infos[ptr];info.refcount++}function ___exception_deAdjust(adjusted){if(!adjusted||___exception_infos[adjusted])return adjusted;for(var key in ___exception_infos){var ptr=+key;var adj=___exception_infos[ptr].adjusted;var len=adj.length;for(var i=0;i>2]=thrown;thrown=buffer;for(var i=0;i>2];info.adjusted.push(thrown);return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}Module["___cxa_find_matching_catch"]=___cxa_find_matching_catch;function ___cxa_find_matching_catch_2(a0,a1){return ___cxa_find_matching_catch(a0,a1)}function ___cxa_find_matching_catch_3(a0,a1,a2){return ___cxa_find_matching_catch(a0,a1,a2)}function ___cxa_get_exception_ptr(ptr){return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___cxa_throw(ptr,type,destructor){___exception_infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};___exception_last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exceptions=1}else{__ZSt18uncaught_exceptionv.uncaught_exceptions++}throw ptr}function ___cxa_uncaught_exceptions(){return __ZSt18uncaught_exceptionv.uncaught_exceptions}function ___lock(){}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:0,get:function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(){var ret=UTF8ToString(SYSCALLS.get());return ret},get64:function(){var low=SYSCALLS.get(),high=SYSCALLS.get();return low},getZero:function(){SYSCALLS.get()}};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=value;return value}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function emscripten_realloc_buffer(size){var PAGE_MULTIPLE=65536;size=alignUp(size,PAGE_MULTIPLE);var oldSize=buffer.byteLength;try{var result=wasmMemory.grow((size-oldSize)/65536);if(result!==(-1|0)){buffer=wasmMemory.buffer;return true}else{return false}}catch(e){return false}}function _emscripten_resize_heap(requestedSize){var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(requestedSize>LIMIT){return false}var MIN_TOTAL_MEMORY=16777216;var newSize=Math.max(oldSize,MIN_TOTAL_MEMORY);while(newSize>2]=ret}return ret}function invoke_i(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return dynCall_ji(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{dynCall_v(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viji(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viji(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}var asmGlobalArg={};var asmLibraryArg={"n":abort,"L":setTempRet0,"b":getTempRet0,"ra":invoke_i,"g":invoke_ii,"l":invoke_iii,"o":invoke_iiii,"s":invoke_iiiii,"t":invoke_iiiiii,"K":invoke_ji,"u":invoke_v,"f":invoke_vi,"e":invoke_vii,"j":invoke_viii,"q":invoke_viiii,"r":invoke_viiiii,"A":invoke_viiiiiii,"J":invoke_viji,"z":___assert_fail,"i":___cxa_allocate_exception,"y":___cxa_begin_catch,"I":___cxa_end_catch,"c":___cxa_find_matching_catch_2,"h":___cxa_find_matching_catch_3,"m":___cxa_free_exception,"qa":___cxa_get_exception_ptr,"pa":___cxa_pure_virtual,"k":___cxa_throw,"oa":___cxa_uncaught_exceptions,"na":___lock,"d":___resumeException,"H":___setErrNo,"ma":___syscall140,"G":___syscall146,"la":___syscall54,"ka":___syscall6,"F":___unlock,"E":_abort,"ja":_api_close_keyboard,"ia":_api_create_sound,"ha":_api_create_sound_float,"ga":_api_delete_sound,"fa":_api_draw_begin,"ea":_api_draw_belt,"D":_api_draw_blit,"da":_api_draw_clip_text,"w":_api_draw_end,"ca":_api_draw_text,"ba":_api_duplicate_sound,"aa":_api_exit_game,"C":_api_open_keyboard,"B":_api_play_sound,"$":_api_set_cursor,"_":_api_set_volume,"Z":_api_stop_sound,"Y":_api_websocket_closed,"X":_api_websocket_send,"W":_emscripten_asm_const_ii,"V":_emscripten_get_heap_size,"U":_emscripten_memcpy_big,"T":_emscripten_resize_heap,"p":_exit,"S":_exit_error,"v":_get_file_contents,"R":_get_file_size,"Q":_llvm_eh_typeid_for,"P":_llvm_trap,"O":_put_file_contents,"N":_remove_file,"x":_time,"M":abortOnCannotGrowMemory,"a":DYNAMICTOP_PTR};var asm=Module["asm"](asmGlobalArg,asmLibraryArg,buffer);Module["asm"]=asm;var _DApi_AllocPacket=Module["_DApi_AllocPacket"]=function(){return Module["asm"]["sa"].apply(null,arguments)};var _DApi_Char=Module["_DApi_Char"]=function(){return Module["asm"]["ta"].apply(null,arguments)};var _DApi_Init=Module["_DApi_Init"]=function(){return Module["asm"]["ua"].apply(null,arguments)};var _DApi_Key=Module["_DApi_Key"]=function(){return Module["asm"]["va"].apply(null,arguments)};var _DApi_Mouse=Module["_DApi_Mouse"]=function(){return Module["asm"]["wa"].apply(null,arguments)};var _DApi_Render=Module["_DApi_Render"]=function(){return Module["asm"]["xa"].apply(null,arguments)};var _DApi_SyncText=Module["_DApi_SyncText"]=function(){return Module["asm"]["ya"].apply(null,arguments)};var _SNet_InitWebsocket=Module["_SNet_InitWebsocket"]=function(){return Module["asm"]["za"].apply(null,arguments)};var __ZSt18uncaught_exceptionv=Module["__ZSt18uncaught_exceptionv"]=function(){return Module["asm"]["Aa"].apply(null,arguments)};var ___cxa_can_catch=Module["___cxa_can_catch"]=function(){return Module["asm"]["Ba"].apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return Module["asm"]["Ca"].apply(null,arguments)};var ___em_js__api_close_keyboard=Module["___em_js__api_close_keyboard"]=function(){return Module["asm"]["Da"].apply(null,arguments)};var ___em_js__api_create_sound=Module["___em_js__api_create_sound"]=function(){return Module["asm"]["Ea"].apply(null,arguments)};var ___em_js__api_create_sound_float=Module["___em_js__api_create_sound_float"]=function(){return Module["asm"]["Fa"].apply(null,arguments)};var ___em_js__api_delete_sound=Module["___em_js__api_delete_sound"]=function(){return Module["asm"]["Ga"].apply(null,arguments)};var ___em_js__api_draw_begin=Module["___em_js__api_draw_begin"]=function(){return Module["asm"]["Ha"].apply(null,arguments)};var ___em_js__api_draw_belt=Module["___em_js__api_draw_belt"]=function(){return Module["asm"]["Ia"].apply(null,arguments)};var ___em_js__api_draw_blit=Module["___em_js__api_draw_blit"]=function(){return Module["asm"]["Ja"].apply(null,arguments)};var ___em_js__api_draw_clip_text=Module["___em_js__api_draw_clip_text"]=function(){return Module["asm"]["Ka"].apply(null,arguments)};var ___em_js__api_draw_end=Module["___em_js__api_draw_end"]=function(){return Module["asm"]["La"].apply(null,arguments)};var ___em_js__api_draw_text=Module["___em_js__api_draw_text"]=function(){return Module["asm"]["Ma"].apply(null,arguments)};var ___em_js__api_duplicate_sound=Module["___em_js__api_duplicate_sound"]=function(){return Module["asm"]["Na"].apply(null,arguments)};var ___em_js__api_exit_game=Module["___em_js__api_exit_game"]=function(){return Module["asm"]["Oa"].apply(null,arguments)};var ___em_js__api_open_keyboard=Module["___em_js__api_open_keyboard"]=function(){return Module["asm"]["Pa"].apply(null,arguments)};var ___em_js__api_play_sound=Module["___em_js__api_play_sound"]=function(){return Module["asm"]["Qa"].apply(null,arguments)};var ___em_js__api_set_cursor=Module["___em_js__api_set_cursor"]=function(){return Module["asm"]["Ra"].apply(null,arguments)};var ___em_js__api_set_volume=Module["___em_js__api_set_volume"]=function(){return Module["asm"]["Sa"].apply(null,arguments)};var ___em_js__api_stop_sound=Module["___em_js__api_stop_sound"]=function(){return Module["asm"]["Ta"].apply(null,arguments)};var ___em_js__api_websocket_closed=Module["___em_js__api_websocket_closed"]=function(){return Module["asm"]["Ua"].apply(null,arguments)};var ___em_js__api_websocket_send=Module["___em_js__api_websocket_send"]=function(){return Module["asm"]["Va"].apply(null,arguments)};var ___em_js__exit_error=Module["___em_js__exit_error"]=function(){return Module["asm"]["Wa"].apply(null,arguments)};var ___em_js__get_file_contents=Module["___em_js__get_file_contents"]=function(){return Module["asm"]["Xa"].apply(null,arguments)};var ___em_js__get_file_size=Module["___em_js__get_file_size"]=function(){return Module["asm"]["Ya"].apply(null,arguments)};var ___em_js__put_file_contents=Module["___em_js__put_file_contents"]=function(){return Module["asm"]["Za"].apply(null,arguments)};var ___em_js__remove_file=Module["___em_js__remove_file"]=function(){return Module["asm"]["_a"].apply(null,arguments)};var ___em_js__show_alert=Module["___em_js__show_alert"]=function(){return Module["asm"]["$a"].apply(null,arguments)};var ___em_js__trace_pop=Module["___em_js__trace_pop"]=function(){return Module["asm"]["ab"].apply(null,arguments)};var ___em_js__trace_push=Module["___em_js__trace_push"]=function(){return Module["asm"]["bb"].apply(null,arguments)};var _free=Module["_free"]=function(){return Module["asm"]["cb"].apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return Module["asm"]["db"].apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return Module["asm"]["eb"].apply(null,arguments)};var globalCtors=Module["globalCtors"]=function(){return Module["asm"]["ub"].apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return Module["asm"]["vb"].apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return Module["asm"]["wb"].apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return Module["asm"]["fb"].apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return Module["asm"]["gb"].apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return Module["asm"]["hb"].apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return Module["asm"]["ib"].apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return Module["asm"]["jb"].apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return Module["asm"]["kb"].apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return Module["asm"]["lb"].apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return Module["asm"]["mb"].apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return Module["asm"]["nb"].apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return Module["asm"]["ob"].apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return Module["asm"]["pb"].apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return Module["asm"]["qb"].apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return Module["asm"]["rb"].apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return Module["asm"]["sb"].apply(null,arguments)};var dynCall_viji=Module["dynCall_viji"]=function(){return Module["asm"]["tb"].apply(null,arguments)};Module["asm"]=asm;Module["then"]=function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=function(){if(old)old();func(Module)}}return Module};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();Module["ready"]=new Promise(function(resolve,reject){delete Module["then"];Module["onAbort"]=function(what){reject(what)};addOnPostRun(function(){resolve(Module)})}); - - - - return Diablo; + return Diablo } ); })(); if (typeof exports === 'object' && typeof module === 'object') - module.exports = Diablo; - else if (typeof define === 'function' && define['amd']) - define([], function() { return Diablo; }); - else if (typeof exports === 'object') - exports["Diablo"] = Diablo; - \ No newline at end of file + module.exports = Diablo; + else if (typeof define === 'function' && define['amd']) + define([], function() { return Diablo; }); + else if (typeof exports === 'object') + exports["Diablo"] = Diablo; + \ No newline at end of file diff --git a/src/api/Diablo.wasm b/src/api/Diablo.wasm index c915ddf..a6f2214 100644 Binary files a/src/api/Diablo.wasm and b/src/api/Diablo.wasm differ diff --git a/src/api/DiabloSpawn.jscc b/src/api/DiabloSpawn.jscc index a3b4c46..60d5d1c 100644 --- a/src/api/DiabloSpawn.jscc +++ b/src/api/DiabloSpawn.jscc @@ -5,20 +5,17 @@ var DiabloSpawn = (function() { function(DiabloSpawn) { DiabloSpawn = DiabloSpawn || {}; -var Module=typeof DiabloSpawn!=="undefined"?DiabloSpawn:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=(function(status,toThrow){throw toThrow});Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));process["on"]("unhandledRejection",(function(reason,p){process["exit"](1)}));Module["quit"]=(function(status){process["exit"](status)});Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=(function(status){quit(status)})}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WEB){if(document.currentScript){scriptDirectory=document.currentScript.src}}else{scriptDirectory=self.location.href}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.split("/").slice(0,-1).join("/")+"/"}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=(function(title){document.title=title})}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function staticAlloc(size){var ret=STATICTOP;STATICTOP=STATICTOP+size+15&-16;return ret}function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;var ret=size=Math.ceil(size/factor)*factor;return ret}var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"debugger":(function(){debugger})};var functionPointers=new Array(0);var GLOBAL_BASE=1024;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function Pointer_stringify(ptr,length){if(length===0||!ptr)return"";var hasUtf=0;var t;var i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return UTF8ToString(ptr)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;var MIN_TOTAL_MEMORY=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}if(!Module["reallocBuffer"])Module["reallocBuffer"]=(function(size){var ret;try{if(ArrayBuffer.transfer){ret=ArrayBuffer.transfer(buffer,size)}else{var oldHEAP8=HEAP8;ret=new ArrayBuffer(size);var temp=new Int8Array(ret);temp.set(oldHEAP8)}}catch(e){return false}var success=_emscripten_replace_memory(ret);if(!success)return false;return ret});function enlargeMemory(){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;var LIMIT=2147483648-PAGE_MULTIPLE;if(HEAP32[DYNAMICTOP_PTR>>2]>LIMIT){return false}var OLD_TOTAL_MEMORY=TOTAL_MEMORY;TOTAL_MEMORY=Math.max(TOTAL_MEMORY,MIN_TOTAL_MEMORY);while(TOTAL_MEMORY>2]){if(TOTAL_MEMORY<=536870912){TOTAL_MEMORY=alignUp(2*TOTAL_MEMORY,PAGE_MULTIPLE)}else{TOTAL_MEMORY=Math.min(alignUp((3*TOTAL_MEMORY+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=Module["reallocBuffer"](TOTAL_MEMORY);if(!replacement||replacement.byteLength!=TOTAL_MEMORY){TOTAL_MEMORY=OLD_TOTAL_MEMORY;return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||134217728;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}function integrateWasmJS(){var wasmTextFile="DiabloSpawn.wast";var wasmBinaryFile="DiabloSpawn.wasm";var asmjsCodeFile="DiabloSpawn.temp.asm.js";if(!isDataURI(wasmTextFile)){wasmTextFile=locateFile(wasmTextFile)}if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}if(!isDataURI(asmjsCodeFile)){asmjsCodeFile=locateFile(asmjsCodeFile)}var wasmPageSize=64*1024;var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength0);info.refcount--;if(info.refcount===0&&!info.rethrown){if(info.destructor){Module["dynCall_vi"](info.destructor,ptr)}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){var info=EXCEPTIONS.infos[ptr];if(info&&!info.caught){info.caught=true;__ZSt18uncaught_exceptionv.uncaught_exception--}if(info)info.rethrown=false;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function ___cxa_free_exception(ptr){try{return _free(ptr)}catch(e){}}function ___cxa_end_catch(){Module["setThrew"](0);var ptr=EXCEPTIONS.caught.pop();if(ptr){EXCEPTIONS.decRef(EXCEPTIONS.deAdjust(ptr));EXCEPTIONS.last=0}}function ___cxa_find_matching_catch_2(){return ___cxa_find_matching_catch.apply(null,arguments)}function ___cxa_find_matching_catch_3(){return ___cxa_find_matching_catch.apply(null,arguments)}function ___cxa_get_exception_ptr(ptr){return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___resumeException(ptr){if(!EXCEPTIONS.last){EXCEPTIONS.last=ptr}throw ptr}function ___cxa_find_matching_catch(){var thrown=EXCEPTIONS.last;if(!thrown){return(setTempRet0(0),0)|0}var info=EXCEPTIONS.infos[thrown];var throwntype=info.type;if(!throwntype){return(setTempRet0(0),thrown)|0}var typeArray=Array.prototype.slice.call(arguments);var pointer=Module["___cxa_is_pointer_type"](throwntype);if(!___cxa_find_matching_catch.buffer)___cxa_find_matching_catch.buffer=_malloc(4);HEAP32[___cxa_find_matching_catch.buffer>>2]=thrown;thrown=___cxa_find_matching_catch.buffer;for(var i=0;i>2];info.adjusted=thrown;return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}function ___cxa_throw(ptr,type,destructor){EXCEPTIONS.infos[ptr]={ptr:ptr,adjusted:ptr,type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};EXCEPTIONS.last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exception=1}else{__ZSt18uncaught_exceptionv.uncaught_exception++}throw ptr}function ___lock(){}var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffers){___syscall146.buffers=[null,[],[]];___syscall146.printChar=(function(stream,curr){var buffer=___syscall146.buffers[stream];assert(buffer);if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}})}for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Module["dynCall_v"](func);_pthread_once.seen[ptr]=1}function _pthread_setspecific(key,value){if(!(key in PTHREAD_SPECIFIC)){return ERRNO_CODES.EINVAL}PTHREAD_SPECIFIC[key]=value;return 0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}DYNAMICTOP_PTR=staticAlloc(4);STACK_BASE=STACKTOP=alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=1112;Module["wasmMaxTableSize"]=1112;function invoke_i(index){var sp=stackSave();try{return Module["dynCall_i"](index)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return Module["dynCall_ii"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return Module["dynCall_iii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return Module["dynCall_iiiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return Module["dynCall_ji"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_v(index){var sp=stackSave();try{Module["dynCall_v"](index)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{Module["dynCall_vi"](index,a1)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{Module["dynCall_vii"](index,a1,a2)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{Module["dynCall_viii"](index,a1,a2,a3)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viiii"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{Module["dynCall_viiiii"](index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{Module["dynCall_viiiiiii"](index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_viji(index,a1,a2,a3,a4){var sp=stackSave();try{Module["dynCall_viji"](index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={};Module.asmLibraryArg={"abort":abort,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_i":invoke_i,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiii":invoke_iiiiii,"invoke_ji":invoke_ji,"invoke_v":invoke_v,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"invoke_viiiii":invoke_viiiii,"invoke_viiiiiii":invoke_viiiiiii,"invoke_viji":invoke_viji,"___assert_fail":___assert_fail,"___cxa_allocate_exception":___cxa_allocate_exception,"___cxa_begin_catch":___cxa_begin_catch,"___cxa_end_catch":___cxa_end_catch,"___cxa_find_matching_catch_2":___cxa_find_matching_catch_2,"___cxa_find_matching_catch_3":___cxa_find_matching_catch_3,"___cxa_free_exception":___cxa_free_exception,"___cxa_get_exception_ptr":___cxa_get_exception_ptr,"___cxa_pure_virtual":___cxa_pure_virtual,"___cxa_throw":___cxa_throw,"___lock":___lock,"___resumeException":___resumeException,"___setErrNo":___setErrNo,"___syscall140":___syscall140,"___syscall146":___syscall146,"___syscall54":___syscall54,"___syscall6":___syscall6,"___unlock":___unlock,"_abort":_abort,"_api_close_keyboard":_api_close_keyboard,"_api_create_sound":_api_create_sound,"_api_create_sound_float":_api_create_sound_float,"_api_delete_sound":_api_delete_sound,"_api_draw_begin":_api_draw_begin,"_api_draw_belt":_api_draw_belt,"_api_draw_blit":_api_draw_blit,"_api_draw_clip_text":_api_draw_clip_text,"_api_draw_end":_api_draw_end,"_api_draw_text":_api_draw_text,"_api_duplicate_sound":_api_duplicate_sound,"_api_exit_game":_api_exit_game,"_api_open_keyboard":_api_open_keyboard,"_api_play_sound":_api_play_sound,"_api_set_cursor":_api_set_cursor,"_api_set_volume":_api_set_volume,"_api_stop_sound":_api_stop_sound,"_api_websocket_closed":_api_websocket_closed,"_api_websocket_send":_api_websocket_send,"_emscripten_asm_const_ii":_emscripten_asm_const_ii,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_exit":_exit,"_exit_error":_exit_error,"_get_file_contents":_get_file_contents,"_get_file_size":_get_file_size,"_llvm_eh_typeid_for":_llvm_eh_typeid_for,"_llvm_trap":_llvm_trap,"_pthread_getspecific":_pthread_getspecific,"_pthread_key_create":_pthread_key_create,"_pthread_once":_pthread_once,"_pthread_setspecific":_pthread_setspecific,"_put_file_contents":_put_file_contents,"_remove_file":_remove_file,"_time":_time,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"STACKTOP":STACKTOP};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var _DApi_AllocPacket=Module["_DApi_AllocPacket"]=(function(){return Module["asm"]["_DApi_AllocPacket"].apply(null,arguments)});var _DApi_Char=Module["_DApi_Char"]=(function(){return Module["asm"]["_DApi_Char"].apply(null,arguments)});var _DApi_Init=Module["_DApi_Init"]=(function(){return Module["asm"]["_DApi_Init"].apply(null,arguments)});var _DApi_Key=Module["_DApi_Key"]=(function(){return Module["asm"]["_DApi_Key"].apply(null,arguments)});var _DApi_Mouse=Module["_DApi_Mouse"]=(function(){return Module["asm"]["_DApi_Mouse"].apply(null,arguments)});var _DApi_Render=Module["_DApi_Render"]=(function(){return Module["asm"]["_DApi_Render"].apply(null,arguments)});var _DApi_SyncText=Module["_DApi_SyncText"]=(function(){return Module["asm"]["_DApi_SyncText"].apply(null,arguments)});var _SNet_InitWebsocket=Module["_SNet_InitWebsocket"]=(function(){return Module["asm"]["_SNet_InitWebsocket"].apply(null,arguments)});var __GLOBAL__sub_I_msgcmd_cpp=Module["__GLOBAL__sub_I_msgcmd_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_msgcmd_cpp"].apply(null,arguments)});var __GLOBAL__sub_I_snet_cpp=Module["__GLOBAL__sub_I_snet_cpp"]=(function(){return Module["asm"]["__GLOBAL__sub_I_snet_cpp"].apply(null,arguments)});var ___cxa_can_catch=Module["___cxa_can_catch"]=(function(){return Module["asm"]["___cxa_can_catch"].apply(null,arguments)});var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=(function(){return Module["asm"]["___cxa_is_pointer_type"].apply(null,arguments)});var ___em_js__api_close_keyboard=Module["___em_js__api_close_keyboard"]=(function(){return Module["asm"]["___em_js__api_close_keyboard"].apply(null,arguments)});var ___em_js__api_create_sound=Module["___em_js__api_create_sound"]=(function(){return Module["asm"]["___em_js__api_create_sound"].apply(null,arguments)});var ___em_js__api_create_sound_float=Module["___em_js__api_create_sound_float"]=(function(){return Module["asm"]["___em_js__api_create_sound_float"].apply(null,arguments)});var ___em_js__api_delete_sound=Module["___em_js__api_delete_sound"]=(function(){return Module["asm"]["___em_js__api_delete_sound"].apply(null,arguments)});var ___em_js__api_draw_begin=Module["___em_js__api_draw_begin"]=(function(){return Module["asm"]["___em_js__api_draw_begin"].apply(null,arguments)});var ___em_js__api_draw_belt=Module["___em_js__api_draw_belt"]=(function(){return Module["asm"]["___em_js__api_draw_belt"].apply(null,arguments)});var ___em_js__api_draw_blit=Module["___em_js__api_draw_blit"]=(function(){return Module["asm"]["___em_js__api_draw_blit"].apply(null,arguments)});var ___em_js__api_draw_clip_text=Module["___em_js__api_draw_clip_text"]=(function(){return Module["asm"]["___em_js__api_draw_clip_text"].apply(null,arguments)});var ___em_js__api_draw_end=Module["___em_js__api_draw_end"]=(function(){return Module["asm"]["___em_js__api_draw_end"].apply(null,arguments)});var ___em_js__api_draw_text=Module["___em_js__api_draw_text"]=(function(){return Module["asm"]["___em_js__api_draw_text"].apply(null,arguments)});var ___em_js__api_duplicate_sound=Module["___em_js__api_duplicate_sound"]=(function(){return Module["asm"]["___em_js__api_duplicate_sound"].apply(null,arguments)});var ___em_js__api_exit_game=Module["___em_js__api_exit_game"]=(function(){return Module["asm"]["___em_js__api_exit_game"].apply(null,arguments)});var ___em_js__api_open_keyboard=Module["___em_js__api_open_keyboard"]=(function(){return Module["asm"]["___em_js__api_open_keyboard"].apply(null,arguments)});var ___em_js__api_play_sound=Module["___em_js__api_play_sound"]=(function(){return Module["asm"]["___em_js__api_play_sound"].apply(null,arguments)});var ___em_js__api_set_cursor=Module["___em_js__api_set_cursor"]=(function(){return Module["asm"]["___em_js__api_set_cursor"].apply(null,arguments)});var ___em_js__api_set_volume=Module["___em_js__api_set_volume"]=(function(){return Module["asm"]["___em_js__api_set_volume"].apply(null,arguments)});var ___em_js__api_stop_sound=Module["___em_js__api_stop_sound"]=(function(){return Module["asm"]["___em_js__api_stop_sound"].apply(null,arguments)});var ___em_js__api_websocket_closed=Module["___em_js__api_websocket_closed"]=(function(){return Module["asm"]["___em_js__api_websocket_closed"].apply(null,arguments)});var ___em_js__api_websocket_send=Module["___em_js__api_websocket_send"]=(function(){return Module["asm"]["___em_js__api_websocket_send"].apply(null,arguments)});var ___em_js__exit_error=Module["___em_js__exit_error"]=(function(){return Module["asm"]["___em_js__exit_error"].apply(null,arguments)});var ___em_js__get_file_contents=Module["___em_js__get_file_contents"]=(function(){return Module["asm"]["___em_js__get_file_contents"].apply(null,arguments)});var ___em_js__get_file_size=Module["___em_js__get_file_size"]=(function(){return Module["asm"]["___em_js__get_file_size"].apply(null,arguments)});var ___em_js__put_file_contents=Module["___em_js__put_file_contents"]=(function(){return Module["asm"]["___em_js__put_file_contents"].apply(null,arguments)});var ___em_js__remove_file=Module["___em_js__remove_file"]=(function(){return Module["asm"]["___em_js__remove_file"].apply(null,arguments)});var ___em_js__show_alert=Module["___em_js__show_alert"]=(function(){return Module["asm"]["___em_js__show_alert"].apply(null,arguments)});var ___em_js__trace_pop=Module["___em_js__trace_pop"]=(function(){return Module["asm"]["___em_js__trace_pop"].apply(null,arguments)});var ___em_js__trace_push=Module["___em_js__trace_push"]=(function(){return Module["asm"]["___em_js__trace_push"].apply(null,arguments)});var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=(function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var setTempRet0=Module["setTempRet0"]=(function(){return Module["asm"]["setTempRet0"].apply(null,arguments)});var setThrew=Module["setThrew"]=(function(){return Module["asm"]["setThrew"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var dynCall_i=Module["dynCall_i"]=(function(){return Module["asm"]["dynCall_i"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});var dynCall_iiiiii=Module["dynCall_iiiiii"]=(function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)});var dynCall_ji=Module["dynCall_ji"]=(function(){return Module["asm"]["dynCall_ji"].apply(null,arguments)});var dynCall_v=Module["dynCall_v"]=(function(){return Module["asm"]["dynCall_v"].apply(null,arguments)});var dynCall_vi=Module["dynCall_vi"]=(function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_viii=Module["dynCall_viii"]=(function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)});var dynCall_viiii=Module["dynCall_viiii"]=(function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)});var dynCall_viiiii=Module["dynCall_viiiii"]=(function(){return Module["asm"]["dynCall_viiiii"].apply(null,arguments)});var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=(function(){return Module["asm"]["dynCall_viiiiiii"].apply(null,arguments)});var dynCall_viji=Module["dynCall_viji"]=(function(){return Module["asm"]["dynCall_viji"].apply(null,arguments)});Module["asm"]=asm;Module["then"]=(function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=(function(){if(old)old();func(Module)})}return Module});function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();Module["ready"]=new Promise((function(resolve,reject){delete Module["then"];Module["onAbort"]=(function(what){reject(what)});addOnPostRun((function(){resolve(Module)}))})) +var Module=typeof DiabloSpawn!=="undefined"?DiabloSpawn:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=function(status,toThrow){throw toThrow};Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_HAS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_HAS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_NODE=ENVIRONMENT_HAS_NODE&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;read_=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);Module["quit"]=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=function(status){quit(status)}}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var asm2wasmImports={"f64-rem":function(x,y){return x%y},"debugger":function(){debugger}};var functionPointers=new Array(0);var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};if(typeof WebAssembly!=="object"){err("no native wasm support detected")}var wasmMemory;var wasmTable;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(u8Array[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var DYNAMIC_BASE=7092928,DYNAMICTOP_PTR=1850016;var TOTAL_STACK=5242880;var INITIAL_TOTAL_MEMORY=Module["TOTAL_MEMORY"]||134217728;if(INITIAL_TOTAL_MEMORY>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="DiabloSpawn.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(env){var info={"env":env,"global":{"NaN":NaN,Infinity:Infinity},"global.Math":Math,"asm2wasm":asm2wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){return WebAssembly.instantiateStreaming(response,info).then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}Module["asm"]=function(global,env,providedBuffer){env["memory"]=wasmMemory;env["table"]=wasmTable=new WebAssembly.Table({"initial":1114,"maximum":1114,"element":"anyfunc"});env["__memory_base"]=1024;env["__table_base"]=0;var exports=createWasm(env);return exports};var ASM_CONSTS=[function($0){self.DApi.current_save_id($0)}];function _emscripten_asm_const_ii(code,a0){return ASM_CONSTS[code](a0)}function _api_close_keyboard(){self.DApi.close_keyboard()}function _api_create_sound(id,ptr,size){self.DApi.create_sound(id,HEAPU8.slice(ptr,ptr+size))}function _api_create_sound_float(id,ptr,samples,channels,rate){self.DApi.create_sound_raw(id,HEAPF32.slice(ptr/4,ptr/4+samples*channels),samples,channels,rate)}function _api_delete_sound(id){self.DApi.delete_sound(id)}function _api_draw_begin(){self.DApi.draw_begin()}function _api_draw_belt(items){self.DApi.draw_belt(HEAP32.subarray(items/4,items/4+8))}function _api_draw_blit(x,y,w,h,ptr){self.DApi.draw_blit(x,y,w,h,HEAPU8.subarray(ptr,ptr+w*h*4))}function _api_draw_clip_text(x0,y0,x1,y1){self.DApi.draw_clip_text(x0,y0,x1,y1)}function _api_draw_end(){self.DApi.draw_end()}function _api_draw_text(x,y,ptr,color){var end=HEAPU8.indexOf(0,ptr);var text=String.fromCharCode.apply(null,HEAPU8.subarray(ptr,end));self.DApi.draw_text(x,y,text,color)}function _api_duplicate_sound(id,srcId){self.DApi.duplicate_sound(id,srcId)}function _api_exit_game(){self.DApi.exit_game()}function _api_open_keyboard(x0,y0,x1,y1){self.DApi.open_keyboard(x0,y0,x1,y1)}function _api_play_sound(id,volume,pan,loop){self.DApi.play_sound(id,volume,pan,loop)}function _api_set_cursor(x,y){self.DApi.set_cursor(x,y)}function _api_set_volume(id,volume){self.DApi.set_volume(id,volume)}function _api_stop_sound(id){self.DApi.stop_sound(id)}function _api_websocket_closed(){return self.DApi.websocket_closed()}function _api_websocket_send(ptr,size){self.DApi.websocket_send(HEAPU8.subarray(ptr,ptr+size))}function _exit_error(err){var end=HEAPU8.indexOf(0,err);var text=String.fromCharCode.apply(null,HEAPU8.subarray(err,end));self.DApi.exit_error(text)}function _get_file_contents(path,ptr,offset,size){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.get_file_contents(text,HEAPU8.subarray(ptr,ptr+size),offset)}function _get_file_size(path){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));return self.DApi.get_file_size(text)}function _put_file_contents(path,ptr,size){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.put_file_contents(text,HEAPU8.slice(ptr,ptr+size))}function _remove_file(path){var end=HEAPU8.indexOf(0,path);var text=String.fromCharCode.apply(null,HEAPU8.subarray(path,end));self.DApi.remove_file(text)}__ATINIT__.push({func:function(){globalCtors()}});function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ___cxa_allocate_exception(size){return _malloc(size)}var ___exception_infos={};var ___exception_caught=[];function ___exception_addRef(ptr){if(!ptr)return;var info=___exception_infos[ptr];info.refcount++}function ___exception_deAdjust(adjusted){if(!adjusted||___exception_infos[adjusted])return adjusted;for(var key in ___exception_infos){var ptr=+key;var adj=___exception_infos[ptr].adjusted;var len=adj.length;for(var i=0;i>2]=thrown;thrown=buffer;for(var i=0;i>2];info.adjusted.push(thrown);return(setTempRet0(typeArray[i]),thrown)|0}}thrown=HEAP32[thrown>>2];return(setTempRet0(throwntype),thrown)|0}Module["___cxa_find_matching_catch"]=___cxa_find_matching_catch;function ___cxa_find_matching_catch_2(a0,a1){return ___cxa_find_matching_catch(a0,a1)}function ___cxa_find_matching_catch_3(a0,a1,a2){return ___cxa_find_matching_catch(a0,a1,a2)}function ___cxa_get_exception_ptr(ptr){return ptr}function ___cxa_pure_virtual(){ABORT=true;throw"Pure virtual function called!"}function ___cxa_throw(ptr,type,destructor){___exception_infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};___exception_last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exceptions=1}else{__ZSt18uncaught_exceptionv.uncaught_exceptions++}throw ptr}function ___cxa_uncaught_exceptions(){return __ZSt18uncaught_exceptionv.uncaught_exceptions}function ___lock(){}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var SYSCALLS={buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:0,get:function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(){var ret=UTF8ToString(SYSCALLS.get());return ret},get64:function(){var low=SYSCALLS.get(),high=SYSCALLS.get();return low},getZero:function(){SYSCALLS.get()}};function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=value;return value}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function emscripten_realloc_buffer(size){var PAGE_MULTIPLE=65536;size=alignUp(size,PAGE_MULTIPLE);var oldSize=buffer.byteLength;try{var result=wasmMemory.grow((size-oldSize)/65536);if(result!==(-1|0)){buffer=wasmMemory.buffer;return true}else{return false}}catch(e){return false}}function _emscripten_resize_heap(requestedSize){var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(requestedSize>LIMIT){return false}var MIN_TOTAL_MEMORY=16777216;var newSize=Math.max(oldSize,MIN_TOTAL_MEMORY);while(newSize>2]=ret}return ret}function invoke_i(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return dynCall_iiiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ji(index,a1){var sp=stackSave();try{return dynCall_ji(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{dynCall_v(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{dynCall_viiiii(index,a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7){var sp=stackSave();try{dynCall_viiiiiii(index,a1,a2,a3,a4,a5,a6,a7)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viji(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viji(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}var asmGlobalArg={};var asmLibraryArg={"n":abort,"L":setTempRet0,"b":getTempRet0,"ra":invoke_i,"g":invoke_ii,"m":invoke_iii,"o":invoke_iiii,"s":invoke_iiiii,"t":invoke_iiiiii,"K":invoke_ji,"u":invoke_v,"f":invoke_vi,"e":invoke_vii,"j":invoke_viii,"q":invoke_viiii,"r":invoke_viiiii,"A":invoke_viiiiiii,"J":invoke_viji,"z":___assert_fail,"i":___cxa_allocate_exception,"y":___cxa_begin_catch,"I":___cxa_end_catch,"c":___cxa_find_matching_catch_2,"h":___cxa_find_matching_catch_3,"l":___cxa_free_exception,"qa":___cxa_get_exception_ptr,"pa":___cxa_pure_virtual,"k":___cxa_throw,"oa":___cxa_uncaught_exceptions,"na":___lock,"d":___resumeException,"H":___setErrNo,"ma":___syscall140,"G":___syscall146,"la":___syscall54,"ka":___syscall6,"F":___unlock,"E":_abort,"ja":_api_close_keyboard,"ia":_api_create_sound,"ha":_api_create_sound_float,"ga":_api_delete_sound,"fa":_api_draw_begin,"ea":_api_draw_belt,"D":_api_draw_blit,"da":_api_draw_clip_text,"w":_api_draw_end,"ca":_api_draw_text,"ba":_api_duplicate_sound,"aa":_api_exit_game,"C":_api_open_keyboard,"B":_api_play_sound,"$":_api_set_cursor,"_":_api_set_volume,"Z":_api_stop_sound,"Y":_api_websocket_closed,"X":_api_websocket_send,"W":_emscripten_asm_const_ii,"V":_emscripten_get_heap_size,"U":_emscripten_memcpy_big,"T":_emscripten_resize_heap,"p":_exit,"S":_exit_error,"v":_get_file_contents,"R":_get_file_size,"Q":_llvm_eh_typeid_for,"P":_llvm_trap,"O":_put_file_contents,"N":_remove_file,"x":_time,"M":abortOnCannotGrowMemory,"a":DYNAMICTOP_PTR};var asm=Module["asm"](asmGlobalArg,asmLibraryArg,buffer);Module["asm"]=asm;var _DApi_AllocPacket=Module["_DApi_AllocPacket"]=function(){return Module["asm"]["sa"].apply(null,arguments)};var _DApi_Char=Module["_DApi_Char"]=function(){return Module["asm"]["ta"].apply(null,arguments)};var _DApi_Init=Module["_DApi_Init"]=function(){return Module["asm"]["ua"].apply(null,arguments)};var _DApi_Key=Module["_DApi_Key"]=function(){return Module["asm"]["va"].apply(null,arguments)};var _DApi_Mouse=Module["_DApi_Mouse"]=function(){return Module["asm"]["wa"].apply(null,arguments)};var _DApi_Render=Module["_DApi_Render"]=function(){return Module["asm"]["xa"].apply(null,arguments)};var _DApi_SyncText=Module["_DApi_SyncText"]=function(){return Module["asm"]["ya"].apply(null,arguments)};var _SNet_InitWebsocket=Module["_SNet_InitWebsocket"]=function(){return Module["asm"]["za"].apply(null,arguments)};var __ZSt18uncaught_exceptionv=Module["__ZSt18uncaught_exceptionv"]=function(){return Module["asm"]["Aa"].apply(null,arguments)};var ___cxa_can_catch=Module["___cxa_can_catch"]=function(){return Module["asm"]["Ba"].apply(null,arguments)};var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=function(){return Module["asm"]["Ca"].apply(null,arguments)};var ___em_js__api_close_keyboard=Module["___em_js__api_close_keyboard"]=function(){return Module["asm"]["Da"].apply(null,arguments)};var ___em_js__api_create_sound=Module["___em_js__api_create_sound"]=function(){return Module["asm"]["Ea"].apply(null,arguments)};var ___em_js__api_create_sound_float=Module["___em_js__api_create_sound_float"]=function(){return Module["asm"]["Fa"].apply(null,arguments)};var ___em_js__api_delete_sound=Module["___em_js__api_delete_sound"]=function(){return Module["asm"]["Ga"].apply(null,arguments)};var ___em_js__api_draw_begin=Module["___em_js__api_draw_begin"]=function(){return Module["asm"]["Ha"].apply(null,arguments)};var ___em_js__api_draw_belt=Module["___em_js__api_draw_belt"]=function(){return Module["asm"]["Ia"].apply(null,arguments)};var ___em_js__api_draw_blit=Module["___em_js__api_draw_blit"]=function(){return Module["asm"]["Ja"].apply(null,arguments)};var ___em_js__api_draw_clip_text=Module["___em_js__api_draw_clip_text"]=function(){return Module["asm"]["Ka"].apply(null,arguments)};var ___em_js__api_draw_end=Module["___em_js__api_draw_end"]=function(){return Module["asm"]["La"].apply(null,arguments)};var ___em_js__api_draw_text=Module["___em_js__api_draw_text"]=function(){return Module["asm"]["Ma"].apply(null,arguments)};var ___em_js__api_duplicate_sound=Module["___em_js__api_duplicate_sound"]=function(){return Module["asm"]["Na"].apply(null,arguments)};var ___em_js__api_exit_game=Module["___em_js__api_exit_game"]=function(){return Module["asm"]["Oa"].apply(null,arguments)};var ___em_js__api_open_keyboard=Module["___em_js__api_open_keyboard"]=function(){return Module["asm"]["Pa"].apply(null,arguments)};var ___em_js__api_play_sound=Module["___em_js__api_play_sound"]=function(){return Module["asm"]["Qa"].apply(null,arguments)};var ___em_js__api_set_cursor=Module["___em_js__api_set_cursor"]=function(){return Module["asm"]["Ra"].apply(null,arguments)};var ___em_js__api_set_volume=Module["___em_js__api_set_volume"]=function(){return Module["asm"]["Sa"].apply(null,arguments)};var ___em_js__api_stop_sound=Module["___em_js__api_stop_sound"]=function(){return Module["asm"]["Ta"].apply(null,arguments)};var ___em_js__api_websocket_closed=Module["___em_js__api_websocket_closed"]=function(){return Module["asm"]["Ua"].apply(null,arguments)};var ___em_js__api_websocket_send=Module["___em_js__api_websocket_send"]=function(){return Module["asm"]["Va"].apply(null,arguments)};var ___em_js__exit_error=Module["___em_js__exit_error"]=function(){return Module["asm"]["Wa"].apply(null,arguments)};var ___em_js__get_file_contents=Module["___em_js__get_file_contents"]=function(){return Module["asm"]["Xa"].apply(null,arguments)};var ___em_js__get_file_size=Module["___em_js__get_file_size"]=function(){return Module["asm"]["Ya"].apply(null,arguments)};var ___em_js__put_file_contents=Module["___em_js__put_file_contents"]=function(){return Module["asm"]["Za"].apply(null,arguments)};var ___em_js__remove_file=Module["___em_js__remove_file"]=function(){return Module["asm"]["_a"].apply(null,arguments)};var ___em_js__show_alert=Module["___em_js__show_alert"]=function(){return Module["asm"]["$a"].apply(null,arguments)};var ___em_js__trace_pop=Module["___em_js__trace_pop"]=function(){return Module["asm"]["ab"].apply(null,arguments)};var ___em_js__trace_push=Module["___em_js__trace_push"]=function(){return Module["asm"]["bb"].apply(null,arguments)};var _free=Module["_free"]=function(){return Module["asm"]["cb"].apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return Module["asm"]["db"].apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return Module["asm"]["eb"].apply(null,arguments)};var globalCtors=Module["globalCtors"]=function(){return Module["asm"]["ub"].apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return Module["asm"]["vb"].apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return Module["asm"]["wb"].apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return Module["asm"]["fb"].apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return Module["asm"]["gb"].apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return Module["asm"]["hb"].apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return Module["asm"]["ib"].apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return Module["asm"]["jb"].apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return Module["asm"]["kb"].apply(null,arguments)};var dynCall_ji=Module["dynCall_ji"]=function(){return Module["asm"]["lb"].apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return Module["asm"]["mb"].apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return Module["asm"]["nb"].apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return Module["asm"]["ob"].apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return Module["asm"]["pb"].apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return Module["asm"]["qb"].apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return Module["asm"]["rb"].apply(null,arguments)};var dynCall_viiiiiii=Module["dynCall_viiiiiii"]=function(){return Module["asm"]["sb"].apply(null,arguments)};var dynCall_viji=Module["dynCall_viji"]=function(){return Module["asm"]["tb"].apply(null,arguments)};Module["asm"]=asm;Module["then"]=function(func){if(Module["calledRun"]){func(Module)}else{var old=Module["onRuntimeInitialized"];Module["onRuntimeInitialized"]=function(){if(old)old();func(Module)}}return Module};function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}Module["noExitRuntime"]=true;run();Module["ready"]=new Promise(function(resolve,reject){delete Module["then"];Module["onAbort"]=function(what){reject(what)};addOnPostRun(function(){resolve(Module)})}); - - - - return DiabloSpawn; + return DiabloSpawn } ); })(); if (typeof exports === 'object' && typeof module === 'object') - module.exports = DiabloSpawn; - else if (typeof define === 'function' && define['amd']) - define([], function() { return DiabloSpawn; }); - else if (typeof exports === 'object') - exports["DiabloSpawn"] = DiabloSpawn; - \ No newline at end of file + module.exports = DiabloSpawn; + else if (typeof define === 'function' && define['amd']) + define([], function() { return DiabloSpawn; }); + else if (typeof exports === 'object') + exports["DiabloSpawn"] = DiabloSpawn; + \ No newline at end of file diff --git a/src/api/DiabloSpawn.wasm b/src/api/DiabloSpawn.wasm index b865948..4d8f16c 100644 Binary files a/src/api/DiabloSpawn.wasm and b/src/api/DiabloSpawn.wasm differ diff --git a/src/api/game.worker.js b/src/api/game.worker.js index a157d13..d9d80bd 100644 --- a/src/api/game.worker.js +++ b/src/api/game.worker.js @@ -3,7 +3,6 @@ import DiabloModule from './Diablo.jscc'; import SpawnBinary from './DiabloSpawn.wasm'; import SpawnModule from './DiabloSpawn.jscc'; import axios from 'axios'; -import websocket_open from './websocket'; const DiabloSize = 1316452; const SpawnSize = 1196648; @@ -17,7 +16,6 @@ let files = null; let renderBatch = null; let drawBelt = null; let is_spawn = false; -let websocket = null; const ChunkSize = 1 << 20; class RemoteFile { @@ -118,13 +116,8 @@ const DApi = { worker.postMessage({action: "keyboard", rect: null}); }, - websocket_send(data) { - if (websocket) { - websocket.send(data); - } - }, websocket_closed() { - return !websocket || websocket.readyState !== WebSocket.OPEN; + return false; }, }; @@ -239,21 +232,22 @@ let maxSoundId = 0, maxBatchId = 0; } }); +let packetBatch = null; +DApi.websocket_send = function(data) { + if (packetBatch) { + packetBatch.push(data.slice().buffer); + } else { + worker.postMessage({action: "packet", buffer: data}); + } +}; + worker.DApi = DApi; let wasm = null; -function call_api(func, ...params) { +function try_api(func) { try { - audioBatch = []; - audioTransfer = []; - wasm["_" + func](...params); - if (audioBatch.length) { - maxSoundId = maxBatchId; - worker.postMessage({action: "audioBatch", batch: audioBatch}, audioTransfer); - audioBatch = null; - audioTransfer = null; - } + func(); } catch (e) { if (typeof e === "string") { worker.postMessage({action: ""}) @@ -262,6 +256,25 @@ function call_api(func, ...params) { } } +function call_api(func, ...params) { + try_api(() => { + audioBatch = []; + audioTransfer = []; + packetBatch = []; + wasm["_" + func](...params); + if (audioBatch.length) { + maxSoundId = maxBatchId; + worker.postMessage({action: "audioBatch", batch: audioBatch}, audioTransfer); + } + if (packetBatch.length) { + worker.postMessage({action: "packetBatch", batch: packetBatch}, packetBatch); + } + audioBatch = null; + audioTransfer = null; + packetBatch = null; + }); +} + function progress(text, loaded, total) { worker.postMessage({action: "progress", text, loaded, total}); } @@ -293,7 +306,7 @@ async function initWasm(spawn, progress) { return result; } -async function init_game(mpq, spawn, offscreen, serverUrl) { +async function init_game(mpq, spawn, offscreen) { is_spawn = spawn; if (offscreen) { canvas = new OffscreenCanvas(640, 480); @@ -312,16 +325,6 @@ async function init_game(mpq, spawn, offscreen, serverUrl) { } } - if (serverUrl) { - progress("Connecting..."); - websocket = await websocket_open(serverUrl, data => { - if (wasm) { - const ptr = wasm._DApi_AllocPacket(data.byteLength); - wasm.HEAPU8.set(new Uint8Array(data), ptr); - } - }); - } - progress("Loading..."); let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = (spawn ? SpawnSize : DiabloSize); const wasmWeight = 5; @@ -346,9 +349,7 @@ async function init_game(mpq, spawn, offscreen, serverUrl) { const vers = process.env.VERSION.match(/(\d+)\.(\d+)\.(\d+)/); - if (websocket) { - wasm._SNet_InitWebsocket(); - } + wasm._SNet_InitWebsocket(); wasm._DApi_Init(Math.floor(performance.now()), offscreen ? 1 : 0, parseInt(vers[1]), parseInt(vers[2]), parseInt(vers[3])); setInterval(() => { @@ -360,13 +361,27 @@ worker.addEventListener("message", ({data}) => { switch (data.action) { case "init": files = data.files; - init_game(data.mpq, data.spawn, data.offscreen, data.websocket).then( + init_game(data.mpq, data.spawn, data.offscreen).then( () => worker.postMessage({action: "loaded"}), e => worker.postMessage({action: "failed", error: e.toString(), stack: e.stack})); break; case "event": call_api(data.func, ...data.params); break; + case "packet": + try_api(() => { + const ptr = wasm._DApi_AllocPacket(data.buffer.byteLength); + wasm.HEAPU8.set(new Uint8Array(data.buffer), ptr); + }); + break; + case "packetBatch": + try_api(() => { + for (let packet of data.batch) { + const ptr = wasm._DApi_AllocPacket(packet.byteLength); + wasm.HEAPU8.set(new Uint8Array(packet), ptr); + } + }); + break; default: } }); diff --git a/src/api/loader.js b/src/api/loader.js index f87fe4e..cc92b34 100644 --- a/src/api/loader.js +++ b/src/api/loader.js @@ -1,6 +1,7 @@ import Worker from './game.worker.js'; import init_sound from './sound'; import load_spawn from './load_spawn'; +import webrtc_open from './webrtc'; function onRender(api, ctx, {bitmap, images, text, clip, belt}) { if (bitmap) { @@ -65,6 +66,12 @@ async function do_load_game(api, audio, mpq, spawn) { return await new Promise((resolve, reject) => { try { const worker = new Worker(); + + let packetQueue = []; + const webrtc = webrtc_open(data => { + packetQueue.push(data); + }); + worker.addEventListener("message", ({data}) => { switch (data.action) { case "loaded": @@ -106,14 +113,28 @@ async function do_load_game(api, audio, mpq, spawn) { case "current_save": api.setCurrentSave(data.name); break; + case "packet": + webrtc.send(data.buffer); + break; + case "packetBatch": + for (let packet of data.batch) { + webrtc.send(packet); + } + break; default: } - }); + }); const transfer= []; for (let [, file] of fs.files) { transfer.push(file.buffer); } - worker.postMessage({action: "init", files: fs.files, mpq, spawn, offscreen, websocket: window.gameServer}, transfer); + worker.postMessage({action: "init", files: fs.files, mpq, spawn, offscreen}, transfer); + setInterval(() => { + if (packetQueue.length) { + worker.postMessage({action: "packetBatch", batch: packetQueue}, packetQueue); + packetQueue.length = 0; + } + }, 20); delete fs.files; } catch (e) { reject(e); diff --git a/src/api/sound.js b/src/api/sound.js index 02a4c95..8e1fab7 100644 --- a/src/api/sound.js +++ b/src/api/sound.js @@ -17,6 +17,7 @@ function decodeAudioData(context, buffer) { export default function init_sound() { const AudioContext = window.AudioContext || window.webkitAudioContext; + const StereoPannerNode = window.StereoPannerNode || window.webkitAudioPannerNode; if (!AudioContext) { return no_sound(); } @@ -40,7 +41,7 @@ export default function init_sound() { sounds.set(id, { buffer: Promise.resolve(buffer), gain: context.createGain(), - panner: new StereoPannerNode(context, {pan: 0}), + panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}), }); }, create_sound(id, data) { @@ -51,7 +52,7 @@ export default function init_sound() { sounds.set(id, { buffer, gain: context.createGain(), - panner: new StereoPannerNode(context, {pan: 0}), + panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}), }); }, duplicate_sound(id, srcId) { @@ -65,7 +66,7 @@ export default function init_sound() { sounds.set(id, { buffer: src.buffer, gain: context.createGain(), - panner: new StereoPannerNode(context, {pan: 0}), + panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}), }); }, play_sound(id, volume, pan, loop) { @@ -76,12 +77,18 @@ export default function init_sound() { } src.gain.gain.value = Math.pow(2.0, volume / 1000.0); const relVolume = Math.pow(2.0, pan / 1000.0); - src.panner.pan.value = 1.0 - 2.0 / (1.0 + relVolume); + if (src.panner) { + src.panner.pan.value = 1.0 - 2.0 / (1.0 + relVolume); + } src.source = src.buffer.then(buffer => { const source = context.createBufferSource(); source.buffer = buffer; source.loop = !!loop; - source.connect(src.gain).connect(src.panner).connect(context.destination); + let node = source.connect(src.gain); + if (src.panner) { + node = node.connect(src.panner); + } + node.connect(context.destination); source.start(); return source; }); diff --git a/src/api/webrtc.js b/src/api/webrtc.js new file mode 100644 index 0000000..562c270 --- /dev/null +++ b/src/api/webrtc.js @@ -0,0 +1,469 @@ +import Peer from 'peerjs'; + +class buffer_reader { + constructor(buffer) { + this.buffer = (buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)); + this.pos = 0; + } + done() { + return this.pos === this.buffer.byteLength; + } + read8() { + if (this.pos >= this.buffer.byteLength) { + throw Error('packet too small'); + } + return this.buffer[this.pos++]; + } + read16() { + const {pos, buffer} = this; + if (pos + 2 > buffer.byteLength) { + throw Error('packet too small'); + } + const result = buffer[pos] | (buffer[pos + 1] << 8); + this.pos += 2; + return result; + } + read32() { + const {pos, buffer} = this; + if (pos + 4 > buffer.byteLength) { + throw Error('packet too small'); + } + const result = buffer[pos] | (buffer[pos + 1] << 8) | (buffer[pos + 2] << 16) | (buffer[pos + 3] << 24); + this.pos += 4; + return result; + } + read_str() { + const length = this.read8(); + const {pos, buffer} = this; + if (pos + length > buffer.byteLength) { + throw Error('packet too small'); + } + const result = String.fromCharCode(...buffer.subarray(pos, pos + length)); + this.pos += length; + return result; + } + rest() { + const result = this.buffer.subarray(this.pos); + this.pos = this.buffer.length; + return result; + } +} +class buffer_writer { + constructor(length) { + this.buffer = new Uint8Array(length); + this.pos = 0; + } + get result() { + return this.buffer.buffer; + } + write8(value) { + this.buffer[this.pos++] = value; + return this; + } + write16(value) { + const {pos, buffer} = this; + buffer[pos] = value; + buffer[pos + 1] = value >> 8; + this.pos += 2; + return this; + } + write32(value) { + const {pos, buffer} = this; + buffer[pos] = value; + buffer[pos + 1] = value >> 8; + buffer[pos + 2] = value >> 16; + buffer[pos + 3] = value >> 24; + this.pos += 4; + return this; + } + write_str(value) { + const length = value.length; + this.write8(length); + const {pos, buffer} = this; + for (let i = 0; i < length; ++i) { + buffer[pos + i] = value.charCodeAt(i); + } + this.pos += length; + return this; + } + rest(value) { + this.buffer.set(value, this.pos); + return this; + } +} + +const RejectionReason = { + JOIN_SUCCESS: 0x00, + JOIN_ALREADY_IN_GAME: 0x01, + JOIN_GAME_NOT_FOUND: 0x02, + JOIN_INCORRECT_PASSWORD: 0x03, + JOIN_VERSION_MISMATCH: 0x04, + JOIN_GAME_FULL: 0x05, + CREATE_GAME_EXISTS: 0x06, +}; + +const server_info_packet = { + code: 0x32, + read: reader => ({version: reader.read32()}), + write: ({version}) => new buffer_writer(5).write8(server_info_packet.code).write32(version).result, +}; +const server_game_list_packet = { + code: 0x21, + read: reader => { + const count = reader.read8(); + const games = []; + for (let i = 0; i < count; ++i) { + games.push({type: reader.read32(), name: reader.read_str()}); + } + return {games}; + }, + write: ({games}) => { + const writer = new buffer_writer(games.reduce((sum, {name}) => sum + 5 + name.length, 2)); + writer.write8(server_game_list_packet.code); + writer.write8(games.length); + for (let {code, name} of games) { + writer.write32(code); + writer.write_str(name); + } + return writer.result; + }, +}; +const server_join_accept_packet = { + code: 0x12, + read: reader => ({cookie: reader.read32(), index: reader.read8(), seed: reader.read32(), difficulty: reader.read32()}), + write: ({cookie, index, seed, difficulty}) => new buffer_writer(14).write8(server_join_accept_packet.code).write32(cookie).write8(index).write32(seed).write32(difficulty).result, +}; +const server_join_reject_packet = { + code: 0x15, + read: reader => ({cookie: reader.read32(), reason: reader.read8()}), + write: ({cookie, reason}) => new buffer_writer(6).write8(server_join_reject_packet.code).write32(cookie).write8(reason).result, +}; +const server_connect_packet = { + code: 0x13, + read: reader => ({id: reader.read8()}), + write: ({id}) => new buffer_writer(2).write8(server_connect_packet.code).write8(id).result, +}; +const server_disconnect_packet = { + code: 0x14, + read: reader => ({id: reader.read8(), reason: reader.read32()}), + write: ({id, reason}) => new buffer_writer(6).write8(server_disconnect_packet.code).write8(id).write32(reason).result, +}; +const server_message_packet = { + code: 0x01, + read: reader => ({id: reader.read8(), payload: reader.rest()}), + write: ({id, payload}) => new buffer_writer(2 + payload.byteLength).write8(server_message_packet.code).write8(id).rest(payload).result, +}; +const server_turn_packet = { + code: 0x02, + read: reader => ({id: reader.read8(), turn: reader.read32()}), + write: ({id, turn}) => new buffer_writer(6).write8(server_turn_packet.code).write8(id).write32(turn).result, +}; + +const client_info_packet = { + code: 0x31, + read: reader => ({version: reader.read32()}), + write: ({version}) => new buffer_writer(5).write8(client_info_packet.code).write32(version).result, +}; +const client_game_list_packet = { + code: 0x21, + read: () => ({}), + write: () => new buffer_writer(1).write8(client_game_list_packet.code).result, +}; +const client_create_game_packet = { + code: 0x22, + read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str(), difficulty: reader.read32()}), + write: ({cookie, name, password, difficulty}) => new buffer_writer(11 + name.length + password.length) + .write8(client_create_game_packet.code).write32(cookie).write_str(name).write_str(password).write32(difficulty).result, +}; +const client_join_game_packet = { + code: 0x23, + read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str()}), + write: ({cookie, name, password}) => new buffer_writer(7 + name.length + password.length) + .write8(client_join_game_packet.code).write32(cookie).write_str(name).write_str(password).result, +}; +const client_leave_game_packet = { + code: 0x24, + read: () => ({}), + write: () => new buffer_writer(1).write8(client_leave_game_packet.code).result, +}; +const client_drop_player_packet = { + code: 0x03, + read: reader => ({id: reader.read8(), reason: reader.read32()}), + write: ({id, reason}) => new buffer_writer(6).write8(client_drop_player_packet.code).write8(id).write32(reason).result, +}; +const client_message_packet = { + code: 0x01, + read: reader => ({id: reader.read8(), payload: reader.rest()}), + write: ({id, payload}) => new buffer_writer(2 + payload.byteLength).write8(client_message_packet.code).write8(id).rest(payload).result, +}; +const client_turn_packet = { + code: 0x02, + read: reader => ({turn: reader.read32()}), + write: ({turn}) => new buffer_writer(5).write8(client_turn_packet.code).write32(turn).result, +}; + +const PeerID = name => `diabloweb_${name}`; +const MAX_PLRS = 4; + +class webrtc_server { + constructor(version, {cookie, name, password, difficulty}, onMessage, onClose) { + this.version = version; + this.name = name; + this.password = password; + this.difficulty = difficulty; + this.onMessage = onMessage; + this.onClose = onClose; + + this.peer = new Peer(PeerID(name)); + this.peer.on('connection', conn => this.onConnect(conn)); + this.players = []; + this.myplr = 0; + + this.seed = Math.floor(Math.random() * Math.pow(2, 32)); + + const onError = () => { + onMessage(server_join_reject_packet.write({cookie, reason: RejectionReason.CREATE_GAME_EXISTS})); + onClose(); + this.peer.off('error', onError); + this.peer.off('open', onOpen); + }; + const onOpen = () => { + onMessage(server_join_accept_packet.write({cookie, index: 0, seed: this.seed, difficulty})); + onMessage(server_connect_packet.write({id: 0})); + this.peer.off('error', onError); + this.peer.off('open', onOpen); + }; + this.peer.on('error', onError); + this.peer.on('open', onOpen); + } + + onConnect(conn) { + const peer = {conn}; + conn.on('data', packet => { + const reader = new buffer_reader(packet); + const code = reader.read8(); + let pkt; + switch (code) { + case client_info_packet.code: + pkt = client_info_packet.read(reader); + peer.version = pkt.version; + break; + case client_join_game_packet.code: + pkt = client_join_game_packet.read(reader); + if (peer.version !== this.version) { + conn.send(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_VERSION_MISMATCH})); + } else if (pkt.name !== this.name) { + conn.send(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND})); + } else if (pkt.password !== this.password) { + conn.send(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_INCORRECT_PASSWORD})); + } else { + let i = 1; + while (i < MAX_PLRS && this.players[i]) { + ++i; + } + if (i >= MAX_PLRS) { + conn.send(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_FULL})); + } else { + this.players[i] = peer; + peer.id = i; + conn.send(server_join_accept_packet.write({cookie: pkt.cookie, index: i, seed: this.seed, difficulty: this.difficulty})); + this.send(0xFF, server_connect_packet.write({id: i})); + } + } + break; + default: + if (peer.id != null) { + this.handle(peer.id, code, reader); + } else { + return; + } + } + if (!reader.done()) { + throw Error('packet too large'); + } + }); + conn.on('close', () => { + if (peer.id != null) { + this.drop(peer.id, 0x40000006); + } + }); + } + + send(mask, pkt) { + for (let i = 1; i < MAX_PLRS; ++i) { + if ((mask & (1 << i)) && this.players[i]) { + if (this.players[i].conn) { + this.players[i].conn.send(pkt); + } + } + } + // self last since it will destroy the buffer + if (mask & 1) { + this.onMessage(pkt); + } + } + + drop(id, reason) { + if (id === 0) { + for (let i = 1; i < MAX_PLRS; ++i) { + this.drop(i, 0x40000006); + } + this.onMessage(server_disconnect_packet.write({id, reason})); + this.peer.destroy(); + this.onClose(); + } else if (this.players[id]) { + this.send(0xFF, server_disconnect_packet.write({id, reason})); + this.players[id].id = null; + if (this.players[id].conn) { + this.players[id].conn.close(); + } + this.players[id] = null; + } + } + + handle(id, code, reader) { + let pkt; + switch (code) { + case client_leave_game_packet.code: + pkt = client_leave_game_packet.read(reader); + this.drop(id, 3); + break; + case client_drop_player_packet.code: + pkt = client_drop_player_packet.read(reader); + this.drop(pkt.id, pkt.reason); + break; + case client_message_packet.code: + pkt = client_message_packet.read(reader); + this.send(pkt.id === 0xFF ? ~(1 << id) : (1 << pkt.id), server_message_packet.write({id, payload: pkt.payload})); + break; + case client_turn_packet.code: + pkt = client_turn_packet.read(reader); + this.send(~(1 << id), server_turn_packet.write({id, turn: pkt.turn})); + break; + default: + throw Error(`invalid packet ${code}`); + } + } +} + +class webrtc_client { + pending = []; + + constructor(version, {cookie, name, password}, onMessage, onClose) { + this.peer = new Peer(); + this.conn = this.peer.connect(PeerID(name)); + + const unreg = () => { + this.peer.off('error', onError); + this.conn.off('error', onError); + this.conn.off('open', onOpen); + clearTimeout(timeout); + }; + const onError = () => { + onMessage(server_join_reject_packet.write({cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND})); + onClose(); + unreg(); + }; + const onOpen = () => { + unreg(); + this.conn.send(client_info_packet.write({version})); + this.conn.send(client_join_game_packet.write({cookie, name, password})); + for (let pkt of this.pending) { + this.conn.send(pkt); + } + this.pending = null; + }; + const timeout = setTimeout(onError, 5000); + this.peer.on('error', onError); + this.conn.on('error', onError); + this.conn.on('open', onOpen); + + this.conn.on('data', data => { + const reader = new buffer_reader(data); + const code = reader.read8(); + let pkt; + switch (code) { + case server_join_accept_packet.code: + pkt = server_join_accept_packet.read(reader); + this.myplr = pkt.index; + break; + case server_join_reject_packet.code: + onClose(); + break; + case server_disconnect_packet.code: + pkt = server_disconnect_packet.read(reader); + if (pkt.id === 'myplr') { + onClose(); + } + break; + default: + } + onMessage(data); + }); + this.conn.on('close', data => { + onClose(); + }); + } + + send(packet) { + if (this.pending) { + this.pending.push(packet); + } else { + this.conn.send(packet); + } + } +} + +export default function webrtc_open(onMessage) { + let server = null, client = null; + + let version = 0; + + return { + send: function(packet) { + const reader = new buffer_reader(packet); + const code = reader.read8(); + let pkt; + switch (code) { + case client_info_packet.code: + pkt = client_info_packet.read(reader); + version = pkt.version; + break; + case client_create_game_packet.code: + pkt = client_create_game_packet.read(reader); + if (server || client) { + onMessage(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME})); + } else { + server = new webrtc_server(version, pkt, onMessage, () => server = null); + } + break; + case client_join_game_packet.code: + pkt = client_join_game_packet.read(reader); + if (server || client) { + onMessage(server_join_reject_packet.write({cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME})); + } else { + client = new webrtc_client(version, pkt, onMessage, () => client = null); + } + break; + default: + if (server) { + server.handle(0, code, reader); + if (pkt === client_leave_game_packet.code) { + server = null; + } + } else if (client) { + client.send(packet); + if (pkt === client_leave_game_packet.code) { + client = null; + } + return; + } else { + throw Error(`invalid packet ${code}`); + } + } + if (!reader.done()) { + throw Error('packet too large'); + } + }, + }; +}