feat(core): 몬스터 등급 시스템 추가

- MonsterGrade 열거형 및 색상 정의
- GameState/ItemStats 확장
- pq_logic 유틸리티 함수 추가
- ASCII 색상 상수 추가
This commit is contained in:
JiWoong Sul
2026-01-05 17:52:47 +09:00
parent e112378ad2
commit 5c8ab0d3f4
5 changed files with 156 additions and 0 deletions

View File

@@ -4,6 +4,7 @@ import 'dart:math' as math;
import 'package:asciineverdie/data/game_text_l10n.dart' as l10n;
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
import 'package:asciineverdie/src/core/model/game_state.dart';
import 'package:asciineverdie/src/core/model/monster_grade.dart';
import 'package:asciineverdie/src/core/model/pq_config.dart';
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
import 'package:asciineverdie/src/core/util/roman.dart';
@@ -483,6 +484,25 @@ Stats winStat(Stats stats, DeterministicRandom rng) {
}
}
/// 몬스터 등급 결정 (Normal 85%, Elite 12%, Boss 3%)
/// 몬스터 레벨이 플레이어 레벨보다 높으면 상위 등급 확률 증가
MonsterGrade _determineGrade(
int monsterLevel,
int playerLevel,
DeterministicRandom rng,
) {
// 기본 확률: Normal 85%, Elite 12%, Boss 3%
// 레벨 차이에 따른 보정
final levelDiff = monsterLevel - playerLevel;
final eliteBonus = (levelDiff * 2).clamp(0, 10); // 최대 +10%
final bossBonus = (levelDiff * 0.5).clamp(0, 3).toInt(); // 최대 +3%
final roll = rng.nextInt(100);
if (roll < 3 + bossBonus) return MonsterGrade.boss;
if (roll < 15 + eliteBonus) return MonsterGrade.elite;
return MonsterGrade.normal;
}
MonsterTaskResult monsterTask(
PqConfig config,
DeterministicRandom rng,
@@ -592,11 +612,15 @@ MonsterTaskResult monsterTask(
name = l10n.indefiniteL10n(name, qty);
}
// 몬스터 등급 결정 (level = 플레이어 레벨)
final grade = _determineGrade(monsterLevel, level, rng);
return MonsterTaskResult(
displayName: name,
baseName: baseName,
level: monsterLevel * qty,
part: part,
grade: grade,
);
}
@@ -607,6 +631,7 @@ class MonsterTaskResult {
required this.baseName,
required this.level,
required this.part,
required this.grade,
});
/// 화면에 표시할 몬스터 이름 (형용사 포함, 예: "a sick Goblin")
@@ -620,6 +645,9 @@ class MonsterTaskResult {
/// 전리품 부위 (예: "claw", "tail", "*"는 WinItem 호출)
final String part;
/// 몬스터 등급 (Normal/Elite/Boss)
final MonsterGrade grade;
}
enum RewardKind { spell, equip, stat, item }