multiplayer works!

This commit is contained in:
d07riv
2019-08-13 05:29:17 +03:00
parent d7cbb4e165
commit ccb0d172d2
6 changed files with 30 additions and 5 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -3,6 +3,7 @@ import DiabloModule from './Diablo.jscc';
import SpawnBinary from './DiabloSpawn.wasm'; import SpawnBinary from './DiabloSpawn.wasm';
import SpawnModule from './DiabloSpawn.jscc'; import SpawnModule from './DiabloSpawn.jscc';
import axios from 'axios'; import axios from 'axios';
import websocket_open from './websocket';
const DiabloSize = 1316452; const DiabloSize = 1316452;
const SpawnSize = 1196648; const SpawnSize = 1196648;
@@ -16,6 +17,7 @@ let files = null;
let renderBatch = null; let renderBatch = null;
let drawBelt = null; let drawBelt = null;
let is_spawn = false; let is_spawn = false;
let websocket = null;
const ChunkSize = 1 << 20; const ChunkSize = 1 << 20;
class RemoteFile { class RemoteFile {
@@ -115,6 +117,15 @@ const DApi = {
close_keyboard() { close_keyboard() {
worker.postMessage({action: "keyboard", rect: null}); worker.postMessage({action: "keyboard", rect: null});
}, },
websocket_send(data) {
if (websocket) {
websocket.send(data);
}
},
websocket_closed() {
return !websocket || websocket.readyState !== WebSocket.OPEN;
},
}; };
let frameTime = 0, lastTime = 0; let frameTime = 0, lastTime = 0;
@@ -282,7 +293,7 @@ async function initWasm(spawn, progress) {
return result; return result;
} }
async function init_game(mpq, spawn, offscreen) { async function init_game(mpq, spawn, offscreen, serverUrl) {
is_spawn = spawn; is_spawn = spawn;
if (offscreen) { if (offscreen) {
canvas = new OffscreenCanvas(640, 480); canvas = new OffscreenCanvas(640, 480);
@@ -301,6 +312,16 @@ async function init_game(mpq, spawn, offscreen) {
} }
} }
if (serverUrl) {
progress("Connecting...");
websocket = await websocket_open(serverUrl, data => {
if (wasm) {
const ptr = wasm._DApi_AllocPacket(data.byteLength);
wasm.HEAPU8.set(new Uint8Array(data), ptr);
}
});
}
progress("Loading..."); progress("Loading...");
let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = (spawn ? SpawnSize : DiabloSize); let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = (spawn ? SpawnSize : DiabloSize);
const wasmWeight = 5; const wasmWeight = 5;
@@ -325,6 +346,9 @@ async function init_game(mpq, spawn, offscreen) {
const vers = process.env.VERSION.match(/(\d+)\.(\d+)\.(\d+)/); const vers = process.env.VERSION.match(/(\d+)\.(\d+)\.(\d+)/);
if (websocket) {
wasm._SNet_InitWebsocket();
}
wasm._DApi_Init(Math.floor(performance.now()), offscreen ? 1 : 0, parseInt(vers[1]), parseInt(vers[2]), parseInt(vers[3])); wasm._DApi_Init(Math.floor(performance.now()), offscreen ? 1 : 0, parseInt(vers[1]), parseInt(vers[2]), parseInt(vers[3]));
setInterval(() => { setInterval(() => {
@@ -336,12 +360,13 @@ worker.addEventListener("message", ({data}) => {
switch (data.action) { switch (data.action) {
case "init": case "init":
files = data.files; files = data.files;
init_game(data.mpq, data.spawn, data.offscreen).then( init_game(data.mpq, data.spawn, data.offscreen, data.websocket).then(
() => worker.postMessage({action: "loaded"}), () => worker.postMessage({action: "loaded"}),
e => worker.postMessage({action: "failed", error: e.toString(), stack: e.stack})); e => worker.postMessage({action: "failed", error: e.toString(), stack: e.stack}));
break; break;
case "event": case "event":
call_api(data.func, ...data.params); call_api(data.func, ...data.params);
break; break;
default:
} }
}); });

View File

@@ -113,7 +113,7 @@ async function do_load_game(api, audio, mpq, spawn) {
for (let [, file] of fs.files) { for (let [, file] of fs.files) {
transfer.push(file.buffer); transfer.push(file.buffer);
} }
worker.postMessage({action: "init", files: fs.files, mpq, spawn, offscreen}, transfer); worker.postMessage({action: "init", files: fs.files, mpq, spawn, offscreen, websocket: window.gameServer}, transfer);
delete fs.files; delete fs.files;
} catch (e) { } catch (e) {
reject(e); reject(e);