using System; using System.Collections.Generic; using System.Linq; using Wizard; using Wizard.Battle.Card; using Wizard.Battle.View.Vfx; public class SkillPreprocessRemoveAfterAction : SkillPreprocessBase { public int Count { get; private set; } = 1; public SkillPreprocessRemoveAfterAction(string args, SkillBase skill) { if (args.Length < 2 || args.First() != '(' || args.Last() != ')') { return; } args = args.Substring(1, args.Length - 2); string[] array = args.Split(':'); for (int i = 0; i < array.Length; i++) { string[] array2 = array[i].Split('='); switch (array2[0]) { case "skill_id": base.BanId = array2[1]; break; case "count": Count = int.Parse(array2[1]); break; case "is_individual": base.BanId = (long.Parse(base.BanId) + skill.IndividualId).ToString(); break; } } } public override bool IsRight(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool PreexecutionCheck = false) { return true; } public override VfxBase Start(BattlePlayerPair playerPair, SkillBase skill, SkillProcessor skillProcessor, SkillOptionValue optionValue, SkillConditionCheckerOption checkerOption) { SetUp(skill); return NullVfx.GetInstance(); } public override void Clone(SkillPreprocessBase source, SkillBase skill) { SetUp(skill); } private void SetUp(SkillBase skill) { BattleCardBase card = skill.SkillPrm.ownerCard; List sameBanIdSkills = new List(); if (base.BanId != string.Empty) { sameBanIdSkills = card.NormalSkills.Where((SkillBase s) => skill != s && s.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessRemoveAfterAction && p.BanId == base.BanId)).ToList(); sameBanIdSkills.AddRange(card.EvolutionSkills.Where((SkillBase s) => skill != s && s.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessRemoveAfterAction && p.BanId == base.BanId)).ToList()); IEnumerable source = sameBanIdSkills.SelectMany((SkillBase s) => s.PreprocessList.Where((SkillPreprocessBase p) => p is SkillPreprocessRemoveAfterAction && p.BanId == base.BanId)); for (int num = 0; num < source.Count(); num++) { (source.ElementAt(num) as SkillPreprocessRemoveAfterAction).DecrementCount(); } } SkillBase skillBase = card.NormalSkills.FirstOrDefault((SkillBase s) => skill != s && s.SkillPrm.buildInfo._previousSkillOwner != null && skill.SkillPrm.buildInfo == s.SkillPrm.buildInfo); if (skillBase != null) { sameBanIdSkills.Add(skillBase); } SkillBase skillBase2 = card.EvolutionSkills.FirstOrDefault((SkillBase s) => skill != s && s.SkillPrm.buildInfo._previousSkillOwner != null && skill.SkillPrm.buildInfo == s.SkillPrm.buildInfo); if (skillBase2 != null) { sameBanIdSkills.Add(skillBase2); } Func, SkillConditionCheckerOption, SkillProcessor, VfxBase> callStopOneTime = null; callStopOneTime = delegate(SkillBase _skill, List cards, SkillConditionCheckerOption _checkerOption, SkillProcessor skillProcessorOneTime) { DecrementCount(); skill.OnSkillEnd -= callStopOneTime; if (IsEnd()) { card.NormalSkills.Remove(skill); card.EvolutionSkills.Remove(skill); for (int i = 0; i < sameBanIdSkills.Count(); i++) { SkillBase removeSkill = sameBanIdSkills.ElementAt(i); card.NormalSkills.Remove(removeSkill); card.EvolutionSkills.Remove(removeSkill); if (removeSkill.GetAttachSkill != null && !(card is IVirtualBattleCard)) { StopSkill(removeSkill.GetAttachSkill, skillProcessorOneTime); } card.RemoveBuffInfo((BuffInfo b) => b.IsCopied && b.IsBuffGaveSkill(removeSkill)); } SkillBase originSkill = skill.GetAttachSkill; if (originSkill != null && !(card is IVirtualBattleCard) && !card.Skills.Any((SkillBase s) => s.GetAttachSkill != null && s.GetAttachSkill.IsSameSkill(originSkill))) { StopSkill(skill.GetAttachSkill, skillProcessorOneTime); } card.RemoveBuffInfo((BuffInfo b) => b.IsCopied && b.IsBuffGaveSkill(skill)); } return card.BattleCardView.InitializeBattleCardIcon(card, card.Skills); }; skill.OnSkillEnd += callStopOneTime; } public void DecrementCount() { Count--; } public bool IsEnd() { return Count <= 0; } }