using UnityEngine; using UnityEngine.UI; using System; using System.Xml; using System.Text; using System.Collections; using System.Collections.Generic; public class Ability : SkillRoot { #region 变量 #region 配置 public override string ID { get { return "Ability" + ID_; } } protected float Person; protected float SkillCD; protected float CoinPerson; protected double UpgradeAmt; protected float Plus; protected float PersonBuff; protected float SkillCdBuff; protected int UnlockLv; protected float UnlockAmt; protected float UnlockAheadAmt; protected string UnlockPos; protected Current UnlockCur; protected Current UpgradeCur; protected Current UnlockAheadCur; protected bool ValidSlot; protected string Label; protected string Anim; protected string UpgradeCD; protected string UpgradeFml; protected string UpgradePlus; protected string UpgradePerson; #endregion protected float NewPlus; protected float NewPerson; protected float NewSkillCD; protected float NewSkillCdBuff; protected float NewPersonBuff; protected float NewCoinPerson; protected double NewUpgradeAmt; public SkillStatus ItemStatus { get { return ItemStatus_; } set { ItemStatus_ = value; if (ItemStatus_ == SkillStatus.Lock) { if (UnlockAheadCur == Current.Free) { ItemBtn.interactable = false; ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab4"), UnlockLv.ToString()); } else { ItemBtn.interactable = true; ManaLan.Add(ItemBtnLab, new LanStr("UI", "Fe_BtnLab0"), "\n", new LanStr("UI", "Fe_BtnLab4"), UnlockLv.ToString()); } } else if (ItemStatus_ == SkillStatus.UnLock) { ItemBtn.interactable = true; 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) { ItemBtn.interactable = true; ItemBtnLab.text = Language.GetStr("UI", "Fe_BtnLab2") + "\n" + ImageParse(UpgradeCur) + Auxiliary.ShrinkNumberStr(NewUpgradeAmt); } } } public SkillStatus ItemStatus_; #endregion public Ability(XmlAttributeCollection attribute) { #region 配置 ID_ = int.Parse(attribute[0].Value); Icon_ = attribute[20].Value; Anim = attribute[21].Value; Label = attribute[22].Value; UnlockPos = attribute[12].Value; UpgradeCD = attribute[18].Value; UpgradeFml = attribute[15].Value; UpgradePlus = attribute[16].Value; UpgradePerson = attribute[17].Value; ItemIndex = Auxiliary.IntParse(attribute[3].Value,0); UnlockLv = Auxiliary.IntParse(attribute[7].Value,0); UnlockAmt = Auxiliary.FloatParse(attribute[11].Value,0); UnlockAheadAmt = Auxiliary.FloatParse(attribute[9].Value,0); SkillTab = SkillClassParse(attribute[2].Value); UpgradeAmt = UpgradeAmtParse(attribute[14].Value); UnlockCur = CurrentParse(attribute[10].Value); UpgradeCur = CurrentParse(attribute[13].Value); UnlockAheadCur = CurrentParse(attribute[8].Value); ValueBuffParse(out Person, out PersonBuff, attribute[5].Value); ValueBuffParse(out SkillCD, out SkillCdBuff, attribute[6].Value); ValueBuffParse(out CoinPerson, out Plus, attribute[4].Value); #endregion ValueBuffParse(out NewPerson, out NewPersonBuff, UpgradePerson); ValueBuffParse(out NewSkillCD, out NewSkillCdBuff, UpgradeCD); ValueBuffParse(out NewCoinPerson, out NewPlus, UpgradePlus); SkillType = SkillType.Ability; } public override void Annul() { if (ID == "Ability1") { ManaData.Person -= NewPerson; ManaData.CoinPerson -= NewCoinPerson; } else { ManaData.SkillPerson -= NewPerson; ManaData.SkillCoinPerson -= NewCoinPerson; } ManaData.SkillPlus -= NewPlus; ManaData.SkillPersonBuff -= NewPersonBuff; if (Math.Abs(NewSkillCD) > 0.0005f) { for (int i = 0; i < ManaData.SkillList.Count; i++) { ManaData.SkillList[i].ReceiveCool(-NewSkillCD, false, false); } } if (Math.Abs(NewSkillCdBuff) > 0.0005f) { for (int i = 0; i < ManaData.SkillList.Count; i++) { ManaData.SkillList[i].ReceiveCool(-NewSkillCdBuff, false, true); } } } public override void RegistValue(float elapse, List> useList, XmlAttributeCollection attribute) { Level = int.Parse(attribute[3].Value); ItemStatus = (SkillStatus)Enum.Parse(typeof(SkillStatus), attribute[2].Value); NewPlus = Plus; NewPerson = Person; NewSkillCD = SkillCD; NewSkillCdBuff = SkillCdBuff; NewPersonBuff = PersonBuff; NewCoinPerson = CoinPerson; NewUpgradeAmt = UpgradeAmt; ItemLab.text = Description(0); ItemBtn.onClick.AddListener(OnClick); if (ItemStatus == SkillStatus.Upgrade) { ManaDebug.Log(string.Format("技能{0}已解锁 等级 : {1}", Name, Level)); 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 NewPerson, Person, UpgradePerson, Level); UpgradeValue(ref NewSkillCD, SkillCD, UpgradeCD, Level); UpgradeValue(ref NewCoinPerson, CoinPerson, UpgradePlus, Level); UseA(); if (!string.IsNullOrEmpty(Anim)) { string[] strings = Anim.Split(','); if (strings.Length == 1) { ManaData.Elf += Level; } } } } public override void UpdateStatus() { if (ManaData.Level >= UnlockLv) { if (ItemStatus == SkillStatus.Lock) { ItemStatus = SkillStatus.UnLock; } } } public override void SwitchLanguage() { base.SwitchLanguage(); ItemBtnLab.text = Language.GetStr("UI", "Fe_BtnLab2") + "\n" + ImageParse(UpgradeCur) + Auxiliary.ShrinkNumberStr(NewUpgradeAmt); } protected void Unlock() { if (!ManaData.Pay(UnlockAmt, UnlockCur)) { return; } ManaDebug.Log(string.Format("技能{0}已解锁", Name)); if (UpgradeCur != Current.Free) { ItemStatus = SkillStatus.Upgrade; } else { throw new Exception(); } UseA(); UseB(); UseC(); } protected void OnClick() { if (ManaServer.Connect == false) { ManaReso.Get("Fg_Reconnect").TweenForCG(); return; } ManaReso.Get("Fe_Info").TweenForCG(); ManaReso.SetText("Fe_Tit", NameParse()); ManaReso.SetSprite("Fe_Icon", ItemIcon.sprite); 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)); if (UnlockCur == Current.Free) { ManaReso.SetText("Fe_BtnLab", string.Format("{0}", Language.GetStr("UI", "Fe_BtnLab1"))); } else { 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), Auxiliary.ShrinkNumberStr(NewUpgradeAmt))); ItemBtnLab.text = Language.GetStr("UI", "Fe_BtnLab2") + "\n" + ImageParse(UpgradeCur) + Auxiliary.ShrinkNumberStr(NewUpgradeAmt); ManaDebug.Log(string.Format("{0}升级 : {1}", Name, Level)); } ); } else { throw new Exception(); } } protected void Upgrade() { if (!ManaData.Pay(NewUpgradeAmt, UpgradeCur)) { return; } if (ID == "Ability1") { Level += 20; ManaData.Level += 20; } else { Level++; } Annul(); NewUpgradeAmt = Auxiliary.FmlParse(UpgradeFml, "a", NewUpgradeAmt.ToString()); UpgradeValue(ref NewPerson, Person, UpgradePerson, 1); UpgradeValue(ref NewSkillCD, SkillCD, UpgradeCD, 1); UpgradeValue(ref NewCoinPerson, CoinPerson, UpgradePlus, 1); UpgradeValue(ref NewPlus, Plus, UpgradePlus, 1); UpgradeValue(ref NewSkillCdBuff, UpgradeCD, 1); UpgradeValue(ref NewPersonBuff, PersonBuff, UpgradePerson, 1); UseA(); UseC(); } protected void UseA() { if (!string.IsNullOrEmpty(Anim)) { string[] strings = Anim.Split(','); if (strings.Length == 1) { ManaGarden.ElfList.Add((ObjType) Enum.Parse(typeof(ObjType), strings[0])); } else if (strings.Length > 1) { ManaReso.Get(strings[0], Folder.Scene, true, ManaReso.Get(strings[1]), false); } } if (ValidSlot == false) { ValidSlot = true; if (!string.IsNullOrEmpty(UnlockPos)) { for (int i = 0; i < int.Parse(UnlockPos); i++) { ManaGarden.UnlockSlot(); } } } ManaData.Person += NewPerson; ManaData.CoinPerson += NewCoinPerson; ManaData.SkillPlus += NewPlus; ManaData.SkillPersonBuff += NewPersonBuff; if (Math.Abs(NewSkillCD) > 0.0005f) { for (int i = 0; i < ManaData.SkillList.Count; i++) { ManaData.SkillList[i].ReceiveCool(NewSkillCD, false, false); } } if (Math.Abs(NewSkillCdBuff) > 0.0005f) { for (int i = 0; i < ManaData.SkillList.Count; i++) { ManaData.SkillList[i].ReceiveCool(NewSkillCdBuff, false, true); } } #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(SkillCD) > 0.0005f) { strb.AppendFormat(" 减少冷却上限{0}", SkillCD); } if (Math.Abs(SkillCdBuff) > 0.0005f) { strb.AppendFormat(" 减少冷却上限{0}%", SkillCdBuff*100); } if (!string.IsNullOrEmpty(UnlockPos)) { int amt = int.Parse(UnlockPos); strb.AppendFormat(" 解锁了{0}块土地", amt); } strb.Append(" 永久有效"); ManaDebug.Log(strb.ToString()); #endregion } protected void UseB() { if (!string.IsNullOrEmpty(Anim)) { string[] strings = Anim.Split(','); if (strings.Length == 1) { if (ManaGarden.PlantList.Count == 0) { return; } Flower flower = ManaGarden.PlantList.Random().Flower; flower.PlayAnim(ManaGarden.ElfList.Last(0)); ManaReso.Get