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

@@ -5,6 +5,7 @@ import 'package:asciineverdie/src/core/model/combat_state.dart';
import 'package:asciineverdie/src/core/model/equipment_item.dart';
import 'package:asciineverdie/src/core/model/equipment_slot.dart';
import 'package:asciineverdie/src/core/model/item_stats.dart';
import 'package:asciineverdie/src/core/model/monster_grade.dart';
import 'package:asciineverdie/src/core/model/potion.dart';
import 'package:asciineverdie/src/core/model/skill.dart';
import 'package:asciineverdie/src/core/util/deterministic_random.dart';
@@ -280,6 +281,7 @@ class TaskInfo {
this.monsterBaseName,
this.monsterPart,
this.monsterLevel,
this.monsterGrade,
});
final String caption;
@@ -294,6 +296,9 @@ class TaskInfo {
/// 킬 태스크의 몬스터 레벨 (애니메이션 크기 결정용)
final int? monsterLevel;
/// 킬 태스크의 몬스터 등급 (Normal/Elite/Boss)
final MonsterGrade? monsterGrade;
factory TaskInfo.empty() =>
const TaskInfo(caption: '', type: TaskType.neutral);
@@ -303,6 +308,7 @@ class TaskInfo {
String? monsterBaseName,
String? monsterPart,
int? monsterLevel,
MonsterGrade? monsterGrade,
}) {
return TaskInfo(
caption: caption ?? this.caption,
@@ -310,6 +316,7 @@ class TaskInfo {
monsterBaseName: monsterBaseName ?? this.monsterBaseName,
monsterPart: monsterPart ?? this.monsterPart,
monsterLevel: monsterLevel ?? this.monsterLevel,
monsterGrade: monsterGrade ?? this.monsterGrade,
);
}
}

View File

@@ -1,3 +1,5 @@
import 'package:asciineverdie/src/core/animation/canvas/ascii_cell.dart';
/// 아이템 희귀도
enum ItemRarity {
common,
@@ -23,6 +25,17 @@ enum ItemRarity {
epic => 400,
legendary => 1000,
};
/// 공격 이펙트 셀 색상 (Phase 9: 무기 등급별 이펙트)
///
/// common은 기본 positive(시안), 나머지는 등급별 고유 색상
AsciiCellColor get effectCellColor => switch (this) {
ItemRarity.common => AsciiCellColor.positive,
ItemRarity.uncommon => AsciiCellColor.rarityUncommon,
ItemRarity.rare => AsciiCellColor.rarityRare,
ItemRarity.epic => AsciiCellColor.rarityEpic,
ItemRarity.legendary => AsciiCellColor.rarityLegendary,
};
}
/// 아이템 스탯 보정치

View File

@@ -0,0 +1,60 @@
import 'package:flutter/material.dart';
/// 몬스터 등급 (드랍 품질 및 UI 표시에 영향)
enum MonsterGrade {
/// 일반 몬스터 (85% 확률)
/// - 기본 드랍 확률
/// - UI: 기본 색상, 접두사 없음
normal,
/// 정예 몬스터 (12% 확률)
/// - 물약 드랍 +5%, 아이템 품질 향상
/// - UI: 파란색, ★ 접두사
elite,
/// 보스 몬스터 (3% 확률)
/// - 물약 드랍 +15%, 최고 아이템 품질
/// - UI: 금색, ★★★ 접두사
boss,
}
/// MonsterGrade 확장 메서드
extension MonsterGradeExtension on MonsterGrade {
/// 물약 드랍 확률 보너스 (0.0 ~ 1.0)
double get potionDropBonus => switch (this) {
MonsterGrade.normal => 0.0,
MonsterGrade.elite => 0.05, // +5%
MonsterGrade.boss => 0.15, // +15%
};
/// UI 표시용 접두사 (몬스터 이름 앞에 붙음)
String get displayPrefix => switch (this) {
MonsterGrade.normal => '',
MonsterGrade.elite => '',
MonsterGrade.boss => '★★★ ',
};
/// 스탯 배율 (전투력 강화)
double get statMultiplier => switch (this) {
MonsterGrade.normal => 1.0,
MonsterGrade.elite => 1.3, // +30% 스탯
MonsterGrade.boss => 1.8, // +80% 스탯
};
/// 경험치 배율
double get expMultiplier => switch (this) {
MonsterGrade.normal => 1.0,
MonsterGrade.elite => 1.5, // +50% 경험치
MonsterGrade.boss => 2.5, // +150% 경험치
};
/// UI 표시용 색상
/// - Normal: 기본 텍스트 색상 (null 반환 → 기본 스타일 사용)
/// - Elite: 파란색 (#7AA2F7)
/// - Boss: 금색 (#E0AF68)
Color? get displayColor => switch (this) {
MonsterGrade.normal => null,
MonsterGrade.elite => const Color(0xFF7AA2F7), // MP 파랑
MonsterGrade.boss => const Color(0xFFE0AF68), // 골드
};
}