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 show(BuildContext context) { return showDialog( context: context, barrierColor: Colors.black87, builder: (_) => const HelpDialog(), ); } @override State createState() => _HelpDialogState(); } class _HelpDialogState extends State 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), ], ); } }