Spaces:
Sleeping
Sleeping
| import { Server, Socket } from "socket.io"; | |
| import { GameManager } from "../services/gameManager"; | |
| export function setupSocketHandlers(io: Server, socket: Socket, gameManager: GameManager) { | |
| console.log(`Setting up socket handlers for ${socket.id}`); | |
| // Join room | |
| socket.on("joinRoom", (data: { roomId?: string; nickname: string }) => { | |
| const { roomId, nickname } = data; | |
| // Create or join room | |
| const room = roomId | |
| ? gameManager.joinRoom(roomId, socket.id, nickname) | |
| : gameManager.createRoom(socket.id, nickname); | |
| if (room) { | |
| socket.join(room.id); | |
| // Get complete game data for frontend | |
| const board = gameManager.getGameBoard(room.id); | |
| const currentPlayer = gameManager.getCurrentPlayer(room.id); | |
| const stats = gameManager.getGameStats(room.id); | |
| socket.emit("roomJoined", { | |
| roomId: room.id, | |
| playerId: socket.id, | |
| playerColor: room.players[socket.id]?.color, | |
| gameState: { | |
| board, | |
| boardShape: room.game.getShape(), | |
| currentPlayer, | |
| moveHistory: room.game.getHistory(), | |
| currentMoveIndex: room.game.getCurrentStep(), | |
| capturedStones: { | |
| black: stats?.capturedByBlack || 0, | |
| white: stats?.capturedByWhite || 0 | |
| }, | |
| gameStatus: room.gameState.gameStatus, | |
| winner: room.gameState.winner | |
| } | |
| }); | |
| // Notify other players | |
| socket.to(room.id).emit("playerJoined", { | |
| playerId: socket.id, | |
| nickname: nickname | |
| }); | |
| console.log(`Player ${socket.id} joined room ${room.id}`); | |
| } else { | |
| socket.emit("error", { message: "Failed to join room" }); | |
| } | |
| }); | |
| // Leave room | |
| socket.on("leaveRoom", () => { | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room) { | |
| socket.leave(room.id); | |
| gameManager.leaveRoom(room.id, socket.id); | |
| // Notify others | |
| socket.to(room.id).emit("playerLeft", { | |
| playerId: socket.id | |
| }); | |
| } | |
| }); | |
| // Game moves | |
| socket.on("makeMove", (data: { x: number; y: number; z: number }) => { | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room && gameManager.makeMove(room.id, socket.id, data)) { | |
| // Get updated game data | |
| const board = gameManager.getGameBoard(room.id); | |
| const currentPlayer = gameManager.getCurrentPlayer(room.id); | |
| const stats = gameManager.getGameStats(room.id); | |
| const lastStep = room.game.getLastStep(); | |
| // Broadcast game update to all players in the room | |
| io.to(room.id).emit("gameUpdate", { | |
| board, | |
| currentPlayer, | |
| lastMove: data, | |
| capturedStones: { | |
| black: stats?.capturedByBlack || 0, | |
| white: stats?.capturedByWhite || 0 | |
| }, | |
| capturedPositions: lastStep?.capturedPositions, | |
| moveHistory: room.game.getHistory(), | |
| currentMoveIndex: room.game.getCurrentStep() | |
| }); | |
| } else { | |
| socket.emit("error", { message: "Invalid move" }); | |
| } | |
| }); | |
| // Pass turn | |
| socket.on("pass", () => { | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room && gameManager.passTurn(room.id, socket.id)) { | |
| const currentPlayer = gameManager.getCurrentPlayer(room.id); | |
| io.to(room.id).emit("gameUpdate", { | |
| currentPlayer, | |
| action: "pass", | |
| moveHistory: room.game.getHistory(), | |
| currentMoveIndex: room.game.getCurrentStep() | |
| }); | |
| // Check for consecutive passes (game end) | |
| if (gameManager.checkConsecutivePasses(room.id)) { | |
| const territory = gameManager.getTerritory(room.id); | |
| io.to(room.id).emit("gameEnded", { | |
| winner: room.gameState.winner, | |
| reason: "double-pass", | |
| territory | |
| }); | |
| } | |
| } | |
| }); | |
| // Resign | |
| socket.on("resign", () => { | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room && gameManager.resign(room.id, socket.id)) { | |
| io.to(room.id).emit("gameEnded", { | |
| winner: room.gameState.winner, | |
| reason: "resignation" | |
| }); | |
| } | |
| }); | |
| // Chat messages | |
| socket.on("chatMessage", (data: { content: string }) => { | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room) { | |
| const player = room.players[socket.id]; | |
| io.to(room.id).emit("chatMessage", { | |
| author: player?.nickname || "Unknown", | |
| content: data.content, | |
| playerId: socket.id | |
| }); | |
| } | |
| }); | |
| // Handle disconnection | |
| socket.on("disconnect", () => { | |
| console.log(`Client disconnected: ${socket.id}`); | |
| const room = gameManager.getPlayerRoom(socket.id); | |
| if (room) { | |
| gameManager.leaveRoom(room.id, socket.id); | |
| socket.to(room.id).emit("playerDisconnected", { | |
| playerId: socket.id | |
| }); | |
| } | |
| }); | |
| } | |