diff --git a/apps/client/src/scenes/game/application/BombHitContextProvider.ts b/apps/client/src/scenes/game/application/BombHitContextProvider.ts index dd38584..ce3a8c0 100644 --- a/apps/client/src/scenes/game/application/BombHitContextProvider.ts +++ b/apps/client/src/scenes/game/application/BombHitContextProvider.ts @@ -7,7 +7,7 @@ import { LocalPlayerController } from "@client/scenes/game/entities/player/PlayerController"; import type { domain } from "@repo/shared"; -type TeamCollisionCircle = domain.game.TeamCollisionCircle; +type TeamCollisionCircle = domain.game.bombHit.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 a466e8d..822e51b 100644 --- a/apps/client/src/scenes/game/application/BombHitOrchestrator.ts +++ b/apps/client/src/scenes/game/application/BombHitOrchestrator.ts @@ -5,7 +5,7 @@ */ import { domain } from "@repo/shared"; -const { checkBombHit } = domain.game; +const { checkBombHit } = domain.game.bombHit; import type { BombExplodedPayload } from "@client/scenes/game/entities/bomb/BombManager"; import { BombHitContextProvider } from "./BombHitContextProvider"; diff --git a/packages/shared/src/domains/game/bombHit.logic.ts b/packages/shared/src/domains/game/bombHit.logic.ts deleted file mode 100644 index 54907b0..0000000 --- a/packages/shared/src/domains/game/bombHit.logic.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * 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 deleted file mode 100644 index 6be0147..0000000 --- a/packages/shared/src/domains/game/bombHit.type.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * 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/bombHit/bombHit.logic.ts b/packages/shared/src/domains/game/bombHit/bombHit.logic.ts new file mode 100644 index 0000000..54907b0 --- /dev/null +++ b/packages/shared/src/domains/game/bombHit/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/bombHit.type.ts b/packages/shared/src/domains/game/bombHit/bombHit.type.ts new file mode 100644 index 0000000..6be0147 --- /dev/null +++ b/packages/shared/src/domains/game/bombHit/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/bombHit/index.ts b/packages/shared/src/domains/game/bombHit/index.ts new file mode 100644 index 0000000..3a903bd --- /dev/null +++ b/packages/shared/src/domains/game/bombHit/index.ts @@ -0,0 +1,16 @@ +/** + * index + * bombHit サブドメインの公開要素を集約して再公開する + * 爆弾当たり判定の型とロジックを外部利用向けに束ねる + */ + +/** 爆弾当たり判定の型を再公開する */ +export type { + CollisionCircle, + TeamCollisionCircle, + BombHitCheckInput, + BombHitCheckResult, +} from "./bombHit.type"; + +/** 爆弾当たり判定ロジックを再公開する */ +export { checkBombHit } from "./bombHit.logic"; diff --git a/packages/shared/src/domains/game/game.type.ts b/packages/shared/src/domains/game/game.type.ts deleted file mode 100644 index 1f880a3..0000000 --- a/packages/shared/src/domains/game/game.type.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * game.type - * ゲーム進行で利用する共有型を定義する - */ -import type { CellUpdate } from "../gridMap/gridMap.type"; -import type { PlayerData } from "../player/player.type"; - -/** 1ティックで配信するプレイヤー座標差分 */ -export type PlayerPositionUpdate = Pick; - -/** 1ティック分のプレイヤー差分更新とマップ差分を表す共有データ */ -export interface TickData { - playerUpdates: PlayerPositionUpdate[]; - cellUpdates: CellUpdate[]; -} diff --git a/packages/shared/src/domains/game/gridMap/gridMap.logic.ts b/packages/shared/src/domains/game/gridMap/gridMap.logic.ts new file mode 100644 index 0000000..bb9d466 --- /dev/null +++ b/packages/shared/src/domains/game/gridMap/gridMap.logic.ts @@ -0,0 +1,20 @@ +import { GAME_CONFIG } from "../../../config/gameConfig"; + +/** + * グリッド座標から1次元配列インデックスを取得する(中心点判定) + */ +export function getGridIndexFromPosition(x: number, y: number): number | null { + const { GRID_COLS, GRID_ROWS } = GAME_CONFIG; + + // 座標がどのマス(列・行)に属するか計算 + const col = Math.floor(x); + const row = Math.floor(y); + + // マップ外の場合は null を返す + if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) { + return null; + } + + // 1次元配列のインデックスに変換 (row * 幅 + col) + return row * GRID_COLS + col; +} diff --git a/packages/shared/src/domains/game/gridMap/gridMap.type.ts b/packages/shared/src/domains/game/gridMap/gridMap.type.ts new file mode 100644 index 0000000..c59a2da --- /dev/null +++ b/packages/shared/src/domains/game/gridMap/gridMap.type.ts @@ -0,0 +1,16 @@ +/** + * gridMap.type + * グリッドマップ領域で利用する共有型を定義する + * マップ状態と差分更新の契約を集約する + */ + +/** マップ全体の色状態を保持する構造 */ +export interface MapState { + gridColors: number[]; +} + +/** マップ1セル分の差分更新情報 */ +export interface CellUpdate { + index: number; + teamId: number; +} diff --git a/packages/shared/src/domains/game/gridMap/index.ts b/packages/shared/src/domains/game/gridMap/index.ts new file mode 100644 index 0000000..cef8bbc --- /dev/null +++ b/packages/shared/src/domains/game/gridMap/index.ts @@ -0,0 +1,10 @@ +/** + * index + * gridMap サブドメインの公開要素を集約して再公開する + * 型定義と座標変換ロジックを外部利用向けに束ねる + */ + +/** グリッドマップ関連の型を再公開する */ +export type { MapState, CellUpdate } from "./gridMap.type"; +/** グリッド座標変換ロジックを再公開する */ +export { getGridIndexFromPosition } from "./gridMap.logic"; diff --git a/packages/shared/src/domains/game/index.ts b/packages/shared/src/domains/game/index.ts index 4728014..69ae808 100644 --- a/packages/shared/src/domains/game/index.ts +++ b/packages/shared/src/domains/game/index.ts @@ -1,19 +1,14 @@ /** * index * game ドメインの公開要素を集約して再公開する - * ゲーム進行で利用する型を外部利用向けに束ねる + * ゲーム進行配下のサブドメインを外部利用向けに束ねる */ -/** ゲーム進行関連の型を再公開する */ -export type { PlayerPositionUpdate, TickData } from "./game.type"; - -/** 爆弾当たり判定の型を再公開する */ -export type { - CollisionCircle, - TeamCollisionCircle, - BombHitCheckInput, - BombHitCheckResult, -} from "./bombHit.type"; - -/** 爆弾当たり判定ロジックを再公開する */ -export { checkBombHit } from "./bombHit.logic"; +/** tick同期サブドメインを再公開する */ +export * as tick from "./tick"; +/** プレイヤーサブドメインを再公開する */ +export * as player from "./player"; +/** グリッドマップサブドメインを再公開する */ +export * as gridMap from "./gridMap"; +/** 爆弾当たり判定サブドメインを再公開する */ +export * as bombHit from "./bombHit"; diff --git a/packages/shared/src/domains/game/player/index.ts b/packages/shared/src/domains/game/player/index.ts new file mode 100644 index 0000000..d302a12 --- /dev/null +++ b/packages/shared/src/domains/game/player/index.ts @@ -0,0 +1,8 @@ +/** + * index + * player サブドメインの公開要素を集約して再公開する + * プレイヤー契約で利用する型を外部利用向けに束ねる + */ + +/** プレイヤー契約関連の型を再公開する */ +export type { PlayerData, MovePayload } from "./player.type"; diff --git a/packages/shared/src/domains/game/player/player.type.ts b/packages/shared/src/domains/game/player/player.type.ts new file mode 100644 index 0000000..108052d --- /dev/null +++ b/packages/shared/src/domains/game/player/player.type.ts @@ -0,0 +1,22 @@ +/** + * player.type + * プレイヤー領域で利用する共有型を定義する + * クライアントとサーバーで参照する契約を集約する + */ + +/** クライアントとサーバー間で共有するプレイヤー基本情報 */ +export interface PlayerData { + id: string; + name: string; + // グリッド単位の座標 + x: number; + y: number; + teamId: number; // 0〜3 のチームID +} + +/** MOVE イベントで利用する移動入力ペイロード */ +export interface MovePayload { + // グリッド単位の座標 + x: number; + y: number; +} diff --git a/packages/shared/src/domains/game/tick/index.ts b/packages/shared/src/domains/game/tick/index.ts new file mode 100644 index 0000000..2b0417e --- /dev/null +++ b/packages/shared/src/domains/game/tick/index.ts @@ -0,0 +1,8 @@ +/** + * index + * tick サブドメインの公開要素を集約して再公開する + * tick同期で利用する型を外部利用向けに束ねる + */ + +/** tick同期関連の型を再公開する */ +export type { PlayerPositionUpdate, TickData } from "./tick.type"; diff --git a/packages/shared/src/domains/game/tick/tick.type.ts b/packages/shared/src/domains/game/tick/tick.type.ts new file mode 100644 index 0000000..38e0c63 --- /dev/null +++ b/packages/shared/src/domains/game/tick/tick.type.ts @@ -0,0 +1,15 @@ +/** + * tick.type + * ゲーム進行のtick同期で利用する共有型を定義する + */ +import type { CellUpdate } from "../gridMap/gridMap.type"; +import type { PlayerData } from "../player/player.type"; + +/** 1ティックで配信するプレイヤー座標差分 */ +export type PlayerPositionUpdate = Pick; + +/** 1ティック分のプレイヤー差分更新とマップ差分を表す共有データ */ +export interface TickData { + playerUpdates: PlayerPositionUpdate[]; + cellUpdates: CellUpdate[]; +} diff --git a/packages/shared/src/domains/gridMap/gridMap.logic.ts b/packages/shared/src/domains/gridMap/gridMap.logic.ts deleted file mode 100644 index 31a3ffe..0000000 --- a/packages/shared/src/domains/gridMap/gridMap.logic.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { GAME_CONFIG } from "../../config/gameConfig"; - -/** - * グリッド座標から1次元配列インデックスを取得する(中心点判定) - */ -export function getGridIndexFromPosition(x: number, y: number): number | null { - const { GRID_COLS, GRID_ROWS } = GAME_CONFIG; - - // 座標がどのマス(列・行)に属するか計算 - const col = Math.floor(x); - const row = Math.floor(y); - - // マップ外の場合は null を返す - if (col < 0 || col >= GRID_COLS || row < 0 || row >= GRID_ROWS) { - return null; - } - - // 1次元配列のインデックスに変換 (row * 幅 + col) - return row * GRID_COLS + col; -} \ No newline at end of file diff --git a/packages/shared/src/domains/gridMap/gridMap.type.ts b/packages/shared/src/domains/gridMap/gridMap.type.ts deleted file mode 100644 index 3e7811a..0000000 --- a/packages/shared/src/domains/gridMap/gridMap.type.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * gridMap.type - * グリッドマップ領域で利用する共有型を定義する - * マップ状態と差分更新の契約を集約する - */ - -/** マップ全体の色状態を保持する構造 */ -export interface MapState { - gridColors: number[]; -} - -/** マップ1セル分の差分更新情報 */ -export interface CellUpdate { - index: number; - teamId: number; -} \ No newline at end of file diff --git a/packages/shared/src/domains/gridMap/index.ts b/packages/shared/src/domains/gridMap/index.ts deleted file mode 100644 index 5daa48f..0000000 --- a/packages/shared/src/domains/gridMap/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * index - * gridMap ドメインの公開要素を集約して再公開する - * 型定義と座標変換ロジックを外部利用向けに束ねる - */ - -/** グリッドマップ関連の型を再公開する */ -export type { MapState, CellUpdate } from "./gridMap.type"; -/** グリッド座標変換ロジックを再公開する */ -export { getGridIndexFromPosition } from "./gridMap.logic"; diff --git a/packages/shared/src/domains/index.ts b/packages/shared/src/domains/index.ts index 15dcb80..1d8e204 100644 --- a/packages/shared/src/domains/index.ts +++ b/packages/shared/src/domains/index.ts @@ -8,9 +8,10 @@ export * as app from "./app"; /** game ドメインを再公開する */ export * as game from "./game"; -/** gridMap ドメインを再公開する */ -export * as gridMap from "./gridMap"; -/** player ドメインを再公開する */ -export * as player from "./player"; /** room ドメインを再公開する */ export * as room from "./room"; + +/** 後方互換: game 配下へ移動した player を旧パスでも公開する */ +export * as player from "./game/player"; +/** 後方互換: game 配下へ移動した gridMap を旧パスでも公開する */ +export * as gridMap from "./game/gridMap"; diff --git a/packages/shared/src/domains/player/index.ts b/packages/shared/src/domains/player/index.ts deleted file mode 100644 index 9ce56af..0000000 --- a/packages/shared/src/domains/player/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * index - * player ドメインの公開要素を集約して再公開する - * プレイヤー契約で利用する型を外部利用向けに束ねる - */ - -/** プレイヤー契約関連の型を再公開する */ -export type { PlayerData, MovePayload } from "./player.type"; diff --git a/packages/shared/src/domains/player/player.type.ts b/packages/shared/src/domains/player/player.type.ts deleted file mode 100644 index 108052d..0000000 --- a/packages/shared/src/domains/player/player.type.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * player.type - * プレイヤー領域で利用する共有型を定義する - * クライアントとサーバーで参照する契約を集約する - */ - -/** クライアントとサーバー間で共有するプレイヤー基本情報 */ -export interface PlayerData { - id: string; - name: string; - // グリッド単位の座標 - x: number; - y: number; - teamId: number; // 0〜3 のチームID -} - -/** MOVE イベントで利用する移動入力ペイロード */ -export interface MovePayload { - // グリッド単位の座標 - x: number; - y: number; -} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 4f69fcd..86c7bc4 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -10,13 +10,13 @@ /** 既存互換のため,以下は従来どおり再公開する */ /** グリッドマップ関連の型定義を再公開 */ -export * as gridMapTypes from "./domains/gridMap/gridMap.type"; +export * as gridMapTypes from "./domains/game/gridMap/gridMap.type"; /** グリッドマップ関連のロジックを再公開 */ -export * as gridMapLogic from "./domains/gridMap/gridMap.logic"; +export * as gridMapLogic from "./domains/game/gridMap/gridMap.logic"; /** プレイヤー関連の型定義を再公開 */ -export * as playerTypes from "./domains/player/player.type"; +export * as playerTypes from "./domains/game/player/player.type"; /** ゲーム関連の型定義を再公開 */ -export * as gameTypes from "./domains/game/game.type"; +export * as gameTypes from "./domains/game/tick/tick.type"; /** アプリ状態関連の型定義を再公開 */ export * as appTypes from "./domains/app/app.type"; /** アプリ状態関連の定数を再公開 */ diff --git a/packages/shared/src/protocol/payloads/gamePayloads.ts b/packages/shared/src/protocol/payloads/gamePayloads.ts index d0f704d..d70c94b 100644 --- a/packages/shared/src/protocol/payloads/gamePayloads.ts +++ b/packages/shared/src/protocol/payloads/gamePayloads.ts @@ -3,12 +3,12 @@ * ゲーム進行イベントで利用するペイロード型を定義する * プレイヤー差分,マップ差分,開始終了系の契約を集約する */ -import type { PlayerPositionUpdate } from "../../domains/game/game.type"; -import type { CellUpdate } from "../../domains/gridMap/gridMap.type"; +import type { PlayerPositionUpdate } from "../../domains/game/tick/tick.type"; +import type { CellUpdate } from "../../domains/game/gridMap/gridMap.type"; import type { MovePayload as PlayerMovePayload, PlayerData, -} from "../../domains/player/player.type"; +} from "../../domains/game/player/player.type"; /** game-result イベントで送受信するランキング1行 */ export type GameResultRanking = {