diff --git a/apps/client/src/scenes/game/application/BombHitContextProvider.ts b/apps/client/src/scenes/game/application/BombHitContextProvider.ts index 584d88e..dd38584 100644 --- a/apps/client/src/scenes/game/application/BombHitContextProvider.ts +++ b/apps/client/src/scenes/game/application/BombHitContextProvider.ts @@ -5,7 +5,9 @@ */ import { config } from "@client/config"; import { LocalPlayerController } from "@client/scenes/game/entities/player/PlayerController"; -import type { TeamCollisionCircle } from "@client/scenes/game/entities/bomb/BombHitDetector"; +import type { domain } from "@repo/shared"; + +type TeamCollisionCircle = domain.game.TeamCollisionCircle; import type { GamePlayers } from "./game.types"; /** 被弾判定と報告に利用するプレイヤー円情報 */ diff --git a/apps/client/src/scenes/game/application/BombHitOrchestrator.ts b/apps/client/src/scenes/game/application/BombHitOrchestrator.ts index 4cebadc..a466e8d 100644 --- a/apps/client/src/scenes/game/application/BombHitOrchestrator.ts +++ b/apps/client/src/scenes/game/application/BombHitOrchestrator.ts @@ -3,7 +3,9 @@ * 爆弾爆発イベントとローカルプレイヤー情報を橋渡しして当たり判定を実行する * 判定結果を呼び出し元へ返して後続処理へ接続しやすくする */ -import { checkBombHit } from "@client/scenes/game/entities/bomb/BombHitDetector"; +import { domain } from "@repo/shared"; + +const { checkBombHit } = domain.game; import type { BombExplodedPayload } from "@client/scenes/game/entities/bomb/BombManager"; import { BombHitContextProvider } from "./BombHitContextProvider"; diff --git a/apps/client/src/scenes/game/entities/bomb/BombHitDetector.ts b/apps/client/src/scenes/game/entities/bomb/BombHitDetector.ts deleted file mode 100644 index 7bee698..0000000 --- a/apps/client/src/scenes/game/entities/bomb/BombHitDetector.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * BombHitDetector - * 爆弾とプレイヤーの円当たり判定を行う純関数を提供する - * 同チーム無効判定と二乗距離比較をまとめて扱う - */ - -/** 円当たり判定に利用する座標と半径の基本型 */ -export type CollisionCircle = { - x: number; - y: number; - radius: number; -}; - -/** チーム判定を伴う円当たり判定の入力型 */ -export type TeamCollisionCircle = CollisionCircle & { - teamId: number; -}; - -/** 爆弾当たり判定の入力型 */ -export type BombHitCheckInput = { - bomb: TeamCollisionCircle; - player: TeamCollisionCircle; -}; - -/** 爆弾当たり判定の結果型 */ -export type BombHitCheckResult = { - isHit: boolean; - isSameTeam: boolean; - distanceSquared: number; - thresholdSquared: number; -}; - -/** 爆弾とプレイヤーの当たり判定を実行する */ -export const checkBombHit = ({ bomb, player }: BombHitCheckInput): BombHitCheckResult => { - const isSameTeam = bomb.teamId === player.teamId; - const deltaX = bomb.x - player.x; - const deltaY = bomb.y - player.y; - const distanceSquared = deltaX * deltaX + deltaY * deltaY; - const sumRadius = bomb.radius + player.radius; - const thresholdSquared = sumRadius * sumRadius; - const isHit = !isSameTeam && distanceSquared < thresholdSquared; - - return { - isHit, - isSameTeam, - distanceSquared, - thresholdSquared, - }; -}; diff --git a/packages/shared/src/domains/game/bombHit.logic.ts b/packages/shared/src/domains/game/bombHit.logic.ts new file mode 100644 index 0000000..54907b0 --- /dev/null +++ b/packages/shared/src/domains/game/bombHit.logic.ts @@ -0,0 +1,27 @@ +/** + * bombHit.logic + * 爆弾とプレイヤーの円当たり判定を行う純関数を提供する + * 同チーム無効判定と二乗距離比較をまとめて扱う + */ +import type { BombHitCheckInput, BombHitCheckResult } from "./bombHit.type"; + +/** 爆弾とプレイヤーの当たり判定を実行する */ +export const checkBombHit = ({ + bomb, + player, +}: BombHitCheckInput): BombHitCheckResult => { + const isSameTeam = bomb.teamId === player.teamId; + const deltaX = bomb.x - player.x; + const deltaY = bomb.y - player.y; + const distanceSquared = deltaX * deltaX + deltaY * deltaY; + const sumRadius = bomb.radius + player.radius; + const thresholdSquared = sumRadius * sumRadius; + const isHit = !isSameTeam && distanceSquared < thresholdSquared; + + return { + isHit, + isSameTeam, + distanceSquared, + thresholdSquared, + }; +}; diff --git a/packages/shared/src/domains/game/bombHit.type.ts b/packages/shared/src/domains/game/bombHit.type.ts new file mode 100644 index 0000000..6be0147 --- /dev/null +++ b/packages/shared/src/domains/game/bombHit.type.ts @@ -0,0 +1,31 @@ +/** + * bombHit.type + * 爆弾当たり判定で利用する共有型を定義する + * 円同士の衝突判定とチーム判定に必要な型を提供する + */ + +/** 円当たり判定に利用する座標と半径の基本型 */ +export type CollisionCircle = { + x: number; + y: number; + radius: number; +}; + +/** チーム判定を伴う円当たり判定の入力型 */ +export type TeamCollisionCircle = CollisionCircle & { + teamId: number; +}; + +/** 爆弾当たり判定の入力型 */ +export type BombHitCheckInput = { + bomb: TeamCollisionCircle; + player: TeamCollisionCircle; +}; + +/** 爆弾当たり判定の結果型 */ +export type BombHitCheckResult = { + isHit: boolean; + isSameTeam: boolean; + distanceSquared: number; + thresholdSquared: number; +}; diff --git a/packages/shared/src/domains/game/index.ts b/packages/shared/src/domains/game/index.ts index 3b3cd6b..4728014 100644 --- a/packages/shared/src/domains/game/index.ts +++ b/packages/shared/src/domains/game/index.ts @@ -6,3 +6,14 @@ /** ゲーム進行関連の型を再公開する */ export type { PlayerPositionUpdate, TickData } from "./game.type"; + +/** 爆弾当たり判定の型を再公開する */ +export type { + CollisionCircle, + TeamCollisionCircle, + BombHitCheckInput, + BombHitCheckResult, +} from "./bombHit.type"; + +/** 爆弾当たり判定ロジックを再公開する */ +export { checkBombHit } from "./bombHit.logic";