using System; using System.Collections.Generic; using UnityEngine; using RuntimeData; using Logic.Multilingual; using Logic.Skill; using TH1_Core.Managers; using Unity.VisualScripting; using UnityEngine.Serialization; using UnityEngine.UI; public enum SkillViewType { Normal, Special, Unique, Negative, Positive, Max } public enum SkillPriority { Normal, Origin, } [Serializable] public struct SkillViewTypeColor { public SkillViewType SkillViewType; public Color Color; } [Serializable] [CreateAssetMenu(fileName = "SkillDataAssets", menuName = "TH1 Game Data/Skill Data Asset")] public class SkillDataAssets : ScriptableObject { public List SkillInfoList = new List(); public List SkillViewTypeColorList = new List(); private Dictionary _skillDict = new Dictionary(); [NonSerialized] private bool _initialized = false; private void Init() { if (_initialized) return; foreach(var t in SkillInfoList) _skillDict[t.SkillType] = t; _initialized = true; } public bool GetSkillInfo(SkillType skill, out SkillInfo skillInfo) { Init(); return _skillDict.TryGetValue(skill,out skillInfo); } //根据unitTypeKey决定skill显示为什么 public bool GetSkillNameAndDesc_DECODE(SkillType skill,UnitFullType key,SkillBase skillparam,out String skillName, out String skillDesc) { Init(); skillDesc = ""; skillName = ""; if (!_skillDict.TryGetValue(skill, out var skillInfo)) return false; //如果没有SkillShowList if (!skillInfo.HasShowList) { //Debug.Log($"has show list for {skill}"); skillDesc = skillInfo.SkillDesc; skillName = skillInfo.SkillName; } else { bool found = false; //如果有ShowList,根据key来判断选谁,都选不到,则采用基础SkillDesc foreach (var t in skillInfo.SkillShowList) { if (key.UnitType == t.UnitType && (t.IgnoreUnitGiantType || key.GiantType == t.GiantType) && (t.IgnoreUnitLevel || key.UnitLevel == t.UnitLevel)) { skillDesc = t.SkillDesc; skillName = t.SkillName; found = true; break; } } if (!found) { skillDesc = skillInfo.SkillDesc; skillName = skillInfo.SkillName; } } if(skillDesc != "") skillDesc = MultilingualManager.Instance.GetMultilingualTextSafe(skillDesc); if(skillName != "") skillName = MultilingualManager.Instance.GetMultilingualTextSafe(skillName); //特殊skill变量处理 (目前仅SanaeWindX \ ayamoveagainbuff if (skill == SkillType.SANAEWINDX) { if (skillparam is SanaeWindXSkill xSkill) { string t = xSkill.X switch { 1 => Table.Instance.TextDataAssets.SkillSanaeWind1, 2 => Table.Instance.TextDataAssets.SkillSanaeWind2, 3 => Table.Instance.TextDataAssets.SkillSanaeWind3, 4 => Table.Instance.TextDataAssets.SkillSanaeWind4, 6 => Table.Instance.TextDataAssets.SkillSanaeWind6, 7 => Table.Instance.TextDataAssets.SkillSanaeWind7, 8 => Table.Instance.TextDataAssets.SkillSanaeWind8, 9 => Table.Instance.TextDataAssets.SkillSanaeWind9, _ => "" }; t = MultilingualManager.Instance.GetMultilingualTextSafe(t); skillDesc = skillDesc.Replace("{param}", t); skillName = skillName.Replace("{param}", t); } } if (skill == SkillType.AYAMOVEAGAINBUFF) { if (skillparam is AyaMoveAgainBuffSkill xSkill) { skillDesc = skillDesc.Replace("{param}", xSkill.MoveGridCount.ToString()); } } return true; } public bool GetSkillIcon(SkillType skill,UnitFullType key,out Sprite skillIcon) { Init(); skillIcon = null; bool ret = _skillDict.TryGetValue(skill,out var skillInfo); if (!ret) return false; skillIcon = skillInfo.SkillIcon; //如果没有SkillShowList if (!skillInfo.HasShowList) return true; //如果有ShowList,根据key来判断选谁,都选不到,则采用基础SkillDesc foreach (var t in skillInfo.SkillShowList) { if (key.UnitType == t.UnitType && (t.IgnoreUnitGiantType || key.GiantType == t.GiantType) && (t.IgnoreUnitLevel || key.UnitLevel == t.UnitLevel)) { if(t.Icon != null) skillIcon = t.Icon; return true; } } return true; } /// /// 根据多语言 Name ID 查找对应的 SkillType。 /// public bool TryGetSkillTypeByNameId(uint nameId, out SkillType skillType) { Init(); string nameIdStr = nameId.ToString(); foreach (var kvp in _skillDict) { if (kvp.Value.SkillName == nameIdStr) { skillType = kvp.Key; return true; } } skillType = default; return false; } public Color GetBGColor(SkillViewType skillViewType,bool HasTimeLimit) { if (HasTimeLimit && skillViewType != SkillViewType.Negative) skillViewType = SkillViewType.Positive; foreach (var t in SkillViewTypeColorList) if (t.SkillViewType == skillViewType) return t.Color; return Color.black; } } [Serializable] public class SkillInfo { public SkillType SkillType; public SkillViewType SkillViewType; [MultilingualField] public string SkillName; [MultilingualField] public string SkillDesc; public bool NotShow; public Sprite SkillIcon; //根据不同的unittype对象,呈现不同的图标&说明 public bool HasShowList; public List SkillShowList; public SkillPriority skillPriority; } [Serializable] public class SkillInfoShowPack { public UnitFullType UnitFullType; public UnitType UnitType; public GiantType GiantType; public uint UnitLevel; public bool IgnoreUnitGiantType; public bool IgnoreUnitLevel; public Sprite Icon; [MultilingualField] public string SkillDesc; [MultilingualField] public string SkillName; }