Spaces:
Running
Running
File size: 4,395 Bytes
466436b 502af73 466436b 502af73 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
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
});
}
});
}
|