diff --git a/apps/client/src/scenes/game/application/BombHitOrchestrator.ts b/apps/client/src/scenes/game/application/BombHitOrchestrator.ts index 021f26f..54f5231 100644 --- a/apps/client/src/scenes/game/application/BombHitOrchestrator.ts +++ b/apps/client/src/scenes/game/application/BombHitOrchestrator.ts @@ -16,12 +16,6 @@ myId: string; }; -/** 爆弾爆発イベントの判定結果を表す型 */ -export type BombHitEvaluationResult = { - status: "duplicate" | "missing-local-player" | "no-hit" | "hit"; - hitPlayerId: string | null; -}; - /** 爆弾当たり判定の実行順序を制御する */ export class BombHitOrchestrator { private readonly players: GamePlayers; @@ -33,16 +27,19 @@ this.myId = myId; } - /** 爆弾爆発イベントを受けて自プレイヤーの当たり判定を実行し結果を返す */ - public handleBombExploded(payload: BombExplodedPayload): BombHitEvaluationResult { + /** + * 爆弾爆発イベントを受けて自プレイヤーの当たり判定を実行する + * @returns 被弾した場合は自プレイヤーID、それ以外は null + */ + public evaluateHit(payload: BombExplodedPayload): string | null { if (this.handledBombIds.has(payload.bombId)) { - return { status: "duplicate", hitPlayerId: null }; + return null; } this.handledBombIds.add(payload.bombId); const localCircle = this.getLocalPlayerCircle(); if (!localCircle) { - return { status: "missing-local-player", hitPlayerId: null }; + return null; } const result = checkBombHit({ @@ -55,11 +52,7 @@ player: localCircle, }); - if (!result.isHit) { - return { status: "no-hit", hitPlayerId: null }; - } - - return { status: "hit", hitPlayerId: this.myId }; + return result.isHit ? this.myId : null; } /** 判定済み状態を初期化する */ diff --git a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts index 1e925bb..ad3586b 100644 --- a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts +++ b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts @@ -55,8 +55,8 @@ /** 爆弾爆発時の判定と後続処理を実行する */ public handleBombExploded(payload: BombExplodedPayload): void { - const result = this.bombHitOrchestrator.handleBombExploded(payload); - if (!result.hitPlayerId) return; + const hitPlayerId = this.bombHitOrchestrator.evaluateHit(payload); + if (!hitPlayerId) return; this.playerDeathPolicy.applyLocalHitStun(); this.playerHitEffectOrchestrator.handleLocalBombHit(this.myId); diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 95e1944..2c08386 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -96,9 +96,6 @@ ): void; } -/** 爆弾設置ユースケースが利用する出力ポート */ -export type PlaceBombOutputPort = BombPlacementOutputPort; - /** start-game 系フローで利用する送信出力ポート */ export type StartGameOutputPort = Pick< GameOutputPort, @@ -145,6 +142,3 @@ payload: BombHitReportPayload; nowMs: number; }; - -/** 被弾報告ユースケースが利用する出力ポート */ -export type BombHitOutputPort = PlayerDeadOutputPort; diff --git a/apps/server/src/domains/game/application/useCases/placeBombUseCase.ts b/apps/server/src/domains/game/application/useCases/placeBombUseCase.ts index e814e83..073de20 100644 --- a/apps/server/src/domains/game/application/useCases/placeBombUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/placeBombUseCase.ts @@ -4,7 +4,7 @@ */ import type { BombPlacementPort, - PlaceBombOutputPort, + BombPlacementOutputPort, PlaceBombInput, } from "../ports/gameUseCasePorts"; import { @@ -17,7 +17,7 @@ roomId: string; bombStore: BombPlacementPort; input: PlaceBombInput; - output: PlaceBombOutputPort; + output: BombPlacementOutputPort; }; /** 爆弾設置入力を重複排除と採番付きでルームへ配信する */ diff --git a/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts b/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts index 4a675ae..e47b9eb 100644 --- a/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts @@ -4,7 +4,7 @@ * Bot被弾はサーバー側GameLoopで直接検知するため,自プレイヤーの報告のみ受け付ける */ import type { - BombHitOutputPort, + PlayerDeadOutputPort, BombHitReportValidationPort, ReportBombHitInput, } from "../ports/gameUseCasePorts"; @@ -14,7 +14,7 @@ roomId: string; validation: BombHitReportValidationPort; input: ReportBombHitInput; - output: BombHitOutputPort; + output: PlayerDeadOutputPort; }; /** 被弾報告を受け取り,死亡通知を同一ルームへ配信する */ diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index 5ac2cf9..f897f63 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -22,6 +22,7 @@ PlayerDeadOutputPort, GameOutputPort, } from "@server/domains/game/application/ports/gameUseCasePorts"; +import { isBotPlayerId } from "@server/domains/game/application/services/bot/index.js"; import { sanitizeUpdatePlayersPayload } from "@server/network/adapters/gamePayloadSanitizers"; import { createEmitToRoom } from "@server/network/adapters/socketEmitters"; import type { CommonHandlerContext } from "../CommonHandler"; @@ -91,7 +92,7 @@ ownerSocketId: string, payload: BombPlacedPayload, ) => { - if (ownerSocketId.startsWith("bot:")) { + if (isBotPlayerId(ownerSocketId)) { common.emitToRoom(roomId, protocol.SocketEvents.BOMB_PLACED, payload); return; }