diff --git a/apps/client/src/scenes/game/GameManager.ts b/apps/client/src/scenes/game/GameManager.ts index 87ff08e..3eaa308 100644 --- a/apps/client/src/scenes/game/GameManager.ts +++ b/apps/client/src/scenes/game/GameManager.ts @@ -4,11 +4,11 @@ * マップ,ネットワーク同期,ゲームループを統合する */ import { Application, Container, Ticker } from "pixi.js"; +import { createBombIdFromPayload } from "@repo/shared"; +import type { BombNetworkPayload } from "@repo/shared"; import { socketManager } from "@client/network/SocketManager"; import { GameMapController } from "./entities/map/GameMapController"; import { BombManager } from "./entities/bomb/BombManager"; -import { createBombIdFromPayload } from "./entities/bomb/BombManager"; -import type { BombUpsertPayload } from "./entities/bomb/BombManager"; import { GameTimer } from "./application/GameTimer"; import { GameNetworkSync } from "./application/GameNetworkSync"; import { GameLoop } from "./application/GameLoop"; @@ -47,8 +47,8 @@ return placed.bombId; } - public upsertBomb(bombId: string, payload: BombUpsertPayload): void { - this.bombManager?.upsertBomb(bombId, payload); + public upsertBombFromNetwork(bombId: string, payload: BombNetworkPayload): void { + this.bombManager?.upsertBombFromNetwork(bombId, payload); } public removeBomb(bombId: string): void { @@ -103,7 +103,7 @@ onGameEnd: this.lockInput.bind(this), onBombPlaced: (payload) => { const bombId = createBombIdFromPayload(payload); - this.upsertBomb(bombId, payload); + this.upsertBombFromNetwork(bombId, payload); }, }); this.networkSync.bind(); diff --git a/apps/client/src/scenes/game/entities/bomb/BombManager.ts b/apps/client/src/scenes/game/entities/bomb/BombManager.ts index 7691fb2..dfd69fb 100644 --- a/apps/client/src/scenes/game/entities/bomb/BombManager.ts +++ b/apps/client/src/scenes/game/entities/bomb/BombManager.ts @@ -5,7 +5,8 @@ */ import type { Container } from "pixi.js"; import { config } from "@client/config"; -import type { BombPlacedPayload } from "@repo/shared"; +import { createBombIdFromPayload } from "@repo/shared"; +import type { BombNetworkPayload } from "@repo/shared"; import { LocalPlayerController } from "@client/scenes/game/entities/player/PlayerController"; import { BombController } from "./BombController"; import type { GamePlayers } from "@client/scenes/game/application/game.types"; @@ -13,20 +14,15 @@ /** 経過時間ミリ秒を返す関数型 */ export type ElapsedMsProvider = () => number; -/** 爆弾の追加更新に使う入力データ型 */ -export type BombUpsertPayload = BombPlacedPayload & { - radiusGrid?: number; +/** 爆弾の描画更新に使う入力データ型 */ +export type BombRenderPayload = BombNetworkPayload & { + radiusGrid: number; }; /** 爆弾設置時に返す結果型 */ export type BombPlacementResult = { bombId: string; - payload: BombPlacedPayload; -}; - -/** 爆弾ペイロードから一意キーを生成する */ -export const createBombIdFromPayload = (payload: BombPlacedPayload): string => { - return `${payload.x}:${payload.y}:${payload.explodeAtElapsedMs}`; + payload: BombNetworkPayload; }; type BombManagerOptions = { @@ -64,14 +60,14 @@ } const position = me.getPosition(); - const payload: BombPlacedPayload = { + const payload: BombNetworkPayload = { x: position.x, y: position.y, explodeAtElapsedMs: elapsedMs + BOMB_FUSE_MS, }; const bombId = createBombIdFromPayload(payload); - this.upsertBomb(bombId, payload); + this.upsertBombFromNetwork(bombId, payload); this.lastBombPlacedElapsedMs = elapsedMs; return { bombId, @@ -79,20 +75,25 @@ }; } - /** 指定IDの爆弾を追加または更新する */ - public upsertBomb(bombId: string, payload: BombUpsertPayload): void { + /** 通信ペイロードから指定IDの爆弾を追加または更新する */ + public upsertBombFromNetwork(bombId: string, payload: BombNetworkPayload): void { + const renderPayload: BombRenderPayload = { + ...payload, + radiusGrid: config.GAME_CONFIG.BOMB_RADIUS_GRID, + }; + + this.upsertBomb(bombId, renderPayload); + } + + /** 描画ペイロードで指定IDの爆弾を追加または更新する */ + public upsertBomb(bombId: string, payload: BombRenderPayload): void { const current = this.bombs.get(bombId); if (current) { this.worldContainer.removeChild(current.getDisplayObject()); current.destroy(); } - const resolvedPayload = { - ...payload, - radiusGrid: payload.radiusGrid ?? config.GAME_CONFIG.BOMB_RADIUS_GRID, - }; - - const bomb = new BombController(resolvedPayload); + const bomb = new BombController(payload); this.bombs.set(bombId, bomb); this.worldContainer.addChild(bomb.getDisplayObject()); } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 67972ff..f25e374 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -31,6 +31,7 @@ ServerToClientPayloadOf, CurrentPlayersPayload, BombPlacedPayload, + BombNetworkPayload, GameStartPayload, GameResultPayload, GameResultRanking, @@ -44,6 +45,8 @@ } from "./protocol/events"; /** ソケットイベントブリッジ生成関数を再公開 */ export { createSocketEventBridge } from "./protocol/socketEventBridge"; +/** 爆弾ペイロードから同期用IDを生成するユーティリティを再公開 */ +export { createBombIdFromPayload } from "./protocol/events"; /** ソケットイベントブリッジ生成に必要な最小インターフェースを再公開 */ export type { SocketBridgeTarget } from "./protocol/socketEventBridge"; /** 共有設定値を再公開 */ diff --git a/packages/shared/src/protocol/bombIdentity.ts b/packages/shared/src/protocol/bombIdentity.ts new file mode 100644 index 0000000..ac2dcb0 --- /dev/null +++ b/packages/shared/src/protocol/bombIdentity.ts @@ -0,0 +1,14 @@ +/** + * bombIdentity + * 爆弾通信ペイロードの識別キー生成を提供する + * クライアントとサーバーで同一規約のID生成を共有する + */ +import type { BombPlacedPayload } from "./eventPayloads"; + +/** 通信で扱う爆弾基本ペイロード型 */ +export type BombNetworkPayload = BombPlacedPayload; + +/** 爆弾ペイロードから同期用IDを生成する */ +export const createBombIdFromPayload = (payload: BombNetworkPayload): string => { + return `${payload.x}:${payload.y}:${payload.explodeAtElapsedMs}`; +}; diff --git a/packages/shared/src/protocol/events.ts b/packages/shared/src/protocol/events.ts index 4415c64..bdd0978 100644 --- a/packages/shared/src/protocol/events.ts +++ b/packages/shared/src/protocol/events.ts @@ -7,6 +7,12 @@ /** ソケットイベント名定数を再公開する */ export { SocketEvents } from "./socketEvents"; +/** 爆弾同期識別子の生成ユーティリティを再公開する */ +export { createBombIdFromPayload } from "./bombIdentity"; + +/** 爆弾通信ペイロード型を再公開する */ +export type { BombNetworkPayload } from "./bombIdentity"; + /** 基本ペイロード型を再公開する */ export type { UpdatePlayersPayload,