feat(ui): 게임 화면 및 UI 컴포넌트 개선

- front_screen: 프론트 화면 UI 업데이트
- game_play_screen: 게임 플레이 화면 수정
- game_session_controller: 세션 관리 로직 개선
- mobile_carousel_layout: 모바일 캐러셀 레이아웃 개선
- enhanced_animation_panel: 애니메이션 패널 업데이트
- help_dialog: 도움말 다이얼로그 수정
- return_rewards_dialog: 복귀 보상 다이얼로그 개선
- new_character_screen: 새 캐릭터 화면 수정
- settings_screen: 설정 화면 업데이트
This commit is contained in:
JiWoong Sul
2026-01-19 15:50:35 +09:00
parent ffc19c7ca6
commit 19faa9ea39
9 changed files with 2495 additions and 1355 deletions

View File

@@ -7,7 +7,7 @@ import 'package:flutter/services.dart' show KeyDownEvent, LogicalKeyboardKey;
import 'package:asciineverdie/data/game_text_l10n.dart' as game_l10n;
import 'package:asciineverdie/data/skill_data.dart';
import 'package:asciineverdie/src/core/engine/iap_service.dart';
import 'package:asciineverdie/src/core/engine/return_rewards_service.dart';
import 'package:asciineverdie/src/core/model/treasure_chest.dart';
import 'package:asciineverdie/data/story_data.dart';
import 'package:asciineverdie/l10n/app_localizations.dart';
import 'package:asciineverdie/src/core/animation/ascii_animation_type.dart';
@@ -51,8 +51,6 @@ class GamePlayScreen extends StatefulWidget {
this.audioService,
this.forceCarouselLayout = false,
this.forceDesktopLayout = false,
this.onThemeModeChange,
this.currentThemeMode = ThemeMode.system,
});
final GameSessionController controller;
@@ -66,12 +64,6 @@ class GamePlayScreen extends StatefulWidget {
/// 테스트 모드: 모바일에서도 데스크톱 3패널 레이아웃 강제 사용
final bool forceDesktopLayout;
/// 테마 모드 변경 콜백
final void Function(ThemeMode mode)? onThemeModeChange;
/// 현재 테마 모드
final ThemeMode currentThemeMode;
@override
State<GamePlayScreen> createState() => _GamePlayScreenState();
}
@@ -316,8 +308,6 @@ class _GamePlayScreenState extends State<GamePlayScreen>
builder: (_) => GamePlayScreen(
controller: widget.controller,
audioService: widget.audioService,
currentThemeMode: widget.currentThemeMode,
onThemeModeChange: widget.onThemeModeChange,
),
),
);
@@ -407,15 +397,19 @@ class _GamePlayScreenState extends State<GamePlayScreen>
}
/// 복귀 보상 다이얼로그 표시 (Phase 7)
void _showReturnRewardsDialog(ReturnReward reward) {
void _showReturnRewardsDialog(ReturnChestReward reward) {
// 잠시 후 다이얼로그 표시 (게임 시작 후)
WidgetsBinding.instance.addPostFrameCallback((_) {
if (!mounted) return;
final state = widget.controller.state;
if (state == null) return;
ReturnRewardsDialog.show(
context,
reward: reward,
onClaim: (totalGold) {
widget.controller.applyReturnReward(totalGold);
playerLevel: state.traits.level,
onClaim: (rewards) {
widget.controller.applyReturnReward(rewards);
},
);
});
@@ -436,10 +430,6 @@ class _GamePlayScreenState extends State<GamePlayScreen>
SettingsScreen.show(
context,
settingsRepository: settingsRepo,
currentThemeMode: widget.currentThemeMode,
onThemeModeChange: (mode) {
widget.onThemeModeChange?.call(mode);
},
onLocaleChange: (locale) async {
// 안전한 언어 변경: 전체 화면 재생성
final navigator = Navigator.of(this.context);
@@ -452,8 +442,6 @@ class _GamePlayScreenState extends State<GamePlayScreen>
builder: (_) => GamePlayScreen(
controller: widget.controller,
audioService: widget.audioService,
currentThemeMode: widget.currentThemeMode,
onThemeModeChange: widget.onThemeModeChange,
),
),
);
@@ -586,6 +574,10 @@ class _GamePlayScreenState extends State<GamePlayScreen>
widget.controller.loop?.cycleSpeed();
setState(() {});
},
onSetSpeed: (speed) {
widget.controller.loop?.setSpeed(speed);
setState(() {});
},
// 특수 애니메이션 중에는 일시정지 상태로 표시하지 않음
isPaused:
!widget.controller.isRunning && _specialAnimation == null,
@@ -620,8 +612,6 @@ class _GamePlayScreenState extends State<GamePlayScreen>
builder: (_) => GamePlayScreen(
controller: widget.controller,
audioService: widget.audioService,
currentThemeMode: widget.currentThemeMode,
onThemeModeChange: widget.onThemeModeChange,
),
),
);
@@ -637,8 +627,6 @@ class _GamePlayScreenState extends State<GamePlayScreen>
Navigator.of(context).pop();
}
},
currentThemeMode: widget.currentThemeMode,
onThemeModeChange: widget.onThemeModeChange,
// 사운드 설정
bgmVolume: _audioController.bgmVolume,
sfxVolume: _audioController.sfxVolume,
@@ -666,11 +654,13 @@ class _GamePlayScreenState extends State<GamePlayScreen>
navigator.popUntil((route) => route.isFirst);
}
},
// 수익화 버프 (자동부활, 5배속)
// 수익화 버프 (자동부활, 광고배속)
autoReviveEndMs: widget.controller.monetization.autoReviveEndMs,
speedBoostEndMs: widget.controller.monetization.speedBoostEndMs,
isPaidUser: widget.controller.monetization.isPaidUser,
onSpeedBoostActivate: _handleSpeedBoost,
adSpeedMultiplier: widget.controller.adSpeedMultiplier,
has2xUnlocked: widget.controller.has2xUnlocked,
),
// 사망 오버레이
if (state.isDead && state.deathInfo != null)