feat(skill): Phase 3 MP 기반 스킬 시스템 구현
- Skill, SkillType, BuffEffect, SkillState, SkillUseResult 클래스 정의 (skill.dart) - SkillSystemState를 GameState에 통합 (activeBuffs, skillStates, elapsedMs) - 프로그래밍 테마 스킬 데이터 정의 (skill_data.dart) - 공격: Debug Strike, Memory Leak, Core Dump, Kernel Panic 등 - 회복: Hot Reload, Garbage Collection, Quick Fix - 버프: Safe Mode, Overclock, Firewall - SkillService 구현 (skill_service.dart) - 스킬 사용 가능 여부 확인 (MP, 쿨타임) - 공격/회복/버프 스킬 사용 로직 - 자동 스킬 선택 (HP < 30% → 회복, 보스전 → 강력한 공격, 일반 → MP 효율) - MP 자연 회복 (비전투: 50ms당 1, 전투: WIS 기반) - progress_service.dart에 스킬 시스템 통합 - tick()에서 스킬 시간 업데이트 및 버프 만료 처리 - _processCombatTickWithSkills()로 전투 중 자동 스킬 사용
This commit is contained in:
233
lib/data/skill_data.dart
Normal file
233
lib/data/skill_data.dart
Normal file
@@ -0,0 +1,233 @@
|
||||
import 'package:askiineverdie/src/core/model/skill.dart';
|
||||
|
||||
/// 게임 내 스킬 정의
|
||||
///
|
||||
/// 프로그래밍 테마에 맞춘 스킬 목록
|
||||
class SkillData {
|
||||
SkillData._();
|
||||
|
||||
// ============================================================================
|
||||
// 공격 스킬
|
||||
// ============================================================================
|
||||
|
||||
/// Debug Strike - 기본 공격 스킬
|
||||
static const debugStrike = Skill(
|
||||
id: 'debug_strike',
|
||||
name: 'Debug Strike',
|
||||
type: SkillType.attack,
|
||||
mpCost: 10,
|
||||
cooldownMs: 3000, // 3초
|
||||
power: 15,
|
||||
damageMultiplier: 1.5,
|
||||
);
|
||||
|
||||
/// Memory Leak - 방어력 감소 효과
|
||||
static const memoryLeak = Skill(
|
||||
id: 'memory_leak',
|
||||
name: 'Memory Leak',
|
||||
type: SkillType.attack,
|
||||
mpCost: 25,
|
||||
cooldownMs: 8000, // 8초
|
||||
power: 25,
|
||||
damageMultiplier: 2.5,
|
||||
targetDefReduction: 0.2, // 적 방어력 -20%
|
||||
);
|
||||
|
||||
/// Core Dump - 강력한 공격
|
||||
static const coreDump = Skill(
|
||||
id: 'core_dump',
|
||||
name: 'Core Dump',
|
||||
type: SkillType.attack,
|
||||
mpCost: 50,
|
||||
cooldownMs: 20000, // 20초
|
||||
power: 40,
|
||||
damageMultiplier: 4.0,
|
||||
);
|
||||
|
||||
/// Kernel Panic - 최강 공격 (자해 데미지)
|
||||
static const kernelPanic = Skill(
|
||||
id: 'kernel_panic',
|
||||
name: 'Kernel Panic',
|
||||
type: SkillType.attack,
|
||||
mpCost: 100,
|
||||
cooldownMs: 60000, // 60초
|
||||
power: 80,
|
||||
damageMultiplier: 8.0,
|
||||
selfDamagePercent: 0.1, // 자신 HP -10%
|
||||
);
|
||||
|
||||
/// Stack Overflow - 중급 공격
|
||||
static const stackOverflow = Skill(
|
||||
id: 'stack_overflow',
|
||||
name: 'Stack Overflow',
|
||||
type: SkillType.attack,
|
||||
mpCost: 35,
|
||||
cooldownMs: 12000, // 12초
|
||||
power: 30,
|
||||
damageMultiplier: 3.0,
|
||||
);
|
||||
|
||||
/// Null Pointer - 빠른 공격
|
||||
static const nullPointer = Skill(
|
||||
id: 'null_pointer',
|
||||
name: 'Null Pointer',
|
||||
type: SkillType.attack,
|
||||
mpCost: 15,
|
||||
cooldownMs: 4000, // 4초
|
||||
power: 18,
|
||||
damageMultiplier: 1.8,
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// 회복 스킬
|
||||
// ============================================================================
|
||||
|
||||
/// Hot Reload - HP 회복
|
||||
static const hotReload = Skill(
|
||||
id: 'hot_reload',
|
||||
name: 'Hot Reload',
|
||||
type: SkillType.heal,
|
||||
mpCost: 20,
|
||||
cooldownMs: 10000, // 10초
|
||||
power: 0,
|
||||
healPercent: 0.3, // HP 30% 회복
|
||||
);
|
||||
|
||||
/// Garbage Collection - 대량 회복
|
||||
static const garbageCollection = Skill(
|
||||
id: 'garbage_collection',
|
||||
name: 'Garbage Collection',
|
||||
type: SkillType.heal,
|
||||
mpCost: 45,
|
||||
cooldownMs: 25000, // 25초
|
||||
power: 0,
|
||||
healPercent: 0.5, // HP 50% 회복
|
||||
);
|
||||
|
||||
/// Quick Fix - 빠른 소량 회복
|
||||
static const quickFix = Skill(
|
||||
id: 'quick_fix',
|
||||
name: 'Quick Fix',
|
||||
type: SkillType.heal,
|
||||
mpCost: 10,
|
||||
cooldownMs: 5000, // 5초
|
||||
power: 0,
|
||||
healAmount: 20, // 고정 20 회복
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// 버프 스킬
|
||||
// ============================================================================
|
||||
|
||||
/// Safe Mode - 방어 버프
|
||||
static const safeMode = Skill(
|
||||
id: 'safe_mode',
|
||||
name: 'Safe Mode',
|
||||
type: SkillType.buff,
|
||||
mpCost: 30,
|
||||
cooldownMs: 30000, // 30초
|
||||
power: 0,
|
||||
buff: BuffEffect(
|
||||
id: 'safe_mode_buff',
|
||||
name: 'Safe Mode',
|
||||
durationMs: 10000, // 10초 지속
|
||||
defModifier: 0.5, // 방어력 +50%
|
||||
),
|
||||
);
|
||||
|
||||
/// Overclock - 공격 버프
|
||||
static const overclock = Skill(
|
||||
id: 'overclock',
|
||||
name: 'Overclock',
|
||||
type: SkillType.buff,
|
||||
mpCost: 25,
|
||||
cooldownMs: 25000, // 25초
|
||||
power: 0,
|
||||
buff: BuffEffect(
|
||||
id: 'overclock_buff',
|
||||
name: 'Overclock',
|
||||
durationMs: 8000, // 8초 지속
|
||||
atkModifier: 0.4, // 공격력 +40%
|
||||
criRateModifier: 0.1, // 크리티컬 +10%
|
||||
),
|
||||
);
|
||||
|
||||
/// Firewall - 회피 버프
|
||||
static const firewall = Skill(
|
||||
id: 'firewall',
|
||||
name: 'Firewall',
|
||||
type: SkillType.buff,
|
||||
mpCost: 20,
|
||||
cooldownMs: 20000, // 20초
|
||||
power: 0,
|
||||
buff: BuffEffect(
|
||||
id: 'firewall_buff',
|
||||
name: 'Firewall',
|
||||
durationMs: 12000, // 12초 지속
|
||||
evasionModifier: 0.15, // 회피율 +15%
|
||||
defModifier: 0.2, // 방어력 +20%
|
||||
),
|
||||
);
|
||||
|
||||
// ============================================================================
|
||||
// 스킬 목록
|
||||
// ============================================================================
|
||||
|
||||
/// 모든 스킬 목록
|
||||
static const List<Skill> allSkills = [
|
||||
// 공격 스킬
|
||||
debugStrike,
|
||||
nullPointer,
|
||||
memoryLeak,
|
||||
stackOverflow,
|
||||
coreDump,
|
||||
kernelPanic,
|
||||
// 회복 스킬
|
||||
quickFix,
|
||||
hotReload,
|
||||
garbageCollection,
|
||||
// 버프 스킬
|
||||
overclock,
|
||||
safeMode,
|
||||
firewall,
|
||||
];
|
||||
|
||||
/// ID로 스킬 찾기
|
||||
static Skill? getSkillById(String id) {
|
||||
for (final skill in allSkills) {
|
||||
if (skill.id == id) return skill;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// 타입별 스킬 목록
|
||||
static List<Skill> getSkillsByType(SkillType type) {
|
||||
return allSkills.where((s) => s.type == type).toList();
|
||||
}
|
||||
|
||||
/// 공격 스킬 목록 (MP 효율순 정렬)
|
||||
static List<Skill> get attackSkillsByEfficiency {
|
||||
final attacks = getSkillsByType(SkillType.attack);
|
||||
attacks.sort((a, b) => b.mpEfficiency.compareTo(a.mpEfficiency));
|
||||
return attacks;
|
||||
}
|
||||
|
||||
/// 회복 스킬 목록
|
||||
static List<Skill> get healSkills => getSkillsByType(SkillType.heal);
|
||||
|
||||
/// 버프 스킬 목록
|
||||
static List<Skill> get buffSkills => getSkillsByType(SkillType.buff);
|
||||
|
||||
/// 기본 스킬 세트 (새 캐릭터용)
|
||||
static List<String> get defaultSkillIds => [
|
||||
debugStrike.id,
|
||||
quickFix.id,
|
||||
];
|
||||
|
||||
/// MP 비용 이하의 사용 가능한 공격 스킬
|
||||
static List<Skill> getAffordableAttackSkills(int currentMp) {
|
||||
return getSkillsByType(SkillType.attack)
|
||||
.where((s) => s.mpCost <= currentMp)
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user