using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.Serialization; [System.Serializable] public class SkillData { public string IDX; [Space(10)] public string trigger; [Space(10)] public float delay; [OnlyRead] public float timeLast; [Space(10)] public int rate;//1000 분율 [OnlyRead] [Space(10)] public int cntUse; public int cntUseMax; [Space(10)] public string work; public string work2; public float value; public string value2; [Space(10)] public float duration; public float timeRepeat; [Space(10)] public Motion.SpineControl motion; public Motion.SpineControl motion2; [Space(10)] public GameObject prefab; static public SkillData Create(string[] spl) { int i = 0; SkillData skill = new SkillData(); skill.IDX = spl[i++]; skill.trigger = spl[i++]; skill.delay = float.Parse(spl[i++]); skill.rate = int.Parse(spl[i++]); skill.cntUse = 0; string str = spl[i++]; skill.cntUseMax = str.CompareTo("MAX") == 0 ? int.MaxValue : int.Parse(str); skill.work = spl[i++]; skill.work2 = spl[i++]; skill.value = float.Parse(spl[i++]); skill.value2 = spl[i++]; skill.duration = float.Parse(spl[i++]); skill.timeRepeat = float.Parse(spl[i++]); return skill; } static public SkillData Create(string str) { SkillData skill = new SkillData(); string[] values = str.Split('&'); for(int i = 0; i < values.Length; i++) { string[] data = values[i].Split('='); switch(data[0]) { case "I": { SkillData origin = DataManager.Instance.dataSkill.Search(data[1]); if (origin != null) skill = Copy(origin); else { Debug.LogError($"{data[1]} : Skill 테이블에 존재하지 않는 IDX 입니다."); continue; } } break; case "T"://Trigger { skill.trigger = data[1]; } break; case "D"://Delay { skill.delay = float.Parse(data[1]); } break; case "R"://Rate { skill.rate = int.Parse(data[1]); } break; case "C"://Count { skill.cntUse = 0; skill.cntUseMax = str.CompareTo("MAX") == 0 ? int.MaxValue : int.Parse(data[1]); } break; case "W"://Work { skill.work = data[1]; } break; case "W2"://Work2 { skill.work2 = data[1]; } break; case "V"://Value { skill.value = float.Parse(data[1]); } break; case "V2"://Value2 { skill.value2 = data[1]; } break; case "TR"://Time Repeat { skill.timeRepeat = float.Parse(data[1]); } break; case "DU"://DUration { skill.duration = float.Parse(data[1]); } break; } } return skill; } static public SkillData Copy(SkillData origin) { SkillData skill = new SkillData(); skill.IDX = origin.IDX; skill.trigger = origin.trigger; skill.work = origin.work; skill.work2 = origin.work2; skill.value = origin.value; skill.value2 = origin.value2; skill.delay = origin.delay; skill.timeRepeat = origin.timeRepeat; skill.rate = origin.rate; skill.cntUse = 0; skill.cntUseMax = origin.cntUseMax; skill.duration = origin.duration; return skill; } [System.Serializable] public class ConnectEvent : UnityEvent> { } [FormerlySerializedAs("onConnect")] [SerializeField] [Space(10)] public ConnectEvent onConnect = new ConnectEvent(); public bool Activate(string trigger) { if (this.trigger.Equals(trigger)) { if ((delay < Time.realtimeSinceStartup - timeLast) && (Random.Range(0, 1000) < rate) && (cntUse < cntUseMax)) { timeLast = Time.realtimeSinceStartup; cntUse++; return true; } } return false; } } [System.Serializable] public class DataSkill : IData { Dictionary listSkill; public List skills; public override void TableLoad() { string[] strLine = FileLoadWithLineSplit(path == string.Empty ? "CSV/Skill" : path); string[] spl; listSkill = new Dictionary(); for (int i = 1; i < strLine.Length; i++) { if (1 < strLine[i].Length) { spl = strLine[i].Split(','); SkillData item = SkillData.Create(spl); listSkill.Add(item.IDX, item); } } skills = new List(listSkill.Values); } public override void LoadedCheck() { if (listSkill == null) TableLoad(); } public SkillData Search(string idx) { LoadedCheck(); if (listSkill.ContainsKey(idx)) return listSkill[idx]; return null; } }