diff --git a/apps/client/src/app.tsx b/apps/client/src/app.tsx index e87e372..0704e9d 100644 --- a/apps/client/src/app.tsx +++ b/apps/client/src/app.tsx @@ -6,13 +6,14 @@ import { LobbyScene } from "./scenes/LobbyScene"; import { GameScene } from "./scenes/GameScene"; -import { roomTypes } from "@repo/shared"; +import { GameState } from "@repo/shared"; +import type { GameStateType, Room } from "@repo/shared"; export default function App() { // 現在シーン状態 - const [gameState, setGameState] = useState(roomTypes.GameState.TITLE); + const [gameState, setGameState] = useState(GameState.TITLE); // 参加中ルーム情報 - const [room, setRoom] = useState(null); + const [room, setRoom] = useState(null); // 自身ソケットID const [myId, setMyId] = useState(null); @@ -21,18 +22,18 @@ socketClient.onConnect((id) => setMyId(id)); socketClient.onRoomUpdate((updatedRoom) => { setRoom(updatedRoom); - setGameState(roomTypes.GameState.LOBBY); + setGameState(GameState.LOBBY); }); - socketClient.onGameStart(() => setGameState(roomTypes.GameState.PLAYING)); + socketClient.onGameStart(() => setGameState(GameState.PLAYING)); }, []); // タイトル画面分岐 - if (gameState === roomTypes.GameState.TITLE) { + if (gameState === GameState.TITLE) { return socketClient.joinRoom(payload.roomId, payload.playerName)} />; } // ロビー画面分岐 - if (gameState === roomTypes.GameState.LOBBY) { + if (gameState === GameState.LOBBY) { return socketClient.startGame()} />; } diff --git a/apps/server/src/domains/game/GameHandler.ts b/apps/server/src/domains/game/GameHandler.ts index df6fa26..feb2702 100644 --- a/apps/server/src/domains/game/GameHandler.ts +++ b/apps/server/src/domains/game/GameHandler.ts @@ -1,7 +1,7 @@ import { Server, Socket } from "socket.io"; import { GameManager } from "./GameManager"; import { RoomManager } from "../room/RoomManager"; -import { protocol, roomTypes } from "@repo/shared"; +import { protocol, RoomStatus } from "@repo/shared"; import type { playerTypes } from "@repo/shared"; export const registerGameHandlers = (io: Server, socket: Socket, gameManager: GameManager, roomManager: RoomManager) => { @@ -16,7 +16,7 @@ const room = roomManager.getRoomByOwnerId(socket.id); if (room) { - room.status = roomTypes.RoomStatus.PLAYING; + room.status = RoomStatus.PLAYING; const playerIds = room.players.map((p: { id: string }) => p.id); @@ -45,7 +45,7 @@ // 3分経過時に GameLoop から呼ばれる処理 console.log(`[GameHandler] ルーム ${room.roomId} のゲームが終了しました (3分経過)`); io.to(room.roomId).emit(protocol.SocketEvents.GAME_END); // クライアントへ終了通知 - room.status = roomTypes.RoomStatus.WAITING; // ルーム状態を待機に戻す + room.status = RoomStatus.WAITING; // ルーム状態を待機に戻す } ); diff --git a/apps/server/src/domains/room/RoomManager.ts b/apps/server/src/domains/room/RoomManager.ts index 7bc61c6..b9aaab7 100644 --- a/apps/server/src/domains/room/RoomManager.ts +++ b/apps/server/src/domains/room/RoomManager.ts @@ -1,23 +1,24 @@ -import { roomTypes, config } from "@repo/shared"; +import { RoomStatus, config } from "@repo/shared"; +import type { Room, RoomMember } from "@repo/shared"; export class RoomManager { - private rooms: Map = new Map(); + private rooms: Map = new Map(); // ルームにプレイヤーを追加(なければ作成) - public addPlayerToRoom(roomId: string, socketId: string, playerName: string): roomTypes.Room { + public addPlayerToRoom(roomId: string, socketId: string, playerName: string): Room { let room = this.rooms.get(roomId); if (!room) { room = { roomId: roomId, ownerId: socketId, players: [], - status: roomTypes.RoomStatus.WAITING, + status: RoomStatus.WAITING, maxPlayers: config.GAME_CONFIG.MAX_PLAYERS_PER_ROOM }; this.rooms.set(roomId, room); } - const newPlayer: roomTypes.RoomMember = { + const newPlayer: RoomMember = { id: socketId, name: playerName, isOwner: room.ownerId === socketId, @@ -29,8 +30,8 @@ } // プレイヤーをルームから削除し、更新があったルームの配列を返す - public removePlayer(socketId: string): roomTypes.Room[] { - const updatedRooms: roomTypes.Room[] = []; + public removePlayer(socketId: string): Room[] { + const updatedRooms: Room[] = []; for (const [roomId, room] of this.rooms.entries()) { const playerIndex = room.players.findIndex(p => p.id === socketId); @@ -54,7 +55,7 @@ } // オーナーIDからルームを取得 - public getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined { + public getRoomByOwnerId(ownerId: string): Room | undefined { for (const room of this.rooms.values()) { if (room.ownerId === ownerId) { return room; diff --git a/packages/shared/src/domains/room/room.const.ts b/packages/shared/src/domains/room/room.const.ts new file mode 100644 index 0000000..a4a757f --- /dev/null +++ b/packages/shared/src/domains/room/room.const.ts @@ -0,0 +1,15 @@ +import type { GameState as GameStateType, RoomStatus as RoomStatusType } from "./room.type"; + +// クライアント画面遷移利用ゲーム状態の値 +export const GameState = { + TITLE: "title", + LOBBY: "lobby", + PLAYING: "playing", +} as const satisfies Record; + +// ルーム進行フェーズ状態の値 +export const RoomStatus = { + WAITING: "waiting", + PLAYING: "playing", + RESULT: "result", +} as const satisfies Record; diff --git a/packages/shared/src/domains/room/room.type.ts b/packages/shared/src/domains/room/room.type.ts index 9f88187..e97dd65 100644 --- a/packages/shared/src/domains/room/room.type.ts +++ b/packages/shared/src/domains/room/room.type.ts @@ -1,18 +1,8 @@ // クライアント画面遷移利用ゲーム状態型 -export const GameState = { - TITLE: 'title', - LOBBY: 'lobby', - PLAYING: 'playing', -} as const; -export type GameState = typeof GameState[keyof typeof GameState]; +export type GameState = "title" | "lobby" | "playing"; // ルーム進行フェーズ状態型 -export const RoomStatus = { - WAITING: 'waiting', - PLAYING: 'playing', - RESULT: 'result', -} as const; -export type RoomStatus = typeof RoomStatus[keyof typeof RoomStatus]; +export type RoomStatus = "waiting" | "playing" | "result"; // ルーム所属プレイヤー情報型 export interface RoomMember { diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 24c70f6..58a3d16 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -3,5 +3,13 @@ export * as gridMapLogic from "./domains/gridMap/gridMap.logic"; export * as playerTypes from "./domains/player/player.type"; export * as roomTypes from "./domains/room/room.type"; +export { GameState, RoomStatus } from "./domains/room/room.const"; +export type { + GameState as GameStateType, + RoomStatus as RoomStatusType, + Room, + RoomMember, + JoinRoomPayload, +} from "./domains/room/room.type"; export * as protocol from "./protocol/events"; export * as config from "./config/gameConfig"; \ No newline at end of file