diff --git a/apps/client/src/network/handlers/GameHandler.ts b/apps/client/src/network/handlers/GameHandler.ts index 51bc03a..ea957ad 100644 --- a/apps/client/src/network/handlers/GameHandler.ts +++ b/apps/client/src/network/handlers/GameHandler.ts @@ -17,7 +17,7 @@ MovePayload, NewPlayerPayload, PlaceBombPayload, - PlayerDeadPayload, + PlayerHitPayload, RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, @@ -47,8 +47,8 @@ offBombPlaced: (callback: (payload: BombPlacedPayload) => void) => void; onBombPlacedAck: (callback: (payload: BombPlacedAckPayload) => void) => void; offBombPlacedAck: (callback: (payload: BombPlacedAckPayload) => void) => void; - onPlayerDead: (callback: (payload: PlayerDeadPayload) => void) => void; - offPlayerDead: (callback: (payload: PlayerDeadPayload) => void) => void; + onPlayerHit: (callback: (payload: PlayerHitPayload) => void) => void; + offPlayerHit: (callback: (payload: PlayerHitPayload) => void) => void; sendMove: (x: number, y: number) => void; sendPlaceBomb: (payload: PlaceBombPayload) => void; sendBombHitReport: (payload: BombHitReportPayload) => void; @@ -111,8 +111,8 @@ const bombPlacedAckSubscription = createSubscriptionPair( protocol.SocketEvents.BOMB_PLACED_ACK ); - const playerDeadSubscription = createSubscriptionPair( - protocol.SocketEvents.PLAYER_DEAD + const playerHitSubscription = createSubscriptionPair( + protocol.SocketEvents.PLAYER_HIT ); const sendMovePayload = createPayloadSender(protocol.SocketEvents.MOVE); const sendPlaceBombPayload = createPayloadSender(protocol.SocketEvents.PLACE_BOMB); @@ -185,11 +185,11 @@ offBombPlacedAck: (callback) => { bombPlacedAckSubscription.off(callback); }, - onPlayerDead: (callback) => { - playerDeadSubscription.on(callback); + onPlayerHit: (callback) => { + playerHitSubscription.on(callback); }, - offPlayerDead: (callback) => { - playerDeadSubscription.off(callback); + offPlayerHit: (callback) => { + playerHitSubscription.off(callback); }, sendMove: (x, y) => { const payload: MovePayload = { x, y }; diff --git a/apps/client/src/scenes/game/GameManager.ts b/apps/client/src/scenes/game/GameManager.ts index 410f186..30463e6 100644 --- a/apps/client/src/scenes/game/GameManager.ts +++ b/apps/client/src/scenes/game/GameManager.ts @@ -134,8 +134,8 @@ onBombPlacementAcknowledged: (payload) => { this.gameEventFacade.applyBombPlacementAcknowledged(payload); }, - onRemotePlayerDead: (payload) => { - this.combatFacade.handleNetworkPlayerDead(payload); + onRemotePlayerHit: (payload) => { + this.combatFacade.handleNetworkPlayerHit(payload); }, onBombExploded: (payload) => { this.combatFacade.handleBombExploded(payload); diff --git a/apps/client/src/scenes/game/application/GameNetworkSync.ts b/apps/client/src/scenes/game/application/GameNetworkSync.ts index 0b48001..14839dd 100644 --- a/apps/client/src/scenes/game/application/GameNetworkSync.ts +++ b/apps/client/src/scenes/game/application/GameNetworkSync.ts @@ -7,7 +7,7 @@ import type { BombPlacedAckPayload, BombPlacedPayload, - PlayerDeadPayload, + PlayerHitPayload, } from "@repo/shared"; import { AppearanceResolver } from "./AppearanceResolver"; import { GameMapController } from "@client/scenes/game/entities/map/GameMapController"; @@ -27,7 +27,7 @@ onGameEnded: () => void; onRemoteBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + onRemotePlayerHit: (payload: PlayerHitPayload) => void; }; /** ゲーム中のネットワークイベント購読と同期処理を管理する */ @@ -53,7 +53,7 @@ onGameEnded, onRemoteBombPlaced, onBombPlacementAcknowledged, - onRemotePlayerDead, + onRemotePlayerHit, }: GameNetworkSyncOptions) { this.stateApplier = new GameNetworkStateApplier({ worldContainer, @@ -65,7 +65,7 @@ onGameEnded, onRemoteBombPlaced, onBombPlacementAcknowledged, - onRemotePlayerDead, + onRemotePlayerHit, onDebugLog: this.debugLog, }); diff --git a/apps/client/src/scenes/game/application/PlayerDeathPolicy.ts b/apps/client/src/scenes/game/application/PlayerDeathPolicy.ts deleted file mode 100644 index 56b33b1..0000000 --- a/apps/client/src/scenes/game/application/PlayerDeathPolicy.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { PlayerDeadPayload } from "@repo/shared"; - -type PlayerDeathPolicyParams = { - myId: string; - hitStunMs: number; - acquireInputLock: () => () => void; -}; - -/** 被弾後のローカルプレイヤー処理ポリシーを管理する */ -export class PlayerDeathPolicy { - private myId: string; - private hitStunMs: number; - private acquireInputLock: () => () => void; - private activeLockRelease: (() => void) | null = null; - private unlockTimer: ReturnType | null = null; - - constructor({ myId, hitStunMs, acquireInputLock }: PlayerDeathPolicyParams) { - this.myId = myId; - this.hitStunMs = hitStunMs; - this.acquireInputLock = acquireInputLock; - } - - /** サーバーからの死亡通知に応じてローカル被弾後処理を適用する */ - public applyPlayerDeadEvent(payload: PlayerDeadPayload): void { - if (payload.playerId !== this.myId) { - return; - } - - this.applyHitStun(); - } - - /** ローカル被弾判定時に硬直を適用する */ - public applyLocalHitStun(): void { - this.applyHitStun(); - } - - /** ポリシーが保持するタイマーと入力ロックを解放する */ - public dispose(): void { - if (this.unlockTimer) { - clearTimeout(this.unlockTimer); - this.unlockTimer = null; - } - - if (this.activeLockRelease) { - this.activeLockRelease(); - this.activeLockRelease = null; - } - } - - private applyHitStun(): void { - if (!this.activeLockRelease) { - this.activeLockRelease = this.acquireInputLock(); - } - - if (this.unlockTimer) { - clearTimeout(this.unlockTimer); - this.unlockTimer = null; - } - - this.unlockTimer = setTimeout(() => { - this.unlockTimer = null; - if (this.activeLockRelease) { - this.activeLockRelease(); - this.activeLockRelease = null; - } - }, this.hitStunMs); - } -} diff --git a/apps/client/src/scenes/game/application/PlayerHitEffectOrchestrator.ts b/apps/client/src/scenes/game/application/PlayerHitEffectOrchestrator.ts index 8ffe11c..66ece0e 100644 --- a/apps/client/src/scenes/game/application/PlayerHitEffectOrchestrator.ts +++ b/apps/client/src/scenes/game/application/PlayerHitEffectOrchestrator.ts @@ -54,9 +54,9 @@ } /** ネットワーク通知の被弾時に必要な点滅演出を発火する */ - public handleNetworkPlayerDead(playerId: string, localPlayerId: string): void { + public handleNetworkPlayerHit(playerId: string, localPlayerId: string): void { this.dispatch({ - name: "network-player-dead", + name: "network-player-hit", payload: { playerId, localPlayerId, @@ -67,7 +67,7 @@ /** 被弾演出イベント名に応じて処理を分岐する */ public dispatch(event: PlayerHitEffectEvent): void { if ( - event.name === "network-player-dead" + event.name === "network-player-hit" && event.payload.playerId === event.payload.localPlayerId ) { return; diff --git a/apps/client/src/scenes/game/application/PlayerHitPolicy.ts b/apps/client/src/scenes/game/application/PlayerHitPolicy.ts new file mode 100644 index 0000000..04b907e --- /dev/null +++ b/apps/client/src/scenes/game/application/PlayerHitPolicy.ts @@ -0,0 +1,68 @@ +import type { PlayerHitPayload } from "@repo/shared"; + +type PlayerHitPolicyParams = { + myId: string; + hitStunMs: number; + acquireInputLock: () => () => void; +}; + +/** 被弾後のローカルプレイヤー処理ポリシーを管理する */ +export class PlayerHitPolicy { + private myId: string; + private hitStunMs: number; + private acquireInputLock: () => () => void; + private activeLockRelease: (() => void) | null = null; + private unlockTimer: ReturnType | null = null; + + constructor({ myId, hitStunMs, acquireInputLock }: PlayerHitPolicyParams) { + this.myId = myId; + this.hitStunMs = hitStunMs; + this.acquireInputLock = acquireInputLock; + } + + /** サーバーからの被弾通知に応じてローカル被弾後処理を適用する */ + public applyPlayerHitEvent(payload: PlayerHitPayload): void { + if (payload.playerId !== this.myId) { + return; + } + + this.applyHitStun(); + } + + /** ローカル被弾判定時に硬直を適用する */ + public applyLocalHitStun(): void { + this.applyHitStun(); + } + + /** ポリシーが保持するタイマーと入力ロックを解放する */ + public dispose(): void { + if (this.unlockTimer) { + clearTimeout(this.unlockTimer); + this.unlockTimer = null; + } + + if (this.activeLockRelease) { + this.activeLockRelease(); + this.activeLockRelease = null; + } + } + + private applyHitStun(): void { + if (!this.activeLockRelease) { + this.activeLockRelease = this.acquireInputLock(); + } + + if (this.unlockTimer) { + clearTimeout(this.unlockTimer); + this.unlockTimer = null; + } + + this.unlockTimer = setTimeout(() => { + this.unlockTimer = null; + if (this.activeLockRelease) { + this.activeLockRelease(); + this.activeLockRelease = null; + } + }, this.hitStunMs); + } +} diff --git a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts index ad3586b..29c5d64 100644 --- a/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts +++ b/apps/client/src/scenes/game/application/combat/CombatLifecycleFacade.ts @@ -4,10 +4,10 @@ * ゲームマネージャーから被弾関連の責務を分離する */ import { config } from "@client/config"; -import type { PlayerDeadPayload } from "@repo/shared"; +import type { PlayerHitPayload } from "@repo/shared"; import type { BombExplodedPayload } from "@client/scenes/game/entities/bomb/BombManager"; import { BombHitOrchestrator } from "@client/scenes/game/application/BombHitOrchestrator"; -import { PlayerDeathPolicy } from "@client/scenes/game/application/PlayerDeathPolicy"; +import { PlayerHitPolicy } from "@client/scenes/game/application/PlayerHitPolicy"; import { PlayerHitEffectOrchestrator } from "@client/scenes/game/application/PlayerHitEffectOrchestrator"; import type { GamePlayers } from "@client/scenes/game/application/game.types"; @@ -26,7 +26,7 @@ bombId: string, ) => void; private readonly bombHitOrchestrator: BombHitOrchestrator; - private readonly playerDeathPolicy: PlayerDeathPolicy; + private readonly playerHitPolicy: PlayerHitPolicy; private readonly playerHitEffectOrchestrator: PlayerHitEffectOrchestrator; constructor({ @@ -41,7 +41,7 @@ players, myId, }); - this.playerDeathPolicy = new PlayerDeathPolicy({ + this.playerHitPolicy = new PlayerHitPolicy({ myId, hitStunMs: config.GAME_CONFIG.PLAYER_HIT_STUN_MS, acquireInputLock, @@ -58,20 +58,20 @@ const hitPlayerId = this.bombHitOrchestrator.evaluateHit(payload); if (!hitPlayerId) return; - this.playerDeathPolicy.applyLocalHitStun(); + this.playerHitPolicy.applyLocalHitStun(); this.playerHitEffectOrchestrator.handleLocalBombHit(this.myId); this.onSendBombHitReport(payload.bombId); } /** ネットワーク被弾通知を適用する */ - public handleNetworkPlayerDead(payload: PlayerDeadPayload): void { - this.playerDeathPolicy.applyPlayerDeadEvent(payload); - this.playerHitEffectOrchestrator.handleNetworkPlayerDead(payload.playerId, this.myId); + public handleNetworkPlayerHit(payload: PlayerHitPayload): void { + this.playerHitPolicy.applyPlayerHitEvent(payload); + this.playerHitEffectOrchestrator.handleNetworkPlayerHit(payload.playerId, this.myId); } /** 管理中リソースを破棄する */ public dispose(): void { this.bombHitOrchestrator.clear(); - this.playerDeathPolicy.dispose(); + this.playerHitPolicy.dispose(); } } \ No newline at end of file diff --git a/apps/client/src/scenes/game/application/network/NetworkSubscriptions.ts b/apps/client/src/scenes/game/application/network/NetworkSubscriptions.ts index 965b5fd..35746cd 100644 --- a/apps/client/src/scenes/game/application/network/NetworkSubscriptions.ts +++ b/apps/client/src/scenes/game/application/network/NetworkSubscriptions.ts @@ -10,7 +10,7 @@ CurrentPlayersPayload, GameStartPayload, NewPlayerPayload, - PlayerDeadPayload, + PlayerHitPayload, RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, @@ -33,7 +33,7 @@ gameEnd: SocketSubscription; bombPlaced: SocketSubscription; bombPlacedAck: SocketSubscription; - playerDead: SocketSubscription; + playerHit: SocketSubscription; }; /** 購読辞書生成に必要なハンドラ群 */ @@ -47,7 +47,7 @@ onGameEnd: () => void; onBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacedAck: (payload: BombPlacedAckPayload) => void; - onPlayerDead: (payload: PlayerDeadPayload) => void; + onPlayerHit: (payload: PlayerHitPayload) => void; }; type SubscriptionDefinition = { @@ -120,10 +120,10 @@ }), }, { - key: "playerDead", + key: "playerHit", create: (handlers) => ({ - bind: () => socketManager.game.onPlayerDead(handlers.onPlayerDead), - unbind: () => socketManager.game.offPlayerDead(handlers.onPlayerDead), + bind: () => socketManager.game.onPlayerHit(handlers.onPlayerHit), + unbind: () => socketManager.game.offPlayerHit(handlers.onPlayerHit), }), }, ]; diff --git a/apps/client/src/scenes/game/application/network/adapters/GameNetworkEventAdapter.ts b/apps/client/src/scenes/game/application/network/adapters/GameNetworkEventAdapter.ts index b1c9a60..d4929da 100644 --- a/apps/client/src/scenes/game/application/network/adapters/GameNetworkEventAdapter.ts +++ b/apps/client/src/scenes/game/application/network/adapters/GameNetworkEventAdapter.ts @@ -7,7 +7,7 @@ BombPlacedAckPayload, BombPlacedPayload, GameStartPayload, - PlayerDeadPayload, + PlayerHitPayload, } from "@repo/shared"; /** ゲーム開始受信ペイロードから開始時刻を抽出する @@ -38,9 +38,9 @@ return payload; }; -/** プレイヤー死亡受信ペイロードを内部ペイロードへ正規化する */ -export const toRemotePlayerDeadPayload = ( - payload: PlayerDeadPayload, -): PlayerDeadPayload => { +/** プレイヤー被弾受信ペイロードを内部ペイロードへ正規化する */ +export const toRemotePlayerHitPayload = ( + payload: PlayerHitPayload, +): PlayerHitPayload => { return payload; }; \ No newline at end of file diff --git a/apps/client/src/scenes/game/application/network/handlers/CombatSyncHandler.ts b/apps/client/src/scenes/game/application/network/handlers/CombatSyncHandler.ts index f2f23df..8ae9e60 100644 --- a/apps/client/src/scenes/game/application/network/handlers/CombatSyncHandler.ts +++ b/apps/client/src/scenes/game/application/network/handlers/CombatSyncHandler.ts @@ -6,30 +6,30 @@ import type { BombPlacedAckPayload, BombPlacedPayload, - PlayerDeadPayload, + PlayerHitPayload, } from "@repo/shared"; /** CombatSyncHandler の初期化入力 */ export type CombatSyncHandlerOptions = { onRemoteBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + onRemotePlayerHit: (payload: PlayerHitPayload) => void; }; /** 戦闘関連イベントの橋渡しを担当する */ export class CombatSyncHandler { private readonly onRemoteBombPlaced: (payload: BombPlacedPayload) => void; private readonly onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - private readonly onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + private readonly onRemotePlayerHit: (payload: PlayerHitPayload) => void; constructor({ onRemoteBombPlaced, onBombPlacementAcknowledged, - onRemotePlayerDead, + onRemotePlayerHit, }: CombatSyncHandlerOptions) { this.onRemoteBombPlaced = onRemoteBombPlaced; this.onBombPlacementAcknowledged = onBombPlacementAcknowledged; - this.onRemotePlayerDead = onRemotePlayerDead; + this.onRemotePlayerHit = onRemotePlayerHit; } /** 他プレイヤーの爆弾設置受信イベントを橋渡しする */ @@ -42,8 +42,8 @@ this.onBombPlacementAcknowledged(payload); }; - /** プレイヤー死亡受信イベントを橋渡しする */ - public handleReceivedPlayerDead = (payload: PlayerDeadPayload): void => { - this.onRemotePlayerDead(payload); + /** プレイヤー被弾受信イベントを橋渡しする */ + public handleReceivedPlayerHit = (payload: PlayerHitPayload): void => { + this.onRemotePlayerHit(payload); }; } \ No newline at end of file diff --git a/apps/client/src/scenes/game/application/network/handlers/GameNetworkStateApplier.ts b/apps/client/src/scenes/game/application/network/handlers/GameNetworkStateApplier.ts index f38e05c..3c3ee2a 100644 --- a/apps/client/src/scenes/game/application/network/handlers/GameNetworkStateApplier.ts +++ b/apps/client/src/scenes/game/application/network/handlers/GameNetworkStateApplier.ts @@ -7,7 +7,7 @@ import type { BombPlacedAckPayload, BombPlacedPayload, - PlayerDeadPayload, + PlayerHitPayload, } from "@repo/shared"; import { domain } from "@repo/shared"; import { AppearanceResolver } from "@client/scenes/game/application/AppearanceResolver"; @@ -17,7 +17,7 @@ toBombPlacementAcknowledgedPayload, toGameStartedAt, toRemoteBombPlacedPayload, - toRemotePlayerDeadPayload, + toRemotePlayerHitPayload, } from "@client/scenes/game/application/network/adapters/GameNetworkEventAdapter"; import { CombatSyncHandler } from "./CombatSyncHandler"; import { MapSyncHandler } from "./MapSyncHandler"; @@ -35,7 +35,7 @@ onGameEnded: () => void; onRemoteBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + onRemotePlayerHit: (payload: PlayerHitPayload) => void; onDebugLog?: (message: string) => void; }; @@ -59,7 +59,7 @@ onGameEnded, onRemoteBombPlaced, onBombPlacementAcknowledged, - onRemotePlayerDead, + onRemotePlayerHit, onDebugLog, }: GameNetworkStateApplierOptions) { this.playerSyncHandler = new PlayerSyncHandler({ @@ -76,8 +76,8 @@ onBombPlacementAcknowledged: (payload) => { onBombPlacementAcknowledged(toBombPlacementAcknowledgedPayload(payload)); }, - onRemotePlayerDead: (payload) => { - onRemotePlayerDead(toRemotePlayerDeadPayload(payload)); + onRemotePlayerHit: (payload) => { + onRemotePlayerHit(toRemotePlayerHitPayload(payload)); }, }); this.onGameStarted = onGameStarted; @@ -118,8 +118,8 @@ onReceivedBombPlacedAck: (payload) => { this.combatSyncHandler.handleReceivedBombPlacedAck(payload); }, - onReceivedPlayerDead: (payload) => { - this.combatSyncHandler.handleReceivedPlayerDead(payload); + onReceivedPlayerHit: (payload) => { + this.combatSyncHandler.handleReceivedPlayerHit(payload); }, }; } diff --git a/apps/client/src/scenes/game/application/network/receivers/GameNetworkEventReceiver.ts b/apps/client/src/scenes/game/application/network/receivers/GameNetworkEventReceiver.ts index dcb95ed..38ef476 100644 --- a/apps/client/src/scenes/game/application/network/receivers/GameNetworkEventReceiver.ts +++ b/apps/client/src/scenes/game/application/network/receivers/GameNetworkEventReceiver.ts @@ -9,7 +9,7 @@ CurrentPlayersPayload, GameStartPayload, NewPlayerPayload, - PlayerDeadPayload, + PlayerHitPayload, RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, @@ -30,7 +30,7 @@ onReceivedGameEnd: () => void; onReceivedBombPlaced: (payload: BombPlacedPayload) => void; onReceivedBombPlacedAck: (payload: BombPlacedAckPayload) => void; - onReceivedPlayerDead: (payload: PlayerDeadPayload) => void; + onReceivedPlayerHit: (payload: PlayerHitPayload) => void; }; /** 受信イベント購読の管理を担当する */ @@ -49,7 +49,7 @@ onGameEnd: handlers.onReceivedGameEnd, onBombPlaced: handlers.onReceivedBombPlaced, onBombPlacedAck: handlers.onReceivedBombPlacedAck, - onPlayerDead: handlers.onReceivedPlayerDead, + onPlayerHit: handlers.onReceivedPlayerHit, }); } diff --git a/apps/client/src/scenes/game/application/orchestrators/GameSceneOrchestrator.ts b/apps/client/src/scenes/game/application/orchestrators/GameSceneOrchestrator.ts index 96c9ce9..c81cc5c 100644 --- a/apps/client/src/scenes/game/application/orchestrators/GameSceneOrchestrator.ts +++ b/apps/client/src/scenes/game/application/orchestrators/GameSceneOrchestrator.ts @@ -7,7 +7,7 @@ import type { BombPlacedAckPayload, BombPlacedPayload, - PlayerDeadPayload, + PlayerHitPayload, } from "@repo/shared"; import { AppearanceResolver } from "@client/scenes/game/application/AppearanceResolver"; import { GameMapController } from "@client/scenes/game/entities/map/GameMapController"; @@ -29,7 +29,7 @@ onGameEnded: () => void; onRemoteBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + onRemotePlayerHit: (payload: PlayerHitPayload) => void; }; /** BombManager 生成入力型 */ @@ -48,7 +48,7 @@ onGameEnded: () => void; onRemoteBombPlaced: (payload: BombPlacedPayload) => void; onBombPlacementAcknowledged: (payload: BombPlacedAckPayload) => void; - onRemotePlayerDead: (payload: PlayerDeadPayload) => void; + onRemotePlayerHit: (payload: PlayerHitPayload) => void; onBombExploded: (payload: BombExplodedPayload) => void; }; @@ -171,7 +171,7 @@ onGameEnded: this.eventPorts.onGameEnded, onRemoteBombPlaced: this.eventPorts.onRemoteBombPlaced, onBombPlacementAcknowledged: this.eventPorts.onBombPlacementAcknowledged, - onRemotePlayerDead: this.eventPorts.onRemotePlayerDead, + onRemotePlayerHit: this.eventPorts.onRemotePlayerHit, }); networkSync.bind(); return networkSync; diff --git a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts index 990f18e..74bf4db 100644 --- a/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts +++ b/apps/server/src/domains/game/application/ports/gameUseCasePorts.ts @@ -6,7 +6,7 @@ BombHitReportPayload, BombPlacedAckPayload, BombPlacedPayload, - PlayerDeadPayload, + PlayerHitPayload, domain, PlaceBombPayload, CurrentPlayersPayload, @@ -86,12 +86,12 @@ ): void; } -/** プレイヤー死亡通知の送信出力ポート */ -export interface PlayerDeadOutputPort { - publishPlayerDeadToOthersInRoom( +/** プレイヤー被弾通知の送信出力ポート */ +export interface PlayerHitOutputPort { + publishPlayerHitToOthersInRoom( roomId: domain.room.Room["roomId"], deadPlayerId: string, - payload: PlayerDeadPayload, + payload: PlayerHitPayload, ): void; } @@ -105,7 +105,7 @@ | "publishGameStartToRoom" > & BombPlacementOutputPort & - PlayerDeadOutputPort; + PlayerHitOutputPort; /** 爆弾設置ユースケースが利用する爆弾状態入力ポート */ export interface BombPlacementPort { diff --git a/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts b/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts index 5f393de..4ccf680 100644 --- a/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/reportBombHitUseCase.ts @@ -4,19 +4,19 @@ * Bot被弾はサーバー側GameLoopで直接検知するため,自プレイヤーの報告のみ受け付ける */ import type { - PlayerDeadOutputPort, + PlayerHitOutputPort, BombHitReportValidationPort, BombHitStatsPort, ReportBombHitInput, } from "../ports/gameUseCasePorts"; -import { shouldPublishPlayerDeadFromBombHit } from "./reportBombHitValidation"; +import { shouldPublishPlayerHitFromBombHit } from "./reportBombHitValidation"; type ReportBombHitUseCaseParams = { roomId: string; validation: BombHitReportValidationPort; stats: BombHitStatsPort; input: ReportBombHitInput; - output: PlayerDeadOutputPort; + output: PlayerHitOutputPort; }; /** 被弾報告を受け取り,死亡通知を同一ルームへ配信する */ @@ -27,7 +27,7 @@ input, output, }: ReportBombHitUseCaseParams): void => { - if (!shouldPublishPlayerDeadFromBombHit(validation, input)) { + if (!shouldPublishPlayerHitFromBombHit(validation, input)) { return; } @@ -35,7 +35,7 @@ const deadPlayerId = input.socketId; - output.publishPlayerDeadToOthersInRoom(roomId, deadPlayerId, { + output.publishPlayerHitToOthersInRoom(roomId, deadPlayerId, { playerId: deadPlayerId, }); }; diff --git a/apps/server/src/domains/game/application/useCases/reportBombHitValidation.ts b/apps/server/src/domains/game/application/useCases/reportBombHitValidation.ts index 7dfd691..3517e1f 100644 --- a/apps/server/src/domains/game/application/useCases/reportBombHitValidation.ts +++ b/apps/server/src/domains/game/application/useCases/reportBombHitValidation.ts @@ -5,7 +5,7 @@ import { createBombHitReportDedupeKey } from "@server/domains/game/entities/bomb/bombHitReport"; /** 受信した被弾報告を処理対象にすべきか判定する */ -export const shouldPublishPlayerDeadFromBombHit = ( +export const shouldPublishPlayerHitFromBombHit = ( validation: BombHitReportValidationPort, input: ReportBombHitInput, ): boolean => { diff --git a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts index 17c2776..276fe9e 100644 --- a/apps/server/src/domains/game/application/useCases/startGameUseCase.ts +++ b/apps/server/src/domains/game/application/useCases/startGameUseCase.ts @@ -41,9 +41,9 @@ output, }); - /** Bot被弾検出時にPLAYER_DEADをルームへ配信する */ + /** Bot被弾検出時にPLAYER_HITをルームへ配信する */ const handleBotBombHit = (targetPlayerId: string, _bombId: string): void => { - output.publishPlayerDeadToOthersInRoom(roomId, targetPlayerId, { + output.publishPlayerHitToOthersInRoom(roomId, targetPlayerId, { playerId: targetPlayerId, }); }; diff --git a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts index 4832f45..6af56f4 100644 --- a/apps/server/src/network/handlers/game/createGameOutputAdapter.ts +++ b/apps/server/src/network/handlers/game/createGameOutputAdapter.ts @@ -10,7 +10,7 @@ domain, GameStartPayload, GameResultPayload, - PlayerDeadPayload, + PlayerHitPayload, PongPayload, CurrentPlayersPayload, RemovePlayerPayload, @@ -18,7 +18,7 @@ } from "@repo/shared"; import type { BombPlacementOutputPort, - PlayerDeadOutputPort, + PlayerHitOutputPort, GameOutputPort, } from "@server/domains/game/application/ports/gameUseCasePorts"; import { isBotPlayerId } from "@server/domains/game/application/services/bot/index.js"; @@ -34,7 +34,7 @@ "publishPlayerRemovedToRoom" > & BombPlacementOutputPort & - PlayerDeadOutputPort; + PlayerHitOutputPort; /** ゲーム切断時の出力アダプターのインターフェース */ export type GameDisconnectOutputAdapter = Pick< @@ -114,15 +114,15 @@ payload, ); }, - publishPlayerDeadToOthersInRoom: ( + publishPlayerHitToOthersInRoom: ( roomId: RoomId, deadPlayerId: string, - payload: PlayerDeadPayload, + payload: PlayerHitPayload, ) => { common.emitToRoomExceptSocket( roomId, deadPlayerId, - protocol.SocketEvents.PLAYER_DEAD, + protocol.SocketEvents.PLAYER_HIT, payload, ); }, diff --git a/packages/shared/src/protocol/eventPayloads.ts b/packages/shared/src/protocol/eventPayloads.ts index dc59f39..bbf9c2e 100644 --- a/packages/shared/src/protocol/eventPayloads.ts +++ b/packages/shared/src/protocol/eventPayloads.ts @@ -32,7 +32,7 @@ BombPlacedPayload, BombPlacedAckPayload, BombHitReportPayload, - PlayerDeadPayload, + PlayerHitPayload, GameResultPayload, GameResultRanking, PlayerGameStats, @@ -41,7 +41,7 @@ /** 被弾演出イベントのペイロード型を再公開する */ export type { LocalBombHitEffectPayload, - NetworkPlayerDeadEffectPayload, + NetworkPlayerHitEffectPayload, PlayerHitEffectEventPayloadMap, PlayerHitEffectEventName, PlayerHitEffectPayloadOf, diff --git a/packages/shared/src/protocol/maps/gameEventPayloadMap.ts b/packages/shared/src/protocol/maps/gameEventPayloadMap.ts index 2772b08..3b46475 100644 --- a/packages/shared/src/protocol/maps/gameEventPayloadMap.ts +++ b/packages/shared/src/protocol/maps/gameEventPayloadMap.ts @@ -19,7 +19,7 @@ MovePayload, NewPlayerPayload, PlaceBombPayload, - PlayerDeadPayload, + PlayerHitPayload, RemovePlayerPayload, UpdateMapCellsPayload, UpdatePlayersPayload, @@ -45,7 +45,7 @@ [SocketEvents.UPDATE_MAP_CELLS_SYNC]: UpdateMapCellsPayload; [SocketEvents.BOMB_PLACED]: BombPlacedPayload; [SocketEvents.BOMB_PLACED_ACK]: BombPlacedAckPayload; - [SocketEvents.PLAYER_DEAD]: PlayerDeadPayload; + [SocketEvents.PLAYER_HIT]: PlayerHitPayload; [SocketEvents.PONG]: PongPayload; [SocketEvents.GAME_END]: undefined; [SocketEvents.GAME_RESULT]: GameResultPayload; diff --git a/packages/shared/src/protocol/payloads/gamePayloads.ts b/packages/shared/src/protocol/payloads/gamePayloads.ts index 48b115a..d7bbe29 100644 --- a/packages/shared/src/protocol/payloads/gamePayloads.ts +++ b/packages/shared/src/protocol/payloads/gamePayloads.ts @@ -121,7 +121,7 @@ bombId: string; }; -/** player-dead イベントで送受信する死亡プレイヤー情報 */ -export type PlayerDeadPayload = { +/** player-hit イベントで送受信する被弾プレイヤー情報 */ +export type PlayerHitPayload = { playerId: string; }; diff --git a/packages/shared/src/protocol/payloads/playerHitEffectPayloads.ts b/packages/shared/src/protocol/payloads/playerHitEffectPayloads.ts index 728add1..0d81150 100644 --- a/packages/shared/src/protocol/payloads/playerHitEffectPayloads.ts +++ b/packages/shared/src/protocol/payloads/playerHitEffectPayloads.ts @@ -11,7 +11,7 @@ }; /** ネットワーク通知由来の被弾演出イベントのペイロード型 */ -export type NetworkPlayerDeadEffectPayload = { +export type NetworkPlayerHitEffectPayload = { playerId: string; localPlayerId: string; }; @@ -19,7 +19,7 @@ /** 被弾演出イベント名ごとのペイロード対応表 */ export type PlayerHitEffectEventPayloadMap = { "local-bomb-hit": LocalBombHitEffectPayload; - "network-player-dead": NetworkPlayerDeadEffectPayload; + "network-player-hit": NetworkPlayerHitEffectPayload; }; /** 被弾演出イベント名を表す型 */ diff --git a/packages/shared/src/protocol/socketEvents.ts b/packages/shared/src/protocol/socketEvents.ts index f896567..34c4a1f 100644 --- a/packages/shared/src/protocol/socketEvents.ts +++ b/packages/shared/src/protocol/socketEvents.ts @@ -36,7 +36,7 @@ UPDATE_MAP_CELLS: "update-map-cells", BOMB_PLACED: "bomb-placed", BOMB_PLACED_ACK: "bomb-placed-ack", - PLAYER_DEAD: "player-dead", + PLAYER_HIT: "player-hit", // 時間同期・ゲーム進行関連 PING: "ping",