import $ from "jquery"; import { Vec2 } from "./vector"; import { EventType, type SetControllableEvent, type Event, type EventPublisher, } from "./event"; import { MouseController } from "./mouse_controller"; import { EntityPositionUpdateEvent, EventProcessor, EventQueue, WebSocketEventQueue, } from "./network"; class KennelClient { private running: boolean; private last_update: number; private controllable_entities: Set; private mouse_controller: MouseController; constructor( private readonly event_queue: EventQueue, private readonly event_publisher: EventPublisher, ) { this.last_update = 0; this.running = false; this.mouse_controller = new MouseController((position: Vec2) => this.on_mouse_move(position), ); } public start() { this.running = true; this.last_update = performance.now(); this.mouse_controller.start(); const loop = (timestamp: number) => { const dt = timestamp - this.last_update; this.propogate_state_after(dt); requestAnimationFrame(loop); // tail call recursion! /s }; requestAnimationFrame(loop); } public close() { this.running = false; this.mouse_controller.stop(); this.controllable_entities.clear(); } private propogate_state_after(dt: number) { // TODO: interpolate cats and lasers and stuff } private on_mouse_move(position: Vec2) { for (const id of this.controllable_entities) { const event: EntityPositionUpdateEvent = { event_type: EventType.ENTITY_POSITION_UPDATE, data: { id, position: { x: position.x, y: position.y } }, }; this.event_publisher.send(event); } } } $(async () => { const session_id = await fetch("/assign", { credentials: "include", }) .then((res) => res.json()) .then(({ session }) => session); const ws = new WebSocket("/ws"); await new Promise((resolve) => { ws.onopen = () => resolve(); }); const queue: EventQueue = new WebSocketEventQueue(ws); const kennel_client = new KennelClient(session_id, null); ws.onclose = () => kennel_client.close(); const mouse_controller = new MouseController(on_mouse_move); $(document).on("mousemove", (event) => { mouse_controller.move(event.clientX, event.clientY); }); mouse_controller.start(); });