refactor(potion): 물약 자동 사용 조건 변경

- 임계치 기반 → 소모량 기반 조건 전환
- HP/MP 소모량 >= 물약 회복량일 때 사용
- emergencyHpThreshold, emergencyMpThreshold 상수 제거
- 우선순위 HP > MP 유지
This commit is contained in:
JiWoong Sul
2026-01-16 00:15:38 +09:00
parent 93f29f6c33
commit 9e5472728f
2 changed files with 76 additions and 78 deletions

View File

@@ -265,9 +265,7 @@ class CombatTickService {
return null; return null;
} }
// 우선순위 1: HP 물약 (HP <= 30%) // 우선순위 1: HP 물약 (소모된 HP >= 물약 회복량)
final hpRatio = playerStats.hpCurrent / playerStats.hpMax;
if (hpRatio <= PotionService.emergencyHpThreshold) {
final hpPotion = potionService.selectEmergencyHpPotion( final hpPotion = potionService.selectEmergencyHpPotion(
currentHp: playerStats.hpCurrent, currentHp: playerStats.hpCurrent,
maxHp: playerStats.hpMax, maxHp: playerStats.hpMax,
@@ -301,11 +299,8 @@ class CombatTickService {
); );
} }
} }
}
// 우선순위 2: MP 물약 (MP <= 50%) // 우선순위 2: MP 물약 (소모된 MP >= 물약 회복량)
final mpRatio = playerStats.mpCurrent / playerStats.mpMax;
if (mpRatio <= PotionService.emergencyMpThreshold) {
final mpPotion = potionService.selectEmergencyMpPotion( final mpPotion = potionService.selectEmergencyMpPotion(
currentMp: playerStats.mpCurrent, currentMp: playerStats.mpCurrent,
maxMp: playerStats.mpMax, maxMp: playerStats.mpMax,
@@ -339,7 +334,6 @@ class CombatTickService {
); );
} }
} }
}
return null; return null;
} }

View File

@@ -13,12 +13,6 @@ class PotionService {
/// 글로벌 물약 쿨타임 (1배속 기준 3초) /// 글로벌 물약 쿨타임 (1배속 기준 3초)
static const int globalPotionCooldownMs = 3000; static const int globalPotionCooldownMs = 3000;
/// 긴급 물약 사용 HP 임계치 (30%)
static const double emergencyHpThreshold = 0.30;
/// 긴급 물약 사용 MP 임계치 (50%)
static const double emergencyMpThreshold = 0.50;
// ============================================================================ // ============================================================================
// 물약 사용 가능 여부 // 물약 사용 가능 여부
// ============================================================================ // ============================================================================
@@ -104,7 +98,7 @@ class PotionService {
/// 긴급 HP 물약 선택 /// 긴급 HP 물약 선택
/// ///
/// HP가 임계치 이하일 때 사용할 최적의 물약 선택 /// 소모된 HP >= 물약 회복량이면 사용할 최적의 물약 선택
/// [currentHp] 현재 HP /// [currentHp] 현재 HP
/// [maxHp] 최대 HP /// [maxHp] 최대 HP
/// [inventory] 물약 인벤토리 /// [inventory] 물약 인벤토리
@@ -115,9 +109,8 @@ class PotionService {
required PotionInventory inventory, required PotionInventory inventory,
required int playerLevel, required int playerLevel,
}) { }) {
// 임계치 체크 final hpLost = maxHp - currentHp;
final hpRatio = currentHp / maxHp; if (hpLost <= 0) return null;
if (hpRatio > emergencyHpThreshold) return null;
// 적정 티어 계산 // 적정 티어 계산
final targetTier = PotionData.tierForLevel(playerLevel); final targetTier = PotionData.tierForLevel(playerLevel);
@@ -126,33 +119,38 @@ class PotionService {
for (var tier = targetTier; tier >= 1; tier--) { for (var tier = targetTier; tier >= 1; tier--) {
final potion = PotionData.getHpPotionByTier(tier); final potion = PotionData.getHpPotionByTier(tier);
if (potion != null && inventory.hasPotion(potion.id)) { if (potion != null && inventory.hasPotion(potion.id)) {
final healAmount = potion.calculateHeal(maxHp);
if (hpLost >= healAmount) {
return potion; return potion;
} }
} }
}
// 적정 티어 이상도 검색 // 적정 티어 이상도 검색
for (var tier = targetTier + 1; tier <= 5; tier++) { for (var tier = targetTier + 1; tier <= 5; tier++) {
final potion = PotionData.getHpPotionByTier(tier); final potion = PotionData.getHpPotionByTier(tier);
if (potion != null && inventory.hasPotion(potion.id)) { if (potion != null && inventory.hasPotion(potion.id)) {
final healAmount = potion.calculateHeal(maxHp);
if (hpLost >= healAmount) {
return potion; return potion;
} }
} }
}
return null; return null;
} }
/// 긴급 MP 물약 선택 /// 긴급 MP 물약 선택
/// ///
/// MP가 임계치 이하일 때 사용할 최적의 물약 선택 /// 소모된 MP >= 물약 회복량이면 사용할 최적의 물약 선택
Potion? selectEmergencyMpPotion({ Potion? selectEmergencyMpPotion({
required int currentMp, required int currentMp,
required int maxMp, required int maxMp,
required PotionInventory inventory, required PotionInventory inventory,
required int playerLevel, required int playerLevel,
}) { }) {
// 임계치 체크 final mpLost = maxMp - currentMp;
final mpRatio = currentMp / maxMp; if (mpLost <= 0) return null;
if (mpRatio > emergencyMpThreshold) return null;
// 적정 티어 계산 // 적정 티어 계산
final targetTier = PotionData.tierForLevel(playerLevel); final targetTier = PotionData.tierForLevel(playerLevel);
@@ -161,17 +159,23 @@ class PotionService {
for (var tier = targetTier; tier >= 1; tier--) { for (var tier = targetTier; tier >= 1; tier--) {
final potion = PotionData.getMpPotionByTier(tier); final potion = PotionData.getMpPotionByTier(tier);
if (potion != null && inventory.hasPotion(potion.id)) { if (potion != null && inventory.hasPotion(potion.id)) {
final healAmount = potion.calculateHeal(maxMp);
if (mpLost >= healAmount) {
return potion; return potion;
} }
} }
}
// 적정 티어 이상도 검색 // 적정 티어 이상도 검색
for (var tier = targetTier + 1; tier <= 5; tier++) { for (var tier = targetTier + 1; tier <= 5; tier++) {
final potion = PotionData.getMpPotionByTier(tier); final potion = PotionData.getMpPotionByTier(tier);
if (potion != null && inventory.hasPotion(potion.id)) { if (potion != null && inventory.hasPotion(potion.id)) {
final healAmount = potion.calculateHeal(maxMp);
if (mpLost >= healAmount) {
return potion; return potion;
} }
} }
}
return null; return null;
} }