using System.Collections.Generic;
using UnityEngine;
using Platformer.Mechanics;
using Platformer.Gameplay;
using static Platformer.Core.Simulation;
namespace EerieVillage.Skills.Effectors
{
///
/// A05 학익진 — 플레이어 주변 범위 즉시 피해 + FX_SLASH 이펙트.
/// PD 지시 (2026-05-13):
/// - 1.5초 간격 (BaseCooldown 1.5)
/// - 플레이어 주변 영역 (HitboxSize 반경) 내 적에게 피해
/// - 공격력 10 (BaseDamage)
/// - FX_SLASH 이펙트 재생 (data.OnHitFxPrefab)
///
public class MeleeAreaSpawner : IEffector
{
public void Trigger(ActiveSkillRuntime runtime, PlayerSkillInventory inventory)
{
var data = runtime.ActiveData;
Vector2 playerPos = inventory.transform.position;
// 이펙트 spawn — 플레이어 위치
if (data.OnHitFxPrefab != null)
{
var fx = Object.Instantiate(data.OnHitFxPrefab, playerPos, Quaternion.identity);
AutoDestroyFx(fx);
}
// 범위 내 적 일괄 피해
int damage = Mathf.Max(runtime.CalculateEffectiveDamage(), data.BaseDamage);
float radius = Mathf.Max(data.HitboxSize.x, data.HitboxSize.y);
var enemies = Object.FindObjectsByType(FindObjectsSortMode.None);
foreach (var e in enemies)
{
if (e == null) continue;
if (Vector2.Distance(e.transform.position, playerPos) > radius) continue;
var h = e.GetComponent();
if (h == null || !h.IsAlive) continue;
h.Decrement(damage);
if (!h.IsAlive)
{
Schedule().enemy = e;
}
}
}
static void AutoDestroyFx(GameObject fxGo)
{
if (fxGo == null) return;
var psList = fxGo.GetComponentsInChildren(true);
float max = 0f;
foreach (var ps in psList)
{
var main = ps.main;
float t = main.duration + main.startLifetime.constantMax;
if (t > max) max = t;
}
Object.Destroy(fxGo, Mathf.Max(max, 1f) + 0.2f);
}
}
}