diff --git a/apps/client/src/network/handlers/GameHandler.ts b/apps/client/src/network/handlers/GameHandler.ts index 783f994..b337cd4 100644 --- a/apps/client/src/network/handlers/GameHandler.ts +++ b/apps/client/src/network/handlers/GameHandler.ts @@ -6,8 +6,10 @@ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; import type { - playerTypes, CurrentPlayersPayload, + GameStartPayload, + NewPlayerPayload, + RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, } from "@repo/shared"; @@ -16,16 +18,16 @@ export type GameHandler = { onCurrentPlayers: (callback: (players: CurrentPlayersPayload) => void) => void; offCurrentPlayers: (callback: (players: CurrentPlayersPayload) => void) => void; - onNewPlayer: (callback: (player: playerTypes.PlayerData) => void) => void; - offNewPlayer: (callback: (player: playerTypes.PlayerData) => void) => void; + onNewPlayer: (callback: (player: NewPlayerPayload) => void) => void; + offNewPlayer: (callback: (player: NewPlayerPayload) => void) => void; onUpdatePlayers: (callback: (players: UpdatePlayersPayload) => void) => void; offUpdatePlayers: (callback: (players: UpdatePlayersPayload) => void) => void; - onRemovePlayer: (callback: (id: string) => void) => void; - offRemovePlayer: (callback: (id: string) => void) => void; + onRemovePlayer: (callback: (id: RemovePlayerPayload) => void) => void; + offRemovePlayer: (callback: (id: RemovePlayerPayload) => void) => void; onUpdateMapCells: (callback: (updates: UpdateMapCellsPayload) => void) => void; offUpdateMapCells: (callback: (updates: UpdateMapCellsPayload) => void) => void; - onGameStart: (callback: (data: { startTime: number }) => void) => void; - offGameStart: (callback: (data: { startTime: number }) => void) => void; + onGameStart: (callback: (data: GameStartPayload) => void) => void; + offGameStart: (callback: (data: GameStartPayload) => void) => void; sendMove: (x: number, y: number) => void; readyForGame: () => void; }; @@ -70,7 +72,7 @@ socket.off(protocol.SocketEvents.GAME_START, callback); }, sendMove: (x, y) => { - const payload: playerTypes.MovePayload = { x, y }; + const payload = { x, y }; socket.emit(protocol.SocketEvents.MOVE, payload); }, readyForGame: () => { diff --git a/apps/client/src/scenes/game/application/GameNetworkSync.ts b/apps/client/src/scenes/game/application/GameNetworkSync.ts index 6a0e349..9a8a245 100644 --- a/apps/client/src/scenes/game/application/GameNetworkSync.ts +++ b/apps/client/src/scenes/game/application/GameNetworkSync.ts @@ -4,7 +4,14 @@ * プレイヤー生成更新削除とマップ更新購読を管理する */ import { Container } from "pixi.js"; -import type { playerTypes, CurrentPlayersPayload, UpdateMapCellsPayload } from "@repo/shared"; +import type { + CurrentPlayersPayload, + GameStartPayload, + NewPlayerPayload, + RemovePlayerPayload, + UpdateMapCellsPayload, + UpdatePlayersPayload, +} from "@repo/shared"; import { socketManager } from "@client/network/SocketManager"; import { LocalPlayerController, RemotePlayerController } from "@client/scenes/game/entities/player/PlayerController"; import { GameMapController } from "@client/scenes/game/entities/map/GameMapController"; @@ -35,20 +42,20 @@ }); }; - private handleNewPlayer = (p: playerTypes.PlayerData) => { + private handleNewPlayer = (p: NewPlayerPayload) => { const playerController = new RemotePlayerController(p); this.worldContainer.addChild(playerController.getDisplayObject()); this.players[p.id] = playerController; }; - private handleGameStart = (data: { startTime: number }) => { + private handleGameStart = (data: GameStartPayload) => { if (data && data.startTime) { this.onGameStart(data.startTime); console.log(`[GameManager] ゲーム開始時刻同期完了: ${data.startTime}`); } }; - private handlePlayerUpdates = (changedPlayers: playerTypes.PlayerData[]) => { + private handlePlayerUpdates = (changedPlayers: UpdatePlayersPayload) => { // UPDATE_PLAYERS は差分のみ届くため,対象IDだけ上書き更新する changedPlayers.forEach((playerData) => { if (playerData.id === this.myId) return; @@ -60,7 +67,7 @@ }); }; - private handleRemovePlayer = (id: string) => { + private handleRemovePlayer = (id: RemovePlayerPayload) => { const target = this.players[id]; if (target) { this.worldContainer.removeChild(target.getDisplayObject()); diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 6708616..fdb544f 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -7,6 +7,8 @@ playerTypes, roomTypes, CurrentPlayersPayload, + GameStartPayload, + RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, } from "@repo/shared"; @@ -62,8 +64,8 @@ cellUpdates: UpdateMapCellsPayload ): void; publishGameEndToRoom(roomId: roomTypes.Room["roomId"]): void; - publishGameStartToRoom(roomId: roomTypes.Room["roomId"], payload: { startTime: number }): void; + publishGameStartToRoom(roomId: roomTypes.Room["roomId"], payload: GameStartPayload): void; publishCurrentPlayersToSocket(players: CurrentPlayersPayload): void; - publishGameStartToSocket(payload: { startTime: number }): void; - publishPlayerRemovedToRoom(roomId: roomTypes.Room["roomId"], removedPlayerId: string): void; + publishGameStartToSocket(payload: GameStartPayload): void; + publishPlayerRemovedToRoom(roomId: roomTypes.Room["roomId"], removedPlayerId: RemovePlayerPayload): void; } diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index d152965..4d92e41 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -5,9 +5,10 @@ import { Server } from "socket.io"; import { protocol } from "@repo/shared"; import type { - playerTypes, + GameStartPayload, roomTypes, CurrentPlayersPayload, + RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, } from "@repo/shared"; @@ -16,9 +17,7 @@ import type { CommonHandlerContext } from "../CommonHandler"; type RoomId = roomTypes.Room["roomId"]; -type SocketId = playerTypes.PlayerData["id"]; type PongPayload = { clientTime: number; serverTime: number }; -type GameStartPayload = { startTime: number }; /** ゲーム出力アダプターのインターフェース */ export type GameOutputAdapter = Omit; @@ -58,7 +57,7 @@ const emitToRoom = createEmitToRoom(io); return { - publishPlayerRemovedToRoom: (roomId: RoomId, removedPlayerId: SocketId) => { + publishPlayerRemovedToRoom: (roomId: RoomId, removedPlayerId: RemovePlayerPayload) => { emitToRoom(roomId, protocol.SocketEvents.REMOVE_PLAYER, removedPlayerId); }, }; diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 4f3646a..6141266 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -10,6 +10,9 @@ export * as protocol from "./protocol/events"; export type { CurrentPlayersPayload, + GameStartPayload, + NewPlayerPayload, + RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, } from "./protocol/events"; diff --git a/packages/shared/src/protocol/events.ts b/packages/shared/src/protocol/events.ts index d64eb18..99a17ff 100644 --- a/packages/shared/src/protocol/events.ts +++ b/packages/shared/src/protocol/events.ts @@ -4,6 +4,7 @@ * クライアントとサーバー間のイベント契約を共有する */ import type { TickData } from "../domains/game/game.type"; +import type { PlayerData } from "../domains/player/player.type"; /** ソケットイベント名の一覧定数 */ export const SocketEvents = { @@ -42,3 +43,12 @@ /** UPDATE_MAP_CELLS イベントで送受信するマップ差分配列 */ export type UpdateMapCellsPayload = TickData["cellUpdates"]; + +/** NEW_PLAYER イベントで送受信するプレイヤー情報 */ +export type NewPlayerPayload = PlayerData; + +/** REMOVE_PLAYER イベントで送受信するプレイヤーID */ +export type RemovePlayerPayload = PlayerData["id"]; + +/** GAME_START イベントで送受信するゲーム開始情報 */ +export type GameStartPayload = { startTime: number };