104 lines
3.6 KiB
C#
104 lines
3.6 KiB
C#
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());
|
||
}
|
||
}
|
||
}
|