// packages/feature_game_cardflip/lib/models/cardflip_models.dart import 'package:flutter/material.dart'; import 'package:service_api/service_api.dart'; enum CardContentType { emoji, // ๐Ÿฐ โ†” ๐Ÿฐ icon, // โญ๏ธ โ†” โญ๏ธ number, // 1 โ†” 1 calculation, // 3+4 โ†” 7 pairWord, // ํ† ๋ผ โ†” ๋‹น๊ทผ } class CardItem { final int id; final String matchId; final String displayContent; bool isFaceUp; bool isMatched; CardItem({ required this.id, required this.matchId, required this.displayContent, this.isFaceUp = false, this.isMatched = false, }); } class CardFlipDifficulty extends GameDifficulty { final int levelIndex; final int rows; final int cols; final int timeLimitSeconds; final CardContentType contentType; const CardFlipDifficulty({ required this.levelIndex, required super.name, required super.contextId, required this.rows, required this.cols, required this.timeLimitSeconds, required this.contentType, }); int get totalCards => rows * cols; } class CardFlipDifficulties { // --- ์ฝ˜ํ…์ธ  ํ’€ --- static const List emojis = [ "๐Ÿถ", "๐Ÿฑ", "๐Ÿญ", "๐Ÿน", "๐Ÿฐ", "๐ŸฆŠ", "๐Ÿป", "๐Ÿผ", "๐Ÿจ", "๐Ÿฏ", "๐Ÿฆ", "๐Ÿฎ", "๐Ÿท", "๐Ÿธ", "๐Ÿต", "๐Ÿ”", "๐Ÿง", "๐Ÿฆ", "๐Ÿค", "๐Ÿฆ†", "๐ŸŽ", "๐ŸŒ", "๐Ÿ‡", "๐Ÿ“", "๐ŸŠ", "๐Ÿ‹", "๐Ÿ‰", "๐Ÿ‘", "๐Ÿ’", "๐Ÿฅ", "โšฝ", "๐Ÿ€", "๐Ÿˆ", "โšพ", "๐ŸŽพ", "๐Ÿ", "๐Ÿ‰", "๐ŸŽฑ", "๐Ÿ“", "๐Ÿธ" ]; // ์—ฐ์ƒ ๋‹จ์–ด ํ’€ (์ด 80+์Œ) static const Map wordPairs = { "ํ† ๋ผ": "๋‹น๊ทผ", "์›์ˆญ์ด": "๋ฐ”๋‚˜๋‚˜", "๋‹ค๋žŒ์ฅ": "๋„ํ† ๋ฆฌ", "๊ณ ์–‘์ด": "์ƒ์„ ", "๊ฐœ": "๋ผˆ๋‹ค๊ท€", "์†Œ": "์—ฌ๋ฌผ", "๋‹ญ": "๋‹ฌ๊ฑ€", "๋ฒŒ": "๊ฟ€", "๊ฑฐ๋ฏธ": "๊ฑฐ๋ฏธ์ค„", "๊ฐœ๊ตฌ๋ฆฌ": "์˜ฌ์ฑ™์ด", "ํŒฌ๋”": "๋Œ€๋‚˜๋ฌด", "ํ˜ธ๋ž‘์ด": "๊ฐ€์ฃฝ", "๋ˆ„์—": "๋ฝ•์žŽ", "์–‘": "์–‘ํ„ธ", "ํŽญ๊ท„": "๋‚จ๊ทน", "์‚ฌ์ž": "์ดˆ์›", "๋ฐ”๋Š˜": "์‹ค", "๋ง์น˜": "๋ชป", "ํ™œ": "ํ™”์‚ด", "์ž๋ฌผ์‡ ": "์—ด์‡ ", "์ˆŸ๊ฐ€๋ฝ": "์ “๊ฐ€๋ฝ", "์ฑ…์ƒ": "์˜์ž", "์‹ ๋ฐœ": "์–‘๋ง", "์žฅ๊ฐ‘": "๋ชฉ๋„๋ฆฌ", "์ง€์šฐ๊ฐœ": "์—ฐํ•„", "์น ํŒ": "๋ถ„ํ•„", "๋ถ“": "๋ฌผ๊ฐ", "๋„์žฅ": "์ธ์ฃผ", "๋ƒ„๋น„": "๋šœ๊ป‘", "์ƒดํ‘ธ": "๋ฆฐ์Šค", "์น˜์•ฝ": "์นซ์†”", "๋น„๋ˆ„": "์ˆ˜๊ฑด", "๋ฐฐ๊ฒŒ": "์ด๋ถˆ", "ํ•ญ์•„๋ฆฌ": "๋šœ๊ป‘", "์•ˆ๊ฒฝ": "์•ˆ๊ฒฝ์ง‘", "ํ•ธ๋“œํฐ": "์ถฉ์ „๊ธฐ", "ํ•ด": "๋‹ฌ", "ํ•˜๋Š˜": "๊ตฌ๋ฆ„", "๋น„": "์šฐ์‚ฐ", "๋ˆˆ": "๋ˆˆ์‚ฌ๋žŒ", "๋ด„": "๊ฝƒ", "์—ฌ๋ฆ„": "๋ถ€์ฑ„", "๊ฐ€์„": "๋‹จํ’", "๊ฒจ์šธ": "๋ˆˆ", "๋ฐ”๋‹ค": "ํŒŒ๋„", "์‚ฐ": "๋‚˜๋ฌด", "์‚ฌ๋ง‰": "์„ ์ธ์žฅ", "๋ฐค": "๋ณ„", "๋ฒˆ๊ฐœ": "์ฒœ๋‘ฅ", "๋ฌด์ง€๊ฐœ": "๋น„์˜จ๋’ค", "ํ™”์‚ฐ": "์šฉ์•”", "์ง€์ง„": "์ง„๋™", "๋ฐฅ": "๊ตญ", "๋นต": "์šฐ์œ ", "์‚ผ๊ฒน์‚ด": "์ƒ์ถ”", "์งœ์žฅ๋ฉด": "๋‹จ๋ฌด์ง€", "์น˜ํ‚จ": "๋ฌด", "๋–ก๋ณถ์ด": "์˜ค๋Ž…", "ํ”ผ์ž": "์ฝœ๋ผ", "ํšŒ": "์ดˆ์žฅ", "๊ฐ์ž": "๊ณ ๊ตฌ๋งˆ", "์†Œ๊ธˆ": "์„คํƒ•", "๊ฐ„์žฅ": "๊ณ ์ถ”์žฅ", "๋œ์žฅ": "์Œˆ์žฅ", "๋‚จ์ž": "์—ฌ์ž", "๋ถ€๋ชจ": "์ž์‹", "ํ• ์•„๋ฒ„์ง€": "ํ• ๋จธ๋‹ˆ", "ํ˜•": "๋™์ƒ", "์„ ์ƒ๋‹˜": "ํ•™์ƒ", "์˜์‚ฌ": "ํ™˜์ž", "๊ฒฝ์ฐฐ": "๋„๋‘‘", "๊ฐ€์ˆ˜": "๋งˆ์ดํฌ", "ํ™”๊ฐ€": "๊ทธ๋ฆผ", "์š”๋ฆฌ์‚ฌ": "์ฃผ๋ฐฉ", "์–ด๋ถ€": "๋‚š์‹œ๋Œ€", "๊ตฐ์ธ": "์ด", "์™•": "์™•๋น„", "์™•์ž": "๊ณต์ฃผ", "์‹ ๋ž‘": "์‹ ๋ถ€", "์ฃผ์ธ": "์†๋‹˜", "ํ•œ๊ตญ": "์„œ์šธ", "๋ฏธ๊ตญ": "์›Œ์‹ฑํ„ด", "ํ”„๋ž‘์Šค": "ํŒŒ๋ฆฌ", "์˜๊ตญ": "๋Ÿฐ๋˜", "์ผ๋ณธ": "๋„์ฟ„", "์ค‘๊ตญ": "๋ฒ ์ด์ง•", "ํ•™๊ต": "๊ต์‹ค", "๋ณ‘์›": "์ฃผ์‚ฌ๊ธฐ", "์€ํ–‰": "๋ˆ", "์šฐ์ฒด๊ตญ": "ํŽธ์ง€", "๊ทน์žฅ": "์˜ํ™”", "๋„์„œ๊ด€": "์ฑ…", "๊ณตํ•ญ": "๋น„ํ–‰๊ธฐ", "ํ•ญ๊ตฌ": "๋ฐฐ", "์—ญ": "๊ธฐ์ฐจ", "์ •๋ฅ˜์žฅ": "๋ฒ„์Šค", "์‹œ๊ณ„": "์‹œ๊ฐ„", "๋‹ฌ๋ ฅ": "๋‚ ์งœ", "๊ฑฐ์šธ": "์–ผ๊ตด", "๋น—": "๋จธ๋ฆฌ์นด๋ฝ", "๊ฐ€๋ฐฉ": "์ฑ…", "๋ชจ์ž": "๋จธ๋ฆฌ", "์•ˆ๊ฒฝ": "๋ˆˆ", "๋งˆ์Šคํฌ": "์ž…", }; // [๐Ÿ”ฅ ์ˆ˜์ •] 21๋‹จ๊ณ„ ๋‚œ์ด๋„ ๋ชฉ๋ก (6x6 ํ—ฌ๋ชจ๋“œ ์ถ”๊ฐ€) static final List allDifficulties = [ // --- Phase 1: ์ž…๋ฌธ (6~8์žฅ) --- const CardFlipDifficulty(levelIndex: 1, name: 'Lv. 1: ์ž…๋ฌธ (์ˆซ์ž 6์žฅ)', contextId: 'FLIP_L1_2x3_NUM', rows: 3, cols: 2, timeLimitSeconds: 30, contentType: CardContentType.number), const CardFlipDifficulty(levelIndex: 2, name: 'Lv. 2: ์ž…๋ฌธ (์ด๋ชจ์ง€ 6์žฅ)', contextId: 'FLIP_L2_2x3_EMOJI', rows: 3, cols: 2, timeLimitSeconds: 25, contentType: CardContentType.emoji), const CardFlipDifficulty(levelIndex: 3, name: 'Lv. 3: ๊ธฐ์ดˆ (์ˆซ์ž 8์žฅ)', contextId: 'FLIP_L3_2x4_NUM', rows: 4, cols: 2, timeLimitSeconds: 40, contentType: CardContentType.number), const CardFlipDifficulty(levelIndex: 4, name: 'Lv. 4: ๊ธฐ์ดˆ (์ด๋ชจ์ง€ 8์žฅ)', contextId: 'FLIP_L4_2x4_EMOJI', rows: 4, cols: 2, timeLimitSeconds: 35, contentType: CardContentType.emoji), // --- Phase 2: ์ดˆ๊ธ‰ (12์žฅ) --- const CardFlipDifficulty(levelIndex: 5, name: 'Lv. 5: ์ดˆ๊ธ‰ (์ด๋ชจ์ง€ 12์žฅ)', contextId: 'FLIP_L5_3x4_EMOJI', rows: 4, cols: 3, timeLimitSeconds: 50, contentType: CardContentType.emoji), const CardFlipDifficulty(levelIndex: 6, name: 'Lv. 6: ์ดˆ๊ธ‰ (์•„์ด์ฝ˜ 12์žฅ)', contextId: 'FLIP_L6_3x4_ICON', rows: 4, cols: 3, timeLimitSeconds: 45, contentType: CardContentType.icon), const CardFlipDifficulty(levelIndex: 7, name: 'Lv. 7: ์ดˆ๊ธ‰ (์—ฐ์‚ฐ 12์žฅ)', contextId: 'FLIP_L7_3x4_CALC', rows: 4, cols: 3, timeLimitSeconds: 60, contentType: CardContentType.calculation), const CardFlipDifficulty(levelIndex: 8, name: 'Lv. 8: ์ดˆ๊ธ‰ (๋‹จ์–ด 12์žฅ)', contextId: 'FLIP_L8_3x4_PAIR', rows: 4, cols: 3, timeLimitSeconds: 60, contentType: CardContentType.pairWord), // --- Phase 3: ์ค‘๊ธ‰ (16์žฅ) --- const CardFlipDifficulty(levelIndex: 9, name: 'Lv. 9: ์ค‘๊ธ‰ (์ˆซ์ž 16์žฅ)', contextId: 'FLIP_L9_4x4_NUM', rows: 4, cols: 4, timeLimitSeconds: 70, contentType: CardContentType.number), const CardFlipDifficulty(levelIndex: 10, name: 'Lv. 10: ์ค‘๊ธ‰ (์•„์ด์ฝ˜ 16์žฅ)', contextId: 'FLIP_L10_4x4_ICON', rows: 4, cols: 4, timeLimitSeconds: 65, contentType: CardContentType.icon), const CardFlipDifficulty(levelIndex: 11, name: 'Lv. 11: ์ค‘๊ธ‰ (์—ฐ์‚ฐ 16์žฅ)', contextId: 'FLIP_L11_4x4_CALC', rows: 4, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.calculation), const CardFlipDifficulty(levelIndex: 12, name: 'Lv. 12: ์ค‘๊ธ‰ (๋‹จ์–ด 16์žฅ)', contextId: 'FLIP_L12_4x4_PAIR', rows: 4, cols: 4, timeLimitSeconds: 90, contentType: CardContentType.pairWord), // --- Phase 4: ์ƒ๊ธ‰ (20~24์žฅ) --- const CardFlipDifficulty(levelIndex: 13, name: 'Lv. 13: ์ƒ๊ธ‰ (์ด๋ชจ์ง€ 20์žฅ)', contextId: 'FLIP_L13_5x4_EMOJI', rows: 5, cols: 4, timeLimitSeconds: 100, contentType: CardContentType.emoji), const CardFlipDifficulty(levelIndex: 14, name: 'Lv. 14: ์ƒ๊ธ‰ (์—ฐ์‚ฐ 20์žฅ)', contextId: 'FLIP_L14_5x4_CALC', rows: 5, cols: 4, timeLimitSeconds: 120, contentType: CardContentType.calculation), const CardFlipDifficulty(levelIndex: 15, name: 'Lv. 15: ์ „๋ฌธ๊ฐ€ (์•„์ด์ฝ˜ 24์žฅ)', contextId: 'FLIP_L15_6x4_ICON', rows: 6, cols: 4, timeLimitSeconds: 120, contentType: CardContentType.icon), const CardFlipDifficulty(levelIndex: 16, name: 'Lv. 16: ์ „๋ฌธ๊ฐ€ (๋‹จ์–ด 24์žฅ)', contextId: 'FLIP_L16_6x4_PAIR', rows: 6, cols: 4, timeLimitSeconds: 150, contentType: CardContentType.pairWord), // --- Phase 5: ๋งˆ์Šคํ„ฐ (30์žฅ) --- const CardFlipDifficulty(levelIndex: 17, name: 'Lv. 17: ๋งˆ์Šคํ„ฐ (์ˆซ์ž 30์žฅ)', contextId: 'FLIP_L17_6x5_NUM', rows: 6, cols: 5, timeLimitSeconds: 150, contentType: CardContentType.number), const CardFlipDifficulty(levelIndex: 18, name: 'Lv. 18: ๋งˆ์Šคํ„ฐ (์—ฐ์‚ฐ 30์žฅ)', contextId: 'FLIP_L18_6x5_CALC', rows: 6, cols: 5, timeLimitSeconds: 180, contentType: CardContentType.calculation), const CardFlipDifficulty(levelIndex: 19, name: 'Lv. 19: ๋ ˆ์ „๋“œ (๋‹จ์–ด 30์žฅ)', contextId: 'FLIP_L19_6x5_PAIR', rows: 6, cols: 5, timeLimitSeconds: 180, contentType: CardContentType.pairWord), const CardFlipDifficulty(levelIndex: 20, name: 'Lv. 20: ๊ฐ“๋ชจ๋“œ (์ด๋ชจ์ง€ 30์žฅ)', contextId: 'FLIP_L20_6x5_EMOJI', rows: 6, cols: 5, timeLimitSeconds: 120, contentType: CardContentType.emoji), // --- [๐Ÿ”ฅ ์‹ ๊ทœ] Phase 6: ํ—ฌ๋ชจ๋“œ (6x6 = 36์žฅ) --- const CardFlipDifficulty( levelIndex: 21, name: 'Lv. 21: ํ—ฌ๋ชจ๋“œ (36์žฅ)', contextId: 'FLIP_L21_6x6_HELL', rows: 6, cols: 6, timeLimitSeconds: 240, contentType: CardContentType.pairWord ), ]; static CardFlipDifficulty getLevel(int levelIndex) { if (levelIndex < 1) levelIndex = 1; if (levelIndex > allDifficulties.length) levelIndex = allDifficulties.length; return allDifficulties.firstWhere((level) => level.levelIndex == levelIndex, orElse: () => allDifficulties[0]); } }