diff --git a/apps/client/src/network/handlers/GameHandler.ts b/apps/client/src/network/handlers/GameHandler.ts index 0360d91..783f994 100644 --- a/apps/client/src/network/handlers/GameHandler.ts +++ b/apps/client/src/network/handlers/GameHandler.ts @@ -5,20 +5,25 @@ */ import type { Socket } from "socket.io-client"; import { protocol } from "@repo/shared"; -import type { playerTypes, gridMapTypes, UpdatePlayersPayload } from "@repo/shared"; +import type { + playerTypes, + CurrentPlayersPayload, + UpdateMapCellsPayload, + UpdatePlayersPayload, +} from "@repo/shared"; /** ゲームシーンが利用するソケット操作の契約 */ export type GameHandler = { - onCurrentPlayers: (callback: (players: playerTypes.PlayerData[] | Record) => void) => void; - offCurrentPlayers: (callback: (players: playerTypes.PlayerData[] | Record) => void) => void; + 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; onUpdatePlayers: (callback: (players: UpdatePlayersPayload) => void) => void; offUpdatePlayers: (callback: (players: UpdatePlayersPayload) => void) => void; onRemovePlayer: (callback: (id: string) => void) => void; offRemovePlayer: (callback: (id: string) => void) => void; - onUpdateMapCells: (callback: (updates: gridMapTypes.CellUpdate[]) => void) => void; - offUpdateMapCells: (callback: (updates: gridMapTypes.CellUpdate[]) => 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; sendMove: (x: number, y: number) => void; diff --git a/apps/client/src/scenes/game/application/GameNetworkSync.ts b/apps/client/src/scenes/game/application/GameNetworkSync.ts index 45b6e07..6a0e349 100644 --- a/apps/client/src/scenes/game/application/GameNetworkSync.ts +++ b/apps/client/src/scenes/game/application/GameNetworkSync.ts @@ -4,7 +4,7 @@ * プレイヤー生成更新削除とマップ更新購読を管理する */ import { Container } from "pixi.js"; -import type { playerTypes } from "@repo/shared"; +import type { playerTypes, CurrentPlayersPayload, UpdateMapCellsPayload } 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"; @@ -27,9 +27,8 @@ private onGameStart: (startTime: number) => void; private isBound = false; - private handleCurrentPlayers = (serverPlayers: playerTypes.PlayerData[] | Record) => { - const playersArray = (Array.isArray(serverPlayers) ? serverPlayers : Object.values(serverPlayers)) as playerTypes.PlayerData[]; - playersArray.forEach((p) => { + private handleCurrentPlayers = (serverPlayers: CurrentPlayersPayload) => { + serverPlayers.forEach((p) => { const playerController = p.id === this.myId ? new LocalPlayerController(p) : new RemotePlayerController(p); this.worldContainer.addChild(playerController.getDisplayObject()); this.players[p.id] = playerController; @@ -70,7 +69,7 @@ } }; - private handleUpdateMapCells = (updates: Parameters[0]) => { + private handleUpdateMapCells = (updates: UpdateMapCellsPayload) => { this.gameMap.updateCells(updates); }; diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 617d04b..6708616 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -2,7 +2,14 @@ * gameUseCasePorts * ゲーム系ユースケースが利用する入力ポートと出力ポートの契約を定義する */ -import type { gameTypes, gridMapTypes, playerTypes, roomTypes, UpdatePlayersPayload } from "@repo/shared"; +import type { + gameTypes, + playerTypes, + roomTypes, + CurrentPlayersPayload, + UpdateMapCellsPayload, + UpdatePlayersPayload, +} from "@repo/shared"; /** ゲーム開始ユースケースが利用するゲーム管理入力ポート */ export interface StartGamePort { @@ -52,11 +59,11 @@ ): void; publishMapCellUpdatesToRoom( roomId: roomTypes.Room["roomId"], - cellUpdates: gridMapTypes.CellUpdate[] + cellUpdates: UpdateMapCellsPayload ): void; publishGameEndToRoom(roomId: roomTypes.Room["roomId"]): void; publishGameStartToRoom(roomId: roomTypes.Room["roomId"], payload: { startTime: number }): void; - publishCurrentPlayersToSocket(players: playerTypes.PlayerData[]): void; + publishCurrentPlayersToSocket(players: CurrentPlayersPayload): void; publishGameStartToSocket(payload: { startTime: number }): void; publishPlayerRemovedToRoom(roomId: roomTypes.Room["roomId"], removedPlayerId: string): void; } diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index 58310c4..d152965 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -4,7 +4,13 @@ */ import { Server } from "socket.io"; import { protocol } from "@repo/shared"; -import type { gridMapTypes, playerTypes, roomTypes, UpdatePlayersPayload } from "@repo/shared"; +import type { + playerTypes, + roomTypes, + CurrentPlayersPayload, + UpdateMapCellsPayload, + UpdatePlayersPayload, +} from "@repo/shared"; import type { GameOutputPort } from "@server/domains/game/application/ports/gameUseCasePorts"; import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; @@ -13,8 +19,6 @@ type SocketId = playerTypes.PlayerData["id"]; type PongPayload = { clientTime: number; serverTime: number }; type GameStartPayload = { startTime: number }; -type CurrentPlayersPayload = playerTypes.PlayerData[]; -type MapCellUpdatesPayload = gridMapTypes.CellUpdate[]; /** ゲーム出力アダプターのインターフェース */ export type GameOutputAdapter = Omit; @@ -31,7 +35,7 @@ publishUpdatePlayersToRoom: (roomId: RoomId, players: UpdatePlayersPayload) => { common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_PLAYERS, players); }, - publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: MapCellUpdatesPayload) => { + publishMapCellUpdatesToRoom: (roomId: RoomId, cellUpdates: UpdateMapCellsPayload) => { common.emitToRoom(roomId, protocol.SocketEvents.UPDATE_MAP_CELLS, cellUpdates); }, publishGameEndToRoom: (roomId: RoomId) => { diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 48c6e17..4f3646a 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -8,5 +8,9 @@ export * as roomTypes from "./domains/room/room.type"; export * as roomConsts from "./domains/room/room.const"; export * as protocol from "./protocol/events"; -export type { UpdatePlayersPayload } from "./protocol/events"; +export type { + CurrentPlayersPayload, + UpdateMapCellsPayload, + UpdatePlayersPayload, +} from "./protocol/events"; export * as config from "./config"; \ No newline at end of file diff --git a/packages/shared/src/protocol/events.ts b/packages/shared/src/protocol/events.ts index 28a710f..d64eb18 100644 --- a/packages/shared/src/protocol/events.ts +++ b/packages/shared/src/protocol/events.ts @@ -36,3 +36,9 @@ /** UPDATE_PLAYERS イベントで送受信するプレイヤー差分配列 */ export type UpdatePlayersPayload = TickData["playerUpdates"]; + +/** CURRENT_PLAYERS イベントで送受信するプレイヤー一覧 */ +export type CurrentPlayersPayload = TickData["playerUpdates"]; + +/** UPDATE_MAP_CELLS イベントで送受信するマップ差分配列 */ +export type UpdateMapCellsPayload = TickData["cellUpdates"];