mirror of
https://github.com/d07RiV/diabloweb.git
synced 2026-06-03 21:41:38 +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 SpawnModule from './DiabloSpawn.jscc';
|
||||
import axios from 'axios';
|
||||
import websocket_open from './websocket';
|
||||
|
||||
const DiabloSize = 1316452;
|
||||
const SpawnSize = 1196648;
|
||||
@@ -16,6 +17,7 @@ let files = null;
|
||||
let renderBatch = null;
|
||||
let drawBelt = null;
|
||||
let is_spawn = false;
|
||||
let websocket = null;
|
||||
|
||||
const ChunkSize = 1 << 20;
|
||||
class RemoteFile {
|
||||
@@ -115,6 +117,15 @@ const DApi = {
|
||||
close_keyboard() {
|
||||
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;
|
||||
@@ -282,7 +293,7 @@ async function initWasm(spawn, progress) {
|
||||
return result;
|
||||
}
|
||||
|
||||
async function init_game(mpq, spawn, offscreen) {
|
||||
async function init_game(mpq, spawn, offscreen, serverUrl) {
|
||||
is_spawn = spawn;
|
||||
if (offscreen) {
|
||||
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...");
|
||||
let mpqLoaded = 0, mpqTotal = (mpq ? mpq.size : 0), wasmLoaded = 0, wasmTotal = (spawn ? SpawnSize : DiabloSize);
|
||||
const wasmWeight = 5;
|
||||
@@ -325,6 +346,9 @@ async function init_game(mpq, spawn, offscreen) {
|
||||
|
||||
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]));
|
||||
|
||||
setInterval(() => {
|
||||
@@ -336,12 +360,13 @@ worker.addEventListener("message", ({data}) => {
|
||||
switch (data.action) {
|
||||
case "init":
|
||||
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"}),
|
||||
e => worker.postMessage({action: "failed", error: e.toString(), stack: e.stack}));
|
||||
break;
|
||||
case "event":
|
||||
call_api(data.func, ...data.params);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
});
|
||||
|
||||
@@ -113,7 +113,7 @@ async function do_load_game(api, audio, mpq, spawn) {
|
||||
for (let [, file] of fs.files) {
|
||||
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;
|
||||
} catch (e) {
|
||||
reject(e);
|
||||
|
||||
Reference in New Issue
Block a user