2026-05-06 01:59:03 +08:00

234 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<SkillInfo> SkillInfoList = new List<SkillInfo>();
public List<SkillViewTypeColor> SkillViewTypeColorList = new List<SkillViewTypeColor>();
private Dictionary<SkillType,SkillInfo> _skillDict = new Dictionary<SkillType, SkillInfo>();
[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.UnitFullType.UnitType
&& (t.IgnoreUnitGiantType || key.GiantType == t.UnitFullType.GiantType)
&& (t.IgnoreUnitLevel || key.UnitLevel == t.UnitFullType.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.UnitFullType.UnitType
&& (t.IgnoreUnitGiantType || key.GiantType == t.UnitFullType.GiantType)
&& (t.IgnoreUnitLevel || key.UnitLevel == t.UnitFullType.UnitLevel))
{
if(t.Icon != null)
skillIcon = t.Icon;
return true;
}
}
return true;
}
/// <summary>
/// 根据多语言 Name ID 查找对应的 SkillType。
/// </summary>
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 bool ShowOnUnitMono;
public Sprite SkillIcon;
//根据不同的unittype对象呈现不同的图标&说明
public bool HasShowList;
public List<SkillInfoShowPack> SkillShowList;
public SkillPriority skillPriority;
public bool ReserveOnCarry;
public bool ReserveLeaveCarry;
public bool ReserveGiantUpgrade;
public bool ReserveCommonTransform;
//public bool ReserveLeaveCarry;
}
[Serializable]
public class SkillInfoShowPack
{
public UnitFullType UnitFullType;
public bool IgnoreUnitGiantType;
public bool IgnoreUnitLevel;
public Sprite Icon;
[MultilingualField]
public string SkillDesc;
[MultilingualField]
public string SkillName;
}