From 722e6090d1b26a6355e3554453f8bb7094948e9b Mon Sep 17 00:00:00 2001 From: Jason Dekarske Date: Fri, 10 Jul 2026 23:16:06 -0700 Subject: [PATCH] refactor(frontend): multi-path trajectory protocol and team on throw Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- frontend/src/net.ts | 35 ++++++++++++++++++++++++++--------- frontend/src/protocol.ts | 9 +++++++-- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/frontend/src/net.ts b/frontend/src/net.ts index ecd30a1..6374acf 100644 --- a/frontend/src/net.ts +++ b/frontend/src/net.ts @@ -1,5 +1,6 @@ import type { ServerGameStateMessage, + ServerStoneTrajectory, ServerMessageTyped as ServerMessage, Team, } from './protocol' @@ -13,10 +14,10 @@ function resolveWsUrl(): string { } export interface NetCallbacks { - onJoined: (room: string, team: Team) => void + onJoined: (room: string) => void onWaiting: (message: string) => void onGameState: (msg: ServerGameStateMessage) => void - onTrajectory: (path: [number, number, number][]) => void + onTrajectory: (paths: ServerStoneTrajectory[]) => void onEndScored: (end: number, points: number, scoringTeam: Team | null) => void onGameOver: (scores: number[], winner: Team | null) => void onError: (message: string) => void @@ -25,10 +26,9 @@ export interface NetCallbacks { let socket: WebSocket | null = null -export function connect(room: string, team: Team | null, callbacks: NetCallbacks): void { +export function connect(room: string, callbacks: NetCallbacks): void { if (socket) return - const teamParam = team ? `&team=${encodeURIComponent(team)}` : '' - const url = `${resolveWsUrl()}?room=${encodeURIComponent(room)}${teamParam}` + const url = `${resolveWsUrl()}?room=${encodeURIComponent(room)}` const ws = new WebSocket(url) ws.onopen = () => { @@ -42,7 +42,7 @@ export function connect(room: string, team: Team | null, callbacks: NetCallbacks switch (msg.type) { case 'joined': - callbacks.onJoined(msg.room, msg.team) + callbacks.onJoined(msg.room) break case 'waiting': callbacks.onWaiting(msg.message) @@ -51,7 +51,7 @@ export function connect(room: string, team: Team | null, callbacks: NetCallbacks callbacks.onGameState(msg) break case 'trajectory': - callbacks.onTrajectory(msg.path) + callbacks.onTrajectory(msg.paths) break case 'end_scored': callbacks.onEndScored(msg.end, msg.points, msg.scoring_team ?? null) @@ -76,7 +76,24 @@ export function connect(room: string, team: Team | null, callbacks: NetCallbacks ws.onerror = () => {} } -export function sendThrow(broomX: number, broomY: number, weight: number, curl: number, friction: number): void { +export function sendThrow( + team: Team, + broomX: number, + broomY: number, + weight: number, + curl: number, + friction: number, +): void { if (!socket || socket.readyState !== WebSocket.OPEN) return - socket.send(JSON.stringify({ type: 'throw', broom_x: broomX, broom_y: broomY, weight, curl, friction })) + socket.send( + JSON.stringify({ + type: 'throw', + team, + broom_x: broomX, + broom_y: broomY, + weight, + curl, + friction, + }), + ) } diff --git a/frontend/src/protocol.ts b/frontend/src/protocol.ts index ebee7f3..7e74f8c 100644 --- a/frontend/src/protocol.ts +++ b/frontend/src/protocol.ts @@ -35,6 +35,7 @@ export interface DrawableStone { export interface ClientThrowMessage { type: 'throw' + team: Team broom_x: number broom_y: number weight: number @@ -45,7 +46,6 @@ export interface ClientThrowMessage { export interface ServerJoinedMessage { type: 'joined' room: string - team: Team } export interface ServerWaitingMessage { @@ -63,9 +63,14 @@ export interface ServerGameStateMessage { phase: Phase } +export interface ServerStoneTrajectory { + stone_id: number + path: [number, number, number][] +} + export interface ServerTrajectoryMessage { type: 'trajectory' - path: [number, number, number][] + paths: ServerStoneTrajectory[] } export interface ServerEndScoredMessage {