mirror of
https://github.com/d07RiV/diabloweb.git
synced 2026-07-03 20:01:34 +00:00
multiplayer works!
This commit is contained in:
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.
@@ -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:
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user