From 13b698712efa7d250d28155befbe320a278c8e7b Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Thu, 19 Mar 2026 16:56:20 +0900 Subject: [PATCH] =?UTF-8?q?refactor(game):=20HelpDialog=204=EA=B0=9C=20?= =?UTF-8?q?=ED=83=AD=20=EB=B7=B0=EB=A5=BC=20=EA=B0=9C=EB=B3=84=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - help_dialog.dart 496줄 → 106줄 - help/ 디렉토리에 5개 파일 생성 (help_section, basics, combat, skills, ui) --- .../game/widgets/help/basics_help_view.dart | 80 ++++ .../game/widgets/help/combat_help_view.dart | 86 ++++ .../game/widgets/help/help_section.dart | 35 ++ .../game/widgets/help/skills_help_view.dart | 101 +++++ .../game/widgets/help/ui_help_view.dart | 138 ++++++ .../features/game/widgets/help_dialog.dart | 426 +----------------- 6 files changed, 452 insertions(+), 414 deletions(-) create mode 100644 lib/src/features/game/widgets/help/basics_help_view.dart create mode 100644 lib/src/features/game/widgets/help/combat_help_view.dart create mode 100644 lib/src/features/game/widgets/help/help_section.dart create mode 100644 lib/src/features/game/widgets/help/skills_help_view.dart create mode 100644 lib/src/features/game/widgets/help/ui_help_view.dart diff --git a/lib/src/features/game/widgets/help/basics_help_view.dart b/lib/src/features/game/widgets/help/basics_help_view.dart new file mode 100644 index 0000000..34065e9 --- /dev/null +++ b/lib/src/features/game/widgets/help/basics_help_view.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; + +import 'package:asciineverdie/src/features/game/widgets/help/help_section.dart'; + +/// 기본 도움말 뷰 (Basics Help View) +class BasicsHelpView extends StatelessWidget { + const BasicsHelpView({ + super.key, + 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: '\u2139', + 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: '\u2191', + 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: '\u{1F4BE}', + 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.', + ), + ], + ); + } +} diff --git a/lib/src/features/game/widgets/help/combat_help_view.dart b/lib/src/features/game/widgets/help/combat_help_view.dart new file mode 100644 index 0000000..326e35c --- /dev/null +++ b/lib/src/features/game/widgets/help/combat_help_view.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; + +import 'package:asciineverdie/src/features/game/widgets/help/help_section.dart'; + +/// 전투 도움말 뷰 (Combat Help View) +class CombatHelpView extends StatelessWidget { + const CombatHelpView({ + super.key, + 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: '\u2694', + 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: '\u{1F6E1}', + 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: '\u267B', + 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.', + ), + ], + ); + } +} diff --git a/lib/src/features/game/widgets/help/help_section.dart b/lib/src/features/game/widgets/help/help_section.dart new file mode 100644 index 0000000..2893cb6 --- /dev/null +++ b/lib/src/features/game/widgets/help/help_section.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; + +import 'package:asciineverdie/src/shared/retro_colors.dart'; +import 'package:asciineverdie/src/shared/widgets/retro_dialog.dart'; + +/// 레트로 스타일 도움말 섹션 위젯 (Help Section) +class HelpSection extends StatelessWidget { + const HelpSection({ + super.key, + 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), + ), + // 내용(content) 표시 + RetroInfoBox(content: content), + ], + ); + } +} diff --git a/lib/src/features/game/widgets/help/skills_help_view.dart b/lib/src/features/game/widgets/help/skills_help_view.dart new file mode 100644 index 0000000..58a500d --- /dev/null +++ b/lib/src/features/game/widgets/help/skills_help_view.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; + +import 'package:asciineverdie/src/features/game/widgets/help/help_section.dart'; + +/// 스킬 도움말 뷰 (Skills Help View) +class SkillsHelpView extends StatelessWidget { + const SkillsHelpView({ + super.key, + 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: '\u2727', + 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: '\u{1F916}', + 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: '\u2605', + 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.', + ), + ], + ); + } +} diff --git a/lib/src/features/game/widgets/help/ui_help_view.dart b/lib/src/features/game/widgets/help/ui_help_view.dart new file mode 100644 index 0000000..0996ab3 --- /dev/null +++ b/lib/src/features/game/widgets/help/ui_help_view.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; + +import 'package:asciineverdie/src/features/game/widgets/help/help_section.dart'; + +/// UI 도움말 뷰 (UI Help View) +class UIHelpView extends StatelessWidget { + const UIHelpView({ + super.key, + 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: '\u{1F4FA}', + 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: '\u23E9', + 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: '\u{1F3C6}', + 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: '\u23F8', + 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: '\u{1F4CA}', + 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.', + ), + ], + ); + } +} diff --git a/lib/src/features/game/widgets/help_dialog.dart b/lib/src/features/game/widgets/help_dialog.dart index 5c28155..004f31d 100644 --- a/lib/src/features/game/widgets/help_dialog.dart +++ b/lib/src/features/game/widgets/help_dialog.dart @@ -3,6 +3,11 @@ import 'package:flutter/material.dart'; import 'package:asciineverdie/src/shared/retro_colors.dart'; import 'package:asciineverdie/src/shared/widgets/retro_dialog.dart'; +import 'package:asciineverdie/src/features/game/widgets/help/basics_help_view.dart'; +import 'package:asciineverdie/src/features/game/widgets/help/combat_help_view.dart'; +import 'package:asciineverdie/src/features/game/widgets/help/skills_help_view.dart'; +import 'package:asciineverdie/src/features/game/widgets/help/ui_help_view.dart'; + /// 도움말 다이얼로그 (Help Dialog) /// /// 게임 메카닉과 UI 설명을 제공 @@ -60,25 +65,25 @@ class _HelpDialogState extends State return RetroDialog( title: title, - titleIcon: '❓', + titleIcon: '\u2753', accentColor: mpColor, child: Column( children: [ - // 탭 바 + // 탭 바 (Tab Bar) RetroTabBar( controller: _tabController, tabs: tabs, accentColor: mpColor, ), - // 탭 내용 + // 탭 내용 (Tab Content) 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), + BasicsHelpView(isKorean: isKorean, isJapanese: isJapanese), + CombatHelpView(isKorean: isKorean, isJapanese: isJapanese), + SkillsHelpView(isKorean: isKorean, isJapanese: isJapanese), + UIHelpView(isKorean: isKorean, isJapanese: isJapanese), ], ), ), @@ -87,410 +92,3 @@ class _HelpDialogState extends State ); } } - -/// 기본 도움말 뷰 -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), - ], - ); - } -}