Files
asciinevrdie/lib/src/features/hall_of_fame/game_clear_dialog.dart
JiWoong Sul cbf96c2c0e style(ui): 전체 화면 폰트 크기 증가
- arena: 전투/결과/랭크 화면 폰트 조정
- front: 메인 화면 폰트 조정
- game: 게임플레이 위젯 전반 폰트 조정 (스킬, 장비, 인벤토리 등)
- hall_of_fame: 명예의 전당 폰트 조정
- new_character: 캐릭터 생성 화면 폰트 조정
- settings: 설정 화면 폰트 조정
- 전반적인 가독성 향상
2026-01-15 19:07:34 +09:00

256 lines
8.5 KiB
Dart

import 'package:flutter/material.dart';
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
import 'package:asciineverdie/src/core/l10n/game_data_l10n.dart';
import 'package:asciineverdie/src/core/model/hall_of_fame.dart';
import 'package:asciineverdie/src/shared/retro_colors.dart';
/// 게임 클리어 축하 다이얼로그 표시 함수
Future<void> showGameClearDialog(
BuildContext context, {
required HallOfFameEntry entry,
required VoidCallback onNewGame,
required VoidCallback onViewHallOfFame,
}) {
return showDialog(
context: context,
barrierDismissible: false,
builder: (context) => GameClearDialog(
entry: entry,
onNewGame: onNewGame,
onViewHallOfFame: onViewHallOfFame,
),
);
}
/// 게임 클리어 다이얼로그 위젯
class GameClearDialog extends StatelessWidget {
const GameClearDialog({
super.key,
required this.entry,
required this.onNewGame,
required this.onViewHallOfFame,
});
final HallOfFameEntry entry;
final VoidCallback onNewGame;
final VoidCallback onViewHallOfFame;
@override
Widget build(BuildContext context) {
final goldColor = RetroColors.goldOf(context);
final panelBg = RetroColors.panelBgOf(context);
final borderColor = RetroColors.borderOf(context);
return Dialog(
backgroundColor: Colors.transparent,
child: Container(
constraints: const BoxConstraints(maxWidth: 400),
decoration: BoxDecoration(
color: panelBg,
border: Border(
top: BorderSide(color: goldColor, width: 3),
left: BorderSide(color: goldColor, width: 3),
bottom: BorderSide(color: borderColor, width: 3),
right: BorderSide(color: borderColor, width: 3),
),
boxShadow: [
BoxShadow(
color: goldColor.withValues(alpha: 0.4),
blurRadius: 24,
spreadRadius: 4,
),
],
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// 헤더
Container(
padding: const EdgeInsets.symmetric(vertical: 12),
decoration: BoxDecoration(
color: goldColor.withValues(alpha: 0.2),
border: Border(bottom: BorderSide(color: goldColor, width: 2)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.emoji_events, color: goldColor, size: 20),
const SizedBox(width: 8),
Text(
l10n.hofVictory.toUpperCase(),
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: goldColor,
),
),
const SizedBox(width: 8),
Icon(Icons.emoji_events, color: goldColor, size: 20),
],
),
),
// 컨텐츠
Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Text(
l10n.hofDefeatedGlitchGod,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: RetroColors.textPrimaryOf(context),
),
textAlign: TextAlign.center,
),
const SizedBox(height: 16),
Container(height: 2, color: borderColor),
const SizedBox(height: 16),
// 캐릭터 정보
Text(
entry.characterName,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: goldColor,
),
),
const SizedBox(height: 6),
Text(
'${GameDataL10n.getRaceName(context, entry.race)} '
'${GameDataL10n.getKlassName(context, entry.klass)}',
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: RetroColors.textSecondaryOf(context),
),
),
const SizedBox(height: 16),
// 통계
Wrap(
spacing: 12,
runSpacing: 8,
alignment: WrapAlignment.center,
children: [
_buildStat(context, l10n.hofLevel, '${entry.level}'),
_buildStat(
context,
l10n.hofTime,
entry.formattedPlayTime,
),
_buildStat(
context,
l10n.hofDeaths,
'${entry.totalDeaths}',
),
_buildStat(
context,
l10n.hofQuests,
'${entry.questsCompleted}',
),
],
),
const SizedBox(height: 16),
Text(
l10n.hofLegendEnshrined,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
fontStyle: FontStyle.italic,
color: goldColor,
),
textAlign: TextAlign.center,
),
],
),
),
// 버튼
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Row(
children: [
Expanded(
child: OutlinedButton(
onPressed: () {
Navigator.of(context).pop();
onViewHallOfFame();
},
style: OutlinedButton.styleFrom(
side: BorderSide(color: borderColor, width: 2),
padding: const EdgeInsets.symmetric(vertical: 10),
),
child: Text(
l10n.hofViewHallOfFame.toUpperCase(),
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: RetroColors.textSecondaryOf(context),
),
),
),
),
const SizedBox(width: 12),
Expanded(
child: FilledButton(
onPressed: () {
Navigator.of(context).pop();
onNewGame();
},
style: FilledButton.styleFrom(
backgroundColor: goldColor,
padding: const EdgeInsets.symmetric(vertical: 10),
),
child: Text(
l10n.hofNewGame.toUpperCase(),
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: RetroColors.backgroundOf(context),
),
),
),
),
],
),
),
],
),
),
);
}
Widget _buildStat(BuildContext context, String label, String value) {
final goldColor = RetroColors.goldOf(context);
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: goldColor.withValues(alpha: 0.1),
border: Border.all(color: goldColor.withValues(alpha: 0.3), width: 1),
),
child: Column(
children: [
Text(
value,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: goldColor,
),
),
const SizedBox(height: 2),
Text(
label,
style: TextStyle(
fontFamily: 'PressStart2P',
fontSize: 11,
color: RetroColors.textMutedOf(context),
),
),
],
),
);
}
}