using System.Collections.Generic; using UnityEngine; using Platformer.Mechanics; namespace EerieVillage.Skills.Effectors { /// /// A08 저주의 화살 — 저주 스택 관리 정적 레지스트리. /// N 스택 도달 시 누적 폭발 대미지 처리. /// BT12-Dev Phase 2-B §4-6. /// /// 주의: 씬 전환·EnemyController 파괴 시 Clear(enemy)를 외부에서 호출해야 /// Dictionary 누수를 방지할 수 있다 (Phase 2-C GC 개선 대상). /// public static class DebuffStack { private static readonly Dictionary _stacks = new Dictionary(); /// /// 스택 1 추가. limit 도달 시 폭발 대미지 처리 후 스택 초기화. /// explosionDamage = ActiveSkillData.BaseDamage 기준. /// public static void AddStack(EnemyController enemy, int limit, int explosionDamage) { if (enemy == null) return; if (!_stacks.ContainsKey(enemy)) _stacks[enemy] = 0; _stacks[enemy]++; if (_stacks[enemy] >= limit) { // N스택 폭발 대미지 — 스택 수 × baseDamage × 2 int total = explosionDamage * _stacks[enemy] * 2; var health = enemy.GetComponent(); if (health != null && health.IsAlive) { health.Decrement(total); } _stacks[enemy] = 0; } } /// /// 적 사망 또는 씬 전환 시 스택 레코드 제거. /// public static void Clear(EnemyController enemy) { if (enemy != null) _stacks.Remove(enemy); } /// 현재 스택 수 조회 (디버그용). public static int GetStack(EnemyController enemy) { if (enemy == null) return 0; return _stacks.TryGetValue(enemy, out int v) ? v : 0; } } }