diff --git a/apps/server/src/domains/game/GameHandler.ts b/apps/server/src/domains/game/GameHandler.ts index feb2702..98a7f8f 100644 --- a/apps/server/src/domains/game/GameHandler.ts +++ b/apps/server/src/domains/game/GameHandler.ts @@ -14,7 +14,22 @@ // ゲーム開始要求処理 socket.on(protocol.SocketEvents.START_GAME, () => { const room = roomManager.getRoomByOwnerId(socket.id); - + if (!room) { + console.log("[GameHandler] START_GAME ignored (no room)", { socketId: socket.id }); + return; + } + + if (room.status === RoomStatus.PLAYING) { + console.log("[GameHandler] START_GAME ignored (already playing)", { roomId: room.roomId }); + return; + } + + console.log("[GameHandler] START_GAME accepted", { + roomId: room.roomId, + ownerId: socket.id, + totalPlayers: room.players.length + }); + if (room) { room.status = RoomStatus.PLAYING; @@ -59,6 +74,7 @@ socket.on(protocol.SocketEvents.READY_FOR_GAME, () => { const allPlayers = gameManager.getAllPlayers(); socket.emit(protocol.SocketEvents.CURRENT_PLAYERS, allPlayers); + console.log("[GameHandler] READY_FOR_GAME received", { socketId: socket.id, totalPlayers: allPlayers.length }); // 準備が完了したクライアントに対して、改めて開始時刻を個別に教える // Socket.ioの仕様上、socket.roomsには自身のIDと参加中のルームIDが含まれるため、そこからルームIDを特定する @@ -68,7 +84,10 @@ if (startTime) { // io.to() による全員への一斉送信ではなく、socket.emit() でこの本人にだけ送る socket.emit(protocol.SocketEvents.GAME_START, { startTime }); + console.log("[GameHandler] GAME_START sent to ready client", { socketId: socket.id, roomId, startTime }); } + } else { + console.log("[GameHandler] READY_FOR_GAME missing roomId", { socketId: socket.id }); } }); @@ -87,4 +106,5 @@ gameManager.removePlayer(playerId); // 全体にプレイヤー削除を通知 io.emit(protocol.SocketEvents.REMOVE_PLAYER, playerId); + console.log("[GameHandler] player removed", { playerId }); }; \ No newline at end of file diff --git a/apps/server/src/domains/game/GameManager.ts b/apps/server/src/domains/game/GameManager.ts index 4e762af..49a5fd4 100644 --- a/apps/server/src/domains/game/GameManager.ts +++ b/apps/server/src/domains/game/GameManager.ts @@ -30,12 +30,18 @@ player.x = config.GAME_CONFIG.MAP_WIDTH / 2; player.y = config.GAME_CONFIG.MAP_HEIGHT / 2; this.players.set(id, player); + console.log("[GameManager] player added", { playerId: id, totalPlayers: this.players.size }); return player; } // プレイヤー登録解除処理 removePlayer(id: string) { - this.players.delete(id); + const existed = this.players.delete(id); + if (existed) { + console.log("[GameManager] player removed", { playerId: id, totalPlayers: this.players.size }); + } else { + console.log("[GameManager] player remove ignored (not found)", { playerId: id }); + } } // 指定IDプレイヤー参照取得 @@ -54,6 +60,8 @@ } player.x = x; player.y = y; + } else { + console.log("[GameManager] move ignored (player not found)", { playerId: id }); } } @@ -69,7 +77,10 @@ onTick: (data: TickData) => void, onGameEnd: () => void ) { - if (this.gameLoops.has(roomId)) return; + if (this.gameLoops.has(roomId)) { + console.log("[GameManager] startGameLoop ignored (already running)", { roomId }); + return; + } const tickRate = config.GAME_CONFIG.PLAYER_POSITION_UPDATE_MS; @@ -94,6 +105,7 @@ loop.start(); this.gameLoops.set(roomId, loop); + console.log("[GameManager] game loop started", { roomId, playerCount: playerIds.length }); } /** @@ -105,6 +117,9 @@ loop.stop(); this.gameLoops.delete(roomId); this.roomStartTimes.delete(roomId); // 停止時も忘れずクリア + console.log("[GameManager] game loop stopped", { roomId }); + } else { + console.log("[GameManager] stopGameLoop ignored (not running)", { roomId }); } } diff --git a/apps/server/src/domains/room/RoomHandler.ts b/apps/server/src/domains/room/RoomHandler.ts index 089ac9c..91f4dec 100644 --- a/apps/server/src/domains/room/RoomHandler.ts +++ b/apps/server/src/domains/room/RoomHandler.ts @@ -7,6 +7,7 @@ socket.on(protocol.SocketEvents.JOIN_ROOM, (data: roomTypes.JoinRoomPayload) => { const { roomId, playerName } = data; + console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId: socket.id, playerName }); socket.join(roomId); @@ -15,6 +16,11 @@ // ルーム内全員向け最新状態配信 io.to(roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length + }); }); }; @@ -25,9 +31,18 @@ export const handleRoomDisconnect = (io: Server, socket: Socket, roomManager: RoomManager) => { // ルームからの除外処理 const updatedRooms = roomManager.removePlayer(socket.id); + console.log("[RoomHandler] disconnect cleanup", { + socketId: socket.id, + updatedRoomCount: updatedRooms.length + }); // 更新があったルーム(オーナー変更など)にのみ通知を飛ばす updatedRooms.forEach(room => { io.to(room.roomId).emit(protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId: room.roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length + }); }); }; \ No newline at end of file diff --git a/apps/server/src/domains/room/RoomManager.ts b/apps/server/src/domains/room/RoomManager.ts index b9aaab7..efe0b7b 100644 --- a/apps/server/src/domains/room/RoomManager.ts +++ b/apps/server/src/domains/room/RoomManager.ts @@ -16,6 +16,7 @@ maxPlayers: config.GAME_CONFIG.MAX_PLAYERS_PER_ROOM }; this.rooms.set(roomId, room); + console.log("[RoomManager] created room", { roomId, ownerId: socketId }); } const newPlayer: RoomMember = { @@ -25,6 +26,12 @@ isReady: false }; room.players.push(newPlayer); + console.log("[RoomManager] player joined", { + roomId, + socketId, + playerName, + totalPlayers: room.players.length + }); return room; } @@ -37,15 +44,25 @@ const playerIndex = room.players.findIndex(p => p.id === socketId); if (playerIndex !== -1) { room.players.splice(playerIndex, 1); + console.log("[RoomManager] player left", { + roomId, + socketId, + totalPlayers: room.players.length + }); if (room.players.length === 0) { // 空ルーム削除 this.rooms.delete(roomId); + console.log("[RoomManager] deleted room", { roomId }); } else { // オーナー切断時所有権移譲処理 if (room.ownerId === socketId) { room.ownerId = room.players[0].id; room.players[0].isOwner = true; + console.log("[RoomManager] transferred ownership", { + roomId, + newOwnerId: room.ownerId + }); } updatedRooms.push(room); }