diff --git a/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts b/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts new file mode 100644 index 0000000..760cb58 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts @@ -0,0 +1,66 @@ +import { protocol, roomConsts } from "@repo/shared"; +import { GameManager } from "@server/domains/game/GameManager"; +import { RoomManager } from "@server/domains/room/RoomManager"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type ExecuteStartGameUseCaseParams = { + ownerId: string; + gameManager: GameManager; + roomManager: RoomManager; + emitToRoom: EmitToRoom; +}; + +export const executeStartGameUseCase = ({ + ownerId, + gameManager, + roomManager, + emitToRoom, +}: ExecuteStartGameUseCaseParams) => { + const room = roomManager.getRoomByOwnerId(ownerId); + if (!room) { + console.log("[GameHandler] START_GAME ignored (no room)", { socketId: ownerId }); + return; + } + + if (room.status === roomConsts.RoomPhase.PLAYING) { + console.log("[GameHandler] START_GAME ignored (already playing)", { roomId: room.roomId }); + return; + } + + console.log("[GameHandler] START_GAME accepted", { + roomId: room.roomId, + ownerId, + totalPlayers: room.players.length, + }); + + room.status = roomConsts.RoomPhase.PLAYING; + + const playerIds = room.players.map((p: { id: string }) => p.id); + + room.players.forEach((p: { id: string }) => { + gameManager.addPlayer(p.id); + }); + + gameManager.startGameLoop( + room.roomId, + playerIds, + (tickData) => { + tickData.players.forEach((playerData) => { + emitToRoom(room.roomId, protocol.SocketEvents.UPDATE_PLAYER, playerData); + }); + + if (tickData.cellUpdates.length > 0) { + emitToRoom(room.roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, tickData.cellUpdates); + } + }, + () => { + console.log(`[GameHandler] ルーム ${room.roomId} のゲームが終了しました (3分経過)`); + emitToRoom(room.roomId, protocol.SocketEvents.GAME_END); + room.status = roomConsts.RoomPhase.WAITING; + } + ); + + const startTime = gameManager.getRoomStartTime(room.roomId) || Date.now(); + emitToRoom(room.roomId, protocol.SocketEvents.GAME_START, { startTime }); +}; diff --git a/apps/server/src/domains/game/handlers/onStartGame.ts b/apps/server/src/domains/game/handlers/onStartGame.ts index e27d612..3b759f3 100644 --- a/apps/server/src/domains/game/handlers/onStartGame.ts +++ b/apps/server/src/domains/game/handlers/onStartGame.ts @@ -1,7 +1,7 @@ import { Server } from "socket.io"; import { GameManager } from "@server/domains/game/GameManager"; import { RoomManager } from "@server/domains/room/RoomManager"; -import { protocol, roomConsts } from "@repo/shared"; +import { executeStartGameUseCase } from "@server/domains/game/application/useCases/executeStartGameUseCase"; export const onStartGame = ( io: Server, @@ -9,50 +9,17 @@ roomManager: RoomManager, ownerId: string ) => { - const room = roomManager.getRoomByOwnerId(ownerId); - if (!room) { - console.log("[GameHandler] START_GAME ignored (no room)", { socketId: ownerId }); - return; - } - - if (room.status === roomConsts.RoomPhase.PLAYING) { - console.log("[GameHandler] START_GAME ignored (already playing)", { roomId: room.roomId }); - return; - } - - console.log("[GameHandler] START_GAME accepted", { - roomId: room.roomId, + executeStartGameUseCase({ ownerId, - totalPlayers: room.players.length, - }); - - room.status = roomConsts.RoomPhase.PLAYING; - - const playerIds = room.players.map((p: { id: string }) => p.id); - - room.players.forEach((p: { id: string }) => { - gameManager.addPlayer(p.id); - }); - - gameManager.startGameLoop( - room.roomId, - playerIds, - (tickData) => { - tickData.players.forEach((playerData) => { - io.to(room.roomId).emit(protocol.SocketEvents.UPDATE_PLAYER, playerData); - }); - - if (tickData.cellUpdates.length > 0) { - io.to(room.roomId).emit(protocol.SocketEvents.UPDATE_MAP_CELLS, tickData.cellUpdates); + gameManager, + roomManager, + emitToRoom: (roomId, event, payload) => { + if (payload === undefined) { + io.to(roomId).emit(event); + return; } - }, - () => { - console.log(`[GameHandler] ルーム ${room.roomId} のゲームが終了しました (3分経過)`); - io.to(room.roomId).emit(protocol.SocketEvents.GAME_END); - room.status = roomConsts.RoomPhase.WAITING; - } - ); - const startTime = gameManager.getRoomStartTime(room.roomId) || Date.now(); - io.to(room.roomId).emit(protocol.SocketEvents.GAME_START, { startTime }); + io.to(roomId).emit(event, payload); + }, + }); };