using System; using System.Collections.Generic; using UnityEngine; namespace TKS.OutGame { /// /// 스킬 표(skills.csv 전 열 + skill_levels.csv) = 스킬 DB. 영웅 화면 표시(A) + 전투 처리기(B · Runtime/Skills 의 SkillCatalog 가 effect_key·p1~p3·lv_scale 을 읽음). /// skill_levels.csv(lv · books · gold) = levels(스킬 레벨 표 · 스킬 레벨업 비용). /// public class SkillInfoDb : ScriptableObject { [Serializable] public class Skill { public string id; public string heroId; [Tooltip("active|passive")] public string kind; public string nameKo; public string hanja; public string trigger; public int cooldown; public int lvMax; [Tooltip("desc_ko (끝 [ ] 메모 포함 원문)")] public string descKo; [Tooltip("effect_key 원문(효과 여럿 = ; 로 나열 · p1~p3 = 키 순서)")] public string effectKey; public float p1; public float p2; public float p3; [Tooltip("p 칸이 비어 있지 않은가(bit0 = p1 · bit1 = p2 · bit2 = p3)")] public int pMask; [Tooltip("수치 × (1 + lv_scale·(lv−1))")] public float lvScale; [Tooltip("신규 처리기(반경 안 유닛 · HP 소모 · 이동 · 교전 반응 정지)")] public bool needsImpl; public string[] EffectKeys { get { return string.IsNullOrEmpty(effectKey) ? new string[0] : effectKey.Split(';'); } } public bool HasP(int i) { return (pMask & (1 << i)) != 0; } public float P(int i) { return i == 0 ? p1 : i == 1 ? p2 : p3; } } [Serializable] public class LevelCost { public int lv; public int books; public int gold; } /// skill_effects.csv 1행 = 스킬 효과 1줄(2026-11-10 #1112 · 키 · 대상 · 조건 · 지속 · p1~p3 · 뜻 = Runtime/Skills/SkillKeys). [Serializable] public class Effect { public string skillId; public string key; [Tooltip("빈칸 = 자신 · allies · camp:<진영>[:<병종>] · camp_male:<진영> · radius: · range · aura")] public string target; [Tooltip("crit · vs_status · vs_bleed · vs_confused · vs_stunned · vs_type:<병종> · vs_male · vs_male_hero · vs_female_hero · turn_le: · armed")] public string cond; [Tooltip("0 = 상시·장착 중·1회 · n = n 라운드")] public int dur; public float p1; public float p2; public float p3; public int pMask; public string note; public bool HasP(int i) { return (pMask & (1 << i)) != 0; } } public List skills = new List(); public List levels = new List(); public List effects = new List(); public Skill Get(string id) { if (string.IsNullOrEmpty(id)) return null; foreach (var s in skills) if (s.id == id) return s; return null; } /// 그 레벨이 되는 비용(skill_levels.csv lv 행 · 없으면 null = 최고). public LevelCost CostTo(int lv) { foreach (var c in levels) if (c.lv == lv) return c; return null; } public int MaxLevel { get { int m = 1; foreach (var c in levels) m = Mathf.Max(m, c.lv); return m; } } /// 표시용 설명 — 끝의 [p1 … ] 개발 메모를 뺀다. public static string DisplayDesc(Skill s) { if (s == null || string.IsNullOrEmpty(s.descKo)) return ""; var d = s.descKo; int b = d.LastIndexOf('['); if (b > 0 && d.TrimEnd().EndsWith("]")) d = d.Substring(0, b); return d.Trim(); } } }