diff --git a/lib/data/pq_config_data.dart b/lib/data/pq_config_data.dart index f828e69..732cf81 100644 --- a/lib/data/pq_config_data.dart +++ b/lib/data/pq_config_data.dart @@ -23,6 +23,12 @@ const Map> pqConfigData = { 'Virtualization Mail|20', 'Quantum Encryption|25', 'Zero-Day Aegis|30', + 'Blockchain Platemail|35', + 'Neural Network Mesh|40', + 'AI Firewall|45', + 'Quantum Shield Matrix|50', + 'Singularity Barrier|55', + 'Multiverse Armor|60', ], 'BoringItems': [ 'semicolon', @@ -66,6 +72,31 @@ const Map> pqConfigData = { 'return value', 'exit code', 'errno', + 'pid file', + 'lock file', + 'temp file', + 'swap file', + 'cache entry', + 'cookie crumb', + 'session token', + 'nonce value', + 'salt grain', + 'pepper flake', + 'iv fragment', + 'padding byte', + 'magic number', + 'checksum bit', + 'parity bit', + 'stop bit', + 'start bit', + 'frame marker', + 'sync byte', + 'escape char', + 'control char', + 'printable char', + 'ascii art', + 'unicode glyph', + 'emoji fragment', ], 'DefenseAttrib': [ 'Patched|+1', @@ -143,6 +174,25 @@ const Map> pqConfigData = { 'Hashed', 'Signed', 'Verified', + 'Containerized', + 'Orchestrated', + 'Scalable', + 'Resilient', + 'Fault-Tolerant', + 'Self-Healing', + 'Auto-Scaling', + 'Load-Balanced', + 'Cached', + 'Indexed', + 'Sharded', + 'Replicated', + 'Partitioned', + 'Compressed', + 'Encrypted', + 'Tokenized', + 'Anonymized', + 'Sanitized', + 'Validated', ], 'ItemOfs': [ 'Compilation', @@ -194,6 +244,27 @@ const Map> pqConfigData = { 'the Runtime', 'the Compiler', 'the Kernel', + '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', ], 'Klasses': [ 'Bug Hunter|STR,INT', @@ -553,6 +624,83 @@ const Map> pqConfigData = { 'PwnKit|16|polkit priv', 'Sudo Bug|14|privilege escape', 'Baron Samedit|13|heap overflow', + + // 레벨 54-65: 고급 시스템 위협 (Advanced System Threats) + 'Kernel Exploiter|54|privilege token', + 'Ring -1 Phantom|55|hypervisor breach', + 'TPM Bypasser|56|trusted module', + 'Secure Boot Breaker|57|boot chain', + 'IOMMU Escape|58|memory isolation', + 'SGX Enclave Bug|59|secure enclave', + 'TrustZone Breach|60|arm security', + 'Platform Security Bug|61|firmware key', + 'Hardware Backdoor|62|silicon implant', + 'Supply Chain Implant|63|factory malware', + 'BMC Rootkit|64|baseboard mgmt', + 'IPMI Ghost|65|remote mgmt', + + // 레벨 66-80: 엔터프라이즈급 위협 (Enterprise Threats) + 'Active Directory Worm|66|domain token', + 'Kerberos Golden|67|ticket forgery', + 'NTLM Relay Beast|68|auth bypass', + 'DCSync Phantom|69|replication attack', + 'Exchange Exploit|70|mail server', + 'SharePoint Bug|71|collab breach', + 'Teams Vulnerability|72|comm exploit', + 'Azure AD Breach|73|cloud identity', + 'AWS IAM Bug|74|cloud permission', + 'GCP Exploit|75|google cloud', + 'Kubernetes Escape|76|container breach', + 'Docker Breakout|77|namespace escape', + 'Service Mesh Bug|78|istio envoy', + 'Terraform State Bug|79|infra code', + 'CI/CD Pipeline Poison|80|build compromise', + + // 레벨 81-90: 엔드게임 몬스터 (Endgame Monsters) + 'Quantum Decoherence|81|qubit collapse', + 'Neural Network Poison|82|model corrupt', + 'AI Hallucination|83|false output', + 'Deep Fake Engine|84|synthetic media', + 'Adversarial Noise|85|ml attack', + 'Model Extraction|86|stolen weights', + 'Prompt Injection|87|llm exploit', + 'Training Data Poison|88|dataset corrupt', + 'Federated Learning Bug|89|distributed ml', + 'Differential Privacy Leak|90|anonymity breach', + + // 레벨 91-100: 최종 엔드게임 (Final Endgame) + 'Post-Quantum Threat|91|lattice attack', + 'Homomorphic Crack|92|encrypted compute', + 'Zero Knowledge Flaw|93|proof bypass', + 'Blockchain Fork|94|consensus break', + 'Smart Contract Bug|95|solidity exploit', + 'MEV Extractor|96|transaction reorder', + 'Cross-Chain Bridge Bug|97|bridge exploit', + 'Oracle Manipulation|98|price feed', + 'Flash Loan Attack|99|defi exploit', + 'The Final Bug|100|ultimate error', + + // 미니보스 (Mini Bosses) - 특수 접두사로 구분 + 'Elite Syntax Overlord|25|syntax crown', + 'Champion Buffer Crusher|30|overflow gem', + 'Veteran Memory Lord|35|leak artifact', + 'Master Race Conductor|40|thread scepter', + 'Arch Kernel Breaker|45|ring zero', + 'High Protocol Corruptor|50|packet throne', + 'Grand Firmware Defiler|55|boot artifact', + 'Supreme Cloud Invader|60|cloud crown', + 'Legendary Container Escapist|65|namespace key', + 'Ancient Pipeline Poisoner|70|build shard', + + // 보스 몬스터 (Boss Monsters) - 고유 보스 + 'BOSS: Stack Overflow Dragon|35|legendary stack', + 'BOSS: Heap Corruption Hydra|45|multi-head leak', + 'BOSS: Kernel Panic Titan|55|system crash', + 'BOSS: Zero Day Leviathan|65|unknown vuln', + 'BOSS: APT Colossus|75|state actor', + 'BOSS: Ransomware Emperor|85|encrypted realm', + 'BOSS: AI Singularity|95|machine god', + 'BOSS: The Primordial Glitch|100|genesis bug', ], 'OffenseAttrib': [ 'Compiled|+1', @@ -618,6 +766,13 @@ const Map> pqConfigData = { 'Air Gap Shield|11', 'Faraday Shield|12', 'Quantum Firewall|18', + 'Neural Defense Grid|22', + 'Singularity Absorber|28', + 'Time Dilation Field|35', + 'Reality Anchor|42', + 'Multiverse Barrier|50', + 'Cosmic Dampener|58', + 'Entropy Shield|65', ], 'Specials': [ 'Algorithm', @@ -702,6 +857,31 @@ const Map> pqConfigData = { 'Deploy', 'Scale Up', 'Failover', + 'Containerize', + 'Orchestrate', + 'Auto Scale', + 'Load Balance', + 'Cache Invalidate', + 'Async Await', + 'Promise Resolve', + 'Thread Pool', + 'Connection Pool', + 'Circuit Break', + 'Rate Limit', + 'Retry Logic', + 'Backpressure', + 'Event Source', + 'State Machine', + 'Saga Pattern', + 'CQRS Split', + 'Event Store', + 'Snapshot Restore', + 'Blue Green Deploy', + 'Canary Release', + 'Feature Toggle', + 'A/B Test', + 'Chaos Monkey', + 'Dark Launch', ], 'Titles': [ 'Dev', @@ -753,5 +933,16 @@ const Map> pqConfigData = { 'Dyson Sphere Core|11', 'Black Hole Computer|12', 'Universe Simulator|15', + 'Dimensional Gateway|20', + 'Time Loop Device|25', + 'Reality Compiler|30', + 'Multiverse Bridge|35', + 'Cosmic Debugger|40', + 'Entropy Reverser|45', + 'Big Bang Trigger|50', + 'Heat Death Preventer|55', + 'Infinity Engine|60', + 'Omniscience Module|65', + 'God Mode Activator|70', ], }; diff --git a/lib/src/core/animation/ascii_animation_data.dart b/lib/src/core/animation/ascii_animation_data.dart index f6af8b3..c085b4b 100644 --- a/lib/src/core/animation/ascii_animation_data.dart +++ b/lib/src/core/animation/ascii_animation_data.dart @@ -67,116 +67,133 @@ AsciiThemeColors getThemeColors(AsciiColorTheme theme, Brightness brightness) { }; } -/// 몬스터 카테고리 +/// 몬스터 카테고리 (ASCII NEVER DIE 테마) enum MonsterCategory { - /// 기본 (고양이 모양) - beast, + /// 기본 버그 (Syntax Error, Type Mismatch 등) + bug, - /// 곤충/벌레류 - insect, + /// 멀웨어 (Virus, Worm, Trojan 등) + malware, - /// 인간형 (고블린, 오크 등) - humanoid, + /// 네트워크 위협 (Flood, DDoS, Injection 등) + network, - /// 언데드 (스켈레톤, 좀비) - undead, + /// 시스템 위협 (Kernel, Memory, Buffer 등) + system, - /// 드래곤/비행 생물 - dragon, + /// 암호화/보안 (Encryption, Hash, Zero-Day 등) + crypto, - /// 슬라임/젤리 - slime, + /// AI/ML 위협 (Neural Network, Machine Learning 등) + ai, - /// 악마/마법 생물 - demon, + /// 보스 몬스터 + boss, } -/// 몬스터 이름으로 카테고리 결정 +/// 몬스터 이름으로 카테고리 결정 (ASCII NEVER DIE 테마) MonsterCategory getMonsterCategory(String? monsterBaseName) { if (monsterBaseName == null || monsterBaseName.isEmpty) { - return MonsterCategory.beast; + return MonsterCategory.bug; } final name = monsterBaseName.toLowerCase(); - // 곤충/벌레류 - if (name.contains('ant') || - name.contains('centipede') || - name.contains('spider') || - name.contains('beetle') || - name.contains('crawler') || - name.contains('crayfish') || - name.contains('anhkheg')) { - return MonsterCategory.insect; + // 보스 몬스터 + if (name.startsWith('boss:') || + name.contains('dragon') || + name.contains('hydra') || + name.contains('titan') || + name.contains('leviathan') || + name.contains('colossus') || + name.contains('emperor') || + name.contains('singularity') || + name.contains('primordial') || + name.contains('glitch god')) { + return MonsterCategory.boss; } - // 인간형 - if (name.contains('goblin') || - name.contains('orc') || - name.contains('troll') || - name.contains('ogre') || - name.contains('giant') || - name.contains('scout') || - name.contains('bugbear') || - name.contains('gnoll') || - name.contains('kobold') || - name.contains('hobgoblin')) { - return MonsterCategory.humanoid; + // AI/ML 위협 + if (name.contains('neural') || + name.contains('ai ') || + name.contains('deep') || + name.contains('model') || + name.contains('adversarial') || + name.contains('training') || + name.contains('federated') || + name.contains('prompt') || + name.contains('hallucination')) { + return MonsterCategory.ai; } - // 언데드 - if (name.contains('skeleton') || - name.contains('zombie') || - name.contains('ghoul') || - name.contains('ghost') || - name.contains('wight') || - name.contains('wraith') || - name.contains('vampire') || - name.contains('lich') || - name.contains('mummy')) { - return MonsterCategory.undead; + // 암호화/보안 위협 + if (name.contains('quantum') || + name.contains('zero day') || + name.contains('zero-day') || + name.contains('crypto') || + name.contains('hash') || + name.contains('blockchain') || + name.contains('homomorphic') || + name.contains('zero knowledge') || + name.contains('smart contract')) { + return MonsterCategory.crypto; } - // 드래곤/비행 - if (name.contains('dragon') || - name.contains('wyvern') || - name.contains('cockatrice') || - name.contains('griffin') || - name.contains('roc') || - name.contains('harpy') || - name.contains('couatl')) { - return MonsterCategory.dragon; + // 네트워크 위협 + if (name.contains('flood') || + name.contains('ddos') || + name.contains('dos') || + name.contains('injection') || + name.contains('sql') || + name.contains('xss') || + name.contains('csrf') || + name.contains('amplification') || + name.contains('tunnel') || + name.contains('shell') || + name.contains('backdoor') || + name.contains('c2') || + name.contains('beacon')) { + return MonsterCategory.network; } - // 슬라임/젤리 - if (name.contains('slime') || - name.contains('pudding') || - name.contains('ooze') || - name.contains('jelly') || - name.contains('boogie') || - name.contains('blob') || - name.contains('jubilex')) { - return MonsterCategory.slime; + // 시스템 위협 + if (name.contains('kernel') || + name.contains('memory') || + name.contains('buffer') || + name.contains('stack') || + name.contains('heap') || + name.contains('overflow') || + name.contains('corruption') || + name.contains('segfault') || + name.contains('panic') || + name.contains('rootkit') || + name.contains('firmware') || + name.contains('bootkit')) { + return MonsterCategory.system; } - // 악마/마법 생물 - if (name.contains('demon') || - name.contains('devil') || - name.contains('succubus') || - name.contains('beholder') || - name.contains('demogorgon') || - name.contains('orcus') || - name.contains('vrock') || - name.contains('hezrou') || - name.contains('glabrezu')) { - return MonsterCategory.demon; + // 멀웨어 + if (name.contains('virus') || + name.contains('worm') || + name.contains('trojan') || + name.contains('ransomware') || + name.contains('malware') || + name.contains('botnet') || + name.contains('cryptominer') || + name.contains('keylogger') || + name.contains('spyware') || + name.contains('dropper') || + name.contains('loader') || + name.contains('payload')) { + return MonsterCategory.malware; } - return MonsterCategory.beast; + // 기본: 버그 + return MonsterCategory.bug; } -/// 기본 전투 애니메이션 (beast - 고양이 모양, 심플 3줄) -const battleAnimationBeast = AsciiAnimationData( +/// 버그 전투 애니메이션 (기본 버그 모양) +const battleAnimationBug = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -312,8 +329,8 @@ const walkingAnimation = AsciiAnimationData( frameIntervalMs: 180, ); -/// 곤충 전투 애니메이션 (심플 3줄) -const battleAnimationInsect = AsciiAnimationData( +/// 멀웨어 전투 애니메이션 (바이러스 모양) +const battleAnimationMalware = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -344,8 +361,8 @@ const battleAnimationInsect = AsciiAnimationData( frameIntervalMs: 220, ); -/// 인간형 전투 애니메이션 (심플 3줄) -const battleAnimationHumanoid = AsciiAnimationData( +/// 네트워크 전투 애니메이션 (패킷 모양) +const battleAnimationNetwork = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -376,8 +393,8 @@ const battleAnimationHumanoid = AsciiAnimationData( frameIntervalMs: 220, ); -/// 언데드 전투 애니메이션 (심플 3줄) -const battleAnimationUndead = AsciiAnimationData( +/// 시스템 전투 애니메이션 (커널 모양) +const battleAnimationSystem = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -408,8 +425,8 @@ const battleAnimationUndead = AsciiAnimationData( frameIntervalMs: 250, ); -/// 드래곤 전투 애니메이션 (심플 3줄) -const battleAnimationDragon = AsciiAnimationData( +/// 암호화 전투 애니메이션 (자물쇠 모양) +const battleAnimationCrypto = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -440,8 +457,8 @@ const battleAnimationDragon = AsciiAnimationData( frameIntervalMs: 200, ); -/// 슬라임 전투 애니메이션 (심플 3줄) -const battleAnimationSlime = AsciiAnimationData( +/// AI 전투 애니메이션 (뉴럴넷 모양) +const battleAnimationAI = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -472,8 +489,8 @@ const battleAnimationSlime = AsciiAnimationData( frameIntervalMs: 280, ); -/// 악마 전투 애니메이션 (심플 3줄) -const battleAnimationDemon = AsciiAnimationData( +/// 보스 전투 애니메이션 (드래곤/보스 모양) +const battleAnimationBoss = AsciiAnimationData( frames: [ // 프레임 1: 대치 ''' @@ -507,13 +524,13 @@ const battleAnimationDemon = AsciiAnimationData( /// 몬스터 카테고리별 전투 애니메이션 반환 AsciiAnimationData getBattleAnimation(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => battleAnimationBeast, - MonsterCategory.insect => battleAnimationInsect, - MonsterCategory.humanoid => battleAnimationHumanoid, - MonsterCategory.undead => battleAnimationUndead, - MonsterCategory.dragon => battleAnimationDragon, - MonsterCategory.slime => battleAnimationSlime, - MonsterCategory.demon => battleAnimationDemon, + MonsterCategory.bug => battleAnimationBug, + MonsterCategory.malware => battleAnimationMalware, + MonsterCategory.network => battleAnimationNetwork, + MonsterCategory.system => battleAnimationSystem, + MonsterCategory.crypto => battleAnimationCrypto, + MonsterCategory.ai => battleAnimationAI, + MonsterCategory.boss => battleAnimationBoss, }; } @@ -676,10 +693,10 @@ const actCompleteAnimation = AsciiAnimationData( frameIntervalMs: 400, ); -/// 타입별 애니메이션 데이터 반환 (기본 전투는 beast) +/// 타입별 애니메이션 데이터 반환 (기본 전투는 bug) AsciiAnimationData getAnimationData(AsciiAnimationType type) { return switch (type) { - AsciiAnimationType.battle => battleAnimationBeast, + AsciiAnimationType.battle => battleAnimationBug, AsciiAnimationType.town => townAnimation, AsciiAnimationType.walking => walkingAnimation, AsciiAnimationType.levelUp => levelUpAnimation, diff --git a/lib/src/core/animation/battle_composer.dart b/lib/src/core/animation/battle_composer.dart index e764d1a..ab328e1 100644 --- a/lib/src/core/animation/battle_composer.dart +++ b/lib/src/core/animation/battle_composer.dart @@ -338,31 +338,31 @@ List> _getMonsterAlertFrames(MonsterCategory category, MonsterSize List> _tinyIdleFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r'*', r'/\'], [r'o', r'\/'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r'><', r'\/'], [r'<>', r'/\'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r'o', r'|'], [r'O', r'|'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r'+', r'|'], [r'x', r'|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r'~<', r'>>'], [r'<~', r'<<'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r'()', r''], [r'{}', r''], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r'^v', r'\/'], [r'v^', r'/\'], ], @@ -378,31 +378,31 @@ List> _tinyHitFrames(MonsterCategory category) { List> _tinyAlertFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r'!!', r'/\'], [r'OO', r'><'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r'!!', r'\/'], [r'@@', r'/\'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r'O!', r'|'], [r'!O', r'X'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r'!!', r'X'], [r'@@', r'|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r'!<', r'>>'], [r'>!', r'<<'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r'(!)', r''], [r'{!}', r''], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r'^!', r'><'], [r'!^', r'<>'], ], @@ -415,31 +415,31 @@ List> _tinyAlertFrames(MonsterCategory category) { List> _smallIdleFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\_/\', r'( o.o )', r' > ^ <', r' /| |\'], [r' /\_/\', r'( o o )', r' > v <', r' \| |/'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\', r' (O O)', r' / \', r' \/ \/'], [r' \/\/\', r' (O O)', r' \ /', r' /\ /\'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O', r' /|\', r' / \', r' _| |_'], [r' O', r' \|/', r' | |', r' _/ \_'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _+_', r' (x_x)', r' /|\', r' _/ \_'], [r' _+_', r' (X_X)', r' \|/', r' _| |_'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' __', r' <(oo)~', r' / \', r' <_ _>'], [r' __', r' (oo)>', r' \ /', r' <_ _>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ___', r' ( )', r' ( )', r' \_/'], [r' _', r' / \', r' { }', r' \_/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^w^', r' (|o|)', r' /|\', r' V V'], [r' ^W^', r' (|O|)', r' \|/', r' v v'], ], @@ -455,31 +455,31 @@ List> _smallHitFrames(MonsterCategory category) { List> _smallAlertFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\_/\', r'( O!O )', r' > ! <', r' /| |\'], [r' /\_/\', r'( !O! )', r' > ! <', r' \| |/'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\', r' (! !)', r' / \', r' \/ \/'], [r' \/\/\', r' (! !)', r' \ /', r' /\ /\'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O!', r' /|\', r' / \', r' _| |_'], [r' !O', r' \|/', r' | |', r' _/ \_'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _!_', r' (!_!)', r' /|\', r' _/ \_'], [r' _!_', r' (!_!)', r' \|/', r' _| |_'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' __', r' <(!!)~', r' / \', r' <_ _>'], [r' __', r' (!!)>', r' \ /', r' <_ _>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ___', r' ( ! )', r' ( ! )', r' \_/'], [r' _', r' /!\', r' { ! }', r' \_/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^!^', r' (|!|)', r' /|\', r' V V'], [r' ^!^', r' (|!|)', r' \|/', r' v v'], ], @@ -492,31 +492,31 @@ List> _smallAlertFrames(MonsterCategory category) { List> _mediumIdleFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\_/\', r' ( O.O )', r' > ^ <', r' /| |\', r' | | | |', r'_|_| |_|_'], [r' /\_/\', r' ( O O )', r' > v <', r' \| |/', r' | | | |', r'_|_| |_|_'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\', r' /O O\', r' \ /', r' / \', r' \/ \/', r' _/ \_'], [r' \/\/\', r' \O O/', r' / \', r' \ /', r' /\ /\', r' _\ /_'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O', r' /|\', r' / \', r' | |', r' | |', r' _| |_'], [r' O', r' \|/', r' | |', r' | |', r' | |', r' _/ \_'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _+_', r' (X_X)', r' /|\', r' / | \', r' | | |', r'_/ | \_'], [r' _x_', r' (x_x)', r' \|/', r' \ | /', r' | | |', r'_\ | /_'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' __', r' <(OO)~', r' / \', r' / \', r' | |', r'<__ __>'], [r' __', r' (OO)>', r' \ /', r' \ /', r' | |', r'<__ __>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ____', r' / \', r' ( )', r' ( )', r' \ /', r' \__/'], [r' __', r' / \', r' / \', r' { }', r' \ /', r' \__/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^W^', r' (|O|)', r' /|\', r' / | \', r' V V', r' _/ \_'], [r' ^w^', r' (|o|)', r' \|/', r' \ | /', r' v v', r' _\ /_'], ], @@ -532,31 +532,31 @@ List> _mediumHitFrames(MonsterCategory category) { List> _mediumAlertFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\_/\', r' ( O!O )', r' > ! <', r' /| |\', r' | | | |', r'_|_| |_|_'], [r' /\_/\', r' ( !O! )', r' > ! <', r' \| |/', r' | | | |', r'_|_| |_|_'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\', r' /! !\', r' \ /', r' / \', r' \/ \/', r' _/ \_'], [r' \/\/\', r' \! !/', r' / \', r' \ /', r' /\ /\', r' _\ /_'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O!', r' /|\', r' / \', r' | |', r' | |', r' _| |_'], [r' !O', r' \|/', r' | |', r' | |', r' | |', r' _/ \_'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _!_', r' (!_!)', r' /|\', r' / | \', r' | | |', r'_/ | \_'], [r' _!_', r' (!_!)', r' \|/', r' \ | /', r' | | |', r'_\ | /_'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' __', r' <(!!)~', r' / \', r' / \', r' | |', r'<__ __>'], [r' __', r' (!!)>', r' \ /', r' \ /', r' | |', r'<__ __>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ____', r' / ! \', r' ( ! )', r' ( ! )', r' \ /', r' \__/'], [r' __', r' / !\', r' / ! \', r' { ! }', r' \ /', r' \__/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^!^', r' (|!|)', r' /|\', r' / | \', r' V V', r' _/ \_'], [r' ^!^', r' (|!|)', r' \|/', r' \ | /', r' v v', r' _\ /_'], ], @@ -569,31 +569,31 @@ List> _mediumAlertFrames(MonsterCategory category) { List> _largeIdleFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\__/\', r' ( O O )', r' > ^^ <', r' /| |\', r' | | | |', r' | | | |', r'_| | | |_', r'|__|____|__|'], [r' /\__/\', r' ( O O )', r' > vv <', r' \| |/', r' | | | |', r' | | | |', r'_| | | |_', r'|__|____|__|'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\/\', r' /O O\', r' \ /', r' / \', r' \/ \/', r' | \ / |', r' _| \/ |_', r'|___________|'], [r' \/\/\/\', r' \O O/', r' / \', r' \ /', r' /\ /\', r' | / \ |', r' _| /\ |_', r'|___________|'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O', r' /|\', r' / \', r' | |', r' | |', r' | |', r' _| |_', r'|_________|'], [r' O', r' \|/', r' | |', r' | |', r' | |', r' | |', r' _/ \_', r'|_________|'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _/+\_', r' (X___X)', r' /|||\', r' / ||| \', r' | ||| |', r' | / \ |', r' _|/ \|_', r'|_/ \_|'], [r' _\+/_', r' (x___x)', r' \|||/', r' \ ||| /', r' | ||| |', r' | \ / |', r' _|\ /|_', r'|_\ /_|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' ___', r' <<(O O)~~', r' / || \', r' / || \', r' | || |', r' | || |', r' _| || |_', r'<___________|>'], [r' ___', r' (O O)>>', r' \ || /', r' \ || /', r' | || |', r' | || |', r' _| || |_', r'<___________|>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' _____', r' / \', r' / \', r' ( )', r' ( )', r' \ /', r' \_____/', r' \___/'], [r' ___', r' / \', r' / \', r' { }', r' { }', r' \ /', r' \___/', r' \_/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^W^', r' /|O|\', r' /|\', r' / | \', r' | | |', r' V | V', r' _/ | \_', r'|____|____|'], [r' ^w^', r' \|o|/', r' \|/', r' \ | /', r' | | |', r' v | v', r' _\ | /_', r'|____|____|'], ], @@ -609,31 +609,31 @@ List> _largeHitFrames(MonsterCategory category) { List> _largeAlertFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\__/\', r' ( O!!O )', r' > !! <', r' /| |\', r' | | | |', r' | | | |', r'_| | | |_', r'|__|____|__|'], [r' /\__/\', r' ( !!O! )', r' > !! <', r' \| |/', r' | | | |', r' | | | |', r'_| | | |_', r'|__|____|__|'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\/\', r' /! !\', r' \ /', r' / \', r' \/ \/', r' | \ / |', r' _| \/ |_', r'|___________|'], [r' \/\/\/\', r' \! !/', r' / \', r' \ /', r' /\ /\', r' | / \ |', r' _| /\ |_', r'|___________|'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O!', r' /|\', r' / \', r' | |', r' | |', r' | |', r' _| |_', r'|_________|'], [r' !O', r' \|/', r' | |', r' | |', r' | |', r' | |', r' _/ \_', r'|_________|'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _/!\_', r' (!___!)', r' /|||\', r' / ||| \', r' | ||| |', r' | / \ |', r' _|/ \|_', r'|_/ \_|'], [r' _\!/_', r' (!___!)', r' \|||/', r' \ ||| /', r' | ||| |', r' | \ / |', r' _|\ /|_', r'|_\ /_|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' ___', r' <<(! !)~~', r' / || \', r' / || \', r' | || |', r' | || |', r' _| || |_', r'<___________|>'], [r' ___', r' (! !)>>', r' \ || /', r' \ || /', r' | || |', r' | || |', r' _| || |_', r'<___________|>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' _____', r' / ! \', r' / ! \', r' ( ! )', r' ( ! )', r' \ /', r' \_____/', r' \___/'], [r' ___', r' / ! \', r' / ! \', r' { ! }', r' { ! }', r' \ /', r' \___/', r' \_/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^!^', r' /|!|\', r' /|\', r' / | \', r' | | |', r' V | V', r' _/ | \_', r'|____|____|'], [r' ^!^', r' \|!|/', r' \|/', r' \ | /', r' | | |', r' v | v', r' _\ | /_', r'|____|____|'], ], @@ -646,31 +646,31 @@ List> _largeAlertFrames(MonsterCategory category) { List> _hugeIdleFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\____/\', r' ( O O )', r' > ^^^^ <', r' /| |\', r' | | | |', r' | | | |', r' _| | | |_', r'|___|______|___|'], [r' /\____/\', r' ( O O )', r' > vvvv <', r' \| |/', r' | | | |', r' | | | |', r' _| | | |_', r'|___|______|___|'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\/\/\', r' /O O\', r' \ /', r' / \', r' \/ \/', r' | \ / |', r' _| \ / |_', r'|_______________|'], [r' \/\/\/\/\', r' \O O/', r' / \', r' \ /', r' /\ /\', r' | / \ |', r' _| / \ |_', r'|_______________|'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O', r' _/|\\_', r' / | \\', r' | |', r' | |', r' | |', r' _| |_', r'|___________|'], [r' O', r' \\_|_/', r' \\|/', r' | |', r' | |', r' | |', r' _/ \\_', r'|___________|'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _/+\\_', r' (X_____X)', r' /|||||\', r' / ||||| \\', r' | ||||| |', r' | / \\ |', r' _|/ \\|_', r'|_/ \\_|'], [r' _\\+/_', r' (x_____x)', r' \\|||||/', r' \\ ||||| /', r' | ||||| |', r' | \\ / |', r' _|\\ /|_', r'|_\\ /_|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' ____', r' <<<(O O)~~~', r' / |||| \\', r' / |||| \\', r' | |||| |', r' | |||| |', r' _| |||| |_', r'<_______________|>'], [r' ____', r' (O O)>>>', r' \\ |||| /', r' \\ |||| /', r' | |||| |', r' | |||| |', r' _| |||| |_', r'<_______________|>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ______', r' / \\', r' / \\', r' ( )', r' ( )', r' \\ /', r' \\______/', r' \\____/'], [r' ____', r' / \\', r' / \\', r' { }', r' { }', r' \\ /', r' \\____/', r' \\__/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^W^', r' /|O|\\ ', r' /|\\', r' / | \\', r' | | |', r' V | V', r' _/ | \\_', r'|_____|_____|'], [r' ^w^', r' \\|o|/', r' \\|/', r' \\ | /', r' | | |', r' v | v', r' _\\ | /_', r'|_____|_____|'], ], @@ -686,31 +686,31 @@ List> _hugeHitFrames(MonsterCategory category) { List> _hugeAlertFrames(MonsterCategory category) { return switch (category) { - MonsterCategory.beast => [ + MonsterCategory.bug => [ [r' /\____/\', r' ( ! ! )', r' > !!!! <', r' /| |\', r' | | | |', r' | | | |', r' _| | | |_', r'|___|______|___|'], [r' /\____/\', r' ( ! ! )', r' > !!!! <', r' \| |/', r' | | | |', r' | | | |', r' _| | | |_', r'|___|______|___|'], ], - MonsterCategory.insect => [ + MonsterCategory.malware => [ [r' /\/\/\/\', r' /! !\', r' \ /', r' / \', r' \/ \/', r' | \ / |', r' _| \ / |_', r'|_______________|'], [r' \/\/\/\/\', r' \! !/', r' / \', r' \ /', r' /\ /\', r' | / \ |', r' _| / \ |_', r'|_______________|'], ], - MonsterCategory.humanoid => [ + MonsterCategory.network => [ [r' O!', r' _/|\\__', r' / | \\', r' | |', r' | |', r' | |', r' _| |_', r'|___________|'], [r' !O', r' \\_|_/', r' \\|/', r' | |', r' | |', r' | |', r' _/ \\_', r'|___________|'], ], - MonsterCategory.undead => [ + MonsterCategory.system => [ [r' _/!\\__', r' (!_____!)', r' /|||||\', r' / ||||| \\', r' | ||||| |', r' | / \\ |', r' _|/ \\|_', r'|_/ \\_|'], [r' _\\!/_', r' (!_____!)', r' \\|||||/', r' \\ ||||| /', r' | ||||| |', r' | \\ / |', r' _|\\ /|_', r'|_\\ /_|'], ], - MonsterCategory.dragon => [ + MonsterCategory.crypto => [ [r' ____', r' <<<(! !)~~~', r' / |||| \\', r' / |||| \\', r' | |||| |', r' | |||| |', r' _| |||| |_', r'<_______________|>'], [r' ____', r' (! !)>>>', r' \\ |||| /', r' \\ |||| /', r' | |||| |', r' | |||| |', r' _| |||| |_', r'<_______________|>'], ], - MonsterCategory.slime => [ + MonsterCategory.ai => [ [r' ______', r' / ! \\', r' / ! \\', r' ( ! )', r' ( ! )', r' \\ /', r' \\______/', r' \\____/'], [r' ____', r' / ! \\', r' / ! \\', r' { ! }', r' { ! }', r' \\ /', r' \\____/', r' \\__/'], ], - MonsterCategory.demon => [ + MonsterCategory.boss => [ [r' ^!^', r' /|!|\\ ', r' /|\\', r' / | \\', r' | | |', r' V | V', r' _/ | \\_', r'|_____|_____|'], [r' ^!^', r' \\|!|/', r' \\|/', r' \\ | /', r' | | |', r' v | v', r' _\\ | /_', r'|_____|_____|'], ], diff --git a/test/core/util/pq_logic_test.dart b/test/core/util/pq_logic_test.dart index a07cbf0..1d8a842 100644 --- a/test/core/util/pq_logic_test.dart +++ b/test/core/util/pq_logic_test.dart @@ -108,9 +108,9 @@ void main() { }); test('completeQuest and completeAct return deterministic results', () { - // 아스키나라(ASCII-Nara) 세계관 데이터로 업데이트 + // 아스키나라(ASCII-Nara) 세계관 데이터로 업데이트 (Phase 7 확장 반영) final quest = pq_logic.completeQuest(config, DeterministicRandom(33), 4); - expect(quest.caption, 'Transfer this stack trace'); + expect(quest.caption, 'Transfer this session token'); expect(quest.reward, pq_logic.RewardKind.item); expect(quest.monsterName, isNull); diff --git a/test/regression/deterministic_game_test.dart b/test/regression/deterministic_game_test.dart index 4a0a5e9..ac4ea59 100644 --- a/test/regression/deterministic_game_test.dart +++ b/test/regression/deterministic_game_test.dart @@ -328,8 +328,8 @@ void main() { }); test('monsters list matches ASCII-Nara count', () { - // 아스키나라(ASCII-Nara) 세계관 몬스터 개수: 304 - expect(config.monsters.length, 304); + // Phase 7 확장 후 몬스터 개수: 369 + expect(config.monsters.length, 369); }); test('spells list is not empty', () {