diff --git a/asset-manifest.json b/asset-manifest.json index 9a200fa..604c2c5 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -3,8 +3,8 @@ "static/js/0.aaa06a1e.chunk.js": "/diabloweb/static/js/0.aaa06a1e.chunk.js", "static/js/0.aaa06a1e.chunk.js.map": "/diabloweb/static/js/0.aaa06a1e.chunk.js.map", "main.css": "/diabloweb/static/css/main.fe873d2c.chunk.css", - "main.js": "/diabloweb/static/js/main.3c2a83da.chunk.js", - "main.js.map": "/diabloweb/static/js/main.3c2a83da.chunk.js.map", + "main.js": "/diabloweb/static/js/main.62369ba5.chunk.js", + "main.js.map": "/diabloweb/static/js/main.62369ba5.chunk.js.map", "runtime~main.js": "/diabloweb/static/js/runtime~main.bf17ce54.js", "runtime~main.js.map": "/diabloweb/static/js/runtime~main.bf17ce54.js.map", "runtime~storage.js": "/diabloweb/static/js/runtime~storage.83a78cef.js", @@ -18,7 +18,7 @@ "b6959098d798174bd69f.worker.js": "/diabloweb/b6959098d798174bd69f.worker.js", "b6959098d798174bd69f.worker.js.map": "/diabloweb/b6959098d798174bd69f.worker.js.map", "index.html": "/diabloweb/index.html", - "precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js": "/diabloweb/precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js", + "precache-manifest.457140d01593ad0a7e968f24ae827c55.js": "/diabloweb/precache-manifest.457140d01593ad0a7e968f24ae827c55.js", "service-worker.js": "/diabloweb/service-worker.js", "static/css/main.fe873d2c.chunk.css.map": "/diabloweb/static/css/main.fe873d2c.chunk.css.map", "static/media/Diablo.wasm": "/diabloweb/static/media/Diablo.570bd59a.wasm", diff --git a/index.html b/index.html index 66358d6..9be69ea 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -DIABLO
\ No newline at end of file +DIABLO
\ No newline at end of file diff --git a/precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js b/precache-manifest.457140d01593ad0a7e968f24ae827c55.js similarity index 90% rename from precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js rename to precache-manifest.457140d01593ad0a7e968f24ae827c55.js index 05e396c..f691b65 100644 --- a/precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js +++ b/precache-manifest.457140d01593ad0a7e968f24ae827c55.js @@ -8,11 +8,11 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/diabloweb/b6959098d798174bd69f.worker.js" }, { - "revision": "0fef2be252d2a59bf896a9a3c9a9fa92", + "revision": "aa5990b26ec2af1a052ce9dbf9838e37", "url": "/diabloweb/index.html" }, { - "revision": "c514188fba2a04706043", + "revision": "4bfb1f4cbbd7e8ddffcd", "url": "/diabloweb/static/css/main.fe873d2c.chunk.css" }, { @@ -24,8 +24,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/diabloweb/static/js/5.430d8c5c.chunk.js" }, { - "revision": "c514188fba2a04706043", - "url": "/diabloweb/static/js/main.3c2a83da.chunk.js" + "revision": "4bfb1f4cbbd7e8ddffcd", + "url": "/diabloweb/static/js/main.62369ba5.chunk.js" }, { "revision": "077fe45e700d7971de0b", diff --git a/service-worker.js b/service-worker.js index 00f4b22..b9015b3 100644 --- a/service-worker.js +++ b/service-worker.js @@ -14,7 +14,7 @@ importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js"); importScripts( - "/diabloweb/precache-manifest.351efcb2207d9463cb1b985bab07e6a2.js" + "/diabloweb/precache-manifest.457140d01593ad0a7e968f24ae827c55.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.3c2a83da.chunk.js.map b/static/js/main.3c2a83da.chunk.js.map deleted file mode 100644 index 06e9d9b..0000000 --- a/static/js/main.3c2a83da.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["fs.js","api/game.worker.js","mpqcmp/mpqcmp.worker.js","mpqcmp/MpqCmp.wasm","mpqcmp/ListFile.txt","../node_modules/peerjs/dist sync","serviceWorker.js","api/explode.js","api/codec.js","api/savefile.js","api/sound.js","api/load_spawn.js","api/packet.js","api/webrtc.js","api/loader.js","mpqcmp/compress.js","mpqcmp/index.js","App.js","index.js"],"names":["downloadFile","_callee","store","name","file","blob","url","lnk","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default","a","wrap","_context","prev","next","get","toLowerCase","sent","Blob","type","URL","createObjectURL","document","createElement","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","console","error","concat","stop","downloadSaves","_callee2","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","_context2","undefined","keys","t0","Symbol","iterator","done","value","match","t1","return","finish","readFile","Promise","resolve","reject","reader","FileReader","onload","result","onerror","onabort","readAsArrayBuffer","uploadFile","_callee3","files","data","_context3","Uint8Array","set","abrupt","create_fs","_x7","_create_fs","apply","this","arguments","_callee5","load","_i","_Object$entries","_ref3","_ref2","_context5","IdbKvStore","Map","Object","json","entries","call","length","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","window","DownloadFile","DownloadSaves","update","delete","remove","clear","download","upload","fileUrl","_fileUrl","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__","mark","_callee4","_context4","_x8","t2","module","exports","Worker","__webpack_require__","p","webpackEmptyContext","req","e","Error","code","id","isLocalhost","Boolean","location","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","log","onUpdate","onSuccess","catch","CMP_BINARY","CMP_ASCII","CMP_NO_ERROR","CMP_INVALID_DICTSIZE","CMP_INVALID_MODE","CMP_BAD_DATA","CMP_ABORT","PKDCL_OK","PKDCL_STREAM_END","DistBits","DistCode","ExLenBits","LenBase","Uint16Array","LenBits","LenCode","ChBitsAsc","ChCodeAsc","GenDecodeTabs","positions","start_indexes","length_bits","elements","i","index","WasteBits","pWork","nBits","extra_bits","bit_buff","in_pos","in_bytes","read_buf","in_buff","DecodeLit","length_code","LengthCodes","extra_length_bits","extra_length","ctype","uncompressed_byte","offs2C34","offs2D34","offs2E34","offs2EB4","DecodeDist","rep_length","distance","dist_pos_code","DistPosCodes","dsize_bits","dsize_mask","explode","write_buf","buffer","ArrayBuffer","out_buff","pChCodeAsc","count","bits_asc","acc","add","GenAscTabs","next_literal","outputPos","minus_dist","target","source","subarray","copyWithin","Expand","W","Uint32Array","SHA1CircularShift","shift","SHA1","classCallCheck","digest","digest8","u8","u32","byteOffset","input","A","B","C","D","E","temp","Random","seed","codec_decode","password","size","last_size","sha","rand","key","k32","pw","charCodeAt","input8","codec_init_key","size32","data32","buf32","buf","j","pkzip_decompress","out_size","output","out_pos","dst","Math","min","src","hashtable","b","decrypt","decrypt8","encrypt","orig","hash","seed1","seed2","ch","path_name","pos","max","lastIndexOf","substring","Flags","MpqReader","byteLength","readHeader","createClass","sizeId","hashOffset","blockOffset","hashCount","blockCount","hashTable","readTable","blockTable","blockSize","offset","slice","keyA","keyB","fileIndex","block","info","filePos","cmpSize","fileSize","flags","raw","readRaw","numBlocks","floor","tableSize","blocks","oPos","uSize","tmp","init_sound","AudioContext","webkitAudioContext","StereoPannerNode","create_sound","duplicate_sound","play_sound","set_volume","stop_sound","delete_sound","context","sounds","create_sound_raw","channels","rate","createBuffer","getChannelData","gain","createGain","panner","pan","decodeAudioData","srcId","volume","loop","pow","relVolume","createBufferSource","node","connect","destination","start","stop_all","sound","slicedToArray","err","SpawnSizes","load_spawn","_x","_x2","_load_spawn","api","fs","spawn","regenerator_default","includes","axios","request","process","responseType","onDownloadProgress","onProgress","text","loaded","total","headers","Cache-Control","buffer_reader","read8","String","fromCharCode","toConsumableArray","read32","buffer_writer","write8","write32","rest","RejectionReason","JOIN_SUCCESS","JOIN_ALREADY_IN_GAME","JOIN_GAME_NOT_FOUND","JOIN_INCORRECT_PASSWORD","JOIN_VERSION_MISMATCH","JOIN_GAME_FULL","CREATE_GAME_EXISTS","read_packet","types","cls","values","find","packet","read","packet_size","write_packet","write","make_batch","read16","packets","push","reduce","sum","_ref","writer","write16","server_packet","version","_ref4","game_list","games","read_str","_ref5","_ref6","_ref7","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_ref9","write_str","join_accept","cookie","difficulty","_ref10","join_reject","reason","_ref11","_ref12","disconnect","_ref13","message","payload","_ref14","_ref15","turn","_ref16","batch","client_packet","_ref17","create_game","_ref18","_ref19","join_game","_ref20","_ref21","leave_game","drop_player","_ref22","_ref23","_ref24","_ref25","PeerID","Options","host","port","secure","webrtc_server","onMessage","onClose","_this","peer","Peer","on","conn","onConnect","players","myplr","random","onError","off","onOpen","setTimeout","_this2","_read_packet","pkt","send","handle","drop","mask","destroy","close","webrtc_client","_this3","pending","needUnreg","unreg","clearTimeout","timeout","_read_packet2","webrtc_open","server","client","_read_packet3","onRender","ctx","bitmap","images","clip","belt","transferFromImageBitmap","x","y","w","h","image","createImageData","putImageData","save","font","x0","y0","x1","y1","beginPath","rect","str","color","r","g","fillStyle","fillText","restore","updateBelt","audio","mpq","offscreen","canvas","getContext","alpha","worker","packetQueue","webrtc","addEventListener","action","func","_len","params","Array","_key","postMessage","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_ref8","setCursorPos","openKeyboard","stack","onExit","setCurrentSave","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","transfer","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","setInterval","load_game","do_load_game","MpqSize","ListSize","progress","loadFile","binary","_args","runWorker","objectSpread","updateProgress","loader","fHeader","fBinary","fList","header","header16","hashTablePos","blockTablePos","hashTableSize","blockTableSize","fHashTable","fBlockTable","list","listMap","hashStr","_name","NUM_TASKS","tasks","cSize","task","numFiles","_loop","_i2","_tasks","_loop2","_i3","_tasks2","outputSize","blockPos","_i4","_tasks3","_task","_task$result","_i5","weight","ready","MpqBinary","ListFile","t3","t4","t5","t6","trim","t7","split","map","filter","h1","h2","toString","padStart","t8","fLoad","all","t","forEach","run","res","fill","CompressMpq","parseFile","onDone","setState","props","compress","started","_x3","_x4","_compress","_this$state","react_default","className","href","onClick","style","width","round","htmlFor","accept","display","onChange","React","Component","reportLink","retail","searchParams","line","join","userAgent","ReactGA","initialize","pageview","TOUCH_MOVE","TOUCH_RMB","keyboardRule","styleSheets","sheet","cssRules","rule","CSSRule","MEDIA_RULE","conditionText","sub","selectorText","findKeyboardRule","Link","children","objectWithoutProperties","assign","rel","App","possibleConstructorReturn","getPrototypeOf","loading","dropping","has_spawn","cursorPos","touchControls","touchButtons","touchCtx","touchMods","touchBelt","maxKeyboard","onDrop","dataTransfer","items","kind","getAsFile","getDropFile","preventDefault","compressMpq","onDragEnter","setDropping","onDragOver","isDropFile","onDragLeave","showSaves","save_names","updateSaves","show_saves","onResize","exitPointerLock","onPointerLockChange","screen","innerHeight","height","pointerLocked","game","onMouseMove","_this$mousePos","mousePos","eventMods","onMouseDown","keyboard","element","classList","_this$mousePos2","requestPointerLock","mouseButton","onMouseUp","_this$mousePos3","onKeyDown","keyCode","showKeyboard","clearKeySel","onMenu","onKeyUp","onKeyboard","onKeyboardInner","onKeyboardBlur","parseSave","touchButton","touchCanvas","onTouchStart","blur","updateTouchButton","touches","_this$mousePos4","onTouchMove","_this$mousePos5","onTouchEnd","prevTc","_this$mousePos6","setTouchMod","fullscreenElement","requestFullscreen","setCanvas","setElement","setKeyboard","setTouch0","setTouch_","bind","assertThisInitialized","setTouch1","setTouch2","setTouch3","setTouchBelt_","setTouch4","setTouch5","inc","asyncToGenerator","errorObject","saveName","mapStackTrace","left","toFixed","top","focus","transform","keyboardNum","_this4","getBoundingClientRect","right","bottom","reload","_this5","saves","hero","getPassword","nameEnd","indexOf","level","getPlayerName","_this6","confirm","idx","slot","drawImage","used","Set","has","drawBelt","_this7","removeEventListener","event","category","passive","capture","alert","pointerLockElement","mozPointerLockElement","movementX","movementY","clientX","clientY","button","shiftKey","ctrlKey","altKey","len","setSelectionRange","valid","maxValue","parseInt","use","toggle","now","performance","beltTime","release","_this8","touchOther","btn","identifier","stick","panPos","v","original","_ret","dx","dy","step","offsetHeight","abs","_this9","plrClass","index_es","icon","faDownload","downloadSave","faTimes","removeSave","mpqcmp_CompressMpq","ref","App_Link","_this$state2","classNames","touch","active","onBlur","spellCheck","renderUi","ReactDOM","render","src_App_0","getElementById","origin","fetch","response","contentType","status","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.3c2a83da.chunk.js","sourcesContent":["import IdbKvStore from 'idb-kv-store';\r\n\r\n/*const importStorage = () => new Promise((resolve, reject) => {\r\n let done = false;\r\n const frame = document.createElement('iframe');\r\n window.addEventListener('message', ({data}) => {\r\n if (data.method === 'storage' && !done) {\r\n done = true;\r\n resolve(data.files);\r\n frame.contentWindow.postMessage({method: 'clear'}, '*');\r\n }\r\n });\r\n frame.addEventListener('load', () => {\r\n frame.contentWindow.postMessage({method: 'transfer'}, '*');\r\n });\r\n frame.addEventListener('error', () => {\r\n if (!done) {\r\n done = true;\r\n resolve(null);\r\n }\r\n });\r\n frame.src = \"https://diablo.rivsoft.net/storage.html\";\r\n frame.style.display = \"none\";\r\n document.body.appendChild(frame);\r\n setTimeout(() => {\r\n if (!done) {\r\n done = true;\r\n resolve(null);\r\n }\r\n }, 10000);\r\n});*/\r\n\r\nasync function downloadFile(store, name) {\r\n const file = await store.get(name.toLowerCase());\r\n if (file) {\r\n const blob = new Blob([file], {type: 'binary/octet-stream'});\r\n const url = URL.createObjectURL(blob);\r\n const lnk = document.createElement('a');\r\n lnk.setAttribute('href', url);\r\n lnk.setAttribute('download', name);\r\n document.body.appendChild(lnk);\r\n lnk.click();\r\n document.body.removeChild(lnk);\r\n URL.revokeObjectURL(url);\r\n } else {\r\n console.error(`File ${name} does not exist`);\r\n }\r\n}\r\n\r\nasync function downloadSaves(store) {\r\n for (let name of await store.keys()) {\r\n if (name.match(/\\.sv$/i)) {\r\n downloadFile(store, name);\r\n }\r\n }\r\n}\r\n\r\nconst readFile = file => new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = () => reject(reader.error);\r\n reader.onabort = () => reject();\r\n reader.readAsArrayBuffer(file);\r\n});\r\nasync function uploadFile(store, files, file) {\r\n const data = new Uint8Array(await readFile(file));\r\n files.set(file.name.toLowerCase(), data);\r\n return store.set(file.name.toLowerCase(), data);\r\n}\r\n\r\nexport default async function create_fs(load) {\r\n try {\r\n const store = new IdbKvStore('diablo_fs');\r\n const files = new Map();\r\n for (let [name, data] of Object.entries(await store.json())) {\r\n files.set(name, data);\r\n }\r\n /*if (load) {\r\n const files = await importStorage();\r\n if (files) {\r\n for (let [name, data] of files) {\r\n files.set(name, data);\r\n store.set(name, data);\r\n }\r\n }\r\n }*/\r\n window.DownloadFile = name => downloadFile(store, name);\r\n window.DownloadSaves = () => downloadSaves(store);\r\n return {\r\n files,\r\n update: (name, data) => store.set(name, data),\r\n delete: name => store.remove(name),\r\n clear: () => store.clear(),\r\n download: name => downloadFile(store, name),\r\n upload: file => uploadFile(store, files, file),\r\n fileUrl: async name => {\r\n const file = await store.get(name.toLowerCase());\r\n if (file) {\r\n const blob = new Blob([file], {type: 'binary/octet-stream'});\r\n return URL.createObjectURL(blob);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n window.DownloadFile = () => console.error('IndexedDB is not supported');\r\n window.DownloadSaves = () => console.error('IndexedDB is not supported');\r\n return {\r\n files: new Map(),\r\n update: () => Promise.resolve(),\r\n delete: () => Promise.resolve(),\r\n clear: () => Promise.resolve(),\r\n download: () => Promise.resolve(),\r\n upload: () => Promise.resolve(),\r\n fileUrl: () => Promise.resolve(),\r\n };\r\n } \r\n}\r\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"b6959098d798174bd69f.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"559256dc812e37cc8bb5.worker.js\");\n};","module.exports = __webpack_public_path__ + \"static/media/MpqCmp.8aa3c6dc.wasm\";","module.exports = __webpack_public_path__ + \"static/media/ListFile.b370797d.txt\";","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 72;","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","export const CMP_BINARY = 0; // Binary compression\r\nexport const CMP_ASCII = 1; // Ascii compression\r\nexport const CMP_NO_ERROR = 0;\r\nexport const CMP_INVALID_DICTSIZE = 1;\r\nexport const CMP_INVALID_MODE = 2;\r\nexport const CMP_BAD_DATA = 3;\r\nexport const CMP_ABORT = 4;\r\nexport const CMP_IMPLODE_DICT_SIZE1 = 1024; // Dictionary size of 1024\r\nexport const CMP_IMPLODE_DICT_SIZE2 = 2048; // Dictionary size of 2048\r\nexport const CMP_IMPLODE_DICT_SIZE3 = 4096; // Dictionary size of 4096\r\n\r\nexport const PKDCL_OK = 0;\r\nexport const PKDCL_STREAM_END = 1; // All data from the input stream is read\r\nexport const PKDCL_NEED_DICT = 2; // Need more data (dictionary)\r\nexport const PKDCL_CONTINUE = 10; // Internal flag, not returned to user\r\nexport const PKDCL_GET_INPUT = 11; // Internal flag, not returned to user\r\n\r\nconst DistBits = new Uint8Array([\r\n 0x02, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\r\n 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\r\n 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\r\n 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08\r\n]);\r\n\r\nconst DistCode = new Uint8Array([\r\n 0x03, 0x0D, 0x05, 0x19, 0x09, 0x11, 0x01, 0x3E, 0x1E, 0x2E, 0x0E, 0x36, 0x16, 0x26, 0x06, 0x3A,\r\n 0x1A, 0x2A, 0x0A, 0x32, 0x12, 0x22, 0x42, 0x02, 0x7C, 0x3C, 0x5C, 0x1C, 0x6C, 0x2C, 0x4C, 0x0C,\r\n 0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08,\r\n 0xF0, 0x70, 0xB0, 0x30, 0xD0, 0x50, 0x90, 0x10, 0xE0, 0x60, 0xA0, 0x20, 0xC0, 0x40, 0x80, 0x00\r\n]);\r\n\r\nconst ExLenBits = new Uint8Array([\r\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08\r\n]);\r\n\r\nconst LenBase = new Uint16Array([\r\n 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,\r\n 0x0008, 0x000A, 0x000E, 0x0016, 0x0026, 0x0046, 0x0086, 0x0106\r\n]);\r\n\r\nconst LenBits = new Uint8Array([\r\n 0x03, 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07\r\n]);\r\n\r\nconst LenCode = new Uint8Array([\r\n 0x05, 0x03, 0x01, 0x06, 0x0A, 0x02, 0x0C, 0x14, 0x04, 0x18, 0x08, 0x30, 0x10, 0x20, 0x40, 0x00\r\n]);\r\n\r\nconst ChBitsAsc = new Uint8Array([\r\n 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x07, 0x0C, 0x0C, 0x07, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x04, 0x0A, 0x08, 0x0C, 0x0A, 0x0C, 0x0A, 0x08, 0x07, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x08,\r\n 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x0C, 0x0B, 0x07, 0x09, 0x0B,\r\n 0x0C, 0x06, 0x07, 0x06, 0x06, 0x05, 0x07, 0x08, 0x08, 0x06, 0x0B, 0x09, 0x06, 0x07, 0x06, 0x06,\r\n 0x07, 0x0B, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08, 0x09, 0x09, 0x0B, 0x08, 0x0B, 0x09, 0x0C, 0x08,\r\n 0x0C, 0x05, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x0B, 0x07, 0x05, 0x06, 0x05, 0x05,\r\n 0x06, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x08, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D,\r\n 0x0D, 0x0D, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D\r\n]);\r\n\r\nconst ChCodeAsc = new Uint16Array([\r\n 0x0490, 0x0FE0, 0x07E0, 0x0BE0, 0x03E0, 0x0DE0, 0x05E0, 0x09E0,\r\n 0x01E0, 0x00B8, 0x0062, 0x0EE0, 0x06E0, 0x0022, 0x0AE0, 0x02E0,\r\n 0x0CE0, 0x04E0, 0x08E0, 0x00E0, 0x0F60, 0x0760, 0x0B60, 0x0360,\r\n 0x0D60, 0x0560, 0x1240, 0x0960, 0x0160, 0x0E60, 0x0660, 0x0A60,\r\n 0x000F, 0x0250, 0x0038, 0x0260, 0x0050, 0x0C60, 0x0390, 0x00D8,\r\n 0x0042, 0x0002, 0x0058, 0x01B0, 0x007C, 0x0029, 0x003C, 0x0098,\r\n 0x005C, 0x0009, 0x001C, 0x006C, 0x002C, 0x004C, 0x0018, 0x000C,\r\n 0x0074, 0x00E8, 0x0068, 0x0460, 0x0090, 0x0034, 0x00B0, 0x0710,\r\n 0x0860, 0x0031, 0x0054, 0x0011, 0x0021, 0x0017, 0x0014, 0x00A8,\r\n 0x0028, 0x0001, 0x0310, 0x0130, 0x003E, 0x0064, 0x001E, 0x002E,\r\n 0x0024, 0x0510, 0x000E, 0x0036, 0x0016, 0x0044, 0x0030, 0x00C8,\r\n 0x01D0, 0x00D0, 0x0110, 0x0048, 0x0610, 0x0150, 0x0060, 0x0088,\r\n 0x0FA0, 0x0007, 0x0026, 0x0006, 0x003A, 0x001B, 0x001A, 0x002A,\r\n 0x000A, 0x000B, 0x0210, 0x0004, 0x0013, 0x0032, 0x0003, 0x001D,\r\n 0x0012, 0x0190, 0x000D, 0x0015, 0x0005, 0x0019, 0x0008, 0x0078,\r\n 0x00F0, 0x0070, 0x0290, 0x0410, 0x0010, 0x07A0, 0x0BA0, 0x03A0,\r\n 0x0240, 0x1C40, 0x0C40, 0x1440, 0x0440, 0x1840, 0x0840, 0x1040,\r\n 0x0040, 0x1F80, 0x0F80, 0x1780, 0x0780, 0x1B80, 0x0B80, 0x1380,\r\n 0x0380, 0x1D80, 0x0D80, 0x1580, 0x0580, 0x1980, 0x0980, 0x1180,\r\n 0x0180, 0x1E80, 0x0E80, 0x1680, 0x0680, 0x1A80, 0x0A80, 0x1280,\r\n 0x0280, 0x1C80, 0x0C80, 0x1480, 0x0480, 0x1880, 0x0880, 0x1080,\r\n 0x0080, 0x1F00, 0x0F00, 0x1700, 0x0700, 0x1B00, 0x0B00, 0x1300,\r\n 0x0DA0, 0x05A0, 0x09A0, 0x01A0, 0x0EA0, 0x06A0, 0x0AA0, 0x02A0,\r\n 0x0CA0, 0x04A0, 0x08A0, 0x00A0, 0x0F20, 0x0720, 0x0B20, 0x0320,\r\n 0x0D20, 0x0520, 0x0920, 0x0120, 0x0E20, 0x0620, 0x0A20, 0x0220,\r\n 0x0C20, 0x0420, 0x0820, 0x0020, 0x0FC0, 0x07C0, 0x0BC0, 0x03C0,\r\n 0x0DC0, 0x05C0, 0x09C0, 0x01C0, 0x0EC0, 0x06C0, 0x0AC0, 0x02C0,\r\n 0x0CC0, 0x04C0, 0x08C0, 0x00C0, 0x0F40, 0x0740, 0x0B40, 0x0340,\r\n 0x0300, 0x0D40, 0x1D00, 0x0D00, 0x1500, 0x0540, 0x0500, 0x1900,\r\n 0x0900, 0x0940, 0x1100, 0x0100, 0x1E00, 0x0E00, 0x0140, 0x1600,\r\n 0x0600, 0x1A00, 0x0E40, 0x0640, 0x0A40, 0x0A00, 0x1200, 0x0200,\r\n 0x1C00, 0x0C00, 0x1400, 0x0400, 0x1800, 0x0800, 0x1000, 0x0000 \r\n]);\r\n\r\n/**\r\n * @param {Uint8Array} positions [out] Table of positions\r\n * @param {Uint8Array} start_indexes Table of start indexes\r\n * @param {Uint8Array} length_bits Table of lengths. Each length is stored as number of bits\r\n * @param {number} elements Number of elements in start_indexes and length_bits\r\n */\r\nfunction GenDecodeTabs(positions, start_indexes, length_bits, elements) {\r\n for (let i = 0; i < elements; i++) {\r\n const length = 1 << length_bits[i]; // Get the length in bytes\r\n for (let index = start_indexes[i]; index < 0x100; index += length) {\r\n positions[index] = i;\r\n }\r\n }\r\n}\r\n\r\nfunction GenAscTabs(pWork) {\r\n let pChCodeAsc = 0xFF;\r\n\r\n for (let count = 0x00FF; pChCodeAsc >= 0; pChCodeAsc--, count--) {\r\n let bits_asc = pWork.ChBitsAsc[count];\r\n let acc;\r\n\r\n if (bits_asc <= 8) {\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc];\r\n\r\n do {\r\n pWork.offs2C34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n } else if ((acc = (ChCodeAsc[pChCodeAsc] & 0xFF)) !== 0) {\r\n pWork.offs2C34[acc] = 0xFF;\r\n\r\n if (ChCodeAsc[pChCodeAsc] & 0x3F) {\r\n bits_asc -= 4;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 4;\r\n do {\r\n pWork.offs2D34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n } else {\r\n bits_asc -= 6;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 6;\r\n do {\r\n pWork.offs2E34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x80);\r\n }\r\n } else {\r\n bits_asc -= 8;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 8;\r\n do {\r\n pWork.offs2EB4[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n }\r\n }\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Removes given number of bits in the bit buffer. New bits are reloaded from\r\n// the input buffer, if needed.\r\n// Returns: PKDCL_OK: Operation was successful\r\n// PKDCL_STREAM_END: There are no more bits in the input buffer\r\nfunction WasteBits(pWork, nBits) {\r\n // If number of bits required is less than number of (bits in the buffer) ?\r\n if (nBits <= pWork.extra_bits) {\r\n pWork.extra_bits -= nBits;\r\n pWork.bit_buff >>>= nBits;\r\n return PKDCL_OK;\r\n }\r\n\r\n // Load input buffer if necessary\r\n pWork.bit_buff >>= pWork.extra_bits;\r\n if (pWork.in_pos === pWork.in_bytes) {\r\n if ((pWork.in_bytes = pWork.read_buf(pWork.in_buff)) === 0) {\r\n return PKDCL_STREAM_END;\r\n }\r\n pWork.in_pos = 0;\r\n }\r\n\r\n // Update bit buffer\r\n pWork.bit_buff |= (pWork.in_buff[pWork.in_pos++] << 8);\r\n pWork.bit_buff >>>= (nBits - pWork.extra_bits);\r\n pWork.extra_bits = (pWork.extra_bits - nBits) + 8;\r\n return PKDCL_OK;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Decodes next literal from the input (compressed) data.\r\n// Returns : 0x000: One byte 0x00\r\n// 0x001: One byte 0x01\r\n// ...\r\n// 0x0FF: One byte 0xFF\r\n// 0x100: Repetition, length of 0x02 bytes\r\n// 0x101: Repetition, length of 0x03 bytes\r\n// ...\r\n// 0x304: Repetition, length of 0x206 bytes\r\n// 0x305: End of stream\r\n// 0x306: Error\r\nfunction DecodeLit(pWork) {\r\n if(pWork.bit_buff & 1) {\r\n // Remove one bit from the input data\r\n if(WasteBits(pWork, 1)) {\r\n return 0x306;\r\n }\r\n\r\n // The next 8 bits hold the index to the length code table\r\n let length_code = pWork.LengthCodes[pWork.bit_buff & 0xFF];\r\n\r\n // Remove the apropriate number of bits\r\n if(WasteBits(pWork, pWork.LenBits[length_code])) {\r\n return 0x306;\r\n }\r\n\r\n // Are there some extra bits for the obtained length code ?\r\n const extra_length_bits = pWork.ExLenBits[length_code];\r\n if(extra_length_bits !== 0) {\r\n const extra_length = pWork.bit_buff & ((1 << extra_length_bits) - 1);\r\n if(WasteBits(pWork, extra_length_bits)) {\r\n if((length_code + extra_length) != 0x10E) {\r\n return 0x306;\r\n }\r\n }\r\n length_code = pWork.LenBase[length_code] + extra_length;\r\n }\r\n\r\n // In order to distinguish uncompressed byte from repetition length,\r\n // we have to add 0x100 to the length.\r\n return length_code + 0x100;\r\n }\r\n\r\n // Remove one bit from the input data\r\n if(WasteBits(pWork, 1)) {\r\n return 0x306;\r\n }\r\n\r\n // If the binary compression type, read 8 bits and return them as one byte.\r\n if(pWork.ctype === CMP_BINARY) {\r\n const uncompressed_byte = pWork.bit_buff & 0xFF;\r\n\r\n if(WasteBits(pWork, 8)) {\r\n return 0x306;\r\n }\r\n return uncompressed_byte;\r\n }\r\n\r\n // When ASCII compression ...\r\n let value;\r\n if (pWork.bit_buff & 0xFF) {\r\n value = pWork.offs2C34[pWork.bit_buff & 0xFF];\r\n\r\n if (value == 0xFF) {\r\n if (pWork.bit_buff & 0x3F) {\r\n if (WasteBits(pWork, 4)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2D34[pWork.bit_buff & 0xFF];\r\n } else {\r\n if (WasteBits(pWork, 6)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2E34[pWork.bit_buff & 0x7F];\r\n }\r\n }\r\n } else {\r\n if(WasteBits(pWork, 8)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2EB4[pWork.bit_buff & 0xFF];\r\n }\r\n\r\n return WasteBits(pWork, pWork.ChBitsAsc[value]) ? 0x306 : value;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Decodes the distance of the repetition, backwards relative to the\r\n// current output buffer position\r\nfunction DecodeDist(pWork, rep_length) {\r\n // Next 2-8 bits in the input buffer is the distance position code\r\n const dist_pos_code = pWork.DistPosCodes[pWork.bit_buff & 0xFF];\r\n const dist_pos_bits = pWork.DistBits[dist_pos_code];\r\n if (WasteBits(pWork, dist_pos_bits)) {\r\n return 0;\r\n }\r\n\r\n let distance;\r\n if (rep_length === 2) {\r\n // If the repetition is only 2 bytes length,\r\n // then take 2 bits from the stream in order to get the distance\r\n distance = (dist_pos_code << 2) | (pWork.bit_buff & 0x03);\r\n if (WasteBits(pWork, 2)) {\r\n return 0;\r\n }\r\n } else {\r\n // If the repetition is more than 2 bytes length,\r\n // then take \"dsize_bits\" bits in order to get the distance\r\n distance = (dist_pos_code << pWork.dsize_bits) | (pWork.bit_buff & pWork.dsize_mask);\r\n if (WasteBits(pWork, pWork.dsize_bits)) {\r\n return 0;\r\n }\r\n }\r\n return distance + 1;\r\n}\r\n\r\nfunction Expand(pWork) {\r\n let outputPos = 0x1000; // Initialize output buffer position\r\n\r\n // Decode the next literal from the input data.\r\n // The returned literal can either be an uncompressed byte (next_literal < 0x100)\r\n // or an encoded length of the repeating byte sequence that\r\n // is to be copied to the current buffer position\r\n let result, next_literal;\r\n while ((result = next_literal = DecodeLit(pWork)) < 0x305) {\r\n // If the literal is greater than 0x100, it holds length\r\n // of repeating byte sequence\r\n // literal of 0x100 means repeating sequence of 0x2 bytes\r\n // literal of 0x101 means repeating sequence of 0x3 bytes\r\n // ...\r\n // literal of 0x305 means repeating sequence of 0x207 bytes\r\n if(next_literal >= 0x100) {\r\n // Get the length of the repeating sequence.\r\n // Note that the repeating block may overlap the current output position,\r\n // for example if there was a sequence of equal bytes\r\n let rep_length = next_literal - 0xFE;\r\n // Get backward distance to the repetition\r\n const minus_dist = DecodeDist(pWork, rep_length);\r\n if (minus_dist === 0) {\r\n result = 0x306;\r\n break;\r\n }\r\n\r\n // Target and source pointer\r\n let target = outputPos;\r\n let source = target - minus_dist;\r\n\r\n // Update buffer output position\r\n outputPos += rep_length;\r\n\r\n // Copy the repeating sequence\r\n const out_buff = pWork.out_buff;\r\n while (rep_length-- > 0) {\r\n out_buff[target++] = out_buff[source++];\r\n }\r\n } else {\r\n pWork.out_buff[outputPos++] = next_literal;\r\n }\r\n\r\n // Flush the output buffer, if number of extracted bytes has reached the end\r\n if (outputPos >= 0x2000) {\r\n // Copy decompressed data into user buffer\r\n pWork.write_buf(pWork.out_buff.subarray(0x1000, 0x2000));\r\n\r\n // Now copy the decompressed data to the first half of the buffer.\r\n // This is needed because the decompression might reuse them as repetitions.\r\n // Note that if the output buffer overflowed previously, the extra decompressed bytes\r\n // are stored in \"out_buff_overflow\", and they will now be\r\n // within decompressed part of the output buffer.\r\n pWork.out_buff.copyWithin(0, 0x1000, outputPos);\r\n outputPos -= 0x1000;\r\n }\r\n }\r\n\r\n // Flush any remaining decompressed bytes\r\n pWork.write_buf(pWork.out_buff.subarray(0x1000, outputPos));\r\n return result;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Main exploding function.\r\nexport function explode(read_buf, write_buf) {\r\n const buffer = new ArrayBuffer(0x3104);\r\n const pWork = {\r\n read_buf,\r\n write_buf,\r\n in_pos: 3,\r\n extra_bits: 0,\r\n in_buff: new Uint8Array(buffer, 0, 0x800),\r\n DistPosCodes: new Uint8Array(buffer, 0x800, 0x100),\r\n LengthCodes: new Uint8Array(buffer, 0x900, 0x100),\r\n offs2C34: new Uint8Array(buffer, 0xA00, 0x100),\r\n offs2D34: new Uint8Array(buffer, 0xB00, 0x100),\r\n offs2E34: new Uint8Array(buffer, 0xC00, 0x80),\r\n offs2EB4: new Uint8Array(buffer, 0xC80, 0x100),\r\n ChBitsAsc: new Uint8Array(buffer, 0xD80, 0x100),\r\n DistBits: new Uint8Array(buffer, 0xE80, 0x40),\r\n LenBits: new Uint8Array(buffer, 0xEC0, 0x10),\r\n ExLenBits: new Uint8Array(buffer, 0xED0, 0x10),\r\n LenBase: new Uint16Array(buffer, 0xEE0, 0x10),\r\n out_buff: new Uint8Array(buffer, 0xF00, 0x2204),\r\n };\r\n pWork.in_bytes = read_buf(pWork.in_buff);\r\n if (pWork.in_bytes <= 4) {\r\n return CMP_BAD_DATA;\r\n }\r\n pWork.ctype = pWork.in_buff[0];\r\n pWork.dsize_bits = pWork.in_buff[1];\r\n pWork.bit_buff = pWork.in_buff[2];\r\n\r\n // Test for the valid dictionary size\r\n if(4 > pWork.dsize_bits || pWork.dsize_bits > 6) {\r\n return CMP_INVALID_DICTSIZE;\r\n }\r\n\r\n pWork.dsize_mask = 0xFFFF >> (0x10 - pWork.dsize_bits); // Shifted by 'sar' instruction\r\n\r\n if(pWork.ctype != CMP_BINARY) {\r\n if(pWork.ctype != CMP_ASCII) {\r\n return CMP_INVALID_MODE;\r\n }\r\n\r\n pWork.ChBitsAsc.set(ChBitsAsc);\r\n GenAscTabs(pWork);\r\n }\r\n\r\n pWork.LenBits.set(LenBits);\r\n GenDecodeTabs(pWork.LengthCodes, LenCode, pWork.LenBits, pWork.LenBits.length);\r\n pWork.ExLenBits.set(ExLenBits);\r\n pWork.LenBase.set(LenBase);\r\n pWork.DistBits.set(DistBits);\r\n GenDecodeTabs(pWork.DistPosCodes, DistCode, pWork.DistBits, pWork.DistBits.length);\r\n if(Expand(pWork) !== 0x306) {\r\n return CMP_NO_ERROR;\r\n }\r\n \r\n return CMP_ABORT;\r\n}\r\n\r\nexport default explode;\r\n","const W = new Uint32Array(80);\r\n\r\nconst SHA1CircularShift = (shift, value) => ((value << shift) | (value >> (32 - shift)));\r\n\r\nclass SHA1 {\r\n digest = new Uint32Array(5);\r\n count = 0;\r\n\r\n input8(u8) {\r\n const u32 = new Uint32Array(u8.buffer, u8.byteOffset, 16);\r\n this.input(u32);\r\n }\r\n input(u32) {\r\n this.count += u32.length * 32;\r\n for (let i = 0; i < 16; ++i) {\r\n W[i] = u32[i];\r\n }\r\n for (let i = 16; i < 80; ++i) {\r\n W[i] = W[i - 16] ^ W[i - 14] ^ W[i - 8] ^ W[i - 3];\r\n }\r\n let A = this.digest[0];\r\n let B = this.digest[1];\r\n let C = this.digest[2];\r\n let D = this.digest[3];\r\n let E = this.digest[4];\r\n\r\n for (let i = 0; i < 20; i++) {\r\n const temp = SHA1CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[i] + 0x5A827999;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 20; i < 40; i++) {\r\n const temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 40; i < 60; i++) {\r\n const temp = SHA1CircularShift(5, A) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 60; i < 80; i++) {\r\n const temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n this.digest[0] += A;\r\n this.digest[1] += B;\r\n this.digest[2] += C;\r\n this.digest[3] += D;\r\n this.digest[4] += E;\r\n }\r\n\r\n constructor() {\r\n\t this.digest[0] = 0x67452301;\r\n\t this.digest[1] = 0xEFCDAB89;\r\n\t this.digest[2] = 0x98BADCFE;\r\n\t this.digest[3] = 0x10325476;\r\n this.digest[4] = 0xC3D2E1F0;\r\n \r\n this.digest8 = new Uint8Array(this.digest.buffer);\r\n }\r\n}\r\n\r\nclass Random {\r\n constructor(seed) {\r\n this.seed = seed;\r\n }\r\n next() {\r\n this.seed = (((this.seed * 3) << 16) + ((this.seed * 67) << 8) + (this.seed * 253) + 2531011) | 0;\r\n return (this.seed >> 16) & 0x7FFF;\r\n }\r\n}\r\n\r\nfunction codec_init_key(password) {\r\n const rand = new Random(0x7058);\r\n const key = new Uint8Array(136);\r\n const k32 = new Uint32Array(key.buffer);\r\n for (let i = 0; i < 136; ++i) {\r\n key[i] = rand.next();\r\n }\r\n const pw = new Uint8Array(64);\r\n for (let i = 0; i < 64; ++i) {\r\n pw[i] = password.charCodeAt(i % password.length);\r\n }\r\n\r\n let sha = new SHA1();\r\n sha.input8(pw);\r\n\r\n for (let i = 0; i < 34; ++i) {\r\n k32[i] ^= sha.digest[i % sha.digest.length];\r\n }\r\n\r\n sha = new SHA1();\r\n sha.input(k32.subarray(18));\r\n return sha;\r\n}\r\n\r\nexport default function codec_decode(data, password) {\r\n if (data.length <= 8) {\r\n return;\r\n }\r\n const size = data.length - 8;\r\n if (size % 64) {\r\n return;\r\n }\r\n\r\n if (data[size + 4]) {\r\n return;\r\n }\r\n\r\n const last_size = data[size + 5];\r\n const result_size = size + last_size - 64;\r\n const result = new Uint8Array(result_size);\r\n\r\n const sha = codec_init_key(password);\r\n const size32 = size >> 2;\r\n const data32 = new Uint32Array(data.buffer, data.byteOffset, size32 + 1);\r\n const buf32 = new Uint32Array(16);\r\n const buf = new Uint8Array(buf32.buffer);\r\n\r\n for (let i = 0; i < size32; i += 16) {\r\n for (let j = 0; j < 16; ++j) {\r\n buf32[j] = data32[i + j] ^ sha.digest[j % sha.digest.length];\r\n }\r\n sha.input(buf32);\r\n result.set(i === size32 - 16 ? buf.subarray(0, last_size) : buf, i * 4);\r\n }\r\n if (data32[size32] !== sha.digest[0]) {\r\n return;\r\n }\r\n return result;\r\n}\r\n","import { explode } from './explode';\r\nimport codec_decode from './codec';\r\n\r\nfunction pkzip_decompress(data, out_size) {\r\n if (data.length === out_size) {\r\n return data;\r\n }\r\n\r\n const output = new Uint8Array(out_size);\r\n let in_pos = 0;\r\n let out_pos = 0;\r\n function read_buf(dst) {\r\n const count = Math.min(data.length - in_pos, dst.length);\r\n dst.set(data.subarray(in_pos, count));\r\n in_pos += count;\r\n return count;\r\n }\r\n function write_buf(src) {\r\n if (out_pos + src.length > out_size) {\r\n throw Error('decompress buffer overflow');\r\n }\r\n output.set(src, out_pos);\r\n out_pos += src.length;\r\n }\r\n\r\n if (explode(read_buf, write_buf) || out_pos !== out_size) {\r\n return null;\r\n }\r\n\r\n return output;\r\n}\r\n\r\nconst hashtable = (function() {\r\n const hashtable = new Uint32Array(1280);\r\n let seed = 0x00100001;\r\n for (let i = 0; i < 256; i++) {\r\n for (let j = i; j < 1280; j += 256) {\r\n seed = (seed * 125 + 3) % 0x2AAAAB;\r\n const a = (seed & 0xFFFF) << 16;\r\n seed = (seed * 125 + 3) % 0x2AAAAB;\r\n const b = (seed & 0xFFFF);\r\n hashtable[j] = a | b;\r\n }\r\n }\r\n return hashtable;\r\n})();\r\nexport function decrypt(u32, key) {\r\n let seed = 0xEEEEEEEE;\r\n for (let i = 0; i < u32.length; ++i) {\r\n seed += hashtable[0x400 + (key & 0xFF)];\r\n u32[i] ^= seed + key;\r\n seed = (u32[i] + seed * 33 + 3) | 0;\r\n key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B);\r\n }\r\n}\r\nexport function decrypt8(u8, key) {\r\n decrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key);\r\n}\r\nexport function encrypt(u32, key) {\r\n let seed = 0xEEEEEEEE;\r\n for (let i = 0; i < u32.length; ++i) {\r\n seed += hashtable[0x400 + (key & 0xFF)];\r\n const orig = u32[i];\r\n u32[i] ^= seed + key;\r\n seed = (orig + seed * 33 + 3) | 0;\r\n key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B);\r\n }\r\n}\r\nexport function encrypt8(u8, key) {\r\n encrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key);\r\n}\r\nexport function hash(name, type) {\r\n let seed1 = 0x7FED7FED;\r\n let seed2 = 0xEEEEEEEE;\r\n for (let i = 0; i < name.length; ++i) {\r\n let ch = name.charCodeAt(i);\r\n if (ch >= 0x61 && ch <= 0x7A) {\r\n ch -= 0x20;\r\n }\r\n if (ch === 0x2F) {\r\n ch = 0x5C;\r\n }\r\n seed1 = hashtable[type * 256 + ch] ^ (seed1 + seed2);\r\n seed2 = (ch + seed1 + seed2 * 33 + 3) | 0;\r\n }\r\n return seed1 >>> 0;\r\n}\r\n\r\nexport function path_name(name) {\r\n const pos = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\\\'));\r\n return name.substring(pos + 1);\r\n}\r\n\r\nconst Flags = {\r\n CompressPkWare: 0x00000100,\r\n CompressMulti: 0x00000200,\r\n Compressed: 0x0000FF00,\r\n Encrypted: 0x00010000,\r\n FixSeed: 0x00020000,\r\n PatchFile: 0x00100000,\r\n SingleUnit: 0x01000000,\r\n DummyFile: 0x02000000,\r\n SectorCrc: 0x04000000,\r\n Exists: 0x80000000,\r\n};\r\n\r\nexport class MpqReader {\r\n constructor(buffer) {\r\n this.buffer = buffer;\r\n this.u8 = new Uint8Array(buffer);\r\n this.u32 = new Uint32Array(buffer, 0, buffer.byteLength >> 2);\r\n\r\n this.readHeader();\r\n }\r\n\r\n readHeader() {\r\n const {u8, u32} = this;\r\n if (u32[0] !== 0x1A51504D) {\r\n throw Error('invalid MPQ header');\r\n }\r\n const sizeId = u8[14] + (u8[15] << 8);\r\n const hashOffset = u32[4];\r\n const blockOffset = u32[5];\r\n const hashCount = u32[6];\r\n const blockCount = u32[7];\r\n this.hashTable = this.readTable(hashOffset, hashCount, \"(hash table)\");\r\n this.blockTable = this.readTable(blockOffset, blockCount, \"(block table)\");\r\n this.blockSize = 1 << (9 + sizeId);\r\n }\r\n\r\n readTable(offset, count, key) {\r\n const buffer = new Uint32Array(this.buffer.slice(offset, offset + count * 16));\r\n decrypt(buffer, hash(key, 3));\r\n return buffer;\r\n }\r\n\r\n fileIndex(name) {\r\n const {hashTable} = this;\r\n const length = hashTable.length >> 2;\r\n const index = hash(name, 0) % length;\r\n const keyA = hash(name, 1), keyB = hash(name, 2);\r\n for (let i = index, count = 0; hashTable[i * 4 + 3] !== 0xFFFFFFFF && count < length; i = (i + 1) % length, ++count) {\r\n if (hashTable[i * 4] === keyA && hashTable[i * 4 + 1] === keyB && hashTable[i * 4 + 3] !== 0xFFFFFFFE) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n readRaw(name) {\r\n const index = this.fileIndex(name);\r\n if (index == null) {\r\n return;\r\n }\r\n const block = this.hashTable[index * 4 + 3];\r\n const info = {\r\n filePos: this.blockTable[block * 4],\r\n cmpSize: this.blockTable[block * 4 + 1],\r\n fileSize: this.blockTable[block * 4 + 2],\r\n flags: this.blockTable[block * 4 + 3],\r\n key: hash(path_name(name), 3),\r\n };\r\n if ((info.flags & Flags.PatchFile) || info.filePos + info.cmpSize > this.buffer.byteLength) {\r\n return;\r\n }\r\n if (!(info.flags & Flags.Compressed)) {\r\n info.cmpSize = info.fileSize;\r\n }\r\n if (info.flags & Flags.FixSeed) {\r\n info.key = (info.key + info.filePos) ^ info.fileSize;\r\n }\r\n return {info, data: new Uint8Array(this.buffer, info.filePos, info.cmpSize)};\r\n }\r\n\r\n read(name) {\r\n const raw = this.readRaw(name);\r\n if (!raw) {\r\n return;\r\n }\r\n let {info, data} = raw;\r\n data = data.slice();\r\n\r\n if (info.flags & Flags.SingleUnit) {\r\n if (info.flags & Flags.Encrypted) {\r\n decrypt8(data, info.key);\r\n }\r\n if (info.flags & Flags.CompressMulti) {\r\n return;\r\n } else if (info.flags & Flags.CompressPkWare) {\r\n return pkzip_decompress(data, info.fileSize);\r\n }\r\n return data;\r\n } else if (!(info.flags & Flags.Compressed)) {\r\n if (info.flags & Flags.Encrypted) {\r\n for (let i = 0; i < info.fileSize; i += this.blockSize) {\r\n decrypt8(data.subarray(i, Math.min(info.fileSize, i + this.blockSize)), info.key + i / this.blockSize);\r\n }\r\n }\r\n return data;\r\n } else {\r\n const numBlocks = Math.floor((info.fileSize + this.blockSize - 1) / this.blockSize);\r\n const tableSize = numBlocks + 1;\r\n if (data.length < tableSize * 4) {\r\n return;\r\n }\r\n const blocks = new Uint32Array(data.buffer, 0, tableSize);\r\n if (info.flags & Flags.Encrypted) {\r\n decrypt(blocks, info.key - 1);\r\n }\r\n const output = new Uint8Array(info.fileSize);\r\n for (let i = 0; i < numBlocks; ++i) {\r\n const oPos = i * this.blockSize;\r\n const uSize = Math.min(this.blockSize, info.fileSize - oPos);\r\n if (blocks[i + 1] > data.length) {\r\n return;\r\n }\r\n let tmp = data.subarray(blocks[i], blocks[i + 1]);\r\n if (info.flags & Flags.Encrypted) {\r\n // this is not safe, but our files are small enough\r\n decrypt8(tmp, info.key + i);\r\n }\r\n if (info.flags & Flags.CompressMulti) {\r\n return;\r\n } else if (info.flags & Flags.CompressPkWare) {\r\n tmp = pkzip_decompress(tmp, uSize);\r\n }\r\n if (!tmp || tmp.length !== uSize) {\r\n return;\r\n }\r\n output.set(tmp, oPos);\r\n }\r\n return output;\r\n }\r\n }\r\n}\r\n\r\nfunction getPassword(name) {\r\n if (name.match(/spawn\\d+\\.sv/i)) {\r\n return 'lshbkfg1'; // single, spawn\r\n } else if (name.match(/share_\\d+\\.sv/i)) {\r\n return 'lshbkfg1'; // multi, spawn\r\n } else if (name.match(/multi_\\d+\\.sv/i)) {\r\n return 'szqnlsk1'; // multi, retail\r\n } else {\r\n return 'xrgyrkj1'; // single, retail\r\n }\r\n}\r\n\r\nexport default function getPlayerName(data, name) {\r\n try {\r\n const reader = new MpqReader(data);\r\n const hero = codec_decode(reader.read(\"hero\"), getPassword(name));\r\n const nameEnd = hero.indexOf(0, 16);\r\n const result = {};\r\n result.name = String.fromCharCode(...hero.subarray(16, nameEnd));\r\n result.cls = hero[48];\r\n result.level = hero[53];\r\n return result;\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\n","function no_sound() {\r\n return {\r\n create_sound: () => 0,\r\n duplicate_sound: () => 0,\r\n play_sound: () => undefined,\r\n set_volume: () => undefined,\r\n stop_sound: () => undefined,\r\n delete_sound: () => undefined,\r\n };\r\n}\r\n\r\nfunction decodeAudioData(context, buffer) {\r\n return new Promise((resolve, reject) => {\r\n context.decodeAudioData(buffer, resolve, reject);\r\n });\r\n}\r\n\r\nexport default function init_sound() {\r\n const AudioContext = window.AudioContext || window.webkitAudioContext;\r\n const StereoPannerNode = window.StereoPannerNode;\r\n if (!AudioContext) {\r\n return no_sound();\r\n }\r\n\r\n let context = null;\r\n try {\r\n context = new AudioContext();\r\n } catch (e) {\r\n }\r\n const sounds = new Map();\r\n\r\n return {\r\n create_sound_raw(id, data, length, channels, rate) {\r\n if (!context) {\r\n return;\r\n }\r\n const buffer = context.createBuffer(channels, length, rate);\r\n for (let i = 0; i < channels; ++i) {\r\n buffer.getChannelData(i).set(data.subarray(i * length, i * length + length));\r\n }\r\n sounds.set(id, {\r\n buffer: Promise.resolve(buffer),\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n create_sound(id, data) {\r\n if (!context) {\r\n return;\r\n }\r\n const buffer = decodeAudioData(context, data.buffer);\r\n sounds.set(id, {\r\n buffer,\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n duplicate_sound(id, srcId) {\r\n if (!context) {\r\n return;\r\n }\r\n const src = sounds.get(srcId);\r\n if (!src) {\r\n return;\r\n }\r\n sounds.set(id, {\r\n buffer: src.buffer,\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n play_sound(id, volume, pan, loop) {\r\n const src = sounds.get(id);\r\n if (src) {\r\n if (src.source) {\r\n src.source.then(source => source.stop());\r\n }\r\n src.gain.gain.value = Math.pow(2.0, volume / 1000.0);\r\n const relVolume = Math.pow(2.0, pan / 1000.0);\r\n if (src.panner) {\r\n src.panner.pan.value = 1.0 - 2.0 / (1.0 + relVolume);\r\n }\r\n src.source = src.buffer.then(buffer => {\r\n const source = context.createBufferSource();\r\n source.buffer = buffer;\r\n source.loop = !!loop;\r\n let node = source.connect(src.gain);\r\n if (src.panner) {\r\n node = node.connect(src.panner);\r\n }\r\n node.connect(context.destination);\r\n source.start();\r\n return source;\r\n });\r\n }\r\n },\r\n set_volume(id, volume) {\r\n const src = sounds.get(id);\r\n if (src) {\r\n src.gain.gain.value = Math.pow(2.0, volume / 1000.0);\r\n }\r\n },\r\n stop_sound(id) {\r\n const src = sounds.get(id);\r\n if (src && src.source) {\r\n src.source.then(source => source.stop());\r\n delete src.source;\r\n }\r\n },\r\n delete_sound(id) {\r\n const src = sounds.get(id);\r\n if (src && src.source) {\r\n src.source.then(source => source.stop());\r\n }\r\n sounds.delete(id);\r\n },\r\n\r\n stop_all() {\r\n for (let [, sound] of sounds) {\r\n if (sound.source) {\r\n sound.source.then(source => source.stop());\r\n }\r\n }\r\n sounds.clear();\r\n context = null;\r\n }\r\n };\r\n}\r\n","import axios from 'axios';\r\n\r\nconst SpawnSizes = [50274091, 25830791];\r\n\r\nexport { SpawnSizes };\r\n\r\nexport default async function load_spawn(api, fs) {\r\n let file = fs.files.get('spawn.mpq');\r\n if (file && !SpawnSizes.includes(file.byteLength)) {\r\n fs.files.delete('spawn.mpq');\r\n await fs.delete('spawn.mpq');\r\n file = null;\r\n }\r\n if (!file) {\r\n const spawn = await axios.request({\r\n url: process.env.PUBLIC_URL + '/spawn.mpq',\r\n responseType: 'arraybuffer',\r\n onDownloadProgress: e => {\r\n if (api.onProgress) {\r\n api.onProgress({text: 'Downloading...', loaded: e.loaded, total: e.total || SpawnSizes[1]});\r\n }\r\n },\r\n headers: {\r\n 'Cache-Control': 'max-age=31536000'\r\n }\r\n });\r\n if (!SpawnSizes.includes(spawn.data.byteLength)) {\r\n throw Error(\"Invalid spawn.mpq size. Try clearing cache and refreshing the page.\");\r\n }\r\n const data = new Uint8Array(spawn.data);\r\n fs.files.set('spawn.mpq', data);\r\n fs.update('spawn.mpq', data.slice());\r\n }\r\n return fs;\r\n}\r\n","export class buffer_reader {\r\n constructor(buffer) {\r\n this.buffer = (buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer));\r\n this.pos = 0;\r\n }\r\n done() {\r\n return this.pos === this.buffer.byteLength;\r\n }\r\n read8() {\r\n if (this.pos >= this.buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n return this.buffer[this.pos++];\r\n }\r\n read16() {\r\n const {pos, buffer} = this;\r\n if (pos + 2 > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = buffer[pos] | (buffer[pos + 1] << 8);\r\n this.pos += 2;\r\n return result;\r\n }\r\n read32() {\r\n const {pos, buffer} = this;\r\n if (pos + 4 > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = buffer[pos] | (buffer[pos + 1] << 8) | (buffer[pos + 2] << 16) | (buffer[pos + 3] << 24);\r\n this.pos += 4;\r\n return result;\r\n }\r\n read_str() {\r\n const length = this.read8();\r\n const {pos, buffer} = this;\r\n if (pos + length > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = String.fromCharCode(...buffer.subarray(pos, pos + length));\r\n this.pos += length;\r\n return result;\r\n }\r\n read_buf() {\r\n const size = this.read32();\r\n const result = this.buffer.subarray(this.pos, this.pos + size);\r\n this.pos += size;\r\n return result;\r\n }\r\n}\r\nexport class buffer_writer {\r\n constructor(length) {\r\n this.buffer = new Uint8Array(length);\r\n this.pos = 0;\r\n }\r\n get result() {\r\n return this.buffer.buffer;\r\n }\r\n write8(value) {\r\n this.buffer[this.pos++] = value;\r\n return this;\r\n }\r\n write16(value) {\r\n const {pos, buffer} = this;\r\n buffer[pos] = value;\r\n buffer[pos + 1] = value >> 8;\r\n this.pos += 2;\r\n return this;\r\n }\r\n write32(value) {\r\n const {pos, buffer} = this;\r\n buffer[pos] = value;\r\n buffer[pos + 1] = value >> 8;\r\n buffer[pos + 2] = value >> 16;\r\n buffer[pos + 3] = value >> 24;\r\n this.pos += 4;\r\n return this;\r\n }\r\n write_str(value) {\r\n const length = value.length;\r\n this.write8(length);\r\n const {pos, buffer} = this;\r\n for (let i = 0; i < length; ++i) {\r\n buffer[pos + i] = value.charCodeAt(i);\r\n }\r\n this.pos += length;\r\n return this;\r\n }\r\n rest(value) {\r\n this.buffer.set(value, this.pos);\r\n this.pos += value.byteLength;\r\n return this;\r\n }\r\n write_buf(value) {\r\n this.write32(value.byteLength);\r\n this.rest(value);\r\n return this;\r\n }\r\n}\r\n\r\nexport const RejectionReason = {\r\n JOIN_SUCCESS: 0x00,\r\n JOIN_ALREADY_IN_GAME: 0x01,\r\n JOIN_GAME_NOT_FOUND: 0x02,\r\n JOIN_INCORRECT_PASSWORD: 0x03,\r\n JOIN_VERSION_MISMATCH: 0x04,\r\n JOIN_GAME_FULL: 0x05,\r\n CREATE_GAME_EXISTS: 0x06,\r\n};\r\n\r\nexport function read_packet(reader, types) {\r\n const code = reader.read8();\r\n const cls = Object.values(types).find(cls => cls.code === code);\r\n if (!cls) {\r\n throw Error('invalid packet code');\r\n }\r\n return {type: cls, packet: cls.read(reader)};\r\n}\r\nexport function packet_size(type, packet) {\r\n return (typeof type.size === \"function\" ? type.size(packet) : type.size) + 1;\r\n}\r\nexport function write_packet(type, packet) {\r\n const size = packet_size(type, packet);\r\n return type.write(new buffer_writer(size).write8(type.code), packet).result;\r\n}\r\n\r\nexport function make_batch(types) {\r\n return {\r\n code: 0x00,\r\n read: reader => {\r\n const count = reader.read16();\r\n const packets = [];\r\n for (let i = 0; i < count; ++i) {\r\n packets.push(read_packet(reader, types()));\r\n }\r\n return packets;\r\n },\r\n size: packets => packets.reduce((sum, {type, packet}) => sum + packet_size(type, packet), 2),\r\n write: (writer, packets) => {\r\n writer.write16(packets.length);\r\n for (let {type, packet} of packets) {\r\n type.write(writer.write8(type.code), packet);\r\n }\r\n return writer;\r\n },\r\n };\r\n}\r\n\r\nexport const server_packet = {\r\n info: {\r\n code: 0x32,\r\n read: reader => ({version: reader.read32()}),\r\n size: 4,\r\n write: (writer, {version}) => writer.write32(version),\r\n },\r\n game_list: {\r\n code: 0x21,\r\n read: reader => {\r\n const count = reader.read16();\r\n const games = [];\r\n for (let i = 0; i < count; ++i) {\r\n games.push({type: reader.read32(), name: reader.read_str()});\r\n }\r\n return {games};\r\n },\r\n size: ({games}) => games.reduce((sum, {name}) => sum + 5 + name.length, 2),\r\n write: (writer, {games}) => {\r\n writer.write16(games.length);\r\n for (let {type, name} of games) {\r\n writer.write32(type);\r\n writer.write_str(name);\r\n }\r\n return writer;\r\n },\r\n },\r\n join_accept: {\r\n code: 0x12,\r\n read: reader => ({cookie: reader.read32(), index: reader.read8(), seed: reader.read32(), difficulty: reader.read32()}),\r\n size: 13,\r\n write: (writer, {cookie, index, seed, difficulty}) => writer.write32(cookie).write8(index).write32(seed).write32(difficulty),\r\n },\r\n join_reject: {\r\n code: 0x15,\r\n read: reader => ({cookie: reader.read32(), reason: reader.read8()}),\r\n size: 5,\r\n write: (writer, {cookie, reason}) => writer.write32(cookie).write8(reason),\r\n },\r\n connect: {\r\n code: 0x13,\r\n read: reader => ({id: reader.read8()}),\r\n size: 1,\r\n write: (writer, {id}) => writer.write8(id),\r\n },\r\n disconnect: {\r\n code: 0x14,\r\n read: reader => ({id: reader.read8(), reason: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, reason}) => writer.write8(id).write32(reason),\r\n },\r\n message: {\r\n code: 0x01,\r\n read: reader => ({id: reader.read8(), payload: reader.read_buf()}),\r\n size: ({payload}) => 5 + payload.byteLength,\r\n write: (writer, {id, payload}) => writer.write8(id).write_buf(payload),\r\n },\r\n turn: {\r\n code: 0x02,\r\n read: reader => ({id: reader.read8(), turn: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, turn}) => writer.write8(id).write32(turn),\r\n },\r\n batch: make_batch(() => server_packet),\r\n};\r\n\r\nexport const client_packet = {\r\n info: {\r\n code: 0x31,\r\n read: reader => ({version: reader.read32()}),\r\n size: 4,\r\n write: (writer, {version}) => writer.write32(version),\r\n },\r\n game_list: {\r\n code: 0x21,\r\n read: () => ({}),\r\n size: 0,\r\n write: writer => writer,\r\n },\r\n create_game: {\r\n code: 0x22,\r\n read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str(), difficulty: reader.read32()}),\r\n size: ({name, password}) => 10 + name.length + password.length,\r\n write: (writer, {cookie, name, password, difficulty}) => writer.write32(cookie).write_str(name).write_str(password).write32(difficulty),\r\n },\r\n join_game: {\r\n code: 0x23,\r\n read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str()}),\r\n size: ({name, password}) => 6 + name.length + password.length,\r\n write: (writer, {cookie, name, password}) => writer.write32(cookie).write_str(name).write_str(password),\r\n },\r\n leave_game: {\r\n code: 0x24,\r\n read: () => ({}),\r\n size: 0,\r\n write: writer => writer,\r\n },\r\n drop_player: {\r\n code: 0x03,\r\n read: reader => ({id: reader.read8(), reason: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, reason}) => writer.write8(id).write32(reason),\r\n },\r\n message: {\r\n code: 0x01,\r\n read: reader => ({id: reader.read8(), payload: reader.read_buf()}),\r\n size: ({payload}) => 5 + payload.byteLength,\r\n write: (writer, {id, payload}) => writer.write8(id).write_buf(payload),\r\n },\r\n turn: {\r\n code: 0x02,\r\n read: reader => ({turn: reader.read32()}),\r\n size: 4,\r\n write: (writer, {turn}) => writer.write32(turn),\r\n },\r\n batch: make_batch(() => server_packet),\r\n};\r\n","import Peer from 'peerjs';\r\nimport { buffer_reader, read_packet, write_packet, client_packet, server_packet, RejectionReason } from './packet';\r\n\r\n/*function log_packet(data, type) {\r\n const reader = new buffer_reader(data);\r\n const id = reader.read8();\r\n for (let [name, {code, read}] of Object.entries(type)) {\r\n if (code === id && (name !== 'message' && name !== 'turn')) {\r\n console.log(`${type === client_packet ? 'client_packet' : 'server_packet'}.${name} ${JSON.stringify(read(reader))}`);\r\n }\r\n }\r\n}*/\r\n\r\nconst PeerID = name => `diabloweb_${name}`;\r\nconst Options = {host: 'diablo.rivsoft.net', port: 443, secure: true};\r\nconst MAX_PLRS = 4;\r\n\r\nclass webrtc_server {\r\n constructor(version, {cookie, name, password, difficulty}, onMessage, onClose) {\r\n this.version = version;\r\n this.name = name;\r\n this.password = password;\r\n this.difficulty = difficulty;\r\n this.onMessage = onMessage;\r\n this.onClose = onClose;\r\n\r\n this.peer = new Peer(PeerID(name), Options);\r\n this.peer.on('connection', conn => this.onConnect(conn));\r\n this.players = [];\r\n this.myplr = 0;\r\n\r\n this.seed = Math.floor(Math.random() * Math.pow(2, 32));\r\n\r\n const onError = () => {\r\n onMessage(write_packet(server_packet.join_reject, {cookie, reason: RejectionReason.CREATE_GAME_EXISTS}));\r\n onClose();\r\n this.peer.off('error', onError);\r\n this.peer.off('open', onOpen);\r\n };\r\n const onOpen = () => {\r\n //console.log('peer open');\r\n setTimeout(() => {\r\n onMessage(write_packet(server_packet.join_accept, {cookie, index: 0, seed: this.seed, difficulty}));\r\n onMessage(write_packet(server_packet.connect, {id: 0}));\r\n }, 0);\r\n this.peer.off('error', onError);\r\n this.peer.off('open', onOpen);\r\n };\r\n this.peer.on('error', onError);\r\n this.peer.on('open', onOpen);\r\n\r\n //this.peer.on('error', err => console.log('peer error:', err));\r\n }\r\n\r\n onConnect(conn) {\r\n //conn.on('error', err => console.log('conn error:', err));\r\n //console.log('conn open');\r\n const peer = {conn};\r\n conn.on('data', packet => {\r\n const reader = new buffer_reader(packet);\r\n const {type, packet: pkt} = read_packet(reader, client_packet);\r\n switch (type.code) {\r\n case client_packet.info.code:\r\n peer.version = pkt.version;\r\n break;\r\n case client_packet.join_game.code:\r\n if (peer.version !== this.version) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_VERSION_MISMATCH}));\r\n } else if (pkt.name !== this.name) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND}));\r\n } else if (pkt.password !== this.password) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_INCORRECT_PASSWORD}));\r\n } else {\r\n let i = 1;\r\n while (i < MAX_PLRS && this.players[i]) {\r\n ++i;\r\n }\r\n if (i >= MAX_PLRS) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_FULL})); \r\n } else {\r\n this.players[i] = peer;\r\n peer.id = i;\r\n conn.send(write_packet(server_packet.join_accept, {cookie: pkt.cookie, index: i, seed: this.seed, difficulty: this.difficulty}));\r\n this.send(0xFF, write_packet(server_packet.connect, {id: i}));\r\n }\r\n }\r\n break;\r\n default:\r\n if (peer.id != null) {\r\n this.handle(peer.id, type.code, pkt);\r\n } else {\r\n return;\r\n }\r\n }\r\n if (!reader.done()) {\r\n throw Error('packet too large');\r\n }\r\n });\r\n conn.on('close', () => {\r\n //console.log('conn close');\r\n if (peer.id != null) {\r\n this.drop(peer.id, 0x40000006);\r\n }\r\n });\r\n }\r\n\r\n send(mask, pkt) {\r\n for (let i = 1; i < MAX_PLRS; ++i) {\r\n if ((mask & (1 << i)) && this.players[i]) {\r\n if (this.players[i].conn) {\r\n this.players[i].conn.send(pkt);\r\n }\r\n }\r\n }\r\n // self last since it will destroy the buffer\r\n if (mask & 1) {\r\n this.onMessage(pkt);\r\n }\r\n }\r\n\r\n drop(id, reason) {\r\n if (id === 0) {\r\n for (let i = 1; i < MAX_PLRS; ++i) {\r\n this.drop(i, 0x40000006);\r\n }\r\n this.onMessage(write_packet(server_packet.disconnect, {id, reason}));\r\n this.peer.destroy();\r\n this.onClose();\r\n } else if (this.players[id]) {\r\n this.send(0xFF, write_packet(server_packet.disconnect, {id, reason}));\r\n this.players[id].id = null;\r\n if (this.players[id].conn) {\r\n this.players[id].conn.close();\r\n }\r\n this.players[id] = null;\r\n }\r\n }\r\n\r\n handle(id, code, pkt) {\r\n switch (code) {\r\n case client_packet.leave_game.code:\r\n this.drop(id, 3);\r\n break;\r\n case client_packet.drop_player.code:\r\n this.drop(pkt.id, pkt.reason);\r\n break;\r\n case client_packet.message.code:\r\n this.send(pkt.id === 0xFF ? ~(1 << id) : (1 << pkt.id), write_packet(server_packet.message, {id, payload: pkt.payload}));\r\n break;\r\n case client_packet.turn.code:\r\n this.send(~(1 << id), write_packet(server_packet.turn, {id, turn: pkt.turn}));\r\n break;\r\n default:\r\n throw Error(`invalid packet ${code}`);\r\n }\r\n }\r\n}\r\n\r\nclass webrtc_client {\r\n pending = [];\r\n\r\n constructor(version, {cookie, name, password}, onMessage, onClose) {\r\n this.peer = new Peer(Options);\r\n this.conn = this.peer.connect(PeerID(name));\r\n\r\n let needUnreg = true;\r\n const unreg = () => {\r\n if (!needUnreg) {\r\n return;\r\n }\r\n needUnreg = false;\r\n this.peer.off('error', onError);\r\n this.conn.off('error', onError);\r\n this.conn.off('open', onOpen);\r\n clearTimeout(timeout);\r\n };\r\n const onError = () => {\r\n onMessage(write_packet(server_packet.join_reject, {cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND}));\r\n onClose();\r\n unreg();\r\n };\r\n const onOpen = () => {\r\n this.conn.send(write_packet(client_packet.info, {version}));\r\n this.conn.send(write_packet(client_packet.join_game, {cookie, name, password}));\r\n for (let pkt of this.pending) {\r\n this.conn.send(pkt);\r\n }\r\n this.pending = null;\r\n this.conn.off('open', onOpen);\r\n };\r\n const timeout = setTimeout(onError, 10000);\r\n this.peer.on('error', onError);\r\n this.conn.on('error', onError);\r\n this.conn.on('open', onOpen);\r\n\r\n //this.peer.on('error', err => console.log('peer error:', err));\r\n //this.conn.on('error', err => console.log('conn error:', err));\r\n\r\n this.conn.on('data', data => {\r\n unreg();\r\n const reader = new buffer_reader(data);\r\n const {type, packet: pkt} = read_packet(reader, server_packet);\r\n switch (type.code) {\r\n case server_packet.join_accept.code:\r\n this.myplr = pkt.index;\r\n break;\r\n case server_packet.join_reject.code:\r\n onClose();\r\n break;\r\n case server_packet.disconnect.code:\r\n if (pkt.id === 'myplr') {\r\n onClose();\r\n }\r\n break;\r\n default:\r\n }\r\n onMessage(data);\r\n });\r\n this.conn.on('close', data => {\r\n onClose();\r\n });\r\n }\r\n\r\n send(packet) {\r\n if (this.pending) {\r\n this.pending.push(packet);\r\n } else {\r\n this.conn.send(packet);\r\n }\r\n }\r\n}\r\n\r\nexport default function webrtc_open(onMessage) {\r\n let server = null, client = null;\r\n\r\n let version = 0;\r\n\r\n /*const prevMessage = onMessage;\r\n onMessage = data => {\r\n log_packet(data, server_packet);\r\n prevMessage(data);\r\n };*/\r\n\r\n return {\r\n send: function(packet) {\r\n //log_packet(packet, client_packet);\r\n const reader = new buffer_reader(packet);\r\n const {type, packet: pkt} = read_packet(reader, client_packet);\r\n switch (type.code) {\r\n case client_packet.info.code:\r\n version = pkt.version;\r\n break;\r\n case client_packet.create_game.code:\r\n if (server || client) {\r\n onMessage(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME}));\r\n } else {\r\n server = new webrtc_server(version, pkt, onMessage, () => server = null);\r\n }\r\n break;\r\n case client_packet.join_game.code:\r\n if (server || client) {\r\n onMessage(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME}));\r\n } else {\r\n client = new webrtc_client(version, pkt, onMessage, () => client = null);\r\n }\r\n break;\r\n default:\r\n if (server) {\r\n server.handle(0, type.code, pkt);\r\n if (type.code === client_packet.leave_game.code) {\r\n server = null;\r\n }\r\n } else if (client) {\r\n client.send(packet);\r\n if (type.code === client_packet.leave_game.code) {\r\n client = null;\r\n }\r\n return;\r\n } else if (type.code !== client_packet.leave_game.code) {\r\n throw Error(`invalid packet ${type.code}`);\r\n }\r\n }\r\n if (!reader.done()) {\r\n throw Error('packet too large');\r\n }\r\n },\r\n };\r\n}\r\n","import Worker from './game.worker.js';\r\nimport init_sound from './sound';\r\nimport load_spawn from './load_spawn';\r\nimport webrtc_open from './webrtc';\r\n\r\nfunction onRender(api, ctx, {bitmap, images, text, clip, belt}) {\r\n if (bitmap) {\r\n ctx.transferFromImageBitmap(bitmap);\r\n } else {\r\n for (let {x, y, w, h, data} of images) {\r\n const image = ctx.createImageData(w, h);\r\n image.data.set(data);\r\n ctx.putImageData(image, x, y);\r\n }\r\n if (text.length) {\r\n ctx.save();\r\n ctx.font = 'bold 13px Times New Roman';\r\n if (clip) {\r\n const {x0, y0, x1, y1} = clip;\r\n ctx.beginPath();\r\n ctx.rect(x0, y0, x1 - x0, y1 - y0);\r\n ctx.clip();\r\n }\r\n for (let {x, y, text: str, color} of text) {\r\n const r = ((color >> 16) & 0xFF);\r\n const g = ((color >> 8) & 0xFF);\r\n const b = (color & 0xFF);\r\n ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\r\n ctx.fillText(str, x, y + 22);\r\n }\r\n ctx.restore();\r\n }\r\n }\r\n\r\n api.updateBelt(belt);\r\n}\r\n\r\nfunction testOffscreen() {\r\n return false;\r\n // This works but I couldn't see any performance difference, and support for 2D canvas in workers is very poor.\r\n // In this mode, instead of sending a batch of areas to draw back to the main thread, the worker does all drawing on its own and sends a complete bitmap object back.\r\n // However, this effectively clears the worker's canvas, so we need to redraw the whole frame every time, which defeats the performance gained from reduced copying.\r\n /*try {\r\n const canvas = document.createElement(\"canvas\");\r\n const offscreen = canvas.transferControlToOffscreen();\r\n const context = offscreen.getContext(\"2d\");\r\n return context != null;\r\n } catch (e) {\r\n return false;\r\n }*/\r\n}\r\n\r\nasync function do_load_game(api, audio, mpq, spawn) {\r\n const fs = await api.fs;\r\n if (spawn && !mpq) {\r\n await load_spawn(api, fs);\r\n }\r\n\r\n let context = null, offscreen = false;\r\n if (testOffscreen()) {\r\n context = api.canvas.getContext(\"bitmaprenderer\");\r\n offscreen = true;\r\n } else {\r\n context = api.canvas.getContext(\"2d\", {alpha: false});\r\n }\r\n return await new Promise((resolve, reject) => {\r\n try {\r\n const worker = new Worker();\r\n\r\n let packetQueue = [];\r\n const webrtc = webrtc_open(data => {\r\n packetQueue.push(data);\r\n });\r\n\r\n worker.addEventListener(\"message\", ({data}) => {\r\n switch (data.action) {\r\n case \"loaded\":\r\n resolve((func, ...params) => worker.postMessage({action: \"event\", func, params}));\r\n break;\r\n case \"render\":\r\n onRender(api, context, data.batch);\r\n break;\r\n case \"audio\":\r\n audio[data.func](...data.params);\r\n break;\r\n case \"audioBatch\":\r\n for (let {func, params} of data.batch) {\r\n audio[func](...params);\r\n }\r\n break;\r\n case \"fs\":\r\n fs[data.func](...data.params);\r\n break;\r\n case \"cursor\":\r\n api.setCursorPos(data.x, data.y);\r\n break;\r\n case \"keyboard\":\r\n api.openKeyboard(data.rect);\r\n break;\r\n case \"error\":\r\n audio.stop_all();\r\n api.onError(data.error, data.stack);\r\n break;\r\n case \"failed\":\r\n reject({message: data.error, stack: data.stack});\r\n break;\r\n case \"progress\":\r\n api.onProgress({text: data.text, loaded: data.loaded, total: data.total});\r\n break;\r\n case \"exit\":\r\n api.onExit();\r\n break;\r\n case \"current_save\":\r\n api.setCurrentSave(data.name);\r\n break;\r\n case \"packet\":\r\n webrtc.send(data.buffer);\r\n break;\r\n case \"packetBatch\":\r\n for (let packet of data.batch) {\r\n webrtc.send(packet);\r\n }\r\n break;\r\n default:\r\n }\r\n }); \r\n const transfer= [];\r\n for (let [, file] of fs.files) {\r\n transfer.push(file.buffer);\r\n }\r\n worker.postMessage({action: \"init\", files: fs.files, mpq, spawn, offscreen}, transfer);\r\n setInterval(() => {\r\n if (packetQueue.length) {\r\n worker.postMessage({action: \"packetBatch\", batch: packetQueue}, packetQueue);\r\n packetQueue.length = 0;\r\n }\r\n }, 20);\r\n delete fs.files;\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\nexport default function load_game(api, mpq, spawn) {\r\n const audio = init_sound();\r\n return do_load_game(api, audio, mpq, spawn);\r\n}\r\n","import Worker from './mpqcmp.worker.js';\r\nimport MpqBinary from './MpqCmp.wasm';\r\nimport ListFile from './ListFile.txt';\r\nimport axios from 'axios';\r\n\r\nimport { decrypt, encrypt, hash, path_name } from '../api/savefile';\r\n\r\nconst MpqSize = 156977;\r\nconst ListSize = 75542;\r\n\r\nconst readFile = (file, progress) => new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (progress) {\r\n progress({loaded: file.size});\r\n }\r\n resolve(reader.result);\r\n };\r\n reader.onerror = () => reject(reader.error);\r\n reader.onabort = () => reject();\r\n if (progress) {\r\n reader.addEventListener(\"progress\", progress);\r\n }\r\n reader.readAsArrayBuffer(file);\r\n});\r\n\r\nasync function loadFile(url, progress, responseType='arraybuffer') {\r\n const binary = await axios.request({\r\n url,\r\n responseType,\r\n onDownloadProgress: progress,\r\n });\r\n return binary.data;\r\n}\r\n\r\nfunction runWorker(data, transfer, progress) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const worker = new Worker();\r\n worker.addEventListener(\"message\", ({data}) => {\r\n switch (data.action) {\r\n case \"result\":\r\n resolve({buffer: data.buffer, blocks: data.blocks});\r\n break;\r\n case \"error\":\r\n reject({message: data.error, stack: data.stack});\r\n break;\r\n case \"progress\":\r\n progress(data.value);\r\n break;\r\n default:\r\n }\r\n });\r\n worker.postMessage({action: \"run\", ...data}, transfer);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\nexport default async function compress(mpq, progress) {\r\n progress(\"Loading...\");\r\n const files = [];\r\n function updateProgress() {\r\n progress(\"Loading...\", files.reduce((sum, {loaded, weight}) => sum + loaded * weight, 0),\r\n files.reduce((sum, {total, weight}) => sum + total * weight, 0));\r\n }\r\n const loader = file => e => { file.loaded = e.loaded; updateProgress(); };\r\n\r\n const fHeader = {loaded: 0, weight: 1, total: mpq.size};\r\n fHeader.ready = readFile(mpq.slice(0, 32), loader(fHeader));\r\n files.push(fHeader);\r\n\r\n const fBinary = {loaded: 0, weight: 5, total: MpqSize};\r\n fBinary.ready = loadFile(MpqBinary, loader(fBinary));\r\n files.push(fBinary);\r\n\r\n const fList = {loaded: 0, weight: 5, total: ListSize};\r\n fList.ready = loadFile(ListFile, loader(fList), 'text');\r\n files.push(fList);\r\n\r\n const header = new Uint32Array(await fHeader.ready);\r\n const header16 = new Uint16Array(header.buffer);\r\n\r\n if (header[0] !== 0x1A51504D) {\r\n throw Error('invalid MPQ file');\r\n }\r\n\r\n const blockSize = 1 << (9 + header16[7]);\r\n const hashTablePos = header[4];\r\n const blockTablePos = header[5];\r\n const hashTableSize = header[6];\r\n const blockTableSize = header[7];\r\n if (hashTablePos + hashTableSize * 16 > mpq.size || blockTablePos + blockTableSize * 16 > mpq.size) {\r\n throw Error('invalid MPQ file');\r\n }\r\n\r\n const fHashTable = {loaded: 0, weight: 1, total: hashTableSize * 16};\r\n const fBlockTable = {loaded: 0, weight: 1, total: blockTableSize * 16};\r\n fHeader.total -= fHashTable.total + fBlockTable.total;\r\n fHashTable.ready = readFile(mpq.slice(hashTablePos, hashTablePos + fHashTable.total), loader(fHashTable));\r\n fBlockTable.ready = readFile(mpq.slice(blockTablePos, blockTablePos + fBlockTable.total), loader(fBlockTable));\r\n files.push(fHashTable, fBlockTable);\r\n\r\n const hashTable = new Uint32Array(await fHashTable.ready);\r\n const blockTable = new Uint32Array(await fBlockTable.ready);\r\n decrypt(hashTable, hash(\"(hash table)\", 3));\r\n decrypt(blockTable, hash(\"(block table)\", 3));\r\n\r\n const list = (await fList.ready).split(\"\\n\").map(name => name.trim()).filter(name => name.length);\r\n const listMap = {};\r\n const hashStr = (h1, h2) => h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n for (let name of list) {\r\n listMap[hashStr(hash(name, 1), hash(name, 2))] = name;\r\n }\r\n\r\n const NUM_TASKS = 4;\r\n const tasks = [];\r\n for (let i = 0; i < NUM_TASKS; ++i) {\r\n tasks.push({\r\n entries: [],\r\n min: mpq.size,\r\n max: 0,\r\n progress: 0,\r\n });\r\n }\r\n \r\n for (let i = 0; i < hashTable.length / 4; ++i) {\r\n const index = hashTable[i * 4 + 3];\r\n if (index === 0xFFFFFFFF || index === 0xFFFFFFFE) {\r\n continue;\r\n }\r\n const name = listMap[hashStr(hashTable[i * 4], hashTable[i * 4 + 1])];\r\n if (!name) {\r\n hashTable[i * 4 + 3] = 0xFFFFFFFE;\r\n continue;\r\n }\r\n\r\n const filePos = blockTable[index * 4];\r\n const cSize = blockTable[index * 4 + 1];\r\n\r\n const task = tasks[Math.floor(filePos * NUM_TASKS / mpq.size)];\r\n task.entries.push(i);\r\n task.min = Math.min(task.min, filePos);\r\n task.max = Math.max(task.max, filePos + cSize);\r\n }\r\n\r\n const numFiles = tasks.reduce((sum, task) => sum + task.entries.length, 0);\r\n\r\n fHeader.total = 32;\r\n for (let task of tasks) {\r\n if (task.min < task.max) {\r\n const fLoad = {loaded: 0, weight: 1, total: task.max - task.min};\r\n task.ready = readFile(mpq.slice(task.min, task.max), loader(fLoad)).then(data => task.data = data);\r\n files.push(fLoad);\r\n }\r\n }\r\n\r\n await Promise.all(tasks.map(t => t.ready).filter(Boolean));\r\n const binary = await fBinary.ready;\r\n\r\n progress(\"Processing...\");\r\n\r\n for (let task of tasks) {\r\n if (task.data) {\r\n const input = new Uint32Array(task.entries.length * 6);\r\n task.entries.forEach((i, pos) => {\r\n const index = hashTable[i * 4 + 3];\r\n const name = listMap[hashStr(hashTable[i * 4], hashTable[i * 4 + 1])];\r\n input[pos * 6] = blockTable[index * 4];\r\n input[pos * 6 + 1] = blockTable[index * 4 + 1];\r\n input[pos * 6 + 2] = blockTable[index * 4 + 2];\r\n input[pos * 6 + 3] = blockTable[index * 4 + 3];\r\n input[pos * 6 + 4] = hash(path_name(name), 3);\r\n input[pos * 6 + 5] = name.match(/\\.wav$/i) ? 1 : 0;\r\n });\r\n task.run = runWorker({binary, mpq: task.data, input, offset: task.min, blockSize}, [task.data, input.buffer], value => {\r\n task.progress = value;\r\n const sum = tasks.reduce((sum, task) => sum + task.progress, 0);\r\n progress(\"Processing...\", sum, numFiles);\r\n }).then(res => task.result = res);\r\n }\r\n }\r\n\r\n await Promise.all(tasks.map(t => t.run).filter(Boolean));\r\n\r\n let outputPos = 32 + fHashTable.total + fBlockTable.total;\r\n const outputSize = tasks.reduce((sum, {result}) => sum + (result ? result.buffer.byteLength : 0), outputPos);\r\n const output = [header.buffer, hashTable.buffer, blockTable.buffer];\r\n\r\n blockTable.fill(0);\r\n let blockPos = 0;\r\n for (let task of tasks) {\r\n if (task.result) {\r\n const {buffer, blocks} = task.result;\r\n for (let pos = 0; pos < task.entries.length; ++pos) {\r\n const i = task.entries[pos];\r\n hashTable[i * 4 + 3] = blockPos + pos;\r\n blocks[pos * 4] += outputPos;\r\n }\r\n blockTable.set(blocks, blockPos * 4);\r\n blockPos += task.entries.length;\r\n output.push(buffer);\r\n outputPos += buffer.byteLength;\r\n }\r\n }\r\n\r\n header[1] = 32;\r\n header[2] = outputSize;\r\n header16[6] = 1;\r\n header16[7] = 7;\r\n header[4] = 32;\r\n header[5] = 32 + hashTable.length * 4;\r\n header[6] = hashTable.length / 4;\r\n header[7] = blockTable.length / 4;\r\n\r\n encrypt(hashTable, hash(\"(hash table)\", 3));\r\n encrypt(blockTable, hash(\"(block table)\", 3));\r\n\r\n return new Blob(output, {type: 'binary/octet-stream'});\r\n}\r\n","import React from 'react';\r\nimport compress from './compress';\r\n\r\nexport default class CompressMpq extends React.Component {\r\n state = {};\r\n\r\n parseFile = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n onProgress(progress) {\r\n this.setState({progress});\r\n }\r\n onDone = blob => {\r\n //const blob = new Blob([result], {type: 'binary/octet-stream'});\r\n const url = URL.createObjectURL(blob);\r\n this.setState({url});\r\n\r\n const lnk = document.createElement('a');\r\n lnk.setAttribute('href', url);\r\n lnk.setAttribute('download', 'DIABDAT.MPQ');\r\n document.body.appendChild(lnk);\r\n lnk.click();\r\n document.body.removeChild(lnk);\r\n }\r\n onError(message, stack) {\r\n const { api } = this.props;\r\n api.setState({compress: false});\r\n api.onError(message, stack);\r\n }\r\n\r\n onClose = () => {\r\n if (this.state.url) {\r\n URL.revokeObjectURL(this.state.url);\r\n }\r\n this.props.api.setState({compress: false});\r\n }\r\n\r\n start(file) {\r\n this.setState({started: true});\r\n compress(file, (text, loaded, total) => this.onProgress({text, loaded, total}))\r\n .then(this.onDone, e => this.onError(e.message, e.stack));\r\n }\r\n\r\n render() {\r\n const { url, started, progress } = this.state;\r\n if (url) {\r\n return (\r\n
\r\n

\r\n Click here if download doesn't start.\r\n

\r\n
Back
\r\n
\r\n );\r\n }\r\n if (started) {\r\n return (\r\n
\r\n {(progress && progress.text) || 'Processing...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n );\r\n }\r\n return (\r\n
\r\n

\r\n You can use this tool to reduce the original MPQ to about half its size. It encodes sounds in MP3 format and uses better compression for regular files.\r\n To begin, click the button below or drop the MPQ onto the page.\r\n

\r\n
\r\n \r\n \r\n
\r\n
Back
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport './App.scss';\r\nimport classNames from 'classnames';\r\nimport ReactGA from 'react-ga';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faTimes, faDownload } from '@fortawesome/free-solid-svg-icons';\r\nimport getPlayerName from './api/savefile';\r\n\r\nimport { mapStackTrace } from 'sourcemapped-stacktrace';\r\n\r\nimport create_fs from './fs';\r\nimport load_game from './api/loader';\r\nimport { SpawnSizes } from './api/load_spawn';\r\nimport CompressMpq from './mpqcmp';\r\n\r\nimport Peer from 'peerjs';\r\n\r\nwindow.Peer = Peer;\r\n\r\nif (process.env.NODE_ENV === 'production') {\r\n ReactGA.initialize('UA-43123589-6');\r\n ReactGA.pageview('/');\r\n}\r\n\r\nfunction reportLink(e, retail) {\r\n const message = (e.message || \"Unknown error\") + (e.stack ? \"\\n\" + e.stack : \"\");\r\n const url = new URL(\"https://github.com/d07RiV/diabloweb/issues/new\");\r\n url.searchParams.set(\"body\",\r\n`**Description:**\r\n[Please describe what you were doing before the error occurred]\r\n\r\n**App version:**\r\nDiabloWeb ${process.env.VERSION} (${retail ? 'Retail' : 'Shareware'})\r\n\r\n**Error message:**\r\n \r\n${message.split(\"\\n\").map(line => \" \" + line).join(\"\\n\")}\r\n\r\n**User agent:**\r\n\r\n ${navigator.userAgent}\r\n\r\n**Save file:**\r\n[Please attach the save file, if applicable. The error box should have a link to download the current save you were playing; alternatively, you can open dev console on the game page (F12) and type in ${\"`DownloadSaves()`\"}]\r\n`);\r\n return url.toString();\r\n}\r\n\r\nfunction isDropFile(e) {\r\n if (e.dataTransfer.items) {\r\n for (let i = 0; i < e.dataTransfer.items.length; ++i) {\r\n if (e.dataTransfer.items[i].kind === \"file\") {\r\n return true;\r\n }\r\n }\r\n } if (e.dataTransfer.files.length) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction getDropFile(e) {\r\n if (e.dataTransfer.items) {\r\n for (let i = 0; i < e.dataTransfer.items.length; ++i) {\r\n if (e.dataTransfer.items[i].kind === \"file\") {\r\n return e.dataTransfer.items[i].getAsFile();\r\n }\r\n }\r\n } if (e.dataTransfer.files.length) {\r\n return e.dataTransfer.files[0];\r\n }\r\n}\r\n\r\nconst TOUCH_MOVE = 0;\r\nconst TOUCH_RMB = 1;\r\nconst TOUCH_SHIFT = 2;\r\n\r\nfunction findKeyboardRule() {\r\n for (let sheet of document.styleSheets) {\r\n for (let rule of sheet.cssRules) {\r\n if (rule.type === CSSRule.MEDIA_RULE && rule.conditionText === '(min-aspect-ratio: 3/1)') {\r\n for (let sub of rule.cssRules) {\r\n if (sub.selectorText === '.App.keyboard .Body .inner') {\r\n return sub;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\nlet keyboardRule = null;\r\ntry {\r\n keyboardRule = findKeyboardRule();\r\n} catch (e) {\r\n}\r\n\r\nconst Link = ({children, ...props}) => {children};\r\n\r\nclass App extends React.Component {\r\n files = new Map();\r\n state = {started: false, loading: false, dropping: 0, has_spawn: false};\r\n cursorPos = {x: 0, y: 0};\r\n\r\n touchControls = false;\r\n touchButtons = [null, null, null, null, null, null];\r\n touchCtx = [null, null, null, null, null, null];\r\n touchMods = [false, false, false, false, false, false];\r\n touchBelt = [-1, -1, -1, -1, -1, -1];\r\n maxKeyboard = 0;\r\n\r\n fs = create_fs(true);\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.setTouch0 = this.setTouch_.bind(this, 0);\r\n this.setTouch1 = this.setTouch_.bind(this, 1);\r\n this.setTouch2 = this.setTouch_.bind(this, 2);\r\n this.setTouch3 = this.setTouchBelt_.bind(this, 3);\r\n this.setTouch4 = this.setTouchBelt_.bind(this, 4);\r\n this.setTouch5 = this.setTouchBelt_.bind(this, 5);\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"drop\", this.onDrop, true);\r\n document.addEventListener(\"dragover\", this.onDragOver, true);\r\n document.addEventListener(\"dragenter\", this.onDragEnter, true);\r\n document.addEventListener(\"dragleave\", this.onDragLeave, true);\r\n\r\n this.fs.then(fs => {\r\n const spawn = fs.files.get('spawn.mpq');\r\n if (spawn && SpawnSizes.includes(spawn.byteLength)) {\r\n this.setState({has_spawn: true});\r\n }\r\n if ([...fs.files.keys()].filter(name => name.match(/\\.sv$/i)).length) {\r\n this.setState({save_names: true});\r\n }\r\n });\r\n }\r\n\r\n onDrop = e => {\r\n const file = getDropFile(e);\r\n if (file) {\r\n e.preventDefault();\r\n if (this.compressMpq) {\r\n this.compressMpq.start(file);\r\n } else {\r\n this.start(file);\r\n }\r\n }\r\n this.setState({dropping: 0});\r\n }\r\n onDragEnter = e => {\r\n e.preventDefault();\r\n this.setDropping(1);\r\n }\r\n onDragOver = e => {\r\n if (isDropFile(e)) {\r\n e.preventDefault();\r\n }\r\n }\r\n onDragLeave = e => {\r\n this.setDropping(-1);\r\n }\r\n setDropping(inc) {\r\n this.setState(({dropping}) => ({dropping: Math.max(dropping + inc, 0)}));\r\n }\r\n\r\n onError(message, stack) {\r\n (async () => {\r\n const errorObject = {message};\r\n if (this.saveName) {\r\n errorObject.save = await (await this.fs).fileUrl(this.saveName);\r\n }\r\n if (stack) {\r\n mapStackTrace(stack, stack => {\r\n this.setState(({error}) => !error && {error: {...errorObject, stack: stack.join(\"\\n\")}});\r\n });\r\n } else {\r\n this.setState(({error}) => !error && {error: errorObject});\r\n }\r\n })();\r\n }\r\n\r\n openKeyboard(rect) {\r\n if (rect) {\r\n this.showKeyboard = {\r\n left: `${(100 * (rect[0] - 10) / 640).toFixed(2)}%`,\r\n top: `${(100 * (rect[1] - 10) / 480).toFixed(2)}%`,\r\n width: `${(100 * (rect[2] - rect[0] + 20) / 640).toFixed(2)}%`,\r\n height: `${(100 * (rect[3] - rect[1] + 20) / 640).toFixed(2)}%`,\r\n };\r\n this.maxKeyboard = rect[4];\r\n this.element.classList.add(\"keyboard\");\r\n Object.assign(this.keyboard.style, this.showKeyboard);\r\n this.keyboard.focus();\r\n if (keyboardRule) {\r\n keyboardRule.style.transform = `translate(-50%, ${(-(rect[1] + rect[3]) * 56.25 / 960).toFixed(2)}vw)`;\r\n }\r\n } else {\r\n this.showKeyboard = false;\r\n this.element.classList.remove(\"keyboard\");\r\n this.keyboard.blur();\r\n this.keyboard.value = \"\";\r\n this.keyboardNum = 0;\r\n }\r\n }\r\n\r\n setCursorPos(x, y) {\r\n const rect = this.canvas.getBoundingClientRect();\r\n this.cursorPos = {\r\n x: rect.left + (rect.right - rect.left) * x / 640,\r\n y: rect.top + (rect.bottom - rect.top) * y / 480,\r\n };\r\n setTimeout(() => {\r\n this.game(\"DApi_Mouse\", 0, 0, 0, x, y);\r\n });\r\n }\r\n\r\n onProgress(progress) {\r\n this.setState({progress});\r\n }\r\n\r\n onExit() {\r\n if (!this.state.error) {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n setCurrentSave(name) {\r\n this.saveName = name;\r\n }\r\n\r\n showSaves = () => {\r\n if (this.state.save_names === true) {\r\n this.updateSaves().then(() => this.setState({show_saves: !this.state.show_saves}));\r\n } else {\r\n this.setState({show_saves: !this.state.show_saves});\r\n }\r\n }\r\n updateSaves() {\r\n return this.fs.then(fs => {\r\n const saves = {};\r\n [...fs.files.keys()].filter(name => name.match(/\\.sv$/i)).forEach(name => {\r\n saves[name] = getPlayerName(fs.files.get(name).buffer, name);\r\n });\r\n this.setState({save_names: saves});\r\n });\r\n }\r\n removeSave(name) {\r\n if (window.confirm(`Are you sure you want to delete ${name}?`)) {\r\n (async () => {\r\n const fs = await this.fs;\r\n await fs.delete(name.toLowerCase());\r\n fs.files.delete(name.toLowerCase());\r\n this.updateSaves();\r\n })();\r\n }\r\n }\r\n downloadSave(name) {\r\n this.fs.then(fs => fs.download(name));\r\n }\r\n\r\n drawBelt(idx, slot) {\r\n if (!this.canvas) return;\r\n if (!this.touchButtons[idx]) {\r\n return;\r\n }\r\n this.touchBelt[idx] = slot;\r\n if (slot >= 0) {\r\n this.touchButtons[idx].style.display = \"block\";\r\n this.touchCtx[idx].drawImage(this.canvas, 205 + 29 * slot, 357, 28, 28, 0, 0, 28, 28);\r\n } else {\r\n this.touchButtons[idx].style.display = \"none\";\r\n }\r\n }\r\n\r\n updateBelt(belt) {\r\n if (belt) {\r\n const used = new Set();\r\n let pos = 3;\r\n for (let i = 0; i < belt.length && pos < 6; ++i) {\r\n if (belt[i] >= 0 && !used.has(belt[i])) {\r\n this.drawBelt(pos++, i);\r\n used.add(belt[i]);\r\n }\r\n }\r\n for (; pos < 6; ++pos) {\r\n this.drawBelt(pos, -1);\r\n }\r\n } else {\r\n this.drawBelt(3, -1);\r\n this.drawBelt(4, -1);\r\n this.drawBelt(5, -1);\r\n }\r\n }\r\n\r\n start(file) {\r\n if (file && file.name.match(/\\.sv$/i)) {\r\n this.fs.then(fs => fs.upload(file)).then(() => {\r\n this.updateSaves();\r\n });\r\n return;\r\n }\r\n if (this.state.show_saves) {\r\n return;\r\n }\r\n if (file && !file.name.match(/\\.mpq$/i)) {\r\n window.alert('Please select an MPQ file. If you downloaded the installer from GoG, you will need to install it on PC and use the MPQ file from the installation folder.');\r\n return;\r\n }\r\n\r\n document.removeEventListener(\"drop\", this.onDrop, true);\r\n document.removeEventListener(\"dragover\", this.onDragOver, true);\r\n document.removeEventListener(\"dragenter\", this.onDragEnter, true);\r\n document.removeEventListener(\"dragleave\", this.onDragLeave, true);\r\n this.setState({dropping: 0});\r\n\r\n const retail = !!(file && !file.name.match(/^spawn\\.mpq$/i));\r\n if (process.env.NODE_ENV === 'production') {\r\n ReactGA.event({\r\n category: 'Game',\r\n action: retail ? 'Start Retail' : 'Start Shareware',\r\n });\r\n }\r\n\r\n this.setState({loading: true, retail});\r\n\r\n load_game(this, file, !retail).then(game => {\r\n this.game = game;\r\n\r\n document.addEventListener('mousemove', this.onMouseMove, true);\r\n document.addEventListener('mousedown', this.onMouseDown, true);\r\n document.addEventListener('mouseup', this.onMouseUp, true);\r\n document.addEventListener('keydown', this.onKeyDown, true);\r\n document.addEventListener('keyup', this.onKeyUp, true);\r\n document.addEventListener('contextmenu', this.onMenu, true);\r\n\r\n document.addEventListener('touchstart', this.onTouchStart, {passive: false, capture: true});\r\n document.addEventListener('touchmove', this.onTouchMove, {passive: false, capture: true});\r\n document.addEventListener('touchend', this.onTouchEnd, {passive: false, capture: true});\r\n\r\n document.addEventListener('pointerlockchange', this.onPointerLockChange);\r\n window.addEventListener('resize', this.onResize);\r\n\r\n this.setState({started: true});\r\n }, e => this.onError(e.message, e.stack));\r\n }\r\n\r\n pointerLocked() {\r\n return document.pointerLockElement === this.canvas || document.mozPointerLockElement === this.canvas;\r\n }\r\n\r\n mousePos(e) {\r\n const rect = this.canvas.getBoundingClientRect();\r\n if (this.pointerLocked()) {\r\n this.cursorPos.x = Math.max(rect.left, Math.min(rect.right, this.cursorPos.x + e.movementX));\r\n this.cursorPos.y = Math.max(rect.top, Math.min(rect.bottom, this.cursorPos.y + e.movementY));\r\n } else {\r\n this.cursorPos = {x: e.clientX, y: e.clientY};\r\n }\r\n return {\r\n x: Math.max(0, Math.min(Math.round((this.cursorPos.x - rect.left) / (rect.right - rect.left) * 640), 639)),\r\n y: Math.max(0, Math.min(Math.round((this.cursorPos.y - rect.top) / (rect.bottom - rect.top) * 480), 479)),\r\n };\r\n }\r\n\r\n mouseButton(e) {\r\n switch (e.button) {\r\n case 0: return 1;\r\n case 1: return 4;\r\n case 2: return 2;\r\n case 3: return 5;\r\n case 4: return 6;\r\n default: return 1;\r\n }\r\n }\r\n eventMods(e) {\r\n return ((e.shiftKey || this.touchMods[TOUCH_SHIFT]) ? 1 : 0) + (e.ctrlKey ? 2 : 0) + (e.altKey ? 4 : 0) + (e.touches ? 8 : 0);\r\n }\r\n\r\n onResize = () => {\r\n document.exitPointerLock();\r\n }\r\n\r\n onPointerLockChange = () => {\r\n if (window.screen && window.innerHeight === window.screen.height && !this.pointerLocked()) {\r\n // assume that the user pressed escape\r\n this.game(\"DApi_Key\", 0, 0, 27);\r\n this.game(\"DApi_Key\", 1, 0, 27);\r\n }\r\n }\r\n\r\n onMouseMove = e => {\r\n if (!this.canvas) return;\r\n const {x, y} = this.mousePos(e);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n e.preventDefault();\r\n }\r\n\r\n onMouseDown = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n }\r\n if (this.touchControls) {\r\n this.touchControls = false;\r\n this.element.classList.remove(\"touch\");\r\n }\r\n const {x, y} = this.mousePos(e);\r\n if (window.screen && window.innerHeight === window.screen.height) {\r\n // we're in fullscreen, let's get pointer lock!\r\n if (!this.pointerLocked()) {\r\n this.canvas.requestPointerLock();\r\n }\r\n }\r\n this.game(\"DApi_Mouse\", 1, this.mouseButton(e), this.eventMods(e), x, y);\r\n e.preventDefault();\r\n }\r\n\r\n onMouseUp = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n //return;\r\n }\r\n const {x, y} = this.mousePos(e);\r\n this.game(\"DApi_Mouse\", 2, this.mouseButton(e), this.eventMods(e), x, y);\r\n if (e.target !== this.keyboard) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n onKeyDown = e => {\r\n if (!this.canvas) return;\r\n this.game(\"DApi_Key\", 0, this.eventMods(e), e.keyCode);\r\n if (!this.showKeyboard && (e.keyCode >= 32 && e.key.length === 1)) {\r\n this.game(\"DApi_Char\", e.key.charCodeAt(0));\r\n } else if (e.keyCode === 8 || e.keyCode === 13) {\r\n this.game(\"DApi_Char\", e.keyCode);\r\n }\r\n this.clearKeySel();\r\n if (!this.showKeyboard) {\r\n if (e.keyCode === 8 || e.keyCode === 9 || (e.keyCode >= 112 && e.keyCode <= 119)) {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onMenu = e => {\r\n e.preventDefault();\r\n }\r\n\r\n onKeyUp = e => {\r\n if (!this.canvas) return;\r\n this.game(\"DApi_Key\", 1, this.eventMods(e), e.keyCode);\r\n this.clearKeySel();\r\n }\r\n\r\n clearKeySel() {\r\n if (this.showKeyboard) {\r\n const len = this.keyboard.value.length;\r\n this.keyboard.setSelectionRange(len, len);\r\n }\r\n }\r\n\r\n onKeyboardInner(flags) {\r\n if (this.showKeyboard) {\r\n const text = this.keyboard.value;\r\n let valid;\r\n if (this.maxKeyboard > 0) {\r\n valid = (text.match(/[\\x20-\\x7E]/g) || []).join(\"\").substring(0, this.maxKeyboard);\r\n } else {\r\n const maxValue = -this.maxKeyboard;\r\n if (text.match(/^\\d*$/)) {\r\n this.keyboardNum = Math.min(text.length ? parseInt(text) : 0, maxValue);\r\n }\r\n valid = (this.keyboardNum ? this.keyboardNum.toString() : \"\");\r\n }\r\n if (text !== valid) {\r\n this.keyboard.value = valid;\r\n }\r\n this.clearKeySel();\r\n this.game(\"text\", valid, flags);\r\n }\r\n }\r\n onKeyboard = () => {\r\n this.onKeyboardInner(0);\r\n }\r\n onKeyboardBlur = () => {\r\n this.onKeyboardInner(1);\r\n }\r\n\r\n parseFile = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n parseSave = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n touchButton = null;\r\n touchCanvas = null;\r\n\r\n setTouchMod(index, value, use) {\r\n if (index < 3) {\r\n this.touchMods[index] = value;\r\n if (this.touchButtons[index]) {\r\n this.touchButtons[index].classList.toggle(\"active\", value);\r\n }\r\n } else if (use && this.touchBelt[index] >= 0) {\r\n const now = performance.now();\r\n if (!this.beltTime || now - this.beltTime > 750) {\r\n this.game(\"DApi_Char\", 49 + this.touchBelt[index]);\r\n this.beltTime = now;\r\n }\r\n }\r\n }\r\n\r\n updateTouchButton(touches, release) {\r\n let touchOther = null;\r\n if (!this.touchControls) {\r\n this.touchControls = true;\r\n this.element.classList.add(\"touch\");\r\n }\r\n const btn = this.touchButton;\r\n for (let {target, identifier, clientX, clientY} of touches) {\r\n if (btn && btn.id === identifier && this.touchButtons[btn.index] === target) {\r\n if (touches.length > 1) {\r\n btn.stick = false;\r\n }\r\n btn.clientX = clientX;\r\n btn.clientY = clientY;\r\n this.touchCanvas = [...touches].find(t => t.identifier !== identifier);\r\n if (this.touchCanvas) {\r\n this.touchCanvas = {clientX: this.touchCanvas.clientX, clientY: this.touchCanvas.clientY};\r\n }\r\n delete this.panPos;\r\n return this.touchCanvas != null;\r\n }\r\n const idx = this.touchButtons.indexOf(target);\r\n if (idx >= 0 && !touchOther) {\r\n touchOther = {id: identifier, index: idx, stick: true, original: this.touchMods[idx], clientX, clientY};\r\n }\r\n }\r\n if (btn && !touchOther && release && btn.stick) {\r\n const rect = this.touchButtons[btn.index].getBoundingClientRect();\r\n const {clientX, clientY} = btn;\r\n if (clientX >= rect.left && clientX < rect.right && clientY >= rect.top && clientY < rect.bottom) {\r\n this.setTouchMod(btn.index, !btn.original, true);\r\n } else {\r\n this.setTouchMod(btn.index, btn.original);\r\n }\r\n } else if (btn) {\r\n this.setTouchMod(btn.index, false);\r\n }\r\n this.touchButton = touchOther;\r\n if (touchOther) {\r\n this.setTouchMod(touchOther.index, true);\r\n if (touchOther.index === TOUCH_MOVE) {\r\n this.setTouchMod(TOUCH_RMB, false);\r\n } else if (touchOther.index === TOUCH_RMB) {\r\n this.setTouchMod(TOUCH_MOVE, false);\r\n }\r\n delete this.panPos;\r\n } else if (touches.length === 2) {\r\n const x = (touches[1].clientX + touches[0].clientX) / 2, y = (touches[1].clientY + touches[0].clientY) / 2;\r\n if (this.panPos) {\r\n const dx = x - this.panPos.x, dy = y - this.panPos.y;\r\n const step = this.canvas.offsetHeight / 12;\r\n if (Math.max(Math.abs(dx), Math.abs(dy)) > step) {\r\n let key;\r\n if (Math.abs(dx) > Math.abs(dy)) {\r\n key = (dx > 0 ? 0x25 : 0x27);\r\n } else {\r\n key = (dy > 0 ? 0x26 : 0x28);\r\n }\r\n this.game(\"DApi_Key\", 0, 0, key);\r\n // key up is ignored anyway\r\n this.panPos = {x, y};\r\n }\r\n } else {\r\n this.game(\"DApi_Mouse\", 0, 0, 24, 320, 180);\r\n this.game(\"DApi_Mouse\", 2, 1, 24, 320, 180);\r\n this.panPos = {x, y};\r\n }\r\n this.touchCanvas = null;\r\n return false;\r\n } else {\r\n delete this.panPos;\r\n }\r\n this.touchCanvas = [...touches].find(t => !touchOther || t.identifier !== touchOther.id);\r\n if (this.touchCanvas) {\r\n this.touchCanvas = {clientX: this.touchCanvas.clientX, clientY: this.touchCanvas.clientY};\r\n }\r\n return this.touchCanvas != null;\r\n }\r\n\r\n onTouchStart = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n } else {\r\n this.keyboard.blur();\r\n }\r\n e.preventDefault();\r\n if (this.updateTouchButton(e.touches, false)) {\r\n const {x, y} = this.mousePos(this.touchCanvas);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n if (!this.touchMods[TOUCH_MOVE]) {\r\n this.game(\"DApi_Mouse\", 1, this.touchMods[TOUCH_RMB] ? 2 : 1, this.eventMods(e), x, y);\r\n }\r\n }\r\n }\r\n onTouchMove = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n }\r\n e.preventDefault();\r\n if (this.updateTouchButton(e.touches, false)) {\r\n const {x, y} = this.mousePos(this.touchCanvas);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n }\r\n }\r\n onTouchEnd = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n //return;\r\n } else {\r\n e.preventDefault();\r\n }\r\n const prevTc = this.touchCanvas;\r\n this.updateTouchButton(e.touches, true);\r\n if (prevTc && !this.touchCanvas) {\r\n const {x, y} = this.mousePos(prevTc);\r\n this.game(\"DApi_Mouse\", 2, 1, this.eventMods(e), x, y);\r\n this.game(\"DApi_Mouse\", 2, 2, this.eventMods(e), x, y);\r\n\r\n if (this.touchMods[TOUCH_RMB] && (!this.touchButton || this.touchButton.index !== TOUCH_RMB)) {\r\n this.setTouchMod(TOUCH_RMB, false);\r\n }\r\n }\r\n if (!document.fullscreenElement) {\r\n this.element.requestFullscreen();\r\n }\r\n }\r\n\r\n setCanvas = e => this.canvas = e;\r\n setElement = e => this.element = e;\r\n setKeyboard = e => this.keyboard = e;\r\n setTouch_(i, e) {\r\n this.touchButtons[i] = e;\r\n }\r\n setTouchBelt_(i, e) {\r\n this.touchButtons[i] = e;\r\n if (e) {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = 28;\r\n canvas.height = 28;\r\n e.appendChild(canvas);\r\n this.touchCtx[i] = canvas.getContext(\"2d\");\r\n } else {\r\n this.touchCtx[i] = null;\r\n }\r\n }\r\n\r\n renderUi() {\r\n const {started, loading, error, progress, has_spawn, save_names, show_saves, compress} = this.state;\r\n if (show_saves && typeof save_names === \"object\") {\r\n const plrClass = [\"Warrior\", \"Rogue\", \"Sorcerer\"];\r\n return (\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
this.setState({show_saves: false})}>Back
\r\n
\r\n );\r\n } else if (compress) {\r\n return (\r\n this.compressMpq = e}/>\r\n );\r\n } else if (error) {\r\n return (\r\n \r\n

The following error has occurred:

\r\n

{error.message}

\r\n

Click to create an issue on GitHub

\r\n {error.save != null && Download save file}\r\n \r\n );\r\n } else if (loading && !started) {\r\n return (\r\n
\r\n {(progress && progress.text) || 'Loading...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n );\r\n } else if (!started) {\r\n return (\r\n
\r\n

\r\n This is a web port of the original Diablo game, based on source code reconstructed by\r\n GalaXyHaXz and devilution team. The project page with information and links can be found over here https://github.com/d07RiV/diabloweb\r\n

\r\n

\r\n If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing.\r\n The game can be purchased from GoG.\r\n {\" \"} this.setState({compress: true})}>Click here to compress the MPQ, greatly reducing its size.\r\n

\r\n {!has_spawn && (\r\n

\r\n Or you can play the shareware version for free (50MB download).\r\n

\r\n )}\r\n
\r\n \r\n \r\n
\r\n
this.start()}>Play Shareware
\r\n {!!save_names &&
Manage Saves
}\r\n
\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const {started, error, dropping} = this.state;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {!error && }\r\n \r\n
\r\n
\r\n
\r\n {this.renderUi()}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './reset.css';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\nimport App from './App';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\nserviceWorker.register({\r\n onUpdate() {\r\n },\r\n});\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.3c2a83da.chunk.js b/static/js/main.62369ba5.chunk.js similarity index 55% rename from static/js/main.3c2a83da.chunk.js rename to static/js/main.62369ba5.chunk.js index bba7b98..f35344d 100644 --- a/static/js/main.3c2a83da.chunk.js +++ b/static/js/main.62369ba5.chunk.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{12:function(e,t,n){"use strict";n.d(t,"a",function(){return b});var r=n(8),a=n(1),o=n.n(a),i=n(3),s=n(15),c=n.n(s);function u(e,t){return l.apply(this,arguments)}function l(){return(l=Object(i.a)(o.a.mark(function e(t,n){var r,a,i,s;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.get(n.toLowerCase());case 2:(r=e.sent)?(a=new Blob([r],{type:"binary/octet-stream"}),i=URL.createObjectURL(a),(s=document.createElement("a")).setAttribute("href",i),s.setAttribute("download",n),document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(i)):console.error("File ".concat(n," does not exist"));case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function f(e){return d.apply(this,arguments)}function d(){return(d=Object(i.a)(o.a.mark(function e(t){var n,r,a,i,s,c;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=!0,r=!1,a=void 0,e.prev=3,e.next=6,t.keys();case 6:e.t0=Symbol.iterator,i=e.sent[e.t0]();case 8:if(n=(s=i.next()).done){e.next=14;break}(c=s.value).match(/\.sv$/i)&&u(t,c);case 11:n=!0,e.next=8;break;case 14:e.next=20;break;case 16:e.prev=16,e.t1=e.catch(3),r=!0,a=e.t1;case 20:e.prev=20,e.prev=21,n||null==i.return||i.return();case 23:if(e.prev=23,!r){e.next=26;break}throw a;case 26:return e.finish(23);case 27:return e.finish(20);case 28:case"end":return e.stop()}},e,null,[[3,16,20,28],[21,,23,27]])}))).apply(this,arguments)}var h=function(e){return new Promise(function(t,n){var r=new FileReader;r.onload=function(){return t(r.result)},r.onerror=function(){return n(r.error)},r.onabort=function(){return n()},r.readAsArrayBuffer(e)})};function v(e,t,n){return p.apply(this,arguments)}function p(){return(p=Object(i.a)(o.a.mark(function e(t,n,r){var a;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=Uint8Array,e.next=3,h(r);case 3:return e.t1=e.sent,a=new e.t0(e.t1),n.set(r.name.toLowerCase(),a),e.abrupt("return",t.set(r.name.toLowerCase(),a));case 7:case"end":return e.stop()}},e)}))).apply(this,arguments)}function b(e){return y.apply(this,arguments)}function y(){return(y=Object(i.a)(o.a.mark(function e(t){var n,a,s,l,d,h,p,b;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n=new c.a("diablo_fs"),a=new Map,s=0,e.t0=Object,e.next=7,n.json();case 7:e.t1=e.sent,l=e.t0.entries.call(e.t0,e.t1);case 9:if(!(s>>=t,T;if(e.bit_buff>>=e.extra_bits,e.in_pos===e.in_bytes){if(0===(e.in_bytes=e.read_buf(e.in_buff)))return P;e.in_pos=0}return e.bit_buff|=e.in_buff[e.in_pos++]<<8,e.bit_buff>>>=t-e.extra_bits,e.extra_bits=e.extra_bits-t+8,T}function Y(e){if(1&e.bit_buff){if(X(e,1))return 774;var t=e.LengthCodes[255&e.bit_buff];if(X(e,e.LenBits[t]))return 774;var n=e.ExLenBits[t];if(0!==n){var r=e.bit_buff&(1<r.dsize_bits||r.dsize_bits>6)return B;if(r.dsize_mask=65535>>16-r.dsize_bits,r.ctype!=M){if(r.ctype!=S)return O;r.ChBitsAsc.set(F),function(e){for(var t=255,n=255;t>=0;t--,n--){var r=e.ChBitsAsc[n],a=void 0;if(r<=8){var o=1<>4;do{e.offs2D34[a]=n,a+=i}while(a<256)}else{r-=6,e.ChBitsAsc[n]=r;var s=1<>6;do{e.offs2E34[a]=n,a+=s}while(a<128)}else{r-=8,e.ChBitsAsc[n]=r;var c=1<>8;do{e.offs2EB4[a]=n,a+=c}while(a<256)}}}(r)}return r.LenBits.set(I),G(r.LengthCodes,K,r.LenBits,r.LenBits.length),r.ExLenBits.set(z),r.LenBase.set(R),r.DistBits.set(U),G(r.DistPosCodes,N,r.DistBits,r.DistBits.length),774!==function(e){for(var t,n,r=4096;(t=n=Y(e))<773;){if(n>=256){var a=n-254,o=J(e,a);if(0===o){t=774;break}var i=r,s=i-o;r+=a;for(var c=e.out_buff;a-- >0;)c[i++]=c[s++]}else e.out_buff[r++]=n;r>=8192&&(e.write_buf(e.out_buff.subarray(4096,8192)),e.out_buff.copyWithin(0,4096,r),r-=4096)}return e.write_buf(e.out_buff.subarray(4096,r)),t}(r)?j:D}var Q=new Uint32Array(80),H=function(e,t){return t<>32-e},$=function(){function e(){Object(p.a)(this,e),this.digest=new Uint32Array(5),this.count=0,this.digest[0]=1732584193,this.digest[1]=4023233417,this.digest[2]=2562383102,this.digest[3]=271733878,this.digest[4]=3285377520,this.digest8=new Uint8Array(this.digest.buffer)}return Object(b.a)(e,[{key:"input8",value:function(e){var t=new Uint32Array(e.buffer,e.byteOffset,16);this.input(t)}},{key:"input",value:function(e){this.count+=32*e.length;for(var t=0;t<16;++t)Q[t]=e[t];for(var n=16;n<80;++n)Q[n]=Q[n-16]^Q[n-14]^Q[n-8]^Q[n-3];for(var r=this.digest[0],a=this.digest[1],o=this.digest[2],i=this.digest[3],s=this.digest[4],c=0;c<20;c++){var u=H(5,r)+(a&o|~a&i)+s+Q[c]+1518500249;s=i,i=o,o=H(30,a),a=r,r=0|u}for(var l=20;l<40;l++){var f=H(5,r)+(a^o^i)+s+Q[l]+1859775393;s=i,i=o,o=H(30,a),a=r,r=0|f}for(var d=40;d<60;d++){var h=H(5,r)+(a&o|a&i|o&i)+s+Q[d]+2400959708;s=i,i=o,o=H(30,a),a=r,r=0|h}for(var v=60;v<80;v++){var p=H(5,r)+(a^o^i)+s+Q[v]+3395469782;s=i,i=o,o=H(30,a),a=r,r=0|p}this.digest[0]+=r,this.digest[1]+=a,this.digest[2]+=o,this.digest[3]+=i,this.digest[4]+=s}}]),e}(),V=function(){function e(t){Object(p.a)(this,e),this.seed=t}return Object(b.a)(e,[{key:"next",value:function(){return this.seed=(3*this.seed<<16)+(67*this.seed<<8)+253*this.seed+2531011|0,this.seed>>16&32767}}]),e}();function Z(e,t){if(!(e.length<=8)){var n=e.length-8;if(!(n%64)&&!e[n+4]){for(var r=e[n+5],a=new Uint8Array(n+r-64),o=function(e){for(var t=new V(28760),n=new Uint8Array(136),r=new Uint32Array(n.buffer),a=0;a<136;++a)n[a]=t.next();for(var o=new Uint8Array(64),i=0;i<64;++i)o[i]=e.charCodeAt(i%e.length);var s=new $;s.input8(o);for(var c=0;c<34;++c)r[c]^=s.digest[c%s.digest.length];return(s=new $).input(r.subarray(18)),s}(t),i=n>>2,s=new Uint32Array(e.buffer,e.byteOffset,i+1),c=new Uint32Array(16),u=new Uint8Array(c.buffer),l=0;lt)throw Error("decompress buffer overflow");n.set(e,a),a+=e.length})||a!==t?null:n}var te=function(){for(var e=new Uint32Array(1280),t=1048577,n=0;n<256;n++)for(var r=n;r<1280;r+=256){var a=(65535&(t=(125*t+3)%2796203))<<16,o=65535&(t=(125*t+3)%2796203);e[r]=a|o}return e}();function ne(e,t){for(var n=4008636142,r=0;r>>11}function re(e,t){ne(new Uint32Array(e.buffer,e.byteOffset,e.length>>2),t)}function ae(e,t){for(var n=4008636142,r=0;r>>11}}function oe(e,t){for(var n=2146271213,r=4008636142,a=0;a=97&&o<=122&&(o-=32),47===o&&(o=92),r=o+(n=te[256*t+o]^n+r)+33*r+3|0}return n>>>0}function ie(e){var t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return e.substring(t+1)}var se=256,ce=512,ue=65280,le=65536,fe=131072,de=1048576,he=16777216,ve=function(){function e(t){Object(p.a)(this,e),this.buffer=t,this.u8=new Uint8Array(t),this.u32=new Uint32Array(t,0,t.byteLength>>2),this.readHeader()}return Object(b.a)(e,[{key:"readHeader",value:function(){var e=this.u8,t=this.u32;if(441536589!==t[0])throw Error("invalid MPQ header");var n=e[14]+(e[15]<<8),r=t[4],a=t[5],o=t[6],i=t[7];this.hashTable=this.readTable(r,o,"(hash table)"),this.blockTable=this.readTable(a,i,"(block table)"),this.blockSize=1<<9+n}},{key:"readTable",value:function(e,t,n){var r=new Uint32Array(this.buffer.slice(e,e+16*t));return ne(r,oe(n,3)),r}},{key:"fileIndex",value:function(e){for(var t=this.hashTable,n=t.length>>2,r=oe(e,0)%n,a=oe(e,1),o=oe(e,2),i=r,s=0;4294967295!==t[4*i+3]&&sthis.buffer.byteLength))return r.flags&ue||(r.cmpSize=r.fileSize),r.flags&fe&&(r.key=r.key+r.filePos^r.fileSize),{info:r,data:new Uint8Array(this.buffer,r.filePos,r.cmpSize)}}}},{key:"read",value:function(e){var t=this.readRaw(e);if(t){var n=t.info,r=t.data;if(r=r.slice(),n.flags&he){if(n.flags&le&&re(r,n.key),n.flags&ce)return;return n.flags&se?ee(r,n.fileSize):r}if(n.flags&ue){var a=Math.floor((n.fileSize+this.blockSize-1)/this.blockSize),o=a+1;if(r.length<4*o)return;var i=new Uint32Array(r.buffer,0,o);n.flags&le&&ne(i,n.key-1);for(var s=new Uint8Array(n.fileSize),c=0;cr.length)return;var f=r.subarray(i[c],i[c+1]);if(n.flags&le&&re(f,n.key+c),n.flags&ce)return;if(n.flags&se&&(f=ee(f,l)),!f||f.length!==l)return;s.set(f,u)}return s}if(n.flags&le)for(var d=0;d=this.buffer.byteLength)throw Error("packet too small");return this.buffer[this.pos++]}},{key:"read16",value:function(){var e=this.pos,t=this.buffer;if(e+2>t.byteLength)throw Error("packet too small");var n=t[e]|t[e+1]<<8;return this.pos+=2,n}},{key:"read32",value:function(){var e=this.pos,t=this.buffer;if(e+4>t.byteLength)throw Error("packet too small");var n=t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24;return this.pos+=4,n}},{key:"read_str",value:function(){var e=this.read8(),t=this.pos,n=this.buffer;if(t+e>n.byteLength)throw Error("packet too small");var r=String.fromCharCode.apply(String,Object(v.a)(n.subarray(t,t+e)));return this.pos+=e,r}},{key:"read_buf",value:function(){var e=this.read32(),t=this.buffer.subarray(this.pos,this.pos+e);return this.pos+=e,t}}]),e}(),Se=function(){function e(t){Object(p.a)(this,e),this.buffer=new Uint8Array(t),this.pos=0}return Object(b.a)(e,[{key:"write8",value:function(e){return this.buffer[this.pos++]=e,this}},{key:"write16",value:function(e){var t=this.pos,n=this.buffer;return n[t]=e,n[t+1]=e>>8,this.pos+=2,this}},{key:"write32",value:function(e){var t=this.pos,n=this.buffer;return n[t]=e,n[t+1]=e>>8,n[t+2]=e>>16,n[t+3]=e>>24,this.pos+=4,this}},{key:"write_str",value:function(e){var t=e.length;this.write8(t);for(var n=this.pos,r=this.buffer,a=0;a=4?e.send(Le(Te.join_reject,{cookie:s.cookie,reason:je.JOIN_GAME_FULL})):(t.players[c]=n,n.id=c,e.send(Le(Te.join_accept,{cookie:s.cookie,index:c,seed:t.seed,difficulty:t.difficulty})),t.send(255,Le(Te.connect,{id:c})))}break;default:if(null==n.id)return;t.handle(n.id,i.code,s)}if(!a.done())throw Error("packet too large")}),e.on("close",function(){null!=n.id&&t.drop(n.id,1073741830)})}},{key:"send",value:function(e,t){for(var n=1;n<4;++n)e&1<>16&255,P=D>>8&255,U=255&D;t.fillStyle="rgb(".concat(T,", ").concat(P,", ").concat(U,")"),t.fillText(L,B,O+22)}}catch(N){C=!0,A=N}finally{try{E||null==S.return||S.return()}finally{if(C)throw A}}t.restore()}}e.updateBelt(s)}function Fe(){return(Fe=Object(h.a)(f.a.mark(function e(t,n,r,a){var o,i,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fs;case 2:if(o=e.sent,!a||r){e.next=6;break}return e.next=6,xe(t,o);case 6:return i=null,s=!1,i=t.canvas.getContext("2d",{alpha:!1}),e.next=10,new Promise(function(e,c){try{var l=new me.a,f=[],d=Ie(function(e){f.push(e)});l.addEventListener("message",function(r){var a=r.data;switch(a.action){case"loaded":e(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r2&&void 0!==o[2]?o[2]:"arraybuffer",e.next=3,ke.a.request({url:t,responseType:r,onDownloadProgress:n});case 3:return a=e.sent,e.abrupt("return",a.data);case 5:case"end":return e.stop()}},e)}))).apply(this,arguments)}function tt(e,t,n){return new Promise(function(r,a){try{var o=new Xe.a;o.addEventListener("message",function(e){var t=e.data;switch(t.action){case"result":r({buffer:t.buffer,blocks:t.blocks});break;case"error":a({message:t.error,stack:t.stack});break;case"progress":n(t.value)}}),o.postMessage(Object(d.a)({action:"run"},e),t)}catch(i){a(i)}})}function nt(){return(nt=Object(h.a)(f.a.mark(function e(t,n){var r,a,o,i,s,c,u,l,d,h,v,p,b,y,m,w,g,k,_,x,E,C,A,M,S,j,B,O,L,D,T,P,U,N,z,R,I,K,F,q,G,X,Y,J,W,Q,H,$,V,Z,ee,te,re,se;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){n("Loading...",r.reduce(function(e,t){return e+t.loaded*t.weight},0),r.reduce(function(e,t){return e+t.total*t.weight},0))},n("Loading..."),r=[],o=function(e){return function(t){e.loaded=t.loaded,a()}},(i={loaded:0,weight:1,total:t.size}).ready=Ve(t.slice(0,32),o(i)),r.push(i),(s={loaded:0,weight:5,total:He}).ready=Ze(Je.a,o(s)),r.push(s),(c={loaded:0,weight:5,total:$e}).ready=Ze(Qe.a,o(c),"text"),r.push(c),e.t0=Uint32Array,e.next=16,i.ready;case 16:if(e.t1=e.sent,u=new e.t0(e.t1),l=new Uint16Array(u.buffer),441536589===u[0]){e.next=21;break}throw Error("invalid MPQ file");case 21:if(d=1<<9+l[7],h=u[4],v=u[5],p=u[6],b=u[7],!(h+16*p>t.size||v+16*b>t.size)){e.next=28;break}throw Error("invalid MPQ file");case 28:return y={loaded:0,weight:1,total:16*p},m={loaded:0,weight:1,total:16*b},i.total-=y.total+m.total,y.ready=Ve(t.slice(h,h+y.total),o(y)),m.ready=Ve(t.slice(v,v+m.total),o(m)),r.push(y,m),e.t2=Uint32Array,e.next=37,y.ready;case 37:return e.t3=e.sent,w=new e.t2(e.t3),e.t4=Uint32Array,e.next=42,m.ready;case 42:return e.t5=e.sent,g=new e.t4(e.t5),ne(w,oe("(hash table)",3)),ne(g,oe("(block table)",3)),e.next=48,c.ready;case 48:for(e.t6=function(e){return e.trim()},e.t7=function(e){return e.length},k=e.sent.split("\n").map(e.t6).filter(e.t7),_={},x=function(e,t){return e.toString(16).padStart(8,"0")+t.toString(16).padStart(8,"0")},E=!0,C=!1,A=void 0,e.prev=56,M=k[Symbol.iterator]();!(E=(S=M.next()).done);E=!0)j=S.value,_[x(oe(j,1),oe(j,2))]=j;e.next=64;break;case 60:e.prev=60,e.t8=e.catch(56),C=!0,A=e.t8;case 64:e.prev=64,e.prev=65,E||null==M.return||M.return();case 67:if(e.prev=67,!C){e.next=70;break}throw A;case 70:return e.finish(67);case 71:return e.finish(64);case 72:for(B=4,O=[],L=0;L0&&n.start(t[0])},n.onDone=function(e){var t=URL.createObjectURL(e);n.setState({url:t});var r=document.createElement("a");r.setAttribute("href",t),r.setAttribute("download","DIABDAT.MPQ"),document.body.appendChild(r),r.click(),document.body.removeChild(r)},n.onClose=function(){n.state.url&&URL.revokeObjectURL(n.state.url),n.props.api.setState({compress:!1})},n}return Object(g.a)(t,e),Object(b.a)(t,[{key:"onProgress",value:function(e){this.setState({progress:e})}},{key:"onError",value:function(e,t){var n=this.props.api;n.setState({compress:!1}),n.onError(e,t)}},{key:"start",value:function(e){var t=this;this.setState({started:!0}),function(e,t){return nt.apply(this,arguments)}(e,function(e,n,r){return t.onProgress({text:e,loaded:n,total:r})}).then(this.onDone,function(e){return t.onError(e.message,e.stack)})}},{key:"render",value:function(){var e=this.state,t=e.url,n=e.started,r=e.progress;return t?a.a.createElement("div",{className:"start"},a.a.createElement("p",null,a.a.createElement("a",{href:t,download:"DIABDAT.MPQ"},"Click here if download doesn't start.")),a.a.createElement("div",{className:"startButton",onClick:this.onClose},"Back")):n?a.a.createElement("div",{className:"loading"},r&&r.text||"Processing...",null!=r&&!!r.total&&a.a.createElement("span",{className:"progressBar"},a.a.createElement("span",null,a.a.createElement("span",{style:{width:"".concat(Math.round(100*r.loaded/r.total),"%")}})))):a.a.createElement("div",{className:"start"},a.a.createElement("p",null,"You can use this tool to reduce the original MPQ to about half its size. It encodes sounds in MP3 format and uses better compression for regular files. To begin, click the button below or drop the MPQ onto the page."),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Select MPQ"),a.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseFile})),a.a.createElement("div",{className:"startButton",onClick:this.onClose},"Back"))}}]),t}(a.a.Component);function at(e,t){var n=(e.message||"Unknown error")+(e.stack?"\n"+e.stack:""),r=new URL("https://github.com/d07RiV/diabloweb/issues/new");return r.searchParams.set("body","**Description:**\n[Please describe what you were doing before the error occurred]\n\n**App version:**\nDiabloWeb ".concat("1.0.39"," (").concat(t?"Retail":"Shareware",")\n\n**Error message:**\n \n").concat(n.split("\n").map(function(e){return" "+e}).join("\n"),"\n\n**User agent:**\n\n ").concat(navigator.userAgent,"\n\n**Save file:**\n[Please attach the save file, if applicable. The error box should have a link to download the current save you were playing; alternatively, you can open dev console on the game page (F12) and type in ","`DownloadSaves()`","]\n")),r.toString()}window.Peer=Ae.a,E.a.initialize("UA-43123589-6"),E.a.pageview("/");var ot=0,it=1;var st=null;try{st=function(){var e=!0,t=!1,n=void 0;try{for(var r,a=document.styleSheets[Symbol.iterator]();!(e=(r=a.next()).done);e=!0){var o=r.value,i=!0,s=!1,c=void 0;try{for(var u,l=o.cssRules[Symbol.iterator]();!(i=(u=l.next()).done);i=!0){var f=u.value;if(f.type===CSSRule.MEDIA_RULE&&"(min-aspect-ratio: 3/1)"===f.conditionText){var d=!0,h=!1,v=void 0;try{for(var p,b=f.cssRules[Symbol.iterator]();!(d=(p=b.next()).done);d=!0){var y=p.value;if(".App.keyboard .Body .inner"===y.selectorText)return y}}catch(m){h=!0,v=m}finally{try{d||null==b.return||b.return()}finally{if(h)throw v}}}}}catch(m){s=!0,c=m}finally{try{i||null==l.return||l.return()}finally{if(s)throw c}}}}catch(m){t=!0,n=m}finally{try{e||null==a.return||a.return()}finally{if(t)throw n}}}()}catch(lt){}var ct=function(e){var t=e.children,n=Object(k.a)(e,["children"]);return a.a.createElement("a",Object.assign({target:"_blank",rel:"noopener noreferrer"},n),t)},ut=function(e){function t(e){var n;return Object(p.a)(this,t),(n=Object(y.a)(this,Object(m.a)(t).call(this,e))).files=new Map,n.state={started:!1,loading:!1,dropping:0,has_spawn:!1},n.cursorPos={x:0,y:0},n.touchControls=!1,n.touchButtons=[null,null,null,null,null,null],n.touchCtx=[null,null,null,null,null,null],n.touchMods=[!1,!1,!1,!1,!1,!1],n.touchBelt=[-1,-1,-1,-1,-1,-1],n.maxKeyboard=0,n.fs=Object(be.a)(!0),n.onDrop=function(e){var t=function(e){if(e.dataTransfer.items)for(var t=0;t=32&&1===e.key.length?n.game("DApi_Char",e.key.charCodeAt(0)):8!==e.keyCode&&13!==e.keyCode||n.game("DApi_Char",e.keyCode),n.clearKeySel(),n.showKeyboard||(8===e.keyCode||9===e.keyCode||e.keyCode>=112&&e.keyCode<=119)&&e.preventDefault())},n.onMenu=function(e){e.preventDefault()},n.onKeyUp=function(e){n.canvas&&(n.game("DApi_Key",1,n.eventMods(e),e.keyCode),n.clearKeySel())},n.onKeyboard=function(){n.onKeyboardInner(0)},n.onKeyboardBlur=function(){n.onKeyboardInner(1)},n.parseFile=function(e){var t=e.target.files;t.length>0&&n.start(t[0])},n.parseSave=function(e){var t=e.target.files;t.length>0&&n.start(t[0])},n.touchButton=null,n.touchCanvas=null,n.onTouchStart=function(e){if(n.canvas&&e.target!==n.keyboard&&(n.keyboard.blur(),e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),r=t.x,a=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),r,a),n.touchMods[ot]||n.game("DApi_Mouse",1,n.touchMods[it]?2:1,n.eventMods(e),r,a)}},n.onTouchMove=function(e){if(n.canvas&&e.target!==n.keyboard&&(e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),r=t.x,a=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),r,a)}},n.onTouchEnd=function(e){if(n.canvas){e.target===n.keyboard||e.preventDefault();var t=n.touchCanvas;if(n.updateTouchButton(e.touches,!0),t&&!n.touchCanvas){var r=n.mousePos(t),a=r.x,o=r.y;n.game("DApi_Mouse",2,1,n.eventMods(e),a,o),n.game("DApi_Mouse",2,2,n.eventMods(e),a,o),!n.touchMods[it]||n.touchButton&&n.touchButton.index===it||n.setTouchMod(it,!1)}document.fullscreenElement||n.element.requestFullscreen()}},n.setCanvas=function(e){return n.canvas=e},n.setElement=function(e){return n.element=e},n.setKeyboard=function(e){return n.keyboard=e},n.setTouch0=n.setTouch_.bind(Object(w.a)(n),0),n.setTouch1=n.setTouch_.bind(Object(w.a)(n),1),n.setTouch2=n.setTouch_.bind(Object(w.a)(n),2),n.setTouch3=n.setTouchBelt_.bind(Object(w.a)(n),3),n.setTouch4=n.setTouchBelt_.bind(Object(w.a)(n),4),n.setTouch5=n.setTouchBelt_.bind(Object(w.a)(n),5),n}return Object(g.a)(t,e),Object(b.a)(t,[{key:"componentDidMount",value:function(){var e=this;document.addEventListener("drop",this.onDrop,!0),document.addEventListener("dragover",this.onDragOver,!0),document.addEventListener("dragenter",this.onDragEnter,!0),document.addEventListener("dragleave",this.onDragLeave,!0),this.fs.then(function(t){var n=t.files.get("spawn.mpq");n&&_e.includes(n.byteLength)&&e.setState({has_spawn:!0}),Object(v.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)}).length&&e.setState({save_names:!0})})}},{key:"setDropping",value:function(e){this.setState(function(t){var n=t.dropping;return{dropping:Math.max(n+e,0)}})}},{key:"onError",value:function(e,t){var n=this;Object(h.a)(f.a.mark(function r(){var a;return f.a.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(a={message:e},!n.saveName){r.next=8;break}return r.next=4,n.fs;case 4:return r.t0=n.saveName,r.next=7,r.sent.fileUrl(r.t0);case 7:a.save=r.sent;case 8:t?Object(pe.mapStackTrace)(t,function(e){n.setState(function(t){return!t.error&&{error:Object(d.a)({},a,{stack:e.join("\n")})}})}):n.setState(function(e){return!e.error&&{error:a}});case 9:case"end":return r.stop()}},r)}))()}},{key:"openKeyboard",value:function(e){e?(this.showKeyboard={left:"".concat((100*(e[0]-10)/640).toFixed(2),"%"),top:"".concat((100*(e[1]-10)/480).toFixed(2),"%"),width:"".concat((100*(e[2]-e[0]+20)/640).toFixed(2),"%"),height:"".concat((100*(e[3]-e[1]+20)/640).toFixed(2),"%")},this.maxKeyboard=e[4],this.element.classList.add("keyboard"),Object.assign(this.keyboard.style,this.showKeyboard),this.keyboard.focus(),st&&(st.style.transform="translate(-50%, ".concat((56.25*-(e[1]+e[3])/960).toFixed(2),"vw)"))):(this.showKeyboard=!1,this.element.classList.remove("keyboard"),this.keyboard.blur(),this.keyboard.value="",this.keyboardNum=0)}},{key:"setCursorPos",value:function(e,t){var n=this,r=this.canvas.getBoundingClientRect();this.cursorPos={x:r.left+(r.right-r.left)*e/640,y:r.top+(r.bottom-r.top)*t/480},setTimeout(function(){n.game("DApi_Mouse",0,0,0,e,t)})}},{key:"onProgress",value:function(e){this.setState({progress:e})}},{key:"onExit",value:function(){this.state.error||window.location.reload()}},{key:"setCurrentSave",value:function(e){this.saveName=e}},{key:"updateSaves",value:function(){var e=this;return this.fs.then(function(t){var n={};Object(v.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)}).forEach(function(e){n[e]=function(e,t){try{var n=Z(new ve(e).read("hero"),function(e){return e.match(/spawn\d+\.sv/i)?"lshbkfg1":e.match(/share_\d+\.sv/i)?"lshbkfg1":e.match(/multi_\d+\.sv/i)?"szqnlsk1":"xrgyrkj1"}(t)),r=n.indexOf(0,16),a={};return a.name=String.fromCharCode.apply(String,Object(v.a)(n.subarray(16,r))),a.cls=n[48],a.level=n[53],a}catch(lt){return null}}(t.files.get(e).buffer,e)}),e.setState({save_names:n})})}},{key:"removeSave",value:function(e){var t=this;window.confirm("Are you sure you want to delete ".concat(e,"?"))&&Object(h.a)(f.a.mark(function n(){var r;return f.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,t.fs;case 2:return r=n.sent,n.next=5,r.delete(e.toLowerCase());case 5:r.files.delete(e.toLowerCase()),t.updateSaves();case 7:case"end":return n.stop()}},n)}))()}},{key:"downloadSave",value:function(e){this.fs.then(function(t){return t.download(e)})}},{key:"drawBelt",value:function(e,t){this.canvas&&this.touchButtons[e]&&(this.touchBelt[e]=t,t>=0?(this.touchButtons[e].style.display="block",this.touchCtx[e].drawImage(this.canvas,205+29*t,357,28,28,0,0,28,28)):this.touchButtons[e].style.display="none")}},{key:"updateBelt",value:function(e){if(e){for(var t=new Set,n=3,r=0;r=0&&!t.has(e[r])&&(this.drawBelt(n++,r),t.add(e[r]));for(;n<6;++n)this.drawBelt(n,-1)}else this.drawBelt(3,-1),this.drawBelt(4,-1),this.drawBelt(5,-1)}},{key:"start",value:function(e){var t=this;if(e&&e.name.match(/\.sv$/i))this.fs.then(function(t){return t.upload(e)}).then(function(){t.updateSaves()});else if(!this.state.show_saves)if(!e||e.name.match(/\.mpq$/i)){document.removeEventListener("drop",this.onDrop,!0),document.removeEventListener("dragover",this.onDragOver,!0),document.removeEventListener("dragenter",this.onDragEnter,!0),document.removeEventListener("dragleave",this.onDragLeave,!0),this.setState({dropping:0});var n=!(!e||e.name.match(/^spawn\.mpq$/i));E.a.event({category:"Game",action:n?"Start Retail":"Start Shareware"}),this.setState({loading:!0,retail:n}),qe(this,e,!n).then(function(e){t.game=e,document.addEventListener("mousemove",t.onMouseMove,!0),document.addEventListener("mousedown",t.onMouseDown,!0),document.addEventListener("mouseup",t.onMouseUp,!0),document.addEventListener("keydown",t.onKeyDown,!0),document.addEventListener("keyup",t.onKeyUp,!0),document.addEventListener("contextmenu",t.onMenu,!0),document.addEventListener("touchstart",t.onTouchStart,{passive:!1,capture:!0}),document.addEventListener("touchmove",t.onTouchMove,{passive:!1,capture:!0}),document.addEventListener("touchend",t.onTouchEnd,{passive:!1,capture:!0}),document.addEventListener("pointerlockchange",t.onPointerLockChange),window.addEventListener("resize",t.onResize),t.setState({started:!0})},function(e){return t.onError(e.message,e.stack)})}else window.alert("Please select an MPQ file. If you downloaded the installer from GoG, you will need to install it on PC and use the MPQ file from the installation folder.")}},{key:"pointerLocked",value:function(){return document.pointerLockElement===this.canvas||document.mozPointerLockElement===this.canvas}},{key:"mousePos",value:function(e){var t=this.canvas.getBoundingClientRect();return this.pointerLocked()?(this.cursorPos.x=Math.max(t.left,Math.min(t.right,this.cursorPos.x+e.movementX)),this.cursorPos.y=Math.max(t.top,Math.min(t.bottom,this.cursorPos.y+e.movementY))):this.cursorPos={x:e.clientX,y:e.clientY},{x:Math.max(0,Math.min(Math.round((this.cursorPos.x-t.left)/(t.right-t.left)*640),639)),y:Math.max(0,Math.min(Math.round((this.cursorPos.y-t.top)/(t.bottom-t.top)*480),479))}}},{key:"mouseButton",value:function(e){switch(e.button){case 0:return 1;case 1:return 4;case 2:return 2;case 3:return 5;case 4:return 6;default:return 1}}},{key:"eventMods",value:function(e){return(e.shiftKey||this.touchMods[2]?1:0)+(e.ctrlKey?2:0)+(e.altKey?4:0)+(e.touches?8:0)}},{key:"clearKeySel",value:function(){if(this.showKeyboard){var e=this.keyboard.value.length;this.keyboard.setSelectionRange(e,e)}}},{key:"onKeyboardInner",value:function(e){if(this.showKeyboard){var t,n=this.keyboard.value;if(this.maxKeyboard>0)t=(n.match(/[\x20-\x7E]/g)||[]).join("").substring(0,this.maxKeyboard);else{var r=-this.maxKeyboard;n.match(/^\d*$/)&&(this.keyboardNum=Math.min(n.length?parseInt(n):0,r)),t=this.keyboardNum?this.keyboardNum.toString():""}n!==t&&(this.keyboard.value=t),this.clearKeySel(),this.game("text",t,e)}}},{key:"setTouchMod",value:function(e,t,n){if(e<3)this.touchMods[e]=t,this.touchButtons[e]&&this.touchButtons[e].classList.toggle("active",t);else if(n&&this.touchBelt[e]>=0){var r=performance.now();(!this.beltTime||r-this.beltTime>750)&&(this.game("DApi_Char",49+this.touchBelt[e]),this.beltTime=r)}}},{key:"updateTouchButton",value:function(e,t){var n=this,r=null;this.touchControls||(this.touchControls=!0,this.element.classList.add("touch"));var a=this.touchButton,o=!0,i=!1,s=void 0;try{for(var c,u=function(){var t=c.value,o=t.target,i=t.identifier,s=t.clientX,u=t.clientY;if(a&&a.id===i&&n.touchButtons[a.index]===o)return e.length>1&&(a.stick=!1),a.clientX=s,a.clientY=u,n.touchCanvas=Object(v.a)(e).find(function(e){return e.identifier!==i}),n.touchCanvas&&(n.touchCanvas={clientX:n.touchCanvas.clientX,clientY:n.touchCanvas.clientY}),delete n.panPos,{v:null!=n.touchCanvas};var l=n.touchButtons.indexOf(o);l>=0&&!r&&(r={id:i,index:l,stick:!0,original:n.touchMods[l],clientX:s,clientY:u})},l=e[Symbol.iterator]();!(o=(c=l.next()).done);o=!0){var f=u();if("object"===typeof f)return f.v}}catch(_){i=!0,s=_}finally{try{o||null==l.return||l.return()}finally{if(i)throw s}}if(a&&!r&&t&&a.stick){var d=this.touchButtons[a.index].getBoundingClientRect(),h=a.clientX,p=a.clientY;h>=d.left&&h=d.top&&pk)m=Math.abs(w)>Math.abs(g)?w>0?37:39:g>0?38:40,this.game("DApi_Key",0,0,m),this.panPos={x:b,y:y}}else this.game("DApi_Mouse",0,0,24,320,180),this.game("DApi_Mouse",2,1,24,320,180),this.panPos={x:b,y:y};return this.touchCanvas=null,!1}delete this.panPos}return this.touchCanvas=Object(v.a)(e).find(function(e){return!r||e.identifier!==r.id}),this.touchCanvas&&(this.touchCanvas={clientX:this.touchCanvas.clientX,clientY:this.touchCanvas.clientY}),null!=this.touchCanvas}},{key:"setTouch_",value:function(e,t){this.touchButtons[e]=t}},{key:"setTouchBelt_",value:function(e,t){if(this.touchButtons[e]=t,t){var n=document.createElement("canvas");n.width=28,n.height=28,t.appendChild(n),this.touchCtx[e]=n.getContext("2d")}else this.touchCtx[e]=null}},{key:"renderUi",value:function(){var e=this,t=this.state,n=t.started,r=t.loading,o=t.error,i=t.progress,s=t.has_spawn,c=t.save_names,l=t.show_saves,f=t.compress;if(l&&"object"===typeof c){var d=["Warrior","Rogue","Sorcerer"];return a.a.createElement("div",{className:"start"},a.a.createElement("ul",{className:"saveList"},Object.entries(c).map(function(t){var n=Object(u.a)(t,2),r=n[0],o=n[1];return a.a.createElement("li",{key:r},r,o?a.a.createElement("span",{className:"info"},o.name," (lv. ",o.level," ",d[o.cls],")"):"",a.a.createElement(C.a,{className:"btnDownload",icon:A.a,onClick:function(){return e.downloadSave(r)}}),a.a.createElement(C.a,{className:"btnRemove",icon:A.b,onClick:function(){return e.removeSave(r)}}))})),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Upload Save"),a.a.createElement("input",{accept:".sv",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseSave})),a.a.createElement("div",{className:"startButton",onClick:function(){return e.setState({show_saves:!1})}},"Back"))}return f?a.a.createElement(rt,{api:this,ref:function(t){return e.compressMpq=t}}):o?a.a.createElement(ct,{className:"error",href:at(o,this.state.retail)},a.a.createElement("p",{className:"header"},"The following error has occurred:"),a.a.createElement("p",{className:"body"},o.message),a.a.createElement("p",{className:"footer"},"Click to create an issue on GitHub"),null!=o.save&&a.a.createElement("a",{href:o.save,download:this.saveName},"Download save file")):r&&!n?a.a.createElement("div",{className:"loading"},i&&i.text||"Loading...",null!=i&&!!i.total&&a.a.createElement("span",{className:"progressBar"},a.a.createElement("span",null,a.a.createElement("span",{style:{width:"".concat(Math.round(100*i.loaded/i.total),"%")}})))):n?void 0:a.a.createElement("div",{className:"start"},a.a.createElement("p",null,"This is a web port of the original Diablo game, based on source code reconstructed by GalaXyHaXz and devilution team. The project page with information and links can be found over here ",a.a.createElement(ct,{href:"https://github.com/d07RiV/diabloweb"},"https://github.com/d07RiV/diabloweb")),a.a.createElement("p",null,"If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing. The game can be purchased from ",a.a.createElement(ct,{href:"https://www.gog.com/game/diablo"},"GoG"),"."," ",a.a.createElement("span",{className:"link",onClick:function(){return e.setState({compress:!0})}},"Click here to compress the MPQ, greatly reducing its size.")),!s&&a.a.createElement("p",null,"Or you can play the shareware version for free (50MB download)."),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Select MPQ"),a.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseFile})),a.a.createElement("div",{className:"startButton",onClick:function(){return e.start()}},"Play Shareware"),!!c&&a.a.createElement("div",{className:"startButton",onClick:this.showSaves},"Manage Saves"))}},{key:"render",value:function(){var e=this.state,t=e.started,n=e.error,r=e.dropping;return a.a.createElement("div",{className:x()("App",{touch:this.touchControls,started:t,dropping:r,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"touch-ui touch-mods"},a.a.createElement("div",{className:x()("touch-button","touch-button-0",{active:this.touchMods[0]}),ref:this.setTouch0}),a.a.createElement("div",{className:x()("touch-button","touch-button-1",{active:this.touchMods[1]}),ref:this.setTouch1}),a.a.createElement("div",{className:x()("touch-button","touch-button-2",{active:this.touchMods[2]}),ref:this.setTouch2})),a.a.createElement("div",{className:"touch-ui touch-belt"},a.a.createElement("div",{className:x()("touch-button","touch-button-0"),ref:this.setTouch3}),a.a.createElement("div",{className:x()("touch-button","touch-button-1"),ref:this.setTouch4}),a.a.createElement("div",{className:x()("touch-button","touch-button-2"),ref:this.setTouch5})),a.a.createElement("div",{className:"Body"},a.a.createElement("div",{className:"inner"},!n&&a.a.createElement("canvas",{ref:this.setCanvas,width:640,height:480}),a.a.createElement("input",{type:"text",className:"keyboard",onChange:this.onKeyboard,onBlur:this.onKeyboardBlur,ref:this.setKeyboard,spellCheck:!1,style:this.showKeyboard||{}}))),a.a.createElement("div",{className:"BodyV"},this.renderUi()))}}]),t}(a.a.Component);i.a.render(a.a.createElement(ut,null),document.getElementById("root")),function(e){if("serviceWorker"in navigator){if(new URL("/diabloweb",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",function(){var t="".concat("/diabloweb","/service-worker.js");s?(function(e,t){fetch(e).then(function(n){var r=n.headers.get("content-type");404===n.status||null!=r&&-1===r.indexOf("javascript")?navigator.serviceWorker.ready.then(function(e){e.unregister().then(function(){window.location.reload()})}):c(e,t)}).catch(function(){console.log("No internet connection found. App is running in offline mode.")})}(t,e),navigator.serviceWorker.ready.then(function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")})):c(t,e)})}}({onUpdate:function(){}})}},[[41,2,0,5]]]); -//# sourceMappingURL=main.3c2a83da.chunk.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{12:function(e,t,n){"use strict";n.d(t,"a",function(){return b});var r=n(8),a=n(1),o=n.n(a),i=n(3),s=n(15),c=n.n(s);function u(e,t){return l.apply(this,arguments)}function l(){return(l=Object(i.a)(o.a.mark(function e(t,n){var r,a,i,s;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.get(n.toLowerCase());case 2:(r=e.sent)?(a=new Blob([r],{type:"binary/octet-stream"}),i=URL.createObjectURL(a),(s=document.createElement("a")).setAttribute("href",i),s.setAttribute("download",n),document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(i)):console.error("File ".concat(n," does not exist"));case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function f(e){return d.apply(this,arguments)}function d(){return(d=Object(i.a)(o.a.mark(function e(t){var n,r,a,i,s,c;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=!0,r=!1,a=void 0,e.prev=3,e.next=6,t.keys();case 6:e.t0=Symbol.iterator,i=e.sent[e.t0]();case 8:if(n=(s=i.next()).done){e.next=14;break}(c=s.value).match(/\.sv$/i)&&u(t,c);case 11:n=!0,e.next=8;break;case 14:e.next=20;break;case 16:e.prev=16,e.t1=e.catch(3),r=!0,a=e.t1;case 20:e.prev=20,e.prev=21,n||null==i.return||i.return();case 23:if(e.prev=23,!r){e.next=26;break}throw a;case 26:return e.finish(23);case 27:return e.finish(20);case 28:case"end":return e.stop()}},e,null,[[3,16,20,28],[21,,23,27]])}))).apply(this,arguments)}var h=function(e){return new Promise(function(t,n){var r=new FileReader;r.onload=function(){return t(r.result)},r.onerror=function(){return n(r.error)},r.onabort=function(){return n()},r.readAsArrayBuffer(e)})};function v(e,t,n){return p.apply(this,arguments)}function p(){return(p=Object(i.a)(o.a.mark(function e(t,n,r){var a;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=Uint8Array,e.next=3,h(r);case 3:return e.t1=e.sent,a=new e.t0(e.t1),n.set(r.name.toLowerCase(),a),e.abrupt("return",t.set(r.name.toLowerCase(),a));case 7:case"end":return e.stop()}},e)}))).apply(this,arguments)}function b(e){return y.apply(this,arguments)}function y(){return(y=Object(i.a)(o.a.mark(function e(t){var n,a,s,l,d,h,p,b;return o.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n=new c.a("diablo_fs"),a=new Map,s=0,e.t0=Object,e.next=7,n.json();case 7:e.t1=e.sent,l=e.t0.entries.call(e.t0,e.t1);case 9:if(!(s>>=t,T;if(e.bit_buff>>=e.extra_bits,e.in_pos===e.in_bytes){if(0===(e.in_bytes=e.read_buf(e.in_buff)))return P;e.in_pos=0}return e.bit_buff|=e.in_buff[e.in_pos++]<<8,e.bit_buff>>>=t-e.extra_bits,e.extra_bits=e.extra_bits-t+8,T}function Y(e){if(1&e.bit_buff){if(X(e,1))return 774;var t=e.LengthCodes[255&e.bit_buff];if(X(e,e.LenBits[t]))return 774;var n=e.ExLenBits[t];if(0!==n){var r=e.bit_buff&(1<r.dsize_bits||r.dsize_bits>6)return B;if(r.dsize_mask=65535>>16-r.dsize_bits,r.ctype!=M){if(r.ctype!=S)return O;r.ChBitsAsc.set(F),function(e){for(var t=255,n=255;t>=0;t--,n--){var r=e.ChBitsAsc[n],a=void 0;if(r<=8){var o=1<>4;do{e.offs2D34[a]=n,a+=i}while(a<256)}else{r-=6,e.ChBitsAsc[n]=r;var s=1<>6;do{e.offs2E34[a]=n,a+=s}while(a<128)}else{r-=8,e.ChBitsAsc[n]=r;var c=1<>8;do{e.offs2EB4[a]=n,a+=c}while(a<256)}}}(r)}return r.LenBits.set(I),G(r.LengthCodes,K,r.LenBits,r.LenBits.length),r.ExLenBits.set(z),r.LenBase.set(R),r.DistBits.set(U),G(r.DistPosCodes,N,r.DistBits,r.DistBits.length),774!==function(e){for(var t,n,r=4096;(t=n=Y(e))<773;){if(n>=256){var a=n-254,o=J(e,a);if(0===o){t=774;break}var i=r,s=i-o;r+=a;for(var c=e.out_buff;a-- >0;)c[i++]=c[s++]}else e.out_buff[r++]=n;r>=8192&&(e.write_buf(e.out_buff.subarray(4096,8192)),e.out_buff.copyWithin(0,4096,r),r-=4096)}return e.write_buf(e.out_buff.subarray(4096,r)),t}(r)?j:D}var Q=new Uint32Array(80),H=function(e,t){return t<>32-e},$=function(){function e(){Object(p.a)(this,e),this.digest=new Uint32Array(5),this.count=0,this.digest[0]=1732584193,this.digest[1]=4023233417,this.digest[2]=2562383102,this.digest[3]=271733878,this.digest[4]=3285377520,this.digest8=new Uint8Array(this.digest.buffer)}return Object(b.a)(e,[{key:"input8",value:function(e){var t=new Uint32Array(e.buffer,e.byteOffset,16);this.input(t)}},{key:"input",value:function(e){this.count+=32*e.length;for(var t=0;t<16;++t)Q[t]=e[t];for(var n=16;n<80;++n)Q[n]=Q[n-16]^Q[n-14]^Q[n-8]^Q[n-3];for(var r=this.digest[0],a=this.digest[1],o=this.digest[2],i=this.digest[3],s=this.digest[4],c=0;c<20;c++){var u=H(5,r)+(a&o|~a&i)+s+Q[c]+1518500249;s=i,i=o,o=H(30,a),a=r,r=0|u}for(var l=20;l<40;l++){var f=H(5,r)+(a^o^i)+s+Q[l]+1859775393;s=i,i=o,o=H(30,a),a=r,r=0|f}for(var d=40;d<60;d++){var h=H(5,r)+(a&o|a&i|o&i)+s+Q[d]+2400959708;s=i,i=o,o=H(30,a),a=r,r=0|h}for(var v=60;v<80;v++){var p=H(5,r)+(a^o^i)+s+Q[v]+3395469782;s=i,i=o,o=H(30,a),a=r,r=0|p}this.digest[0]+=r,this.digest[1]+=a,this.digest[2]+=o,this.digest[3]+=i,this.digest[4]+=s}}]),e}(),V=function(){function e(t){Object(p.a)(this,e),this.seed=t}return Object(b.a)(e,[{key:"next",value:function(){return this.seed=(3*this.seed<<16)+(67*this.seed<<8)+253*this.seed+2531011|0,this.seed>>16&32767}}]),e}();function Z(e,t){if(!(e.length<=8)){var n=e.length-8;if(!(n%64)&&!e[n+4]){for(var r=e[n+5],a=new Uint8Array(n+r-64),o=function(e){for(var t=new V(28760),n=new Uint8Array(136),r=new Uint32Array(n.buffer),a=0;a<136;++a)n[a]=t.next();for(var o=new Uint8Array(64),i=0;i<64;++i)o[i]=e.charCodeAt(i%e.length);var s=new $;s.input8(o);for(var c=0;c<34;++c)r[c]^=s.digest[c%s.digest.length];return(s=new $).input(r.subarray(18)),s}(t),i=n>>2,s=new Uint32Array(e.buffer,e.byteOffset,i+1),c=new Uint32Array(16),u=new Uint8Array(c.buffer),l=0;lt)throw Error("decompress buffer overflow");n.set(e,a),a+=e.length})||a!==t?null:n}var te=function(){for(var e=new Uint32Array(1280),t=1048577,n=0;n<256;n++)for(var r=n;r<1280;r+=256){var a=(65535&(t=(125*t+3)%2796203))<<16,o=65535&(t=(125*t+3)%2796203);e[r]=a|o}return e}();function ne(e,t){for(var n=4008636142,r=0;r>>11}function re(e,t){ne(new Uint32Array(e.buffer,e.byteOffset,e.length>>2),t)}function ae(e,t){for(var n=4008636142,r=0;r>>11}}function oe(e,t){for(var n=2146271213,r=4008636142,a=0;a=97&&o<=122&&(o-=32),47===o&&(o=92),r=o+(n=te[256*t+o]^n+r)+33*r+3|0}return n>>>0}function ie(e){var t=Math.max(e.lastIndexOf("/"),e.lastIndexOf("\\"));return e.substring(t+1)}var se=256,ce=512,ue=65280,le=65536,fe=131072,de=1048576,he=16777216,ve=function(){function e(t){Object(p.a)(this,e),this.buffer=t,this.u8=new Uint8Array(t),this.u32=new Uint32Array(t,0,t.byteLength>>2),this.readHeader()}return Object(b.a)(e,[{key:"readHeader",value:function(){var e=this.u8,t=this.u32;if(441536589!==t[0])throw Error("invalid MPQ header");var n=e[14]+(e[15]<<8),r=t[4],a=t[5],o=t[6],i=t[7];this.hashTable=this.readTable(r,o,"(hash table)"),this.blockTable=this.readTable(a,i,"(block table)"),this.blockSize=1<<9+n}},{key:"readTable",value:function(e,t,n){var r=new Uint32Array(this.buffer.slice(e,e+16*t));return ne(r,oe(n,3)),r}},{key:"fileIndex",value:function(e){for(var t=this.hashTable,n=t.length>>2,r=oe(e,0)%n,a=oe(e,1),o=oe(e,2),i=r,s=0;4294967295!==t[4*i+3]&&sthis.buffer.byteLength))return r.flags&ue||(r.cmpSize=r.fileSize),r.flags&fe&&(r.key=r.key+r.filePos^r.fileSize),{info:r,data:new Uint8Array(this.buffer,r.filePos,r.cmpSize)}}}},{key:"read",value:function(e){var t=this.readRaw(e);if(t){var n=t.info,r=t.data;if(r=r.slice(),n.flags&he){if(n.flags&le&&re(r,n.key),n.flags&ce)return;return n.flags&se?ee(r,n.fileSize):r}if(n.flags&ue){var a=Math.floor((n.fileSize+this.blockSize-1)/this.blockSize),o=a+1;if(r.length<4*o)return;var i=new Uint32Array(r.buffer,0,o);n.flags&le&&ne(i,n.key-1);for(var s=new Uint8Array(n.fileSize),c=0;cr.length)return;var f=r.subarray(i[c],i[c+1]);if(n.flags&le&&re(f,n.key+c),n.flags&ce)return;if(n.flags&se&&(f=ee(f,l)),!f||f.length!==l)return;s.set(f,u)}return s}if(n.flags&le)for(var d=0;d=this.buffer.byteLength)throw Error("packet too small");return this.buffer[this.pos++]}},{key:"read16",value:function(){var e=this.pos,t=this.buffer;if(e+2>t.byteLength)throw Error("packet too small");var n=t[e]|t[e+1]<<8;return this.pos+=2,n}},{key:"read32",value:function(){var e=this.pos,t=this.buffer;if(e+4>t.byteLength)throw Error("packet too small");var n=t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24;return this.pos+=4,n}},{key:"read_str",value:function(){var e=this.read8(),t=this.pos,n=this.buffer;if(t+e>n.byteLength)throw Error("packet too small");var r=String.fromCharCode.apply(String,Object(v.a)(n.subarray(t,t+e)));return this.pos+=e,r}},{key:"read_buf",value:function(){var e=this.read32(),t=this.buffer.subarray(this.pos,this.pos+e);return this.pos+=e,t}}]),e}(),Se=function(){function e(t){Object(p.a)(this,e),this.buffer=new Uint8Array(t),this.pos=0}return Object(b.a)(e,[{key:"write8",value:function(e){return this.buffer[this.pos++]=e,this}},{key:"write16",value:function(e){var t=this.pos,n=this.buffer;return n[t]=e,n[t+1]=e>>8,this.pos+=2,this}},{key:"write32",value:function(e){var t=this.pos,n=this.buffer;return n[t]=e,n[t+1]=e>>8,n[t+2]=e>>16,n[t+3]=e>>24,this.pos+=4,this}},{key:"write_str",value:function(e){var t=e.length;this.write8(t);for(var n=this.pos,r=this.buffer,a=0;a=4?e.send(Le(Te.join_reject,{cookie:s.cookie,reason:je.JOIN_GAME_FULL})):(t.players[c]=n,n.id=c,e.send(Le(Te.join_accept,{cookie:s.cookie,index:c,seed:t.seed,difficulty:t.difficulty})),t.send(255,Le(Te.connect,{id:c})))}break;default:if(null==n.id)return;t.handle(n.id,i.code,s)}if(!a.done())throw Error("packet too large")}),e.on("close",function(){null!=n.id&&t.drop(n.id,1073741830)})}},{key:"send",value:function(e,t){for(var n=1;n<4;++n)e&1<>16&255,P=D>>8&255,U=255&D;t.fillStyle="rgb(".concat(T,", ").concat(P,", ").concat(U,")"),t.fillText(L,B,O+22)}}catch(N){C=!0,A=N}finally{try{E||null==S.return||S.return()}finally{if(C)throw A}}t.restore()}}e.updateBelt(s)}function Fe(){return(Fe=Object(h.a)(f.a.mark(function e(t,n,r,a){var o,i,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fs;case 2:if(o=e.sent,!a||r){e.next=6;break}return e.next=6,xe(t,o);case 6:return i=null,s=!1,i=t.canvas.getContext("2d",{alpha:!1}),e.next=10,new Promise(function(e,c){try{var l=new me.a,f=[],d=Ie(function(e){f.push(e)});l.addEventListener("message",function(r){var a=r.data;switch(a.action){case"loaded":e(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r2&&void 0!==o[2]?o[2]:"arraybuffer",e.next=3,ke.a.request({url:t,responseType:r,onDownloadProgress:n});case 3:return a=e.sent,e.abrupt("return",a.data);case 5:case"end":return e.stop()}},e)}))).apply(this,arguments)}function tt(e,t,n){return new Promise(function(r,a){try{var o=new Xe.a;o.addEventListener("message",function(e){var t=e.data;switch(t.action){case"result":r({buffer:t.buffer,blocks:t.blocks});break;case"error":a({message:t.error,stack:t.stack});break;case"progress":n(t.value)}}),o.postMessage(Object(d.a)({action:"run"},e),t)}catch(i){a(i)}})}function nt(){return(nt=Object(h.a)(f.a.mark(function e(t,n){var r,a,o,i,s,c,u,l,d,h,v,p,b,y,m,w,g,k,_,x,E,C,A,M,S,j,B,O,L,D,T,P,U,N,z,R,I,K,F,q,G,X,Y,J,W,Q,H,$,V,Z,ee,te,re,se,ce;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){n("Loading...",r.reduce(function(e,t){return e+t.loaded*t.weight},0),r.reduce(function(e,t){return e+t.total*t.weight},0))},n("Loading..."),r=[],o=function(e){return function(t){e.loaded=t.loaded,a()}},i=t.size,(s={loaded:0,weight:1,total:i}).ready=Ve(t.slice(0,32),o(s)),r.push(s),(c={loaded:0,weight:5,total:He}).ready=Ze(Je.a,o(c)),r.push(c),(u={loaded:0,weight:5,total:$e}).ready=Ze(Qe.a,o(u),"text"),r.push(u),e.t0=Uint32Array,e.next=17,s.ready;case 17:if(e.t1=e.sent,l=new e.t0(e.t1),d=new Uint16Array(l.buffer),441536589===l[0]){e.next=22;break}throw Error("invalid MPQ file");case 22:if(h=1<<9+d[7],v=l[4],p=l[5],b=l[6],y=l[7],!(v+16*b>i||p+16*y>i)){e.next=29;break}throw Error("invalid MPQ file");case 29:return m={loaded:0,weight:1,total:16*b},w={loaded:0,weight:1,total:16*y},s.total-=m.total+w.total,m.ready=Ve(t.slice(v,v+m.total),o(m)),w.ready=Ve(t.slice(p,p+w.total),o(w)),r.push(m,w),e.t2=Uint32Array,e.next=38,m.ready;case 38:return e.t3=e.sent,g=new e.t2(e.t3),e.t4=Uint32Array,e.next=43,w.ready;case 43:return e.t5=e.sent,k=new e.t4(e.t5),ne(g,oe("(hash table)",3)),ne(k,oe("(block table)",3)),e.next=49,u.ready;case 49:for(e.t6=function(e){return e.trim()},e.t7=function(e){return e.length},_=e.sent.split("\n").map(e.t6).filter(e.t7),x={},E=function(e,t){return e.toString(16).padStart(8,"0")+t.toString(16).padStart(8,"0")},C=!0,A=!1,M=void 0,e.prev=57,S=_[Symbol.iterator]();!(C=(j=S.next()).done);C=!0)B=j.value,x[E(oe(B,1),oe(B,2))]=B;e.next=65;break;case 61:e.prev=61,e.t8=e.catch(57),A=!0,M=e.t8;case 65:e.prev=65,e.prev=66,C||null==S.return||S.return();case 68:if(e.prev=68,!A){e.next=71;break}throw M;case 71:return e.finish(68);case 72:return e.finish(65);case 73:for(O=4,L=[],D=0;D0&&n.start(t[0])},n.onDone=function(e){var t=URL.createObjectURL(e);n.setState({url:t});var r=document.createElement("a");r.setAttribute("href",t),r.setAttribute("download","DIABDAT.MPQ"),document.body.appendChild(r),r.click(),document.body.removeChild(r)},n.onClose=function(){n.state.url&&URL.revokeObjectURL(n.state.url),n.props.api.setState({compress:!1})},n}return Object(g.a)(t,e),Object(b.a)(t,[{key:"onProgress",value:function(e){this.setState({progress:e})}},{key:"onError",value:function(e,t){var n=this.props.api;n.setState({compress:!1}),n.onError(e,t)}},{key:"start",value:function(e){var t=this;this.setState({started:!0}),function(e,t){return nt.apply(this,arguments)}(e,function(e,n,r){return t.onProgress({text:e,loaded:n,total:r})}).then(this.onDone,function(e){return t.onError(e.message,e.stack)})}},{key:"render",value:function(){var e=this.state,t=e.url,n=e.started,r=e.progress;return t?a.a.createElement("div",{className:"start"},a.a.createElement("p",null,a.a.createElement("a",{href:t,download:"DIABDAT.MPQ"},"Click here if download doesn't start.")),a.a.createElement("div",{className:"startButton",onClick:this.onClose},"Back")):n?a.a.createElement("div",{className:"loading"},r&&r.text||"Processing...",null!=r&&!!r.total&&a.a.createElement("span",{className:"progressBar"},a.a.createElement("span",null,a.a.createElement("span",{style:{width:"".concat(Math.round(100*r.loaded/r.total),"%")}})))):a.a.createElement("div",{className:"start"},a.a.createElement("p",null,"You can use this tool to reduce the original MPQ to about half its size. It encodes sounds in MP3 format and uses better compression for regular files. To begin, click the button below or drop the MPQ onto the page."),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Select MPQ"),a.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseFile})),a.a.createElement("div",{className:"startButton",onClick:this.onClose},"Back"))}}]),t}(a.a.Component);function at(e,t){var n=(e.message||"Unknown error")+(e.stack?"\n"+e.stack:""),r=new URL("https://github.com/d07RiV/diabloweb/issues/new");return r.searchParams.set("body","**Description:**\n[Please describe what you were doing before the error occurred]\n\n**App version:**\nDiabloWeb ".concat("1.0.39"," (").concat(t?"Retail":"Shareware",")\n\n**Error message:**\n \n").concat(n.split("\n").map(function(e){return" "+e}).join("\n"),"\n\n**User agent:**\n\n ").concat(navigator.userAgent,"\n\n**Save file:**\n[Please attach the save file, if applicable. The error box should have a link to download the current save you were playing; alternatively, you can open dev console on the game page (F12) and type in ","`DownloadSaves()`","]\n")),r.toString()}window.Peer=Ae.a,E.a.initialize("UA-43123589-6"),E.a.pageview("/");var ot=0,it=1;var st=null;try{st=function(){var e=!0,t=!1,n=void 0;try{for(var r,a=document.styleSheets[Symbol.iterator]();!(e=(r=a.next()).done);e=!0){var o=r.value,i=!0,s=!1,c=void 0;try{for(var u,l=o.cssRules[Symbol.iterator]();!(i=(u=l.next()).done);i=!0){var f=u.value;if(f.type===CSSRule.MEDIA_RULE&&"(min-aspect-ratio: 3/1)"===f.conditionText){var d=!0,h=!1,v=void 0;try{for(var p,b=f.cssRules[Symbol.iterator]();!(d=(p=b.next()).done);d=!0){var y=p.value;if(".App.keyboard .Body .inner"===y.selectorText)return y}}catch(m){h=!0,v=m}finally{try{d||null==b.return||b.return()}finally{if(h)throw v}}}}}catch(m){s=!0,c=m}finally{try{i||null==l.return||l.return()}finally{if(s)throw c}}}}catch(m){t=!0,n=m}finally{try{e||null==a.return||a.return()}finally{if(t)throw n}}}()}catch(lt){}var ct=function(e){var t=e.children,n=Object(k.a)(e,["children"]);return a.a.createElement("a",Object.assign({target:"_blank",rel:"noopener noreferrer"},n),t)},ut=function(e){function t(e){var n;return Object(p.a)(this,t),(n=Object(y.a)(this,Object(m.a)(t).call(this,e))).files=new Map,n.state={started:!1,loading:!1,dropping:0,has_spawn:!1},n.cursorPos={x:0,y:0},n.touchControls=!1,n.touchButtons=[null,null,null,null,null,null],n.touchCtx=[null,null,null,null,null,null],n.touchMods=[!1,!1,!1,!1,!1,!1],n.touchBelt=[-1,-1,-1,-1,-1,-1],n.maxKeyboard=0,n.fs=Object(be.a)(!0),n.onDrop=function(e){var t=function(e){if(e.dataTransfer.items)for(var t=0;t=32&&1===e.key.length?n.game("DApi_Char",e.key.charCodeAt(0)):8!==e.keyCode&&13!==e.keyCode||n.game("DApi_Char",e.keyCode),n.clearKeySel(),n.showKeyboard||(8===e.keyCode||9===e.keyCode||e.keyCode>=112&&e.keyCode<=119)&&e.preventDefault())},n.onMenu=function(e){e.preventDefault()},n.onKeyUp=function(e){n.canvas&&(n.game("DApi_Key",1,n.eventMods(e),e.keyCode),n.clearKeySel())},n.onKeyboard=function(){n.onKeyboardInner(0)},n.onKeyboardBlur=function(){n.onKeyboardInner(1)},n.parseFile=function(e){var t=e.target.files;t.length>0&&n.start(t[0])},n.parseSave=function(e){var t=e.target.files;t.length>0&&n.start(t[0])},n.touchButton=null,n.touchCanvas=null,n.onTouchStart=function(e){if(n.canvas&&e.target!==n.keyboard&&(n.keyboard.blur(),e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),r=t.x,a=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),r,a),n.touchMods[ot]||n.game("DApi_Mouse",1,n.touchMods[it]?2:1,n.eventMods(e),r,a)}},n.onTouchMove=function(e){if(n.canvas&&e.target!==n.keyboard&&(e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),r=t.x,a=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),r,a)}},n.onTouchEnd=function(e){if(n.canvas){e.target===n.keyboard||e.preventDefault();var t=n.touchCanvas;if(n.updateTouchButton(e.touches,!0),t&&!n.touchCanvas){var r=n.mousePos(t),a=r.x,o=r.y;n.game("DApi_Mouse",2,1,n.eventMods(e),a,o),n.game("DApi_Mouse",2,2,n.eventMods(e),a,o),!n.touchMods[it]||n.touchButton&&n.touchButton.index===it||n.setTouchMod(it,!1)}document.fullscreenElement||n.element.requestFullscreen()}},n.setCanvas=function(e){return n.canvas=e},n.setElement=function(e){return n.element=e},n.setKeyboard=function(e){return n.keyboard=e},n.setTouch0=n.setTouch_.bind(Object(w.a)(n),0),n.setTouch1=n.setTouch_.bind(Object(w.a)(n),1),n.setTouch2=n.setTouch_.bind(Object(w.a)(n),2),n.setTouch3=n.setTouchBelt_.bind(Object(w.a)(n),3),n.setTouch4=n.setTouchBelt_.bind(Object(w.a)(n),4),n.setTouch5=n.setTouchBelt_.bind(Object(w.a)(n),5),n}return Object(g.a)(t,e),Object(b.a)(t,[{key:"componentDidMount",value:function(){var e=this;document.addEventListener("drop",this.onDrop,!0),document.addEventListener("dragover",this.onDragOver,!0),document.addEventListener("dragenter",this.onDragEnter,!0),document.addEventListener("dragleave",this.onDragLeave,!0),this.fs.then(function(t){var n=t.files.get("spawn.mpq");n&&_e.includes(n.byteLength)&&e.setState({has_spawn:!0}),Object(v.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)}).length&&e.setState({save_names:!0})})}},{key:"setDropping",value:function(e){this.setState(function(t){var n=t.dropping;return{dropping:Math.max(n+e,0)}})}},{key:"onError",value:function(e,t){var n=this;Object(h.a)(f.a.mark(function r(){var a;return f.a.wrap(function(r){for(;;)switch(r.prev=r.next){case 0:if(a={message:e},!n.saveName){r.next=8;break}return r.next=4,n.fs;case 4:return r.t0=n.saveName,r.next=7,r.sent.fileUrl(r.t0);case 7:a.save=r.sent;case 8:t?Object(pe.mapStackTrace)(t,function(e){n.setState(function(t){return!t.error&&{error:Object(d.a)({},a,{stack:e.join("\n")})}})}):n.setState(function(e){return!e.error&&{error:a}});case 9:case"end":return r.stop()}},r)}))()}},{key:"openKeyboard",value:function(e){e?(this.showKeyboard={left:"".concat((100*(e[0]-10)/640).toFixed(2),"%"),top:"".concat((100*(e[1]-10)/480).toFixed(2),"%"),width:"".concat((100*(e[2]-e[0]+20)/640).toFixed(2),"%"),height:"".concat((100*(e[3]-e[1]+20)/640).toFixed(2),"%")},this.maxKeyboard=e[4],this.element.classList.add("keyboard"),Object.assign(this.keyboard.style,this.showKeyboard),this.keyboard.focus(),st&&(st.style.transform="translate(-50%, ".concat((56.25*-(e[1]+e[3])/960).toFixed(2),"vw)"))):(this.showKeyboard=!1,this.element.classList.remove("keyboard"),this.keyboard.blur(),this.keyboard.value="",this.keyboardNum=0)}},{key:"setCursorPos",value:function(e,t){var n=this,r=this.canvas.getBoundingClientRect();this.cursorPos={x:r.left+(r.right-r.left)*e/640,y:r.top+(r.bottom-r.top)*t/480},setTimeout(function(){n.game("DApi_Mouse",0,0,0,e,t)})}},{key:"onProgress",value:function(e){this.setState({progress:e})}},{key:"onExit",value:function(){this.state.error||window.location.reload()}},{key:"setCurrentSave",value:function(e){this.saveName=e}},{key:"updateSaves",value:function(){var e=this;return this.fs.then(function(t){var n={};Object(v.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)}).forEach(function(e){n[e]=function(e,t){try{var n=Z(new ve(e).read("hero"),function(e){return e.match(/spawn\d+\.sv/i)?"lshbkfg1":e.match(/share_\d+\.sv/i)?"lshbkfg1":e.match(/multi_\d+\.sv/i)?"szqnlsk1":"xrgyrkj1"}(t)),r=n.indexOf(0,16),a={};return a.name=String.fromCharCode.apply(String,Object(v.a)(n.subarray(16,r))),a.cls=n[48],a.level=n[53],a}catch(lt){return null}}(t.files.get(e).buffer,e)}),e.setState({save_names:n})})}},{key:"removeSave",value:function(e){var t=this;window.confirm("Are you sure you want to delete ".concat(e,"?"))&&Object(h.a)(f.a.mark(function n(){var r;return f.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,t.fs;case 2:return r=n.sent,n.next=5,r.delete(e.toLowerCase());case 5:r.files.delete(e.toLowerCase()),t.updateSaves();case 7:case"end":return n.stop()}},n)}))()}},{key:"downloadSave",value:function(e){this.fs.then(function(t){return t.download(e)})}},{key:"drawBelt",value:function(e,t){this.canvas&&this.touchButtons[e]&&(this.touchBelt[e]=t,t>=0?(this.touchButtons[e].style.display="block",this.touchCtx[e].drawImage(this.canvas,205+29*t,357,28,28,0,0,28,28)):this.touchButtons[e].style.display="none")}},{key:"updateBelt",value:function(e){if(e){for(var t=new Set,n=3,r=0;r=0&&!t.has(e[r])&&(this.drawBelt(n++,r),t.add(e[r]));for(;n<6;++n)this.drawBelt(n,-1)}else this.drawBelt(3,-1),this.drawBelt(4,-1),this.drawBelt(5,-1)}},{key:"start",value:function(e){var t=this;if(e&&e.name.match(/\.sv$/i))this.fs.then(function(t){return t.upload(e)}).then(function(){t.updateSaves()});else if(!this.state.show_saves)if(!e||e.name.match(/\.mpq$/i)){document.removeEventListener("drop",this.onDrop,!0),document.removeEventListener("dragover",this.onDragOver,!0),document.removeEventListener("dragenter",this.onDragEnter,!0),document.removeEventListener("dragleave",this.onDragLeave,!0),this.setState({dropping:0});var n=!(!e||e.name.match(/^spawn\.mpq$/i));E.a.event({category:"Game",action:n?"Start Retail":"Start Shareware"}),this.setState({loading:!0,retail:n}),qe(this,e,!n).then(function(e){t.game=e,document.addEventListener("mousemove",t.onMouseMove,!0),document.addEventListener("mousedown",t.onMouseDown,!0),document.addEventListener("mouseup",t.onMouseUp,!0),document.addEventListener("keydown",t.onKeyDown,!0),document.addEventListener("keyup",t.onKeyUp,!0),document.addEventListener("contextmenu",t.onMenu,!0),document.addEventListener("touchstart",t.onTouchStart,{passive:!1,capture:!0}),document.addEventListener("touchmove",t.onTouchMove,{passive:!1,capture:!0}),document.addEventListener("touchend",t.onTouchEnd,{passive:!1,capture:!0}),document.addEventListener("pointerlockchange",t.onPointerLockChange),window.addEventListener("resize",t.onResize),t.setState({started:!0})},function(e){return t.onError(e.message,e.stack)})}else window.alert("Please select an MPQ file. If you downloaded the installer from GoG, you will need to install it on PC and use the MPQ file from the installation folder.")}},{key:"pointerLocked",value:function(){return document.pointerLockElement===this.canvas||document.mozPointerLockElement===this.canvas}},{key:"mousePos",value:function(e){var t=this.canvas.getBoundingClientRect();return this.pointerLocked()?(this.cursorPos.x=Math.max(t.left,Math.min(t.right,this.cursorPos.x+e.movementX)),this.cursorPos.y=Math.max(t.top,Math.min(t.bottom,this.cursorPos.y+e.movementY))):this.cursorPos={x:e.clientX,y:e.clientY},{x:Math.max(0,Math.min(Math.round((this.cursorPos.x-t.left)/(t.right-t.left)*640),639)),y:Math.max(0,Math.min(Math.round((this.cursorPos.y-t.top)/(t.bottom-t.top)*480),479))}}},{key:"mouseButton",value:function(e){switch(e.button){case 0:return 1;case 1:return 4;case 2:return 2;case 3:return 5;case 4:return 6;default:return 1}}},{key:"eventMods",value:function(e){return(e.shiftKey||this.touchMods[2]?1:0)+(e.ctrlKey?2:0)+(e.altKey?4:0)+(e.touches?8:0)}},{key:"clearKeySel",value:function(){if(this.showKeyboard){var e=this.keyboard.value.length;this.keyboard.setSelectionRange(e,e)}}},{key:"onKeyboardInner",value:function(e){if(this.showKeyboard){var t,n=this.keyboard.value;if(this.maxKeyboard>0)t=(n.match(/[\x20-\x7E]/g)||[]).join("").substring(0,this.maxKeyboard);else{var r=-this.maxKeyboard;n.match(/^\d*$/)&&(this.keyboardNum=Math.min(n.length?parseInt(n):0,r)),t=this.keyboardNum?this.keyboardNum.toString():""}n!==t&&(this.keyboard.value=t),this.clearKeySel(),this.game("text",t,e)}}},{key:"setTouchMod",value:function(e,t,n){if(e<3)this.touchMods[e]=t,this.touchButtons[e]&&this.touchButtons[e].classList.toggle("active",t);else if(n&&this.touchBelt[e]>=0){var r=performance.now();(!this.beltTime||r-this.beltTime>750)&&(this.game("DApi_Char",49+this.touchBelt[e]),this.beltTime=r)}}},{key:"updateTouchButton",value:function(e,t){var n=this,r=null;this.touchControls||(this.touchControls=!0,this.element.classList.add("touch"));var a=this.touchButton,o=!0,i=!1,s=void 0;try{for(var c,u=function(){var t=c.value,o=t.target,i=t.identifier,s=t.clientX,u=t.clientY;if(a&&a.id===i&&n.touchButtons[a.index]===o)return e.length>1&&(a.stick=!1),a.clientX=s,a.clientY=u,n.touchCanvas=Object(v.a)(e).find(function(e){return e.identifier!==i}),n.touchCanvas&&(n.touchCanvas={clientX:n.touchCanvas.clientX,clientY:n.touchCanvas.clientY}),delete n.panPos,{v:null!=n.touchCanvas};var l=n.touchButtons.indexOf(o);l>=0&&!r&&(r={id:i,index:l,stick:!0,original:n.touchMods[l],clientX:s,clientY:u})},l=e[Symbol.iterator]();!(o=(c=l.next()).done);o=!0){var f=u();if("object"===typeof f)return f.v}}catch(_){i=!0,s=_}finally{try{o||null==l.return||l.return()}finally{if(i)throw s}}if(a&&!r&&t&&a.stick){var d=this.touchButtons[a.index].getBoundingClientRect(),h=a.clientX,p=a.clientY;h>=d.left&&h=d.top&&pk)m=Math.abs(w)>Math.abs(g)?w>0?37:39:g>0?38:40,this.game("DApi_Key",0,0,m),this.panPos={x:b,y:y}}else this.game("DApi_Mouse",0,0,24,320,180),this.game("DApi_Mouse",2,1,24,320,180),this.panPos={x:b,y:y};return this.touchCanvas=null,!1}delete this.panPos}return this.touchCanvas=Object(v.a)(e).find(function(e){return!r||e.identifier!==r.id}),this.touchCanvas&&(this.touchCanvas={clientX:this.touchCanvas.clientX,clientY:this.touchCanvas.clientY}),null!=this.touchCanvas}},{key:"setTouch_",value:function(e,t){this.touchButtons[e]=t}},{key:"setTouchBelt_",value:function(e,t){if(this.touchButtons[e]=t,t){var n=document.createElement("canvas");n.width=28,n.height=28,t.appendChild(n),this.touchCtx[e]=n.getContext("2d")}else this.touchCtx[e]=null}},{key:"renderUi",value:function(){var e=this,t=this.state,n=t.started,r=t.loading,o=t.error,i=t.progress,s=t.has_spawn,c=t.save_names,l=t.show_saves,f=t.compress;if(l&&"object"===typeof c){var d=["Warrior","Rogue","Sorcerer"];return a.a.createElement("div",{className:"start"},a.a.createElement("ul",{className:"saveList"},Object.entries(c).map(function(t){var n=Object(u.a)(t,2),r=n[0],o=n[1];return a.a.createElement("li",{key:r},r,o?a.a.createElement("span",{className:"info"},o.name," (lv. ",o.level," ",d[o.cls],")"):"",a.a.createElement(C.a,{className:"btnDownload",icon:A.a,onClick:function(){return e.downloadSave(r)}}),a.a.createElement(C.a,{className:"btnRemove",icon:A.b,onClick:function(){return e.removeSave(r)}}))})),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Upload Save"),a.a.createElement("input",{accept:".sv",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseSave})),a.a.createElement("div",{className:"startButton",onClick:function(){return e.setState({show_saves:!1})}},"Back"))}return f?a.a.createElement(rt,{api:this,ref:function(t){return e.compressMpq=t}}):o?a.a.createElement(ct,{className:"error",href:at(o,this.state.retail)},a.a.createElement("p",{className:"header"},"The following error has occurred:"),a.a.createElement("p",{className:"body"},o.message),a.a.createElement("p",{className:"footer"},"Click to create an issue on GitHub"),null!=o.save&&a.a.createElement("a",{href:o.save,download:this.saveName},"Download save file")):r&&!n?a.a.createElement("div",{className:"loading"},i&&i.text||"Loading...",null!=i&&!!i.total&&a.a.createElement("span",{className:"progressBar"},a.a.createElement("span",null,a.a.createElement("span",{style:{width:"".concat(Math.round(100*i.loaded/i.total),"%")}})))):n?void 0:a.a.createElement("div",{className:"start"},a.a.createElement("p",null,"This is a web port of the original Diablo game, based on source code reconstructed by GalaXyHaXz and devilution team. The project page with information and links can be found over here ",a.a.createElement(ct,{href:"https://github.com/d07RiV/diabloweb"},"https://github.com/d07RiV/diabloweb")),a.a.createElement("p",null,"If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing. The game can be purchased from ",a.a.createElement(ct,{href:"https://www.gog.com/game/diablo"},"GoG"),"."," ",a.a.createElement("span",{className:"link",onClick:function(){return e.setState({compress:!0})}},"Click here to compress the MPQ, greatly reducing its size.")),!s&&a.a.createElement("p",null,"Or you can play the shareware version for free (50MB download)."),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Select MPQ"),a.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseFile})),a.a.createElement("div",{className:"startButton",onClick:function(){return e.start()}},"Play Shareware"),!!c&&a.a.createElement("div",{className:"startButton",onClick:this.showSaves},"Manage Saves"))}},{key:"render",value:function(){var e=this.state,t=e.started,n=e.error,r=e.dropping;return a.a.createElement("div",{className:x()("App",{touch:this.touchControls,started:t,dropping:r,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"touch-ui touch-mods"},a.a.createElement("div",{className:x()("touch-button","touch-button-0",{active:this.touchMods[0]}),ref:this.setTouch0}),a.a.createElement("div",{className:x()("touch-button","touch-button-1",{active:this.touchMods[1]}),ref:this.setTouch1}),a.a.createElement("div",{className:x()("touch-button","touch-button-2",{active:this.touchMods[2]}),ref:this.setTouch2})),a.a.createElement("div",{className:"touch-ui touch-belt"},a.a.createElement("div",{className:x()("touch-button","touch-button-0"),ref:this.setTouch3}),a.a.createElement("div",{className:x()("touch-button","touch-button-1"),ref:this.setTouch4}),a.a.createElement("div",{className:x()("touch-button","touch-button-2"),ref:this.setTouch5})),a.a.createElement("div",{className:"Body"},a.a.createElement("div",{className:"inner"},!n&&a.a.createElement("canvas",{ref:this.setCanvas,width:640,height:480}),a.a.createElement("input",{type:"text",className:"keyboard",onChange:this.onKeyboard,onBlur:this.onKeyboardBlur,ref:this.setKeyboard,spellCheck:!1,style:this.showKeyboard||{}}))),a.a.createElement("div",{className:"BodyV"},this.renderUi()))}}]),t}(a.a.Component);i.a.render(a.a.createElement(ut,null),document.getElementById("root")),function(e){if("serviceWorker"in navigator){if(new URL("/diabloweb",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",function(){var t="".concat("/diabloweb","/service-worker.js");s?(function(e,t){fetch(e).then(function(n){var r=n.headers.get("content-type");404===n.status||null!=r&&-1===r.indexOf("javascript")?navigator.serviceWorker.ready.then(function(e){e.unregister().then(function(){window.location.reload()})}):c(e,t)}).catch(function(){console.log("No internet connection found. App is running in offline mode.")})}(t,e),navigator.serviceWorker.ready.then(function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")})):c(t,e)})}}({onUpdate:function(){}})}},[[41,2,0,5]]]); +//# sourceMappingURL=main.62369ba5.chunk.js.map \ No newline at end of file diff --git a/static/js/main.62369ba5.chunk.js.map b/static/js/main.62369ba5.chunk.js.map new file mode 100644 index 0000000..eb12d34 --- /dev/null +++ b/static/js/main.62369ba5.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["fs.js","api/game.worker.js","mpqcmp/mpqcmp.worker.js","mpqcmp/MpqCmp.wasm","mpqcmp/ListFile.txt","../node_modules/peerjs/dist sync","serviceWorker.js","api/explode.js","api/codec.js","api/savefile.js","api/sound.js","api/load_spawn.js","api/packet.js","api/webrtc.js","api/loader.js","mpqcmp/compress.js","mpqcmp/index.js","App.js","index.js"],"names":["downloadFile","_callee","store","name","file","blob","url","lnk","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_1___default","a","wrap","_context","prev","next","get","toLowerCase","sent","Blob","type","URL","createObjectURL","document","createElement","setAttribute","body","appendChild","click","removeChild","revokeObjectURL","console","error","concat","stop","downloadSaves","_callee2","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","_context2","undefined","keys","t0","Symbol","iterator","done","value","match","t1","return","finish","readFile","Promise","resolve","reject","reader","FileReader","onload","result","onerror","onabort","readAsArrayBuffer","uploadFile","_callee3","files","data","_context3","Uint8Array","set","abrupt","create_fs","_x7","_create_fs","apply","this","arguments","_callee5","load","_i","_Object$entries","_ref3","_ref2","_context5","IdbKvStore","Map","Object","json","entries","call","length","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","window","DownloadFile","DownloadSaves","update","delete","remove","clear","download","upload","fileUrl","_fileUrl","C_Projects_diabloweb_diabloweb_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_2__","mark","_callee4","_context4","_x8","t2","module","exports","Worker","__webpack_require__","p","webpackEmptyContext","req","e","Error","code","id","isLocalhost","Boolean","location","hostname","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","state","controller","log","onUpdate","onSuccess","catch","CMP_BINARY","CMP_ASCII","CMP_NO_ERROR","CMP_INVALID_DICTSIZE","CMP_INVALID_MODE","CMP_BAD_DATA","CMP_ABORT","PKDCL_OK","PKDCL_STREAM_END","DistBits","DistCode","ExLenBits","LenBase","Uint16Array","LenBits","LenCode","ChBitsAsc","ChCodeAsc","GenDecodeTabs","positions","start_indexes","length_bits","elements","i","index","WasteBits","pWork","nBits","extra_bits","bit_buff","in_pos","in_bytes","read_buf","in_buff","DecodeLit","length_code","LengthCodes","extra_length_bits","extra_length","ctype","uncompressed_byte","offs2C34","offs2D34","offs2E34","offs2EB4","DecodeDist","rep_length","distance","dist_pos_code","DistPosCodes","dsize_bits","dsize_mask","explode","write_buf","buffer","ArrayBuffer","out_buff","pChCodeAsc","count","bits_asc","acc","add","GenAscTabs","next_literal","outputPos","minus_dist","target","source","subarray","copyWithin","Expand","W","Uint32Array","SHA1CircularShift","shift","SHA1","classCallCheck","digest","digest8","u8","u32","byteOffset","input","A","B","C","D","E","temp","Random","seed","codec_decode","password","size","last_size","sha","rand","key","k32","pw","charCodeAt","input8","codec_init_key","size32","data32","buf32","buf","j","pkzip_decompress","out_size","output","out_pos","dst","Math","min","src","hashtable","b","decrypt","decrypt8","encrypt","orig","hash","seed1","seed2","ch","path_name","pos","max","lastIndexOf","substring","Flags","MpqReader","byteLength","readHeader","createClass","sizeId","hashOffset","blockOffset","hashCount","blockCount","hashTable","readTable","blockTable","blockSize","offset","slice","keyA","keyB","fileIndex","block","info","filePos","cmpSize","fileSize","flags","raw","readRaw","numBlocks","floor","tableSize","blocks","oPos","uSize","tmp","init_sound","AudioContext","webkitAudioContext","StereoPannerNode","create_sound","duplicate_sound","play_sound","set_volume","stop_sound","delete_sound","context","sounds","create_sound_raw","channels","rate","createBuffer","getChannelData","gain","createGain","panner","pan","decodeAudioData","srcId","volume","loop","pow","relVolume","createBufferSource","node","connect","destination","start","stop_all","sound","slicedToArray","err","SpawnSizes","load_spawn","_x","_x2","_load_spawn","api","fs","spawn","regenerator_default","includes","axios","request","process","responseType","onDownloadProgress","onProgress","text","loaded","total","headers","Cache-Control","buffer_reader","read8","String","fromCharCode","toConsumableArray","read32","buffer_writer","write8","write32","rest","RejectionReason","JOIN_SUCCESS","JOIN_ALREADY_IN_GAME","JOIN_GAME_NOT_FOUND","JOIN_INCORRECT_PASSWORD","JOIN_VERSION_MISMATCH","JOIN_GAME_FULL","CREATE_GAME_EXISTS","read_packet","types","cls","values","find","packet","read","packet_size","write_packet","write","make_batch","read16","packets","push","reduce","sum","_ref","writer","write16","server_packet","version","_ref4","game_list","games","read_str","_ref5","_ref6","_ref7","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_ref9","write_str","join_accept","cookie","difficulty","_ref10","join_reject","reason","_ref11","_ref12","disconnect","_ref13","message","payload","_ref14","_ref15","turn","_ref16","batch","client_packet","_ref17","create_game","_ref18","_ref19","join_game","_ref20","_ref21","leave_game","drop_player","_ref22","_ref23","_ref24","_ref25","PeerID","Options","host","port","secure","webrtc_server","onMessage","onClose","_this","peer","Peer","on","conn","onConnect","players","myplr","random","onError","off","onOpen","setTimeout","_this2","_read_packet","pkt","send","handle","drop","mask","destroy","close","webrtc_client","_this3","pending","needUnreg","unreg","clearTimeout","timeout","_read_packet2","webrtc_open","server","client","_read_packet3","onRender","ctx","bitmap","images","clip","belt","transferFromImageBitmap","x","y","w","h","image","createImageData","putImageData","save","font","x0","y0","x1","y1","beginPath","rect","str","color","r","g","fillStyle","fillText","restore","updateBelt","audio","mpq","offscreen","canvas","getContext","alpha","worker","packetQueue","webrtc","addEventListener","action","func","_len","params","Array","_key","postMessage","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","_ref8","setCursorPos","openKeyboard","stack","onExit","setCurrentSave","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","transfer","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","setInterval","load_game","do_load_game","MpqSize","ListSize","progress","loadFile","binary","_args","runWorker","objectSpread","updateProgress","loader","mpqsize","fHeader","fBinary","fList","header","header16","hashTablePos","blockTablePos","hashTableSize","blockTableSize","fHashTable","fBlockTable","list","listMap","hashStr","_name","NUM_TASKS","tasks","cSize","task","numFiles","_loop","_i2","_tasks","_loop2","_i3","_tasks2","outputSize","blockPos","_i4","_tasks3","_task","_task$result","_i5","weight","ready","MpqBinary","ListFile","t3","t4","t5","t6","trim","t7","split","map","filter","h1","h2","toString","padStart","t8","fLoad","all","t","forEach","run","res","fill","CompressMpq","parseFile","onDone","setState","props","compress","started","_x3","_x4","_compress","_this$state","react_default","className","href","onClick","style","width","round","htmlFor","accept","display","onChange","React","Component","reportLink","retail","searchParams","line","join","userAgent","ReactGA","initialize","pageview","TOUCH_MOVE","TOUCH_RMB","keyboardRule","styleSheets","sheet","cssRules","rule","CSSRule","MEDIA_RULE","conditionText","sub","selectorText","findKeyboardRule","Link","children","objectWithoutProperties","assign","rel","App","possibleConstructorReturn","getPrototypeOf","loading","dropping","has_spawn","cursorPos","touchControls","touchButtons","touchCtx","touchMods","touchBelt","maxKeyboard","onDrop","dataTransfer","items","kind","getAsFile","getDropFile","preventDefault","compressMpq","onDragEnter","setDropping","onDragOver","isDropFile","onDragLeave","showSaves","save_names","updateSaves","show_saves","onResize","exitPointerLock","onPointerLockChange","screen","innerHeight","height","pointerLocked","game","onMouseMove","_this$mousePos","mousePos","eventMods","onMouseDown","keyboard","element","classList","_this$mousePos2","requestPointerLock","mouseButton","onMouseUp","_this$mousePos3","onKeyDown","keyCode","showKeyboard","clearKeySel","onMenu","onKeyUp","onKeyboard","onKeyboardInner","onKeyboardBlur","parseSave","touchButton","touchCanvas","onTouchStart","blur","updateTouchButton","touches","_this$mousePos4","onTouchMove","_this$mousePos5","onTouchEnd","prevTc","_this$mousePos6","setTouchMod","fullscreenElement","requestFullscreen","setCanvas","setElement","setKeyboard","setTouch0","setTouch_","bind","assertThisInitialized","setTouch1","setTouch2","setTouch3","setTouchBelt_","setTouch4","setTouch5","inc","asyncToGenerator","errorObject","saveName","mapStackTrace","left","toFixed","top","focus","transform","keyboardNum","_this4","getBoundingClientRect","right","bottom","reload","_this5","saves","hero","getPassword","nameEnd","indexOf","level","getPlayerName","_this6","confirm","idx","slot","drawImage","used","Set","has","drawBelt","_this7","removeEventListener","event","category","passive","capture","alert","pointerLockElement","mozPointerLockElement","movementX","movementY","clientX","clientY","button","shiftKey","ctrlKey","altKey","len","setSelectionRange","valid","maxValue","parseInt","use","toggle","now","performance","beltTime","release","_this8","touchOther","btn","identifier","stick","panPos","v","original","_ret","dx","dy","step","offsetHeight","abs","_this9","plrClass","index_es","icon","faDownload","downloadSave","faTimes","removeSave","mpqcmp_CompressMpq","ref","App_Link","_this$state2","classNames","touch","active","onBlur","spellCheck","renderUi","ReactDOM","render","src_App_0","getElementById","origin","fetch","response","contentType","status","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.62369ba5.chunk.js","sourcesContent":["import IdbKvStore from 'idb-kv-store';\r\n\r\n/*const importStorage = () => new Promise((resolve, reject) => {\r\n let done = false;\r\n const frame = document.createElement('iframe');\r\n window.addEventListener('message', ({data}) => {\r\n if (data.method === 'storage' && !done) {\r\n done = true;\r\n resolve(data.files);\r\n frame.contentWindow.postMessage({method: 'clear'}, '*');\r\n }\r\n });\r\n frame.addEventListener('load', () => {\r\n frame.contentWindow.postMessage({method: 'transfer'}, '*');\r\n });\r\n frame.addEventListener('error', () => {\r\n if (!done) {\r\n done = true;\r\n resolve(null);\r\n }\r\n });\r\n frame.src = \"https://diablo.rivsoft.net/storage.html\";\r\n frame.style.display = \"none\";\r\n document.body.appendChild(frame);\r\n setTimeout(() => {\r\n if (!done) {\r\n done = true;\r\n resolve(null);\r\n }\r\n }, 10000);\r\n});*/\r\n\r\nasync function downloadFile(store, name) {\r\n const file = await store.get(name.toLowerCase());\r\n if (file) {\r\n const blob = new Blob([file], {type: 'binary/octet-stream'});\r\n const url = URL.createObjectURL(blob);\r\n const lnk = document.createElement('a');\r\n lnk.setAttribute('href', url);\r\n lnk.setAttribute('download', name);\r\n document.body.appendChild(lnk);\r\n lnk.click();\r\n document.body.removeChild(lnk);\r\n URL.revokeObjectURL(url);\r\n } else {\r\n console.error(`File ${name} does not exist`);\r\n }\r\n}\r\n\r\nasync function downloadSaves(store) {\r\n for (let name of await store.keys()) {\r\n if (name.match(/\\.sv$/i)) {\r\n downloadFile(store, name);\r\n }\r\n }\r\n}\r\n\r\nconst readFile = file => new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = () => reject(reader.error);\r\n reader.onabort = () => reject();\r\n reader.readAsArrayBuffer(file);\r\n});\r\nasync function uploadFile(store, files, file) {\r\n const data = new Uint8Array(await readFile(file));\r\n files.set(file.name.toLowerCase(), data);\r\n return store.set(file.name.toLowerCase(), data);\r\n}\r\n\r\nexport default async function create_fs(load) {\r\n try {\r\n const store = new IdbKvStore('diablo_fs');\r\n const files = new Map();\r\n for (let [name, data] of Object.entries(await store.json())) {\r\n files.set(name, data);\r\n }\r\n /*if (load) {\r\n const files = await importStorage();\r\n if (files) {\r\n for (let [name, data] of files) {\r\n files.set(name, data);\r\n store.set(name, data);\r\n }\r\n }\r\n }*/\r\n window.DownloadFile = name => downloadFile(store, name);\r\n window.DownloadSaves = () => downloadSaves(store);\r\n return {\r\n files,\r\n update: (name, data) => store.set(name, data),\r\n delete: name => store.remove(name),\r\n clear: () => store.clear(),\r\n download: name => downloadFile(store, name),\r\n upload: file => uploadFile(store, files, file),\r\n fileUrl: async name => {\r\n const file = await store.get(name.toLowerCase());\r\n if (file) {\r\n const blob = new Blob([file], {type: 'binary/octet-stream'});\r\n return URL.createObjectURL(blob);\r\n }\r\n },\r\n };\r\n } catch (e) {\r\n window.DownloadFile = () => console.error('IndexedDB is not supported');\r\n window.DownloadSaves = () => console.error('IndexedDB is not supported');\r\n return {\r\n files: new Map(),\r\n update: () => Promise.resolve(),\r\n delete: () => Promise.resolve(),\r\n clear: () => Promise.resolve(),\r\n download: () => Promise.resolve(),\r\n upload: () => Promise.resolve(),\r\n fileUrl: () => Promise.resolve(),\r\n };\r\n } \r\n}\r\n","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"b6959098d798174bd69f.worker.js\");\n};","module.exports = function() {\n return new Worker(__webpack_public_path__ + \"559256dc812e37cc8bb5.worker.js\");\n};","module.exports = __webpack_public_path__ + \"static/media/MpqCmp.8aa3c6dc.wasm\";","module.exports = __webpack_public_path__ + \"static/media/ListFile.b370797d.txt\";","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 72;","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","export const CMP_BINARY = 0; // Binary compression\r\nexport const CMP_ASCII = 1; // Ascii compression\r\nexport const CMP_NO_ERROR = 0;\r\nexport const CMP_INVALID_DICTSIZE = 1;\r\nexport const CMP_INVALID_MODE = 2;\r\nexport const CMP_BAD_DATA = 3;\r\nexport const CMP_ABORT = 4;\r\nexport const CMP_IMPLODE_DICT_SIZE1 = 1024; // Dictionary size of 1024\r\nexport const CMP_IMPLODE_DICT_SIZE2 = 2048; // Dictionary size of 2048\r\nexport const CMP_IMPLODE_DICT_SIZE3 = 4096; // Dictionary size of 4096\r\n\r\nexport const PKDCL_OK = 0;\r\nexport const PKDCL_STREAM_END = 1; // All data from the input stream is read\r\nexport const PKDCL_NEED_DICT = 2; // Need more data (dictionary)\r\nexport const PKDCL_CONTINUE = 10; // Internal flag, not returned to user\r\nexport const PKDCL_GET_INPUT = 11; // Internal flag, not returned to user\r\n\r\nconst DistBits = new Uint8Array([\r\n 0x02, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,\r\n 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\r\n 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,\r\n 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08\r\n]);\r\n\r\nconst DistCode = new Uint8Array([\r\n 0x03, 0x0D, 0x05, 0x19, 0x09, 0x11, 0x01, 0x3E, 0x1E, 0x2E, 0x0E, 0x36, 0x16, 0x26, 0x06, 0x3A,\r\n 0x1A, 0x2A, 0x0A, 0x32, 0x12, 0x22, 0x42, 0x02, 0x7C, 0x3C, 0x5C, 0x1C, 0x6C, 0x2C, 0x4C, 0x0C,\r\n 0x74, 0x34, 0x54, 0x14, 0x64, 0x24, 0x44, 0x04, 0x78, 0x38, 0x58, 0x18, 0x68, 0x28, 0x48, 0x08,\r\n 0xF0, 0x70, 0xB0, 0x30, 0xD0, 0x50, 0x90, 0x10, 0xE0, 0x60, 0xA0, 0x20, 0xC0, 0x40, 0x80, 0x00\r\n]);\r\n\r\nconst ExLenBits = new Uint8Array([\r\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08\r\n]);\r\n\r\nconst LenBase = new Uint16Array([\r\n 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,\r\n 0x0008, 0x000A, 0x000E, 0x0016, 0x0026, 0x0046, 0x0086, 0x0106\r\n]);\r\n\r\nconst LenBits = new Uint8Array([\r\n 0x03, 0x02, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07\r\n]);\r\n\r\nconst LenCode = new Uint8Array([\r\n 0x05, 0x03, 0x01, 0x06, 0x0A, 0x02, 0x0C, 0x14, 0x04, 0x18, 0x08, 0x30, 0x10, 0x20, 0x40, 0x00\r\n]);\r\n\r\nconst ChBitsAsc = new Uint8Array([\r\n 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x08, 0x07, 0x0C, 0x0C, 0x07, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x04, 0x0A, 0x08, 0x0C, 0x0A, 0x0C, 0x0A, 0x08, 0x07, 0x07, 0x08, 0x09, 0x07, 0x06, 0x07, 0x08,\r\n 0x07, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07, 0x07, 0x08, 0x08, 0x0C, 0x0B, 0x07, 0x09, 0x0B,\r\n 0x0C, 0x06, 0x07, 0x06, 0x06, 0x05, 0x07, 0x08, 0x08, 0x06, 0x0B, 0x09, 0x06, 0x07, 0x06, 0x06,\r\n 0x07, 0x0B, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08, 0x09, 0x09, 0x0B, 0x08, 0x0B, 0x09, 0x0C, 0x08,\r\n 0x0C, 0x05, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x06, 0x05, 0x0B, 0x07, 0x05, 0x06, 0x05, 0x05,\r\n 0x06, 0x0A, 0x05, 0x05, 0x05, 0x05, 0x08, 0x07, 0x08, 0x08, 0x0A, 0x0B, 0x0B, 0x0C, 0x0C, 0x0C,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C,\r\n 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0C, 0x0D,\r\n 0x0D, 0x0D, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D\r\n]);\r\n\r\nconst ChCodeAsc = new Uint16Array([\r\n 0x0490, 0x0FE0, 0x07E0, 0x0BE0, 0x03E0, 0x0DE0, 0x05E0, 0x09E0,\r\n 0x01E0, 0x00B8, 0x0062, 0x0EE0, 0x06E0, 0x0022, 0x0AE0, 0x02E0,\r\n 0x0CE0, 0x04E0, 0x08E0, 0x00E0, 0x0F60, 0x0760, 0x0B60, 0x0360,\r\n 0x0D60, 0x0560, 0x1240, 0x0960, 0x0160, 0x0E60, 0x0660, 0x0A60,\r\n 0x000F, 0x0250, 0x0038, 0x0260, 0x0050, 0x0C60, 0x0390, 0x00D8,\r\n 0x0042, 0x0002, 0x0058, 0x01B0, 0x007C, 0x0029, 0x003C, 0x0098,\r\n 0x005C, 0x0009, 0x001C, 0x006C, 0x002C, 0x004C, 0x0018, 0x000C,\r\n 0x0074, 0x00E8, 0x0068, 0x0460, 0x0090, 0x0034, 0x00B0, 0x0710,\r\n 0x0860, 0x0031, 0x0054, 0x0011, 0x0021, 0x0017, 0x0014, 0x00A8,\r\n 0x0028, 0x0001, 0x0310, 0x0130, 0x003E, 0x0064, 0x001E, 0x002E,\r\n 0x0024, 0x0510, 0x000E, 0x0036, 0x0016, 0x0044, 0x0030, 0x00C8,\r\n 0x01D0, 0x00D0, 0x0110, 0x0048, 0x0610, 0x0150, 0x0060, 0x0088,\r\n 0x0FA0, 0x0007, 0x0026, 0x0006, 0x003A, 0x001B, 0x001A, 0x002A,\r\n 0x000A, 0x000B, 0x0210, 0x0004, 0x0013, 0x0032, 0x0003, 0x001D,\r\n 0x0012, 0x0190, 0x000D, 0x0015, 0x0005, 0x0019, 0x0008, 0x0078,\r\n 0x00F0, 0x0070, 0x0290, 0x0410, 0x0010, 0x07A0, 0x0BA0, 0x03A0,\r\n 0x0240, 0x1C40, 0x0C40, 0x1440, 0x0440, 0x1840, 0x0840, 0x1040,\r\n 0x0040, 0x1F80, 0x0F80, 0x1780, 0x0780, 0x1B80, 0x0B80, 0x1380,\r\n 0x0380, 0x1D80, 0x0D80, 0x1580, 0x0580, 0x1980, 0x0980, 0x1180,\r\n 0x0180, 0x1E80, 0x0E80, 0x1680, 0x0680, 0x1A80, 0x0A80, 0x1280,\r\n 0x0280, 0x1C80, 0x0C80, 0x1480, 0x0480, 0x1880, 0x0880, 0x1080,\r\n 0x0080, 0x1F00, 0x0F00, 0x1700, 0x0700, 0x1B00, 0x0B00, 0x1300,\r\n 0x0DA0, 0x05A0, 0x09A0, 0x01A0, 0x0EA0, 0x06A0, 0x0AA0, 0x02A0,\r\n 0x0CA0, 0x04A0, 0x08A0, 0x00A0, 0x0F20, 0x0720, 0x0B20, 0x0320,\r\n 0x0D20, 0x0520, 0x0920, 0x0120, 0x0E20, 0x0620, 0x0A20, 0x0220,\r\n 0x0C20, 0x0420, 0x0820, 0x0020, 0x0FC0, 0x07C0, 0x0BC0, 0x03C0,\r\n 0x0DC0, 0x05C0, 0x09C0, 0x01C0, 0x0EC0, 0x06C0, 0x0AC0, 0x02C0,\r\n 0x0CC0, 0x04C0, 0x08C0, 0x00C0, 0x0F40, 0x0740, 0x0B40, 0x0340,\r\n 0x0300, 0x0D40, 0x1D00, 0x0D00, 0x1500, 0x0540, 0x0500, 0x1900,\r\n 0x0900, 0x0940, 0x1100, 0x0100, 0x1E00, 0x0E00, 0x0140, 0x1600,\r\n 0x0600, 0x1A00, 0x0E40, 0x0640, 0x0A40, 0x0A00, 0x1200, 0x0200,\r\n 0x1C00, 0x0C00, 0x1400, 0x0400, 0x1800, 0x0800, 0x1000, 0x0000 \r\n]);\r\n\r\n/**\r\n * @param {Uint8Array} positions [out] Table of positions\r\n * @param {Uint8Array} start_indexes Table of start indexes\r\n * @param {Uint8Array} length_bits Table of lengths. Each length is stored as number of bits\r\n * @param {number} elements Number of elements in start_indexes and length_bits\r\n */\r\nfunction GenDecodeTabs(positions, start_indexes, length_bits, elements) {\r\n for (let i = 0; i < elements; i++) {\r\n const length = 1 << length_bits[i]; // Get the length in bytes\r\n for (let index = start_indexes[i]; index < 0x100; index += length) {\r\n positions[index] = i;\r\n }\r\n }\r\n}\r\n\r\nfunction GenAscTabs(pWork) {\r\n let pChCodeAsc = 0xFF;\r\n\r\n for (let count = 0x00FF; pChCodeAsc >= 0; pChCodeAsc--, count--) {\r\n let bits_asc = pWork.ChBitsAsc[count];\r\n let acc;\r\n\r\n if (bits_asc <= 8) {\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc];\r\n\r\n do {\r\n pWork.offs2C34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n } else if ((acc = (ChCodeAsc[pChCodeAsc] & 0xFF)) !== 0) {\r\n pWork.offs2C34[acc] = 0xFF;\r\n\r\n if (ChCodeAsc[pChCodeAsc] & 0x3F) {\r\n bits_asc -= 4;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 4;\r\n do {\r\n pWork.offs2D34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n } else {\r\n bits_asc -= 6;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 6;\r\n do {\r\n pWork.offs2E34[acc] = count;\r\n acc += add;\r\n } while(acc < 0x80);\r\n }\r\n } else {\r\n bits_asc -= 8;\r\n pWork.ChBitsAsc[count] = bits_asc;\r\n\r\n const add = (1 << bits_asc);\r\n acc = ChCodeAsc[pChCodeAsc] >> 8;\r\n do {\r\n pWork.offs2EB4[acc] = count;\r\n acc += add;\r\n } while(acc < 0x100);\r\n }\r\n }\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Removes given number of bits in the bit buffer. New bits are reloaded from\r\n// the input buffer, if needed.\r\n// Returns: PKDCL_OK: Operation was successful\r\n// PKDCL_STREAM_END: There are no more bits in the input buffer\r\nfunction WasteBits(pWork, nBits) {\r\n // If number of bits required is less than number of (bits in the buffer) ?\r\n if (nBits <= pWork.extra_bits) {\r\n pWork.extra_bits -= nBits;\r\n pWork.bit_buff >>>= nBits;\r\n return PKDCL_OK;\r\n }\r\n\r\n // Load input buffer if necessary\r\n pWork.bit_buff >>= pWork.extra_bits;\r\n if (pWork.in_pos === pWork.in_bytes) {\r\n if ((pWork.in_bytes = pWork.read_buf(pWork.in_buff)) === 0) {\r\n return PKDCL_STREAM_END;\r\n }\r\n pWork.in_pos = 0;\r\n }\r\n\r\n // Update bit buffer\r\n pWork.bit_buff |= (pWork.in_buff[pWork.in_pos++] << 8);\r\n pWork.bit_buff >>>= (nBits - pWork.extra_bits);\r\n pWork.extra_bits = (pWork.extra_bits - nBits) + 8;\r\n return PKDCL_OK;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Decodes next literal from the input (compressed) data.\r\n// Returns : 0x000: One byte 0x00\r\n// 0x001: One byte 0x01\r\n// ...\r\n// 0x0FF: One byte 0xFF\r\n// 0x100: Repetition, length of 0x02 bytes\r\n// 0x101: Repetition, length of 0x03 bytes\r\n// ...\r\n// 0x304: Repetition, length of 0x206 bytes\r\n// 0x305: End of stream\r\n// 0x306: Error\r\nfunction DecodeLit(pWork) {\r\n if(pWork.bit_buff & 1) {\r\n // Remove one bit from the input data\r\n if(WasteBits(pWork, 1)) {\r\n return 0x306;\r\n }\r\n\r\n // The next 8 bits hold the index to the length code table\r\n let length_code = pWork.LengthCodes[pWork.bit_buff & 0xFF];\r\n\r\n // Remove the apropriate number of bits\r\n if(WasteBits(pWork, pWork.LenBits[length_code])) {\r\n return 0x306;\r\n }\r\n\r\n // Are there some extra bits for the obtained length code ?\r\n const extra_length_bits = pWork.ExLenBits[length_code];\r\n if(extra_length_bits !== 0) {\r\n const extra_length = pWork.bit_buff & ((1 << extra_length_bits) - 1);\r\n if(WasteBits(pWork, extra_length_bits)) {\r\n if((length_code + extra_length) != 0x10E) {\r\n return 0x306;\r\n }\r\n }\r\n length_code = pWork.LenBase[length_code] + extra_length;\r\n }\r\n\r\n // In order to distinguish uncompressed byte from repetition length,\r\n // we have to add 0x100 to the length.\r\n return length_code + 0x100;\r\n }\r\n\r\n // Remove one bit from the input data\r\n if(WasteBits(pWork, 1)) {\r\n return 0x306;\r\n }\r\n\r\n // If the binary compression type, read 8 bits and return them as one byte.\r\n if(pWork.ctype === CMP_BINARY) {\r\n const uncompressed_byte = pWork.bit_buff & 0xFF;\r\n\r\n if(WasteBits(pWork, 8)) {\r\n return 0x306;\r\n }\r\n return uncompressed_byte;\r\n }\r\n\r\n // When ASCII compression ...\r\n let value;\r\n if (pWork.bit_buff & 0xFF) {\r\n value = pWork.offs2C34[pWork.bit_buff & 0xFF];\r\n\r\n if (value == 0xFF) {\r\n if (pWork.bit_buff & 0x3F) {\r\n if (WasteBits(pWork, 4)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2D34[pWork.bit_buff & 0xFF];\r\n } else {\r\n if (WasteBits(pWork, 6)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2E34[pWork.bit_buff & 0x7F];\r\n }\r\n }\r\n } else {\r\n if(WasteBits(pWork, 8)) {\r\n return 0x306;\r\n }\r\n\r\n value = pWork.offs2EB4[pWork.bit_buff & 0xFF];\r\n }\r\n\r\n return WasteBits(pWork, pWork.ChBitsAsc[value]) ? 0x306 : value;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Decodes the distance of the repetition, backwards relative to the\r\n// current output buffer position\r\nfunction DecodeDist(pWork, rep_length) {\r\n // Next 2-8 bits in the input buffer is the distance position code\r\n const dist_pos_code = pWork.DistPosCodes[pWork.bit_buff & 0xFF];\r\n const dist_pos_bits = pWork.DistBits[dist_pos_code];\r\n if (WasteBits(pWork, dist_pos_bits)) {\r\n return 0;\r\n }\r\n\r\n let distance;\r\n if (rep_length === 2) {\r\n // If the repetition is only 2 bytes length,\r\n // then take 2 bits from the stream in order to get the distance\r\n distance = (dist_pos_code << 2) | (pWork.bit_buff & 0x03);\r\n if (WasteBits(pWork, 2)) {\r\n return 0;\r\n }\r\n } else {\r\n // If the repetition is more than 2 bytes length,\r\n // then take \"dsize_bits\" bits in order to get the distance\r\n distance = (dist_pos_code << pWork.dsize_bits) | (pWork.bit_buff & pWork.dsize_mask);\r\n if (WasteBits(pWork, pWork.dsize_bits)) {\r\n return 0;\r\n }\r\n }\r\n return distance + 1;\r\n}\r\n\r\nfunction Expand(pWork) {\r\n let outputPos = 0x1000; // Initialize output buffer position\r\n\r\n // Decode the next literal from the input data.\r\n // The returned literal can either be an uncompressed byte (next_literal < 0x100)\r\n // or an encoded length of the repeating byte sequence that\r\n // is to be copied to the current buffer position\r\n let result, next_literal;\r\n while ((result = next_literal = DecodeLit(pWork)) < 0x305) {\r\n // If the literal is greater than 0x100, it holds length\r\n // of repeating byte sequence\r\n // literal of 0x100 means repeating sequence of 0x2 bytes\r\n // literal of 0x101 means repeating sequence of 0x3 bytes\r\n // ...\r\n // literal of 0x305 means repeating sequence of 0x207 bytes\r\n if(next_literal >= 0x100) {\r\n // Get the length of the repeating sequence.\r\n // Note that the repeating block may overlap the current output position,\r\n // for example if there was a sequence of equal bytes\r\n let rep_length = next_literal - 0xFE;\r\n // Get backward distance to the repetition\r\n const minus_dist = DecodeDist(pWork, rep_length);\r\n if (minus_dist === 0) {\r\n result = 0x306;\r\n break;\r\n }\r\n\r\n // Target and source pointer\r\n let target = outputPos;\r\n let source = target - minus_dist;\r\n\r\n // Update buffer output position\r\n outputPos += rep_length;\r\n\r\n // Copy the repeating sequence\r\n const out_buff = pWork.out_buff;\r\n while (rep_length-- > 0) {\r\n out_buff[target++] = out_buff[source++];\r\n }\r\n } else {\r\n pWork.out_buff[outputPos++] = next_literal;\r\n }\r\n\r\n // Flush the output buffer, if number of extracted bytes has reached the end\r\n if (outputPos >= 0x2000) {\r\n // Copy decompressed data into user buffer\r\n pWork.write_buf(pWork.out_buff.subarray(0x1000, 0x2000));\r\n\r\n // Now copy the decompressed data to the first half of the buffer.\r\n // This is needed because the decompression might reuse them as repetitions.\r\n // Note that if the output buffer overflowed previously, the extra decompressed bytes\r\n // are stored in \"out_buff_overflow\", and they will now be\r\n // within decompressed part of the output buffer.\r\n pWork.out_buff.copyWithin(0, 0x1000, outputPos);\r\n outputPos -= 0x1000;\r\n }\r\n }\r\n\r\n // Flush any remaining decompressed bytes\r\n pWork.write_buf(pWork.out_buff.subarray(0x1000, outputPos));\r\n return result;\r\n}\r\n\r\n//-----------------------------------------------------------------------------\r\n// Main exploding function.\r\nexport function explode(read_buf, write_buf) {\r\n const buffer = new ArrayBuffer(0x3104);\r\n const pWork = {\r\n read_buf,\r\n write_buf,\r\n in_pos: 3,\r\n extra_bits: 0,\r\n in_buff: new Uint8Array(buffer, 0, 0x800),\r\n DistPosCodes: new Uint8Array(buffer, 0x800, 0x100),\r\n LengthCodes: new Uint8Array(buffer, 0x900, 0x100),\r\n offs2C34: new Uint8Array(buffer, 0xA00, 0x100),\r\n offs2D34: new Uint8Array(buffer, 0xB00, 0x100),\r\n offs2E34: new Uint8Array(buffer, 0xC00, 0x80),\r\n offs2EB4: new Uint8Array(buffer, 0xC80, 0x100),\r\n ChBitsAsc: new Uint8Array(buffer, 0xD80, 0x100),\r\n DistBits: new Uint8Array(buffer, 0xE80, 0x40),\r\n LenBits: new Uint8Array(buffer, 0xEC0, 0x10),\r\n ExLenBits: new Uint8Array(buffer, 0xED0, 0x10),\r\n LenBase: new Uint16Array(buffer, 0xEE0, 0x10),\r\n out_buff: new Uint8Array(buffer, 0xF00, 0x2204),\r\n };\r\n pWork.in_bytes = read_buf(pWork.in_buff);\r\n if (pWork.in_bytes <= 4) {\r\n return CMP_BAD_DATA;\r\n }\r\n pWork.ctype = pWork.in_buff[0];\r\n pWork.dsize_bits = pWork.in_buff[1];\r\n pWork.bit_buff = pWork.in_buff[2];\r\n\r\n // Test for the valid dictionary size\r\n if(4 > pWork.dsize_bits || pWork.dsize_bits > 6) {\r\n return CMP_INVALID_DICTSIZE;\r\n }\r\n\r\n pWork.dsize_mask = 0xFFFF >> (0x10 - pWork.dsize_bits); // Shifted by 'sar' instruction\r\n\r\n if(pWork.ctype != CMP_BINARY) {\r\n if(pWork.ctype != CMP_ASCII) {\r\n return CMP_INVALID_MODE;\r\n }\r\n\r\n pWork.ChBitsAsc.set(ChBitsAsc);\r\n GenAscTabs(pWork);\r\n }\r\n\r\n pWork.LenBits.set(LenBits);\r\n GenDecodeTabs(pWork.LengthCodes, LenCode, pWork.LenBits, pWork.LenBits.length);\r\n pWork.ExLenBits.set(ExLenBits);\r\n pWork.LenBase.set(LenBase);\r\n pWork.DistBits.set(DistBits);\r\n GenDecodeTabs(pWork.DistPosCodes, DistCode, pWork.DistBits, pWork.DistBits.length);\r\n if(Expand(pWork) !== 0x306) {\r\n return CMP_NO_ERROR;\r\n }\r\n \r\n return CMP_ABORT;\r\n}\r\n\r\nexport default explode;\r\n","const W = new Uint32Array(80);\r\n\r\nconst SHA1CircularShift = (shift, value) => ((value << shift) | (value >> (32 - shift)));\r\n\r\nclass SHA1 {\r\n digest = new Uint32Array(5);\r\n count = 0;\r\n\r\n input8(u8) {\r\n const u32 = new Uint32Array(u8.buffer, u8.byteOffset, 16);\r\n this.input(u32);\r\n }\r\n input(u32) {\r\n this.count += u32.length * 32;\r\n for (let i = 0; i < 16; ++i) {\r\n W[i] = u32[i];\r\n }\r\n for (let i = 16; i < 80; ++i) {\r\n W[i] = W[i - 16] ^ W[i - 14] ^ W[i - 8] ^ W[i - 3];\r\n }\r\n let A = this.digest[0];\r\n let B = this.digest[1];\r\n let C = this.digest[2];\r\n let D = this.digest[3];\r\n let E = this.digest[4];\r\n\r\n for (let i = 0; i < 20; i++) {\r\n const temp = SHA1CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[i] + 0x5A827999;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 20; i < 40; i++) {\r\n const temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 40; i < 60; i++) {\r\n const temp = SHA1CircularShift(5, A) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n for (let i = 60; i < 80; i++) {\r\n const temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6;\r\n E = D;\r\n D = C;\r\n C = SHA1CircularShift(30, B);\r\n B = A;\r\n A = temp | 0;\r\n }\r\n\r\n this.digest[0] += A;\r\n this.digest[1] += B;\r\n this.digest[2] += C;\r\n this.digest[3] += D;\r\n this.digest[4] += E;\r\n }\r\n\r\n constructor() {\r\n\t this.digest[0] = 0x67452301;\r\n\t this.digest[1] = 0xEFCDAB89;\r\n\t this.digest[2] = 0x98BADCFE;\r\n\t this.digest[3] = 0x10325476;\r\n this.digest[4] = 0xC3D2E1F0;\r\n \r\n this.digest8 = new Uint8Array(this.digest.buffer);\r\n }\r\n}\r\n\r\nclass Random {\r\n constructor(seed) {\r\n this.seed = seed;\r\n }\r\n next() {\r\n this.seed = (((this.seed * 3) << 16) + ((this.seed * 67) << 8) + (this.seed * 253) + 2531011) | 0;\r\n return (this.seed >> 16) & 0x7FFF;\r\n }\r\n}\r\n\r\nfunction codec_init_key(password) {\r\n const rand = new Random(0x7058);\r\n const key = new Uint8Array(136);\r\n const k32 = new Uint32Array(key.buffer);\r\n for (let i = 0; i < 136; ++i) {\r\n key[i] = rand.next();\r\n }\r\n const pw = new Uint8Array(64);\r\n for (let i = 0; i < 64; ++i) {\r\n pw[i] = password.charCodeAt(i % password.length);\r\n }\r\n\r\n let sha = new SHA1();\r\n sha.input8(pw);\r\n\r\n for (let i = 0; i < 34; ++i) {\r\n k32[i] ^= sha.digest[i % sha.digest.length];\r\n }\r\n\r\n sha = new SHA1();\r\n sha.input(k32.subarray(18));\r\n return sha;\r\n}\r\n\r\nexport default function codec_decode(data, password) {\r\n if (data.length <= 8) {\r\n return;\r\n }\r\n const size = data.length - 8;\r\n if (size % 64) {\r\n return;\r\n }\r\n\r\n if (data[size + 4]) {\r\n return;\r\n }\r\n\r\n const last_size = data[size + 5];\r\n const result_size = size + last_size - 64;\r\n const result = new Uint8Array(result_size);\r\n\r\n const sha = codec_init_key(password);\r\n const size32 = size >> 2;\r\n const data32 = new Uint32Array(data.buffer, data.byteOffset, size32 + 1);\r\n const buf32 = new Uint32Array(16);\r\n const buf = new Uint8Array(buf32.buffer);\r\n\r\n for (let i = 0; i < size32; i += 16) {\r\n for (let j = 0; j < 16; ++j) {\r\n buf32[j] = data32[i + j] ^ sha.digest[j % sha.digest.length];\r\n }\r\n sha.input(buf32);\r\n result.set(i === size32 - 16 ? buf.subarray(0, last_size) : buf, i * 4);\r\n }\r\n if (data32[size32] !== sha.digest[0]) {\r\n return;\r\n }\r\n return result;\r\n}\r\n","import { explode } from './explode';\r\nimport codec_decode from './codec';\r\n\r\nfunction pkzip_decompress(data, out_size) {\r\n if (data.length === out_size) {\r\n return data;\r\n }\r\n\r\n const output = new Uint8Array(out_size);\r\n let in_pos = 0;\r\n let out_pos = 0;\r\n function read_buf(dst) {\r\n const count = Math.min(data.length - in_pos, dst.length);\r\n dst.set(data.subarray(in_pos, count));\r\n in_pos += count;\r\n return count;\r\n }\r\n function write_buf(src) {\r\n if (out_pos + src.length > out_size) {\r\n throw Error('decompress buffer overflow');\r\n }\r\n output.set(src, out_pos);\r\n out_pos += src.length;\r\n }\r\n\r\n if (explode(read_buf, write_buf) || out_pos !== out_size) {\r\n return null;\r\n }\r\n\r\n return output;\r\n}\r\n\r\nconst hashtable = (function() {\r\n const hashtable = new Uint32Array(1280);\r\n let seed = 0x00100001;\r\n for (let i = 0; i < 256; i++) {\r\n for (let j = i; j < 1280; j += 256) {\r\n seed = (seed * 125 + 3) % 0x2AAAAB;\r\n const a = (seed & 0xFFFF) << 16;\r\n seed = (seed * 125 + 3) % 0x2AAAAB;\r\n const b = (seed & 0xFFFF);\r\n hashtable[j] = a | b;\r\n }\r\n }\r\n return hashtable;\r\n})();\r\nexport function decrypt(u32, key) {\r\n let seed = 0xEEEEEEEE;\r\n for (let i = 0; i < u32.length; ++i) {\r\n seed += hashtable[0x400 + (key & 0xFF)];\r\n u32[i] ^= seed + key;\r\n seed = (u32[i] + seed * 33 + 3) | 0;\r\n key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B);\r\n }\r\n}\r\nexport function decrypt8(u8, key) {\r\n decrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key);\r\n}\r\nexport function encrypt(u32, key) {\r\n let seed = 0xEEEEEEEE;\r\n for (let i = 0; i < u32.length; ++i) {\r\n seed += hashtable[0x400 + (key & 0xFF)];\r\n const orig = u32[i];\r\n u32[i] ^= seed + key;\r\n seed = (orig + seed * 33 + 3) | 0;\r\n key = ((~key << 0x15) + 0x11111111) | (key >>> 0x0B);\r\n }\r\n}\r\nexport function encrypt8(u8, key) {\r\n encrypt(new Uint32Array(u8.buffer, u8.byteOffset, u8.length >> 2), key);\r\n}\r\nexport function hash(name, type) {\r\n let seed1 = 0x7FED7FED;\r\n let seed2 = 0xEEEEEEEE;\r\n for (let i = 0; i < name.length; ++i) {\r\n let ch = name.charCodeAt(i);\r\n if (ch >= 0x61 && ch <= 0x7A) {\r\n ch -= 0x20;\r\n }\r\n if (ch === 0x2F) {\r\n ch = 0x5C;\r\n }\r\n seed1 = hashtable[type * 256 + ch] ^ (seed1 + seed2);\r\n seed2 = (ch + seed1 + seed2 * 33 + 3) | 0;\r\n }\r\n return seed1 >>> 0;\r\n}\r\n\r\nexport function path_name(name) {\r\n const pos = Math.max(name.lastIndexOf('/'), name.lastIndexOf('\\\\'));\r\n return name.substring(pos + 1);\r\n}\r\n\r\nconst Flags = {\r\n CompressPkWare: 0x00000100,\r\n CompressMulti: 0x00000200,\r\n Compressed: 0x0000FF00,\r\n Encrypted: 0x00010000,\r\n FixSeed: 0x00020000,\r\n PatchFile: 0x00100000,\r\n SingleUnit: 0x01000000,\r\n DummyFile: 0x02000000,\r\n SectorCrc: 0x04000000,\r\n Exists: 0x80000000,\r\n};\r\n\r\nexport class MpqReader {\r\n constructor(buffer) {\r\n this.buffer = buffer;\r\n this.u8 = new Uint8Array(buffer);\r\n this.u32 = new Uint32Array(buffer, 0, buffer.byteLength >> 2);\r\n\r\n this.readHeader();\r\n }\r\n\r\n readHeader() {\r\n const {u8, u32} = this;\r\n if (u32[0] !== 0x1A51504D) {\r\n throw Error('invalid MPQ header');\r\n }\r\n const sizeId = u8[14] + (u8[15] << 8);\r\n const hashOffset = u32[4];\r\n const blockOffset = u32[5];\r\n const hashCount = u32[6];\r\n const blockCount = u32[7];\r\n this.hashTable = this.readTable(hashOffset, hashCount, \"(hash table)\");\r\n this.blockTable = this.readTable(blockOffset, blockCount, \"(block table)\");\r\n this.blockSize = 1 << (9 + sizeId);\r\n }\r\n\r\n readTable(offset, count, key) {\r\n const buffer = new Uint32Array(this.buffer.slice(offset, offset + count * 16));\r\n decrypt(buffer, hash(key, 3));\r\n return buffer;\r\n }\r\n\r\n fileIndex(name) {\r\n const {hashTable} = this;\r\n const length = hashTable.length >> 2;\r\n const index = hash(name, 0) % length;\r\n const keyA = hash(name, 1), keyB = hash(name, 2);\r\n for (let i = index, count = 0; hashTable[i * 4 + 3] !== 0xFFFFFFFF && count < length; i = (i + 1) % length, ++count) {\r\n if (hashTable[i * 4] === keyA && hashTable[i * 4 + 1] === keyB && hashTable[i * 4 + 3] !== 0xFFFFFFFE) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n readRaw(name) {\r\n const index = this.fileIndex(name);\r\n if (index == null) {\r\n return;\r\n }\r\n const block = this.hashTable[index * 4 + 3];\r\n const info = {\r\n filePos: this.blockTable[block * 4],\r\n cmpSize: this.blockTable[block * 4 + 1],\r\n fileSize: this.blockTable[block * 4 + 2],\r\n flags: this.blockTable[block * 4 + 3],\r\n key: hash(path_name(name), 3),\r\n };\r\n if ((info.flags & Flags.PatchFile) || info.filePos + info.cmpSize > this.buffer.byteLength) {\r\n return;\r\n }\r\n if (!(info.flags & Flags.Compressed)) {\r\n info.cmpSize = info.fileSize;\r\n }\r\n if (info.flags & Flags.FixSeed) {\r\n info.key = (info.key + info.filePos) ^ info.fileSize;\r\n }\r\n return {info, data: new Uint8Array(this.buffer, info.filePos, info.cmpSize)};\r\n }\r\n\r\n read(name) {\r\n const raw = this.readRaw(name);\r\n if (!raw) {\r\n return;\r\n }\r\n let {info, data} = raw;\r\n data = data.slice();\r\n\r\n if (info.flags & Flags.SingleUnit) {\r\n if (info.flags & Flags.Encrypted) {\r\n decrypt8(data, info.key);\r\n }\r\n if (info.flags & Flags.CompressMulti) {\r\n return;\r\n } else if (info.flags & Flags.CompressPkWare) {\r\n return pkzip_decompress(data, info.fileSize);\r\n }\r\n return data;\r\n } else if (!(info.flags & Flags.Compressed)) {\r\n if (info.flags & Flags.Encrypted) {\r\n for (let i = 0; i < info.fileSize; i += this.blockSize) {\r\n decrypt8(data.subarray(i, Math.min(info.fileSize, i + this.blockSize)), info.key + i / this.blockSize);\r\n }\r\n }\r\n return data;\r\n } else {\r\n const numBlocks = Math.floor((info.fileSize + this.blockSize - 1) / this.blockSize);\r\n const tableSize = numBlocks + 1;\r\n if (data.length < tableSize * 4) {\r\n return;\r\n }\r\n const blocks = new Uint32Array(data.buffer, 0, tableSize);\r\n if (info.flags & Flags.Encrypted) {\r\n decrypt(blocks, info.key - 1);\r\n }\r\n const output = new Uint8Array(info.fileSize);\r\n for (let i = 0; i < numBlocks; ++i) {\r\n const oPos = i * this.blockSize;\r\n const uSize = Math.min(this.blockSize, info.fileSize - oPos);\r\n if (blocks[i + 1] > data.length) {\r\n return;\r\n }\r\n let tmp = data.subarray(blocks[i], blocks[i + 1]);\r\n if (info.flags & Flags.Encrypted) {\r\n // this is not safe, but our files are small enough\r\n decrypt8(tmp, info.key + i);\r\n }\r\n if (info.flags & Flags.CompressMulti) {\r\n return;\r\n } else if (info.flags & Flags.CompressPkWare) {\r\n tmp = pkzip_decompress(tmp, uSize);\r\n }\r\n if (!tmp || tmp.length !== uSize) {\r\n return;\r\n }\r\n output.set(tmp, oPos);\r\n }\r\n return output;\r\n }\r\n }\r\n}\r\n\r\nfunction getPassword(name) {\r\n if (name.match(/spawn\\d+\\.sv/i)) {\r\n return 'lshbkfg1'; // single, spawn\r\n } else if (name.match(/share_\\d+\\.sv/i)) {\r\n return 'lshbkfg1'; // multi, spawn\r\n } else if (name.match(/multi_\\d+\\.sv/i)) {\r\n return 'szqnlsk1'; // multi, retail\r\n } else {\r\n return 'xrgyrkj1'; // single, retail\r\n }\r\n}\r\n\r\nexport default function getPlayerName(data, name) {\r\n try {\r\n const reader = new MpqReader(data);\r\n const hero = codec_decode(reader.read(\"hero\"), getPassword(name));\r\n const nameEnd = hero.indexOf(0, 16);\r\n const result = {};\r\n result.name = String.fromCharCode(...hero.subarray(16, nameEnd));\r\n result.cls = hero[48];\r\n result.level = hero[53];\r\n return result;\r\n } catch (e) {\r\n return null;\r\n }\r\n}\r\n","function no_sound() {\r\n return {\r\n create_sound: () => 0,\r\n duplicate_sound: () => 0,\r\n play_sound: () => undefined,\r\n set_volume: () => undefined,\r\n stop_sound: () => undefined,\r\n delete_sound: () => undefined,\r\n };\r\n}\r\n\r\nfunction decodeAudioData(context, buffer) {\r\n return new Promise((resolve, reject) => {\r\n context.decodeAudioData(buffer, resolve, reject);\r\n });\r\n}\r\n\r\nexport default function init_sound() {\r\n const AudioContext = window.AudioContext || window.webkitAudioContext;\r\n const StereoPannerNode = window.StereoPannerNode;\r\n if (!AudioContext) {\r\n return no_sound();\r\n }\r\n\r\n let context = null;\r\n try {\r\n context = new AudioContext();\r\n } catch (e) {\r\n }\r\n const sounds = new Map();\r\n\r\n return {\r\n create_sound_raw(id, data, length, channels, rate) {\r\n if (!context) {\r\n return;\r\n }\r\n const buffer = context.createBuffer(channels, length, rate);\r\n for (let i = 0; i < channels; ++i) {\r\n buffer.getChannelData(i).set(data.subarray(i * length, i * length + length));\r\n }\r\n sounds.set(id, {\r\n buffer: Promise.resolve(buffer),\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n create_sound(id, data) {\r\n if (!context) {\r\n return;\r\n }\r\n const buffer = decodeAudioData(context, data.buffer);\r\n sounds.set(id, {\r\n buffer,\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n duplicate_sound(id, srcId) {\r\n if (!context) {\r\n return;\r\n }\r\n const src = sounds.get(srcId);\r\n if (!src) {\r\n return;\r\n }\r\n sounds.set(id, {\r\n buffer: src.buffer,\r\n gain: context.createGain(),\r\n panner: StereoPannerNode && new StereoPannerNode(context, {pan: 0}),\r\n });\r\n },\r\n play_sound(id, volume, pan, loop) {\r\n const src = sounds.get(id);\r\n if (src) {\r\n if (src.source) {\r\n src.source.then(source => source.stop());\r\n }\r\n src.gain.gain.value = Math.pow(2.0, volume / 1000.0);\r\n const relVolume = Math.pow(2.0, pan / 1000.0);\r\n if (src.panner) {\r\n src.panner.pan.value = 1.0 - 2.0 / (1.0 + relVolume);\r\n }\r\n src.source = src.buffer.then(buffer => {\r\n const source = context.createBufferSource();\r\n source.buffer = buffer;\r\n source.loop = !!loop;\r\n let node = source.connect(src.gain);\r\n if (src.panner) {\r\n node = node.connect(src.panner);\r\n }\r\n node.connect(context.destination);\r\n source.start();\r\n return source;\r\n });\r\n }\r\n },\r\n set_volume(id, volume) {\r\n const src = sounds.get(id);\r\n if (src) {\r\n src.gain.gain.value = Math.pow(2.0, volume / 1000.0);\r\n }\r\n },\r\n stop_sound(id) {\r\n const src = sounds.get(id);\r\n if (src && src.source) {\r\n src.source.then(source => source.stop());\r\n delete src.source;\r\n }\r\n },\r\n delete_sound(id) {\r\n const src = sounds.get(id);\r\n if (src && src.source) {\r\n src.source.then(source => source.stop());\r\n }\r\n sounds.delete(id);\r\n },\r\n\r\n stop_all() {\r\n for (let [, sound] of sounds) {\r\n if (sound.source) {\r\n sound.source.then(source => source.stop());\r\n }\r\n }\r\n sounds.clear();\r\n context = null;\r\n }\r\n };\r\n}\r\n","import axios from 'axios';\r\n\r\nconst SpawnSizes = [50274091, 25830791];\r\n\r\nexport { SpawnSizes };\r\n\r\nexport default async function load_spawn(api, fs) {\r\n let file = fs.files.get('spawn.mpq');\r\n if (file && !SpawnSizes.includes(file.byteLength)) {\r\n fs.files.delete('spawn.mpq');\r\n await fs.delete('spawn.mpq');\r\n file = null;\r\n }\r\n if (!file) {\r\n const spawn = await axios.request({\r\n url: process.env.PUBLIC_URL + '/spawn.mpq',\r\n responseType: 'arraybuffer',\r\n onDownloadProgress: e => {\r\n if (api.onProgress) {\r\n api.onProgress({text: 'Downloading...', loaded: e.loaded, total: e.total || SpawnSizes[1]});\r\n }\r\n },\r\n headers: {\r\n 'Cache-Control': 'max-age=31536000'\r\n }\r\n });\r\n if (!SpawnSizes.includes(spawn.data.byteLength)) {\r\n throw Error(\"Invalid spawn.mpq size. Try clearing cache and refreshing the page.\");\r\n }\r\n const data = new Uint8Array(spawn.data);\r\n fs.files.set('spawn.mpq', data);\r\n fs.update('spawn.mpq', data.slice());\r\n }\r\n return fs;\r\n}\r\n","export class buffer_reader {\r\n constructor(buffer) {\r\n this.buffer = (buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer));\r\n this.pos = 0;\r\n }\r\n done() {\r\n return this.pos === this.buffer.byteLength;\r\n }\r\n read8() {\r\n if (this.pos >= this.buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n return this.buffer[this.pos++];\r\n }\r\n read16() {\r\n const {pos, buffer} = this;\r\n if (pos + 2 > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = buffer[pos] | (buffer[pos + 1] << 8);\r\n this.pos += 2;\r\n return result;\r\n }\r\n read32() {\r\n const {pos, buffer} = this;\r\n if (pos + 4 > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = buffer[pos] | (buffer[pos + 1] << 8) | (buffer[pos + 2] << 16) | (buffer[pos + 3] << 24);\r\n this.pos += 4;\r\n return result;\r\n }\r\n read_str() {\r\n const length = this.read8();\r\n const {pos, buffer} = this;\r\n if (pos + length > buffer.byteLength) {\r\n throw Error('packet too small');\r\n }\r\n const result = String.fromCharCode(...buffer.subarray(pos, pos + length));\r\n this.pos += length;\r\n return result;\r\n }\r\n read_buf() {\r\n const size = this.read32();\r\n const result = this.buffer.subarray(this.pos, this.pos + size);\r\n this.pos += size;\r\n return result;\r\n }\r\n}\r\nexport class buffer_writer {\r\n constructor(length) {\r\n this.buffer = new Uint8Array(length);\r\n this.pos = 0;\r\n }\r\n get result() {\r\n return this.buffer.buffer;\r\n }\r\n write8(value) {\r\n this.buffer[this.pos++] = value;\r\n return this;\r\n }\r\n write16(value) {\r\n const {pos, buffer} = this;\r\n buffer[pos] = value;\r\n buffer[pos + 1] = value >> 8;\r\n this.pos += 2;\r\n return this;\r\n }\r\n write32(value) {\r\n const {pos, buffer} = this;\r\n buffer[pos] = value;\r\n buffer[pos + 1] = value >> 8;\r\n buffer[pos + 2] = value >> 16;\r\n buffer[pos + 3] = value >> 24;\r\n this.pos += 4;\r\n return this;\r\n }\r\n write_str(value) {\r\n const length = value.length;\r\n this.write8(length);\r\n const {pos, buffer} = this;\r\n for (let i = 0; i < length; ++i) {\r\n buffer[pos + i] = value.charCodeAt(i);\r\n }\r\n this.pos += length;\r\n return this;\r\n }\r\n rest(value) {\r\n this.buffer.set(value, this.pos);\r\n this.pos += value.byteLength;\r\n return this;\r\n }\r\n write_buf(value) {\r\n this.write32(value.byteLength);\r\n this.rest(value);\r\n return this;\r\n }\r\n}\r\n\r\nexport const RejectionReason = {\r\n JOIN_SUCCESS: 0x00,\r\n JOIN_ALREADY_IN_GAME: 0x01,\r\n JOIN_GAME_NOT_FOUND: 0x02,\r\n JOIN_INCORRECT_PASSWORD: 0x03,\r\n JOIN_VERSION_MISMATCH: 0x04,\r\n JOIN_GAME_FULL: 0x05,\r\n CREATE_GAME_EXISTS: 0x06,\r\n};\r\n\r\nexport function read_packet(reader, types) {\r\n const code = reader.read8();\r\n const cls = Object.values(types).find(cls => cls.code === code);\r\n if (!cls) {\r\n throw Error('invalid packet code');\r\n }\r\n return {type: cls, packet: cls.read(reader)};\r\n}\r\nexport function packet_size(type, packet) {\r\n return (typeof type.size === \"function\" ? type.size(packet) : type.size) + 1;\r\n}\r\nexport function write_packet(type, packet) {\r\n const size = packet_size(type, packet);\r\n return type.write(new buffer_writer(size).write8(type.code), packet).result;\r\n}\r\n\r\nexport function make_batch(types) {\r\n return {\r\n code: 0x00,\r\n read: reader => {\r\n const count = reader.read16();\r\n const packets = [];\r\n for (let i = 0; i < count; ++i) {\r\n packets.push(read_packet(reader, types()));\r\n }\r\n return packets;\r\n },\r\n size: packets => packets.reduce((sum, {type, packet}) => sum + packet_size(type, packet), 2),\r\n write: (writer, packets) => {\r\n writer.write16(packets.length);\r\n for (let {type, packet} of packets) {\r\n type.write(writer.write8(type.code), packet);\r\n }\r\n return writer;\r\n },\r\n };\r\n}\r\n\r\nexport const server_packet = {\r\n info: {\r\n code: 0x32,\r\n read: reader => ({version: reader.read32()}),\r\n size: 4,\r\n write: (writer, {version}) => writer.write32(version),\r\n },\r\n game_list: {\r\n code: 0x21,\r\n read: reader => {\r\n const count = reader.read16();\r\n const games = [];\r\n for (let i = 0; i < count; ++i) {\r\n games.push({type: reader.read32(), name: reader.read_str()});\r\n }\r\n return {games};\r\n },\r\n size: ({games}) => games.reduce((sum, {name}) => sum + 5 + name.length, 2),\r\n write: (writer, {games}) => {\r\n writer.write16(games.length);\r\n for (let {type, name} of games) {\r\n writer.write32(type);\r\n writer.write_str(name);\r\n }\r\n return writer;\r\n },\r\n },\r\n join_accept: {\r\n code: 0x12,\r\n read: reader => ({cookie: reader.read32(), index: reader.read8(), seed: reader.read32(), difficulty: reader.read32()}),\r\n size: 13,\r\n write: (writer, {cookie, index, seed, difficulty}) => writer.write32(cookie).write8(index).write32(seed).write32(difficulty),\r\n },\r\n join_reject: {\r\n code: 0x15,\r\n read: reader => ({cookie: reader.read32(), reason: reader.read8()}),\r\n size: 5,\r\n write: (writer, {cookie, reason}) => writer.write32(cookie).write8(reason),\r\n },\r\n connect: {\r\n code: 0x13,\r\n read: reader => ({id: reader.read8()}),\r\n size: 1,\r\n write: (writer, {id}) => writer.write8(id),\r\n },\r\n disconnect: {\r\n code: 0x14,\r\n read: reader => ({id: reader.read8(), reason: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, reason}) => writer.write8(id).write32(reason),\r\n },\r\n message: {\r\n code: 0x01,\r\n read: reader => ({id: reader.read8(), payload: reader.read_buf()}),\r\n size: ({payload}) => 5 + payload.byteLength,\r\n write: (writer, {id, payload}) => writer.write8(id).write_buf(payload),\r\n },\r\n turn: {\r\n code: 0x02,\r\n read: reader => ({id: reader.read8(), turn: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, turn}) => writer.write8(id).write32(turn),\r\n },\r\n batch: make_batch(() => server_packet),\r\n};\r\n\r\nexport const client_packet = {\r\n info: {\r\n code: 0x31,\r\n read: reader => ({version: reader.read32()}),\r\n size: 4,\r\n write: (writer, {version}) => writer.write32(version),\r\n },\r\n game_list: {\r\n code: 0x21,\r\n read: () => ({}),\r\n size: 0,\r\n write: writer => writer,\r\n },\r\n create_game: {\r\n code: 0x22,\r\n read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str(), difficulty: reader.read32()}),\r\n size: ({name, password}) => 10 + name.length + password.length,\r\n write: (writer, {cookie, name, password, difficulty}) => writer.write32(cookie).write_str(name).write_str(password).write32(difficulty),\r\n },\r\n join_game: {\r\n code: 0x23,\r\n read: reader => ({cookie: reader.read32(), name: reader.read_str(), password: reader.read_str()}),\r\n size: ({name, password}) => 6 + name.length + password.length,\r\n write: (writer, {cookie, name, password}) => writer.write32(cookie).write_str(name).write_str(password),\r\n },\r\n leave_game: {\r\n code: 0x24,\r\n read: () => ({}),\r\n size: 0,\r\n write: writer => writer,\r\n },\r\n drop_player: {\r\n code: 0x03,\r\n read: reader => ({id: reader.read8(), reason: reader.read32()}),\r\n size: 5,\r\n write: (writer, {id, reason}) => writer.write8(id).write32(reason),\r\n },\r\n message: {\r\n code: 0x01,\r\n read: reader => ({id: reader.read8(), payload: reader.read_buf()}),\r\n size: ({payload}) => 5 + payload.byteLength,\r\n write: (writer, {id, payload}) => writer.write8(id).write_buf(payload),\r\n },\r\n turn: {\r\n code: 0x02,\r\n read: reader => ({turn: reader.read32()}),\r\n size: 4,\r\n write: (writer, {turn}) => writer.write32(turn),\r\n },\r\n batch: make_batch(() => server_packet),\r\n};\r\n","import Peer from 'peerjs';\r\nimport { buffer_reader, read_packet, write_packet, client_packet, server_packet, RejectionReason } from './packet';\r\n\r\n/*function log_packet(data, type) {\r\n const reader = new buffer_reader(data);\r\n const id = reader.read8();\r\n for (let [name, {code, read}] of Object.entries(type)) {\r\n if (code === id && (name !== 'message' && name !== 'turn')) {\r\n console.log(`${type === client_packet ? 'client_packet' : 'server_packet'}.${name} ${JSON.stringify(read(reader))}`);\r\n }\r\n }\r\n}*/\r\n\r\nconst PeerID = name => `diabloweb_${name}`;\r\nconst Options = {host: 'diablo.rivsoft.net', port: 443, secure: true};\r\nconst MAX_PLRS = 4;\r\n\r\nclass webrtc_server {\r\n constructor(version, {cookie, name, password, difficulty}, onMessage, onClose) {\r\n this.version = version;\r\n this.name = name;\r\n this.password = password;\r\n this.difficulty = difficulty;\r\n this.onMessage = onMessage;\r\n this.onClose = onClose;\r\n\r\n this.peer = new Peer(PeerID(name), Options);\r\n this.peer.on('connection', conn => this.onConnect(conn));\r\n this.players = [];\r\n this.myplr = 0;\r\n\r\n this.seed = Math.floor(Math.random() * Math.pow(2, 32));\r\n\r\n const onError = () => {\r\n onMessage(write_packet(server_packet.join_reject, {cookie, reason: RejectionReason.CREATE_GAME_EXISTS}));\r\n onClose();\r\n this.peer.off('error', onError);\r\n this.peer.off('open', onOpen);\r\n };\r\n const onOpen = () => {\r\n //console.log('peer open');\r\n setTimeout(() => {\r\n onMessage(write_packet(server_packet.join_accept, {cookie, index: 0, seed: this.seed, difficulty}));\r\n onMessage(write_packet(server_packet.connect, {id: 0}));\r\n }, 0);\r\n this.peer.off('error', onError);\r\n this.peer.off('open', onOpen);\r\n };\r\n this.peer.on('error', onError);\r\n this.peer.on('open', onOpen);\r\n\r\n //this.peer.on('error', err => console.log('peer error:', err));\r\n }\r\n\r\n onConnect(conn) {\r\n //conn.on('error', err => console.log('conn error:', err));\r\n //console.log('conn open');\r\n const peer = {conn};\r\n conn.on('data', packet => {\r\n const reader = new buffer_reader(packet);\r\n const {type, packet: pkt} = read_packet(reader, client_packet);\r\n switch (type.code) {\r\n case client_packet.info.code:\r\n peer.version = pkt.version;\r\n break;\r\n case client_packet.join_game.code:\r\n if (peer.version !== this.version) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_VERSION_MISMATCH}));\r\n } else if (pkt.name !== this.name) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND}));\r\n } else if (pkt.password !== this.password) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_INCORRECT_PASSWORD}));\r\n } else {\r\n let i = 1;\r\n while (i < MAX_PLRS && this.players[i]) {\r\n ++i;\r\n }\r\n if (i >= MAX_PLRS) {\r\n conn.send(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_GAME_FULL})); \r\n } else {\r\n this.players[i] = peer;\r\n peer.id = i;\r\n conn.send(write_packet(server_packet.join_accept, {cookie: pkt.cookie, index: i, seed: this.seed, difficulty: this.difficulty}));\r\n this.send(0xFF, write_packet(server_packet.connect, {id: i}));\r\n }\r\n }\r\n break;\r\n default:\r\n if (peer.id != null) {\r\n this.handle(peer.id, type.code, pkt);\r\n } else {\r\n return;\r\n }\r\n }\r\n if (!reader.done()) {\r\n throw Error('packet too large');\r\n }\r\n });\r\n conn.on('close', () => {\r\n //console.log('conn close');\r\n if (peer.id != null) {\r\n this.drop(peer.id, 0x40000006);\r\n }\r\n });\r\n }\r\n\r\n send(mask, pkt) {\r\n for (let i = 1; i < MAX_PLRS; ++i) {\r\n if ((mask & (1 << i)) && this.players[i]) {\r\n if (this.players[i].conn) {\r\n this.players[i].conn.send(pkt);\r\n }\r\n }\r\n }\r\n // self last since it will destroy the buffer\r\n if (mask & 1) {\r\n this.onMessage(pkt);\r\n }\r\n }\r\n\r\n drop(id, reason) {\r\n if (id === 0) {\r\n for (let i = 1; i < MAX_PLRS; ++i) {\r\n this.drop(i, 0x40000006);\r\n }\r\n this.onMessage(write_packet(server_packet.disconnect, {id, reason}));\r\n this.peer.destroy();\r\n this.onClose();\r\n } else if (this.players[id]) {\r\n this.send(0xFF, write_packet(server_packet.disconnect, {id, reason}));\r\n this.players[id].id = null;\r\n if (this.players[id].conn) {\r\n this.players[id].conn.close();\r\n }\r\n this.players[id] = null;\r\n }\r\n }\r\n\r\n handle(id, code, pkt) {\r\n switch (code) {\r\n case client_packet.leave_game.code:\r\n this.drop(id, 3);\r\n break;\r\n case client_packet.drop_player.code:\r\n this.drop(pkt.id, pkt.reason);\r\n break;\r\n case client_packet.message.code:\r\n this.send(pkt.id === 0xFF ? ~(1 << id) : (1 << pkt.id), write_packet(server_packet.message, {id, payload: pkt.payload}));\r\n break;\r\n case client_packet.turn.code:\r\n this.send(~(1 << id), write_packet(server_packet.turn, {id, turn: pkt.turn}));\r\n break;\r\n default:\r\n throw Error(`invalid packet ${code}`);\r\n }\r\n }\r\n}\r\n\r\nclass webrtc_client {\r\n pending = [];\r\n\r\n constructor(version, {cookie, name, password}, onMessage, onClose) {\r\n this.peer = new Peer(Options);\r\n this.conn = this.peer.connect(PeerID(name));\r\n\r\n let needUnreg = true;\r\n const unreg = () => {\r\n if (!needUnreg) {\r\n return;\r\n }\r\n needUnreg = false;\r\n this.peer.off('error', onError);\r\n this.conn.off('error', onError);\r\n this.conn.off('open', onOpen);\r\n clearTimeout(timeout);\r\n };\r\n const onError = () => {\r\n onMessage(write_packet(server_packet.join_reject, {cookie, reason: RejectionReason.JOIN_GAME_NOT_FOUND}));\r\n onClose();\r\n unreg();\r\n };\r\n const onOpen = () => {\r\n this.conn.send(write_packet(client_packet.info, {version}));\r\n this.conn.send(write_packet(client_packet.join_game, {cookie, name, password}));\r\n for (let pkt of this.pending) {\r\n this.conn.send(pkt);\r\n }\r\n this.pending = null;\r\n this.conn.off('open', onOpen);\r\n };\r\n const timeout = setTimeout(onError, 10000);\r\n this.peer.on('error', onError);\r\n this.conn.on('error', onError);\r\n this.conn.on('open', onOpen);\r\n\r\n //this.peer.on('error', err => console.log('peer error:', err));\r\n //this.conn.on('error', err => console.log('conn error:', err));\r\n\r\n this.conn.on('data', data => {\r\n unreg();\r\n const reader = new buffer_reader(data);\r\n const {type, packet: pkt} = read_packet(reader, server_packet);\r\n switch (type.code) {\r\n case server_packet.join_accept.code:\r\n this.myplr = pkt.index;\r\n break;\r\n case server_packet.join_reject.code:\r\n onClose();\r\n break;\r\n case server_packet.disconnect.code:\r\n if (pkt.id === 'myplr') {\r\n onClose();\r\n }\r\n break;\r\n default:\r\n }\r\n onMessage(data);\r\n });\r\n this.conn.on('close', data => {\r\n onClose();\r\n });\r\n }\r\n\r\n send(packet) {\r\n if (this.pending) {\r\n this.pending.push(packet);\r\n } else {\r\n this.conn.send(packet);\r\n }\r\n }\r\n}\r\n\r\nexport default function webrtc_open(onMessage) {\r\n let server = null, client = null;\r\n\r\n let version = 0;\r\n\r\n /*const prevMessage = onMessage;\r\n onMessage = data => {\r\n log_packet(data, server_packet);\r\n prevMessage(data);\r\n };*/\r\n\r\n return {\r\n send: function(packet) {\r\n //log_packet(packet, client_packet);\r\n const reader = new buffer_reader(packet);\r\n const {type, packet: pkt} = read_packet(reader, client_packet);\r\n switch (type.code) {\r\n case client_packet.info.code:\r\n version = pkt.version;\r\n break;\r\n case client_packet.create_game.code:\r\n if (server || client) {\r\n onMessage(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME}));\r\n } else {\r\n server = new webrtc_server(version, pkt, onMessage, () => server = null);\r\n }\r\n break;\r\n case client_packet.join_game.code:\r\n if (server || client) {\r\n onMessage(write_packet(server_packet.join_reject, {cookie: pkt.cookie, reason: RejectionReason.JOIN_ALREADY_IN_GAME}));\r\n } else {\r\n client = new webrtc_client(version, pkt, onMessage, () => client = null);\r\n }\r\n break;\r\n default:\r\n if (server) {\r\n server.handle(0, type.code, pkt);\r\n if (type.code === client_packet.leave_game.code) {\r\n server = null;\r\n }\r\n } else if (client) {\r\n client.send(packet);\r\n if (type.code === client_packet.leave_game.code) {\r\n client = null;\r\n }\r\n return;\r\n } else if (type.code !== client_packet.leave_game.code) {\r\n throw Error(`invalid packet ${type.code}`);\r\n }\r\n }\r\n if (!reader.done()) {\r\n throw Error('packet too large');\r\n }\r\n },\r\n };\r\n}\r\n","import Worker from './game.worker.js';\r\nimport init_sound from './sound';\r\nimport load_spawn from './load_spawn';\r\nimport webrtc_open from './webrtc';\r\n\r\nfunction onRender(api, ctx, {bitmap, images, text, clip, belt}) {\r\n if (bitmap) {\r\n ctx.transferFromImageBitmap(bitmap);\r\n } else {\r\n for (let {x, y, w, h, data} of images) {\r\n const image = ctx.createImageData(w, h);\r\n image.data.set(data);\r\n ctx.putImageData(image, x, y);\r\n }\r\n if (text.length) {\r\n ctx.save();\r\n ctx.font = 'bold 13px Times New Roman';\r\n if (clip) {\r\n const {x0, y0, x1, y1} = clip;\r\n ctx.beginPath();\r\n ctx.rect(x0, y0, x1 - x0, y1 - y0);\r\n ctx.clip();\r\n }\r\n for (let {x, y, text: str, color} of text) {\r\n const r = ((color >> 16) & 0xFF);\r\n const g = ((color >> 8) & 0xFF);\r\n const b = (color & 0xFF);\r\n ctx.fillStyle = `rgb(${r}, ${g}, ${b})`;\r\n ctx.fillText(str, x, y + 22);\r\n }\r\n ctx.restore();\r\n }\r\n }\r\n\r\n api.updateBelt(belt);\r\n}\r\n\r\nfunction testOffscreen() {\r\n return false;\r\n // This works but I couldn't see any performance difference, and support for 2D canvas in workers is very poor.\r\n // In this mode, instead of sending a batch of areas to draw back to the main thread, the worker does all drawing on its own and sends a complete bitmap object back.\r\n // However, this effectively clears the worker's canvas, so we need to redraw the whole frame every time, which defeats the performance gained from reduced copying.\r\n /*try {\r\n const canvas = document.createElement(\"canvas\");\r\n const offscreen = canvas.transferControlToOffscreen();\r\n const context = offscreen.getContext(\"2d\");\r\n return context != null;\r\n } catch (e) {\r\n return false;\r\n }*/\r\n}\r\n\r\nasync function do_load_game(api, audio, mpq, spawn) {\r\n const fs = await api.fs;\r\n if (spawn && !mpq) {\r\n await load_spawn(api, fs);\r\n }\r\n\r\n let context = null, offscreen = false;\r\n if (testOffscreen()) {\r\n context = api.canvas.getContext(\"bitmaprenderer\");\r\n offscreen = true;\r\n } else {\r\n context = api.canvas.getContext(\"2d\", {alpha: false});\r\n }\r\n return await new Promise((resolve, reject) => {\r\n try {\r\n const worker = new Worker();\r\n\r\n let packetQueue = [];\r\n const webrtc = webrtc_open(data => {\r\n packetQueue.push(data);\r\n });\r\n\r\n worker.addEventListener(\"message\", ({data}) => {\r\n switch (data.action) {\r\n case \"loaded\":\r\n resolve((func, ...params) => worker.postMessage({action: \"event\", func, params}));\r\n break;\r\n case \"render\":\r\n onRender(api, context, data.batch);\r\n break;\r\n case \"audio\":\r\n audio[data.func](...data.params);\r\n break;\r\n case \"audioBatch\":\r\n for (let {func, params} of data.batch) {\r\n audio[func](...params);\r\n }\r\n break;\r\n case \"fs\":\r\n fs[data.func](...data.params);\r\n break;\r\n case \"cursor\":\r\n api.setCursorPos(data.x, data.y);\r\n break;\r\n case \"keyboard\":\r\n api.openKeyboard(data.rect);\r\n break;\r\n case \"error\":\r\n audio.stop_all();\r\n api.onError(data.error, data.stack);\r\n break;\r\n case \"failed\":\r\n reject({message: data.error, stack: data.stack});\r\n break;\r\n case \"progress\":\r\n api.onProgress({text: data.text, loaded: data.loaded, total: data.total});\r\n break;\r\n case \"exit\":\r\n api.onExit();\r\n break;\r\n case \"current_save\":\r\n api.setCurrentSave(data.name);\r\n break;\r\n case \"packet\":\r\n webrtc.send(data.buffer);\r\n break;\r\n case \"packetBatch\":\r\n for (let packet of data.batch) {\r\n webrtc.send(packet);\r\n }\r\n break;\r\n default:\r\n }\r\n }); \r\n const transfer= [];\r\n for (let [, file] of fs.files) {\r\n transfer.push(file.buffer);\r\n }\r\n worker.postMessage({action: \"init\", files: fs.files, mpq, spawn, offscreen}, transfer);\r\n setInterval(() => {\r\n if (packetQueue.length) {\r\n worker.postMessage({action: \"packetBatch\", batch: packetQueue}, packetQueue);\r\n packetQueue.length = 0;\r\n }\r\n }, 20);\r\n delete fs.files;\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\nexport default function load_game(api, mpq, spawn) {\r\n const audio = init_sound();\r\n return do_load_game(api, audio, mpq, spawn);\r\n}\r\n","import Worker from './mpqcmp.worker.js';\r\nimport MpqBinary from './MpqCmp.wasm';\r\nimport ListFile from './ListFile.txt';\r\nimport axios from 'axios';\r\n\r\nimport { decrypt, encrypt, hash, path_name } from '../api/savefile';\r\n\r\nconst MpqSize = 156977;\r\nconst ListSize = 75542;\r\n\r\nconst readFile = (file, progress) => new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n if (progress) {\r\n progress({loaded: file.size});\r\n }\r\n resolve(reader.result);\r\n };\r\n reader.onerror = () => reject(reader.error);\r\n reader.onabort = () => reject();\r\n if (progress) {\r\n reader.addEventListener(\"progress\", progress);\r\n }\r\n reader.readAsArrayBuffer(file);\r\n});\r\n\r\nasync function loadFile(url, progress, responseType='arraybuffer') {\r\n const binary = await axios.request({\r\n url,\r\n responseType,\r\n onDownloadProgress: progress,\r\n });\r\n return binary.data;\r\n}\r\n\r\nfunction runWorker(data, transfer, progress) {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const worker = new Worker();\r\n worker.addEventListener(\"message\", ({data}) => {\r\n switch (data.action) {\r\n case \"result\":\r\n resolve({buffer: data.buffer, blocks: data.blocks});\r\n break;\r\n case \"error\":\r\n reject({message: data.error, stack: data.stack});\r\n break;\r\n case \"progress\":\r\n progress(data.value);\r\n break;\r\n default:\r\n }\r\n });\r\n worker.postMessage({action: \"run\", ...data}, transfer);\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n}\r\n\r\nexport default async function compress(mpq, progress) {\r\n progress(\"Loading...\");\r\n const files = [];\r\n function updateProgress() {\r\n progress(\"Loading...\", files.reduce((sum, {loaded, weight}) => sum + loaded * weight, 0),\r\n files.reduce((sum, {total, weight}) => sum + total * weight, 0));\r\n }\r\n const loader = file => e => { file.loaded = e.loaded; updateProgress(); };\r\n\r\n const mpqsize = mpq.size;\r\n\r\n const fHeader = {loaded: 0, weight: 1, total: mpqsize};\r\n fHeader.ready = readFile(mpq.slice(0, 32), loader(fHeader));\r\n files.push(fHeader);\r\n\r\n const fBinary = {loaded: 0, weight: 5, total: MpqSize};\r\n fBinary.ready = loadFile(MpqBinary, loader(fBinary));\r\n files.push(fBinary);\r\n\r\n const fList = {loaded: 0, weight: 5, total: ListSize};\r\n fList.ready = loadFile(ListFile, loader(fList), 'text');\r\n files.push(fList);\r\n\r\n const header = new Uint32Array(await fHeader.ready);\r\n const header16 = new Uint16Array(header.buffer);\r\n\r\n if (header[0] !== 0x1A51504D) {\r\n throw Error('invalid MPQ file');\r\n }\r\n\r\n const blockSize = 1 << (9 + header16[7]);\r\n const hashTablePos = header[4];\r\n const blockTablePos = header[5];\r\n const hashTableSize = header[6];\r\n const blockTableSize = header[7];\r\n if (hashTablePos + hashTableSize * 16 > mpqsize || blockTablePos + blockTableSize * 16 > mpqsize) {\r\n throw Error('invalid MPQ file');\r\n }\r\n\r\n const fHashTable = {loaded: 0, weight: 1, total: hashTableSize * 16};\r\n const fBlockTable = {loaded: 0, weight: 1, total: blockTableSize * 16};\r\n fHeader.total -= fHashTable.total + fBlockTable.total;\r\n fHashTable.ready = readFile(mpq.slice(hashTablePos, hashTablePos + fHashTable.total), loader(fHashTable));\r\n fBlockTable.ready = readFile(mpq.slice(blockTablePos, blockTablePos + fBlockTable.total), loader(fBlockTable));\r\n files.push(fHashTable, fBlockTable);\r\n\r\n const hashTable = new Uint32Array(await fHashTable.ready);\r\n const blockTable = new Uint32Array(await fBlockTable.ready);\r\n decrypt(hashTable, hash(\"(hash table)\", 3));\r\n decrypt(blockTable, hash(\"(block table)\", 3));\r\n\r\n const list = (await fList.ready).split(\"\\n\").map(name => name.trim()).filter(name => name.length);\r\n const listMap = {};\r\n const hashStr = (h1, h2) => h1.toString(16).padStart(8, '0') + h2.toString(16).padStart(8, '0');\r\n for (let name of list) {\r\n listMap[hashStr(hash(name, 1), hash(name, 2))] = name;\r\n }\r\n\r\n const NUM_TASKS = 4;\r\n const tasks = [];\r\n for (let i = 0; i < NUM_TASKS; ++i) {\r\n tasks.push({\r\n entries: [],\r\n min: mpqsize,\r\n max: 0,\r\n progress: 0,\r\n });\r\n }\r\n \r\n for (let i = 0; i < hashTable.length / 4; ++i) {\r\n const index = hashTable[i * 4 + 3];\r\n if (index === 0xFFFFFFFF || index === 0xFFFFFFFE) {\r\n continue;\r\n }\r\n const name = listMap[hashStr(hashTable[i * 4], hashTable[i * 4 + 1])];\r\n if (!name) {\r\n hashTable[i * 4 + 3] = 0xFFFFFFFE;\r\n continue;\r\n }\r\n\r\n const filePos = blockTable[index * 4];\r\n const cSize = blockTable[index * 4 + 1];\r\n\r\n const task = tasks[Math.floor(filePos * NUM_TASKS / mpqsize)];\r\n task.entries.push(i);\r\n task.min = Math.min(task.min, filePos);\r\n task.max = Math.max(task.max, filePos + cSize);\r\n }\r\n\r\n const numFiles = tasks.reduce((sum, task) => sum + task.entries.length, 0);\r\n\r\n fHeader.total = 32;\r\n for (let task of tasks) {\r\n if (task.min < task.max) {\r\n const fLoad = {loaded: 0, weight: 1, total: task.max - task.min};\r\n task.ready = readFile(mpq.slice(task.min, task.max), loader(fLoad)).then(data => task.data = data);\r\n files.push(fLoad);\r\n }\r\n }\r\n\r\n await Promise.all(tasks.map(t => t.ready).filter(Boolean));\r\n const binary = await fBinary.ready;\r\n\r\n progress(\"Processing...\");\r\n\r\n for (let task of tasks) {\r\n if (task.data) {\r\n const input = new Uint32Array(task.entries.length * 6);\r\n task.entries.forEach((i, pos) => {\r\n const index = hashTable[i * 4 + 3];\r\n const name = listMap[hashStr(hashTable[i * 4], hashTable[i * 4 + 1])];\r\n input[pos * 6] = blockTable[index * 4];\r\n input[pos * 6 + 1] = blockTable[index * 4 + 1];\r\n input[pos * 6 + 2] = blockTable[index * 4 + 2];\r\n input[pos * 6 + 3] = blockTable[index * 4 + 3];\r\n input[pos * 6 + 4] = hash(path_name(name), 3);\r\n input[pos * 6 + 5] = name.match(/\\.wav$/i) ? 1 : 0;\r\n });\r\n task.run = runWorker({binary, mpq: task.data, input, offset: task.min, blockSize}, [task.data, input.buffer], value => {\r\n task.progress = value;\r\n const sum = tasks.reduce((sum, task) => sum + task.progress, 0);\r\n progress(\"Processing...\", sum, numFiles);\r\n }).then(res => task.result = res);\r\n }\r\n }\r\n\r\n await Promise.all(tasks.map(t => t.run).filter(Boolean));\r\n\r\n let outputPos = 32 + fHashTable.total + fBlockTable.total;\r\n const outputSize = tasks.reduce((sum, {result}) => sum + (result ? result.buffer.byteLength : 0), outputPos);\r\n const output = [header.buffer, hashTable.buffer, blockTable.buffer];\r\n\r\n blockTable.fill(0);\r\n let blockPos = 0;\r\n for (let task of tasks) {\r\n if (task.result) {\r\n const {buffer, blocks} = task.result;\r\n for (let pos = 0; pos < task.entries.length; ++pos) {\r\n const i = task.entries[pos];\r\n hashTable[i * 4 + 3] = blockPos + pos;\r\n blocks[pos * 4] += outputPos;\r\n }\r\n blockTable.set(blocks, blockPos * 4);\r\n blockPos += task.entries.length;\r\n output.push(buffer);\r\n outputPos += buffer.byteLength;\r\n }\r\n }\r\n\r\n header[1] = 32;\r\n header[2] = outputSize;\r\n header16[6] = 1;\r\n header16[7] = 7;\r\n header[4] = 32;\r\n header[5] = 32 + hashTable.length * 4;\r\n header[6] = hashTable.length / 4;\r\n header[7] = blockTable.length / 4;\r\n\r\n encrypt(hashTable, hash(\"(hash table)\", 3));\r\n encrypt(blockTable, hash(\"(block table)\", 3));\r\n\r\n return new Blob(output, {type: 'binary/octet-stream'});\r\n}\r\n","import React from 'react';\r\nimport compress from './compress';\r\n\r\nexport default class CompressMpq extends React.Component {\r\n state = {};\r\n\r\n parseFile = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n onProgress(progress) {\r\n this.setState({progress});\r\n }\r\n onDone = blob => {\r\n //const blob = new Blob([result], {type: 'binary/octet-stream'});\r\n const url = URL.createObjectURL(blob);\r\n this.setState({url});\r\n\r\n const lnk = document.createElement('a');\r\n lnk.setAttribute('href', url);\r\n lnk.setAttribute('download', 'DIABDAT.MPQ');\r\n document.body.appendChild(lnk);\r\n lnk.click();\r\n document.body.removeChild(lnk);\r\n }\r\n onError(message, stack) {\r\n const { api } = this.props;\r\n api.setState({compress: false});\r\n api.onError(message, stack);\r\n }\r\n\r\n onClose = () => {\r\n if (this.state.url) {\r\n URL.revokeObjectURL(this.state.url);\r\n }\r\n this.props.api.setState({compress: false});\r\n }\r\n\r\n start(file) {\r\n this.setState({started: true});\r\n compress(file, (text, loaded, total) => this.onProgress({text, loaded, total}))\r\n .then(this.onDone, e => this.onError(e.message, e.stack));\r\n }\r\n\r\n render() {\r\n const { url, started, progress } = this.state;\r\n if (url) {\r\n return (\r\n
\r\n

\r\n Click here if download doesn't start.\r\n

\r\n
Back
\r\n
\r\n );\r\n }\r\n if (started) {\r\n return (\r\n
\r\n {(progress && progress.text) || 'Processing...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n );\r\n }\r\n return (\r\n
\r\n

\r\n You can use this tool to reduce the original MPQ to about half its size. It encodes sounds in MP3 format and uses better compression for regular files.\r\n To begin, click the button below or drop the MPQ onto the page.\r\n

\r\n
\r\n \r\n \r\n
\r\n
Back
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport './App.scss';\r\nimport classNames from 'classnames';\r\nimport ReactGA from 'react-ga';\r\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\nimport { faTimes, faDownload } from '@fortawesome/free-solid-svg-icons';\r\nimport getPlayerName from './api/savefile';\r\n\r\nimport { mapStackTrace } from 'sourcemapped-stacktrace';\r\n\r\nimport create_fs from './fs';\r\nimport load_game from './api/loader';\r\nimport { SpawnSizes } from './api/load_spawn';\r\nimport CompressMpq from './mpqcmp';\r\n\r\nimport Peer from 'peerjs';\r\n\r\nwindow.Peer = Peer;\r\n\r\nif (process.env.NODE_ENV === 'production') {\r\n ReactGA.initialize('UA-43123589-6');\r\n ReactGA.pageview('/');\r\n}\r\n\r\nfunction reportLink(e, retail) {\r\n const message = (e.message || \"Unknown error\") + (e.stack ? \"\\n\" + e.stack : \"\");\r\n const url = new URL(\"https://github.com/d07RiV/diabloweb/issues/new\");\r\n url.searchParams.set(\"body\",\r\n`**Description:**\r\n[Please describe what you were doing before the error occurred]\r\n\r\n**App version:**\r\nDiabloWeb ${process.env.VERSION} (${retail ? 'Retail' : 'Shareware'})\r\n\r\n**Error message:**\r\n \r\n${message.split(\"\\n\").map(line => \" \" + line).join(\"\\n\")}\r\n\r\n**User agent:**\r\n\r\n ${navigator.userAgent}\r\n\r\n**Save file:**\r\n[Please attach the save file, if applicable. The error box should have a link to download the current save you were playing; alternatively, you can open dev console on the game page (F12) and type in ${\"`DownloadSaves()`\"}]\r\n`);\r\n return url.toString();\r\n}\r\n\r\nfunction isDropFile(e) {\r\n if (e.dataTransfer.items) {\r\n for (let i = 0; i < e.dataTransfer.items.length; ++i) {\r\n if (e.dataTransfer.items[i].kind === \"file\") {\r\n return true;\r\n }\r\n }\r\n } if (e.dataTransfer.files.length) {\r\n return true;\r\n }\r\n return false;\r\n}\r\nfunction getDropFile(e) {\r\n if (e.dataTransfer.items) {\r\n for (let i = 0; i < e.dataTransfer.items.length; ++i) {\r\n if (e.dataTransfer.items[i].kind === \"file\") {\r\n return e.dataTransfer.items[i].getAsFile();\r\n }\r\n }\r\n } if (e.dataTransfer.files.length) {\r\n return e.dataTransfer.files[0];\r\n }\r\n}\r\n\r\nconst TOUCH_MOVE = 0;\r\nconst TOUCH_RMB = 1;\r\nconst TOUCH_SHIFT = 2;\r\n\r\nfunction findKeyboardRule() {\r\n for (let sheet of document.styleSheets) {\r\n for (let rule of sheet.cssRules) {\r\n if (rule.type === CSSRule.MEDIA_RULE && rule.conditionText === '(min-aspect-ratio: 3/1)') {\r\n for (let sub of rule.cssRules) {\r\n if (sub.selectorText === '.App.keyboard .Body .inner') {\r\n return sub;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\nlet keyboardRule = null;\r\ntry {\r\n keyboardRule = findKeyboardRule();\r\n} catch (e) {\r\n}\r\n\r\nconst Link = ({children, ...props}) => {children};\r\n\r\nclass App extends React.Component {\r\n files = new Map();\r\n state = {started: false, loading: false, dropping: 0, has_spawn: false};\r\n cursorPos = {x: 0, y: 0};\r\n\r\n touchControls = false;\r\n touchButtons = [null, null, null, null, null, null];\r\n touchCtx = [null, null, null, null, null, null];\r\n touchMods = [false, false, false, false, false, false];\r\n touchBelt = [-1, -1, -1, -1, -1, -1];\r\n maxKeyboard = 0;\r\n\r\n fs = create_fs(true);\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.setTouch0 = this.setTouch_.bind(this, 0);\r\n this.setTouch1 = this.setTouch_.bind(this, 1);\r\n this.setTouch2 = this.setTouch_.bind(this, 2);\r\n this.setTouch3 = this.setTouchBelt_.bind(this, 3);\r\n this.setTouch4 = this.setTouchBelt_.bind(this, 4);\r\n this.setTouch5 = this.setTouchBelt_.bind(this, 5);\r\n }\r\n\r\n componentDidMount() {\r\n document.addEventListener(\"drop\", this.onDrop, true);\r\n document.addEventListener(\"dragover\", this.onDragOver, true);\r\n document.addEventListener(\"dragenter\", this.onDragEnter, true);\r\n document.addEventListener(\"dragleave\", this.onDragLeave, true);\r\n\r\n this.fs.then(fs => {\r\n const spawn = fs.files.get('spawn.mpq');\r\n if (spawn && SpawnSizes.includes(spawn.byteLength)) {\r\n this.setState({has_spawn: true});\r\n }\r\n if ([...fs.files.keys()].filter(name => name.match(/\\.sv$/i)).length) {\r\n this.setState({save_names: true});\r\n }\r\n });\r\n }\r\n\r\n onDrop = e => {\r\n const file = getDropFile(e);\r\n if (file) {\r\n e.preventDefault();\r\n if (this.compressMpq) {\r\n this.compressMpq.start(file);\r\n } else {\r\n this.start(file);\r\n }\r\n }\r\n this.setState({dropping: 0});\r\n }\r\n onDragEnter = e => {\r\n e.preventDefault();\r\n this.setDropping(1);\r\n }\r\n onDragOver = e => {\r\n if (isDropFile(e)) {\r\n e.preventDefault();\r\n }\r\n }\r\n onDragLeave = e => {\r\n this.setDropping(-1);\r\n }\r\n setDropping(inc) {\r\n this.setState(({dropping}) => ({dropping: Math.max(dropping + inc, 0)}));\r\n }\r\n\r\n onError(message, stack) {\r\n (async () => {\r\n const errorObject = {message};\r\n if (this.saveName) {\r\n errorObject.save = await (await this.fs).fileUrl(this.saveName);\r\n }\r\n if (stack) {\r\n mapStackTrace(stack, stack => {\r\n this.setState(({error}) => !error && {error: {...errorObject, stack: stack.join(\"\\n\")}});\r\n });\r\n } else {\r\n this.setState(({error}) => !error && {error: errorObject});\r\n }\r\n })();\r\n }\r\n\r\n openKeyboard(rect) {\r\n if (rect) {\r\n this.showKeyboard = {\r\n left: `${(100 * (rect[0] - 10) / 640).toFixed(2)}%`,\r\n top: `${(100 * (rect[1] - 10) / 480).toFixed(2)}%`,\r\n width: `${(100 * (rect[2] - rect[0] + 20) / 640).toFixed(2)}%`,\r\n height: `${(100 * (rect[3] - rect[1] + 20) / 640).toFixed(2)}%`,\r\n };\r\n this.maxKeyboard = rect[4];\r\n this.element.classList.add(\"keyboard\");\r\n Object.assign(this.keyboard.style, this.showKeyboard);\r\n this.keyboard.focus();\r\n if (keyboardRule) {\r\n keyboardRule.style.transform = `translate(-50%, ${(-(rect[1] + rect[3]) * 56.25 / 960).toFixed(2)}vw)`;\r\n }\r\n } else {\r\n this.showKeyboard = false;\r\n this.element.classList.remove(\"keyboard\");\r\n this.keyboard.blur();\r\n this.keyboard.value = \"\";\r\n this.keyboardNum = 0;\r\n }\r\n }\r\n\r\n setCursorPos(x, y) {\r\n const rect = this.canvas.getBoundingClientRect();\r\n this.cursorPos = {\r\n x: rect.left + (rect.right - rect.left) * x / 640,\r\n y: rect.top + (rect.bottom - rect.top) * y / 480,\r\n };\r\n setTimeout(() => {\r\n this.game(\"DApi_Mouse\", 0, 0, 0, x, y);\r\n });\r\n }\r\n\r\n onProgress(progress) {\r\n this.setState({progress});\r\n }\r\n\r\n onExit() {\r\n if (!this.state.error) {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n setCurrentSave(name) {\r\n this.saveName = name;\r\n }\r\n\r\n showSaves = () => {\r\n if (this.state.save_names === true) {\r\n this.updateSaves().then(() => this.setState({show_saves: !this.state.show_saves}));\r\n } else {\r\n this.setState({show_saves: !this.state.show_saves});\r\n }\r\n }\r\n updateSaves() {\r\n return this.fs.then(fs => {\r\n const saves = {};\r\n [...fs.files.keys()].filter(name => name.match(/\\.sv$/i)).forEach(name => {\r\n saves[name] = getPlayerName(fs.files.get(name).buffer, name);\r\n });\r\n this.setState({save_names: saves});\r\n });\r\n }\r\n removeSave(name) {\r\n if (window.confirm(`Are you sure you want to delete ${name}?`)) {\r\n (async () => {\r\n const fs = await this.fs;\r\n await fs.delete(name.toLowerCase());\r\n fs.files.delete(name.toLowerCase());\r\n this.updateSaves();\r\n })();\r\n }\r\n }\r\n downloadSave(name) {\r\n this.fs.then(fs => fs.download(name));\r\n }\r\n\r\n drawBelt(idx, slot) {\r\n if (!this.canvas) return;\r\n if (!this.touchButtons[idx]) {\r\n return;\r\n }\r\n this.touchBelt[idx] = slot;\r\n if (slot >= 0) {\r\n this.touchButtons[idx].style.display = \"block\";\r\n this.touchCtx[idx].drawImage(this.canvas, 205 + 29 * slot, 357, 28, 28, 0, 0, 28, 28);\r\n } else {\r\n this.touchButtons[idx].style.display = \"none\";\r\n }\r\n }\r\n\r\n updateBelt(belt) {\r\n if (belt) {\r\n const used = new Set();\r\n let pos = 3;\r\n for (let i = 0; i < belt.length && pos < 6; ++i) {\r\n if (belt[i] >= 0 && !used.has(belt[i])) {\r\n this.drawBelt(pos++, i);\r\n used.add(belt[i]);\r\n }\r\n }\r\n for (; pos < 6; ++pos) {\r\n this.drawBelt(pos, -1);\r\n }\r\n } else {\r\n this.drawBelt(3, -1);\r\n this.drawBelt(4, -1);\r\n this.drawBelt(5, -1);\r\n }\r\n }\r\n\r\n start(file) {\r\n if (file && file.name.match(/\\.sv$/i)) {\r\n this.fs.then(fs => fs.upload(file)).then(() => {\r\n this.updateSaves();\r\n });\r\n return;\r\n }\r\n if (this.state.show_saves) {\r\n return;\r\n }\r\n if (file && !file.name.match(/\\.mpq$/i)) {\r\n window.alert('Please select an MPQ file. If you downloaded the installer from GoG, you will need to install it on PC and use the MPQ file from the installation folder.');\r\n return;\r\n }\r\n\r\n document.removeEventListener(\"drop\", this.onDrop, true);\r\n document.removeEventListener(\"dragover\", this.onDragOver, true);\r\n document.removeEventListener(\"dragenter\", this.onDragEnter, true);\r\n document.removeEventListener(\"dragleave\", this.onDragLeave, true);\r\n this.setState({dropping: 0});\r\n\r\n const retail = !!(file && !file.name.match(/^spawn\\.mpq$/i));\r\n if (process.env.NODE_ENV === 'production') {\r\n ReactGA.event({\r\n category: 'Game',\r\n action: retail ? 'Start Retail' : 'Start Shareware',\r\n });\r\n }\r\n\r\n this.setState({loading: true, retail});\r\n\r\n load_game(this, file, !retail).then(game => {\r\n this.game = game;\r\n\r\n document.addEventListener('mousemove', this.onMouseMove, true);\r\n document.addEventListener('mousedown', this.onMouseDown, true);\r\n document.addEventListener('mouseup', this.onMouseUp, true);\r\n document.addEventListener('keydown', this.onKeyDown, true);\r\n document.addEventListener('keyup', this.onKeyUp, true);\r\n document.addEventListener('contextmenu', this.onMenu, true);\r\n\r\n document.addEventListener('touchstart', this.onTouchStart, {passive: false, capture: true});\r\n document.addEventListener('touchmove', this.onTouchMove, {passive: false, capture: true});\r\n document.addEventListener('touchend', this.onTouchEnd, {passive: false, capture: true});\r\n\r\n document.addEventListener('pointerlockchange', this.onPointerLockChange);\r\n window.addEventListener('resize', this.onResize);\r\n\r\n this.setState({started: true});\r\n }, e => this.onError(e.message, e.stack));\r\n }\r\n\r\n pointerLocked() {\r\n return document.pointerLockElement === this.canvas || document.mozPointerLockElement === this.canvas;\r\n }\r\n\r\n mousePos(e) {\r\n const rect = this.canvas.getBoundingClientRect();\r\n if (this.pointerLocked()) {\r\n this.cursorPos.x = Math.max(rect.left, Math.min(rect.right, this.cursorPos.x + e.movementX));\r\n this.cursorPos.y = Math.max(rect.top, Math.min(rect.bottom, this.cursorPos.y + e.movementY));\r\n } else {\r\n this.cursorPos = {x: e.clientX, y: e.clientY};\r\n }\r\n return {\r\n x: Math.max(0, Math.min(Math.round((this.cursorPos.x - rect.left) / (rect.right - rect.left) * 640), 639)),\r\n y: Math.max(0, Math.min(Math.round((this.cursorPos.y - rect.top) / (rect.bottom - rect.top) * 480), 479)),\r\n };\r\n }\r\n\r\n mouseButton(e) {\r\n switch (e.button) {\r\n case 0: return 1;\r\n case 1: return 4;\r\n case 2: return 2;\r\n case 3: return 5;\r\n case 4: return 6;\r\n default: return 1;\r\n }\r\n }\r\n eventMods(e) {\r\n return ((e.shiftKey || this.touchMods[TOUCH_SHIFT]) ? 1 : 0) + (e.ctrlKey ? 2 : 0) + (e.altKey ? 4 : 0) + (e.touches ? 8 : 0);\r\n }\r\n\r\n onResize = () => {\r\n document.exitPointerLock();\r\n }\r\n\r\n onPointerLockChange = () => {\r\n if (window.screen && window.innerHeight === window.screen.height && !this.pointerLocked()) {\r\n // assume that the user pressed escape\r\n this.game(\"DApi_Key\", 0, 0, 27);\r\n this.game(\"DApi_Key\", 1, 0, 27);\r\n }\r\n }\r\n\r\n onMouseMove = e => {\r\n if (!this.canvas) return;\r\n const {x, y} = this.mousePos(e);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n e.preventDefault();\r\n }\r\n\r\n onMouseDown = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n }\r\n if (this.touchControls) {\r\n this.touchControls = false;\r\n this.element.classList.remove(\"touch\");\r\n }\r\n const {x, y} = this.mousePos(e);\r\n if (window.screen && window.innerHeight === window.screen.height) {\r\n // we're in fullscreen, let's get pointer lock!\r\n if (!this.pointerLocked()) {\r\n this.canvas.requestPointerLock();\r\n }\r\n }\r\n this.game(\"DApi_Mouse\", 1, this.mouseButton(e), this.eventMods(e), x, y);\r\n e.preventDefault();\r\n }\r\n\r\n onMouseUp = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n //return;\r\n }\r\n const {x, y} = this.mousePos(e);\r\n this.game(\"DApi_Mouse\", 2, this.mouseButton(e), this.eventMods(e), x, y);\r\n if (e.target !== this.keyboard) {\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n onKeyDown = e => {\r\n if (!this.canvas) return;\r\n this.game(\"DApi_Key\", 0, this.eventMods(e), e.keyCode);\r\n if (!this.showKeyboard && (e.keyCode >= 32 && e.key.length === 1)) {\r\n this.game(\"DApi_Char\", e.key.charCodeAt(0));\r\n } else if (e.keyCode === 8 || e.keyCode === 13) {\r\n this.game(\"DApi_Char\", e.keyCode);\r\n }\r\n this.clearKeySel();\r\n if (!this.showKeyboard) {\r\n if (e.keyCode === 8 || e.keyCode === 9 || (e.keyCode >= 112 && e.keyCode <= 119)) {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onMenu = e => {\r\n e.preventDefault();\r\n }\r\n\r\n onKeyUp = e => {\r\n if (!this.canvas) return;\r\n this.game(\"DApi_Key\", 1, this.eventMods(e), e.keyCode);\r\n this.clearKeySel();\r\n }\r\n\r\n clearKeySel() {\r\n if (this.showKeyboard) {\r\n const len = this.keyboard.value.length;\r\n this.keyboard.setSelectionRange(len, len);\r\n }\r\n }\r\n\r\n onKeyboardInner(flags) {\r\n if (this.showKeyboard) {\r\n const text = this.keyboard.value;\r\n let valid;\r\n if (this.maxKeyboard > 0) {\r\n valid = (text.match(/[\\x20-\\x7E]/g) || []).join(\"\").substring(0, this.maxKeyboard);\r\n } else {\r\n const maxValue = -this.maxKeyboard;\r\n if (text.match(/^\\d*$/)) {\r\n this.keyboardNum = Math.min(text.length ? parseInt(text) : 0, maxValue);\r\n }\r\n valid = (this.keyboardNum ? this.keyboardNum.toString() : \"\");\r\n }\r\n if (text !== valid) {\r\n this.keyboard.value = valid;\r\n }\r\n this.clearKeySel();\r\n this.game(\"text\", valid, flags);\r\n }\r\n }\r\n onKeyboard = () => {\r\n this.onKeyboardInner(0);\r\n }\r\n onKeyboardBlur = () => {\r\n this.onKeyboardInner(1);\r\n }\r\n\r\n parseFile = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n parseSave = e => {\r\n const files = e.target.files;\r\n if (files.length > 0) {\r\n this.start(files[0]);\r\n }\r\n }\r\n\r\n touchButton = null;\r\n touchCanvas = null;\r\n\r\n setTouchMod(index, value, use) {\r\n if (index < 3) {\r\n this.touchMods[index] = value;\r\n if (this.touchButtons[index]) {\r\n this.touchButtons[index].classList.toggle(\"active\", value);\r\n }\r\n } else if (use && this.touchBelt[index] >= 0) {\r\n const now = performance.now();\r\n if (!this.beltTime || now - this.beltTime > 750) {\r\n this.game(\"DApi_Char\", 49 + this.touchBelt[index]);\r\n this.beltTime = now;\r\n }\r\n }\r\n }\r\n\r\n updateTouchButton(touches, release) {\r\n let touchOther = null;\r\n if (!this.touchControls) {\r\n this.touchControls = true;\r\n this.element.classList.add(\"touch\");\r\n }\r\n const btn = this.touchButton;\r\n for (let {target, identifier, clientX, clientY} of touches) {\r\n if (btn && btn.id === identifier && this.touchButtons[btn.index] === target) {\r\n if (touches.length > 1) {\r\n btn.stick = false;\r\n }\r\n btn.clientX = clientX;\r\n btn.clientY = clientY;\r\n this.touchCanvas = [...touches].find(t => t.identifier !== identifier);\r\n if (this.touchCanvas) {\r\n this.touchCanvas = {clientX: this.touchCanvas.clientX, clientY: this.touchCanvas.clientY};\r\n }\r\n delete this.panPos;\r\n return this.touchCanvas != null;\r\n }\r\n const idx = this.touchButtons.indexOf(target);\r\n if (idx >= 0 && !touchOther) {\r\n touchOther = {id: identifier, index: idx, stick: true, original: this.touchMods[idx], clientX, clientY};\r\n }\r\n }\r\n if (btn && !touchOther && release && btn.stick) {\r\n const rect = this.touchButtons[btn.index].getBoundingClientRect();\r\n const {clientX, clientY} = btn;\r\n if (clientX >= rect.left && clientX < rect.right && clientY >= rect.top && clientY < rect.bottom) {\r\n this.setTouchMod(btn.index, !btn.original, true);\r\n } else {\r\n this.setTouchMod(btn.index, btn.original);\r\n }\r\n } else if (btn) {\r\n this.setTouchMod(btn.index, false);\r\n }\r\n this.touchButton = touchOther;\r\n if (touchOther) {\r\n this.setTouchMod(touchOther.index, true);\r\n if (touchOther.index === TOUCH_MOVE) {\r\n this.setTouchMod(TOUCH_RMB, false);\r\n } else if (touchOther.index === TOUCH_RMB) {\r\n this.setTouchMod(TOUCH_MOVE, false);\r\n }\r\n delete this.panPos;\r\n } else if (touches.length === 2) {\r\n const x = (touches[1].clientX + touches[0].clientX) / 2, y = (touches[1].clientY + touches[0].clientY) / 2;\r\n if (this.panPos) {\r\n const dx = x - this.panPos.x, dy = y - this.panPos.y;\r\n const step = this.canvas.offsetHeight / 12;\r\n if (Math.max(Math.abs(dx), Math.abs(dy)) > step) {\r\n let key;\r\n if (Math.abs(dx) > Math.abs(dy)) {\r\n key = (dx > 0 ? 0x25 : 0x27);\r\n } else {\r\n key = (dy > 0 ? 0x26 : 0x28);\r\n }\r\n this.game(\"DApi_Key\", 0, 0, key);\r\n // key up is ignored anyway\r\n this.panPos = {x, y};\r\n }\r\n } else {\r\n this.game(\"DApi_Mouse\", 0, 0, 24, 320, 180);\r\n this.game(\"DApi_Mouse\", 2, 1, 24, 320, 180);\r\n this.panPos = {x, y};\r\n }\r\n this.touchCanvas = null;\r\n return false;\r\n } else {\r\n delete this.panPos;\r\n }\r\n this.touchCanvas = [...touches].find(t => !touchOther || t.identifier !== touchOther.id);\r\n if (this.touchCanvas) {\r\n this.touchCanvas = {clientX: this.touchCanvas.clientX, clientY: this.touchCanvas.clientY};\r\n }\r\n return this.touchCanvas != null;\r\n }\r\n\r\n onTouchStart = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n } else {\r\n this.keyboard.blur();\r\n }\r\n e.preventDefault();\r\n if (this.updateTouchButton(e.touches, false)) {\r\n const {x, y} = this.mousePos(this.touchCanvas);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n if (!this.touchMods[TOUCH_MOVE]) {\r\n this.game(\"DApi_Mouse\", 1, this.touchMods[TOUCH_RMB] ? 2 : 1, this.eventMods(e), x, y);\r\n }\r\n }\r\n }\r\n onTouchMove = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n return;\r\n }\r\n e.preventDefault();\r\n if (this.updateTouchButton(e.touches, false)) {\r\n const {x, y} = this.mousePos(this.touchCanvas);\r\n this.game(\"DApi_Mouse\", 0, 0, this.eventMods(e), x, y);\r\n }\r\n }\r\n onTouchEnd = e => {\r\n if (!this.canvas) return;\r\n if (e.target === this.keyboard) {\r\n //return;\r\n } else {\r\n e.preventDefault();\r\n }\r\n const prevTc = this.touchCanvas;\r\n this.updateTouchButton(e.touches, true);\r\n if (prevTc && !this.touchCanvas) {\r\n const {x, y} = this.mousePos(prevTc);\r\n this.game(\"DApi_Mouse\", 2, 1, this.eventMods(e), x, y);\r\n this.game(\"DApi_Mouse\", 2, 2, this.eventMods(e), x, y);\r\n\r\n if (this.touchMods[TOUCH_RMB] && (!this.touchButton || this.touchButton.index !== TOUCH_RMB)) {\r\n this.setTouchMod(TOUCH_RMB, false);\r\n }\r\n }\r\n if (!document.fullscreenElement) {\r\n this.element.requestFullscreen();\r\n }\r\n }\r\n\r\n setCanvas = e => this.canvas = e;\r\n setElement = e => this.element = e;\r\n setKeyboard = e => this.keyboard = e;\r\n setTouch_(i, e) {\r\n this.touchButtons[i] = e;\r\n }\r\n setTouchBelt_(i, e) {\r\n this.touchButtons[i] = e;\r\n if (e) {\r\n const canvas = document.createElement(\"canvas\");\r\n canvas.width = 28;\r\n canvas.height = 28;\r\n e.appendChild(canvas);\r\n this.touchCtx[i] = canvas.getContext(\"2d\");\r\n } else {\r\n this.touchCtx[i] = null;\r\n }\r\n }\r\n\r\n renderUi() {\r\n const {started, loading, error, progress, has_spawn, save_names, show_saves, compress} = this.state;\r\n if (show_saves && typeof save_names === \"object\") {\r\n const plrClass = [\"Warrior\", \"Rogue\", \"Sorcerer\"];\r\n return (\r\n
\r\n
    \r\n {Object.entries(save_names).map(([name, info]) =>
  • \r\n {name}{info ? {info.name} (lv. {info.level} {plrClass[info.cls]}) : \"\"}\r\n this.downloadSave(name)}/>\r\n this.removeSave(name)}/>\r\n
  • )}\r\n
\r\n
\r\n \r\n \r\n
\r\n
this.setState({show_saves: false})}>Back
\r\n
\r\n );\r\n } else if (compress) {\r\n return (\r\n this.compressMpq = e}/>\r\n );\r\n } else if (error) {\r\n return (\r\n \r\n

The following error has occurred:

\r\n

{error.message}

\r\n

Click to create an issue on GitHub

\r\n {error.save != null && Download save file}\r\n \r\n );\r\n } else if (loading && !started) {\r\n return (\r\n
\r\n {(progress && progress.text) || 'Loading...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n );\r\n } else if (!started) {\r\n return (\r\n
\r\n

\r\n This is a web port of the original Diablo game, based on source code reconstructed by\r\n GalaXyHaXz and devilution team. The project page with information and links can be found over here https://github.com/d07RiV/diabloweb\r\n

\r\n

\r\n If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing.\r\n The game can be purchased from GoG.\r\n {\" \"} this.setState({compress: true})}>Click here to compress the MPQ, greatly reducing its size.\r\n

\r\n {!has_spawn && (\r\n

\r\n Or you can play the shareware version for free (50MB download).\r\n

\r\n )}\r\n
\r\n \r\n \r\n
\r\n
this.start()}>Play Shareware
\r\n {!!save_names &&
Manage Saves
}\r\n
\r\n );\r\n }\r\n }\r\n\r\n render() {\r\n const {started, error, dropping} = this.state;\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {!error && }\r\n \r\n
\r\n
\r\n
\r\n {this.renderUi()}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './reset.css';\r\nimport * as serviceWorker from './serviceWorker';\r\n\r\nimport App from './App';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n\r\nserviceWorker.register({\r\n onUpdate() {\r\n },\r\n});\r\n"],"sourceRoot":""} \ No newline at end of file