========================================================================
ソースコードディレクトリ構造 (Source Code Directory Structure)
========================================================================
1. 概要 (Overview)
------------------------------------------------------------------------
本ドキュメントは apps/client/src,apps/server/src,packages/shared/src 配下の
ソースコード構造を定義する.
プロジェクト全体の構成(設定ファイル・インフラ)については ENV_01 を参照すること.
2. クライアント (apps/client/src)
------------------------------------------------------------------------
2-1. 構成一覧
src/
├── app.tsx # ルートUI
├── index.css # 全体スタイル
├── main.tsx # 起動エントリ
├── vite-env.d.ts # Vite型定義
├── assets/ # 画像素材
├── components/
│ └── LandscapeOnlyGate.tsx # 横向き制御ゲート
├── config/
│ └── index.ts # クライアント設定
├── hooks/
│ ├── useAppFlow.ts # 画面遷移フック
│ ├── useSocketSubscriptions.ts # WS購読フック
│ ├── application/ # アプリケーション層フック
│ └── types/ # フック型定義
├── network/
│ ├── SocketManager.ts # WSクライアント
│ └── handlers/
│ ├── CommonHandler.ts # 共通WSハンドラ
│ ├── GameHandler.ts # ゲームWSハンドラ
│ ├── GameSyncHandler.ts # ゲーム同期ハンドラ
│ ├── LobbyHandler.ts # ロビーWSハンドラ
│ ├── TitleHandler.ts # タイトルWSハンドラ
│ └── socketEventBridge.ts # イベントブリッジ
├── styles/
│ └── safeArea.ts # セーフエリア定義
└── scenes/
├── game/
│ ├── GameManager.ts # ゲーム制御
│ ├── GameScene.tsx # ゲーム画面
│ ├── GameView.tsx # ゲーム描画
│ ├── application/ # ゲームアプリケーション層
│ ├── entities/
│ │ ├── bomb/ # 爆弾エンティティ
│ │ ├── hurricane/ # ハリケーンエンティティ
│ │ ├── map/
│ │ │ ├── GameMapController.ts # マップ制御
│ │ │ ├── GameMapModel.ts # マップモデル
│ │ │ └── GameMapView.ts # マップ描画
│ │ └── player/
│ │ ├── PlayerController.ts # プレイヤー制御
│ │ ├── PlayerModel.ts # プレイヤーモデル
│ │ ├── PlayerRepository.ts # プレイヤーリポジトリ
│ │ └── PlayerView.ts # プレイヤー描画
│ ├── hooks/ # ゲーム画面フック
│ ├── input/
│ │ ├── GameInputOverlay.tsx # 入力オーバーレイ
│ │ ├── bomb/ # 爆弾ボタンUI
│ │ ├── hooks/ # 入力共通フック
│ │ ├── minimap/ # ミニマップUI
│ │ ├── joystick/
│ │ │ ├── common/ # スティック定数・型
│ │ │ ├── model/ # スティックモデル
│ │ │ ├── hooks/ # スティック制御フック
│ │ │ └── presentation/ # スティック描画
│ │ └── presentation/ # 入力UI共通表示
│ ├── presentation/ # ゲームHUD
│ └── styles/ # ゲーム画面スタイル
├── lobby/
│ ├── LobbyScene.tsx # ロビー画面
│ ├── components/ # モーダル・設定UI
│ ├── presentation/ # ロビー表示ロジック
│ └── styles/ # ロビースタイル
├── result/
│ ├── ResultScene.tsx # 結果画面
│ ├── components/ # ランキング・統計表示
│ ├── hooks/ # 結果画面フック
│ ├── styles/ # 結果画面スタイル
│ └── types/ # 結果画面型定義
├── shared/
│ └── styles/ # シーン共通スタイル
└── title/
└── TitleScene.tsx # タイトル画面
2-2. 設計方針
・scenes/ 配下にシーン単位(title, lobby, game, result)で分割する
・各シーンは MVC ベースの構成とし,entities/ に描画対象を集約する
・network/ 層がサーバーとの通信を担当し,scenes/ 内から直接 protocol を参照しない
3. サーバー (apps/server/src)
------------------------------------------------------------------------
3-1. 構成一覧
src/
├── index.ts # サーバー起点
├── application/
│ └── coordinators/ # アプリ統合制御
├── common/ # 共通ユーティリティ
├── config/ # サーバー設定
├── logging/
│ ├── logger.ts # ログ出力
│ ├── constants/ # ログ定数
│ └── contracts/ # ログ契約型
├── domains/
│ ├── game/
│ │ ├── GameManager.ts # ゲーム状態管理
│ │ ├── application/
│ │ │ ├── ports/
│ │ │ │ └── gameUseCasePorts.ts # ユースケース入出力境界
│ │ │ ├── services/
│ │ │ │ ├── GameSessionLifecycleService.ts # セッション管理
│ │ │ │ ├── GamePlayerOperationService.ts # プレイヤー操作
│ │ │ │ ├── GameRoomSession.ts # ルームセッション
│ │ │ │ ├── TeamAssignmentService.ts # チーム割当
│ │ │ │ ├── currentPlayersBootstrapBuilder.ts # 初期プレイヤー構築
│ │ │ │ ├── gameResultCalculator.ts # 結果算出
│ │ │ │ └── bot/ # Bot AIシステム
│ │ │ └── useCases/ # ゲームユースケース
│ │ ├── entities/
│ │ │ ├── bomb/ # 爆弾エンティティ
│ │ │ ├── map/
│ │ │ │ └── MapStore.ts # マップ状態保持
│ │ │ └── player/
│ │ │ └── Player.ts # サーバーPlayer
│ │ └── loop/
│ │ ├── GameLoop.ts # 固定ループ (20Hz)
│ │ ├── HurricaneSystem.ts # ハリケーン制御
│ │ └── hurricane/ # ハリケーン詳細処理
│ └── room/
│ ├── RoomManager.ts # ルーム管理
│ └── application/
│ ├── ports/
│ │ └── roomUseCasePorts.ts # ユースケース入出力境界
│ ├── services/ # ルームサービス群
│ └── useCases/ # ルームユースケース
└── network/
├── SocketManager.ts # WS接続管理
├── adapters/
│ ├── socketEmitters.ts # 送信アダプタ
│ ├── gamePayloadSanitizers.ts # ゲームペイロード検証・整形
│ └── realtimeRoomSyncState.ts # リアルタイムルーム同期状態
├── handlers/
│ ├── CommonHandler.ts # 共通WSハンドラ
│ ├── connectionEventLogger.ts # 接続イベントログ
│ ├── createOutputAdapters.ts # 出力アダプタ生成
│ ├── eventDefinitionRegistrar.ts # イベント定義登録
│ ├── orchestratorEventLogger.ts # オーケストレータログ
│ ├── payloadGuard.ts # ペイロードガード
│ ├── registerConnectionHandlers.ts # 接続ハンドラ登録
│ ├── socketEventBridge.ts # イベントブリッジ
│ ├── registration/ # 接続登録コンテキスト
│ ├── game/
│ │ ├── registerGameHandlers.ts # ゲーム受信イベント配線
│ │ ├── createGameOutputAdapter.ts # ゲーム出力アダプタ生成
│ │ ├── gameEventOrchestrators.ts # ゲームイベントオーケストレータ
│ │ ├── aoi/ # 視認範囲フィルタ処理
│ │ ├── runtime/ # ゲームランタイム解決
│ │ └── services/ # ゲーム同期サービス群
│ └── room/
│ ├── registerRoomHandlers.ts # ルーム受信イベント配線
│ ├── createRoomOutputAdapter.ts # ルーム出力アダプタ生成
│ └── roomEventOrchestrators.ts # ルームイベントオーケストレータ
├── bootstrap/
│ ├── boot.ts # 起動配線
│ ├── createHttpServer.ts # HTTP生成
│ ├── createIo.ts # Socket.IO生成
│ └── createServerRuntime.ts # ランタイム生成
├── types/ # ネットワーク型定義
└── validation/ # ペイロード検証
3-2. 設計方針
・domains/ にビジネスロジックを集約し,game/ と room/ に分離する
・network/ 層が Socket.IO の接続管理・イベント配線を担当する
・domains/ は protocol を直接参照せず,ports/ 経由で network 層と連携する
・loop/ 配下にサーバーティック(20Hz)とハリケーンシステムを配置する
4. 共有パッケージ (packages/shared/src)
------------------------------------------------------------------------
4-1. 構成一覧
src/
├── index.ts # 共有エクスポート
├── config/
│ ├── index.ts # 設定エクスポート
│ ├── gameConfig.ts # 共通定数
│ ├── networkConfig.ts # 通信設定
│ └── teamValidators.ts # チーム検証
├── domains/
│ ├── app/
│ │ ├── app.const.ts # アプリ定数
│ │ └── app.type.ts # アプリ型
│ ├── game/
│ │ ├── aoi/ # 視認範囲 (Area of Interest)
│ │ ├── bombHit/ # 爆弾判定ロジック・型
│ │ ├── gridMap/
│ │ │ ├── gridMap.logic.ts # マップ計算
│ │ │ ├── gridMap.type.ts # マップ型定義
│ │ │ └── groupedCellUpdates.ts # セル更新グループ化
│ │ ├── player/
│ │ │ ├── player.type.ts # プレイヤー型
│ │ │ └── moveSync.ts # 移動同期ロジック
│ │ └── tick/ # ティックシステム
│ └── room/
│ ├── room.const.ts # ルーム定数
│ └── room.type.ts # ルーム型
└── protocol/
├── socketEvents.ts # イベント名定義
├── eventPayloads.ts # ペイロード再公開
├── eventPayloadMaps.ts # 型マッピング
├── socketEventBridge.ts # 型安全ブリッジ
├── events.ts # イベント再公開
├── bombIdentity.ts # 爆弾一意性保証
├── payloads/
│ ├── commonPayloads.ts # 共通ペイロード型
│ ├── gamePayloads.ts # ゲームペイロード型
│ ├── lobbyPayloads.ts # ロビーペイロード型
│ └── playerHitEffectPayloads.ts # ヒットエフェクト型
└── maps/
├── commonEventPayloadMap.ts # 共通イベントマップ
├── gameEventPayloadMap.ts # ゲームイベントマップ
└── lobbyEventPayloadMap.ts # ロビーイベントマップ
4-2. 設計方針
・client と server の両方から import される「真実の定義場所」として機能する
・config/ にゲーム定数・通信設定を集約する
・domains/ にドメインロジック(移動計算・マップ・判定)を配置する
・protocol/ にソケットイベント定義・ペイロード型・型マッピングを一元管理する
・protocol/events.ts は再公開専用とし,型本体を置かない(GUIDE_05 参照)