diff --git a/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts new file mode 100644 index 0000000..1db69d0 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/disconnectUseCase.ts @@ -0,0 +1,20 @@ +import { protocol } from "@repo/shared"; +import type { DisconnectPlayerPort } from "../ports/gameUseCasePorts"; + +type EmitToAll = (event: string, payload?: unknown) => void; + +type DisconnectUseCaseParams = { + gameManager: DisconnectPlayerPort; + playerId: string; + emitToAll: EmitToAll; +}; + +export const disconnectUseCase = ({ + gameManager, + playerId, + emitToAll, +}: DisconnectUseCaseParams) => { + gameManager.removePlayer(playerId); + emitToAll(protocol.SocketEvents.REMOVE_PLAYER, playerId); + console.log("[GameHandler] player removed", { playerId }); +}; diff --git a/apps/server/src/domains/game/application/useCases/executeDisconnectUseCase.ts b/apps/server/src/domains/game/application/useCases/executeDisconnectUseCase.ts deleted file mode 100644 index 1db69d0..0000000 --- a/apps/server/src/domains/game/application/useCases/executeDisconnectUseCase.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { protocol } from "@repo/shared"; -import type { DisconnectPlayerPort } from "../ports/gameUseCasePorts"; - -type EmitToAll = (event: string, payload?: unknown) => void; - -type DisconnectUseCaseParams = { - gameManager: DisconnectPlayerPort; - playerId: string; - emitToAll: EmitToAll; -}; - -export const disconnectUseCase = ({ - gameManager, - playerId, - emitToAll, -}: DisconnectUseCaseParams) => { - gameManager.removePlayer(playerId); - emitToAll(protocol.SocketEvents.REMOVE_PLAYER, playerId); - console.log("[GameHandler] player removed", { playerId }); -}; diff --git a/apps/server/src/domains/game/application/useCases/executeMovePlayerUseCase.ts b/apps/server/src/domains/game/application/useCases/executeMovePlayerUseCase.ts deleted file mode 100644 index 9bcece1..0000000 --- a/apps/server/src/domains/game/application/useCases/executeMovePlayerUseCase.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { playerTypes } from "@repo/shared"; -import type { MovePlayerPort } from "../ports/gameUseCasePorts"; - -type MovePlayerUseCaseParams = { - gameManager: MovePlayerPort; - playerId: string; - move: playerTypes.MovePayload; -}; - -export const movePlayerUseCase = ({ - gameManager, - playerId, - move, -}: MovePlayerUseCaseParams) => { - gameManager.movePlayer(playerId, move.x, move.y); -}; diff --git a/apps/server/src/domains/game/application/useCases/executePingUseCase.ts b/apps/server/src/domains/game/application/useCases/executePingUseCase.ts deleted file mode 100644 index 0ef9f54..0000000 --- a/apps/server/src/domains/game/application/useCases/executePingUseCase.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { protocol } from "@repo/shared"; - -type EmitToSocket = (event: string, payload?: unknown) => void; - -type PingUseCaseParams = { - clientTime: number; - emitToSocket: EmitToSocket; -}; - -export const pingUseCase = ({ - clientTime, - emitToSocket, -}: PingUseCaseParams) => { - emitToSocket(protocol.SocketEvents.PONG, { - clientTime, - serverTime: Date.now(), - }); -}; diff --git a/apps/server/src/domains/game/application/useCases/executeReadyForGameUseCase.ts b/apps/server/src/domains/game/application/useCases/executeReadyForGameUseCase.ts deleted file mode 100644 index 92ab796..0000000 --- a/apps/server/src/domains/game/application/useCases/executeReadyForGameUseCase.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { protocol } from "@repo/shared"; -import type { ReadyForGamePort } from "../ports/gameUseCasePorts"; - -type EmitToSocket = (event: string, payload?: unknown) => void; - -type ReadyForGameUseCaseParams = { - socketId: string; - roomId?: string; - gameManager: ReadyForGamePort; - emitToSocket: EmitToSocket; -}; - -export const readyForGameUseCase = ({ - socketId, - roomId, - gameManager, - emitToSocket, -}: ReadyForGameUseCaseParams) => { - const allPlayers = gameManager.getAllPlayers(); - emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, allPlayers); - - console.log("[GameHandler] READY_FOR_GAME received", { - socketId, - totalPlayers: allPlayers.length, - }); - - if (!roomId) { - console.log("[GameHandler] READY_FOR_GAME missing roomId", { socketId }); - return; - } - - const startTime = gameManager.getRoomStartTime(roomId); - if (!startTime) { - return; - } - - emitToSocket(protocol.SocketEvents.GAME_START, { startTime }); - console.log("[GameHandler] GAME_START sent to ready client", { - socketId, - roomId, - startTime, - }); -}; diff --git a/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts b/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts deleted file mode 100644 index 41b2772..0000000 --- a/apps/server/src/domains/game/application/useCases/executeStartGameUseCase.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { protocol, roomConsts } from "@repo/shared"; -import { RoomManager } from "@server/domains/room/RoomManager"; -import type { StartGamePort } from "../ports/gameUseCasePorts"; - -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - -type StartGameUseCaseParams = { - ownerId: string; - gameManager: StartGamePort; - roomManager: RoomManager; - emitToRoom: EmitToRoom; -}; - -export const startGameUseCase = ({ - ownerId, - gameManager, - roomManager, - emitToRoom, -}: StartGameUseCaseParams) => { - 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/application/useCases/movePlayerUseCase.ts b/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts new file mode 100644 index 0000000..9bcece1 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/movePlayerUseCase.ts @@ -0,0 +1,16 @@ +import type { playerTypes } from "@repo/shared"; +import type { MovePlayerPort } from "../ports/gameUseCasePorts"; + +type MovePlayerUseCaseParams = { + gameManager: MovePlayerPort; + playerId: string; + move: playerTypes.MovePayload; +}; + +export const movePlayerUseCase = ({ + gameManager, + playerId, + move, +}: MovePlayerUseCaseParams) => { + gameManager.movePlayer(playerId, move.x, move.y); +}; diff --git a/apps/server/src/domains/game/application/useCases/pingUseCase.ts b/apps/server/src/domains/game/application/useCases/pingUseCase.ts new file mode 100644 index 0000000..0ef9f54 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/pingUseCase.ts @@ -0,0 +1,18 @@ +import { protocol } from "@repo/shared"; + +type EmitToSocket = (event: string, payload?: unknown) => void; + +type PingUseCaseParams = { + clientTime: number; + emitToSocket: EmitToSocket; +}; + +export const pingUseCase = ({ + clientTime, + emitToSocket, +}: PingUseCaseParams) => { + emitToSocket(protocol.SocketEvents.PONG, { + clientTime, + serverTime: Date.now(), + }); +}; diff --git a/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts new file mode 100644 index 0000000..92ab796 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/readyForGameUseCase.ts @@ -0,0 +1,43 @@ +import { protocol } from "@repo/shared"; +import type { ReadyForGamePort } from "../ports/gameUseCasePorts"; + +type EmitToSocket = (event: string, payload?: unknown) => void; + +type ReadyForGameUseCaseParams = { + socketId: string; + roomId?: string; + gameManager: ReadyForGamePort; + emitToSocket: EmitToSocket; +}; + +export const readyForGameUseCase = ({ + socketId, + roomId, + gameManager, + emitToSocket, +}: ReadyForGameUseCaseParams) => { + const allPlayers = gameManager.getAllPlayers(); + emitToSocket(protocol.SocketEvents.CURRENT_PLAYERS, allPlayers); + + console.log("[GameHandler] READY_FOR_GAME received", { + socketId, + totalPlayers: allPlayers.length, + }); + + if (!roomId) { + console.log("[GameHandler] READY_FOR_GAME missing roomId", { socketId }); + return; + } + + const startTime = gameManager.getRoomStartTime(roomId); + if (!startTime) { + return; + } + + emitToSocket(protocol.SocketEvents.GAME_START, { startTime }); + console.log("[GameHandler] GAME_START sent to ready client", { + socketId, + roomId, + startTime, + }); +}; diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts new file mode 100644 index 0000000..41b2772 --- /dev/null +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -0,0 +1,66 @@ +import { protocol, roomConsts } from "@repo/shared"; +import { RoomManager } from "@server/domains/room/RoomManager"; +import type { StartGamePort } from "../ports/gameUseCasePorts"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type StartGameUseCaseParams = { + ownerId: string; + gameManager: StartGamePort; + roomManager: RoomManager; + emitToRoom: EmitToRoom; +}; + +export const startGameUseCase = ({ + ownerId, + gameManager, + roomManager, + emitToRoom, +}: StartGameUseCaseParams) => { + 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/room/application/useCases/executeJoinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/executeJoinRoomUseCase.ts deleted file mode 100644 index 2123b35..0000000 --- a/apps/server/src/domains/room/application/useCases/executeJoinRoomUseCase.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { protocol } from "@repo/shared"; -import type { roomTypes } from "@repo/shared"; -import type { JoinRoomPort } from "../ports/roomUseCasePorts"; - -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - -type JoinRoomUseCaseParams = { - roomManager: JoinRoomPort; - socketId: string; - data: roomTypes.JoinRoomPayload; - emitToRoom: EmitToRoom; -}; - -export const joinRoomUseCase = ({ - roomManager, - socketId, - data, - emitToRoom, -}: JoinRoomUseCaseParams) => { - const { roomId, playerName } = data; - console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId, playerName }); - - const room = roomManager.addPlayerToRoom(roomId, socketId, playerName); - - emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); - console.log("[RoomHandler] ROOM_UPDATE emitted", { - roomId, - ownerId: room.ownerId, - totalPlayers: room.players.length, - }); -}; diff --git a/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts deleted file mode 100644 index be33326..0000000 --- a/apps/server/src/domains/room/application/useCases/executeRoomDisconnectUseCase.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { protocol } from "@repo/shared"; -import type { DisconnectRoomPort } from "../ports/roomUseCasePorts"; - -type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; - -type RoomDisconnectUseCaseParams = { - roomManager: DisconnectRoomPort; - socketId: string; - emitToRoom: EmitToRoom; -}; - -export const roomDisconnectUseCase = ({ - roomManager, - socketId, - emitToRoom, -}: RoomDisconnectUseCaseParams) => { - const updatedRooms = roomManager.removePlayer(socketId); - console.log("[RoomHandler] disconnect cleanup", { - socketId, - updatedRoomCount: updatedRooms.length, - }); - - updatedRooms.forEach((room) => { - emitToRoom(room.roomId, protocol.SocketEvents.ROOM_UPDATE, room); - console.log("[RoomHandler] ROOM_UPDATE emitted", { - roomId: room.roomId, - ownerId: room.ownerId, - totalPlayers: room.players.length, - }); - }); -}; diff --git a/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts new file mode 100644 index 0000000..2123b35 --- /dev/null +++ b/apps/server/src/domains/room/application/useCases/joinRoomUseCase.ts @@ -0,0 +1,31 @@ +import { protocol } from "@repo/shared"; +import type { roomTypes } from "@repo/shared"; +import type { JoinRoomPort } from "../ports/roomUseCasePorts"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type JoinRoomUseCaseParams = { + roomManager: JoinRoomPort; + socketId: string; + data: roomTypes.JoinRoomPayload; + emitToRoom: EmitToRoom; +}; + +export const joinRoomUseCase = ({ + roomManager, + socketId, + data, + emitToRoom, +}: JoinRoomUseCaseParams) => { + const { roomId, playerName } = data; + console.log("[RoomHandler] JOIN_ROOM received", { roomId, socketId, playerName }); + + const room = roomManager.addPlayerToRoom(roomId, socketId, playerName); + + emitToRoom(roomId, protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length, + }); +}; diff --git a/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts new file mode 100644 index 0000000..be33326 --- /dev/null +++ b/apps/server/src/domains/room/application/useCases/roomDisconnectUseCase.ts @@ -0,0 +1,31 @@ +import { protocol } from "@repo/shared"; +import type { DisconnectRoomPort } from "../ports/roomUseCasePorts"; + +type EmitToRoom = (roomId: string, event: string, payload?: unknown) => void; + +type RoomDisconnectUseCaseParams = { + roomManager: DisconnectRoomPort; + socketId: string; + emitToRoom: EmitToRoom; +}; + +export const roomDisconnectUseCase = ({ + roomManager, + socketId, + emitToRoom, +}: RoomDisconnectUseCaseParams) => { + const updatedRooms = roomManager.removePlayer(socketId); + console.log("[RoomHandler] disconnect cleanup", { + socketId, + updatedRoomCount: updatedRooms.length, + }); + + updatedRooms.forEach((room) => { + emitToRoom(room.roomId, protocol.SocketEvents.ROOM_UPDATE, room); + console.log("[RoomHandler] ROOM_UPDATE emitted", { + roomId: room.roomId, + ownerId: room.ownerId, + totalPlayers: room.players.length, + }); + }); +};