using System.Collections.Generic;
using UnityEngine;
namespace TKS
{
///
/// 스킬 상태 이상 1기분(2026-11-10 #1112 · PD 기획 정의):
/// 혼란 = 그 유닛 차례 동안 이동 거리 × 배율(장료·육손·손권 「이동력 50 % 감소」) · 출혈 = 움직인 거리 비례 최대 HP 피해(서황 「이동 거리의 50 %에 비례」) ·
/// 중독 = 그 진영 턴 시작 + 자기 행동 끝마다 최대 HP %(가후·축융 · 가후 패시브 = 중첩) · 화상(불태우기) = 그 진영 턴 시작마다 최대 HP %(서서).
/// 기절 = 기존 지형 기믹 「행동 불가」(GimmickLayer.Stun · 다음 자기 턴을 쉼)를 그대로 쓴다.
/// 턴 수 = 그 유닛 진영의 턴 기준(자기 턴 중에 걸리면 다음 턴부터 셈).
///
public class UnitStatus
{
public int ConfuseTurns;
public float ConfuseMult = 1f;
public int BleedTurns;
public float BleedPct;
public int PoisonTurns;
public float PoisonPct;
public int PoisonStacks;
public int BurnTurns;
public float BurnPct;
public TextMesh Badge;
public UnitStatus Copy()
{
return (UnitStatus)MemberwiseClone();
}
public bool Any
{
get { return ConfuseTurns > 0 || BleedTurns > 0 || PoisonTurns > 0 || BurnTurns > 0; }
}
public void Clear()
{
ConfuseTurns = BleedTurns = PoisonTurns = BurnTurns = PoisonStacks = 0;
ConfuseMult = 1f;
}
}
public static class SkillStatus
{
public static readonly Color TextColor = new Color(0.95f, 0.55f, 1f);
static UnitStatus Of(Unit u)
{
var sys = SkillSystem.Current;
return sys != null ? sys.StatusOf(u) : null;
}
public static bool Confused(Unit u)
{
var s = Of(u);
return s != null && s.ConfuseTurns > 0;
}
public static float ConfuseMult(Unit u)
{
var s = Of(u);
return s != null && s.ConfuseTurns > 0 ? Mathf.Clamp(s.ConfuseMult, 0.05f, 1f) : 1f;
}
public static bool Bleeding(Unit u)
{
var s = Of(u);
return s != null && s.BleedTurns > 0;
}
public static bool Poisoned(Unit u)
{
var s = Of(u);
if (s != null && s.PoisonTurns > 0) return true;
var g = GimmickLayer.Current != null ? GimmickLayer.Current.StateOf(u) : null;
return g != null && g.PoisonTurns > 0;
}
public static bool Stunned(Unit u)
{
var g = GimmickLayer.Current != null ? GimmickLayer.Current.StateOf(u) : null;
return g != null && (g.Stun > 0 || g.Skip);
}
/// 상태 이상 아무것이나(스킬 상태 + 지형 기믹 중독·행동 불가).
public static bool HasAny(Unit u)
{
var s = Of(u);
return (s != null && s.Any) || Poisoned(u) || Stunned(u);
}
public static string BadgeText(UnitStatus s)
{
if (s == null) return "";
var parts = new List();
if (s.ConfuseTurns > 0) parts.Add("혼란" + s.ConfuseTurns);
if (s.BleedTurns > 0) parts.Add("출혈" + s.BleedTurns);
if (s.PoisonTurns > 0) parts.Add("독" + s.PoisonTurns + (s.PoisonStacks > 1 ? "×" + s.PoisonStacks : ""));
if (s.BurnTurns > 0) parts.Add("화상" + s.BurnTurns);
return string.Join(" ", parts.ToArray());
}
}
}