diff --git a/apps/client/src/app.tsx b/apps/client/src/app.tsx index cbc7aad..f0e529a 100644 --- a/apps/client/src/app.tsx +++ b/apps/client/src/app.tsx @@ -6,18 +6,18 @@ import { LobbyScene } from "./scenes/lobby/LobbyScene"; import { GameScene } from "./scenes/game/GameScene"; -import { ScenePhase } from "@repo/shared"; +import { appConsts } from "@repo/shared"; export default function App() { const { scenePhase, room, myId } = useAppFlow(); // タイトル画面分岐 - if (scenePhase === ScenePhase.TITLE) { + if (scenePhase === appConsts.ScenePhase.TITLE) { return socketClient.joinRoom(payload)} />; } // ロビー画面分岐 - if (scenePhase === ScenePhase.LOBBY) { + if (scenePhase === appConsts.ScenePhase.LOBBY) { return socketClient.startGame()} />; } diff --git a/apps/client/src/hooks/useAppFlow.ts b/apps/client/src/hooks/useAppFlow.ts index b0ee7b3..7280ba7 100644 --- a/apps/client/src/hooks/useAppFlow.ts +++ b/apps/client/src/hooks/useAppFlow.ts @@ -1,26 +1,26 @@ import { useEffect, useState } from "react"; import { socketClient } from "../network/SocketClient"; -import { ScenePhase } from "@repo/shared"; -import type { ScenePhase as ScenePhaseType, Room } from "@repo/shared"; +import { appConsts } from "@repo/shared"; +import type { appTypes, roomTypes } from "@repo/shared"; type AppFlowState = { - scenePhase: ScenePhaseType; - room: Room | null; + scenePhase: appTypes.ScenePhase; + room: roomTypes.Room | null; myId: string | null; }; export const useAppFlow = (): AppFlowState => { - const [scenePhase, setScenePhase] = useState(ScenePhase.TITLE); - const [room, setRoom] = useState(null); + const [scenePhase, setScenePhase] = useState(appConsts.ScenePhase.TITLE); + const [room, setRoom] = useState(null); const [myId, setMyId] = useState(null); useEffect(() => { socketClient.onConnect((id) => setMyId(id)); socketClient.onRoomUpdate((updatedRoom) => { setRoom(updatedRoom); - setScenePhase(ScenePhase.LOBBY); + setScenePhase(appConsts.ScenePhase.LOBBY); }); - socketClient.onGameStart(() => setScenePhase(ScenePhase.PLAYING)); + socketClient.onGameStart(() => setScenePhase(appConsts.ScenePhase.PLAYING)); }, []); return { scenePhase, room, myId }; diff --git a/apps/server/src/domains/game/GameHandler.ts b/apps/server/src/domains/game/GameHandler.ts index c1d5980..2a45b4e 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, RoomPhase } from "@repo/shared"; +import { protocol, roomConsts } from "@repo/shared"; import type { playerTypes } from "@repo/shared"; export const registerGameHandlers = (io: Server, socket: Socket, gameManager: GameManager, roomManager: RoomManager) => { @@ -19,7 +19,7 @@ return; } - if (room.status === RoomPhase.PLAYING) { + if (room.status === roomConsts.RoomPhase.PLAYING) { console.log("[GameHandler] START_GAME ignored (already playing)", { roomId: room.roomId }); return; } @@ -31,7 +31,7 @@ }); if (room) { - room.status = RoomPhase.PLAYING; + room.status = roomConsts.RoomPhase.PLAYING; const playerIds = room.players.map((p: { id: string }) => p.id); @@ -60,7 +60,7 @@ // 3分経過時に GameLoop から呼ばれる処理 console.log(`[GameHandler] ルーム ${room.roomId} のゲームが終了しました (3分経過)`); io.to(room.roomId).emit(protocol.SocketEvents.GAME_END); // クライアントへ終了通知 - room.status = RoomPhase.WAITING; // ルーム状態を待機に戻す + room.status = roomConsts.RoomPhase.WAITING; // ルーム状態を待機に戻す } ); diff --git a/apps/server/src/domains/room/RoomManager.ts b/apps/server/src/domains/room/RoomManager.ts index cfe8358..48832ec 100644 --- a/apps/server/src/domains/room/RoomManager.ts +++ b/apps/server/src/domains/room/RoomManager.ts @@ -1,25 +1,25 @@ -import { RoomPhase, config } from "@repo/shared"; -import type { Room, RoomMember } from "@repo/shared"; +import { roomConsts, config } from "@repo/shared"; +import type { roomTypes } from "@repo/shared"; export class RoomManager { - private rooms: Map = new Map(); + private rooms: Map = new Map(); // ルームにプレイヤーを追加(なければ作成) - public addPlayerToRoom(roomId: string, socketId: string, playerName: string): Room { + public addPlayerToRoom(roomId: string, socketId: string, playerName: string): roomTypes.Room { let room = this.rooms.get(roomId); if (!room) { room = { roomId: roomId, ownerId: socketId, players: [], - status: RoomPhase.WAITING, + status: roomConsts.RoomPhase.WAITING, maxPlayers: config.GAME_CONFIG.MAX_PLAYERS_PER_ROOM }; this.rooms.set(roomId, room); console.log("[RoomManager] created room", { roomId, ownerId: socketId }); } - const newPlayer: RoomMember = { + const newPlayer: roomTypes.RoomMember = { id: socketId, name: playerName, isOwner: room.ownerId === socketId, @@ -37,8 +37,8 @@ } // プレイヤーをルームから削除し、更新があったルームの配列を返す - public removePlayer(socketId: string): Room[] { - const updatedRooms: Room[] = []; + public removePlayer(socketId: string): roomTypes.Room[] { + const updatedRooms: roomTypes.Room[] = []; for (const [roomId, room] of this.rooms.entries()) { const playerIndex = room.players.findIndex(p => p.id === socketId); @@ -72,7 +72,7 @@ } // オーナーIDからルームを取得 - public getRoomByOwnerId(ownerId: string): Room | undefined { + public getRoomByOwnerId(ownerId: string): roomTypes.Room | undefined { for (const room of this.rooms.values()) { if (room.ownerId === ownerId) { return room; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 0464d77..266bcd1 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -3,15 +3,8 @@ export * as gridMapLogic from "./domains/gridMap/gridMap.logic"; export * as playerTypes from "./domains/player/player.type"; export * as appTypes from "./domains/app/app.type"; +export * as appConsts from "./domains/app/app.const"; export * as roomTypes from "./domains/room/room.type"; -export { ScenePhase } from "./domains/app/app.const"; -export { RoomPhase } from "./domains/room/room.const"; -export type { - RoomPhase as RoomPhaseType, - Room, - RoomMember, - JoinRoomPayload, -} from "./domains/room/room.type"; -export type { ScenePhase as ScenePhaseType } from "./domains/app/app.type"; +export * as roomConsts from "./domains/room/room.const"; export * as protocol from "./protocol/events"; export * as config from "./config"; \ No newline at end of file