feat(game): 포션 시스템 및 UI 패널 추가
- 포션 시스템 구현 (PotionService, Potion 모델) - 포션 인벤토리 패널 위젯 - 활성 버프 패널 위젯 - 장비 스탯 패널 위젯 - 스킬 시스템 확장 - 일본어 번역 추가 - 전투 이벤트/상태 모델 개선
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
// 게임 텍스트 로컬라이제이션 (BuildContext 없이 사용)
|
||||
// progress_service.dart, pq_logic.dart 등에서 사용
|
||||
// 지원 언어: 한국어(ko), 영어(en), 일본어(ja)
|
||||
|
||||
import 'package:askiineverdie/data/game_translations_ko.dart';
|
||||
import 'package:askiineverdie/data/game_translations_ja.dart';
|
||||
|
||||
/// 현재 게임 로케일 설정 (전역)
|
||||
String _currentLocale = 'en';
|
||||
@@ -17,6 +19,9 @@ void setGameLocale(String locale) {
|
||||
/// 한국어 여부 확인
|
||||
bool get isKoreanLocale => _currentLocale == 'ko';
|
||||
|
||||
/// 일본어 여부 확인
|
||||
bool get isJapaneseLocale => _currentLocale == 'ja';
|
||||
|
||||
// ============================================================================
|
||||
// 프롤로그 텍스트
|
||||
// ============================================================================
|
||||
@@ -35,199 +40,417 @@ const _prologueTextsKo = [
|
||||
'예상치 못한 결의로 널(Null) 왕국을 향한 위험한 여정을 시작하다',
|
||||
];
|
||||
|
||||
List<String> get prologueTexts =>
|
||||
isKoreanLocale ? _prologueTextsKo : _prologueTextsEn;
|
||||
const _prologueTextsJa = [
|
||||
'コードの神から不吉な幻影を受ける',
|
||||
'老いたコンパイラー賢者が予言を明かす:「グリッチゴッドが目覚めた」',
|
||||
'突然のバッファオーバーフローが村をリセットし、あなただけが唯一の生存者となる',
|
||||
'予想外の決意で、ヌル(Null)王国への危険な旅に出発する',
|
||||
];
|
||||
|
||||
List<String> get prologueTexts {
|
||||
if (isKoreanLocale) return _prologueTextsKo;
|
||||
if (isJapaneseLocale) return _prologueTextsJa;
|
||||
return _prologueTextsEn;
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 태스크 캡션
|
||||
// ============================================================================
|
||||
|
||||
String get taskCompiling => isKoreanLocale ? '컴파일 중' : 'Compiling';
|
||||
String get taskCompiling {
|
||||
if (isKoreanLocale) return '컴파일 중';
|
||||
if (isJapaneseLocale) return 'コンパイル中';
|
||||
return 'Compiling';
|
||||
}
|
||||
|
||||
String get taskPrologue => isKoreanLocale ? '프롤로그' : 'Prologue';
|
||||
String get taskPrologue {
|
||||
if (isKoreanLocale) return '프롤로그';
|
||||
if (isJapaneseLocale) return 'プロローグ';
|
||||
return 'Prologue';
|
||||
}
|
||||
|
||||
String taskHeadingToMarket() =>
|
||||
isKoreanLocale ? '전리품을 팔기 위해 데이터 마켓으로 이동 중' : 'Heading to the Data Market to trade loot';
|
||||
String taskHeadingToMarket() {
|
||||
if (isKoreanLocale) return '전리품을 팔기 위해 데이터 마켓으로 이동 중';
|
||||
if (isJapaneseLocale) return '戦利品を売るためデータマーケットへ移動中';
|
||||
return 'Heading to the Data Market to trade loot';
|
||||
}
|
||||
|
||||
String taskUpgradingHardware() =>
|
||||
isKoreanLocale ? '테크 샵에서 하드웨어 업그레이드 중' : 'Upgrading hardware at the Tech Shop';
|
||||
String taskUpgradingHardware() {
|
||||
if (isKoreanLocale) return '테크 샵에서 하드웨어 업그레이드 중';
|
||||
if (isJapaneseLocale) return 'テックショップでハードウェアをアップグレード中';
|
||||
return 'Upgrading hardware at the Tech Shop';
|
||||
}
|
||||
|
||||
String taskEnteringDebugZone() =>
|
||||
isKoreanLocale ? '디버그 존 진입 중' : 'Entering the Debug Zone';
|
||||
String taskEnteringDebugZone() {
|
||||
if (isKoreanLocale) return '디버그 존 진입 중';
|
||||
if (isJapaneseLocale) return 'デバッグゾーンに進入中';
|
||||
return 'Entering the Debug Zone';
|
||||
}
|
||||
|
||||
String taskDebugging(String monsterName) =>
|
||||
isKoreanLocale ? '$monsterName 디버깅 중' : 'Debugging $monsterName';
|
||||
String taskDebugging(String monsterName) {
|
||||
if (isKoreanLocale) return '$monsterName 디버깅 중';
|
||||
if (isJapaneseLocale) return '$monsterName をデバッグ中';
|
||||
return 'Debugging $monsterName';
|
||||
}
|
||||
|
||||
String taskSelling(String itemDescription) =>
|
||||
isKoreanLocale ? '$itemDescription 판매 중' : 'Selling $itemDescription';
|
||||
String taskSelling(String itemDescription) {
|
||||
if (isKoreanLocale) return '$itemDescription 판매 중';
|
||||
if (isJapaneseLocale) return '$itemDescription を販売中';
|
||||
return 'Selling $itemDescription';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 퀘스트 캡션
|
||||
// ============================================================================
|
||||
|
||||
String questPatch(String name) =>
|
||||
isKoreanLocale ? '$name 패치하기' : 'Patch $name';
|
||||
String questPatch(String name) {
|
||||
if (isKoreanLocale) return '$name 패치하기';
|
||||
if (isJapaneseLocale) return '$name をパッチする';
|
||||
return 'Patch $name';
|
||||
}
|
||||
|
||||
String questLocate(String item) =>
|
||||
isKoreanLocale ? '$item 찾기' : 'Locate $item';
|
||||
String questLocate(String item) {
|
||||
if (isKoreanLocale) return '$item 찾기';
|
||||
if (isJapaneseLocale) return '$item を探す';
|
||||
return 'Locate $item';
|
||||
}
|
||||
|
||||
String questTransfer(String item) =>
|
||||
isKoreanLocale ? '이 $item 전송하기' : 'Transfer this $item';
|
||||
String questTransfer(String item) {
|
||||
if (isKoreanLocale) return '이 $item 전송하기';
|
||||
if (isJapaneseLocale) return 'この$item を転送する';
|
||||
return 'Transfer this $item';
|
||||
}
|
||||
|
||||
String questDownload(String item) =>
|
||||
isKoreanLocale ? '$item 다운로드하기' : 'Download $item';
|
||||
String questDownload(String item) {
|
||||
if (isKoreanLocale) return '$item 다운로드하기';
|
||||
if (isJapaneseLocale) return '$item をダウンロードする';
|
||||
return 'Download $item';
|
||||
}
|
||||
|
||||
String questStabilize(String name) =>
|
||||
isKoreanLocale ? '$name 안정화하기' : 'Stabilize $name';
|
||||
String questStabilize(String name) {
|
||||
if (isKoreanLocale) return '$name 안정화하기';
|
||||
if (isJapaneseLocale) return '$name を安定化する';
|
||||
return 'Stabilize $name';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// Act 제목
|
||||
// ============================================================================
|
||||
|
||||
String actTitle(String romanNumeral) =>
|
||||
isKoreanLocale ? '$romanNumeral막' : 'Act $romanNumeral';
|
||||
String actTitle(String romanNumeral) {
|
||||
if (isKoreanLocale) return '$romanNumeral막';
|
||||
if (isJapaneseLocale) return '第$romanNumeral幕';
|
||||
return 'Act $romanNumeral';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 시네마틱 텍스트 - 시나리오 1: 캐시 존
|
||||
// ============================================================================
|
||||
|
||||
String cinematicCacheZone1() => isKoreanLocale
|
||||
? '지쳐서 손상된 네트워크의 안전한 캐시 존에 도착하다'
|
||||
: 'Exhausted, you reach a safe Cache Zone in the corrupted network';
|
||||
String cinematicCacheZone1() {
|
||||
if (isKoreanLocale) return '지쳐서 손상된 네트워크의 안전한 캐시 존에 도착하다';
|
||||
if (isJapaneseLocale) return '疲れ果てて、破損したネットワークの安全なキャッシュゾーンに到着する';
|
||||
return 'Exhausted, you reach a safe Cache Zone in the corrupted network';
|
||||
}
|
||||
|
||||
String cinematicCacheZone2() => isKoreanLocale
|
||||
? '옛 동맹들과 재연결하고 새로운 동료들을 포크하다'
|
||||
: 'You reconnect with old allies and fork new ones';
|
||||
String cinematicCacheZone2() {
|
||||
if (isKoreanLocale) return '옛 동맹들과 재연결하고 새로운 동료들을 포크하다';
|
||||
if (isJapaneseLocale) return '古い同盟者と再接続し、新しい仲間をフォークする';
|
||||
return 'You reconnect with old allies and fork new ones';
|
||||
}
|
||||
|
||||
String cinematicCacheZone3() => isKoreanLocale
|
||||
? '디버거 기사단 회의에 참석하다'
|
||||
: 'You attend a council of the Debugger Knights';
|
||||
String cinematicCacheZone3() {
|
||||
if (isKoreanLocale) return '디버거 기사단 회의에 참석하다';
|
||||
if (isJapaneseLocale) return 'デバッガー騎士団の会議に参加する';
|
||||
return 'You attend a council of the Debugger Knights';
|
||||
}
|
||||
|
||||
String cinematicCacheZone4() => isKoreanLocale
|
||||
? '많은 버그들이 기다린다. 당신이 패치하도록 선택되었다!'
|
||||
: 'Many bugs await. You are chosen to patch them!';
|
||||
String cinematicCacheZone4() {
|
||||
if (isKoreanLocale) return '많은 버그들이 기다린다. 당신이 패치하도록 선택되었다!';
|
||||
if (isJapaneseLocale) return '多くのバグが待っている。あなたがパッチを当てるよう選ばれた!';
|
||||
return 'Many bugs await. You are chosen to patch them!';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 시네마틱 텍스트 - 시나리오 2: 전투
|
||||
// ============================================================================
|
||||
|
||||
String cinematicCombat1() => isKoreanLocale
|
||||
? '목표가 눈앞에 있지만, 치명적인 버그가 길을 막는다!'
|
||||
: 'Your target is in sight, but a critical bug blocks your path!';
|
||||
String cinematicCombat1() {
|
||||
if (isKoreanLocale) return '목표가 눈앞에 있지만, 치명적인 버그가 길을 막는다!';
|
||||
if (isJapaneseLocale) return 'ターゲットは目の前だが、致命的なバグが道を塞ぐ!';
|
||||
return 'Your target is in sight, but a critical bug blocks your path!';
|
||||
}
|
||||
|
||||
String cinematicCombat2(String nemesis) => isKoreanLocale
|
||||
? '$nemesis와의 필사적인 디버깅 세션이 시작되다'
|
||||
: 'A desperate debugging session begins with $nemesis';
|
||||
String cinematicCombat2(String nemesis) {
|
||||
if (isKoreanLocale) return '$nemesis와의 필사적인 디버깅 세션이 시작되다';
|
||||
if (isJapaneseLocale) return '$nemesisとの必死のデバッグセッションが始まる';
|
||||
return 'A desperate debugging session begins with $nemesis';
|
||||
}
|
||||
|
||||
String cinematicCombatLocked(String nemesis) => isKoreanLocale
|
||||
? '$nemesis와 치열한 디버깅 중'
|
||||
: 'Locked in intense debugging with $nemesis';
|
||||
String cinematicCombatLocked(String nemesis) {
|
||||
if (isKoreanLocale) return '$nemesis와 치열한 디버깅 중';
|
||||
if (isJapaneseLocale) return '$nemesisと激しいデバッグ中';
|
||||
return 'Locked in intense debugging with $nemesis';
|
||||
}
|
||||
|
||||
String cinematicCombatCorrupts(String nemesis) => isKoreanLocale
|
||||
? '$nemesis가 당신의 스택 트레이스를 손상시키다'
|
||||
: '$nemesis corrupts your stack trace';
|
||||
String cinematicCombatCorrupts(String nemesis) {
|
||||
if (isKoreanLocale) return '$nemesis가 당신의 스택 트레이스를 손상시키다';
|
||||
if (isJapaneseLocale) return '$nemesisがあなたのスタックトレースを破損させる';
|
||||
return '$nemesis corrupts your stack trace';
|
||||
}
|
||||
|
||||
String cinematicCombatWorking(String nemesis) => isKoreanLocale
|
||||
? '당신의 패치가 $nemesis에게 효과를 보이는 것 같다'
|
||||
: 'Your patch seems to be working against $nemesis';
|
||||
String cinematicCombatWorking(String nemesis) {
|
||||
if (isKoreanLocale) return '당신의 패치가 $nemesis에게 효과를 보이는 것 같다';
|
||||
if (isJapaneseLocale) return 'あなたのパッチが$nemesisに効いているようだ';
|
||||
return 'Your patch seems to be working against $nemesis';
|
||||
}
|
||||
|
||||
String cinematicCombatVictory(String nemesis) => isKoreanLocale
|
||||
? '승리! $nemesis가 패치되었다! 복구를 위해 시스템이 재부팅된다'
|
||||
: 'Victory! $nemesis is patched! System reboots for recovery';
|
||||
String cinematicCombatVictory(String nemesis) {
|
||||
if (isKoreanLocale) return '승리! $nemesis가 패치되었다! 복구를 위해 시스템이 재부팅된다';
|
||||
if (isJapaneseLocale) return '勝利!$nemesisはパッチされた!復旧のためシステムが再起動する';
|
||||
return 'Victory! $nemesis is patched! System reboots for recovery';
|
||||
}
|
||||
|
||||
String cinematicCombatWakeUp() => isKoreanLocale
|
||||
? '안전 모드에서 깨어나지만, 커널이 기다린다'
|
||||
: 'You wake up in a Safe Mode, but the kernel awaits';
|
||||
String cinematicCombatWakeUp() {
|
||||
if (isKoreanLocale) return '안전 모드에서 깨어나지만, 커널이 기다린다';
|
||||
if (isJapaneseLocale) return 'セーフモードで目覚めるが、カーネルが待ち構えている';
|
||||
return 'You wake up in a Safe Mode, but the kernel awaits';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 시네마틱 텍스트 - 시나리오 3: 배신
|
||||
// ============================================================================
|
||||
|
||||
String cinematicBetrayal1(String guy) => isKoreanLocale
|
||||
? '안도감! $guy의 보안 서버에 도착하다'
|
||||
: 'What relief! You reach the secure server of $guy';
|
||||
String cinematicBetrayal1(String guy) {
|
||||
if (isKoreanLocale) return '안도감! $guy의 보안 서버에 도착하다';
|
||||
if (isJapaneseLocale) return '安堵!$guyのセキュアサーバーに到着する';
|
||||
return 'What relief! You reach the secure server of $guy';
|
||||
}
|
||||
|
||||
String cinematicBetrayal2(String guy) => isKoreanLocale
|
||||
? '축하가 이어지고, $guy와 수상한 비밀 핸드셰이크를 나누다'
|
||||
: 'There is celebration, and a suspicious private handshake with $guy';
|
||||
String cinematicBetrayal2(String guy) {
|
||||
if (isKoreanLocale) return '축하가 이어지고, $guy와 수상한 비밀 핸드셰이크를 나누다';
|
||||
if (isJapaneseLocale) return '祝賀が続き、$guyと怪しい秘密のハンドシェイクを交わす';
|
||||
return 'There is celebration, and a suspicious private handshake with $guy';
|
||||
}
|
||||
|
||||
String cinematicBetrayal3(String item) => isKoreanLocale
|
||||
? '$item을 잊고 다시 가져오러 돌아가다'
|
||||
: 'You forget your $item and go back to retrieve it';
|
||||
String cinematicBetrayal3(String item) {
|
||||
if (isKoreanLocale) return '$item을 잊고 다시 가져오러 돌아가다';
|
||||
if (isJapaneseLocale) return '$itemを忘れて取りに戻る';
|
||||
return 'You forget your $item and go back to retrieve it';
|
||||
}
|
||||
|
||||
String cinematicBetrayal4() => isKoreanLocale
|
||||
? '이게 뭐지!? 손상된 패킷을 가로채다!'
|
||||
: 'What is this!? You intercept a corrupted packet!';
|
||||
String cinematicBetrayal4() {
|
||||
if (isKoreanLocale) return '이게 뭐지!? 손상된 패킷을 가로채다!';
|
||||
if (isJapaneseLocale) return 'これは何だ!?破損したパケットを傍受する!';
|
||||
return 'What is this!? You intercept a corrupted packet!';
|
||||
}
|
||||
|
||||
String cinematicBetrayal5(String guy) => isKoreanLocale
|
||||
? '$guy가 글리치 신의 백도어일 수 있을까?'
|
||||
: 'Could $guy be a backdoor for the Glitch God?';
|
||||
String cinematicBetrayal5(String guy) {
|
||||
if (isKoreanLocale) return '$guy가 글리치 신의 백도어일 수 있을까?';
|
||||
if (isJapaneseLocale) return '$guyはグリッチゴッドのバックドアなのか?';
|
||||
return 'Could $guy be a backdoor for the Glitch God?';
|
||||
}
|
||||
|
||||
String cinematicBetrayal6() => isKoreanLocale
|
||||
? '이 정보를 누구에게 맡길 수 있을까!? -- 바이너리 신전이다'
|
||||
: 'Who can be trusted with this intel!? -- The Binary Temple, of course';
|
||||
String cinematicBetrayal6() {
|
||||
if (isKoreanLocale) return '이 정보를 누구에게 맡길 수 있을까!? -- 바이너리 신전이다';
|
||||
if (isJapaneseLocale) return 'この情報を誰に託せるか!? -- バイナリ神殿だ';
|
||||
return 'Who can be trusted with this intel!? -- The Binary Temple, of course';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 몬스터 수식어
|
||||
// ============================================================================
|
||||
|
||||
String modifierDead(String s) => isKoreanLocale ? '쓰러진 $s' : 'fallen $s';
|
||||
String modifierComatose(String s) => isKoreanLocale ? '잠복하는 $s' : 'lurking $s';
|
||||
String modifierCrippled(String s) => isKoreanLocale ? '흉측한 $s' : 'twisted $s';
|
||||
String modifierSick(String s) => isKoreanLocale ? '오염된 $s' : 'tainted $s';
|
||||
String modifierUndernourished(String s) =>
|
||||
isKoreanLocale ? '굶주린 $s' : 'ravenous $s';
|
||||
String modifierDead(String s) {
|
||||
if (isKoreanLocale) return '쓰러진 $s';
|
||||
if (isJapaneseLocale) return '倒れた$s';
|
||||
return 'fallen $s';
|
||||
}
|
||||
|
||||
String modifierFoetal(String s) => isKoreanLocale ? '태동기 $s' : 'nascent $s';
|
||||
String modifierBaby(String s) => isKoreanLocale ? '초기형 $s' : 'fledgling $s';
|
||||
String modifierPreadolescent(String s) =>
|
||||
isKoreanLocale ? '진화 중인 $s' : 'evolving $s';
|
||||
String modifierTeenage(String s) => isKoreanLocale ? '하급 $s' : 'lesser $s';
|
||||
String modifierUnderage(String s) => isKoreanLocale ? '불완전한 $s' : 'incomplete $s';
|
||||
String modifierComatose(String s) {
|
||||
if (isKoreanLocale) return '잠복하는 $s';
|
||||
if (isJapaneseLocale) return '潜む$s';
|
||||
return 'lurking $s';
|
||||
}
|
||||
|
||||
String modifierGreater(String s) => isKoreanLocale ? '상위 $s' : 'greater $s';
|
||||
String modifierMassive(String s) => isKoreanLocale ? '거대한 $s' : 'massive $s';
|
||||
String modifierEnormous(String s) => isKoreanLocale ? '초거대 $s' : 'enormous $s';
|
||||
String modifierGiant(String s) => isKoreanLocale ? '자이언트 $s' : 'giant $s';
|
||||
String modifierTitanic(String s) => isKoreanLocale ? '타이타닉 $s' : 'titanic $s';
|
||||
String modifierCrippled(String s) {
|
||||
if (isKoreanLocale) return '흉측한 $s';
|
||||
if (isJapaneseLocale) return '歪んだ$s';
|
||||
return 'twisted $s';
|
||||
}
|
||||
|
||||
String modifierVeteran(String s) => isKoreanLocale ? '베테랑 $s' : 'veteran $s';
|
||||
String modifierBattle(String s) => isKoreanLocale ? '전투-$s' : 'Battle-$s';
|
||||
String modifierCursed(String s) => isKoreanLocale ? '저주받은 $s' : 'cursed $s';
|
||||
String modifierWarrior(String s) => isKoreanLocale ? '전사 $s' : 'warrior $s';
|
||||
String modifierWere(String s) => isKoreanLocale ? '늑대인간-$s' : 'Were-$s';
|
||||
String modifierUndead(String s) => isKoreanLocale ? '언데드 $s' : 'undead $s';
|
||||
String modifierDemon(String s) => isKoreanLocale ? '데몬 $s' : 'demon $s';
|
||||
String modifierSick(String s) {
|
||||
if (isKoreanLocale) return '오염된 $s';
|
||||
if (isJapaneseLocale) return '汚染された$s';
|
||||
return 'tainted $s';
|
||||
}
|
||||
|
||||
String modifierMessianic(String s) => isKoreanLocale ? '메시아닉 $s' : 'messianic $s';
|
||||
String modifierImaginary(String s) => isKoreanLocale ? '상상의 $s' : 'imaginary $s';
|
||||
String modifierPassing(String s) => isKoreanLocale ? '지나가는 $s' : 'passing $s';
|
||||
String modifierUndernourished(String s) {
|
||||
if (isKoreanLocale) return '굶주린 $s';
|
||||
if (isJapaneseLocale) return '飢えた$s';
|
||||
return 'ravenous $s';
|
||||
}
|
||||
|
||||
String modifierFoetal(String s) {
|
||||
if (isKoreanLocale) return '태동기 $s';
|
||||
if (isJapaneseLocale) return '胎動期$s';
|
||||
return 'nascent $s';
|
||||
}
|
||||
|
||||
String modifierBaby(String s) {
|
||||
if (isKoreanLocale) return '초기형 $s';
|
||||
if (isJapaneseLocale) return '初期型$s';
|
||||
return 'fledgling $s';
|
||||
}
|
||||
|
||||
String modifierPreadolescent(String s) {
|
||||
if (isKoreanLocale) return '진화 중인 $s';
|
||||
if (isJapaneseLocale) return '進化中の$s';
|
||||
return 'evolving $s';
|
||||
}
|
||||
|
||||
String modifierTeenage(String s) {
|
||||
if (isKoreanLocale) return '하급 $s';
|
||||
if (isJapaneseLocale) return '下級$s';
|
||||
return 'lesser $s';
|
||||
}
|
||||
|
||||
String modifierUnderage(String s) {
|
||||
if (isKoreanLocale) return '불완전한 $s';
|
||||
if (isJapaneseLocale) return '不完全な$s';
|
||||
return 'incomplete $s';
|
||||
}
|
||||
|
||||
String modifierGreater(String s) {
|
||||
if (isKoreanLocale) return '상위 $s';
|
||||
if (isJapaneseLocale) return '上位$s';
|
||||
return 'greater $s';
|
||||
}
|
||||
|
||||
String modifierMassive(String s) {
|
||||
if (isKoreanLocale) return '거대한 $s';
|
||||
if (isJapaneseLocale) return '巨大な$s';
|
||||
return 'massive $s';
|
||||
}
|
||||
|
||||
String modifierEnormous(String s) {
|
||||
if (isKoreanLocale) return '초거대 $s';
|
||||
if (isJapaneseLocale) return '超巨大$s';
|
||||
return 'enormous $s';
|
||||
}
|
||||
|
||||
String modifierGiant(String s) {
|
||||
if (isKoreanLocale) return '자이언트 $s';
|
||||
if (isJapaneseLocale) return 'ジャイアント$s';
|
||||
return 'giant $s';
|
||||
}
|
||||
|
||||
String modifierTitanic(String s) {
|
||||
if (isKoreanLocale) return '타이타닉 $s';
|
||||
if (isJapaneseLocale) return 'タイタニック$s';
|
||||
return 'titanic $s';
|
||||
}
|
||||
|
||||
String modifierVeteran(String s) {
|
||||
if (isKoreanLocale) return '베테랑 $s';
|
||||
if (isJapaneseLocale) return 'ベテラン$s';
|
||||
return 'veteran $s';
|
||||
}
|
||||
|
||||
String modifierBattle(String s) {
|
||||
if (isKoreanLocale) return '전투-$s';
|
||||
if (isJapaneseLocale) return '戦闘-$s';
|
||||
return 'Battle-$s';
|
||||
}
|
||||
|
||||
String modifierCursed(String s) {
|
||||
if (isKoreanLocale) return '저주받은 $s';
|
||||
if (isJapaneseLocale) return '呪われた$s';
|
||||
return 'cursed $s';
|
||||
}
|
||||
|
||||
String modifierWarrior(String s) {
|
||||
if (isKoreanLocale) return '전사 $s';
|
||||
if (isJapaneseLocale) return '戦士$s';
|
||||
return 'warrior $s';
|
||||
}
|
||||
|
||||
String modifierWere(String s) {
|
||||
if (isKoreanLocale) return '늑대인간-$s';
|
||||
if (isJapaneseLocale) return '狼男-$s';
|
||||
return 'Were-$s';
|
||||
}
|
||||
|
||||
String modifierUndead(String s) {
|
||||
if (isKoreanLocale) return '언데드 $s';
|
||||
if (isJapaneseLocale) return 'アンデッド$s';
|
||||
return 'undead $s';
|
||||
}
|
||||
|
||||
String modifierDemon(String s) {
|
||||
if (isKoreanLocale) return '데몬 $s';
|
||||
if (isJapaneseLocale) return 'デーモン$s';
|
||||
return 'demon $s';
|
||||
}
|
||||
|
||||
String modifierMessianic(String s) {
|
||||
if (isKoreanLocale) return '메시아닉 $s';
|
||||
if (isJapaneseLocale) return 'メシアニック$s';
|
||||
return 'messianic $s';
|
||||
}
|
||||
|
||||
String modifierImaginary(String s) {
|
||||
if (isKoreanLocale) return '상상의 $s';
|
||||
if (isJapaneseLocale) return '想像上の$s';
|
||||
return 'imaginary $s';
|
||||
}
|
||||
|
||||
String modifierPassing(String s) {
|
||||
if (isKoreanLocale) return '지나가는 $s';
|
||||
if (isJapaneseLocale) return '通りすがりの$s';
|
||||
return 'passing $s';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 시간 표시
|
||||
// ============================================================================
|
||||
|
||||
String roughTimeSeconds(int seconds) =>
|
||||
isKoreanLocale ? '$seconds초' : '$seconds seconds';
|
||||
String roughTimeSeconds(int seconds) {
|
||||
if (isKoreanLocale) return '$seconds초';
|
||||
if (isJapaneseLocale) return '$seconds秒';
|
||||
return '$seconds seconds';
|
||||
}
|
||||
|
||||
String roughTimeMinutes(int minutes) =>
|
||||
isKoreanLocale ? '$minutes분' : '$minutes minutes';
|
||||
String roughTimeMinutes(int minutes) {
|
||||
if (isKoreanLocale) return '$minutes분';
|
||||
if (isJapaneseLocale) return '$minutes分';
|
||||
return '$minutes minutes';
|
||||
}
|
||||
|
||||
String roughTimeHours(int hours) =>
|
||||
isKoreanLocale ? '$hours시간' : '$hours hours';
|
||||
String roughTimeHours(int hours) {
|
||||
if (isKoreanLocale) return '$hours시간';
|
||||
if (isJapaneseLocale) return '$hours時間';
|
||||
return '$hours hours';
|
||||
}
|
||||
|
||||
String roughTimeDays(int days) =>
|
||||
isKoreanLocale ? '$days일' : '$days days';
|
||||
String roughTimeDays(int days) {
|
||||
if (isKoreanLocale) return '$days일';
|
||||
if (isJapaneseLocale) return '$days日';
|
||||
return '$days days';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 영어 문법 함수 (한국어에서는 단순화)
|
||||
// 영어 문법 함수 (한국어/일본어에서는 단순화)
|
||||
// ============================================================================
|
||||
|
||||
/// 관사 + 명사 (한국어: 수량만 표시)
|
||||
/// 관사 + 명사 (한국어/일본어: 수량만 표시)
|
||||
String indefiniteL10n(String s, int qty) {
|
||||
if (isKoreanLocale) {
|
||||
return qty == 1 ? s : '$qty $s';
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return qty == 1 ? s : '$qty $s';
|
||||
}
|
||||
// 영어 로직
|
||||
if (qty == 1) {
|
||||
const vowels = 'AEIOUÜaeiouü';
|
||||
@@ -238,9 +461,9 @@ String indefiniteL10n(String s, int qty) {
|
||||
return '$qty ${_pluralize(s)}';
|
||||
}
|
||||
|
||||
/// the + 명사 (한국어: 그냥 명사)
|
||||
/// the + 명사 (한국어/일본어: 그냥 명사)
|
||||
String definiteL10n(String s, int qty) {
|
||||
if (isKoreanLocale) {
|
||||
if (isKoreanLocale || isJapaneseLocale) {
|
||||
return s;
|
||||
}
|
||||
// 영어 로직
|
||||
@@ -266,70 +489,202 @@ String _pluralize(String s) {
|
||||
// impressiveGuy 관련
|
||||
// ============================================================================
|
||||
|
||||
String impressiveGuyPattern1(String title, String race) => isKoreanLocale
|
||||
String impressiveGuyPattern1(String title, String race) {
|
||||
if (isKoreanLocale) {
|
||||
// ignore: unnecessary_brace_in_string_interps
|
||||
? '${race}들의 $title' // 한국어 조사 연결을 위해 중괄호 필요
|
||||
: 'the $title of the ${_pluralize(race)}';
|
||||
return '${race}들의 $title'; // 한국어 조사 연결을 위해 중괄호 필요
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
// ignore: unnecessary_brace_in_string_interps
|
||||
return '${race}たちの$title'; // 일본어 연결을 위해 중괄호 필요
|
||||
}
|
||||
return 'the $title of the ${_pluralize(race)}';
|
||||
}
|
||||
|
||||
String impressiveGuyPattern2(String title, String name1, String name2) =>
|
||||
isKoreanLocale
|
||||
? '$name2의 $title $name1'
|
||||
: '$title $name1 of $name2';
|
||||
String impressiveGuyPattern2(String title, String name1, String name2) {
|
||||
if (isKoreanLocale) return '$name2의 $title $name1';
|
||||
if (isJapaneseLocale) return '$name2の$title $name1';
|
||||
return '$title $name1 of $name2';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// namedMonster 관련
|
||||
// ============================================================================
|
||||
|
||||
String namedMonsterFormat(String generatedName, String monsterType) =>
|
||||
isKoreanLocale
|
||||
? '$monsterType $generatedName'
|
||||
: '$generatedName the $monsterType';
|
||||
String namedMonsterFormat(String generatedName, String monsterType) {
|
||||
if (isKoreanLocale) return '$monsterType $generatedName';
|
||||
if (isJapaneseLocale) return '$monsterType $generatedName';
|
||||
return '$generatedName the $monsterType';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 게임 데이터 번역 함수 (BuildContext 없이 사용)
|
||||
// 지원 언어: 한국어(ko), 영어(en), 일본어(ja)
|
||||
// ============================================================================
|
||||
|
||||
/// 몬스터 이름 번역
|
||||
String translateMonster(String englishName) =>
|
||||
isKoreanLocale ? (monsterTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
/// 몬스터 이름 번역 (기본 + 고급 몬스터 포함)
|
||||
String translateMonster(String englishName) {
|
||||
if (isKoreanLocale) {
|
||||
return monsterTranslationsKo[englishName] ??
|
||||
advancedMonsterTranslationsKo[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return monsterTranslationsJa[englishName] ??
|
||||
advancedMonsterTranslationsJa[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 종족 이름 번역
|
||||
String translateRace(String englishName) =>
|
||||
isKoreanLocale ? (raceTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
String translateRace(String englishName) {
|
||||
if (isKoreanLocale) return raceTranslationsKo[englishName] ?? englishName;
|
||||
if (isJapaneseLocale) return raceTranslationsJa[englishName] ?? englishName;
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 직업 이름 번역
|
||||
String translateKlass(String englishName) =>
|
||||
isKoreanLocale ? (klassTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
String translateKlass(String englishName) {
|
||||
if (isKoreanLocale) return klassTranslationsKo[englishName] ?? englishName;
|
||||
if (isJapaneseLocale) return klassTranslationsJa[englishName] ?? englishName;
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 칭호 이름 번역
|
||||
String translateTitle(String englishName) =>
|
||||
isKoreanLocale ? (titleTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
String translateTitle(String englishName) {
|
||||
if (isKoreanLocale) return titleTranslationsKo[englishName] ?? englishName;
|
||||
if (isJapaneseLocale) return titleTranslationsJa[englishName] ?? englishName;
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 인상적인 칭호 번역 (impressiveTitles용)
|
||||
String translateImpressiveTitle(String englishName) =>
|
||||
isKoreanLocale ? (impressiveTitleTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
String translateImpressiveTitle(String englishName) {
|
||||
if (isKoreanLocale) {
|
||||
return impressiveTitleTranslationsKo[englishName] ?? englishName;
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return impressiveTitleTranslationsJa[englishName] ?? englishName;
|
||||
}
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 특수 아이템 이름 번역
|
||||
String translateSpecial(String englishName) =>
|
||||
isKoreanLocale ? (specialTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
String translateSpecial(String englishName) {
|
||||
if (isKoreanLocale) return specialTranslationsKo[englishName] ?? englishName;
|
||||
if (isJapaneseLocale) return specialTranslationsJa[englishName] ?? englishName;
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 아이템 속성 이름 번역
|
||||
String translateItemAttrib(String englishName) =>
|
||||
isKoreanLocale ? (itemAttribTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
/// 아이템 속성 이름 번역 (기본 + 추가 속성 포함)
|
||||
String translateItemAttrib(String englishName) {
|
||||
if (isKoreanLocale) {
|
||||
return itemAttribTranslationsKo[englishName] ??
|
||||
additionalItemAttribTranslationsKo[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return itemAttribTranslationsJa[englishName] ??
|
||||
additionalItemAttribTranslationsJa[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 아이템 "~의" 접미사 번역
|
||||
String translateItemOf(String englishName) =>
|
||||
isKoreanLocale ? (itemOfsTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
/// 아이템 "~의" 접미사 번역 (기본 + 추가 포함)
|
||||
String translateItemOf(String englishName) {
|
||||
if (isKoreanLocale) {
|
||||
return itemOfsTranslationsKo[englishName] ??
|
||||
additionalItemOfsTranslationsKo[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return itemOfsTranslationsJa[englishName] ??
|
||||
additionalItemOfsTranslationsJa[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// 단순 아이템 번역
|
||||
String translateBoringItem(String englishName) =>
|
||||
isKoreanLocale ? (boringItemTranslationsKo[englishName] ?? englishName) : englishName;
|
||||
/// 단순 아이템 번역 (기본 + 추가 드롭 포함)
|
||||
String translateBoringItem(String englishName) {
|
||||
if (isKoreanLocale) {
|
||||
return boringItemTranslationsKo[englishName] ??
|
||||
dropItemTranslationsKo[englishName] ??
|
||||
additionalDropTranslationsKo[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
return boringItemTranslationsJa[englishName] ??
|
||||
dropItemTranslationsJa[englishName] ??
|
||||
additionalDropTranslationsJa[englishName] ??
|
||||
englishName;
|
||||
}
|
||||
return englishName;
|
||||
}
|
||||
|
||||
/// interestingItem 번역 (attrib + special 조합)
|
||||
/// 예: "Golden Iterator" → "황금 이터레이터"
|
||||
/// 예: "Golden Iterator" → "황금 이터레이터" / "黄金のイテレーター"
|
||||
String translateInterestingItem(String attrib, String special) {
|
||||
if (!isKoreanLocale) return '$attrib $special';
|
||||
final translatedAttrib = itemAttribTranslationsKo[attrib] ?? attrib;
|
||||
final translatedSpecial = specialTranslationsKo[special] ?? special;
|
||||
return '$translatedAttrib $translatedSpecial';
|
||||
if (isKoreanLocale) {
|
||||
final translatedAttrib = itemAttribTranslationsKo[attrib] ??
|
||||
additionalItemAttribTranslationsKo[attrib] ??
|
||||
attrib;
|
||||
final translatedSpecial = specialTranslationsKo[special] ?? special;
|
||||
return '$translatedAttrib $translatedSpecial';
|
||||
}
|
||||
if (isJapaneseLocale) {
|
||||
final translatedAttrib = itemAttribTranslationsJa[attrib] ??
|
||||
additionalItemAttribTranslationsJa[attrib] ??
|
||||
attrib;
|
||||
final translatedSpecial = specialTranslationsJa[special] ?? special;
|
||||
return '$translatedAttrib$translatedSpecial';
|
||||
}
|
||||
return '$attrib $special';
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
// 스토리/시네마틱 번역 함수 (Story/Cinematic Translation Functions)
|
||||
// ============================================================================
|
||||
|
||||
/// Act 제목 번역
|
||||
String translateActTitle(String englishTitle) {
|
||||
if (isKoreanLocale) return actTitleTranslationsKo[englishTitle] ?? englishTitle;
|
||||
if (isJapaneseLocale) return actTitleTranslationsJa[englishTitle] ?? englishTitle;
|
||||
return englishTitle;
|
||||
}
|
||||
|
||||
/// Act 보스 이름 번역
|
||||
String translateActBoss(String englishBoss) {
|
||||
if (isKoreanLocale) return actBossTranslationsKo[englishBoss] ?? englishBoss;
|
||||
if (isJapaneseLocale) return actBossTranslationsJa[englishBoss] ?? englishBoss;
|
||||
return englishBoss;
|
||||
}
|
||||
|
||||
/// Act 퀘스트 번역
|
||||
String translateActQuest(String englishQuest) {
|
||||
if (isKoreanLocale) return actQuestTranslationsKo[englishQuest] ?? englishQuest;
|
||||
if (isJapaneseLocale) return actQuestTranslationsJa[englishQuest] ?? englishQuest;
|
||||
return englishQuest;
|
||||
}
|
||||
|
||||
/// 시네마틱 텍스트 번역
|
||||
String translateCinematic(String englishText) {
|
||||
if (isKoreanLocale) return cinematicTranslationsKo[englishText] ?? englishText;
|
||||
if (isJapaneseLocale) return cinematicTranslationsJa[englishText] ?? englishText;
|
||||
return englishText;
|
||||
}
|
||||
|
||||
/// 지역 이름 번역
|
||||
String translateLocation(String englishLocation) {
|
||||
if (isKoreanLocale) return locationTranslationsKo[englishLocation] ?? englishLocation;
|
||||
if (isJapaneseLocale) return locationTranslationsJa[englishLocation] ?? englishLocation;
|
||||
return englishLocation;
|
||||
}
|
||||
|
||||
/// 세력/조직 이름 번역
|
||||
String translateFaction(String englishFaction) {
|
||||
if (isKoreanLocale) return factionTranslationsKo[englishFaction] ?? englishFaction;
|
||||
if (isJapaneseLocale) return factionTranslationsJa[englishFaction] ?? englishFaction;
|
||||
return englishFaction;
|
||||
}
|
||||
|
||||
1521
lib/data/game_translations_ja.dart
Normal file
1521
lib/data/game_translations_ja.dart
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,31 @@
|
||||
// ============================================================================
|
||||
// ASCII NEVER DIE 한국어 번역 데이터
|
||||
// 게임 데이터의 한국어 번역을 제공합니다.
|
||||
// ============================================================================
|
||||
//
|
||||
// 이 파일은 게임의 모든 한국어 번역을 포함합니다.
|
||||
// 영문 원본은 pq_config_data.dart에 정의되어 있습니다.
|
||||
//
|
||||
// ## 세계관 (World Setting)
|
||||
// 아스키나라(ASCII-Nara): 코드의 신이 창조한 디지털 판타지 세계
|
||||
// - 널(Null) 왕국: 모험자들이 시작하는 중앙 도시 (64비트 왕 통치)
|
||||
// - 코어의 심연: 전설적 장비가 발견되는 고대 던전
|
||||
// - 글리치 영역: 버그와 오류로 현실이 뒤틀린 지역
|
||||
// - 바이너리 신전: 코드의 신을 숭배하는 신성한 장소
|
||||
//
|
||||
// ## 번역 구조
|
||||
// - 기본 번역 Maps: raceTranslationsKo, klassTranslationsKo, monsterTranslationsKo 등
|
||||
// - 추가 번역 Maps: advancedMonsterTranslationsKo, additionalDropTranslationsKo 등
|
||||
// - 스토리 번역 Maps: actTitleTranslationsKo, cinematicTranslationsKo 등
|
||||
// - 세계관 번역 Maps: locationTranslationsKo, factionTranslationsKo
|
||||
//
|
||||
// ## 번역 함수 사용 (game_text_l10n.dart)
|
||||
// - translateMonster(name): 몬스터 이름 번역
|
||||
// - translateRace(name): 종족 이름 번역
|
||||
// - translateItemAttrib(name): 아이템 속성 번역
|
||||
// - translateCinematic(text): 시네마틱 텍스트 번역
|
||||
// - 등등...
|
||||
//
|
||||
// ============================================================================
|
||||
|
||||
/// 종족 이름 한국어 번역
|
||||
const Map<String, String> raceTranslationsKo = {
|
||||
@@ -1101,3 +1127,415 @@ const Map<String, String> dropItemTranslationsKo = {
|
||||
'privilege escape': '권한 탈출',
|
||||
'heap overflow': '힙 오버플로우',
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// 스토리/시네마틱 한국어 번역 (Story/Cinematic Translations)
|
||||
// ============================================================================
|
||||
|
||||
/// Act 제목 한국어 번역
|
||||
const Map<String, String> actTitleTranslationsKo = {
|
||||
'Prologue': '프롤로그',
|
||||
'Act I: Awakening': '제1막: 각성',
|
||||
'Act II: Growth': '제2막: 성장',
|
||||
'Act III: Trials': '제3막: 시련',
|
||||
'Act IV: Confrontation': '제4막: 결전',
|
||||
'Act V: Endgame': '제5막: 종말',
|
||||
'The End': '완결',
|
||||
};
|
||||
|
||||
/// Act별 보스 몬스터 이름 한국어 번역
|
||||
const Map<String, String> actBossTranslationsKo = {
|
||||
'BOSS: Stack Overflow Dragon': '보스: 스택 오버플로우 드래곤',
|
||||
'BOSS: Heap Corruption Hydra': '보스: 힙 손상 히드라',
|
||||
'BOSS: Kernel Panic Titan': '보스: 커널 패닉 타이탄',
|
||||
'BOSS: Zero Day Leviathan': '보스: 제로데이 리바이어던',
|
||||
'BOSS: The Primordial Glitch': '보스: 태초의 글리치',
|
||||
};
|
||||
|
||||
/// Act별 시작 퀘스트 한국어 번역
|
||||
const Map<String, String> actQuestTranslationsKo = {
|
||||
'Exterminate the Bug Infestation': '버그 침입 소탕',
|
||||
'Purge the Bug Nest': '버그 둥지 정화',
|
||||
'Cleanse the Corrupted Network': '손상된 네트워크 정화',
|
||||
'Pass the Trials of the Ancient Compiler': '고대 컴파일러의 시련 통과',
|
||||
"Infiltrate the Glitch God's Citadel": '글리치 신의 성채 침투',
|
||||
'Defeat the Glitch God': '글리치 신 처치',
|
||||
};
|
||||
|
||||
/// 시네마틱 텍스트 한국어 번역
|
||||
const Map<String, String> cinematicTranslationsKo = {
|
||||
// 프롤로그
|
||||
'In the beginning, there was only the Void...':
|
||||
'태초에, 오직 공허(Void)만이 존재했다...',
|
||||
'Then came the First Commit, and Light filled the Codebase.':
|
||||
'그리고 첫 번째 커밋이 도래하여, 빛이 코드베이스를 가득 채웠다.',
|
||||
'The Code God spoke: "Let there be Functions."':
|
||||
'코드의 신이 말씀하셨다: "함수가 있으라."',
|
||||
'And so the Digital Realm was born...': '그리하여 디지털 세계가 탄생하였다...',
|
||||
'But from the shadows emerged the Glitch.': '그러나 어둠 속에서 글리치가 출현했다.',
|
||||
'Now, a new hero awakens to defend the Code.':
|
||||
'이제, 코드를 수호할 새로운 영웅이 깨어난다.',
|
||||
'Your journey begins...': '당신의 여정이 시작된다...',
|
||||
|
||||
// Act I: 각성
|
||||
'=== ACT I: AWAKENING ===': '=== 제1막: 각성 ===',
|
||||
'You have proven yourself against the lesser bugs.':
|
||||
'당신은 하급 버그들을 상대로 실력을 증명했다.',
|
||||
'The Debugger Knights take notice of your potential.':
|
||||
'디버거 기사단이 당신의 잠재력을 주목한다.',
|
||||
'But a greater threat lurks in the Bug Nest...':
|
||||
'하지만 더 큰 위협이 버그 둥지에 도사리고 있다...',
|
||||
'The Syntax Error Dragon awaits.': '문법 오류 드래곤이 기다린다.',
|
||||
|
||||
// Act II: 성장
|
||||
'=== ACT II: GROWTH ===': '=== 제2막: 성장 ===',
|
||||
'With the Dragon slain, you join the Debugger Knights.':
|
||||
'드래곤을 처치하고, 당신은 디버거 기사단에 입단한다.',
|
||||
'The Corrupted Network spreads its infection...':
|
||||
'손상된 네트워크가 감염을 퍼뜨리고 있다...',
|
||||
'A traitor among the Knights is revealed!': '기사단 내 배신자가 드러났다!',
|
||||
'The Memory Leak Hydra threatens all data.':
|
||||
'메모리 누수 히드라가 모든 데이터를 위협한다.',
|
||||
'You must stop the corruption before it consumes everything.':
|
||||
'모든 것을 삼키기 전에 손상을 멈춰야 한다.',
|
||||
|
||||
// Act III: 시련
|
||||
'=== ACT III: TRIALS ===': '=== 제3막: 시련 ===',
|
||||
'The path leads to the Null Kingdom...': '길은 널(Null) 왕국으로 이어진다...',
|
||||
'The Ancient Compiler challenges you to its trials.':
|
||||
'고대 컴파일러가 당신에게 시련을 건넨다.',
|
||||
'A companion falls... their sacrifice not in vain.':
|
||||
'동료가 쓰러진다... 그들의 희생은 헛되지 않으리.',
|
||||
'The Buffer Overflow Titan guards the gate.':
|
||||
'버퍼 오버플로우 타이탄이 문을 지키고 있다.',
|
||||
'Only through great sacrifice can you proceed.':
|
||||
'오직 큰 희생을 통해서만 앞으로 나아갈 수 있다.',
|
||||
|
||||
// Act IV: 결전
|
||||
'=== ACT IV: CONFRONTATION ===': '=== 제4막: 결전 ===',
|
||||
"The Glitch God's Citadel looms before you.":
|
||||
'글리치 신의 성채가 눈앞에 어렴풋이 보인다.',
|
||||
'Former enemies unite against the common threat.':
|
||||
'이전의 적들이 공동의 위협에 맞서 연합한다.',
|
||||
'The Final Alliance is forged.': '최후의 동맹이 결성되었다.',
|
||||
'The Kernel Panic Archon blocks your path.':
|
||||
'커널 패닉 아르콘이 당신의 길을 막는다.',
|
||||
'One final battle before the end...': '종말 전의 마지막 전투...',
|
||||
|
||||
// Act V: 종말
|
||||
'=== ACT V: ENDGAME ===': '=== 제5막: 종말 ===',
|
||||
'The Glitch God reveals its true form.': '글리치 신이 진정한 모습을 드러낸다.',
|
||||
'Reality itself begins to corrupt.': '현실 그 자체가 손상되기 시작한다.',
|
||||
'All hope rests upon your shoulders.': '모든 희망이 당신의 어깨에 달려 있다.',
|
||||
'The final battle for the Codebase begins!':
|
||||
'코드베이스를 위한 최후의 전투가 시작된다!',
|
||||
|
||||
// 엔딩
|
||||
'=== THE END ===': '=== 완결 ===',
|
||||
'The Glitch God falls. The corruption fades.':
|
||||
'글리치 신이 쓰러진다. 손상이 사라진다.',
|
||||
'System Reboot initiated...': '시스템 재부팅 시작...',
|
||||
'Peace returns to the Digital Realm.': '디지털 세계에 평화가 돌아온다.',
|
||||
'Your legend will be compiled into the eternal logs.':
|
||||
'당신의 전설은 영원한 로그에 컴파일될 것이다.',
|
||||
'THE END': '완',
|
||||
'...or is it?': '...정말 그럴까?',
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// 세계관 관련 용어 번역 (World-Building Terms)
|
||||
// ============================================================================
|
||||
|
||||
/// 주요 지역 한국어 번역
|
||||
const Map<String, String> locationTranslationsKo = {
|
||||
'Null Kingdom': '널(Null) 왕국',
|
||||
'Core Abyss': '코어의 심연',
|
||||
'Glitch Zone': '글리치 영역',
|
||||
'Binary Temple': '바이너리 신전',
|
||||
'Debug Zone': '디버그 존',
|
||||
'Data Market': '데이터 마켓',
|
||||
'Tech Shop': '테크 샵',
|
||||
'Cache Zone': '캐시 존',
|
||||
'Bug Nest': '버그 둥지',
|
||||
'Corrupted Network': '손상된 네트워크',
|
||||
"Glitch God's Citadel": '글리치 신의 성채',
|
||||
'Safe Mode': '안전 모드',
|
||||
};
|
||||
|
||||
/// 조직/세력 한국어 번역
|
||||
const Map<String, String> factionTranslationsKo = {
|
||||
'Debugger Knights': '디버거 기사단',
|
||||
'Code God': '코드의 신',
|
||||
'Glitch God': '글리치 신',
|
||||
'Bug God': '버그 신',
|
||||
'Ancient Compiler': '고대 컴파일러',
|
||||
'Final Alliance': '최후의 동맹',
|
||||
'64-bit King': '64비트 왕',
|
||||
'Compiler Sage': '컴파일러 현자',
|
||||
'Debugger Saint': '디버거 성인',
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// 추가 몬스터 번역 (레벨 54-100)
|
||||
// ============================================================================
|
||||
|
||||
/// 고급/엔드게임 몬스터 한국어 번역
|
||||
const Map<String, String> advancedMonsterTranslationsKo = {
|
||||
// 고급 시스템 위협 (레벨 54-65)
|
||||
'Kernel Exploiter': '커널 익스플로이터',
|
||||
'Ring -1 Phantom': '링 -1 팬텀',
|
||||
'TPM Bypasser': 'TPM 우회자',
|
||||
'Secure Boot Breaker': '시큐어 부트 파괴자',
|
||||
'IOMMU Escape': 'IOMMU 탈출',
|
||||
'SGX Enclave Bug': 'SGX 엔클레이브 버그',
|
||||
'TrustZone Breach': '트러스트존 침해',
|
||||
'Platform Security Bug': '플랫폼 보안 버그',
|
||||
'Hardware Backdoor': '하드웨어 백도어',
|
||||
'Supply Chain Implant': '공급망 임플란트',
|
||||
'BMC Rootkit': 'BMC 루트킷',
|
||||
'IPMI Ghost': 'IPMI 유령',
|
||||
|
||||
// 엔터프라이즈급 위협 (레벨 66-80)
|
||||
'Active Directory Worm': '액티브 디렉토리 웜',
|
||||
'Kerberos Golden': '케르베로스 골든',
|
||||
'NTLM Relay Beast': 'NTLM 릴레이 야수',
|
||||
'DCSync Phantom': 'DCSync 팬텀',
|
||||
'Exchange Exploit': '익스체인지 익스플로잇',
|
||||
'SharePoint Bug': '셰어포인트 버그',
|
||||
'Teams Vulnerability': '팀즈 취약점',
|
||||
'Azure AD Breach': '애저 AD 침해',
|
||||
'AWS IAM Bug': 'AWS IAM 버그',
|
||||
'GCP Exploit': 'GCP 익스플로잇',
|
||||
'Kubernetes Escape': '쿠버네티스 탈출',
|
||||
'Docker Breakout': '도커 브레이크아웃',
|
||||
'Service Mesh Bug': '서비스 메시 버그',
|
||||
'Terraform State Bug': '테라폼 상태 버그',
|
||||
'CI/CD Pipeline Poison': 'CI/CD 파이프라인 오염',
|
||||
|
||||
// 엔드게임 몬스터 (레벨 81-90)
|
||||
'Quantum Decoherence': '양자 결어긋남',
|
||||
'Neural Network Poison': '신경망 오염',
|
||||
'AI Hallucination': 'AI 환각',
|
||||
'Deep Fake Engine': '딥페이크 엔진',
|
||||
'Adversarial Noise': '적대적 노이즈',
|
||||
'Model Extraction': '모델 추출',
|
||||
'Prompt Injection': '프롬프트 인젝션',
|
||||
'Training Data Poison': '학습 데이터 오염',
|
||||
'Federated Learning Bug': '연합 학습 버그',
|
||||
'Differential Privacy Leak': '차등 프라이버시 누출',
|
||||
|
||||
// 최종 엔드게임 (레벨 91-100)
|
||||
'Post-Quantum Threat': '포스트 양자 위협',
|
||||
'Homomorphic Crack': '동형 암호 균열',
|
||||
'Zero Knowledge Flaw': '영지식 결함',
|
||||
'Blockchain Fork': '블록체인 포크',
|
||||
'Smart Contract Bug': '스마트 컨트랙트 버그',
|
||||
'MEV Extractor': 'MEV 추출자',
|
||||
'Cross-Chain Bridge Bug': '크로스체인 브릿지 버그',
|
||||
'Oracle Manipulation': '오라클 조작',
|
||||
'Flash Loan Attack': '플래시 론 공격',
|
||||
'The Final Bug': '최후의 버그',
|
||||
|
||||
// 미니보스
|
||||
'Elite Syntax Overlord': '엘리트 문법 군주',
|
||||
'Champion Buffer Crusher': '챔피언 버퍼 파괴자',
|
||||
'Veteran Memory Lord': '베테랑 메모리 군주',
|
||||
'Master Race Conductor': '마스터 레이스 지휘자',
|
||||
'Arch Kernel Breaker': '대 커널 파괴자',
|
||||
'High Protocol Corruptor': '상위 프로토콜 오염자',
|
||||
'Grand Firmware Defiler': '대 펌웨어 훼손자',
|
||||
'Supreme Cloud Invader': '최고 클라우드 침략자',
|
||||
'Legendary Container Escapist': '전설의 컨테이너 탈출자',
|
||||
'Ancient Pipeline Poisoner': '고대 파이프라인 오염자',
|
||||
|
||||
// 보스 몬스터
|
||||
'BOSS: APT Colossus': '보스: APT 거신',
|
||||
'BOSS: Ransomware Emperor': '보스: 랜섬웨어 황제',
|
||||
'BOSS: AI Singularity': '보스: AI 싱귤래리티',
|
||||
};
|
||||
|
||||
/// 추가 드롭 아이템 번역
|
||||
const Map<String, String> additionalDropTranslationsKo = {
|
||||
// 레벨 54-65 드롭
|
||||
'privilege token': '권한 토큰',
|
||||
'hypervisor breach': '하이퍼바이저 침해',
|
||||
'trusted module': '신뢰 모듈',
|
||||
'boot chain': '부트 체인',
|
||||
'memory isolation': '메모리 격리',
|
||||
'secure enclave': '보안 엔클레이브',
|
||||
'arm security': 'ARM 보안',
|
||||
'firmware key': '펌웨어 키',
|
||||
'silicon implant': '실리콘 임플란트',
|
||||
'factory malware': '공장 악성코드',
|
||||
'baseboard mgmt': '베이스보드 관리',
|
||||
'remote mgmt': '원격 관리',
|
||||
|
||||
// 레벨 66-80 드롭
|
||||
'domain token': '도메인 토큰',
|
||||
'ticket forgery': '티켓 위조',
|
||||
'auth bypass': '인증 우회',
|
||||
'replication attack': '복제 공격',
|
||||
'mail server': '메일 서버',
|
||||
'collab breach': '협업 침해',
|
||||
'comm exploit': '통신 익스플로잇',
|
||||
'cloud identity': '클라우드 ID',
|
||||
'cloud permission': '클라우드 권한',
|
||||
'google cloud': '구글 클라우드',
|
||||
'container breach': '컨테이너 침해',
|
||||
'namespace escape': '네임스페이스 탈출',
|
||||
'istio envoy': 'Istio 엔보이',
|
||||
'infra code': '인프라 코드',
|
||||
'build compromise': '빌드 침해',
|
||||
|
||||
// 레벨 81-90 드롭
|
||||
'qubit collapse': '큐비트 붕괴',
|
||||
'model corrupt': '모델 손상',
|
||||
'false output': '거짓 출력',
|
||||
'synthetic media': '합성 미디어',
|
||||
'ml attack': 'ML 공격',
|
||||
'stolen weights': '탈취된 가중치',
|
||||
'llm exploit': 'LLM 익스플로잇',
|
||||
'dataset corrupt': '데이터셋 손상',
|
||||
'distributed ml': '분산 ML',
|
||||
'anonymity breach': '익명성 침해',
|
||||
|
||||
// 레벨 91-100 드롭
|
||||
'lattice attack': '격자 공격',
|
||||
'encrypted compute': '암호화 연산',
|
||||
'proof bypass': '증명 우회',
|
||||
'consensus break': '합의 파괴',
|
||||
'solidity exploit': '솔리디티 익스플로잇',
|
||||
'transaction reorder': '트랜잭션 재정렬',
|
||||
'bridge exploit': '브릿지 익스플로잇',
|
||||
'price feed': '가격 피드',
|
||||
'defi exploit': 'DeFi 익스플로잇',
|
||||
'ultimate error': '궁극의 오류',
|
||||
|
||||
// 미니보스/보스 드롭
|
||||
'syntax crown': '문법의 왕관',
|
||||
'overflow gem': '오버플로우 보석',
|
||||
'leak artifact': '누수 유물',
|
||||
'thread scepter': '스레드 홀',
|
||||
'ring zero': '링 제로',
|
||||
'packet throne': '패킷 왕좌',
|
||||
'boot artifact': '부트 유물',
|
||||
'cloud crown': '클라우드 왕관',
|
||||
'namespace key': '네임스페이스 열쇠',
|
||||
'build shard': '빌드 파편',
|
||||
'legendary stack': '전설의 스택',
|
||||
'multi-head leak': '다중 머리 누수',
|
||||
'system crash': '시스템 붕괴',
|
||||
'unknown vuln': '미지의 취약점',
|
||||
'state actor': '국가급 행위자',
|
||||
'encrypted realm': '암호화된 영역',
|
||||
'machine god': '기계 신',
|
||||
'genesis bug': '시초 버그',
|
||||
};
|
||||
|
||||
/// 추가 방패 번역
|
||||
const Map<String, String> additionalShieldTranslationsKo = {
|
||||
'Neural Defense Grid': '신경 방어 그리드',
|
||||
'Singularity Absorber': '특이점 흡수기',
|
||||
'Time Dilation Field': '시간 확장 필드',
|
||||
'Reality Anchor': '현실 닻',
|
||||
'Multiverse Barrier': '다중우주 장벽',
|
||||
'Cosmic Dampener': '우주 완충기',
|
||||
'Entropy Shield': '엔트로피 실드',
|
||||
};
|
||||
|
||||
/// 추가 갑옷 번역
|
||||
const Map<String, String> additionalArmorTranslationsKo = {
|
||||
'Blockchain Platemail': '블록체인 판금갑옷',
|
||||
'Neural Network Mesh': '신경망 메시',
|
||||
'AI Firewall': 'AI 방화벽',
|
||||
'Quantum Shield Matrix': '양자 실드 매트릭스',
|
||||
'Singularity Barrier': '특이점 장벽',
|
||||
'Multiverse Armor': '다중우주 갑옷',
|
||||
};
|
||||
|
||||
/// 추가 아이템 속성 번역
|
||||
const Map<String, String> additionalItemAttribTranslationsKo = {
|
||||
'Containerized': '컨테이너화된',
|
||||
'Orchestrated': '오케스트레이션된',
|
||||
'Scalable': '확장 가능한',
|
||||
'Resilient': '복원력 있는',
|
||||
'Fault-Tolerant': '장애 허용',
|
||||
'Self-Healing': '자가 치유',
|
||||
'Auto-Scaling': '자동 확장',
|
||||
'Load-Balanced': '로드 밸런싱된',
|
||||
'Cached': '캐시된',
|
||||
'Indexed': '인덱싱된',
|
||||
'Sharded': '샤딩된',
|
||||
'Partitioned': '파티션된',
|
||||
'Compressed': '압축된',
|
||||
'Tokenized': '토큰화된',
|
||||
'Anonymized': '익명화된',
|
||||
'Sanitized': '새니타이즈된',
|
||||
'Validated': '검증된',
|
||||
};
|
||||
|
||||
/// 추가 ItemOfs 번역
|
||||
const Map<String, String> additionalItemOfsTranslationsKo = {
|
||||
'Microservices': '마이크로서비스',
|
||||
'Serverless': '서버리스',
|
||||
'Edge Computing': '엣지 컴퓨팅',
|
||||
'Fog Computing': '포그 컴퓨팅',
|
||||
'Cloud Native': '클라우드 네이티브',
|
||||
'DevOps': '데브옵스',
|
||||
'Site Reliability': '사이트 신뢰성',
|
||||
'Platform Engineering': '플랫폼 엔지니어링',
|
||||
'Infrastructure': '인프라스트럭처',
|
||||
'Observability': '관측 가능성',
|
||||
'Telemetry': '텔레메트리',
|
||||
'Tracing': '트레이싱',
|
||||
'Metrics': '메트릭',
|
||||
'Alerting': '알림',
|
||||
'Incident Response': '인시던트 대응',
|
||||
'Chaos Engineering': '카오스 엔지니어링',
|
||||
'Resilience': '복원력',
|
||||
'Availability': '가용성',
|
||||
'Durability': '내구성',
|
||||
'Consistency': '일관성',
|
||||
'Partition Tolerance': '분할 허용',
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// 통합 번역 Getter (Unified Translation Getters)
|
||||
// ============================================================================
|
||||
|
||||
/// 모든 몬스터 번역을 통합하여 반환
|
||||
Map<String, String> get allMonsterTranslationsKo => {
|
||||
...monsterTranslationsKo,
|
||||
...advancedMonsterTranslationsKo,
|
||||
};
|
||||
|
||||
/// 모든 아이템 속성 번역을 통합하여 반환
|
||||
Map<String, String> get allItemAttribTranslationsKo => {
|
||||
...itemAttribTranslationsKo,
|
||||
...additionalItemAttribTranslationsKo,
|
||||
};
|
||||
|
||||
/// 모든 아이템 접미사("~의") 번역을 통합하여 반환
|
||||
Map<String, String> get allItemOfsTranslationsKo => {
|
||||
...itemOfsTranslationsKo,
|
||||
...additionalItemOfsTranslationsKo,
|
||||
};
|
||||
|
||||
/// 모든 드롭 아이템 번역을 통합하여 반환
|
||||
Map<String, String> get allDropTranslationsKo => {
|
||||
...boringItemTranslationsKo,
|
||||
...dropItemTranslationsKo,
|
||||
...additionalDropTranslationsKo,
|
||||
};
|
||||
|
||||
/// 모든 갑옷 번역을 통합하여 반환
|
||||
Map<String, String> get allArmorTranslationsKo => {
|
||||
...armorTranslationsKo,
|
||||
...additionalArmorTranslationsKo,
|
||||
};
|
||||
|
||||
/// 모든 방패 번역을 통합하여 반환
|
||||
Map<String, String> get allShieldTranslationsKo => {
|
||||
...shieldTranslationsKo,
|
||||
...additionalShieldTranslationsKo,
|
||||
};
|
||||
|
||||
187
lib/data/potion_data.dart
Normal file
187
lib/data/potion_data.dart
Normal file
@@ -0,0 +1,187 @@
|
||||
import 'package:askiineverdie/src/core/model/potion.dart';
|
||||
|
||||
/// 게임 내 물약 정의
|
||||
///
|
||||
/// HP/MP 물약 데이터 (티어 1~5)
|
||||
class PotionData {
|
||||
PotionData._();
|
||||
|
||||
// ============================================================================
|
||||
// HP 물약
|
||||
// ============================================================================
|
||||
|
||||
/// Minor Health Patch - 소형 HP 물약
|
||||
static const minorHealthPatch = Potion(
|
||||
id: 'minor_health_patch',
|
||||
name: 'Minor Health Patch',
|
||||
type: PotionType.hp,
|
||||
tier: 1,
|
||||
healAmount: 30,
|
||||
healPercent: 0.0,
|
||||
price: 25,
|
||||
);
|
||||
|
||||
/// Health Patch - 일반 HP 물약
|
||||
static const healthPatch = Potion(
|
||||
id: 'health_patch',
|
||||
name: 'Health Patch',
|
||||
type: PotionType.hp,
|
||||
tier: 2,
|
||||
healAmount: 50,
|
||||
healPercent: 0.10,
|
||||
price: 75,
|
||||
);
|
||||
|
||||
/// Major Health Patch - 대형 HP 물약
|
||||
static const majorHealthPatch = Potion(
|
||||
id: 'major_health_patch',
|
||||
name: 'Major Health Patch',
|
||||
type: PotionType.hp,
|
||||
tier: 3,
|
||||
healAmount: 80,
|
||||
healPercent: 0.20,
|
||||
price: 200,
|
||||
);
|
||||
|
||||
/// Super Health Patch - 초대형 HP 물약
|
||||
static const superHealthPatch = Potion(
|
||||
id: 'super_health_patch',
|
||||
name: 'Super Health Patch',
|
||||
type: PotionType.hp,
|
||||
tier: 4,
|
||||
healAmount: 120,
|
||||
healPercent: 0.30,
|
||||
price: 500,
|
||||
);
|
||||
|
||||
/// Ultra Health Patch - 최고급 HP 물약
|
||||
static const ultraHealthPatch = Potion(
|
||||
id: 'ultra_health_patch',
|
||||
name: 'Ultra Health Patch',
|
||||
type: PotionType.hp,
|
||||
tier: 5,
|
||||
healAmount: 200,
|
||||
healPercent: 0.40,
|
||||
price: 1200,
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// MP 물약
|
||||
// ============================================================================
|
||||
|
||||
/// Minor Mana Cache - 소형 MP 물약
|
||||
static const minorManaCache = Potion(
|
||||
id: 'minor_mana_cache',
|
||||
name: 'Minor Mana Cache',
|
||||
type: PotionType.mp,
|
||||
tier: 1,
|
||||
healAmount: 20,
|
||||
healPercent: 0.0,
|
||||
price: 20,
|
||||
);
|
||||
|
||||
/// Mana Cache - 일반 MP 물약
|
||||
static const manaCache = Potion(
|
||||
id: 'mana_cache',
|
||||
name: 'Mana Cache',
|
||||
type: PotionType.mp,
|
||||
tier: 2,
|
||||
healAmount: 40,
|
||||
healPercent: 0.10,
|
||||
price: 60,
|
||||
);
|
||||
|
||||
/// Major Mana Cache - 대형 MP 물약
|
||||
static const majorManaCache = Potion(
|
||||
id: 'major_mana_cache',
|
||||
name: 'Major Mana Cache',
|
||||
type: PotionType.mp,
|
||||
tier: 3,
|
||||
healAmount: 60,
|
||||
healPercent: 0.20,
|
||||
price: 160,
|
||||
);
|
||||
|
||||
/// Super Mana Cache - 초대형 MP 물약
|
||||
static const superManaCache = Potion(
|
||||
id: 'super_mana_cache',
|
||||
name: 'Super Mana Cache',
|
||||
type: PotionType.mp,
|
||||
tier: 4,
|
||||
healAmount: 90,
|
||||
healPercent: 0.30,
|
||||
price: 400,
|
||||
);
|
||||
|
||||
/// Ultra Mana Cache - 최고급 MP 물약
|
||||
static const ultraManaCache = Potion(
|
||||
id: 'ultra_mana_cache',
|
||||
name: 'Ultra Mana Cache',
|
||||
type: PotionType.mp,
|
||||
tier: 5,
|
||||
healAmount: 150,
|
||||
healPercent: 0.40,
|
||||
price: 1000,
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// 물약 목록
|
||||
// ============================================================================
|
||||
|
||||
/// 모든 물약 목록
|
||||
static const List<Potion> all = [
|
||||
// HP 물약
|
||||
minorHealthPatch,
|
||||
healthPatch,
|
||||
majorHealthPatch,
|
||||
superHealthPatch,
|
||||
ultraHealthPatch,
|
||||
// MP 물약
|
||||
minorManaCache,
|
||||
manaCache,
|
||||
majorManaCache,
|
||||
superManaCache,
|
||||
ultraManaCache,
|
||||
];
|
||||
|
||||
/// HP 물약 목록
|
||||
static List<Potion> get hpPotions =>
|
||||
all.where((p) => p.type == PotionType.hp).toList();
|
||||
|
||||
/// MP 물약 목록
|
||||
static List<Potion> get mpPotions =>
|
||||
all.where((p) => p.type == PotionType.mp).toList();
|
||||
|
||||
/// ID로 물약 찾기
|
||||
static Potion? getById(String id) {
|
||||
for (final potion in all) {
|
||||
if (potion.id == id) return potion;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// 티어별 HP 물약
|
||||
static Potion? getHpPotionByTier(int tier) {
|
||||
for (final potion in hpPotions) {
|
||||
if (potion.tier == tier) return potion;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// 티어별 MP 물약
|
||||
static Potion? getMpPotionByTier(int tier) {
|
||||
for (final potion in mpPotions) {
|
||||
if (potion.tier == tier) return potion;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// 레벨에 맞는 HP 물약 티어
|
||||
static int tierForLevel(int level) {
|
||||
if (level < 10) return 1;
|
||||
if (level < 25) return 2;
|
||||
if (level < 45) return 3;
|
||||
if (level < 70) return 4;
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
@@ -78,6 +78,100 @@ class SkillData {
|
||||
damageMultiplier: 1.8,
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// DOT (지속 피해) 스킬
|
||||
// ============================================================================
|
||||
|
||||
/// Memory Corruption - 기본 DOT 스킬
|
||||
///
|
||||
/// INT → 틱당 데미지 보정, WIS → 틱 간격 보정
|
||||
static const memoryCorruption = Skill(
|
||||
id: 'memory_corruption',
|
||||
name: 'Memory Corruption',
|
||||
type: SkillType.attack,
|
||||
mpCost: 20,
|
||||
cooldownMs: 10000, // 10초
|
||||
power: 0,
|
||||
damageMultiplier: 0,
|
||||
element: SkillElement.memory,
|
||||
attackMode: AttackMode.dot,
|
||||
baseDotDamage: 8, // 틱당 8 데미지 (INT 보정 전)
|
||||
baseDotDurationMs: 6000, // 6초 지속
|
||||
baseDotTickMs: 1000, // 1초마다 틱
|
||||
);
|
||||
|
||||
/// Infinite Loop - 장시간 DOT
|
||||
///
|
||||
/// 오래 지속되는 중급 DOT
|
||||
static const infiniteLoop = Skill(
|
||||
id: 'infinite_loop',
|
||||
name: 'Infinite Loop',
|
||||
type: SkillType.attack,
|
||||
mpCost: 35,
|
||||
cooldownMs: 18000, // 18초
|
||||
power: 0,
|
||||
damageMultiplier: 0,
|
||||
element: SkillElement.memory,
|
||||
attackMode: AttackMode.dot,
|
||||
baseDotDamage: 12, // 틱당 12 데미지
|
||||
baseDotDurationMs: 10000, // 10초 지속
|
||||
baseDotTickMs: 1000, // 1초마다 틱
|
||||
);
|
||||
|
||||
/// Thermal Throttle - 화염 DOT
|
||||
///
|
||||
/// 빠른 틱, 짧은 지속시간
|
||||
static const thermalThrottle = Skill(
|
||||
id: 'thermal_throttle',
|
||||
name: 'Thermal Throttle',
|
||||
type: SkillType.attack,
|
||||
mpCost: 30,
|
||||
cooldownMs: 12000, // 12초
|
||||
power: 0,
|
||||
damageMultiplier: 0,
|
||||
element: SkillElement.fire,
|
||||
attackMode: AttackMode.dot,
|
||||
baseDotDamage: 15, // 틱당 15 데미지
|
||||
baseDotDurationMs: 4000, // 4초 지속
|
||||
baseDotTickMs: 500, // 0.5초마다 틱
|
||||
);
|
||||
|
||||
/// Race Condition - 빠른 DOT
|
||||
///
|
||||
/// 매우 빠른 틱의 번개 DOT
|
||||
static const raceCondition = Skill(
|
||||
id: 'race_condition',
|
||||
name: 'Race Condition',
|
||||
type: SkillType.attack,
|
||||
mpCost: 45,
|
||||
cooldownMs: 15000, // 15초
|
||||
power: 0,
|
||||
damageMultiplier: 0,
|
||||
element: SkillElement.lightning,
|
||||
attackMode: AttackMode.dot,
|
||||
baseDotDamage: 6, // 틱당 6 데미지
|
||||
baseDotDurationMs: 5000, // 5초 지속
|
||||
baseDotTickMs: 300, // 0.3초마다 틱
|
||||
);
|
||||
|
||||
/// System32 Delete - 강력한 DOT
|
||||
///
|
||||
/// 높은 틱 데미지의 공허 DOT
|
||||
static const system32Delete = Skill(
|
||||
id: 'system32_delete',
|
||||
name: 'System32 Delete',
|
||||
type: SkillType.attack,
|
||||
mpCost: 70,
|
||||
cooldownMs: 30000, // 30초
|
||||
power: 0,
|
||||
damageMultiplier: 0,
|
||||
element: SkillElement.voidElement,
|
||||
attackMode: AttackMode.dot,
|
||||
baseDotDamage: 25, // 틱당 25 데미지
|
||||
baseDotDurationMs: 8000, // 8초 지속
|
||||
baseDotTickMs: 1000, // 1초마다 틱
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// 회복 스킬
|
||||
// ============================================================================
|
||||
@@ -175,13 +269,19 @@ class SkillData {
|
||||
|
||||
/// 모든 스킬 목록
|
||||
static const List<Skill> allSkills = [
|
||||
// 공격 스킬
|
||||
// 공격 스킬 (단발성)
|
||||
debugStrike,
|
||||
nullPointer,
|
||||
memoryLeak,
|
||||
stackOverflow,
|
||||
coreDump,
|
||||
kernelPanic,
|
||||
// DOT 스킬
|
||||
memoryCorruption,
|
||||
infiniteLoop,
|
||||
thermalThrottle,
|
||||
raceCondition,
|
||||
system32Delete,
|
||||
// 회복 스킬
|
||||
quickFix,
|
||||
hotReload,
|
||||
@@ -192,6 +292,10 @@ class SkillData {
|
||||
firewall,
|
||||
];
|
||||
|
||||
/// DOT 스킬 목록
|
||||
static List<Skill> get dotSkills =>
|
||||
allSkills.where((s) => s.isDot).toList();
|
||||
|
||||
/// ID로 스킬 찾기
|
||||
static Skill? getSkillById(String id) {
|
||||
for (final skill in allSkills) {
|
||||
|
||||
Reference in New Issue
Block a user