using UnityEngine;
using UnityEngine.UI;
using System;
using System.Xml;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;
public class Skill : SkillRoot
{
#region 变量
#region 配置
public override string ID
{
get { return "Skill" + ID_; }
}
protected float CD;
protected float Person;
protected float SkillCD;
protected float UseAmt;
protected float Duration;
protected float CoinOnce;
protected float CoinPerson;
protected float DiamondOnce;
protected bool ReduceCD;
protected double UpgradeAmt;
protected float Plus;
protected float CdBuff;
protected float PersonBuff;
protected float SkillCdBuff;
protected float CoinOnceBuff;
protected int UnlockLv;
protected float UnlockAmt;
protected float UnlockAheadAmt;
protected string UnlockPos;
protected Current BuyCur;
protected Current UnlockCur;
protected Current UpgradeCur;
protected Current UnlockAheadCur;
protected string Label;
protected string Anim;
protected string UpgradeCD;
protected string UpgradeFml;
protected string UpgradePlus;
protected string UpgradePerson;
protected string UpgradeDuration;
protected string UpgradeCoinOnce;
#endregion
public float UseTimer;
public float CoolTimer;
protected float NewPlus;
protected float NewPerson;
protected float NewSkillCD;
protected float NewDuration;
protected float NewCoinOnce;
protected float NewSkillCdBuff;
protected float NewPersonBuff;
protected float NewCoinPerson;
protected float NewCoinOnceBuff;
protected double NewUpgradeAmt;
public virtual SkillStatus ItemStatus
{
get { return ItemStatus_; }
set
{
ItemStatus_ = value;
if (SkillTab == SkillTab.Null)
{
return;
}
if (ItemStatus_ == SkillStatus.Buy)
{
if (BuyCur == Current.AD)
{
ManaLan.Add(ItemBtnLab, new LanStr("Common", "AD"));
}
else
{
ManaLan.Add(ItemBtnLab, ImageParse(BuyCur), UseAmt.ToString("0"), "\n", new LanStr("UI", "Fe_BtnLab3"));
}
}
else if (ItemStatus_ == SkillStatus.Lock)
{
ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab0"), "\n", new LanStr("UI", "Fe_BtnLab4"), UnlockLv.ToString());
}
else if (ItemStatus_ == SkillStatus.UnLock)
{
if (UnlockCur == Current.Free)
{
ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab1"));
}
else
{
ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab1"), "\n", ImageParse(UnlockCur), UnlockAmt.ToString("0"));
}
}
else if (ItemStatus_ == SkillStatus.Upgrade)
{
ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab2"), "\n", ImageParse(UpgradeCur), NewUpgradeAmt.ToString("0"));
}
}
}
public SkillStatus ItemStatus_;
#endregion
public Skill(XmlAttributeCollection attribute)
{
#region 配置
ID_ = int.Parse(attribute[0].Value);
Icon_ = attribute[30].Value;
Anim = attribute[31].Value;
Label = attribute[32].Value;
UnlockPos = attribute[18].Value;
UpgradeCD = attribute[28].Value;
UpgradeFml = attribute[23].Value;
UpgradePlus = attribute[24].Value;
UpgradePerson = attribute[25].Value;
UpgradeDuration = attribute[27].Value;
UpgradeCoinOnce = attribute[26].Value;
ItemIndex = Auxiliary.IntParse(attribute[3].Value,0);
UnlockLv = Auxiliary.IntParse(attribute[13].Value,0);
CD = Auxiliary.FloatParse(attribute[12].Value,0);
UseAmt = Auxiliary.FloatParse(attribute[20].Value,0);
Duration = Auxiliary.FloatParse(attribute[11].Value,0);
UnlockAmt = Auxiliary.FloatParse(attribute[17].Value,0);
DiamondOnce = Auxiliary.FloatParse(attribute[9].Value,0);
UnlockAheadAmt = Auxiliary.FloatParse(attribute[15].Value,0);
SkillTab = SkillClassParse(attribute[2].Value);
ReduceCD = Auxiliary.BoolParse(attribute[5].Value, false);
UpgradeAmt = UpgradeAmtParse(attribute[22].Value);
BuyCur = CurrentParse(attribute[19].Value);
UnlockCur = CurrentParse(attribute[16].Value);
UpgradeCur = CurrentParse(attribute[21].Value);
UnlockAheadCur = CurrentParse(attribute[14].Value);
ValueBuffParse(out Person, out PersonBuff, attribute[7].Value);
ValueBuffParse(out SkillCD, out SkillCdBuff, attribute[10].Value);
ValueBuffParse(out CoinOnce, out CoinOnceBuff, attribute[8].Value);
ValueBuffParse(out CoinPerson, out Plus, attribute[6].Value);
#endregion
SkillType = SkillType.Skill;
}
public virtual bool DoCool()
{
CoolTimer -= Time.deltaTime;
TimeSpan timeSpan = new TimeSpan(0, 0, (int)CoolTimer);
ItemBtnLab.text = string.Format("{0}\n{1}({2}:{3})", Language.GetStr("UI", "Fe_BtnLab6"), Language.GetStr("UI", "Fe_BtnLab7"), timeSpan.Minutes, timeSpan.Seconds);
if (CoolTimer <= 0)
{
ItemStatus = SkillStatus.Buy;
ManaDebug.Log(string.Format("技能{0}已冷却", Name));
return true;
}
else
{
return false;
}
}
public override void Annul()
{
CoolTimer = CD * (1 + CdBuff);
ManaData.CoolList.Add(this);
ItemStatus = SkillStatus.Cool;
ItemBtnLab.color = Color.white;
AnnulA();
ManaDebug.Log(string.Format("技能结束 {0}", Name));
}
public virtual void AnnulA()
{
ManaData.SkillPlus -= NewPlus;
ManaData.SkillPerson -= NewPerson;
ManaData.SkillPersonBuff -= NewPersonBuff;
ManaData.SkillCoinPerson -= NewCoinPerson;
if (Math.Abs(NewSkillCD) > 0.0005f)
{
for (int i = 0; i < ManaData.SkillList.Count; i++)
{
ManaData.SkillList[i].ReceiveCool(-NewSkillCD, true, false);
}
}
if (Math.Abs(NewSkillCdBuff) > 0.0005f)
{
for (int i = 0; i < ManaData.SkillList.Count; i++)
{
ManaData.SkillList[i].ReceiveCool(-NewSkillCdBuff, true, true);
}
}
}
public override bool DoUse()
{
UseTimer -= Time.deltaTime;
ItemLab.text = UseTimer.ToString("0.0");
if (UseTimer <= 0)
{
Annul();
return true;
}
else
{
return false;
}
}
public override void UpdateStatus()
{
if (ManaData.Level >= UnlockLv)
{
if (ItemStatus == SkillStatus.Lock)
{
if (BuyCur == Current.Free)
{
ItemStatus = SkillStatus.UnLock;
}
else
{
ItemStatus = SkillStatus.Buy;
}
}
}
}
public override void RegistValue(float elapse, List> useList, XmlAttributeCollection attribute)
{
Level = int.Parse(attribute[3].Value);
UseTimer = float.Parse(attribute[5].Value);
CoolTimer = float.Parse(attribute[4].Value);
ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), attribute[2].Value);
NewPlus = Plus;
NewPerson = Person;
NewSkillCD = SkillCD;
NewDuration = Duration;
NewCoinOnce = CoinOnce;
NewSkillCdBuff = SkillCdBuff;
NewPersonBuff = PersonBuff;
NewCoinPerson = CoinPerson;
NewUpgradeAmt = UpgradeAmt;
NewCoinOnceBuff = CoinOnceBuff;
ItemLab.text = Description(0);
ItemBtn.onClick.AddListener(OnClick);
if (ItemStatus == SkillStatus.Use)
{
UseA();
if (UseTimer < elapse)
{
if (useList.Count > 0)
{
if (UseTimer < ManaData.CircleTimer)
{
useList[0].UniqueAdd(this);
}
else
{
int ffCircle = 1 + Mathf.FloorToInt(UseTimer - ManaData.CircleTimer / ManaData.CircleTime);
useList[ffCircle].UniqueAdd(this);
}
}
}
else
{
UseTimer -= elapse;
ItemBtnLab.color = Color.blue;
}
}
else if (ItemStatus == SkillStatus.Cool)
{
CoolTimer -= elapse;
}
if (ItemStatus != SkillStatus.Lock && ItemStatus != SkillStatus.UnLock)
{
ManaDebug.Log(string.Format("技能{0}已解锁", Name));
}
}
public override void ReceiveCool(float amt, bool current, bool buff)
{
if (!ReduceCD)
{
return;
}
if (current)
{
if (ItemStatus != SkillStatus.Cool)
{
return;
}
if (buff)
{
CoolTimer -= CD * amt;
}
else
{
CoolTimer -= amt;
}
}
else
{
if (buff)
{
CdBuff -= amt;
}
else
{
CD -= amt;
}
}
}
protected void OnClick()
{
if (!ManaServer.Connect)
{
ManaReso.Get("Fg_Reconnect").TweenForCG();
return;
}
ManaReso.Get("Fe_Info").TweenForCG();
ManaReso.SetText("Fe_Tit", NameParse());
ManaReso.SetSprite("Fe_Icon", Icon);
if (ItemStatus == SkillStatus.Buy)
{
ManaReso.SetText("Fe_Lab0", "");
ManaReso.SetText("Fe_Lab1", Description(0));
ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2:0})", Language.GetStr("UI", "Fe_BtnLab3"), ImageParse(BuyCur), UseAmt));
ManaReso.SetButtonEvent
(
"Fe_Btn",
() =>
{
Buy();
ManaReso.Get("Fe_Info").TweenBacCG();
}
);
}
else if (ItemStatus == SkillStatus.Lock)
{
ManaReso.SetText("Fe_Lab0", "");
ManaReso.SetText("Fe_Lab1", Description(0));
ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2:0})", Language.GetStr("UI", "Fe_BtnLab0"), ImageParse(UnlockAheadCur), UnlockAheadAmt));
ManaReso.SetButtonEvent
(
"Fe_Btn",
() =>
{
UnlockAhead();
ManaReso.Get("Fe_Info").TweenBacCG();
}
);
}
else if (ItemStatus == SkillStatus.UnLock)
{
ManaReso.SetText("Fe_Lab0", "");
ManaReso.SetText("Fe_Lab1", Description(0));
ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2:0})", Language.GetStr("UI", "Fe_BtnLab1"), ImageParse(UnlockCur), UnlockAmt));
ManaReso.SetButtonEvent
(
"Fe_Btn",
() =>
{
Unlock();
ManaReso.Get("Fe_Info").TweenBacCG();
}
);
}
else if (ItemStatus == SkillStatus.Upgrade)
{
ManaReso.SetText("Fe_Lab0", Description(0));
ManaReso.SetText("Fe_Lab1", Description(1));
ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2:0})", Language.GetStr("UI", "Fe_BtnLab2"), ImageParse(UpgradeCur), NewUpgradeAmt));
ManaReso.SetButtonEvent
(
"Fe_Btn",
() =>
{
Upgrade();
ItemLab.text = Description(0);
ManaReso.SetText("Fe_Tit", NameParse());
ManaReso.SetText("Fe_Lab0", Description(0));
ManaReso.SetText("Fe_Lab1", Description(1));
ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2:0})", Language.GetStr("UI", "Fe_BtnLab2"), ImageParse(UpgradeCur), NewUpgradeAmt));
ManaDebug.Log(string.Format("{0}升级 : {1}", Name, Level));
}
);
}
}
protected void UseA()
{
ManaData.UseList.Add(this);
ManaData.SkillPlus += NewPlus;
ManaData.SkillPerson += NewPerson;
ManaData.SkillPersonBuff += NewPersonBuff;
ManaData.SkillCoinPerson += NewCoinPerson;
if (Math.Abs(NewSkillCD) > 0.0005f)
{
for (int i = 0; i < ManaData.SkillList.Count; i++)
{
ManaData.SkillList[i].ReceiveCool(NewSkillCD, true, false);
}
}
if (Math.Abs(NewSkillCdBuff) > 0.0005f)
{
for (int i = 0; i < ManaData.SkillList.Count; i++)
{
ManaData.SkillList[i].ReceiveCool(NewSkillCdBuff, true, true);
}
}
}
protected void UseB()
{
ManaData.Coin += NewCoinOnce;
ManaData.Coin += ManaData.CoinPerson * NewCoinOnceBuff;
ManaData.Diamond += DiamondOnce;
}
protected virtual void Buy()
{
if (!ManaData.Pay(UseAmt, BuyCur))
{
return;
}
ManaData.Skill++;
UseTimer = NewDuration;
if (Math.Abs(Duration) < 0.0005f)
{
ItemStatus = SkillStatus.Cool;
}
else
{
ItemStatus = SkillStatus.Use;
ItemBtnLab.color = Color.blue;
}
UseA();
UseB();
#region 调试
StringBuilder strb = new StringBuilder();
strb.AppendFormat("使用技能 : {0}", Name);
if (Math.Abs(NewPlus) > 0.0005f)
{
strb.AppendFormat(" 收入加成+{0}%", NewPlus*100);
}
if (Math.Abs(NewPerson) > 0.0005f)
{
strb.AppendFormat(" 参观人次+{0}", NewPerson);
}
if (Math.Abs(NewPersonBuff) > 0.0005f)
{
strb.AppendFormat(" 参观人次+{0}%", NewPersonBuff*100);
}
if (Math.Abs(NewCoinPerson) > 0.0005f)
{
strb.AppendFormat(" 每次金币+{0}", NewCoinPerson);
}
if (Math.Abs(NewSkillCD) > 0.0005f)
{
strb.AppendFormat(" 减少冷却{0}", NewSkillCD);
}
if (Math.Abs(NewSkillCdBuff) > 0.0005f)
{
strb.AppendFormat(" 减少冷却{0}%", NewSkillCdBuff*100);
}
if (Math.Abs(NewCoinOnce) > 0.0005f)
{
strb.AppendFormat(" 获得金币{0}", NewCoinOnce);
}
if (Math.Abs(NewCoinOnceBuff) > 0.0005f)
{
strb.AppendFormat(" 获得金币{0}", ManaData.Person*ManaData.CoinPerson*ManaData.CircleTime*NewCoinOnceBuff);
}
if (Math.Abs(DiamondOnce) > 0.0005f)
{
strb.AppendFormat(" 获得钻石{0}", DiamondOnce);
}
if (Math.Abs(NewDuration) > 0.0005f)
{
strb.AppendFormat(" 持续时间{0}秒", NewDuration);
}
else
{
strb.Append(" 永久有效");
}
ManaDebug.Log(strb.ToString());
#endregion
}
protected virtual void Unlock()
{
if (!ManaData.Pay(UnlockAmt, UnlockCur))
{
return;
}
if (BuyCur != Current.Free)
{
ItemStatus = SkillStatus.Buy;
}
else if (UpgradeCur != Current.Free)
{
ItemStatus = SkillStatus.Upgrade;
}
else
{
throw new Exception();
}
ManaDebug.Log(string.Format("技能{0}已解锁", Name));
}
protected virtual void Upgrade()
{
if (!ManaData.Pay(NewUpgradeAmt, UpgradeCur))
{
return;
}
Level++;
if (ItemStatus == SkillStatus.Use)
{
AnnulA();
}
NewUpgradeAmt = Auxiliary.FmlParse(UpgradeFml, "a", NewUpgradeAmt.ToString());
UpgradeValue(ref NewPlus, Plus, UpgradePlus, 1);
UpgradeValue(ref NewSkillCdBuff, UpgradeCD, 1);
UpgradeValue(ref NewPersonBuff, PersonBuff, UpgradePerson, 1);
UpgradeValue(ref NewCoinOnceBuff, UpgradeCoinOnce, 1);
UpgradeValue(ref NewPerson, Person, UpgradePerson, 1);
UpgradeValue(ref NewSkillCD, SkillCD, UpgradeCD, 1);
UpgradeValue(ref NewDuration, Duration, UpgradeDuration, 1);
UpgradeValue(ref NewCoinOnce, CoinOnce, UpgradeCoinOnce, 1);
UpgradeValue(ref NewCoinPerson, CoinPerson, UpgradePlus, 1);
if (ItemStatus == SkillStatus.Use)
{
UseA();
}
}
protected virtual void UnlockAhead()
{
if (ItemStatus != SkillStatus.Lock)
{
ManaDebug.Log("您并不需要提前解锁");
return;
}
if (!ManaData.Pay(UnlockAheadAmt, UnlockAheadCur))
{
return;
}
if (BuyCur != Current.Free)
{
ItemStatus = SkillStatus.Buy;
}
else if (UpgradeCur != Current.Free)
{
ItemStatus = SkillStatus.UnLock;
}
else
{
throw new Exception();
}
ManaDebug.Log(string.Format("技能{0}已解锁", Name));
}
#region 解读器
protected override string Description(int offset)
{
float temp;
string[] strings = Desc.Split('[', ']');
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strings.Length; i++)
{
if (strings[i].Contains("lv"))
{
}
else if (strings[i].Contains("&person&"))
{
#region MyRegion
if (Math.Abs(Person) > 0.0005f)
{
temp = NewPerson;
UpgradeValue(ref temp, Person, UpgradePerson, offset);
UpgradeUnit(ref temp, strings[i]);
stringBuilder.Append(temp.ToString("0"));
}
else if (Math.Abs(PersonBuff) > 0.0005f)
{
temp = NewPersonBuff;
UpgradeValue(ref temp, PersonBuff, UpgradePerson, offset);
stringBuilder.Append(string.Format("{0:0}%", temp * 100));
}
#endregion
}
else if (strings[i].Contains("&duration&"))
{
#region MyRegion
temp = NewDuration;
UpgradeValue(ref temp, Duration, UpgradeDuration, offset);
UpgradeUnit(ref temp, strings[i]);
stringBuilder.Append(temp.ToString("0"));
#endregion
}
else if (strings[i].Contains("&coin_once&"))
{
#region MyRegion
if (Math.Abs(CoinOnce) > 0.0005f)
{
temp = NewCoinOnce;
UpgradeValue(ref temp, CoinOnce, UpgradeCoinOnce, offset);
stringBuilder.Append(temp.ToString("0"));
}
else if (Math.Abs(CoinOnceBuff) > 0.0005f)
{
temp = NewCoinOnceBuff;
UpgradeValue(ref temp, CoinOnceBuff, UpgradeCoinOnce, offset);
stringBuilder.Append(temp.ToString("0"));
}
#endregion
}
else if (strings[i].Contains("&diamond_once&"))
{
#region MyRegion
stringBuilder.Append(DiamondOnce.ToString("0"));
#endregion
}
else if (strings[i].Contains("&coin_person&"))
{
#region MyRegion
if (Math.Abs(CoinPerson) > 0.0005f)
{
temp = NewCoinPerson;
UpgradeValue(ref temp, CoinPerson, UpgradePlus, offset);
stringBuilder.Append(temp.ToString("0.0"));
}
else if (Math.Abs(Plus) > 0.0005f)
{
temp = NewPlus;
UpgradeValue(ref temp, Plus, UpgradePlus, offset);
stringBuilder.Append(string.Format("{0:0}%", temp * 100));
}
else
{
throw new Exception();
}
#endregion
}
else
{
stringBuilder.Append(strings[i]);
}
}
return stringBuilder.ToString();
}
protected double UpgradeAmtParse(string str)
{
if (string.IsNullOrEmpty(str))
{
return UnlockAmt;
}
else
{
return double.Parse(str);
}
}
#endregion
}