234 lines
7.0 KiB
C#
234 lines
7.0 KiB
C#
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;
|
||
} |