diff --git a/lib/src/app.dart b/lib/src/app.dart index 4ac5c54..f784cfa 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:askiineverdie/data/game_text_l10n.dart' as game_l10n; import 'package:askiineverdie/l10n/app_localizations.dart'; +import 'package:askiineverdie/src/core/audio/audio_service.dart'; import 'package:askiineverdie/src/core/engine/game_mutations.dart'; import 'package:askiineverdie/src/core/engine/progress_service.dart'; import 'package:askiineverdie/src/core/engine/reward_service.dart'; @@ -30,6 +31,7 @@ class _AskiiNeverDieAppState extends State { late final GameSessionController _controller; late final NotificationService _notificationService; late final SettingsRepository _settingsRepository; + late final AudioService _audioService; bool _isCheckingSave = true; bool _hasSave = false; ThemeMode _themeMode = ThemeMode.system; @@ -51,9 +53,11 @@ class _AskiiNeverDieAppState extends State { ); _notificationService = NotificationService(); _settingsRepository = SettingsRepository(); + _audioService = AudioService(settingsRepository: _settingsRepository); - // 초기 설정 로드 + // 초기 설정 및 오디오 서비스 로드 _loadSettings(); + _audioService.init(); // 세이브 파일 존재 여부 확인 _checkForExistingSave(); } @@ -87,6 +91,7 @@ class _AskiiNeverDieAppState extends State { void dispose() { _controller.dispose(); _notificationService.dispose(); + _audioService.dispose(); super.dispose(); } diff --git a/lib/src/features/game/game_play_screen.dart b/lib/src/features/game/game_play_screen.dart index eaab7f6..570100d 100644 --- a/lib/src/features/game/game_play_screen.dart +++ b/lib/src/features/game/game_play_screen.dart @@ -31,6 +31,8 @@ import 'package:askiineverdie/src/features/game/widgets/potion_inventory_panel.d import 'package:askiineverdie/src/features/game/widgets/task_progress_panel.dart'; import 'package:askiineverdie/src/features/game/widgets/active_buff_panel.dart'; import 'package:askiineverdie/src/features/game/layouts/mobile_carousel_layout.dart'; +import 'package:askiineverdie/src/features/settings/settings_screen.dart'; +import 'package:askiineverdie/src/core/storage/settings_repository.dart'; /// 게임 진행 화면 (Main.dfm 기반 3패널 레이아웃) /// @@ -463,51 +465,17 @@ class _GamePlayScreenState extends State return platform == TargetPlatform.iOS || platform == TargetPlatform.android; } - /// 현재 언어명 가져오기 - String _getCurrentLanguageName() { - final locale = game_l10n.currentGameLocale; - if (locale == 'ko') return game_l10n.languageKorean; - if (locale == 'ja') return game_l10n.languageJapanese; - return game_l10n.languageEnglish; - } - - /// 언어 선택 다이얼로그 표시 - void _showLanguageDialog(BuildContext context) { - showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(game_l10n.menuLanguage), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - _buildLanguageOption(context, 'en', game_l10n.languageEnglish), - _buildLanguageOption(context, 'ko', game_l10n.languageKorean), - _buildLanguageOption(context, 'ja', game_l10n.languageJapanese), - ], - ), - ), - ); - } - - Widget _buildLanguageOption( - BuildContext context, - String locale, - String label, - ) { - final isSelected = game_l10n.currentGameLocale == locale; - return ListTile( - leading: Icon( - isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked, - color: isSelected ? Theme.of(context).colorScheme.primary : null, - ), - title: Text( - label, - style: TextStyle( - fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, - ), - ), - onTap: () async { - Navigator.pop(context); // 다이얼로그 닫기 + /// 설정 화면 표시 + void _showSettingsScreen(BuildContext context) { + final settingsRepo = SettingsRepository(); + SettingsScreen.show( + context, + settingsRepository: settingsRepo, + currentThemeMode: widget.currentThemeMode, + onThemeModeChange: (mode) { + widget.onThemeModeChange?.call(mode); + }, + onLocaleChange: (locale) async { // 안전한 언어 변경: 전체 화면 재생성 final navigator = Navigator.of(this.context); await widget.controller.pause(saveOnStop: true); @@ -698,11 +666,11 @@ class _GamePlayScreenState extends State onPressed: () => widget.controller.loop?.cheatCompletePlot(), ), ], - // 언어 변경 버튼 - TextButton.icon( - onPressed: () => _showLanguageDialog(context), - icon: const Icon(Icons.language, size: 18), - label: Text(_getCurrentLanguageName()), + // 설정 버튼 + IconButton( + icon: const Icon(Icons.settings), + tooltip: game_l10n.uiSettings, + onPressed: () => _showSettingsScreen(context), ), ], ),