From f27ce070be7c54a03d5971607e20742fd13d8d5f Mon Sep 17 00:00:00 2001 From: Andrey Kolosov Date: Wed, 21 Aug 2019 15:06:19 +0300 Subject: [PATCH] Updates --- asset-manifest.json | 6 +++--- index.html | 2 +- ... precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js | 8 ++++---- service-worker.js | 2 +- static/js/main.79c12e60.chunk.js.map | 1 - .../js/{main.79c12e60.chunk.js => main.85b92a8a.chunk.js} | 4 ++-- static/js/main.85b92a8a.chunk.js.map | 1 + 7 files changed, 12 insertions(+), 12 deletions(-) rename precache-manifest.183efacced34bb15f520b290e7552cbf.js => precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js (88%) delete mode 100644 static/js/main.79c12e60.chunk.js.map rename static/js/{main.79c12e60.chunk.js => main.85b92a8a.chunk.js} (71%) create mode 100644 static/js/main.85b92a8a.chunk.js.map diff --git a/asset-manifest.json b/asset-manifest.json index 6c4065d..84e125e 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -3,8 +3,8 @@ "static/js/0.898c4bf7.chunk.js": "/diabloweb/static/js/0.898c4bf7.chunk.js", "static/js/0.898c4bf7.chunk.js.map": "/diabloweb/static/js/0.898c4bf7.chunk.js.map", "main.css": "/diabloweb/static/css/main.15bc8910.chunk.css", - "main.js": "/diabloweb/static/js/main.79c12e60.chunk.js", - "main.js.map": "/diabloweb/static/js/main.79c12e60.chunk.js.map", + "main.js": "/diabloweb/static/js/main.85b92a8a.chunk.js", + "main.js.map": "/diabloweb/static/js/main.85b92a8a.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", @@ -16,7 +16,7 @@ "8f2900d82a26cf7fccd2.worker.js": "/diabloweb/8f2900d82a26cf7fccd2.worker.js", "8f2900d82a26cf7fccd2.worker.js.map": "/diabloweb/8f2900d82a26cf7fccd2.worker.js.map", "index.html": "/diabloweb/index.html", - "precache-manifest.183efacced34bb15f520b290e7552cbf.js": "/diabloweb/precache-manifest.183efacced34bb15f520b290e7552cbf.js", + "precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js": "/diabloweb/precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js", "service-worker.js": "/diabloweb/service-worker.js", "static/css/main.15bc8910.chunk.css.map": "/diabloweb/static/css/main.15bc8910.chunk.css.map", "static/media/Diablo.wasm": "/diabloweb/static/media/Diablo.570bd59a.wasm", diff --git a/index.html b/index.html index dfc277e..f795136 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.183efacced34bb15f520b290e7552cbf.js b/precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js similarity index 88% rename from precache-manifest.183efacced34bb15f520b290e7552cbf.js rename to precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js index 2e847bb..8a551e7 100644 --- a/precache-manifest.183efacced34bb15f520b290e7552cbf.js +++ b/precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js @@ -4,11 +4,11 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/diabloweb/8f2900d82a26cf7fccd2.worker.js" }, { - "revision": "8fadd6ed7162a42b331a501dbb0d74b9", + "revision": "5b1331f45364dd517d54fd4b26f59179", "url": "/diabloweb/index.html" }, { - "revision": "2a85f8ff7e1337291870", + "revision": "fc18624fda3650b0f4e8", "url": "/diabloweb/static/css/main.15bc8910.chunk.css" }, { @@ -20,8 +20,8 @@ self.__precacheManifest = (self.__precacheManifest || []).concat([ "url": "/diabloweb/static/js/5.b23954b0.chunk.js" }, { - "revision": "2a85f8ff7e1337291870", - "url": "/diabloweb/static/js/main.79c12e60.chunk.js" + "revision": "fc18624fda3650b0f4e8", + "url": "/diabloweb/static/js/main.85b92a8a.chunk.js" }, { "revision": "077fe45e700d7971de0b", diff --git a/service-worker.js b/service-worker.js index c2eaab8..5d46dc5 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.183efacced34bb15f520b290e7552cbf.js" + "/diabloweb/precache-manifest.e3b2c73d65142f9fbd174095ca3dcd0d.js" ); self.addEventListener('message', (event) => { diff --git a/static/js/main.79c12e60.chunk.js.map b/static/js/main.79c12e60.chunk.js.map deleted file mode 100644 index d139a1a..0000000 --- a/static/js/main.79c12e60.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["fs.js","api/game.worker.js","../node_modules/peerjs/dist sync","serviceWorker.js","api/sound.js","api/load_spawn.js","api/packet.js","api/webrtc.js","api/loader.js","App.js","index.js"],"names":["downloadFile","_callee","store","name","file","blob","url","lnk","C_Work_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_Work_diabloweb_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","window","DownloadFile","DownloadSaves","update","delete","remove","clear","download","upload","fileUrl","_fileUrl","C_Work_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","init_sound","AudioContext","webkitAudioContext","StereoPannerNode","create_sound","duplicate_sound","play_sound","set_volume","stop_sound","delete_sound","context","sounds","create_sound_raw","channels","rate","buffer","createBuffer","i","getChannelData","subarray","gain","createGain","panner","pan","decodeAudioData","srcId","src","volume","loop","source","Math","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","byteLength","axios","request","process","responseType","onDownloadProgress","onProgress","text","loaded","total","headers","Cache-Control","slice","buffer_reader","classCallCheck","pos","createClass","key","read8","String","fromCharCode","toConsumableArray","size","read32","buffer_writer","write8","charCodeAt","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","count","read16","packets","push","reduce","sum","_ref","writer","write16","server_packet","info","version","_ref4","game_list","games","read_str","_ref5","_ref6","_ref7","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_ref9","write_str","join_accept","cookie","index","seed","difficulty","_ref10","join_reject","reason","_ref11","_ref12","disconnect","_ref13","message","payload","read_buf","_ref14","_ref15","write_buf","turn","_ref16","batch","client_packet","_ref17","create_game","password","_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","floor","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","b","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","reportLink","retail","searchParams","split","map","line","join","userAgent","toString","ReactGA","initialize","pageview","TOUCH_MOVE","TOUCH_RMB","keyboardRule","styleSheets","sheet","cssRules","rule","CSSRule","MEDIA_RULE","conditionText","sub","selectorText","findKeyboardRule","Link","children","props","objectWithoutProperties","react_default","assign","target","rel","App","possibleConstructorReturn","getPrototypeOf","started","loading","dropping","has_spawn","cursorPos","touchControls","touchButtons","touchCtx","touchMods","touchBelt","maxKeyboard","onDrop","dataTransfer","items","kind","getAsFile","getDropFile","preventDefault","setState","onDragEnter","setDropping","onDragOver","isDropFile","onDragLeave","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","parseFile","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","save_names","filter","inc","max","asyncToGenerator","errorObject","saveName","mapStackTrace","objectSpread","left","toFixed","top","width","add","style","focus","transform","keyboardNum","_this4","getBoundingClientRect","right","bottom","progress","reload","confirm","idx","slot","display","drawImage","used","Set","has","drawBelt","_this5","show_saves","removeEventListener","event","category","passive","capture","alert","pointerLockElement","mozPointerLockElement","min","movementX","movementY","clientX","clientY","round","button","shiftKey","ctrlKey","altKey","len","setSelectionRange","flags","valid","substring","maxValue","parseInt","use","toggle","now","performance","beltTime","release","_this6","touchOther","btn","_loop","identifier","stick","t","panPos","v","indexOf","original","_ret","dx","dy","step","offsetHeight","abs","_this7","_this$state","className","classNames","touch","ref","index_es","icon","faDownload","onClick","downloadSave","faTimes","removeSave","htmlFor","accept","onChange","active","onBlur","spellCheck","App_Link","href","React","Component","ReactDOM","render","src_App_0","getElementById","origin","fetch","response","contentType","status","ready","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.79c12e60.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__ + \"8f2900d82a26cf7fccd2.worker.js\");\n};","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 = 69;","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\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 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\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\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 this.setState({save_names: [...fs.files.keys()].filter(name => name.match(/\\.sv$/i))});\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 this.start(file);\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 removeSave(name) {\r\n if (window.confirm(`Are you sure you want to delete ${name}?`)) {\r\n this.fs.then(fs => fs.delete(name.toLowerCase()));\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(console.log(`Updated ${file.name}`));\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(/^diabdat\\.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 render() {\r\n const {started, loading, error, progress, dropping, has_spawn, save_names, show_saves} = this.state;\r\n if (show_saves && save_names) {\r\n return (\r\n
\r\n
\r\n
\r\n
    \r\n {save_names.map(name =>
  • \r\n {name}\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
\r\n );\r\n }\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 {!!error && (\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 {!!loading && !started && !error && (\r\n
\r\n {(progress && progress.text) || 'Loading...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n )}\r\n {!started && !loading && !error && (\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

\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 && save_names.length) && this.setState({show_saves: true})}>Manage Saves}\r\n
\r\n )}\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.79c12e60.chunk.js b/static/js/main.85b92a8a.chunk.js similarity index 71% rename from static/js/main.79c12e60.chunk.js rename to static/js/main.85b92a8a.chunk.js index e09f5ef..b1837be 100644 --- a/static/js/main.79c12e60.chunk.js +++ b/static/js/main.85b92a8a.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 m});var r=n(8),a=n(2),o=n.n(a),i=n(3),s=n(14),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 d(e){return h.apply(this,arguments)}function h(){return(h=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 f=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,f(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 m(e){return y.apply(this,arguments)}function y(){return(y=Object(i.a)(o.a.mark(function e(t){var n,a,s,l,h,f,p,m;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=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(f.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}(),U=function(){function e(t){Object(v.a)(this,e),this.buffer=new Uint8Array(t),this.pos=0}return Object(p.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(q(J.join_reject,{cookie:s.cookie,reason:z.JOIN_GAME_FULL})):(t.players[c]=n,n.id=c,e.send(q(J.join_accept,{cookie:s.cookie,index:c,seed:t.seed,difficulty:t.difficulty})),t.send(255,q(J.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,N=A>>8&255,P=255&A;t.fillStyle="rgb(".concat(B,", ").concat(N,", ").concat(P,")"),t.fillText(L,T,D+22)}}catch(K){M=!0,C=K}finally{try{E||null==S.return||S.return()}finally{if(M)throw C}}t.restore()}}e.updateBelt(s)}function ee(){return(ee=Object(h.a)(l.a.mark(function e(t,n,r,a){var o,i,s;return l.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,N(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 u=new T.a,l=[],d=Q(function(e){l.push(e)});u.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;r=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[re]||n.game("DApi_Mouse",1,n.touchMods[ae]?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[ae]||n.touchButton&&n.touchButton.index===ae||n.setTouchMod(ae,!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(b.a)(t,e),Object(p.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&&B.includes(n.byteLength)&&e.setState({has_spawn:!0}),e.setState({save_names:Object(f.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)})})})}},{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)(l.a.mark(function r(){var a;return l.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(C.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(),oe&&(oe.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:"removeSave",value:function(e){window.confirm("Are you sure you want to delete ".concat(e,"?"))&&this.fs.then(function(t){return t.delete(e.toLowerCase())})}},{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(console.log("Updated ".concat(e.name)));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(/^diabdat\.mpq$/i));x.a.event({category:"Game",action:n?"Start Retail":"Start Shareware"}),this.setState({loading:!0,retail:n}),te(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(f.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 d=u();if("object"===typeof d)return d.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 h=this.touchButtons[a.index].getBoundingClientRect(),v=a.clientX,p=a.clientY;v>=h.left&&v=h.top&&pk)w=Math.abs(b)>Math.abs(g)?b>0?37:39:g>0?38:40,this.game("DApi_Key",0,0,w),this.panPos={x:m,y:y}}else this.game("DApi_Mouse",0,0,24,320,180),this.game("DApi_Mouse",2,1,24,320,180),this.panPos={x:m,y:y};return this.touchCanvas=null,!1}delete this.panPos}return this.touchCanvas=Object(f.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:"render",value:function(){var e=this,t=this.state,n=t.started,r=t.loading,o=t.error,i=t.progress,s=t.dropping,c=t.has_spawn,u=t.save_names;return t.show_saves&&u?a.a.createElement("div",{className:_()("App",{touch:this.touchControls,started:n,dropping:s,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"BodyV"},a.a.createElement("div",{className:"start"},a.a.createElement("ul",{className:"saveList"},u.map(function(t){return a.a.createElement("li",null,t,a.a.createElement(E.a,{className:"btnDownload",icon:M.a,onClick:function(){return e.downloadSave(t)}}),a.a.createElement(E.a,{className:"btnRemove",icon:M.b,onClick:function(){return e.removeSave(t)}}))})),a.a.createElement("form",null,a.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Upload Save"),a.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseSave})),a.a.createElement("span",{className:"startButton",onClick:function(){return e.setState({show_saves:!1})}},"Back")))):a.a.createElement("div",{className:_()("App",{touch:this.touchControls,started:n,dropping:s,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"touch-ui touch-mods"},a.a.createElement("div",{className:_()("touch-button","touch-button-0",{active:this.touchMods[0]}),ref:this.setTouch0}),a.a.createElement("div",{className:_()("touch-button","touch-button-1",{active:this.touchMods[1]}),ref:this.setTouch1}),a.a.createElement("div",{className:_()("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:_()("touch-button","touch-button-0"),ref:this.setTouch3}),a.a.createElement("div",{className:_()("touch-button","touch-button-1"),ref:this.setTouch4}),a.a.createElement("div",{className:_()("touch-button","touch-button-2"),ref:this.setTouch5})),a.a.createElement("div",{className:"Body"},a.a.createElement("div",{className:"inner"},!o&&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"},!!o&&a.a.createElement(ie,{className:"error",href:ne(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&&!o&&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&&!r&&!o&&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(ie,{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(ie,{href:"https://www.gog.com/game/diablo"},"GoG"),"."),!c&&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("span",{className:"startButton",onClick:function(){return e.start()}},"Play Shareware"),!(!u||!u.length)&&a.a.createElement("span",{className:"startButton",onClick:function(){return e.setState({show_saves:!0})}},"Manage Saves"))))}}]),t}(a.a.Component);i.a.render(a.a.createElement(se,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(){}})}},[[38,2,0,5]]]); -//# sourceMappingURL=main.79c12e60.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 m});var r=n(8),a=n(2),o=n.n(a),i=n(3),s=n(14),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 d(e){return h.apply(this,arguments)}function h(){return(h=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 f=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,f(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 m(e){return y.apply(this,arguments)}function y(){return(y=Object(i.a)(o.a.mark(function e(t){var n,a,s,l,h,f,p,m;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=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(u.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}(),U=function(){function e(t){Object(v.a)(this,e),this.buffer=new Uint8Array(t),this.pos=0}return Object(p.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(X(J.join_reject,{cookie:s.cookie,reason:z.JOIN_GAME_FULL})):(t.players[c]=n,n.id=c,e.send(X(J.join_accept,{cookie:s.cookie,index:c,seed:t.seed,difficulty:t.difficulty})),t.send(255,X(J.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,N=A>>8&255,P=255&A;t.fillStyle="rgb(".concat(B,", ").concat(N,", ").concat(P,")"),t.fillText(L,T,D+22)}}catch(K){M=!0,C=K}finally{try{E||null==j.return||j.return()}finally{if(M)throw C}}t.restore()}}e.updateBelt(s)}function ee(){return(ee=Object(f.a)(d.a.mark(function e(t,n,r,a){var o,i,s;return d.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,N(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 T.a,d=[],h=Q(function(e){d.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;r=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[re]||n.game("DApi_Mouse",1,n.touchMods[ae]?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[ae]||n.touchButton&&n.touchButton.index===ae||n.setTouchMod(ae,!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(b.a)(t,e),Object(p.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&&B.includes(n.byteLength)&&e.setState({has_spawn:!0}),e.updateSaves()})}},{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(f.a)(d.a.mark(function r(){var a;return d.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(C.mapStackTrace)(t,function(e){n.setState(function(t){return!t.error&&{error:Object(h.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(),oe&&(oe.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;this.fs.then(function(t){return e.setState({save_names:Object(u.a)(t.files.keys()).filter(function(e){return e.match(/\.sv$/i)})})})}},{key:"removeSave",value:function(e){var t=this;window.confirm("Are you sure you want to delete ".concat(e,"?"))&&Object(f.a)(d.a.mark(function n(){var r;return d.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(/^diabdat\.mpq$/i));x.a.event({category:"Game",action:n?"Start Retail":"Start Shareware"}),this.setState({loading:!0,retail:n}),te(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,l=function(){var t=c.value,o=t.target,i=t.identifier,s=t.clientX,l=t.clientY;if(a&&a.id===i&&n.touchButtons[a.index]===o)return e.length>1&&(a.stick=!1),a.clientX=s,a.clientY=l,n.touchCanvas=Object(u.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 d=n.touchButtons.indexOf(o);d>=0&&!r&&(r={id:i,index:d,stick:!0,original:n.touchMods[d],clientX:s,clientY:l})},d=e[Symbol.iterator]();!(o=(c=d.next()).done);o=!0){var h=l();if("object"===typeof h)return h.v}}catch(_){i=!0,s=_}finally{try{o||null==d.return||d.return()}finally{if(i)throw s}}if(a&&!r&&t&&a.stick){var f=this.touchButtons[a.index].getBoundingClientRect(),v=a.clientX,p=a.clientY;v>=f.left&&v=f.top&&pk)w=Math.abs(b)>Math.abs(g)?b>0?37:39:g>0?38:40,this.game("DApi_Key",0,0,w),this.panPos={x:m,y:y}}else this.game("DApi_Mouse",0,0,24,320,180),this.game("DApi_Mouse",2,1,24,320,180),this.panPos={x:m,y:y};return this.touchCanvas=null,!1}delete this.panPos}return this.touchCanvas=Object(u.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:"render",value:function(){var e=this,t=this.state,n=t.started,r=t.loading,o=t.error,i=t.progress,s=t.dropping,c=t.has_spawn,u=t.save_names;return t.show_saves&&u?a.a.createElement("div",{className:_()("App",{touch:this.touchControls,started:n,dropping:s,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"BodyV"},a.a.createElement("div",{className:"start"},a.a.createElement("ul",{className:"saveList"},u.map(function(t){return a.a.createElement("li",{key:t},t,a.a.createElement(E.a,{className:"btnDownload",icon:M.a,onClick:function(){return e.downloadSave(t)}}),a.a.createElement(E.a,{className:"btnRemove",icon:M.b,onClick:function(){return e.removeSave(t)}}))})),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("span",{className:"startButton",onClick:function(){return e.setState({show_saves:!1})}},"Back")))):a.a.createElement("div",{className:_()("App",{touch:this.touchControls,started:n,dropping:s,keyboard:!!this.showKeyboard}),ref:this.setElement},a.a.createElement("div",{className:"touch-ui touch-mods"},a.a.createElement("div",{className:_()("touch-button","touch-button-0",{active:this.touchMods[0]}),ref:this.setTouch0}),a.a.createElement("div",{className:_()("touch-button","touch-button-1",{active:this.touchMods[1]}),ref:this.setTouch1}),a.a.createElement("div",{className:_()("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:_()("touch-button","touch-button-0"),ref:this.setTouch3}),a.a.createElement("div",{className:_()("touch-button","touch-button-1"),ref:this.setTouch4}),a.a.createElement("div",{className:_()("touch-button","touch-button-2"),ref:this.setTouch5})),a.a.createElement("div",{className:"Body"},a.a.createElement("div",{className:"inner"},!o&&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"},!!o&&a.a.createElement(ie,{className:"error",href:ne(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&&!o&&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&&!r&&!o&&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(ie,{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(ie,{href:"https://www.gog.com/game/diablo"},"GoG"),"."),!c&&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("span",{className:"startButton",onClick:function(){return e.start()}},"Play Shareware"),!(!u||!u.length)&&a.a.createElement("span",{className:"startButton",onClick:function(){return e.setState({show_saves:!0})}},"Manage Saves"))))}}]),t}(a.a.Component);i.a.render(a.a.createElement(se,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(){}})}},[[38,2,0,5]]]); +//# sourceMappingURL=main.85b92a8a.chunk.js.map \ No newline at end of file diff --git a/static/js/main.85b92a8a.chunk.js.map b/static/js/main.85b92a8a.chunk.js.map new file mode 100644 index 0000000..f920211 --- /dev/null +++ b/static/js/main.85b92a8a.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["fs.js","api/game.worker.js","../node_modules/peerjs/dist sync","serviceWorker.js","api/sound.js","api/load_spawn.js","api/packet.js","api/webrtc.js","api/loader.js","App.js","index.js"],"names":["downloadFile","_callee","store","name","file","blob","url","lnk","C_Work_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_Work_diabloweb_node_modules_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__","window","DownloadFile","DownloadSaves","update","delete","remove","clear","download","upload","fileUrl","_fileUrl","C_Work_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","init_sound","AudioContext","webkitAudioContext","StereoPannerNode","create_sound","duplicate_sound","play_sound","set_volume","stop_sound","delete_sound","context","sounds","create_sound_raw","channels","rate","buffer","createBuffer","i","getChannelData","subarray","gain","createGain","panner","pan","decodeAudioData","srcId","src","volume","loop","source","Math","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","byteLength","axios","request","process","responseType","onDownloadProgress","onProgress","text","loaded","total","headers","Cache-Control","slice","buffer_reader","classCallCheck","pos","createClass","key","read8","String","fromCharCode","toConsumableArray","size","read32","buffer_writer","write8","charCodeAt","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","count","read16","packets","push","reduce","sum","_ref","writer","write16","server_packet","info","version","_ref4","game_list","games","read_str","_ref5","_ref6","_ref7","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","_ref9","write_str","join_accept","cookie","index","seed","difficulty","_ref10","join_reject","reason","_ref11","_ref12","disconnect","_ref13","message","payload","read_buf","_ref14","_ref15","write_buf","turn","_ref16","batch","client_packet","_ref17","create_game","password","_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","floor","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","b","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","reportLink","retail","searchParams","split","map","line","join","userAgent","toString","ReactGA","initialize","pageview","TOUCH_MOVE","TOUCH_RMB","keyboardRule","styleSheets","sheet","cssRules","rule","CSSRule","MEDIA_RULE","conditionText","sub","selectorText","findKeyboardRule","Link","children","props","objectWithoutProperties","react_default","assign","target","rel","App","possibleConstructorReturn","getPrototypeOf","started","loading","dropping","has_spawn","cursorPos","touchControls","touchButtons","touchCtx","touchMods","touchBelt","maxKeyboard","onDrop","dataTransfer","items","kind","getAsFile","getDropFile","preventDefault","setState","onDragEnter","setDropping","onDragOver","isDropFile","onDragLeave","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","parseFile","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","updateSaves","inc","max","asyncToGenerator","errorObject","saveName","mapStackTrace","objectSpread","left","toFixed","top","width","add","style","focus","transform","keyboardNum","_this4","getBoundingClientRect","right","bottom","progress","reload","_this5","save_names","filter","_this6","confirm","idx","slot","display","drawImage","used","Set","has","drawBelt","_this7","show_saves","removeEventListener","event","category","passive","capture","alert","pointerLockElement","mozPointerLockElement","min","movementX","movementY","clientX","clientY","round","button","shiftKey","ctrlKey","altKey","len","setSelectionRange","flags","valid","substring","maxValue","parseInt","use","toggle","now","performance","beltTime","release","_this8","touchOther","btn","_loop","identifier","stick","t","panPos","v","indexOf","original","_ret","dx","dy","step","offsetHeight","abs","_this9","_this$state","className","classNames","touch","ref","index_es","icon","faDownload","onClick","downloadSave","faTimes","removeSave","htmlFor","accept","onChange","active","onBlur","spellCheck","App_Link","href","React","Component","ReactDOM","render","src_App_0","getElementById","origin","fetch","response","contentType","status","ready","unregister","checkValidServiceWorker"],"mappings":"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","file":"static/js/main.85b92a8a.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__ + \"8f2900d82a26cf7fccd2.worker.js\");\n};","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 = 69;","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\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 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\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\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 this.updateSaves();\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 this.start(file);\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 updateSaves() {\r\n this.fs.then(fs => this.setState({save_names: [...fs.files.keys()].filter(name => name.match(/\\.sv$/i))}));\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(/^diabdat\\.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 render() {\r\n const {started, loading, error, progress, dropping, has_spawn, save_names, show_saves} = this.state;\r\n if (show_saves && save_names) {\r\n return (\r\n
\r\n
\r\n
\r\n
    \r\n {save_names.map(name =>
  • \r\n {name}\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
\r\n );\r\n }\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 {!!error && (\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 {!!loading && !started && !error && (\r\n
\r\n {(progress && progress.text) || 'Loading...'}\r\n {progress != null && !!progress.total && (\r\n \r\n )}\r\n
\r\n )}\r\n {!started && !loading && !error && (\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

\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 && save_names.length) && this.setState({show_saves: true})}>Manage Saves}\r\n
\r\n )}\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