using CommonLang;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using XmdsCommonServer.Plugin;
namespace XmdsCommonServer.XLS.Data
{
///
/// 战斗技能配置表数据.
///
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 原始数据.
///
/// 技能ID.
///
public int SkillID;
///
/// 仇恨值.
///
public string HateRate;
///
/// 天赋信息
///
public string TalentData;
///
/// 攻击类型.
///
public string DmgType;
///
/// 伤害倍数.
///
public string DmgRate;
///
/// 额外伤害.
///
public string ExdDmgSet;
///
/// 触发概率.
///
public string Chance;
///
/// 持续时长.
///
public string BuffTime;
///
/// 属性1含义.
///
public string ValueAttribute1;
///
/// 属性1.
///
public string ValueSet;
///
/// 属性2含义.
///
public string ValueAttribute2;
///
/// 属性2.
///
public string ValueSet2;
///
/// 属性3含义.
///
public string ValueAttribute3;
///
/// 属性3.
///
public string ValueSet3;
///
/// 属性4.
///
public string ValueSet4;
///
/// 额外
///
public string ValueSet5;
public string ValueSet6;
public string ValueSet7;
public string ValueSet8;
///
/// CD时间.
///
public string CDTime;
///
/// 是否可以自动战斗.
///
public string canAuto;
///
/// 技能类型.
///
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;
}
///
/// 将所有原始数据按需转成XmdsSkillValue.
///
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 mValueMin = null;
if (content.Contains(":"))
{
mValueMin = new List();
//截取;所得的数组.
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 mValueMax = new List();
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 tempArray = new List();
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();
}
}
ret = temp;
}
else
{
XmdsSkillValueExt temp = new XmdsSkillValueExt(content);
List tempArray = new List();
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();
}
}
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();
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();
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 mList = null;
public XmdsSkillValueExt(string content) : base(content)
{
mContent = content;
}
internal void SetValue(List 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 mMinList = null;
public XmdsSkillValue_Array(string content) : base(content)
{
}
internal void SetValue(List 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 mMaxList = null;
public XmdsSkillValue_DoubleArray(string content) : base(content)
{
}
internal void SetValue(List minList, List 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> mList = null;
public XmdsSkillValue_List(string content) : base(content)
{
mList = new List>();
}
internal void SetValue(List 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 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> mList = null;
public XmdsSkillValue_ListExt(string content) : base(content)
{
mList = new List>();
}
internal void SetValue(List 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 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 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;
}
}
}
}