Files
asciinevrdie/lib/src/features/game/widgets/help_dialog.dart
JiWoong Sul 19faa9ea39 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: 설정 화면 업데이트
2026-01-19 15:50:35 +09:00

497 lines
20 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import 'package:flutter/material.dart';
import 'package:asciineverdie/src/shared/retro_colors.dart';
import 'package:asciineverdie/src/shared/widgets/retro_dialog.dart';
/// 도움말 다이얼로그 (Help Dialog)
///
/// 게임 메카닉과 UI 설명을 제공
class HelpDialog extends StatefulWidget {
const HelpDialog({super.key});
/// 다이얼로그 표시
static Future<void> show(BuildContext context) {
return showDialog(
context: context,
barrierColor: Colors.black87,
builder: (_) => const HelpDialog(),
);
}
@override
State<HelpDialog> createState() => _HelpDialogState();
}
class _HelpDialogState extends State<HelpDialog>
with SingleTickerProviderStateMixin {
late TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: 4, vsync: this);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final isKorean = Localizations.localeOf(context).languageCode == 'ko';
final isJapanese = Localizations.localeOf(context).languageCode == 'ja';
final title = isKorean
? '도움말'
: isJapanese
? 'ヘルプ'
: 'Help';
final tabs = isKorean
? ['기본', '전투', '스킬', 'UI']
: isJapanese
? ['基本', '戦闘', 'スキル', 'UI']
: ['Basics', 'Combat', 'Skills', 'UI'];
// 도움말은 MP 블루 색상 사용 (테마 인식)
final mpColor = RetroColors.mpOf(context);
return RetroDialog(
title: title,
titleIcon: '',
accentColor: mpColor,
child: Column(
children: [
// 탭 바
RetroTabBar(
controller: _tabController,
tabs: tabs,
accentColor: mpColor,
),
// 탭 내용
Expanded(
child: TabBarView(
controller: _tabController,
children: [
_BasicsHelpView(isKorean: isKorean, isJapanese: isJapanese),
_CombatHelpView(isKorean: isKorean, isJapanese: isJapanese),
_SkillsHelpView(isKorean: isKorean, isJapanese: isJapanese),
_UIHelpView(isKorean: isKorean, isJapanese: isJapanese),
],
),
),
],
),
);
}
}
/// 기본 도움말 뷰
class _BasicsHelpView extends StatelessWidget {
const _BasicsHelpView({required this.isKorean, required this.isJapanese});
final bool isKorean;
final bool isJapanese;
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(12),
children: [
_HelpSection(
icon: '',
title: isKorean
? '게임 소개'
: isJapanese
? 'ゲーム紹介'
: 'About the Game',
content: isKorean
? 'Askii Never Die는 완전 자동 진행 RPG입니다. 캐릭터가 자동으로 몬스터와 싸우고, '
'퀘스트를 완료하며, 레벨업합니다. 장비와 스킬도 자동으로 획득/장착됩니다.'
: isJapanese
? 'Askii Never Dieは完全自動進行RPGです。キャラクターが自動でモンスターと戦い、'
'クエストを完了し、レベルアップします。装備とスキルも自動で獲得・装着されます。'
: 'Askii Never Die is a fully automatic idle RPG. Your character automatically fights monsters, '
'completes quests, and levels up. Equipment and skills are auto-acquired and equipped.',
),
const SizedBox(height: 12),
_HelpSection(
icon: '',
title: isKorean
? '진행 방식'
: isJapanese
? '進行方式'
: 'Progression',
content: isKorean
? '• 몬스터 처치 → 전리품 획득 → 장비 업그레이드\n'
'• 경험치 획득 → 레벨업 → 스탯 상승\n'
'• 퀘스트 완료 → 보상 획득\n'
'• 플롯 진행 → 새로운 Act 해금'
: isJapanese
? '• モンスター討伐 → 戦利品獲得 → 装備アップグレード\n'
'• 経験値獲得 → レベルアップ → ステータス上昇\n'
'• クエスト完了 → 報酬獲得\n'
'• プロット進行 → 新しいAct解放'
: '• Kill monsters → Get loot → Upgrade equipment\n'
'• Gain XP → Level up → Stats increase\n'
'• Complete quests → Get rewards\n'
'• Progress plot → Unlock new Acts',
),
const SizedBox(height: 12),
_HelpSection(
icon: '💾',
title: isKorean
? '저장'
: isJapanese
? 'セーブ'
: 'Saving',
content: isKorean
? '게임은 자동으로 저장됩니다. 레벨업, 퀘스트 완료, Act 진행 시 자동 저장됩니다. '
'뒤로 가기 시 저장 여부를 선택할 수 있습니다.'
: isJapanese
? 'ゲームは自動保存されます。レベルアップ、クエスト完了、Act進行時に自動保存されます。'
'戻る時に保存するかどうか選択できます。'
: 'The game auto-saves. It saves on level up, quest completion, and Act progression. '
'When exiting, you can choose whether to save.',
),
],
);
}
}
/// 전투 도움말 뷰
class _CombatHelpView extends StatelessWidget {
const _CombatHelpView({required this.isKorean, required this.isJapanese});
final bool isKorean;
final bool isJapanese;
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(12),
children: [
_HelpSection(
icon: '',
title: isKorean
? '전투 시스템'
: isJapanese
? '戦闘システム'
: 'Combat System',
content: isKorean
? '전투는 자동으로 진행됩니다. 플레이어와 몬스터가 번갈아 공격하며, '
'공격 속도(Attack Speed)에 따라 공격 빈도가 결정됩니다.'
: isJapanese
? '戦闘は自動で進行します。プレイヤーとモンスターが交互に攻撃し、'
'攻撃速度(Attack Speed)によって攻撃頻度が決まります。'
: 'Combat is automatic. Player and monster take turns attacking, '
'with attack frequency based on Attack Speed.',
),
const SizedBox(height: 12),
_HelpSection(
icon: '🛡',
title: isKorean
? '방어 메카닉'
: isJapanese
? '防御メカニック'
: 'Defense Mechanics',
content: isKorean
? '• 회피(Evasion): DEX 기반, 공격을 완전히 피함\n'
'• 방패 방어(Block): 방패 장착 시, 피해 감소\n'
'• 무기 쳐내기(Parry): 무기로 공격 일부 막음\n'
'• 방어력(DEF): 모든 피해에서 차감'
: isJapanese
? '• 回避(Evasion): DEX基準、攻撃を完全に回避\n'
'• 盾防御(Block): 盾装備時、ダメージ軽減\n'
'• 武器受け流し(Parry): 武器で攻撃を一部防ぐ\n'
'• 防御力(DEF): 全ダメージから差し引き'
: '• Evasion: DEX-based, completely avoid attacks\n'
'• Block: With shield, reduce damage\n'
'• Parry: Deflect some damage with weapon\n'
'• DEF: Subtracted from all damage',
),
const SizedBox(height: 12),
_HelpSection(
icon: '',
title: isKorean
? '부활 시스템'
: isJapanese
? '復活システム'
: 'Revival System',
content: isKorean
? '사망 시 두 가지 부활 방법이 있습니다:\n'
'• 기본 부활: 장비 1개 제물, HP/MP 회복\n'
'• 광고 부활: 아이템 보존, HP 100%, 10분 자동부활\n'
'유료 유저는 항상 광고 없이 부활 가능합니다.'
: isJapanese
? '死亡時に2つの復活方法があります\n'
'• 基本復活: 装備1つ消費、HP/MP回復\n'
'• 広告復活: アイテム保存、HP100%、10分自動復活\n'
'課金ユーザーは常に広告なしで復活可能です。'
: 'Two revival methods on death:\n'
'• Basic: Sacrifice 1 equipment, restore HP/MP\n'
'• Ad Revival: Keep items, 100% HP, 10-min auto-revive\n'
'Paid users can always revive without ads.',
),
],
);
}
}
/// 스킬 도움말 뷰
class _SkillsHelpView extends StatelessWidget {
const _SkillsHelpView({required this.isKorean, required this.isJapanese});
final bool isKorean;
final bool isJapanese;
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(12),
children: [
_HelpSection(
icon: '',
title: isKorean
? '스킬 종류'
: isJapanese
? 'スキル種類'
: 'Skill Types',
content: isKorean
? '• 공격(Attack): 적에게 직접 피해\n'
'• 회복(Heal): HP/MP 회복\n'
'• 버프(Buff): 자신에게 유리한 효과\n'
'• 디버프(Debuff): 적에게 불리한 효과\n'
'• DOT: 시간에 걸쳐 지속 피해'
: isJapanese
? '• 攻撃(Attack): 敵に直接ダメージ\n'
'• 回復(Heal): HP/MP回復\n'
'• バフ(Buff): 自分に有利な効果\n'
'• デバフ(Debuff): 敵に不利な効果\n'
'• DOT: 時間経過でダメージ'
: '• Attack: Deal direct damage\n'
'• Heal: Restore HP/MP\n'
'• Buff: Beneficial effects on self\n'
'• Debuff: Harmful effects on enemies\n'
'• DOT: Damage over time',
),
const SizedBox(height: 12),
_HelpSection(
icon: '🤖',
title: isKorean
? '자동 스킬 선택'
: isJapanese
? '自動スキル選択'
: 'Auto Skill Selection',
content: isKorean
? '스킬은 AI가 자동으로 선택합니다:\n'
'1. HP 낮음 → 회복 스킬 우선\n'
'2. HP/MP 충분 → 버프 스킬 사용\n'
'3. 몬스터 HP 높음 → 디버프 적용\n'
'4. 공격 스킬로 마무리'
: isJapanese
? 'スキルはAIが自動選択します\n'
'1. HP低い → 回復スキル優先\n'
'2. HP/MP十分 → バフスキル使用\n'
'3. モンスターHP高い → デバフ適用\n'
'4. 攻撃スキルで仕上げ'
: 'Skills are auto-selected by AI:\n'
'1. Low HP → Heal skills priority\n'
'2. HP/MP sufficient → Use buff skills\n'
'3. Monster HP high → Apply debuffs\n'
'4. Finish with attack skills',
),
const SizedBox(height: 12),
_HelpSection(
icon: '',
title: isKorean
? '스킬 랭크'
: isJapanese
? 'スキルランク'
: 'Skill Ranks',
content: isKorean
? '스킬 랭크는 I, II, III... 형태로 표시됩니다. 랭크가 높을수록:\n'
'• 데미지/회복량 증가\n'
'• MP 소모량 감소\n'
'• 쿨타임 감소\n'
'레벨업 시 랜덤하게 스킬을 배웁니다.'
: isJapanese
? 'スキルランクはI、II、III...の形式で表示されます。ランクが高いほど:\n'
'• ダメージ/回復量増加\n'
'• MP消費量減少\n'
'• クールタイム減少\n'
'レベルアップ時にランダムでスキルを習得します。'
: 'Skill ranks are displayed as I, II, III... Higher rank means:\n'
'• More damage/healing\n'
'• Less MP cost\n'
'• Shorter cooldown\n'
'Learn random skills on level up.',
),
],
);
}
}
/// UI 도움말 뷰
class _UIHelpView extends StatelessWidget {
const _UIHelpView({required this.isKorean, required this.isJapanese});
final bool isKorean;
final bool isJapanese;
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(12),
children: [
_HelpSection(
icon: '📺',
title: isKorean
? '화면 구성'
: isJapanese
? '画面構成'
: 'Screen Layout',
content: isKorean
? '모바일에서는 좌우 스와이프로 7개 페이지 탐색:\n'
'• 캐릭터: 이름, 레벨, 종족, 직업\n'
'• 스탯: STR, DEX, CON, INT 등\n'
'• 장비: 무기, 방어구, 액세서리\n'
'• 인벤토리: 보유 아이템, 골드\n'
'• 스킬북: 습득한 스킬 목록\n'
'• 퀘스트: 진행 중인 퀘스트\n'
'• 플롯: 스토리 진행 상황'
: isJapanese
? 'モバイルでは左右スワイプで7ページ切替\n'
'• キャラクター: 名前、レベル、種族、職業\n'
'• ステータス: STR、DEX、CON、INT等\n'
'• 装備: 武器、防具、アクセサリー\n'
'• インベントリ: 所持アイテム、ゴールド\n'
'• スキルブック: 習得したスキル一覧\n'
'• クエスト: 進行中のクエスト\n'
'• プロット: ストーリー進行状況'
: 'On mobile, swipe left/right to browse 7 pages:\n'
'• Character: Name, level, race, class\n'
'• Stats: STR, DEX, CON, INT, etc.\n'
'• Equipment: Weapons, armor, accessories\n'
'• Inventory: Items, gold\n'
'• Skillbook: Learned skills\n'
'• Quests: Active quests\n'
'• Plot: Story progress',
),
const SizedBox(height: 12),
_HelpSection(
icon: '',
title: isKorean
? '속도 조절'
: isJapanese
? '速度調整'
: 'Speed Control',
content: isKorean
? '게임 속도를 조절할 수 있습니다:\n'
'• 1x: 기본 속도\n'
'• 2x: 명예의 전당 캐릭터 1명 이상 시 해금\n'
'• 5x: 광고 시청으로 5분간 부스트 (유료 유저 무료)'
: isJapanese
? 'ゲーム速度を調整できます:\n'
'• 1x: 基本速度\n'
'• 2x: 殿堂入り1人以上で解放\n'
'• 5x: 広告視聴で5分間ブースト課金ユーザー無料'
: 'Adjust game speed:\n'
'• 1x: Normal speed\n'
'• 2x: Unlocked with 1+ Hall of Fame character\n'
'• 5x: 5-min boost via ad (free for paid users)',
),
const SizedBox(height: 12),
_HelpSection(
icon: '🏆',
title: isKorean
? '명예의 전당'
: isJapanese
? '殿堂入り'
: 'Hall of Fame',
content: isKorean
? 'Act V를 클리어하면 캐릭터가 명예의 전당에 등록됩니다.\n'
'• 캐릭터 이름, 레벨, 스탯이 영구 기록됨\n'
'• 첫 등록 시 2x 속도 영구 해금\n'
'• 2명 이상 등록 시 로컬 아레나 기능 해금'
: isJapanese
? 'Act Vクリアでキャラクターが殿堂入りします。\n'
'• キャラクター名、レベル、ステータスが永久記録\n'
'• 初登録で2倍速が永久解放\n'
'• 2人以上でローカルアリーナ機能解放'
: 'Characters enter Hall of Fame upon completing Act V.\n'
'• Name, level, stats are permanently recorded\n'
'• First entry permanently unlocks 2x speed\n'
'• 2+ entries unlock Local Arena feature',
),
const SizedBox(height: 12),
_HelpSection(
icon: '',
title: isKorean
? '일시정지'
: isJapanese
? '一時停止'
: 'Pause',
content: isKorean
? '일시정지 버튼으로 게임을 멈출 수 있습니다. '
'일시정지 중에도 UI를 확인하고 설정을 변경할 수 있습니다.'
: isJapanese
? '一時停止ボタンでゲームを止められます。'
'一時停止中もUIを確認し設定を変更できます。'
: 'Use the pause button to stop the game. '
'You can still view UI and change settings while paused.',
),
const SizedBox(height: 12),
_HelpSection(
icon: '📊',
title: isKorean
? '통계'
: isJapanese
? '統計'
: 'Statistics',
content: isKorean
? '통계 버튼에서 현재 세션과 누적 게임 통계를 확인할 수 있습니다. '
'처치한 몬스터, 획득 골드, 플레이 시간 등을 추적합니다.'
: isJapanese
? '統計ボタンで現在のセッションと累積ゲーム統計を確認できます。'
'倒したモンスター、獲得ゴールド、プレイ時間などを追跡します。'
: 'View current session and cumulative stats in the statistics button. '
'Track monsters killed, gold earned, play time, etc.',
),
],
);
}
}
/// 레트로 스타일 도움말 섹션 위젯
class _HelpSection extends StatelessWidget {
const _HelpSection({
required this.icon,
required this.title,
required this.content,
});
final String icon;
final String title;
final String content;
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 섹션 헤더 (MP 블루 테마 인식)
RetroSectionHeader(
title: title,
icon: icon,
accentColor: RetroColors.mpOf(context),
),
// 내용
RetroInfoBox(content: content),
],
);
}
}