using System.Collections.Generic; using Skill_V2; using UnityEngine; public class SkillData : IHasBuff { SkillProperty property; StatGroup statGroup; BuffData[] buffs; public uint ID => property.id; public Skill Prefab => property.skillPrefab; public IReadOnlyList Sequences => property.sequences; public string NameKey => FormatString.StringFormat("skill_name_{0}", ID); public string DescriptionKey => FormatString.StringFormat("skill_desc_{0}", ID); public string IconImgAtlasName => GameProperty.Instance.SkillIconAtlasName; public string IconImgNameInAtlas => (2000 + ID).ToString(); public IReadOnlyList Buffs => buffs; public SkillData(SkillProperty property) { this.property = property; statGroup = new StatGroup(property.stats); buffs = new BuffData[property._buffs.Length]; for (int i = 0; i < property._buffs.Length; i++) { buffs[i] = new BuffData(property._buffs[i], this); } } public bool TryGetStat(uint id, out StatData stat) => statGroup.TryGetStat(id, out stat); public bool TryGetStat(StatID id, out StatData stat) => TryGetStat((uint)id, out stat); public bool TryGetBuff(string nameKey, out BuffData buff) => buffs.TryFind(x => x.NameKey == nameKey, out buff); /// /// stat.{statID}은 스탯의 이름을 표시합니다. /// buff.{buffName}.{property}은 버프의 속성을 표시합니다. /// buff.{buffName}.effect.{index}.{property}은 버프의 효과의 속성을 표시합니다. /// public string GetSkillDesc() { string descFormat = LocalizationInjector.InjectLocalization(LocalizationInjector.MakeToLocalizationKey(DescriptionKey)); string result = string.Empty; for(int i = 0; i < descFormat.Length; i++) { char c = descFormat[i]; if (c == '{') { string keyword = string.Empty; while(++i < descFormat.Length && descFormat[i] != '}') { keyword += descFormat[i]; } var values = keyword.Split('.'); Debug.Assert(values.Length > 0, "Invalid skill desc"); if (values[0] == "stat") { Debug.Assert(values.Length > 1, "Invalid skill desc"); if (statGroup.TryGetStatByName(values[1], out StatData stat)) { result += stat.ToString(); } } else if (values[0] == "buff") { Debug.Assert(values.Length > 2, "Invalid skill desc"); var key = values[1]; if (TryGetBuff(key, out BuffData buff)) { if (values[2] == "duration") { result += buff.Duration.ToString("F2"); } else if (values[2] == "effect") { Debug.Assert(values.Length > 4, "Invalid skill desc"); var index = int.Parse(values[3]); if (values[4] == "value") { result += buff.Effects[index].Value; } else if (values[4] == "name") { result += LocalizationText.GetText(buff.Effects[index].NameKey); } } } } } else { result += descFormat[i]; } } return result; } }