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