diff --git a/apps/client/src/scenes/game/entities/map/GameMapView.ts b/apps/client/src/scenes/game/entities/map/GameMapView.ts index 5c5185b..c065a25 100644 --- a/apps/client/src/scenes/game/entities/map/GameMapView.ts +++ b/apps/client/src/scenes/game/entities/map/GameMapView.ts @@ -98,8 +98,9 @@ /** チームIDから塗り色の16進数カラー値を取得する */ private toHexColor(teamId: number): number { + config.assertValidTeamId(teamId); const { TEAM_COLORS } = config.GAME_CONFIG; - const colorString = TEAM_COLORS[teamId] || '#FFFFFF'; + const colorString = TEAM_COLORS[teamId]; return parseInt(colorString.replace('#', '0x'), 16); } } \ No newline at end of file diff --git a/apps/client/src/scenes/game/entities/player/PlayerView.ts b/apps/client/src/scenes/game/entities/player/PlayerView.ts index fed76a3..2717ebd 100644 --- a/apps/client/src/scenes/game/entities/player/PlayerView.ts +++ b/apps/client/src/scenes/game/entities/player/PlayerView.ts @@ -10,7 +10,7 @@ public readonly displayObject: Sprite; constructor(teamId: number, isLocal: boolean) { - const { PLAYER_RADIUS_PX } = config.GAME_CONFIG; + const { PLAYER_RADIUS_PX, TEAM_COUNT } = config.GAME_CONFIG; // 🌟 1. チームIDと画像ファイル名の紐づけ(すべて .svg に変更しました!) const characterImages = [ @@ -20,8 +20,16 @@ "/yellow.svg", // teamId: 3 のときの画像 ]; + if (characterImages.length !== TEAM_COUNT) { + throw new Error( + `GAME_CONFIG mismatch: characterImages length (${characterImages.length}) must equal TEAM_COUNT (${TEAM_COUNT})`, + ); + } + + config.assertValidTeamId(teamId); + // 配列から対応する画像ファイル名を取得(デフォルトは red.svg) - const imageFileName = (characterImages[teamId] || "/red.svg").replace( + const imageFileName = characterImages[teamId].replace( /^\//, "", ); diff --git a/apps/server/src/domains/game/application/services/TeamAssignmentService.ts b/apps/server/src/domains/game/application/services/TeamAssignmentService.ts index 4ee8c50..fe9c33b 100644 --- a/apps/server/src/domains/game/application/services/TeamAssignmentService.ts +++ b/apps/server/src/domains/game/application/services/TeamAssignmentService.ts @@ -10,10 +10,8 @@ * 現在のプレイヤー状況から、最も人数が少ないチームIDを算出する */ public static getBalancedTeamId(currentPlayers: Map): number { + config.validateTeamConfig(); const teamCount = config.GAME_CONFIG.TEAM_COUNT; - if (config.GAME_CONFIG.TEAM_COLORS.length !== teamCount) { - throw new Error("GAME_CONFIG mismatch: TEAM_COLORS length must equal TEAM_COUNT"); - } const teamPopulations = new Array(teamCount).fill(0); // 現在の各チームの所属人数を数え上げる diff --git a/packages/shared/src/config/gameConfig.ts b/packages/shared/src/config/gameConfig.ts index b072e01..51ca802 100644 --- a/packages/shared/src/config/gameConfig.ts +++ b/packages/shared/src/config/gameConfig.ts @@ -60,4 +60,24 @@ MAP_BG_COLOR: 0x111111, // 何も塗っていないマス(背景)の色 MAP_GRID_COLOR: 0x333333, // グリッド線の色 MAP_BORDER_COLOR: 0xff4444, // プレイ領域外枠の色 -} as const; \ No newline at end of file +} as const; + +/** TEAM_COUNT と TEAM_COLORS の整合性を検証する */ +export const validateTeamConfig = (): void => { + const { TEAM_COUNT, TEAM_COLORS } = GAME_CONFIG; + if (TEAM_COLORS.length !== TEAM_COUNT) { + throw new Error( + `GAME_CONFIG mismatch: TEAM_COLORS length (${TEAM_COLORS.length}) must equal TEAM_COUNT (${TEAM_COUNT})`, + ); + } +}; + +/** teamId が有効範囲内かを検証する */ +export const assertValidTeamId = (teamId: number): void => { + validateTeamConfig(); + + const { TEAM_COUNT } = GAME_CONFIG; + if (!Number.isInteger(teamId) || teamId < 0 || teamId >= TEAM_COUNT) { + throw new Error(`Invalid teamId: ${teamId}`); + } +}; \ No newline at end of file diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 75f5253..e34af47 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -1,2 +1,3 @@ export { GAME_CONFIG } from "./gameConfig"; +export { validateTeamConfig, assertValidTeamId } from "./gameConfig"; export { NETWORK_CONFIG } from "./networkConfig";