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 }