ThreeKingdomsSlingshot/Assets/Scripts/Runtime/Skills/SkillStatus.cs

104 lines
3.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections.Generic;
using UnityEngine;
namespace TKS
{
/// <summary>
/// 스킬 상태 이상 1기분(2026-11-10 #1112 · PD 기획 정의):
/// 혼란 = 그 유닛 차례 동안 이동 거리 × 배율(장료·육손·손권 「이동력 50 % 감소」) · 출혈 = 움직인 거리 비례 최대 HP 피해(서황 「이동 거리의 50 %에 비례」) ·
/// 중독 = 그 진영 턴 시작 + 자기 행동 끝마다 최대 HP %(가후·축융 · 가후 패시브 = 중첩) · 화상(불태우기) = 그 진영 턴 시작마다 최대 HP %(서서).
/// 기절 = 기존 지형 기믹 「행동 불가」(GimmickLayer.Stun · 다음 자기 턴을 쉼)를 그대로 쓴다.
/// 턴 수 = 그 유닛 진영의 턴 기준(자기 턴 중에 걸리면 다음 턴부터 셈).
/// </summary>
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);
}
/// <summary>상태 이상 아무것이나(스킬 상태 + 지형 기믹 중독·행동 불가).</summary>
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<string>();
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());
}
}
}