using UnityEngine; using Colosseum.Stats; using Colosseum.Player; namespace Colosseum.Skills.Effects { /// /// 대미지 타입 /// public enum DamageType { Physical, // 물리 대미지 (STR 기반) Magical, // 마법 대미지 (INT 기반) Ranged, // 원거리 대미지 (DEX 기반) True, // 고정 대미지 (스탯 영향 없음) } /// /// 데미지 효과 /// [CreateAssetMenu(fileName = "DamageEffect", menuName = "Colosseum/Skills/Effects/Damage")] public class DamageEffect : SkillEffect { [Header("Damage Settings")] [Min(0f)] [SerializeField] private float baseDamage = 10f; [SerializeField] private DamageType damageType = DamageType.Physical; [Tooltip("스탯 계수 (1.0 = 100%)")] [Min(0f)] [SerializeField] private float statScaling = 1f; protected override void ApplyEffect(GameObject caster, GameObject target) { if (target == null) return; // 대미지 계산 float totalDamage = CalculateDamage(caster); // 타겟에 대미지 적용 var networkController = target.GetComponent(); if (networkController != null) { networkController.TakeDamageRpc(totalDamage); } Debug.Log($"[Damage] {caster.name} -> {target.name}: {totalDamage:F1} ({damageType})"); } /// /// 시전자 스탯 기반 대미지 계산 /// 공식: baseDamage + (statDamage * scaling) /// private float CalculateDamage(GameObject caster) { if (damageType == DamageType.True) { return baseDamage; } var stats = caster.GetComponent(); if (stats == null) { return baseDamage; } float statDamage = damageType switch { DamageType.Physical => stats.PhysicalDamage, DamageType.Magical => stats.MagicDamage, DamageType.Ranged => stats.Dexterity.FinalValue * 2f, // DEX 기반 원거리 대미지 _ => 0f, }; return baseDamage + (statDamage * statScaling); } } }