summaryrefslogtreecommitdiff
path: root/client/src/JumpStorm.ts
diff options
context:
space:
mode:
Diffstat (limited to 'client/src/JumpStorm.ts')
-rw-r--r--client/src/JumpStorm.ts97
1 files changed, 74 insertions, 23 deletions
diff --git a/client/src/JumpStorm.ts b/client/src/JumpStorm.ts
index ae99b8e..01cc8d8 100644
--- a/client/src/JumpStorm.ts
+++ b/client/src/JumpStorm.ts
@@ -1,4 +1,5 @@
import { Game } from "@engine/Game";
+import { Entity } from "@engine/entities";
import { Grid } from "@engine/structures";
import {
WallBounds,
@@ -7,67 +8,116 @@ import {
Physics,
Input,
Collision,
- MessageQueueProvider,
- MessagePublisher,
NetworkUpdate,
} from "@engine/systems";
+import {
+ type MessageQueueProvider,
+ type MessagePublisher,
+ type MessageProcessor,
+ type Message,
+ type EntityAddBody,
+ MessageType,
+} from "@engine/network";
+import { stringify, parse } from "@engine/utils";
+
+class ClientMessageProcessor implements MessageProcessor {
+ private game: Game;
+
+ constructor(game: Game) {
+ this.game = game;
+ }
+
+ public process(message: Message) {
+ switch (message.type) {
+ case MessageType.NEW_ENTITY:
+ const entityAddBody = message.body as unknown as EntityAddBody;
+ this.game.addEntity(
+ Entity.from(entityAddBody.entityName, entityAddBody.args),
+ );
+ break;
+ }
+
+ console.log(message);
+ }
+}
class ClientSocketMessageQueueProvider implements MessageQueueProvider {
private socket: WebSocket;
- private messages: any[];
+ private messages: Message[];
constructor(socket: WebSocket) {
this.socket = socket;
this.messages = [];
this.socket.addEventListener("message", (e) => {
- console.log(e);
+ const message = parse<Message>(e.data);
+ this.messages.push(message);
});
}
- getNewMessages() {
+ public getNewMessages() {
return this.messages;
}
- clearMessages() {
+ public clearMessages() {
this.messages = [];
}
}
class ClientSocketMessagePublisher implements MessagePublisher {
private socket: WebSocket;
- private messages: any[];
+ private messages: Message[];
constructor(socket: WebSocket) {
this.socket = socket;
this.messages = [];
-
- this.socket.addEventListener("message", (e) => {
- console.log(e);
- });
}
- addMessage(_message: any) {}
+ public addMessage(message: Message) {
+ this.messages.push(message);
+ }
- publish() {}
+ public publish() {
+ this.messages.forEach((message: Message) =>
+ this.socket.send(stringify(message)),
+ );
+ }
}
export class JumpStorm {
private game: Game;
+ private clientId: string;
+
+ constructor(game: Game) {
+ this.game = game;
+ }
- constructor(ctx: CanvasRenderingContext2D) {
- this.game = new Game();
+ public async init(
+ ctx: CanvasRenderingContext2D,
+ httpMethod: string,
+ wsMethod: string,
+ host: string,
+ ) {
+ await fetch(`${httpMethod}://${host}/assign`)
+ .then((resp) => {
+ if (resp.ok) {
+ return resp.text();
+ }
+ throw resp;
+ })
+ .then((cookie) => {
+ this.clientId = cookie;
+ });
- const socket = new WebSocket("ws://localhost:8080");
- setInterval(() => socket.send(JSON.stringify({ x: 1 })), 1_000);
+ const grid = new Grid();
+
+ const socket = new WebSocket(`${wsMethod}://${host}/game`);
const clientSocketMessageQueueProvider =
new ClientSocketMessageQueueProvider(socket);
const clientSocketMessagePublisher = new ClientSocketMessagePublisher(
- socket
+ socket,
);
-
- const grid = new Grid();
-
+ const clientMessageProcessor = new ClientMessageProcessor(this.game);
[
this.createInputSystem(),
new FacingDirection(),
@@ -76,7 +126,8 @@ export class JumpStorm {
new WallBounds(ctx.canvas.width),
new NetworkUpdate(
clientSocketMessageQueueProvider,
- clientSocketMessagePublisher
+ clientSocketMessagePublisher,
+ clientMessageProcessor,
),
new Render(ctx),
].forEach((system) => this.game.addSystem(system));
@@ -93,7 +144,7 @@ export class JumpStorm {
}
private createInputSystem(): Input {
- const inputSystem = new Input();
+ const inputSystem = new Input(this.clientId);
window.addEventListener("keydown", (e) => {
if (!e.repeat) {