using CommonLang; using System; using System.Collections.Generic; using System.Diagnostics; using XmdsCommonServer.Plugin; namespace XmdsCommonServer.XLS.Data { /// <summary> /// 战斗技能配置表数据. /// </summary> public class XmdsSkillData { // justsogo : 保证DmgRate从0开始,顺序不能改动,需要添加的话,在ValueSet8后面加 public enum XmdsSkillDataKey : int { CDTime = 0, TalentData, DmgRate, ValueSet, ValueSet2, ValueSet3, ValueSet4, ValueSet5, ValueSet6, ValueSet7, ValueSet8, canAuto, Max, } public enum XmdsSkillExtKey : int { Normal = 0, //默认值 BossComActiveSkill = 1, //boss通用主动技能 BossComPassiveSkill = 2, //boss通用被动技能 } public const string ATK_TYPE_PHY = "物理"; public const string ATK_TYPE_MAG = "魔法"; private XmdsSkillValue [] mConfigArray = new XmdsSkillValue[(int)XmdsSkillDataKey.Max]; //扩展属性 public int SkillExt; #region 原始数据. /// <summary> /// 技能ID. /// </summary> public int SkillID; /// <summary> /// 仇恨值. /// </summary> public string HateRate; /// <summary> /// 天赋信息 /// </summary> public string TalentData; /// <summary> /// 攻击类型. /// </summary> public string DmgType; /// <summary> /// 伤害倍数. /// </summary> public string DmgRate; /// <summary> /// 额外伤害. /// </summary> public string ExdDmgSet; /// <summary> /// 触发概率. /// </summary> public string Chance; /// <summary> /// 持续时长. /// </summary> public string BuffTime; /// <summary> /// 属性1含义. /// </summary> public string ValueAttribute1; /// <summary> /// 属性1. /// </summary> public string ValueSet; /// <summary> /// 属性2含义. /// </summary> public string ValueAttribute2; /// <summary> /// 属性2. /// </summary> public string ValueSet2; /// <summary> /// 属性3含义. /// </summary> public string ValueAttribute3; /// <summary> /// 属性3. /// </summary> public string ValueSet3; /// <summary> /// 属性4. /// </summary> public string ValueSet4; /// <summary> /// 额外 /// </summary> public string ValueSet5; public string ValueSet6; public string ValueSet7; public string ValueSet8; /// <summary> /// CD时间. /// </summary> public string CDTime; /// <summary> /// 是否可以自动战斗. /// </summary> public string canAuto; /// <summary> /// 技能类型. /// </summary> public int SkillType; /** 技能破定值 */ public int BreakShieldValue; //是否有伤害(1:伤害,2-治疗) public int DamageType = 0; #endregion public XmdsSkillValue GetParamValue(XmdsSkillDataKey key) { XmdsSkillValue ret = mConfigArray[(int)key]; if (ret == null) { throw new Exception(string.Format("XmdsSkillData GetParamValue not exists Key = {0}", key)); } return ret; } /// <summary> /// 将所有原始数据按需转成XmdsSkillValue. /// </summary> public void Init() { mConfigArray[(int)XmdsSkillDataKey.DmgRate] = CreateSkillValue(DmgRate); mConfigArray[(int)XmdsSkillDataKey.CDTime] = CreateSkillValue(CDTime); mConfigArray[(int)XmdsSkillDataKey.canAuto] = CreateSkillValue(canAuto); if(this.TalentData != null && this.TalentData.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.TalentData] = CreateSkillValue(TalentData); } if (this.ValueSet != null && this.ValueSet.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet] = CreateSkillValue(ValueSet); } if (this.ValueSet2 != null && this.ValueSet2.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet2] = CreateSkillValue(ValueSet2); } if (this.ValueSet3 != null && this.ValueSet3.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet3] = CreateSkillValue(ValueSet3); } if (this.ValueSet4 != null && this.ValueSet4.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet4] = CreateSkillValue(ValueSet4); } //额外数值 if (this.ValueSet5 != null && this.ValueSet5.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet5] = CreateSkillValue(ValueSet5); } //额外数值 if (this.ValueSet6 != null && this.ValueSet6.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet6] = CreateSkillValue(ValueSet6); } //额外数值 if (this.ValueSet7 != null && this.ValueSet7.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet7] = CreateSkillValue(ValueSet7); } //额外数值 if (this.ValueSet8 != null && this.ValueSet8.Length > 0) { mConfigArray[(int)XmdsSkillDataKey.ValueSet8] = CreateSkillValue(ValueSet8); } } private XmdsSkillValue CreateSkillValue(string content) { XmdsSkillValue ret = null; ret = ParserContent(SkillID, content); return ret; } private XmdsSkillValue ParserContent(int id, string content) { XmdsSkillValue ret = null; try { if (!string.IsNullOrEmpty(content)) { List<int> mValueMin = null; if (content.Contains(":")) { mValueMin = new List<int>(); //截取;所得的数组. string[] strArray = null; if (content.Contains(";")) { strArray = content.Split(';'); } else { strArray = new String[1]; strArray[0] = content; } //截取:所得到的数组. string[] subArray = null; //完整数据已字符串形式存储. string[] ValueArray = new string[strArray.Length]; //[1:34][2:55]或[3:44-55]. for (int i = 0; i < strArray.Length; i++) { subArray = strArray[i].Split(':'); if (subArray != null && subArray.Length == 2) { ValueArray[i] = subArray[1]; } } //[34,34-44] if (ValueArray[0].Contains("-")) { string[] subArray2; List<int> mValueMax = new List<int>(); int t = 0; for (int k = 0; k < ValueArray.Length; k++) { subArray2 = ValueArray[k].Split(','); t = Int32.Parse(subArray2[0]); mValueMin.Add(t); t = Int32.Parse(subArray2[1]); mValueMax.Add(t); XmdsSkillValue_DoubleArray temp = new XmdsSkillValue_DoubleArray(content); temp.SetValue(mValueMin, mValueMax); ret = temp; } } else if (ValueArray[0].Contains("_")) { if (ValueArray[0].Contains(",")) { string[] subArray2; XmdsSkillValue_ListExt temp = new XmdsSkillValue_ListExt(content); List<IntIntData> tempArray = new List<IntIntData>(); for (int k = 0; k < ValueArray.Length;) { subArray2 = ValueArray[k].Split(','); for (int l = 0; l < subArray2.Length; l++) { string[] subArray3 = subArray2[l].Split('_'); tempArray.Add(new IntIntData(Int32.Parse(subArray3[0]), Int32.Parse(subArray3[1]))); } temp.SetValue(tempArray); if (++k < ValueArray.Length) { tempArray = new List<IntIntData>(); } } ret = temp; } else { XmdsSkillValueExt temp = new XmdsSkillValueExt(content); List<IntIntData> tempArray = new List<IntIntData>(); for (int k = 0; k < ValueArray.Length; k++) { string[] subArray2 = ValueArray[k].Split('_'); tempArray.Add(new IntIntData(Int32.Parse(subArray2[0]), Int32.Parse(subArray2[1]))); } temp.SetValue(tempArray); ret = temp; } } else if(ValueArray[0].Contains(",")) { string[] subArray2; XmdsSkillValue_List temp = new XmdsSkillValue_List(content); for (int k = 0; k < ValueArray.Length;) { subArray2 = ValueArray[k].Split(','); for(int l = 0; l < subArray2.Length; l++) { mValueMin.Add(Int32.Parse(subArray2[l])); } temp.SetValue(mValueMin); if(++k < ValueArray.Length) { mValueMin = new List<int>(); } } ret = temp; } else { for (int k = 0; k < ValueArray.Length; k++) { mValueMin.Add(Int32.Parse(ValueArray[k])); } XmdsSkillValue_Array temp = new XmdsSkillValue_Array(content); temp.SetValue(mValueMin); ret = temp; } } else if(content.Contains(",")) { XmdsSkillValue_Array temp = new XmdsSkillValue_Array(content); String [] subArray = content.Split(','); mValueMin = new List<int>(); for (int l = 0; l < subArray.Length; l++) { mValueMin.Add(Int32.Parse(subArray[l])); } temp.SetValue(mValueMin); ret = temp; } else if (content.Contains("_")) { XmdsSkillValue_Array temp = new XmdsSkillValue_Array(content); String[] subArray = content.Split('_'); mValueMin = new List<int>(); for (int l = 0; l < subArray.Length; l++) { mValueMin.Add(Int32.Parse(subArray[l])); } temp.SetValue(mValueMin); ret = temp; } else { int v = Int32.Parse(content); ret = new XmdsSkillValue(content, false); ret.SetValue(v); } } } catch (Exception error) { throw new Exception(string.Format("技能 {0} 数据 {1} 解析错误:{2}", id, content, error.ToString())); } return ret; } } public class IntIntData { public int value1; public int value2; public IntIntData() { } public IntIntData(int value1, int value2) { this.value1 = value1; this.value2 = value2; } public void ReSet() { this.value1 = 0; this.value2 = 0; } } public class XmdsSkillValue { public static readonly XmdsSkillValue Default = new XmdsSkillValue("", false) { mValue = 0}; protected string mContent = null; private bool mSingleCfg = true; private int mValue; public XmdsSkillValue(string content, bool subClass = true) { mContent = content; if (subClass) { mSingleCfg = false; } } public virtual int GetValue() { return mValue; } public bool IsSingleCfg() { return this.mSingleCfg; } public virtual int GetValue(int lv) { return mValue; } public virtual int GetValueExt(int lv) { return mValue; } public virtual int GetValue(int lv, int ext) { return mValue; } public virtual int GetValueExt(int lv, int ext) { return mValue; } internal void SetValue(int v) { mValue = v; } //[1->N] protected bool IsValid(int lv, int listCount) { if (0 < lv && lv <= listCount) { return true; } return false; } } public class XmdsSkillValueExt : XmdsSkillValue { protected List<IntIntData> mList = null; public XmdsSkillValueExt(string content) : base(content) { mContent = content; } internal void SetValue(List<IntIntData> list) { mList = list; } public override int GetValue(int lv) { //验证等级有效性. int k = 0; if (IsValid(lv, mList.Count)) { k = lv - 1; } //else //{ // XmdsBattleHelper.LogWarn(string.Format("XmdsSkillValue_Array get Value Error:skillcontent = {0}, lv = {1}", mContent, lv)); //string stackInfo = new StackTrace().ToString(); //XmdsBattleHelper.LogWarn("stackInfo : " + stackInfo); //} return mList[k].value1; } public override int GetValueExt(int lv) { //验证等级有效性. int k = 0; if (IsValid(lv, mList.Count)) { k = lv - 1; } //else //{ // XmdsBattleHelper.LogWarn(string.Format("XmdsSkillValue_Array get Value Error:skillcontent = {0}, lv = {1}", mContent, lv)); //string stackInfo = new StackTrace().ToString(); //XmdsBattleHelper.LogWarn("stackInfo : " + stackInfo); //} return mList[k].value2; } } public class XmdsSkillValue_Array : XmdsSkillValue { protected List<int> mMinList = null; public XmdsSkillValue_Array(string content) : base(content) { } internal void SetValue(List<int> list) { mMinList = list; if (mMinList == null || mMinList.Count == 0) { throw new Exception("无效的XmdsSkillValue_Array数据."); } } public override int GetValue(int lv) { //验证等级有效性. int k = 0; if(IsValid(lv, mMinList.Count)) { k = lv - 1; } //else //{ // XmdsBattleHelper.LogWarn(string.Format("XmdsSkillValue_Array get Value Error:skillcontent = {0}, lv = {1}", mContent, lv)); //string stackInfo = new StackTrace().ToString(); //XmdsBattleHelper.LogWarn("stackInfo : " + stackInfo); //} return mMinList[k]; } } public class XmdsSkillValue_DoubleArray : XmdsSkillValue_Array { private static Random mRandom = new Random(); protected List<int> mMaxList = null; public XmdsSkillValue_DoubleArray(string content) : base(content) { } internal void SetValue(List<int> minList, List<int> maxList) { mMinList = minList; mMaxList = maxList; if (mMinList == null || mMinList.Count == 0 || mMaxList == null || mMaxList.Count == 0 || mMinList.Count != mMaxList.Count) { throw new Exception("无效的XmdsSkillValue_DoubleArray数据."); } } public override int GetValue(int lv) { //验证等级有效性. int k = 0; if (IsValid(lv, mMinList.Count) || IsValid(lv, mMaxList.Count)) { k = lv - 1; } else { XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_DoubleArray get Value Error:skillcontent = {0}", mContent)); } int a = mMinList[k]; int b = mMaxList[k]; return mRandom.Next(a, b); } } public class XmdsSkillValue_List : XmdsSkillValue { protected List<List<int>> mList = null; public XmdsSkillValue_List(string content) : base(content) { mList = new List<List<int>>(); } internal void SetValue(List<int> list) { if (list == null || list.Count == 0) { throw new Exception("无效的XmdsSkillValue_Array数据."); } else { mList.Add(list); } } public override int GetValue(int lv, int ext) { int k = 0; if(IsValid(lv, mList.Count)) { k = lv - 1; } List<int> tempArray = mList[k]; if(IsValid(ext, tempArray.Count)) { return tempArray[ext-1]; } else if(tempArray.Count > 0) { string stackInfo = new StackTrace().ToString(); XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_List1 get Value Error:skillcontent = {0}访问lv,ext: {1}, {2}", mContent, lv, ext + ", stack: " + stackInfo)); return tempArray[0]; } XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_List2 get Value Error:skillcontent = {0}", mContent)); return 0; } } public class XmdsSkillValue_ListExt : XmdsSkillValue { protected List<List<IntIntData>> mList = null; public XmdsSkillValue_ListExt(string content) : base(content) { mList = new List<List<IntIntData>>(); } internal void SetValue(List<IntIntData> list) { if (list == null || list.Count == 0) { throw new Exception("无效的XmdsSkillValue_Array数据."); } else { mList.Add(list); } } public override int GetValue(int lv, int ext) { int k = 0; if (IsValid(lv, mList.Count)) { k = lv - 1; } List<IntIntData> tempArray = mList[k]; if (IsValid(ext, tempArray.Count)) { return tempArray[ext - 1].value1; } else if (tempArray.Count > 0) { string stackInfo = new StackTrace().ToString(); XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_ListExt 1 get Value Error:skillcontent = {0}@{1}@{2}@{3}", mContent, lv, ext, stackInfo)); return tempArray[0].value1; } else { string stackInfo = new StackTrace().ToString(); XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_ListExt 2 get Value Error:skillcontent = {0}@{1}@{2}@{3}", mContent, lv, ext, stackInfo)); return 0; } } public override int GetValueExt(int lv, int ext) { int k = 0; if (IsValid(lv, mList.Count)) { k = lv - 1; } List<IntIntData> tempArray = mList[k]; if (IsValid(ext, tempArray.Count)) { return tempArray[ext - 1].value2; } else if (tempArray.Count > 0) { string stackInfo = new StackTrace().ToString(); XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_ListExt 3 get Value Error:skillcontent = {0},{1},{2},{3}", mContent, lv, ext, stackInfo)); return tempArray[0].value2; } else { string stackInfo = new StackTrace().ToString(); XmdsBattleHelper.LogError(string.Format("XmdsSkillValue_ListExt 4 get Value Error:skillcontent = {0},{1},{2},{3}", mContent, lv, ext, stackInfo)); return 0; } } } }