58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
/// <reference lib="deno.worker" />
|
|
|
|
// runs the game in a worker without any permissions, the host does files and networking
|
|
import { GameServer, TICK_MS } from "./game_server.ts";
|
|
import { GameToHost, HostToGame } from "./host_protocol.ts";
|
|
|
|
const SAVE_INTERVAL_MS = 30_000;
|
|
|
|
let game: GameServer | undefined;
|
|
|
|
function post(message: GameToHost) {
|
|
self.postMessage(message);
|
|
}
|
|
|
|
self.onmessage = (event: MessageEvent<HostToGame>) => {
|
|
const message = event.data;
|
|
|
|
if (message.type === "init") {
|
|
game = new GameServer(
|
|
{
|
|
send: (conn, data) => post({ type: "send", conn, data }),
|
|
close: (conn) => post({ type: "close", conn }),
|
|
},
|
|
message.save,
|
|
message.default_seed,
|
|
);
|
|
|
|
setInterval(() => game!.tick(), TICK_MS);
|
|
setInterval(() => {
|
|
if (game!.world.dirty) {
|
|
post({ type: "save", data: game!.save(), final: false });
|
|
}
|
|
}, SAVE_INTERVAL_MS);
|
|
|
|
post({ type: "ready", seed: game.world.seed });
|
|
return;
|
|
}
|
|
|
|
if (!game) {
|
|
return;
|
|
}
|
|
|
|
switch (message.type) {
|
|
case "connect":
|
|
game.on_connect(message.conn);
|
|
break;
|
|
case "message":
|
|
game.on_message(message.conn, message.data);
|
|
break;
|
|
case "disconnect":
|
|
game.on_disconnect(message.conn);
|
|
break;
|
|
case "shutdown":
|
|
post({ type: "save", data: game.save(), final: true });
|
|
break;
|
|
}
|
|
};
|