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()); } } }