- 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()로 전투 중 자동 스킬 사용
234 lines
5.8 KiB
Dart
234 lines
5.8 KiB
Dart
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();
|
|
}
|
|
}
|