// lib/models/game_level.dart // 11단계 레벨의 모든 속성을 정의하는 클래스 class GameLevel { final int levelIndex; // 1-11 final String name; // "입문 (4x4)" final int blockSize; // 2, 3, 4 final int generatorLevel; // 서버에 요청할 생성기 난이도 (1~5) final String contextId; // 랭킹 ID "SUDOKU_4x4_L1" // 🔽 [신규] 테마 정책 final bool isSequentialNumbers; // L1, L4, L9 (숫자 고정) final bool isSequentialLetters; // L2, L5, L10 (문자 고정) // (둘 다 false이면 HomeScreen에서 선택한 랜덤 테마 사용) const GameLevel({ required this.levelIndex, required this.name, required this.blockSize, required this.generatorLevel, required this.contextId, this.isSequentialNumbers = false, this.isSequentialLetters = false, }); } // 앱 전역에서 사용할 11단계 레벨 정의 class AppLevels { static final List allLevels = [ // --- 2x2 (blockSize = 2) --- const GameLevel( levelIndex: 1, name: "입문 (4x4)", blockSize: 2, generatorLevel: 1, contextId: "SUDOKU_4x4_L1", isSequentialNumbers: true // 👈 순차 숫자 ), const GameLevel( levelIndex: 2, name: "초급 (4x4)", blockSize: 2, generatorLevel: 3, contextId: "SUDOKU_4x4_L3", isSequentialLetters: true // 👈 순차 문자 ), const GameLevel( levelIndex: 3, name: "숙련 (4x4)", blockSize: 2, generatorLevel: 5, contextId: "SUDOKU_4x4_L5" // 👈 랜덤 테마 ), // --- 3x3 (blockSize = 3) --- const GameLevel( levelIndex: 4, name: "쉬움 (9x9)", blockSize: 3, generatorLevel: 1, contextId: "SUDOKU_9x9_L1", isSequentialNumbers: true // 👈 순차 숫자 ), const GameLevel( levelIndex: 5, name: "중급 (9x9)", blockSize: 3, generatorLevel: 2, contextId: "SUDOKU_9x9_L2", isSequentialLetters: true // 👈 순차 문자 ), const GameLevel( levelIndex: 6, name: "상급 (9x9)", blockSize: 3, generatorLevel: 3, contextId: "SUDOKU_9x9_L3" // 👈 랜덤 테마 ), const GameLevel( levelIndex: 7, name: "어려움 (9x9)", blockSize: 3, generatorLevel: 4, contextId: "SUDOKU_9x9_L4" // 👈 랜덤 테마 ), const GameLevel( levelIndex: 8, name: "최상급 (9x9)", blockSize: 3, generatorLevel: 5, contextId: "SUDOKU_9x9_L5" // 👈 랜덤 테마 ), // --- 4x4 (blockSize = 4) --- const GameLevel( levelIndex: 9, name: "전문가 (16x16)", blockSize: 4, generatorLevel: 1, contextId: "SUDOKU_16x16_L1", isSequentialNumbers: true // 👈 순차 숫자 ), const GameLevel( levelIndex: 10, name: "마스터 (16x16)", blockSize: 4, generatorLevel: 3, contextId: "SUDOKU_16x16_L3", isSequentialLetters: true // 👈 순차 문자 ), const GameLevel( levelIndex: 11, name: "지옥 (16x16)", blockSize: 4, generatorLevel: 5, contextId: "SUDOKU_16x16_L5" // 👈 랜덤 테마 ), ]; // 인덱스(1-11)로 레벨 정보 찾기 static GameLevel getLevel(int levelIndex) { if (levelIndex < 1) levelIndex = 1; if (levelIndex > allLevels.length) levelIndex = allLevels.length; return allLevels.firstWhere((level) => level.levelIndex == levelIndex, orElse: () => allLevels[0] // 못찾으면 L1 반환 ); } // 랭킹 화면용 맵 (ContextId -> 이름) static Map get contextIdToNameMap { return { for (var level in allLevels) level.contextId : level.name }; } }