diff --git a/apps/client/src/app.tsx b/apps/client/src/app.tsx index 6392e30..22010a6 100644 --- a/apps/client/src/app.tsx +++ b/apps/client/src/app.tsx @@ -6,7 +6,7 @@ import { LobbyScene } from "./scenes/LobbyScene"; import { GameScene } from "./scenes/GameScene"; -import { GameState, type Room } from "@repo/shared/src/types/room"; +import { GameState, type Room } from "@repo/shared/src/domains/room/room.type"; export default function App() { // 現在シーン状態 diff --git a/apps/client/src/entities/GameMap.ts b/apps/client/src/entities/GameMap.ts index 90c6cbe..7fdd5cc 100644 --- a/apps/client/src/entities/GameMap.ts +++ b/apps/client/src/entities/GameMap.ts @@ -1,7 +1,7 @@ // apps/client/src/game/map/GameMap.ts (パスは適宜読み替えてください) import { Container, Graphics } from "pixi.js"; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; -import type { MapState, CellUpdate } from "@repo/shared/src/types/map"; +import type { MapState, CellUpdate } from "@repo/shared/src/domains/gridMap/gridMap.type"; // 親クラスを Graphics から Container に変更し、レイヤー管理を可能にする export class GameMap extends Container { diff --git a/apps/client/src/entities/Player.ts b/apps/client/src/entities/Player.ts index 302b80e..9bc86c6 100644 --- a/apps/client/src/entities/Player.ts +++ b/apps/client/src/entities/Player.ts @@ -1,6 +1,6 @@ import { Graphics } from 'pixi.js'; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; -import type { PlayerData } from "@repo/shared/src/types/player"; +import type { PlayerData } from "@repo/shared/src/domains/player/player.type"; /** * プレイヤーの共通基底クラス(描画と基本データの保持) diff --git a/apps/client/src/managers/GameManager.ts b/apps/client/src/managers/GameManager.ts index e62c924..0602885 100644 --- a/apps/client/src/managers/GameManager.ts +++ b/apps/client/src/managers/GameManager.ts @@ -1,7 +1,7 @@ import { Application, Container, Ticker } from "pixi.js"; import { socketClient } from "../network/SocketClient"; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; -import type { PlayerData } from "@repo/shared/src/types/player"; +import type { PlayerData } from "@repo/shared/src/domains/player/player.type"; import { BasePlayer, LocalPlayer, RemotePlayer } from "../entities/Player"; import { GameMap } from "../entities/GameMap"; import { MAX_DIST } from "../input/VirtualJoystick"; diff --git a/apps/client/src/network/SocketClient.ts b/apps/client/src/network/SocketClient.ts index efad8fd..17b2628 100644 --- a/apps/client/src/network/SocketClient.ts +++ b/apps/client/src/network/SocketClient.ts @@ -1,8 +1,8 @@ import { io, Socket } from "socket.io-client"; import { SocketEvents } from "@repo/shared/src/protocol/events"; -import type { MovePayload, PlayerData } from "@repo/shared/src/types/player"; -import type { CellUpdate } from "@repo/shared/src/types/map"; -import type { Room, JoinRoomPayload } from "@repo/shared/src/types/room"; +import type { MovePayload, PlayerData } from "@repo/shared/src/domains/player/player.type"; +import type { CellUpdate } from "@repo/shared/src/domains/gridMap/gridMap.type"; +import type { Room, JoinRoomPayload } from "@repo/shared/src/domains/room/room.type"; /** * サーバー WebSocket 通信管理クラス diff --git a/apps/client/src/scenes/LobbyScene.tsx b/apps/client/src/scenes/LobbyScene.tsx index a8b7b3c..f5fcc04 100644 --- a/apps/client/src/scenes/LobbyScene.tsx +++ b/apps/client/src/scenes/LobbyScene.tsx @@ -1,4 +1,4 @@ -import type { Room } from "@repo/shared/src/types/room"; +import type { Room } from "@repo/shared/src/domains/room/room.type"; type Props = { room: Room | null; diff --git a/apps/client/src/scenes/TitleScene.tsx b/apps/client/src/scenes/TitleScene.tsx index bf8b5f1..7d34f71 100644 --- a/apps/client/src/scenes/TitleScene.tsx +++ b/apps/client/src/scenes/TitleScene.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; // ルーム参加時送信ペイロード型 -import type { JoinRoomPayload } from "@repo/shared/src/types/room"; +import type { JoinRoomPayload } from "@repo/shared/src/domains/room/room.type"; type Props = { // 入室実行時呼び出しコールバック diff --git a/apps/server/src/entities/Player.ts b/apps/server/src/entities/Player.ts index cac7401..edc7976 100644 --- a/apps/server/src/entities/Player.ts +++ b/apps/server/src/entities/Player.ts @@ -1,4 +1,4 @@ -import type { PlayerData } from "@repo/shared/src/types/player"; +import type { PlayerData } from "@repo/shared/src/domains/player/player.type"; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; // サーバー側保持プレイヤー状態モデル diff --git a/apps/server/src/handlers/GameHandler.ts b/apps/server/src/handlers/GameHandler.ts index a555402..6477919 100644 --- a/apps/server/src/handlers/GameHandler.ts +++ b/apps/server/src/handlers/GameHandler.ts @@ -2,8 +2,8 @@ import { GameManager } from "../managers/GameManager.js"; import { RoomManager } from "../managers/RoomManager.js"; import { SocketEvents } from "@repo/shared/src/protocol/events"; -import { RoomStatus } from "@repo/shared/src/types/room"; -import type { MovePayload } from "@repo/shared/src/types/player"; +import { RoomStatus } from "@repo/shared/src/domains/room/room.type"; +import type { MovePayload } from "@repo/shared/src/domains/player/player.type"; export const registerGameHandlers = (io: Server, socket: Socket, gameManager: GameManager, roomManager: RoomManager) => { @@ -15,7 +15,7 @@ room.status = RoomStatus.PLAYING; // 同ルーム全プレイヤーのゲーム管理登録 - room.players.forEach(p => { + room.players.forEach((p: { id: string }) => { gameManager.addPlayer(p.id); }); diff --git a/apps/server/src/handlers/RoomHandler.ts b/apps/server/src/handlers/RoomHandler.ts index 6a239a3..e3f0e23 100644 --- a/apps/server/src/handlers/RoomHandler.ts +++ b/apps/server/src/handlers/RoomHandler.ts @@ -1,7 +1,7 @@ import { Server, Socket } from "socket.io"; import { RoomManager } from "../managers/RoomManager.js"; import { SocketEvents } from "@repo/shared/src/protocol/events"; -import type { JoinRoomPayload } from "@repo/shared/src/types/room"; +import type { JoinRoomPayload } from "@repo/shared/src/domains/room/room.type"; export const registerRoomHandlers = (io: Server, socket: Socket, roomManager: RoomManager) => { diff --git a/apps/server/src/managers/RoomManager.ts b/apps/server/src/managers/RoomManager.ts index 3229016..3be6e62 100644 --- a/apps/server/src/managers/RoomManager.ts +++ b/apps/server/src/managers/RoomManager.ts @@ -1,4 +1,4 @@ -import { Room, RoomStatus, RoomMember } from "@repo/shared/src/types/room"; +import { Room, RoomStatus, RoomMember } from "@repo/shared/src/domains/room/room.type"; import { GAME_CONFIG } from "@repo/shared/src/config/gameConfig"; export class RoomManager { diff --git "a/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" "b/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" index fb7b4b7..ef06a45 100644 --- "a/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" +++ "b/docs/01_Env/ENV_01_\347\222\260\345\242\203\346\247\213\347\257\211\343\203\273\346\212\200\350\241\223\343\202\271\343\202\277\343\203\203\343\202\257.txt" @@ -66,13 +66,15 @@ └── packages/ └── shared/ # 【最重要】「真実」の定義場所(型、定数、純粋ロジック) ├── src/ - │ ├── config/ # 共通定数(gameConfig.ts) - │ ├── logic/ # 共通ロジック(gridMap.ts) - │ ├── protocol/ # 通信イベント定義(events.ts) - │ ├── types/ # 型定義(map.ts, payloads.ts, player.ts, room.ts) + │ ├── config/ # 共通定数 (gameConfig.ts) + │ ├── domains/ # ドメイン別ロジック・型定義 + │ │ ├── gridMap/# マップ・グリッド関連 (gridMap.logic.ts, gridMap.type.ts) + │ │ ├── player/ # プレイヤー関連 (player.type.ts) + │ │ └── room/ # ルーム・進行管理 (room.type.ts) + │ ├── protocol/ # 通信イベント・バイナリ定義 (events.ts) │ └── index.ts # エントリーポイント (tsupビルド対象) ├── tsup.config.ts # ビルド設定 - └── package.json + └── package.json # パッケージ定義 ※ shared は client/server 両方から import して使用する. diff --git a/packages/shared/src/domains/gridMap/gridMap.logic.ts b/packages/shared/src/domains/gridMap/gridMap.logic.ts new file mode 100644 index 0000000..bb28b3f --- /dev/null +++ b/packages/shared/src/domains/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_CELL_SIZE, GRID_COLS, GRID_ROWS } = GAME_CONFIG; + + // 座標がどのマス(列・行)に属するか計算 + const col = Math.floor(x / GRID_CELL_SIZE); + const row = Math.floor(y / GRID_CELL_SIZE); + + // マップ外の場合は 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 new file mode 100644 index 0000000..d85090e --- /dev/null +++ b/packages/shared/src/domains/gridMap/gridMap.type.ts @@ -0,0 +1,8 @@ +export interface MapState { + gridColors: number[]; +} + +export interface CellUpdate { + index: number; + teamId: number; +} \ No newline at end of file diff --git a/packages/shared/src/domains/player/player.type.ts b/packages/shared/src/domains/player/player.type.ts new file mode 100644 index 0000000..ff22892 --- /dev/null +++ b/packages/shared/src/domains/player/player.type.ts @@ -0,0 +1,13 @@ +// クライアント・サーバー間共有プレイヤー基本情報型 +export interface PlayerData { + id: string; + x: number; + y: number; + teamId: number; // 0〜3 のチームID +} + +// 移動イベント送信ペイロード型 +export interface MovePayload { + x: number; + y: number; +} \ No newline at end of file diff --git a/packages/shared/src/domains/room/room.type.ts b/packages/shared/src/domains/room/room.type.ts new file mode 100644 index 0000000..9f88187 --- /dev/null +++ b/packages/shared/src/domains/room/room.type.ts @@ -0,0 +1,38 @@ +// クライアント画面遷移利用ゲーム状態型 +export const GameState = { + TITLE: 'title', + LOBBY: 'lobby', + PLAYING: 'playing', +} as const; +export type GameState = typeof GameState[keyof typeof GameState]; + +// ルーム進行フェーズ状態型 +export const RoomStatus = { + WAITING: 'waiting', + PLAYING: 'playing', + RESULT: 'result', +} as const; +export type RoomStatus = typeof RoomStatus[keyof typeof RoomStatus]; + +// ルーム所属プレイヤー情報型 +export interface RoomMember { + id: string; + name: string; + isOwner: boolean; + isReady: boolean; +} + +// ルーム全体状態データ構造型 +export interface Room { + roomId: string; + ownerId: string; + players: RoomMember[]; + status: RoomStatus; + maxPlayers: number; +} + +// ルーム参加時送信ペイロード型 +export interface JoinRoomPayload { + roomId: string; + playerName: string; +} \ No newline at end of file diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index e1bba2b..e290030 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1,7 +1,7 @@ // shared パッケージ公開 API -export * from './config/gameConfig'; +export * from "./domains/gridMap/gridMap.type"; +export * from "./domains/gridMap/gridMap.logic"; +export * from "./domains/player/player.type"; +export * from "./domains/room/room.type"; export * from "./protocol/events"; -export * from './types/map'; -export * from './types/payloads'; -export * from './types/player'; -export * from './types/room'; \ No newline at end of file +export * from "./config/gameConfig"; \ No newline at end of file diff --git a/packages/shared/src/logic/gridMap.ts b/packages/shared/src/logic/gridMap.ts deleted file mode 100644 index 10dd3b5..0000000 --- a/packages/shared/src/logic/gridMap.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_CELL_SIZE, GRID_COLS, GRID_ROWS } = GAME_CONFIG; - - // 座標がどのマス(列・行)に属するか計算 - const col = Math.floor(x / GRID_CELL_SIZE); - const row = Math.floor(y / GRID_CELL_SIZE); - - // マップ外の場合は 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/types/map.ts b/packages/shared/src/types/map.ts deleted file mode 100644 index d85090e..0000000 --- a/packages/shared/src/types/map.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface MapState { - gridColors: number[]; -} - -export interface CellUpdate { - index: number; - teamId: number; -} \ No newline at end of file diff --git a/packages/shared/src/types/player.ts b/packages/shared/src/types/player.ts deleted file mode 100644 index ff22892..0000000 --- a/packages/shared/src/types/player.ts +++ /dev/null @@ -1,13 +0,0 @@ -// クライアント・サーバー間共有プレイヤー基本情報型 -export interface PlayerData { - id: string; - x: number; - y: number; - teamId: number; // 0〜3 のチームID -} - -// 移動イベント送信ペイロード型 -export interface MovePayload { - x: number; - y: number; -} \ No newline at end of file diff --git a/packages/shared/src/types/room.ts b/packages/shared/src/types/room.ts deleted file mode 100644 index 9f88187..0000000 --- a/packages/shared/src/types/room.ts +++ /dev/null @@ -1,38 +0,0 @@ -// クライアント画面遷移利用ゲーム状態型 -export const GameState = { - TITLE: 'title', - LOBBY: 'lobby', - PLAYING: 'playing', -} as const; -export type GameState = typeof GameState[keyof typeof GameState]; - -// ルーム進行フェーズ状態型 -export const RoomStatus = { - WAITING: 'waiting', - PLAYING: 'playing', - RESULT: 'result', -} as const; -export type RoomStatus = typeof RoomStatus[keyof typeof RoomStatus]; - -// ルーム所属プレイヤー情報型 -export interface RoomMember { - id: string; - name: string; - isOwner: boolean; - isReady: boolean; -} - -// ルーム全体状態データ構造型 -export interface Room { - roomId: string; - ownerId: string; - players: RoomMember[]; - status: RoomStatus; - maxPlayers: number; -} - -// ルーム参加時送信ペイロード型 -export interface JoinRoomPayload { - roomId: string; - playerName: string; -} \ No newline at end of file