feat(phase6): 밸런싱 상수 및 몬스터 스탯 스케일링 시스템 구현

- balance_constants.dart 생성
  - ExpConstants: 경험치 곡선 (baseExp * 1.15^level)
  - MonsterType: normal, elite, miniboss, boss, finalBoss
  - MonsterTypeMultiplier: 타입별 HP/ATK/DEF/EXP/GOLD 배율
  - MonsterBaseStats: 레벨 기반 몬스터 스탯 생성
  - BossStats: 5개 보스 정의 (Syntax Error Dragon ~ Glitch God)
  - LevelTierSettings: 구간별 난이도 설정 (초반/중반/후반/엔드게임)
  - PlayerScaling: 플레이어 레벨업 시 HP/MP 스케일링

- MonsterCombatStats 통합
  - MonsterBaseStats.generate() 사용하여 스탯 생성
  - monsterType 매개변수 추가로 타입별 몬스터 지원
This commit is contained in:
JiWoong Sul
2025-12-17 17:48:46 +09:00
parent ec27389e9b
commit 97d9875e00
2 changed files with 430 additions and 19 deletions

View File

@@ -1,3 +1,5 @@
import 'package:askiineverdie/src/core/util/balance_constants.dart';
/// 몬스터 공격 속도 타입
enum MonsterSpeedType {
/// 빠름 (600ms)
@@ -127,22 +129,15 @@ class MonsterCombatStats {
/// [name] 몬스터 표시 이름
/// [level] 몬스터 레벨 (원본 데이터 기준)
/// [speedType] 공격 속도 타입 (기본: normal)
/// [monsterType] 몬스터 타입 (기본: normal)
factory MonsterCombatStats.fromLevel({
required String name,
required int level,
MonsterSpeedType speedType = MonsterSpeedType.normal,
MonsterType monsterType = MonsterType.normal,
}) {
// 레벨 기반 스탯 스케일링
// 레벨 1 기준으로 선형/비선형 증가
// HP: 레벨 * 15 + 기본값 20
final hpMax = 20 + level * 15;
// 공격력: 레벨 * 3 + 기본값 5
final atk = 5 + level * 3;
// 방어력: 레벨 * 1.5 + 기본값 2
final def = 2 + (level * 1.5).round();
// balance_constants.dart의 MonsterBaseStats 사용
final baseStats = MonsterBaseStats.generate(level, monsterType);
// 크리티컬 확률: 레벨에 따라 천천히 증가 (0.02 ~ 0.3)
final criRate = (0.02 + level * 0.003).clamp(0.02, 0.3);
@@ -163,22 +158,19 @@ class MonsterCombatStats {
MonsterSpeedType.slow => 1400,
};
// 경험치 보상: 레벨 기반
final expReward = 10 + level * 5;
return MonsterCombatStats(
name: name,
level: level,
atk: atk,
def: def,
hpMax: hpMax,
hpCurrent: hpMax,
atk: baseStats.atk,
def: baseStats.def,
hpMax: baseStats.hp,
hpCurrent: baseStats.hp,
criRate: criRate,
criDamage: criDamage,
evasion: evasion,
accuracy: accuracy,
attackDelayMs: attackDelayMs,
expReward: expReward,
expReward: baseStats.exp,
);
}