Super Knight : Enter the Dungeon
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

238 lines
6.1 KiB

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<int, List<object>> { }
[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<string, SkillData> listSkill;
public List<SkillData> skills;
public override void TableLoad()
{
string[] strLine = FileLoadWithLineSplit(path == string.Empty ? "CSV/Skill" : path);
string[] spl;
listSkill = new Dictionary<string, SkillData>();
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<SkillData>(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;
}
}