using System.Collections.Generic; using System.Linq; using Wizard.Battle.UI; using Wizard.Battle.View.Vfx; public class Skill_attack_count : SkillBase { public class CardPair { public BattleCardBase card { get; private set; } public int Sub { get; private set; } public BuffInfo buffInfo { get; private set; } public CardPair(BattleCardBase card, int sub, BuffInfo buffInfo) { this.card = card; Sub = sub; this.buffInfo = buffInfo; } } private const int NULL_COUNT = -1; private const string ATTACK_COUNT_RECOVERY = "recovery"; public bool IsRecovery => base.OptionValue.GetString(SkillFilterCreator.ContentKeyword.attack_count) == "recovery"; public Skill_attack_count(SkillParameter skillPrm, string option) : base(skillPrm, option) { } public int GetSetAttackCount() { if (!IsRecovery) { return base.OptionValue.GetInt(SkillFilterCreator.ContentKeyword.attack_count, -1); } return -1; } private int GetAddAttackCount() { return base.OptionValue.GetInt(SkillFilterCreator.ContentKeyword.add_attack_count, -1); } public bool IsSetAttackCount() { return GetSetAttackCount() != -1; } public bool IsAddAttackCount() { return GetAddAttackCount() != -1; } public override VfxWithLoading Start(CallParameter parameter) { bool isRecovery = IsRecovery; int num = (IsAddAttackCount() ? GetAddAttackCount() : GetSetAttackCount()); VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(); CallOnChangeMaxAttackableCount(parameter.targetCards.ToList()); foreach (BattleCardBase targetCard in parameter.targetCards) { BattleCardBase battleCardBase = targetCard; if (num != -1) { BuffInfo buffInfo = (IsBattleLog ? AddBuffInfoIfNeeded(targetCard) : null); int maxAttackableCount = targetCard.MaxAttackableCount; int intValue = (IsAddAttackCount() ? num : (num - maxAttackableCount)); vfxWithLoadingSequential.RegisterToMainVfx(battleCardBase.SkillApplyInformation.GiveAttackCount(this, num)); BuffInfoContainer buffInfoContainer = new BuffInfoContainer(battleCardBase, buffInfo, intValue, "", null, 0L); SetOnLoseEvent(battleCardBase, buffInfo, buffInfoContainer); base.buffInfoContainer.Add(buffInfoContainer); } if (isRecovery) { vfxWithLoadingSequential.RegisterToMainVfx(battleCardBase.RecoveryAttackCount()); } } vfxWithLoadingSequential.RegisterVfxWithLoading(CreateSkillEffect(base.SkillPrm.resourceMgr, parameter.targetCards)); if (IsBattleLog) { if (isRecovery) { BattleLogManager.GetInstance().AddLogSkillAttackCountRecovery(parameter.targetCards.ToList(), this); } else { BattleLogManager.GetInstance().AddLogSkillGain(parameter.targetCards.ToList(), this, SkillGainType.AttackCount, num); } } return vfxWithLoadingSequential; } public override VfxWithLoading Stop(SkillProcessor skillProcessor) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); parallelVfxPlayer.Register(base.Stop(skillProcessor)); List list = new List(); foreach (BuffInfoContainer item in buffInfoContainer) { list.Add(item._targetCard); item._targetCard.RemoveBuffInfo(item._buffInfo); parallelVfxPlayer.Register(item._targetCard.SkillApplyInformation.DepriveAttackCount(this)); } CallOnUpdateSkillEffect(list, updateAttackEffect: true); buffInfoContainer.Clear(); return VfxWithLoading.Create(parallelVfxPlayer); } public override void SetOnLoseEvent(BattleCardBase targetCard, BuffInfo buff, BuffInfoContainer container) { targetCard.OnLoseSkillOneTime += delegate(SkillBase loseSkill, SkillProcessor skillProcessor, BattleCardBase card) { card.RemoveBuffInfo(buff); buffInfoContainer.Remove(container); card.SkillApplyInformation.ForceDepriveAttackCount(); return NullVfx.GetInstance(); }; } protected virtual void CallOnChangeMaxAttackableCount(List targetCards) { } }