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 配置 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 UseCur; protected Current UnlockCur; protected Current UpgradeCur; protected Current UnlockAheadCur; protected string Desc; 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 SkillStatus ItemStatus { get { return _ItemStatus; } set { _ItemStatus = value; if (SkillTab == SkillTab.Null) { return; } if (_ItemStatus == SkillStatus.Cool) { ManaData.CoolList.Add(this); } else if (_ItemStatus == SkillStatus.Buy) { ItemBtnLab.text = string.Format("{0}\n{1}{2}", Language.GetStr("UI", "Fe_BtnLab3"),UseCur, UseAmt); } else if (_ItemStatus == SkillStatus.Use) { ManaData.UseList.Add(this); } else if (_ItemStatus == SkillStatus.Lock) { ItemBtnLab.text = string.Format("{0}\n{1}{2}", Language.GetStr("UI", "Fe_BtnLab0"), Language.GetStr("UI", "Fe_BtnLab4"), UnlockLv); } else if (_ItemStatus == SkillStatus.UnLock) { ItemBtnLab.text = string.Format(Language.GetStr("UI", "Fe_BtnLab1")); } else if (_ItemStatus == SkillStatus.Upgrade) { ItemBtnLab.text = string.Format(Language.GetStr("UI", "Fe_BtnLab2")); } else { throw new Exception(); } } } public SkillStatus _ItemStatus; #endregion public Skill(XmlAttributeCollection attributes) { #region 配置 ID = int.Parse(attributes[0].Value); Icon = attributes[30].Value; Desc = Language.GetStr("SkillDescription", "Skill" + ID); Anim = attributes[31].Value; Label = attributes[32].Value; Name = Language.GetStr("SkillName", "Skill" +ID); UnlockPos = attributes[18].Value; UpgradeCD = attributes[28].Value; UpgradeFml = attributes[23].Value; UpgradePlus = attributes[24].Value; UpgradePerson = attributes[25].Value; UpgradeDuration = attributes[27].Value; UpgradeCoinOnce = attributes[26].Value; ClassID = IntParse(attributes[3].Value); UnlockLv = IntParse(attributes[13].Value); CD = FloatParse(attributes[12].Value); UseAmt = FloatParse(attributes[20].Value); Duration = FloatParse(attributes[11].Value); UnlockAmt = FloatParse(attributes[17].Value); DiamondOnce = FloatParse(attributes[9].Value); UnlockAheadAmt = FloatParse(attributes[15].Value); SkillTab = SkillClassParse(attributes[2].Value); ReduceCD = BoolParse(attributes[5].Value); UpgradeAmt = UpgradeAmtParse(attributes[22].Value); UseCur = CurrentParse(attributes[19].Value); UnlockCur = CurrentParse(attributes[16].Value); UpgradeCur = CurrentParse(attributes[21].Value); UnlockAheadCur = CurrentParse(attributes[14].Value); ValueBuffParse(out Person, out PersonBuff, attributes[7].Value); ValueBuffParse(out SkillCD, out SkillCdBuff, attributes[10].Value); ValueBuffParse(out CoinOnce, out CoinOnceBuff, attributes[8].Value); ValueBuffParse(out CoinPerson, out Plus, attributes[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; ManaData.CoolList.Remove(this); return true; } else { return false; } } public override void Annul() { CoolTimer = CD * (1 + CdBuff); ItemStatus = SkillStatus.Cool; ItemBtnLab.color = Color.white; 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); } } ManaDebug.Log(string.Format("技能结束 {0}", Name)); } public override bool DoUse() { UseTimer -= Time.deltaTime; ItemLab.text = UseTimer.ToString("0.0"); if (UseTimer <= 0) { Annul(); ManaData.UseList.Remove(this); return true; } else { return false; } } public override void UpdateStatus() { if (ManaData.Level >= UnlockLv) { if (ItemStatus == SkillStatus.Lock) { if (UnlockCur == Current.Free) { Unlock(); } else { ItemStatus = SkillStatus.UnLock; } } } } public override void RegistValue(float elapse, List> ffList) { NewPlus = Plus; NewPerson = Person; NewSkillCD = SkillCD; NewDuration = Duration; NewCoinOnce = CoinOnce; NewSkillCdBuff = SkillCdBuff; NewPersonBuff = PersonBuff; NewCoinPerson = CoinPerson; NewUpgradeAmt = UpgradeAmt; NewCoinOnceBuff = CoinOnceBuff; if (!string.IsNullOrEmpty(UpgradeFml)) { for (int i = 0; i < Level; i++) { NewUpgradeAmt = Auxiliary.FmlParse(UpgradeFml, "a", NewUpgradeAmt.ToString()); } } UpgradeValue(ref NewPlus, Plus, UpgradePlus, Level); UpgradeValue(ref NewSkillCdBuff, UpgradeCD, Level); UpgradeValue(ref NewPersonBuff, PersonBuff, UpgradePerson, Level); UpgradeValue(ref NewCoinOnceBuff, UpgradeCoinOnce, Level); UpgradeValue(ref NewPerson, Person, UpgradePerson, Level); UpgradeValue(ref NewSkillCD, SkillCD, UpgradeCD, Level); UpgradeValue(ref NewDuration, Duration, UpgradeDuration, Level); UpgradeValue(ref NewCoinOnce, CoinOnce, UpgradeCoinOnce, Level); UpgradeValue(ref NewCoinPerson, CoinPerson, UpgradePlus, Level); ItemTit.text = Name; ItemLab.text = Description(0); ItemBtn.onClick.AddListener(OnClick); if (_ItemStatus != SkillStatus.Lock && _ItemStatus != SkillStatus.UnLock) { ManaDebug.Log(string.Format("技能{0}已解锁 等级 : {1}", Name, Level)); } if (_ItemStatus == SkillStatus.Use) { UsePerma(); if (UseTimer < elapse) { if (ffList.Count > 0) { if (UseTimer < ManaData.CircleTimer) { ffList[0].UniqueAdd(this); } else { int ffCircle = 1 + Mathf.FloorToInt((float)(UseTimer - ManaData.CircleTimer / ManaData.CircleTime)); ffList[ffCircle].UniqueAdd(this); } } } else { UseTimer -= elapse; ItemBtnLab.color = Color.blue; } } else if (_ItemStatus == SkillStatus.Cool) { CoolTimer -= elapse; } ItemStatus = ItemStatus; } 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 (ManaData.Connect == false) { ManaReso.Get("Fg_Reconnect").TweenForCG(); return; } ManaReso.Get("Fe_Info").TweenForCG(); ManaReso.SetText("Fe_Tit", Name); if (ItemStatus == SkillStatus.Buy) { ManaReso.SetText("Fe_Lab1", Description(0)); ManaReso.SetText("Fe_BtnLab", string.Format("{0}({1}{2})", Language.GetStr("UI", "Fe_BtnLab3"), UseCur, 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})", Language.GetStr("UI", "Fe_BtnLab0"), 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})", Language.GetStr("UI", "Fe_BtnLab1"), 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"), UpgradeCur, NewUpgradeAmt)); ManaReso.SetButtonEvent ( "Fe_Btn", () => { Upgrade(); } ); } else if (ItemStatus == SkillStatus.Use) { } else { throw new Exception(); } } protected void UsePerma() { 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 UseImmed() { ManaData.Coin += NewCoinOnce; ManaData.Coin += ManaData.CoinPerson * NewCoinOnceBuff; ManaData.Diamond += DiamondOnce; } protected void UpgradeValue(ref float target, float baseValue, string fml, int offset) { if (Math.Abs(target) < 0.0005f) { return; } if (string.IsNullOrEmpty(fml)) { } else if (fml.Contains("%")) { float step = float.Parse(fml.Replace("%", "")) / 100; target += baseValue * step * offset; } else { target += float.Parse(fml) * offset; } } protected virtual void Buy() { if (ManaData.Pay(UseAmt, UseCur)) { UseTimer = NewDuration; if (Math.Abs(Duration) < 0.0005f) { ItemStatus = SkillStatus.Cool; } else { ItemStatus = SkillStatus.Use; ItemBtnLab.color = Color.blue; } UsePerma(); UseImmed(); #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)) { if (UseCur != 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)) { Level++; 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); ItemLab.text = Description(0); 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"), UpgradeCur, NewUpgradeAmt)); ManaDebug.Log(string.Format("{0}升级 : {1}", Name, Level)); if (ItemStatus == SkillStatus.Use) { Annul(); UsePerma(); } } } protected virtual void UnlockAhead() { if (ItemStatus != SkillStatus.Lock) { ManaDebug.Log("您并不需要提前解锁"); return; } if (ManaData.Pay(UnlockAheadAmt, UnlockAheadCur)) { if (UseCur != Current.Free) { ItemStatus = SkillStatus.Buy; } else if (UpgradeCur != Current.Free) { ItemStatus = SkillStatus.Upgrade; } else { throw new Exception(); } ManaDebug.Log(string.Format("技能{0}已解锁", Name)); } } #region 解读器 protected 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); } else if (Math.Abs(PersonBuff) > 0.0005f) { temp = NewPersonBuff; UpgradeValue(ref temp, PersonBuff, UpgradePerson, offset); stringBuilder.Append(string.Format("{0}%", temp * 100)); } else { } #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.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); } else if (Math.Abs(CoinOnceBuff) > 0.0005f) { temp = NewCoinOnceBuff; UpgradeValue(ref temp, CoinOnceBuff, UpgradeCoinOnce, offset); stringBuilder.Append(temp); } else { throw new Exception(); } #endregion } else if (strings[i].Contains("&diamond_once&")) { #region MyRegion stringBuilder.Append(DiamondOnce); #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); } else if (Math.Abs(Plus) > 0.0005f) { temp = NewPlus; UpgradeValue(ref temp, Plus, UpgradePlus, offset); stringBuilder.Append(string.Format("{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 }