using UnityEngine;
using Colosseum.Stats;
using Colosseum.Combat;
using Colosseum.Passives;
using Colosseum.Skills;
namespace Colosseum.Skills.Effects
{
///
/// 치료 효과.
/// 회복량에 비례하여 적에게 위협을 생성할 수 있습니다.
///
[CreateAssetMenu(fileName = "HealEffect", menuName = "Colosseum/Skills/Effects/Heal")]
public class HealEffect : SkillEffect
{
[Header("Heal Settings")]
[Min(0f)] [SerializeField] private float baseHeal = 10f;
[Tooltip("회복력 계수 (1.0 = 100%)")]
[Min(0f)] [SerializeField] private float healScaling = 1f;
[Header("Threat")]
[Tooltip("힐 사용 시 항상 생성할 고정 위협 수치")]
[Min(0f)] [SerializeField] private float flatThreatAmount = 5f;
[Tooltip("실제 회복량에 대한 위협 비율 (1.0 = 100%)")]
[Range(0f, 10f)] [SerializeField] private float threatPercentOfHeal = 0.5f;
[Tooltip("위협을 생성할 반경 (시전자 기준)")]
[Min(0f)] [SerializeField] private float threatRadius = 50f;
protected override void ApplyEffect(GameObject caster, GameObject target)
{
if (target == null) return;
// 회복량 계산
float totalHeal = CalculateHeal(caster);
// 타겟에 회복 적용 (IDamageable 인터페이스 사용)
var damageable = target.GetComponent();
if (damageable != null)
{
float actualHeal = damageable.Heal(totalHeal);
CombatBalanceTracker.RecordHeal(caster, target, actualHeal);
// 위협 생성: 고정 수치 + (실제 회복량 × 비율)
float threat = flatThreatAmount + (actualHeal * threatPercentOfHeal);
if (threat > 0f)
{
ThreatUtility.GenerateThreatOnNearbyEnemies(caster, threat, threatRadius);
}
}
}
///
/// 시전자 스탯 기반 회복량 계산
/// 공식: baseHeal + (healPower * healScaling)
///
private float CalculateHeal(GameObject caster)
{
var stats = caster.GetComponent();
if (stats == null)
{
return baseHeal *
SkillRuntimeModifierUtility.GetHealMultiplier(caster) *
PassiveRuntimeModifierUtility.GetHealMultiplier(caster);
}
float resolvedHeal = baseHeal + (stats.HealPower * healScaling);
return resolvedHeal *
SkillRuntimeModifierUtility.GetHealMultiplier(caster) *
PassiveRuntimeModifierUtility.GetHealMultiplier(caster);
}
}
}