using System; using System.Collections.Generic; using System.Linq; using Cute; using UnityEngine; using Wizard; using Wizard.Battle; using Wizard.Battle.Player.Emotion; using Wizard.Battle.Resource; using Wizard.Battle.UI; using Wizard.Battle.View; using Wizard.Battle.View.Vfx; public abstract class BattlePlayerBase : IBattlePlayerReadOnlyInfo { public class TurnAndCard { public int Turn { get; private set; } public bool IsSelfTurn { get; private set; } public IReadOnlyBattleCardInfo Card { get; private set; } public bool IsTurnEnd { get; private set; } public TurnAndCard(int turn, bool isSelfTurn, IReadOnlyBattleCardInfo card, bool isTurnEnd) { Turn = turn; Card = card; IsSelfTurn = isSelfTurn; IsTurnEnd = isTurnEnd; } } public class CardAndId { public IReadOnlyBattleCardInfo Card { get; private set; } public int Id { get; private set; } public CardAndId(IReadOnlyBattleCardInfo card, int id) { Card = card; Id = id; } } public class CardAndTribe { public IReadOnlyBattleCardInfo Card { get; private set; } public List Tribes { get; private set; } public CardAndTribe(IReadOnlyBattleCardInfo card, List tribes) { Card = card; Tribes = tribes; } } public class CardAndValue { public IReadOnlyBattleCardInfo Card { get; private set; } public int Value { get; private set; } public CardAndValue(IReadOnlyBattleCardInfo card, int value) { Card = card; Value = value; } } public enum CARD_MANAGEMENT { NONE, DESTROY, BANISH, RETURN, FUSION_MATERIAL, GETON, GETOFF, SUMMON } public class SideLogInfo { public SkillBase Skill; public SideLogInfo(SkillBase skill) { Skill = skill; } } public class MyRotationBonusCondition { public MyRotationInfo.MyRotationBonus MyRotationBonus { get; } public int RemainingIncreaseAddPptotalTurn { get; private set; } public bool IsRemainIncreaseAddPptotalTurn { get; private set; } public int RemainingSkillCount { get; private set; } public bool IsRemainSkill { get; private set; } public MyRotationBonusCondition(MyRotationInfo.MyRotationBonus myRotationBonus) { MyRotationBonus = myRotationBonus; RemainingIncreaseAddPptotalTurn = myRotationBonus.IncreaseAddPptotalTurn; IsRemainIncreaseAddPptotalTurn = RemainingIncreaseAddPptotalTurn > 0; RemainingSkillCount = myRotationBonus.AttachAbilities.Length; IsRemainSkill = RemainingSkillCount > 0; } public void SetConditionInReplay(NetworkBattleReceiver.MyRotationBonusInfo bonusInfo) { RemainingIncreaseAddPptotalTurn = bonusInfo.RemainingIncreaseAddPptotalTurn; IsRemainIncreaseAddPptotalTurn = bonusInfo.IsRemainIncreaseAddPptotalTurn; RemainingSkillCount = bonusInfo.RemainingSkillCount; IsRemainSkill = bonusInfo.IsRemainSkill; } public bool GetAndReduceAddPpTurn() { bool num = RemainingIncreaseAddPptotalTurn > 0; if (num) { RemainingIncreaseAddPptotalTurn--; } return num; } public void ReduceSkillCount() { RemainingSkillCount--; } public void UseUpAddPpTotalBonus() { IsRemainIncreaseAddPptotalTurn = RemainingIncreaseAddPptotalTurn > 0; } public void UseUpSkill() { IsRemainSkill = RemainingSkillCount > 0; } } public class AvatarBattleDescInfo { public string DescText; public string Cost; public List ReplaySkillDescriptionValueList; public AvatarBattleDescInfo(string descText, string cost) { DescText = descText; Cost = cost; ReplaySkillDescriptionValueList = new List(); } } public enum CEMETERY_TYPE { NORMAL, FIELD_RETURN_HAND_OVER, DECK_DRAW_HAND_OVER } public class SummonInfo { public bool IsPlayer { get; private set; } public SkillBaseSummon.SummonedCardsList SummonedCardsList { get; private set; } public SkillBaseSummon.SUMMON_TYPE SummonType { get; private set; } public bool IsReanimate { get; private set; } public bool IsDeckSelfSummon { get; private set; } public SummonInfo(bool isPlayer, SkillBaseSummon.SummonedCardsList summonedCardsList, SkillBaseSummon.SUMMON_TYPE summonType, bool isReanimate = false, bool isDeckSelfSummon = false) { IsPlayer = isPlayer; SummonedCardsList = summonedCardsList; SummonType = summonType; IsReanimate = isReanimate; IsDeckSelfSummon = isDeckSelfSummon; } } public const int MAX_PP = 10; public List SelfDiscardList = new List(); protected BattlePlayerBase _opponentBattlePlayer; private List _skillList = new List(); protected IBattlePlayerVfxCreator m_vfxCreator; protected readonly IInnerOptionsBuilder _innerOptionsBuilder; private int _ppTotal; protected int m_EpTotal; private const int MAX_BP = 99; public bool CantPlayChoiceBrave; public HashSet PredictionWarningCards = new HashSet(); public Func OnTurnStartSkillAfter; public Func OnTurnEndSkillAfter; public Action OnTurnStartComplete; public Action OnPreTurnEndComplete; public Action OnPostTurnEndComplete; public Action OnEndOneSkillProcess; public List BonusConditionList; public List BossRushSpecialSkillList; public AvatarBattleDescInfo AvatarBattlePassiveSkillDescInfo; public List ChoiceBraveSkillDescInfoList; public const int MAX_NUM_HAND_CARDS = 9; public const int MAX_NUM_IN_PLAY_CARDS_WITH_CLASS = 6; public const int MAX_NUM_IN_PLAY_CARDS = 5; protected int _gameUsedEpCount; protected int _turnUsedEpCount; private const string TOKEN_EFFECT_PATH = "cmn_token_draw_1"; public BattleManagerBase BattleMgr { get; protected set; } public virtual bool IsGameFirst => false; public BattleCamera BattleCamera { get; private set; } public BackGroundBase BackGround { get; private set; } protected DataMgr _dataMgr { get; set; } public virtual bool IsPlayer => true; public virtual int Turn { get { if (!BattleMgr.IsFirst) { return BattleMgr.SecondTurn; } return BattleMgr.FirstTurn; } set { if (BattleMgr.IsFirst) { BattleMgr.FirstTurn = value; } else { BattleMgr.SecondTurn = value; } } } public int Pp { get; set; } public int PpTotal { get { return _ppTotal; } set { _ppTotal = value; } } public int EpTotal { get { return m_EpTotal; } set { m_EpTotal = value; } } public int CurrentEpCount { get; private set; } public int EvolveWaitTurnCount { get; set; } public bool NowTurnEvol { get; set; } public bool IsEpEvolveThisTurn { get; set; } public bool IsEvolve { get { if (NowTurnEvol && CurrentEpCount > 0) { return EvolveWaitTurnCount <= 0; } return false; } } public bool IsExceptionEvolve { get { if (NowTurnEvol && EvolveWaitTurnCount <= 0) { return InPlayCards.Any((BattleCardBase c) => !c.IsEvolution && CheckNotConsumeEpCard(c)); } return false; } } public int GameUsedEpCount => _gameUsedEpCount; public int TurnUsedEpCount => _turnUsedEpCount; public int Bp { get; private set; } public bool IsAlreadyChoiceBraveInThisTurn { get; set; } = true; public bool IsChoiceBraveEffectTiming { get; set; } public List ChoiceBraveCards { get { List list = new List(); SkillBase skillBase = Class.Skills.FirstOrDefault((SkillBase s) => s.OnWhenChoiceBrave != 0); if (skillBase == null) { return list; } List list2 = SkillOptionValue.ParseOptionTokenID(skillBase.OptionValue.GetOption(SkillFilterCreator.ContentKeyword.card_id, "_OPT_NULL_")).ToList(); for (int num = 0; num < list2.Count(); num++) { BattleCardBase item = BattleManagerBase.GetIns().CreateTransformCardRegisterVfx(Class, list2[num], IsPlayer, null, isRecoveryFinish: false, isChoice: true); list.Add(item); } return list; } } public bool CanPlayAnyChoiceBraveCard { get { if (IsAlreadyChoiceBraveInThisTurn) { return false; } List choiceBraveCards = ChoiceBraveCards; for (int i = 0; i < choiceBraveCards.Count(); i++) { if (choiceBraveCards[i].CanPlayAsChoiceBraveCard) { return true; } } return false; } } public virtual bool CanChoiceBraveThisTurn { get { if (!IsAlreadyChoiceBraveInThisTurn) { return IsChoiceBraveEffectTiming; } return false; } } public virtual bool CanChoiceBrave { get { if (CanChoiceBraveThisTurn && CanPlayAnyChoiceBraveCard && BattleView.IsTouchable()) { return !BattleView.IsSelecting; } return false; } } public BattleCardBase LowestCostChoiceBraveCard => ChoiceBraveCards.OrderBy((BattleCardBase c) => c.Cost).FirstOrDefault(); public bool IsShortageDeckLose { get; protected set; } public bool IsShortageDeckWin => Class.SkillApplyInformation.IsShortageDeckWin; public bool IsChangeShortageDeck { get { if (!Class.SkillApplyInformation.IsShortageDeckWin) { return Class.Skills.Any((SkillBase s) => s.OnWhenShortageDeck != 0); } return false; } } public List HandCardList { get; private set; } public List DeckCardList { get; private set; } public List BattleStartDeckCardList { get; set; } public List DeckSkillCardList { get; private set; } public List ClassAndInPlayCardList { get; private set; } public List CemeteryList { get; private set; } public List BanishList { get; set; } public List FusionIngredientList { get; set; } public List TurnFusionCards { get; set; } public List NecromanceZoneList { get; set; } public List DiscardedCardList { get; set; } public List FusionIngredientAndDiscardedCardList { get; set; } public List ReservedCardList { get; set; } public List UniteList { get; set; } public List GetOnList { get; set; } public List BlackHole { get; set; } public List ChoiceBraveCardList { get; set; } public List PredictionCemeteryRandomCards { get; private set; } public List PredictionDamageRandomCards { get; private set; } public List PredictionBanishRandomCards { get; private set; } public virtual IStatusPanelControl StatusPanelControl { get { if ((bool)BattleView.StatusParentPanel) { return BattleView.StatusParentPanel.GetComponent(); } return new NullStatusPanelControl(); } } public IClassInfomationUI _classInfomationUI { get; protected set; } public ClassInformationUIController ClassInformationUIController { get; protected set; } public bool IsBuffDetail { get { if (IsShowBuffDetail || IsRecordingBuffDetail) { return !IsRecordingExceptBuffDetail; } return false; } } public bool IsShowBuffDetail { get; set; } public bool IsRecordingBuffDetail { get; set; } public bool IsRecordingExceptBuffDetail { get; set; } public SideLogInfo SideLogSkill { get; set; } protected BattleCardBase _class { get; set; } public HandControl HandControl => BattleView.HandControl; public abstract IBattlePlayerView BattleView { get; } public abstract IEmotion Emotion { get; } public bool IsSelfTurn { get; set; } public List ReturnList { get; set; } public List> LastTargetCardsList { get; set; } public List InHandCards { get; set; } public List SkillDiscards { get; set; } public List SkillBanishCards { get; set; } public List HealingCards { get; set; } public List SkillSummonedCards { get; set; } public List SummonedCards { get; set; } public BattleCardBase DrewSkillCard { get; set; } public BattleCardBase ReturnSkillCard { get; set; } public List EvolvedCards { get; set; } public List DestroyedWhenDestroyCards { get; set; } public List TurnPlayCardCountInfo { get; set; } public List TurnFusionCountInfo { get; set; } public List TurnEvolveCardCountInfo { get; set; } public int TurnNecromanceCount { get; set; } public int GameNecromanceCount { get; set; } public int GameUsedPpCount { get; set; } public BattleCardBase CardOnPlay { get; set; } public List TurnPlayCards { get; set; } public List TurnDrawCards { get; set; } public List TurnDrawTokenCardsWithId { get; set; } public List GameDrawCards { get; set; } public List GameDrawTokenCards { get; set; } public List GameAddUpdateDeckCards { get; set; } public List GameSummonCards { get; set; } public List GameSummonMomentTribe { get; set; } public List GamePlayMomentTribe { get; set; } public List GamePlayMomentSpellChargeCards { get; set; } public List GameUpdateDeckMomentTribe { get; set; } public List GamePlayCards { get; set; } public List GameTurnPlayCards { get; set; } public List GameEnhancePlayCards { get; set; } public List GameCrystallizedPlayCards { get; set; } public List GameLeftCards { get; set; } public List GameTurnLeftCards { get; set; } public List GameReturnedCards { get; set; } public List GameSuperSkyboundArtCards { get; set; } public List GameInplayMetamorphoseCards { get; set; } public List OkSkillInProcess { get; set; } public List TurnDestroyCards { get; set; } public List TurnWhenHealingCount { get; set; } public List GameBurialRiteCards { get; set; } public List TurnBurialRiteCards { get; set; } public List BurialRiteOrDiscardCardHandIndexList { get; set; } public List GameReanimatedCards { get; set; } protected List AddToDeckCardList { get; set; } public List TurnStartLifeList { get; protected set; } public int RallyCount { get; protected set; } public int DeckBanishCount { get; protected set; } public int GameResonanceStartCount { get; set; } public int TurnResonanceStartCount { get; set; } public int GameUsedWhiteRitualCount { get; set; } public int LastInplayWhiteRitualStack { get; set; } public List GameSkillReturnCardCountList { get; set; } public List GameSkillDiscardCountList { get; set; } public List GameSkillBuffCountList { get; set; } public List GameSkillMetamorphoseCountList { get; set; } public int GameSkillDiscardCount { get; set; } public List GameQuickAttackCards { get; set; } public IEnumerable SkillInfoDeckCards => ConvertToSkillInfoCollection(DeckCardList); public IEnumerable SkillInfoBattleStartDeckCards => ConvertToSkillInfoCollection(BattleStartDeckCardList); public IEnumerable SkillInfoHandCards => ConvertToSkillInfoCollection(HandCardList); public IEnumerable SkillInfoClassAndInPlayCards => ConvertToSkillInfoCollection(ClassAndInPlayCardList); public IEnumerable SkillInfoCemeterys => ConvertToSkillInfoCollection(CemeteryList); public IEnumerable SkillInfoBanishCards => ConvertToSkillInfoCollection(BanishList); public IEnumerable SkillInfoFusionIngredientList => ConvertToSkillInfoCollection(FusionIngredientList); public IEnumerable SkillInfoTurnFusionCards => ConvertToSkillInfoCollection(TurnFusionCards); public IEnumerable SkillInfoNecromanceZoneCards => ConvertToSkillInfoCollection(NecromanceZoneList); public IEnumerable SkillInfoInPlayCards => ConvertToSkillInfoCollection(InPlayCards); public IEnumerable> SkillInfoLastTargets => ConvertToSkillInfoCollectionList(LastTargetCardsList); public IEnumerable SkillInfoDiscards => ConvertToSkillInfoCollection(SkillDiscards); public IEnumerable SkillInfoDiscardedCards => ConvertToSkillInfoCollection(DiscardedCardList); public IEnumerable SkillInfoFusionIngredientAndDiscardedCards => ConvertToSkillInfoCollection(FusionIngredientAndDiscardedCardList); public IEnumerable SkillInfoReturnedCards => GameReturnedCards; public IEnumerable SkillInfoHealingCards => ConvertToSkillInfoCollection(HealingCards); public IEnumerable SkillInfoSkillSummonedCards => ConvertToSkillInfoCollection(SkillSummonedCards); public IEnumerable SkillInfoEvolvedCards => ConvertToSkillInfoCollection(EvolvedCards); public IEnumerable SkillInfoDestroyedWhenDestroyCards => ConvertToSkillInfoCollection(DestroyedWhenDestroyCards); public IEnumerable SkillInfoTurnPlayCards => ConvertToSkillInfoCollection(TurnPlayCards); public IEnumerable SkillInfoTurnDrawCards => ConvertToSkillInfoCollection(TurnDrawCards); public IEnumerable SkillInfoTurnDrawTokenCardsWithId => TurnDrawTokenCardsWithId; public IEnumerable SkillInfoGameSummonCards => GameSummonCards; public IEnumerable SkillInfoGamePlayCards => ConvertToSkillInfoCollection(GamePlayCards); public IEnumerable SkillInfoGameTurnPlayCards => GameTurnPlayCards; public IEnumerable SkillInfoGameEnhancePlayCards => GameEnhancePlayCards; public IEnumerable SkillInfoGameCrystallizedPlayCards => ConvertToSkillInfoCollection(GameCrystallizedPlayCards); public IEnumerable SkillInfoGameSkillActivated => ConvertToSkillInfoCollection(ChoiceBraveCardList); public IEnumerable SkillInfoInplayMetamorphosedCards => ConvertToSkillInfoCollection(GameInplayMetamorphoseCards); public IEnumerable SkillInfoGameBurialRiteCards => ConvertToSkillInfoCollection(GameBurialRiteCards); public IEnumerable SkillInfoTurnBurialRiteCards => ConvertToSkillInfoCollection(TurnBurialRiteCards); public IEnumerable SkillInfoGameReanimatedCards => GameReanimatedCards; public IEnumerable SkillInfoGameDrawCards => ConvertToSkillInfoCollection(GameDrawCards); public IEnumerable SkillInfoGameDrawTokenCards => ConvertToSkillInfoCollection(GameDrawTokenCards); public IEnumerable SkillInfoGameAddUpdateDeckCards => ConvertToSkillInfoCollection(GameAddUpdateDeckCards); public IEnumerable SkillInfoGameLeftCards => ConvertToSkillInfoCollection(GameLeftCards); public IEnumerable SkillInfoGameTurnLeftCards => GameTurnLeftCards; public IEnumerable SkillInfoGameSuperSkyboundArtCards => ConvertToSkillInfoCollection(GameSuperSkyboundArtCards); public IReadOnlyBattleCardInfo SkillInfoClass => Class; public IEnumerable SkillInfoGameQuickAttackCards => ConvertToSkillInfoCollection(GameQuickAttackCards); public AvatarBattleInfo AvatarBattleInfo { get; set; } public int extraTurnCount { get; set; } public bool IsExtraTurn => extraTurnCount > 0; public int cardTotalNum { get; set; } public bool IsShortageDeck { get; private set; } public int _cumulativeEvolutionCount { get; protected set; } public bool IsSkinEvolved { get { if (_dataMgr.IsEvolveSkin(IsPlayer)) { return _cumulativeEvolutionCount > 0; } return false; } } public IEnumerable AllCards { get { for (int i = 0; i < HandCardList.Count(); i++) { yield return HandCardList[i]; } for (int i = 0; i < ClassAndInPlayCardList.Count; i++) { yield return ClassAndInPlayCardList[i]; } for (int i = 0; i < DeckCardList.Count(); i++) { yield return DeckCardList[i]; } } } public List AllCardsWithCemeteryAndBanish { get { List list = AllCards.ToList(); list.AddRange(CemeteryList); list.AddRange(NecromanceZoneList); list.AddRange(BanishList); return list; } } public List AllCardsWithSkillIngredient { get { List list = AllCardsWithCemeteryAndBanish.ToList(); list.AddRange(FusionIngredientList); list.AddRange(GetOnList); list.AddRange(UniteList); list.AddRange(ReservedCardList); list.AddRange(BlackHole); return list; } } public IEnumerable InPlayCards { get { for (int i = 0; i < ClassAndInPlayCardList.Count; i++) { if (!(ClassAndInPlayCardList[i] is ClassBattleCardBase)) { yield return ClassAndInPlayCardList[i]; } } } } public BattleCardBase Class => _class; public event Action OnTurnStartStart; public event Func OnTurnStartFinish; public event Action OnTurnEndStart; public event Func OnTurnEnd; public event Func OnTurnEndFinish; public event Func OnTurnStartBeforeDraw; public event Func OnTurnStartAfterDraw; public event Action OnNecromance; public event Action OnPickCard; public event Action OnAfterPickCard; public event Action OnSetupClassEvent; public event Action OnSetupCardEvent; public event Func OnShortageDeck; public event Action> OnMulliganStart; public event Action, IEnumerable> OnMulliganEnd; public event Action OnClearDeck; public event Action OnChangePP; public event Action OnAddPpTotal; public event Action OnAddPp; public event Action OnAddBp; public event Action OnEpModifier; public event Action OnAddHandCardEvent; public event Action OnAddCemeteryEvent; public event Action OnAddPlayCardEvent; public event Action OnAddBanishEvent; public event Action OnAddDeckEvent; public event Action OnAddUniteEvent; public event Action OnSpellPlayEvent; public event Action OnFusion; public event Action OnGeton; public event Action, List, SkillBase> OnGetoff; public event Action, SkillBase> OnAddBlackHole; public event Action OnAfterReturnCardEvent; public event Func, VfxBase> OnAfterSummonCardEvent; public event Action OnAddHandCardAfterEvent; public event Func OnAddCemeteryAfterEvent; public event Action OnAddPlayCardAfterEvent; public event Action OnAddBanishAfterEvent; public event Action OnAddUniteAfterEvent; public event Action OnLeaveAfterEvent; public event Action OnSummonAfterEvent; public event Action OnMetamorphoseAfterEvent; public event Action> OnChangeDeckAfterEvent; public event Action, BattlePlayerBase, bool> OnDrawCards; public event Action, List, bool, bool, bool> OnTokenDrawCards; public event Action, bool> OnCreateReservedCards; public event Action, bool, bool, bool> OnUpdateDeck; public event Action OnIndexChange; public event Action, List, bool, bool, bool, bool, bool> OnSummonTokenCards; public event Action, bool, bool, bool, bool> OnSummonCards; public event Action, List, List, List, bool, bool, bool> OnCostChange; public event Action, bool, bool> OnRemoveCostChange; public event Action, int, int, int, int, int> OnPowerUp; public event Action OnPowerDownStart; public event Action, int, int, int, bool> OnPowerDown; public event Action> OnDeprivePowerUp; public event Action> OnDeprivePowerDown; public event Action, List> OnSpellCharge; public event Action OnDrain; public event Action OnSkillDamageStart; public event Action, List, List> OnDamage; public event Action, List> OnHeal; public event Action> OnDiscard; public event Action OnStartLeaveCard; public event Action OnDestroy; public event Action OnSkillDestroyOrBanish; public event Action OnBanish; public event Action OnPlayVoiceOnDeath; public event Action OnReturn; public event Action OnSkillReturn; public event Action> OnBeforeSkillEvolve; public event Action OnEvolveMeWhenAttack; public event Action> OnAfterSkillEvolve; public event Action OnPlayCard; public event Action OnWhenPlayEffect; public event Action, int> OnChantCountChange; public event Action OnChangeWhiteRitualStack; public event Action, int> OnChangeMaxAttackableCount; public event Action, int> OnMetamorphose; public event Action OnFusionMetamorphose; public event Action OnOpenCard; public event Action, BattleCardBase> OnUnite; public event Action OnRemoveLatestOperationJsonData; public event Action OnPlayComplete; public event Action OnEmotion; public event Action OnClearDestroyedCardList; public void SetCurrentEpCount(int setCount) { CurrentEpCount = setCount; } public void AddCurrentEpCount(int addCount = 1) { CurrentEpCount += addCount; } public void GainCurrentEpCount(int gainCount = 1) { CurrentEpCount -= gainCount; } public VfxBase SetBp(int value) { Bp = value; Bp = Math.Max(0, Bp); Bp = Math.Min(Bp, 99); return BattleView.SetBp(value); } public VfxBase AddBp(int value) { Bp += value; Bp = Math.Max(0, Bp); Bp = Math.Min(Bp, 99); return BattleView.SetBp(Bp); } public void SetIsShortageDeckLose(bool flag) { IsShortageDeckLose = flag; } public void ResetIsShortageDeck() { IsShortageDeck = false; } public void SetCumulativeEvolutionCount(int count) { _cumulativeEvolutionCount = count; } public int AddDamageByClassUseCard(string damageType) { if (Class != null) { int num = 0; for (int i = 0; i < Class.SkillApplyInformation.AddDamageList.Count; i++) { if (Class.SkillApplyInformation.AddDamageList[i] is AddDamageInfo addDamageInfo && addDamageInfo.IsEffective(damageType, Class.Clan, isUseClass: true)) { num += addDamageInfo.AddDamage; } } return num; } return 0; } protected BattlePlayerBase(BattleManagerBase battleMgr, BattleCamera battleCamera, BackGroundBase backGround, IInnerOptionsBuilder innerOptionsBuilder) { BattleMgr = battleMgr; _dataMgr = GameMgr.GetIns().GetDataMgr(); BattleCamera = battleCamera; BackGround = backGround; _innerOptionsBuilder = innerOptionsBuilder; Initialize(); HandCardList = new List(); DeckCardList = new List(); BattleStartDeckCardList = new List(); DeckSkillCardList = new List(); ClassAndInPlayCardList = new List(); CemeteryList = new List(); PredictionCemeteryRandomCards = new List(); PredictionDamageRandomCards = new List(); PredictionBanishRandomCards = new List(); BanishList = new List(); FusionIngredientList = new List(); TurnFusionCards = new List(); NecromanceZoneList = new List(); DiscardedCardList = new List(); FusionIngredientAndDiscardedCardList = new List(); ReservedCardList = new List(); UniteList = new List(); GetOnList = new List(); BlackHole = new List(); ChoiceBraveCardList = new List(); ReturnList = new List(); HealingCards = new List(); LastTargetCardsList = new List>(); SkillSummonedCards = new List(); SummonedCards = new List(); EvolvedCards = new List(); DestroyedWhenDestroyCards = new List(); InHandCards = new List(); SkillDiscards = new List(); SkillBanishCards = new List(); TurnPlayCards = new List(); TurnDrawCards = new List(); TurnDrawTokenCardsWithId = new List(); GameSummonCards = new List(); GameSummonMomentTribe = new List(); GamePlayMomentTribe = new List(); GamePlayMomentSpellChargeCards = new List(); GameUpdateDeckMomentTribe = new List(); GamePlayCards = new List(); GameTurnPlayCards = new List(); GameEnhancePlayCards = new List(); GameCrystallizedPlayCards = new List(); GameInplayMetamorphoseCards = new List(); GameBurialRiteCards = new List(); GameQuickAttackCards = new List(); TurnBurialRiteCards = new List(); BurialRiteOrDiscardCardHandIndexList = new List(); GameReanimatedCards = new List(); OkSkillInProcess = new List(); TurnDestroyCards = new List(); AddToDeckCardList = new List(); GameDrawCards = new List(); GameDrawTokenCards = new List(); GameAddUpdateDeckCards = new List(); TurnStartLifeList = new List(); TurnWhenHealingCount = new List(); TurnPlayCardCountInfo = new List(); TurnFusionCountInfo = new List(); TurnEvolveCardCountInfo = new List(); GameLeftCards = new List(); GameTurnLeftCards = new List(); GameReturnedCards = new List(); GameSuperSkyboundArtCards = new List(); GameSkillReturnCardCountList = new List(); GameSkillDiscardCountList = new List(); GameSkillBuffCountList = new List(); GameSkillMetamorphoseCountList = new List(); BonusConditionList = new List(); BossRushSpecialSkillList = new List(); ChoiceBraveSkillDescInfoList = new List(); NowTurnEvol = true; m_vfxCreator = CreateVfxCreator(); CreateSelfBattleCard(); _class = ClassAndInPlayCardList[0]; } protected abstract void Initialize(); protected abstract void CreateSelfBattleCard(); protected virtual IBattlePlayerVfxCreator CreateVfxCreator() { return new BattlePlayerVfxCreatorBase(BattleView); } public virtual VfxBase LoadResources(IBattleResourceMgr resourceMgr) { long sleeveId = (IsPlayer ? _dataMgr.GetPlayerSleeveId() : _dataMgr.GetEnemySleeveId()); return SequentialVfxPlayer.Create(resourceMgr.LoadSleeveMaterial(sleeveId, IsPlayer), ClassInformationUIController.LoadResources(StatusPanelControl.GetClassInfoAnchor(), IsPlayer)); } public virtual void Setup(BattlePlayerBase opponentBattlePlayer) { IsShortageDeckLose = false; extraTurnCount = 0; _cumulativeEvolutionCount = 0; _opponentBattlePlayer = opponentBattlePlayer; _opponentBattlePlayer.Class.ChangeClassClanParameter(); GameMgr ins = GameMgr.GetIns(); List list = new List(); BattleManagerBase ins2 = BattleManagerBase.GetIns(); if (IsPlayer) { int key = (IsPlayer ? ins.GetNetworkUserInfoData().GetSelfChaosId() : ins.GetNetworkUserInfoData().GetOpponentChaosId()); if (Data.Master.ClassInfomationOrder != null && Data.Master.ClassInfomationOrder.ContainsKey(key)) { List value = new List(); int num = 1; Data.Master.ClassInfomationOrder.TryGetValue(key, out value); for (int i = 0; i < value.Count; i++) { list.Add(CreateClassInfomationUI(num, value.Count, value[i])); num++; } } else if (ins.GetDataMgr().GetPlayerSubClassId() != 10) { int num2 = 1; List crossOverClassInfoListOrNull = Data.Master.GetCrossOverClassInfoListOrNull(ins.GetDataMgr().GetPlayerClassId(), ins.GetDataMgr().GetPlayerSubClassId()); if (crossOverClassInfoListOrNull == null || crossOverClassInfoListOrNull.Count <= 0) { list.Add(CreateClassInfomationUI()); } else { for (int j = 0; j < crossOverClassInfoListOrNull.Count; j++) { list.Add(CreateClassInfomationUI(num2, crossOverClassInfoListOrNull.Count, crossOverClassInfoListOrNull[j])); num2++; } } } else if (Data.CurrentFormat == Format.Avatar) { int key2 = ((ins2 is NetworkBattleManagerBase) ? int.Parse(ins.GetNetworkUserInfoData().GetSelfAvatarBattleId()) : ins.GetDataMgr().GetPlayerCharaId()); List value2 = new List(); Data.Master.AvatarClassInformationOrder.TryGetValue(key2, out value2); for (int k = 0; k < value2.Count; k++) { list.Add(CreateClassInfomationUI(k + 1, value2.Count, value2[k])); } } else if (ins2.IsPuzzleMgr) { int playerClass = (ins2 as PuzzleBattleManager).PuzzleQuestData.BattleData.PlayerClass; list.Add(CreateClassInfomationUI(1, 1, playerClass)); } else { list.Add(CreateClassInfomationUI()); } } else if (ins.GetDataMgr().GetEnemySubClassId() != 10) { int num3 = 1; List crossOverClassInfoListOrNull2 = Data.Master.GetCrossOverClassInfoListOrNull(ins.GetDataMgr().GetEnemyClassId(), ins.GetDataMgr().GetEnemySubClassId()); if (crossOverClassInfoListOrNull2 == null || crossOverClassInfoListOrNull2.Count <= 0) { list.Add(CreateClassInfomationUI()); } else { for (int l = 0; l < crossOverClassInfoListOrNull2.Count; l++) { list.Add(CreateClassInfomationUI(num3, crossOverClassInfoListOrNull2.Count, crossOverClassInfoListOrNull2[l])); num3++; } } } else if (Data.CurrentFormat == Format.Avatar && ins2 is NetworkBattleManagerBase) { int key3 = int.Parse(ins.GetNetworkUserInfoData().GetOpponentAvatarBattleId()); List value3 = new List(); Data.Master.AvatarClassInformationOrder.TryGetValue(key3, out value3); for (int m = 0; m < value3.Count; m++) { list.Add(CreateClassInfomationUI(m + 1, value3.Count, value3[m])); } } else { list.Add(CreateClassInfomationUI()); } ClassInformationUIController = new ClassInformationUIController(list); ClassInformationUIController.SetUpEvent(this); SetUpClassEvent(); foreach (BattleCardBase deckCard in DeckCardList) { SetupCardEvent(deckCard); } foreach (BattleCardBase handCard in HandCardList) { SetupCardEvent(handCard); } foreach (BattleCardBase classAndInPlayCard in ClassAndInPlayCardList) { SetupCardEvent(classAndInPlayCard); } OnNecromance += delegate(BattleCardBase necromanceCard, SkillProcessor skillProcessor, int necromanceCount, bool isFusion) { List list2 = ClassAndInPlayCardList.ToList(); list2.AddRange(DeckSkillCardList); foreach (BattleCardBase item in list2) { item.Necromance(necromanceCard, skillProcessor, necromanceCount); } if (BattleMgr is NetworkBattleManagerBase networkBattleManagerBase) { networkBattleManagerBase.RegisterActionManager.Add(new RegisterPlayerParameter(RegisterActionBase.ActionBaseParameter.cemetery, -1 * necromanceCount, necromanceCard.IsPlayer)); } }; Emotion.OnPlay += (ClassCharaPrm.EmotionType emoteType) => opponentBattlePlayer.Emotion.ReceiveOpponentEmotion(emoteType); OnNecromance += delegate { BattleMgr.VfxMgr.RegisterImmediateVfx(InstantVfx.Create(delegate { StatusPanelControl.SetGrave(CemeteryList.Count((BattleCardBase c) => !c.IsClass)); UpdateHandCardsPlayability(); })); }; OnAddPlayCardAfterEvent += delegate { UpdateStatusPanelHandCount(); }; OnAddHandCardAfterEvent += delegate { UpdateStatusPanelHandCount(); }; OnAddCemeteryAfterEvent += delegate { UpdateStatusPanelHandCount(); return NullVfx.GetInstance(); }; OnAddCemeteryAfterEvent += delegate { BattleMgr.VfxMgr.RegisterImmediateVfx(InstantVfx.Create(delegate { if (StatusPanelControl != null) { StatusPanelControl.SetGrave(CemeteryList.Count((BattleCardBase c) => !c.IsClass)); } })); return InstantVfx.Create(delegate { UpdateHandCardsPlayability(); }); }; OnAddBanishAfterEvent += delegate { UpdateHandCardsPlayability(); UpdateStatusPanelHandCount(); }; OnAddUniteAfterEvent += delegate { UpdateHandCardsPlayability(); UpdateStatusPanelHandCount(); }; OnChangeDeckAfterEvent += delegate(int previousCount, SkillProcessor skillProcessor, List summonCards) { if (previousCount % 2 == 1 && DeckCardList.Count % 2 == 0) { int gameResonanceStartCount = GameResonanceStartCount; GameResonanceStartCount = gameResonanceStartCount + 1; gameResonanceStartCount = TurnResonanceStartCount; TurnResonanceStartCount = gameResonanceStartCount + 1; StartSkillWhenResonanceStart(skillProcessor, summonCards); } }; OnChangeDeckAfterEvent += delegate { DeckSkillCardList.RemoveAll((BattleCardBase c) => !c.IsInDeck); }; OnMulliganEnd += delegate { DeckSkillCardList.RemoveAll((BattleCardBase c) => !c.IsInDeck); }; OnTurnStartComplete = (Action)Delegate.Combine(OnTurnStartComplete, new Action(AddToDeckCardIndexChange)); OnTurnStartComplete = (Action)Delegate.Combine(OnTurnStartComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvent)); OnPostTurnEndComplete = (Action)Delegate.Combine(OnPostTurnEndComplete, new Action(AddToDeckCardIndexChange)); OnPreTurnEndComplete = (Action)Delegate.Combine(OnPreTurnEndComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvent)); } private void UpdateStatusPanelHandCount() { if (StatusPanelControl != null && HandCardList != null) { StatusPanelControl.SetHandCount(HandCardList.Count); } } public void UpdateStatusPanel(int handCount, int cemeteryCount, int deckCount) { if (StatusPanelControl != null) { StatusPanelControl.SetHandCount(handCount); StatusPanelControl.SetGrave(cemeteryCount); StatusPanelControl.SetDeck(deckCount); } } public virtual IClassInfomationUI CreateClassInfomationUI(int orderCount = 1, int totalInfoNum = 1, int clanId = -1) { if (clanId == -1) { clanId = (IsPlayer ? _dataMgr.GetPlayerClassId() : _dataMgr.GetEnemyClassId()); } IBattlePlayerView battlePlayerView = (IsPlayer ? BattleView : _opponentBattlePlayer.BattleView); IBattlePlayerView battleEnemyView = (IsPlayer ? _opponentBattlePlayer.BattleView : BattleView); switch ((CardBasePrm.ClanType)clanId) { case CardBasePrm.ClanType.MIN: return new ElfInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.ROYAL: return new RoyalInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.WITCH: if (IsPlayer || totalInfoNum > 1) { return new WitchInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); } return new ClassInfomationUIBase(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.DRAGON: return new DragonInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.NECRO: return new NecromanceInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.VAMPIRE: return new VampireInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); case CardBasePrm.ClanType.BISHOP: return new BishopInfomationUI(this, battlePlayerView, battleEnemyView, orderCount, totalInfoNum); case CardBasePrm.ClanType.NEMESIS: return new NemesisInfomationUI(this, battlePlayerView, orderCount, totalInfoNum); default: return new ClassInfomationUIBase(this, battlePlayerView, orderCount, totalInfoNum); } } public VfxBase Recovery() { return SequentialVfxPlayer.Create(ClassInformationUIController.LoadResources(StatusPanelControl.GetClassInfoAnchor(), IsPlayer), InstantVfx.Create(delegate { ClassInformationUIController.ShowInfomation(playEffect: false); })); } public abstract void SetupClone(BattlePlayerBase sourceBattlePlayer, BattlePlayerBase virtualOpponentBattlePlayer, CloneActualFlags cloneFlags); public void SetupActionProcessorEvent(ActionProcessor processor) { processor.OnBeforePlayCard += delegate(BattleCardBase originalCard, BattleCardBase card, IEnumerable selectedCards) { if (!card.IsChoiceBraveSkillCard) { AddCurrentTrunPlayCount(1); CardOnPlay = card; TurnPlayCards.Add(card); GamePlayCards.Add(card); GameTurnPlayCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, card, BattleMgr.IsTurnEnd)); GamePlayMomentTribe.Add(new CardAndTribe(card, card.Tribe)); if (card.HasSpellCharge) { GamePlayMomentSpellChargeCards.Add(card); } if (card.CheckConditionFixedUseCost(isPrePlay: true)) { GameEnhancePlayCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, card, BattleMgr.IsTurnEnd)); } if (card.TransformInfo.Type == BattleCardBase.TransformType.Crystallize) { GameCrystallizedPlayCards.Add(card); } if (!BattleMgr.IsVirtualBattle) { BattleLogManager.GetInstance().AddLogDestFollower(BattleLogWindow.BattleLogType.PlayCardLog, card); } BattleView.HandView.RemoveCardFromView(card.BattleCardView, 0.3f); } }; processor.OnAfterFusion += delegate { AddToDeckCardIndexChange(); return NullVfx.GetInstance(); }; processor.OnPlayComplete = (Action)Delegate.Combine(processor.OnPlayComplete, new Action(AddToDeckCardIndexChange)); processor.OnPlayComplete = (Action)Delegate.Combine(processor.OnPlayComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvent)); processor.OnPlayComplete = (Action)Delegate.Combine(processor.OnPlayComplete, this.OnPlayComplete); processor.OnPlayComplete = (Action)Delegate.Combine(processor.OnPlayComplete, (Action)delegate { CardOnPlay = null; }); processor.OnEvolutionComplete = (Action)Delegate.Combine(processor.OnEvolutionComplete, new Action(AddToDeckCardIndexChange)); processor.OnEvolutionComplete = (Action)Delegate.Combine(processor.OnEvolutionComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvolutionEvent)); processor.OnAttackComplete = (Action)Delegate.Combine(processor.OnAttackComplete, new Action(AddToDeckCardIndexChange)); processor.OnAttackComplete = (Action)Delegate.Combine(processor.OnAttackComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvent)); if (GameMgr.GetIns().IsWatchBattle && !GameMgr.GetIns().IsReplayBattle) { processor.OnFusionComplete = (Action)Delegate.Combine(processor.OnFusionComplete, new Action(BattleMgr.DetailMgr.DetailPanelControl.UpdateCardDescriptionOnEvent)); } } private void SetUpClassEvent() { this.OnSetupClassEvent.Call(); } public virtual void SetupCardEvent(BattleCardBase card) { if (card.IsUnit) { card.OnEvolveEvent += delegate(bool isSkill) { EvolveProcess(card, isSkill); }; } this.OnSetupCardEvent.Call(card); if (card.IsSpell) { card.OnPlay += () => RemoveSpellCardFromHand(card); card.OnFinishWhenPlaySkill += () => AddSpellCardToCemetery(card); } card.OnRemoveFromInPlayAfterOneTime += (bool flg, SkillProcessor skillProcessorOneTime) => flg ? NullVfx.GetInstance() : card.SkillApplyInformation.AllSkillEffectStop(); } public virtual BattleCardBase CreateCard(int cardId, int cardIndex, bool isChoiceBrave = false) { BattleCardBase battleCardBase = CardCreatorBase.CreateCard(cardId, IsPlayer, cardIndex, BattleManagerBase.GetIns().SBattleLoad, BattleMgr, BattleManagerBase.GetIns().BattleResourceMgr, _innerOptionsBuilder, isChoiceBrave); SetupCardEvent(battleCardBase); return battleCardBase; } public BattleCardBase CreateVirtualCard(int cardId, int cardIndex) { BattleCardBase battleCardBase = CardCreatorBase.CreateVirtualCard(cardId, cardIndex, IsPlayer, BattleMgr, this, _opponentBattlePlayer, _innerOptionsBuilder); SetupCardEvent(battleCardBase); return battleCardBase; } public BattleCardBase CreateNextIndexCard(int cardId, bool isChoiceBrave = false) { BattleCardBase result = CreateCard(cardId, cardTotalNum, isChoiceBrave); if (!isChoiceBrave) { cardTotalNum++; } return result; } public VfxBase CardManagement(BattleCardBase card, SkillProcessor skillProcessor, CARD_MANAGEMENT management, bool isRandom, List fusionCards = null, BattleCardBase vehicleCard = null, SkillBase skill = null, SummonInfo summonInfo = null, bool isOpen = false) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); switch (management) { case CARD_MANAGEMENT.DESTROY: if (card.SkillApplyInformation.IsBanishByDestroy && card.SkillApplyInformation.IsDestroyByBanish) { sequentialVfxPlayer.Register(DestroyManagement(card, skillProcessor, isRandom, skill)); } else if (!card.SkillApplyInformation.IsBanishByDestroy && card.SkillApplyInformation.IsDestroyByBanish) { if (card.SkillApplyInformation.IsIndestructible && card.IsDestroyedBySkill) { card.ResetFlagCardAsDestroyed(); } else { sequentialVfxPlayer.Register(BanishManagement(card, skillProcessor, skill, isReturn: false, isRandom, isOpen)); } } else { sequentialVfxPlayer.Register(DestroyManagement(card, skillProcessor, isRandom, skill)); } break; case CARD_MANAGEMENT.BANISH: if (card.SkillApplyInformation.IsBanishByDestroy && card.SkillApplyInformation.IsDestroyByBanish) { sequentialVfxPlayer.Register(DestroyManagement(card, skillProcessor, isRandom, skill)); } else if (card.SkillApplyInformation.IsBanishByDestroy && !card.SkillApplyInformation.IsDestroyByBanish) { sequentialVfxPlayer.Register(DestroyManagement(card, skillProcessor, isRandom, skill)); } else { sequentialVfxPlayer.Register(BanishManagement(card, skillProcessor, skill, isReturn: false, isRandom, isOpen)); } break; case CARD_MANAGEMENT.RETURN: GameReturnedCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, card, BattleMgr.IsTurnEnd)); card.SetReturnedSkill(skill); if (card.SkillApplyInformation.IsReturnByBanish && card.SkillApplyInformation.IsBanishByDestroy) { if (card.SkillApplyInformation.IsIndestructible) { sequentialVfxPlayer.Register(ReturnCardManagement(card, skillProcessor, skill)); break; } card.FlagCardAsDestroyedBySkill(); sequentialVfxPlayer.Register(DestroyManagement(card, skillProcessor, isRandom, skill)); } else if (card.SkillApplyInformation.IsReturnByBanish) { sequentialVfxPlayer.Register(BanishManagement(card, skillProcessor, skill, isReturn: true, isRandom, isOpen)); } else { sequentialVfxPlayer.Register(ReturnCardManagement(card, skillProcessor, skill)); } break; case CARD_MANAGEMENT.FUSION_MATERIAL: sequentialVfxPlayer.Register(Fusion(card, fusionCards, skillProcessor)); break; case CARD_MANAGEMENT.GETON: sequentialVfxPlayer.Register(GetOnCardManagement(card, skillProcessor, vehicleCard, skill)); break; case CARD_MANAGEMENT.GETOFF: return GetOffCardManagement(summonInfo, skillProcessor, vehicleCard, skill); case CARD_MANAGEMENT.SUMMON: return SummonCardManagement(summonInfo, skillProcessor, skill); } return sequentialVfxPlayer; } public void CallOnSummonTokenCards(BattleCardBase card, List summonCards, List overflowCards, bool isSelf, bool isOwnerEffect, bool isIgnoreVoice, bool isRandomVoice, bool isEvoVoice) { this.OnSummonTokenCards.Call(card, summonCards, overflowCards, isSelf, isOwnerEffect, isIgnoreVoice, isRandomVoice, isEvoVoice); } public void CallOnSummonCards(BattleCardBase card, List cards, bool isSelf, bool isDeckSelf, bool isIgnoreVoice, bool isBurialRite = false) { this.OnSummonCards.Call(card, cards, isSelf, isDeckSelf, isIgnoreVoice, isBurialRite); } protected VfxBase Fusion(BattleCardBase fusionCard, List ingredientCards, SkillProcessor skillProcessor) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); if (!fusionCard.IsFusionable) { return sequentialVfxPlayer; } if (!GameMgr.GetIns().IsAdminWatch && !GameMgr.GetIns().IsReplayBattle) { BattleLogManager.GetInstance().AddFusionIngredients(fusionCard, isCreateClone: false); } if (!BattleMgr.IsVirtualBattle && !BattleMgr.IsRecovery) { sequentialVfxPlayer.Register(BattleView.CreateBeforeFusionVfx(fusionCard, ingredientCards)); } new SkillConditionCheckerOption(); SkillProcessor.ProcessInfo processInfo = fusionCard.Skills.CreateWhenFusionMetamorphoseInfo(ingredientCards, skillProcessor, new BattlePlayerPair(fusionCard.SelfBattlePlayer, fusionCard.OpponentBattlePlayer)); skillProcessor.Register(processInfo); bool flag = processInfo != null; ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); foreach (BattleCardBase ingredientCard in ingredientCards) { parallelVfxPlayer.Register(UseFusionIngredientManagement(ingredientCard, fusionCard, skillProcessor, isRandom: false, flag)); } sequentialVfxPlayer.Register(parallelVfxPlayer); TurnFusionCards.Add(fusionCard); AddCurrentTurnFusionCount(1); if (GameMgr.GetIns().IsAdminWatch || GameMgr.GetIns().IsReplayBattle) { BattleLogManager.GetInstance().AddFusionIngredients(fusionCard, isCreateClone: true); } BattleCardBase originalCard = fusionCard; fusionCard.CallOnFusionEvent(ingredientCards); sequentialVfxPlayer.Register(skillProcessor.Process(new BattlePlayerPair(this, _opponentBattlePlayer))); if (flag) { fusionCard = fusionCard.MetamorphoseCard; } sequentialVfxPlayer.Register(BattleView.ReturnActCardAfterFusion(fusionCard.BattleCardView, flag)); sequentialVfxPlayer.Register(InstantVfx.Create(delegate { ImmediateVfxMgr.GetInstance().Register(new ShowSideLogVfx(originalCard, null, originalCard.SelfBattlePlayer.BattleView.GetSideLogControl(isSkillTargetSelect: false), originalCard.GetCardSkillDescription(new SideLogInfo(null)), 3f)); })); VfxBase vfx = fusionCard.Fusion(skillProcessor, ingredientCards, flag); sequentialVfxPlayer.Register(vfx); VfxBase vfx2 = skillProcessor.Process(new BattlePlayerPair(this, _opponentBattlePlayer)); sequentialVfxPlayer.Register(vfx2); return sequentialVfxPlayer; } public VfxBase CardManagement(List cards, SkillProcessor skillProcessor, CARD_MANAGEMENT management, bool isRandom, SkillBase skill = null) { if (!BattleMgr.IsRecovery) { for (int i = 0; i < cards.Count; i++) { BurialRiteOrDiscardCardHandIndexList.Add(HandCardList.IndexOf(cards[i])); } } SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); if (management == CARD_MANAGEMENT.DESTROY) { sequentialVfxPlayer.Register(DestroyManagement(cards, skillProcessor, isRandom, skill)); } return sequentialVfxPlayer; } protected VfxBase DestroyManagement(BattleCardBase card, SkillProcessor skillProcessor, bool isRandom, SkillBase destroyedSkill = null) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); bool num = ClassAndInPlayCardList.Contains(card); bool flag = HandCardList.Contains(card); if (num) { this.OnStartLeaveCard.Call(); sequentialVfxPlayer.Register(DestroyCard(card, skillProcessor, isRandom, destroyedSkill)); sequentialVfxPlayer.Register(card.DestroyInPlay(skillProcessor, useDestroy: true, destroyedSkill)); this.OnDestroy.Call(card); } else if (flag) { sequentialVfxPlayer.Register(DestroyCard(card, skillProcessor, isRandom, destroyedSkill)); sequentialVfxPlayer.Register(DisCard(card, new List { card }, skillProcessor, destroyedSkill)); } return sequentialVfxPlayer; } protected VfxBase DestroyManagement(List cards, SkillProcessor skillProcessor, bool isRandom, SkillBase skill) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); if (HandCardList.Contains(cards.First())) { for (int i = 0; i < cards.Count; i++) { sequentialVfxPlayer.Register(DestroyCard(cards[i], skillProcessor, isRandom, skill)); } sequentialVfxPlayer.Register(DisCards(cards, skillProcessor, skill)); } return sequentialVfxPlayer; } protected VfxBase BanishManagement(BattleCardBase card, SkillProcessor skillProcessor, SkillBase skill, bool isReturn = false, bool isRandom = false, bool isOpen = false) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); bool num = InPlayCards.Contains(card); bool flag = HandCardList.Contains(card); bool flag2 = DeckCardList.Contains(card); this.OnStartLeaveCard.Call(); if (num) { card.SetBanishedInfo(BattleCardBase.BanishInfo.BanishPlace.Field); sequentialVfxPlayer.Register(card.SkillApplyInformation.AllSkillEffectStop()); sequentialVfxPlayer.Register(BanishCard(card, skillProcessor, isRandom, skill, isOpen)); sequentialVfxPlayer.Register(card.Banish(skillProcessor, isReturn)); } else if (flag) { card.SetBanishedInfo(BattleCardBase.BanishInfo.BanishPlace.Hand); sequentialVfxPlayer.Register(BanishCard(card, skillProcessor, isRandom, skill, isOpen)); VfxWithLoading vfxWithLoading = card.BanishInHand(skillProcessor); sequentialVfxPlayer.Register(vfxWithLoading.LoadingVfx); sequentialVfxPlayer.Register(vfxWithLoading.MainVfx); } else if (flag2) { card.SetBanishedInfo(BattleCardBase.BanishInfo.BanishPlace.Deck); sequentialVfxPlayer.Register(BanishCard(card, skillProcessor, isRandom, skill, isOpen)); sequentialVfxPlayer.Register(card.BanishInDeck(skillProcessor)); } this.OnBanish.Call(card); return sequentialVfxPlayer; } public VfxBase UseFusionIngredientManagement(BattleCardBase ingredientCard, BattleCardBase fusionCard, SkillProcessor skillProcessor, bool isRandom = false, bool isFusionMetamorphose = false) { if (FusionIngredientList.Any((BattleCardBase c) => c == fusionCard)) { return NullVfx.GetInstance(); } SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); VfxWithLoading vfxWithLoading = ingredientCard.FusionMaterialized(skillProcessor, fusionCard, isFusionMetamorphose); this.OnFusion.Call(ingredientCard); HandCardList.Remove(ingredientCard); CallSkill((IBattlePlayerSkill s) => s.StopBattleHandCard, ingredientCard); FusionIngredientList.Add(ingredientCard); FusionIngredientAndDiscardedCardList.Add(ingredientCard); if (isRandom) { PredictionBanishRandomCards.Add(ingredientCard); } this.OnAddBanishAfterEvent.Call(fusionCard); sequentialVfxPlayer.Register(ingredientCard.UnloadResource()); sequentialVfxPlayer.Register(vfxWithLoading.LoadingVfx); sequentialVfxPlayer.Register(vfxWithLoading.MainVfx); return sequentialVfxPlayer; } protected VfxBase ReturnCardManagement(BattleCardBase card, SkillProcessor skillProcessor, SkillBase skill) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); this.OnStartLeaveCard.Call(); sequentialVfxPlayer.Register(ReturnCard(card, skillProcessor, skill)); this.OnReturn.Call(card); return sequentialVfxPlayer; } protected VfxBase GetOnCardManagement(BattleCardBase getOnCard, SkillProcessor skillProcessor, BattleCardBase vehicleCard, SkillBase skill) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); vehicleCard.SkillApplyInformation.AddGetOnCard(getOnCard); getOnCard.DeathTypeInfo.LeaveByGetOn = true; sequentialVfxPlayer.Register(getOnCard.RemoveFromInPlay()); sequentialVfxPlayer.Register(CardToVehicleZone(getOnCard, skill)); SkillProcessor.ProcessInfo info = vehicleCard.Skills.CreateWhenGetOnInfo(skillProcessor, playerInfoPair); sequentialVfxPlayer.Register(getOnCard.RemoveFromInPlayAfter(skillProcessor)); sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(null, null, skillProcessor)); skillProcessor.Register(info); sequentialVfxPlayer.Register(getOnCard.GetOn(vehicleCard.BattleCardView.Transform, vehicleCard.BattleCardView, skillProcessor)); return sequentialVfxPlayer; } protected VfxBase GetOffCardManagement(SummonInfo summonInfo, SkillProcessor skillProcessor, BattleCardBase vehicleCard, SkillBase skill) { VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(); foreach (BattleCardBase summonedCard in summonInfo.SummonedCardsList.summonedCards) { vfxWithLoadingSequential.RegisterVfxWithLoading(summonedCard.SkillPlayCard(IsPlayer, SkillBaseSummon.SUMMON_TYPE.TOKEN, skillProcessor, skill, isGetoff: true)); } vfxWithLoadingSequential.RegisterToLoadingVfx(BattleMgr.LoadCardResources(summonInfo.SummonedCardsList.summonedCards.ToList())); vfxWithLoadingSequential.RegisterToLoadingVfx(BattleMgr.LoadCardResources(summonInfo.SummonedCardsList.overflowCards.ToList())); this.OnGetoff.Call(summonInfo.SummonedCardsList.summonedCards.ToList(), summonInfo.SummonedCardsList.overflowCards.ToList(), skill); vfxWithLoadingSequential.RegisterToMainVfx(StartSkillWhenChangeInplay(null, summonInfo.SummonedCardsList.summonedCards.ToList(), skillProcessor, isSummonCheck: false)); vehicleCard.GetOffCards.AddRange(summonInfo.SummonedCardsList.summonedCards); BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); skillProcessor.Register(vehicleCard.Skills.CreateWhenGetOffInfo(skillProcessor, playerInfoPair), ignoreOwnerDeadCheck: true); UpdateHandCardsPlayability(); return vfxWithLoadingSequential; } protected VfxBase SummonCardManagement(SummonInfo summonInfo, SkillProcessor skillProcessor, SkillBase skill) { VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); if (summonInfo.IsReanimate) { skillConditionCheckerOption.ReanimatedCards = ConvertToSkillInfoCollection(summonInfo.SummonedCardsList); } if (summonInfo.IsDeckSelfSummon) { skillConditionCheckerOption.DeckSelfSummonedCards = ConvertToSkillInfoCollection(summonInfo.SummonedCardsList); } foreach (BattleCardBase summonedCard in summonInfo.SummonedCardsList.summonedCards) { vfxWithLoadingSequential.RegisterVfxWithLoading(summonedCard.SkillPlayCard(summonInfo.IsPlayer, summonInfo.SummonType, skillProcessor, skill, isGetoff: false, summonInfo.IsReanimate)); } vfxWithLoadingSequential.RegisterToLoadingVfx(BattleMgr.LoadCardResources(summonInfo.SummonedCardsList.summonedCards.ToList())); SkillSummonedCards = new List(summonInfo.SummonedCardsList.summonedCards); SummonedCards = new List(summonInfo.SummonedCardsList.ToList()); vfxWithLoadingSequential.RegisterToLoadingVfx(BattleMgr.LoadCardResources(summonInfo.SummonedCardsList.overflowCards.ToList())); vfxWithLoadingSequential.RegisterToMainVfx(StartSkillWhenChangeInplay(null, summonInfo.SummonedCardsList.summonedCards.ToList(), skillProcessor, isSummonCheck: true, null, skillConditionCheckerOption)); for (int i = 0; i < SkillSummonedCards.Count; i++) { List list = new List(); for (int j = i + 1; j < SkillSummonedCards.Count; j++) { list.Add(SkillSummonedCards[j]); } StartSkillWhenSummonOther(SkillSummonedCards[i], skillProcessor, summonInfo.IsReanimate, list); } BattleCardBase[] array = summonInfo.SummonedCardsList.Where((BattleCardBase c) => c.IsInplay && c.IsUnit).ToArray(); for (int num = 0; num < array.Length; num++) { array[num].SelfBattlePlayer.AddRallyCount(1); } UpdateHandCardsPlayability(); return vfxWithLoadingSequential; } protected VfxBase DestroyCard(BattleCardBase destroyCard, SkillProcessor skillProcessor, bool isRandom, SkillBase skill) { bool flag = destroyCard.IsChantField && destroyCard.ChantCount <= 0; if (destroyCard.SkillApplyInformation.IsIndestructible && destroyCard.IsDestroyedBySkill && !flag && !destroyCard.DeathTypeInfo.MysteriesDestroy && (!destroyCard.IsTribe(CardBasePrm.TribeType.WHITE_RITUAL) || destroyCard.SkillApplyInformation.WhiteRitualCount > 0 || (!(destroyCard is FieldBattleCard) && !(destroyCard is ChantFieldBattleCard)))) { destroyCard.ResetFlagCardAsDestroyed(); if (!destroyCard.IsDead) { return NullVfx.GetInstance(); } } SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); if (skillProcessor != null) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); if (ClassAndInPlayCardList.Any((BattleCardBase c) => c == destroyCard)) { new SkillConditionCheckerOption().DestroyedCard = destroyCard; TurnDestroyCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, destroyCard, BattleMgr.IsTurnEnd)); GameLeftCards.Add(destroyCard); GameTurnLeftCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, destroyCard, BattleMgr.IsTurnEnd)); sequentialVfxPlayer.Register(destroyCard.RemoveFromInPlay()); sequentialVfxPlayer.Register(CardToCemetery(destroyCard, skill, CEMETERY_TYPE.NORMAL, isRandom)); SkillProcessor.ProcessInfo info = destroyCard.Skills.CreateWhenLeaveInfo(skillProcessor, playerInfoPair); VfxWith info2 = destroyCard.Skills.CreateWhenDestroyInfo(destroyCard, skillProcessor, playerInfoPair); if (destroyCard.HasSkillWhenDestroy && !DestroyedWhenDestroyCards.Any((BattleCardBase x) => x.Index == destroyCard.Index)) { DestroyedWhenDestroyCards.Add(destroyCard); } sequentialVfxPlayer.Register(destroyCard.RemoveFromInPlayAfter(skillProcessor)); sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(null, null, skillProcessor)); skillProcessor.Register(info, ignoreOwnerDeadCheck: true); skillProcessor.Register(info2.Value, ignoreOwnerDeadCheck: true); destroyCard.OnDestroy += (BattleCardBase _card, SkillProcessor _skillProcessor) => info2.Vfx; destroyCard.SetDestroyedBySkillList(skill); StartSkillWhenDestroyOther(destroyCard, skillProcessor); } else if (HandCardList.Any((BattleCardBase c) => c == destroyCard)) { skillProcessor.Register(destroyCard.Skills.CreateDisCardInfo(skillProcessor, playerInfoPair)); sequentialVfxPlayer.Register(CardToCemetery(destroyCard, skill)); } return sequentialVfxPlayer; } return CardToCemetery(destroyCard, skill); } protected VfxBase BanishCard(BattleCardBase banishedCard, SkillProcessor skillProcessor, bool isRandom, SkillBase skill, bool isOpen) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); new SkillConditionCheckerOption(); BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); if (InPlayCards.Any((BattleCardBase c) => c == banishedCard)) { SkillProcessor.ProcessInfo info = banishedCard.Skills.CreateWhenLeaveInfo(skillProcessor, playerInfoPair); SkillProcessor.ProcessInfo info2 = banishedCard.Skills.CreateWhenBanishInfo(banishedCard, skillProcessor, playerInfoPair); skillProcessor.Register(info, ignoreOwnerDeadCheck: true); skillProcessor.Register(info2, ignoreOwnerDeadCheck: true); sequentialVfxPlayer.Register(banishedCard.RemoveFromInPlay()); sequentialVfxPlayer.Register(CardToBanishZone(banishedCard, skill, registerEvent: true, isRandom, isOpen)); sequentialVfxPlayer.Register(banishedCard.RemoveFromInPlayAfter(skillProcessor)); StartSkillWhenBanishOther(banishedCard, skillProcessor, isInplay: true); } else if (HandCardList.Any((BattleCardBase c) => c == banishedCard)) { SkillProcessor.ProcessInfo info3 = banishedCard.Skills.CreateWhenBanishInfo(banishedCard, skillProcessor, playerInfoPair); skillProcessor.Register(info3, ignoreOwnerDeadCheck: true); sequentialVfxPlayer.Register(CardToBanishZone(banishedCard, skill, registerEvent: true, isRandom, isOpen)); StartSkillWhenBanishOther(banishedCard, skillProcessor, isInplay: false); } else if (DeckCardList.Any((BattleCardBase c) => c == banishedCard)) { SkillProcessor.ProcessInfo info4 = banishedCard.Skills.CreateWhenBanishInfo(banishedCard, skillProcessor, playerInfoPair); skillProcessor.Register(info4, ignoreOwnerDeadCheck: true); sequentialVfxPlayer.Register(CardToBanishZone(banishedCard, skill, registerEvent: true, isRandom, isOpen)); if (!BattleManagerBase.IsForecast) { sequentialVfxPlayer.Register(new DeckChangeVfx(this)); sequentialVfxPlayer.Register(new DummyDeckRemoveCardVfx(IsPlayer, 1)); } } sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(null, null, skillProcessor)); return sequentialVfxPlayer; } protected VfxBase ReturnCard(BattleCardBase targetCard, SkillProcessor skillProcessor, SkillBase skill) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); List list = new List(); bool flag = HandCardList.Count < 9; if (flag) { list.Add(targetCard); targetCard.DrawTurn = ((targetCard.SelfBattlePlayer.IsSelfTurn && !BattleMgr.IsTurnEnd) ? targetCard.SelfBattlePlayer.Turn : (targetCard.SelfBattlePlayer.Turn + 1)); } BattleCardBase battleCardBase = targetCard.VirtualClone(this, _opponentBattlePlayer); GameLeftCards.Add(battleCardBase); GameTurnLeftCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, battleCardBase, BattleMgr.IsTurnEnd)); skillConditionCheckerOption.InHandCard = ConvertToSkillInfoCollection(list); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); SequentialVfxPlayer sequentialVfxPlayer2 = SequentialVfxPlayer.Create(); List list2 = new List(); if (targetCard.SkillApplyInformation.IsSkillCantAtkAll) { list2.Add(targetCard); } SkillProcessor.ProcessInfo info = targetCard.Skills.CreateWhenLeaveInfo(skillProcessor, playerInfoPair); skillProcessor.Register(info, ignoreOwnerDeadCheck: true); SkillProcessor.ProcessInfo info2 = targetCard.Skills.CreateWhenReturnInfo(skillProcessor, playerInfoPair); sequentialVfxPlayer2.Register(targetCard.ReturnCard(skillProcessor)); parallelVfxPlayer.Register(ReturnToHand(targetCard, skill)); sequentialVfxPlayer2.Register(targetCard.RemoveFromInPlayAfter(skillProcessor, isReturn: true)); parallelVfxPlayer.Register(sequentialVfxPlayer2); this.OnAfterReturnCardEvent.Call(targetCard); this.OnLeaveAfterEvent.Call(targetCard); skillProcessor.Register(info2, ignoreOwnerDeadCheck: true); sequentialVfxPlayer.Register(parallelVfxPlayer); sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(new List { targetCard }, null, skillProcessor, isSummonCheck: true, flag ? ((Func)((SkillBase s) => s.OnWhenAddToHand)) : null, skillConditionCheckerOption)); StartSkillWhenReturnOther(targetCard, skillProcessor, list2); return sequentialVfxPlayer; } public VfxBase UniteCard(BattleCardBase destroyCard, SkillProcessor skillProcessor, SkillBase skill) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); new SkillConditionCheckerOption(); destroyCard.FlagCardAsDestroyedBySkill(); sequentialVfxPlayer.Register(CardToUniteZone(destroyCard, skill)); sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(null, null, skillProcessor)); return sequentialVfxPlayer; } protected virtual VfxBase DisCard(BattleCardBase ownerCard, List targetCards, SkillProcessor skillProcessor, SkillBase discardedSkill) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); for (int i = 0; i < targetCards.Count; i++) { parallelVfxPlayer.Register(targetCards[i].DestroyInHand(skillProcessor)); targetCards[i].SetDiscardedSkill(discardedSkill); } List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true, containsDeck: false, (BattleCardBase card) => card != ownerCard && card.Skills.Any((SkillBase s) => s.OnDisCardOtherStart != 0)); for (int num = 0; num < cardsOrderBySkillActivation.Count; num++) { skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateDisCardOtherInfo(targetCards, cardsOrderBySkillActivation[num].IsPlayer, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2)); } return SequentialVfxPlayer.Create(parallelVfxPlayer); } protected virtual VfxBase DisCards(List targetCards, SkillProcessor skillProcessor, SkillBase discardedSkill) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); parallelVfxPlayer.Register(InstantVfx.Create(delegate { BurialRiteOrDiscardCardHandIndexList.Clear(); })); for (int num = 0; num < targetCards.Count; num++) { parallelVfxPlayer.Register(targetCards[num].DestroyInHand(skillProcessor)); targetCards[num].SetDiscardedSkill(discardedSkill); } List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true, containsDeck: false, (BattleCardBase card) => !targetCards.Contains(card) && card.Skills.Any((SkillBase s) => s.OnDisCardOtherStart != 0)); for (int num2 = 0; num2 < cardsOrderBySkillActivation.Count; num2++) { skillProcessor.Register(cardsOrderBySkillActivation[num2].Skills.CreateDisCardOtherInfo(targetCards, cardsOrderBySkillActivation[num2].IsPlayer, skillProcessor, (cardsOrderBySkillActivation[num2].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2)); } return SequentialVfxPlayer.Create(parallelVfxPlayer); } protected virtual VfxBase ReturnToHand(BattleCardBase returnCard, SkillBase skill) { return FieldCardToHandCard(returnCard, skill); } public VfxBase StartBattleMainView(bool playEffect = true) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); parallelVfxPlayer.Register(CreateUpdateClassInfoVfx(playEffect)); for (int i = 0; i < InHandCards.Count; i++) { parallelVfxPlayer.Register(InHandCards.ToList()[i].BattleCardView.ShowHandCardInfo()); } return parallelVfxPlayer; } public virtual VfxBase TurnStart() { foreach (BattleCardBase handCard in HandCardList) { handCard.SetOnDraw(draw: true); } IsSelfTurn = true; _opponentBattlePlayer.IsSelfTurn = false; this.OnTurnStartStart.Call(); NowTurnEvol = true; IsEpEvolveThisTurn = false; TurnNecromanceCount = 0; TurnPlayCards.Clear(); TurnDrawCards.Clear(); TurnDrawTokenCardsWithId.Clear(); TurnBurialRiteCards.Clear(); TurnFusionCards.Clear(); if (!IsGameFirst || Turn != 1) { IsAlreadyChoiceBraveInThisTurn = false; } _turnUsedEpCount = 0; TurnStartLifeList.Add(new TurnAndIntValue(Class.Life, BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn)); _opponentBattlePlayer.TurnStartLifeList.Add(new TurnAndIntValue(_opponentBattlePlayer.Class.Life, BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn)); SkillProcessor skillProcessor = new SkillProcessor(); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); _ = PpTotal; GameMgr.GetIns().GetDataMgr(); int num = 0; IDetailPanelControl detailPanelControl = BattleMgr.DetailMgr.DetailPanelControl; if (EvolveWaitTurnCount <= 0) { for (int i = 0; i < BonusConditionList.Count; i++) { if (BonusConditionList[i].GetAndReduceAddPpTurn()) { BonusConditionList[i].UseUpAddPpTotalBonus(); if (detailPanelControl._card != null && detailPanelControl._card.IsClass && detailPanelControl._card.IsPlayer == IsPlayer) { detailPanelControl.UpdateBuffInfo(_class, BonusConditionList); } num += BonusConditionList[i].MyRotationBonus.IncreaseAddPptotalAmount; } } } int count = ((!Class.SkillApplyInformation.IsTurnStartFixedPP) ? (1 + num) : 0); VfxBase vfx = AddPpTotal(count, isUpdatePp: true, skillProcessor); sequentialVfxPlayer.Register(vfx); BattleLogManager.GetInstance().AddLogTurn(IsPlayer); BattleLogManager.GetInstance().BeginLogBlockTurnChangeReactive(); VfxBase[] allFuncCallResults = this.OnTurnStartBeforeDraw.GetAllFuncCallResults(skillProcessor); foreach (VfxBase vfx2 in allFuncCallResults) { sequentialVfxPlayer.Register(vfx2); } BattleCardBase[] array = HandCardList.ToArray(); BattleCardBase[] array2 = _opponentBattlePlayer.HandCardList.ToArray(); BattleCardBase[] array3 = ClassAndInPlayCardList.ToArray(); BattleCardBase[] array4 = _opponentBattlePlayer.ClassAndInPlayCardList.ToArray(); BattleCardBase[] array5 = DeckSkillCardList.ToArray(); BattleCardBase[] array6 = _opponentBattlePlayer.DeckSkillCardList.ToArray(); ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); BattleCardBase[] array7 = array; for (int j = 0; j < array7.Length; j++) { VfxBase vfx3 = array7[j].TurnStart(skillProcessor); parallelVfxPlayer.Register(vfx3); } array7 = array2; for (int j = 0; j < array7.Length; j++) { VfxBase vfx4 = array7[j].OpponentTurnStart(skillProcessor); parallelVfxPlayer.Register(vfx4); } array7 = array3; for (int j = 0; j < array7.Length; j++) { VfxBase vfx5 = array7[j].TurnStart(skillProcessor); parallelVfxPlayer.Register(vfx5); } array7 = array4; for (int j = 0; j < array7.Length; j++) { VfxBase vfx6 = array7[j].OpponentTurnStart(skillProcessor); parallelVfxPlayer.Register(vfx6); } array7 = array5; for (int j = 0; j < array7.Length; j++) { VfxBase vfx7 = array7[j].TurnStart(skillProcessor); parallelVfxPlayer.Register(vfx7); } array7 = array6; for (int j = 0; j < array7.Length; j++) { VfxBase vfx8 = array7[j].OpponentTurnStart(skillProcessor); parallelVfxPlayer.Register(vfx8); } BattleMgr.OperateMgr.CallOnUpdateAttackableEffect(array3.Where((BattleCardBase c) => c.Attackable).ToList(), array4.Where((BattleCardBase c) => c.Attackable).ToList()); sequentialVfxPlayer.Register(parallelVfxPlayer); BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); VfxBase vfx9 = skillProcessor.Process(battlePlayerPair); sequentialVfxPlayer.Register(vfx9); allFuncCallResults = OnTurnStartSkillAfter.GetAllFuncCallResults(skillProcessor); foreach (VfxBase vfx10 in allFuncCallResults) { sequentialVfxPlayer.Register(vfx10); } if (IsGameFirst && Turn == 1) { for (int num2 = 0; num2 < HandCardList.Count(); num2++) { HandCardList[num2].Skills.CreateAndRegisterWhenChangeInplaySelfhandInfo(HandCardList, skillProcessor, battlePlayerPair); } BattlePlayerPair playerInfoPair = new BattlePlayerPair(_opponentBattlePlayer, this); for (int num3 = 0; num3 < _opponentBattlePlayer.HandCardList.Count(); num3++) { _opponentBattlePlayer.HandCardList[num3].Skills.CreateAndRegisterWhenChangeInplaySelfhandInfo(_opponentBattlePlayer.HandCardList, skillProcessor, playerInfoPair); } } sequentialVfxPlayer.Register(TurnStartDraw(skillProcessor)); sequentialVfxPlayer.Register(skillProcessor.Process(battlePlayerPair)); BattleUIContainer battleUIContainer = BattleManagerBase.GetIns().BattleUIContainer; sequentialVfxPlayer.Register(InstantVfx.Create(delegate { battleUIContainer.EnableMenu(); })); sequentialVfxPlayer.Register(InstantVfx.Create(delegate { BattleMgr.BattlePlayer.TurnStartEffectEnd(); })); BattleLogManager.GetInstance().EndLogBlockTurnChangeReactive(); if (!BattleMgr.IsBattleEnd) { if (GameMgr.GetIns().IsNetworkBattle && IsPlayer) { NetworkBattleManagerBase networkBattleManagerBase = BattleManagerBase.GetIns() as NetworkBattleManagerBase; if (networkBattleManagerBase.turnEndTimeController != null) { networkBattleManagerBase.turnEndTimeController.AddTurnEndTimerLog("Player SetActiveVFX"); } } ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create(); parallelVfxPlayer2.Register(InstantVfx.Create(SetActive)); sequentialVfxPlayer.Register(parallelVfxPlayer2); } VfxBase allFuncVfxResults = this.OnTurnStartAfterDraw.GetAllFuncVfxResults(); sequentialVfxPlayer.Register(allFuncVfxResults); sequentialVfxPlayer.Register(InstantVfx.Create(delegate { foreach (BattleCardBase handCard2 in HandCardList) { handCard2.SetOnDraw(draw: false); } UpdateHandCardsPlayability(); })); sequentialVfxPlayer.Register(UpdateHandCardsCost()); sequentialVfxPlayer.Register(UpdateInPlayBattleCardIconLabel()); sequentialVfxPlayer.Register(this.OnTurnStartFinish.GetAllFuncVfxResults()); OnTurnStartComplete.Call(); return sequentialVfxPlayer; } public abstract VfxBase StartTurnControl(string log = ""); public SequentialVfxPlayer TurnEvolveControl(GameObject eqIcon) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); bool firstEvolve = false; if (EvolveWaitTurnCount > 0) { if (EvolveWaitTurnCount == 1) { firstEvolve = true; } EvolveWaitTurnCount--; } if (BattleMgr.IsRecovery || BattleMgr.IsPuzzleMgr) { sequentialVfxPlayer.Register(m_vfxCreator.CreateUpdateEp(CurrentEpCount, EvolveWaitTurnCount)); if (NowTurnEvol && CurrentEpCount > 0 && EvolveWaitTurnCount <= 0) { sequentialVfxPlayer.Register(new TurnStartEvolveVfx(eqIcon, firstEvolve)); } } else { sequentialVfxPlayer.Register(BattleMgr.LoadTurnPanelResource()); sequentialVfxPlayer.Register(m_vfxCreator.CreateUpdateEp(CurrentEpCount, EvolveWaitTurnCount)); sequentialVfxPlayer.Register(InstantVfx.Create(delegate { GameMgr.GetIns().GetSoundMgr().PlaySe(Se.TYPE.SYS_YOURTURN); BattleMgr.TurnPanelControl.StartUI(Turn, EvolveWaitTurnCount, IsPlayer); if (GameMgr.GetIns().IsWatchBattle || GameMgr.GetIns().IsReplayBattle) { BattleView.TurnEndButtonUI.GameObject.SetActive(value: true); BattleView.TurnEndButtonUI.ChangeButtonView(IsPlayer); } })); if (NowTurnEvol && CurrentEpCount > 0 && EvolveWaitTurnCount <= 0) { sequentialVfxPlayer.Register(new TurnStartEvolveVfx(eqIcon, firstEvolve)); } sequentialVfxPlayer.Register(WaitVfx.Create(1.6f)); } return sequentialVfxPlayer; } public virtual VfxBase TurnStartDraw(SkillProcessor skillProcessor) { DeckCardList.Sort((BattleCardBase a, BattleCardBase b) => a.Index - b.Index); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); if (!Class.IsDead && !_opponentBattlePlayer.Class.IsDead && !BattleManagerBase.GetIns().IsPuzzleMgr) { sequentialVfxPlayer.Register(TurnStartDrawCard(skillProcessor)); } return sequentialVfxPlayer; } protected abstract VfxBase TurnStartDrawCard(SkillProcessor skillProcessor); protected abstract void SetActive(); public abstract BattlePlayerBase CreateVirtualPlayer(); public VfxBase AddPpTotal(int count, bool isUpdatePp, SkillProcessor skillProcessor, BattleCardBase ownerCard = null, bool bySkill = false) { string text = ""; bool flag = false; if (Turn <= 1 && !IsPlayer) { flag = true; } if (flag) { text = text + "AddPpTotal " + count + "isUpdatePp " + isUpdatePp + "NotPPcounter " + Class.SkillApplyInformation.NotDecreasePPCounter + "IsTurnStartFixedPP " + Class.SkillApplyInformation.IsTurnStartFixedPP + ":" + StackTraceUtility.ExtractStackTrace(); } if (count < 0 && Class.SkillApplyInformation.NotDecreasePPCounter > 0) { if (flag) { LocalLog.AccumulateLastTraceLog(text); } return NullVfx.GetInstance(); } new SkillConditionCheckerOption(); ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); int ppTotal = PpTotal; PpTotal += count; if (PpTotal > 10) { PpTotal = 10; } else if (PpTotal < 0) { PpTotal = 0; } int num = PpTotal; if (flag) { text = text + "DecreaseList " + Class.SkillApplyInformation.DecreaseTurnStartPPList.Count; } for (int i = 0; i < Class.SkillApplyInformation.DecreaseTurnStartPPList.Count; i++) { if (flag) { text = text + "Decrease:" + Class.SkillApplyInformation.DecreaseTurnStartPPList[i]; } num -= Class.SkillApplyInformation.DecreaseTurnStartPPList[i]; if (num < 0) { num = 0; } } Pp = (isUpdatePp ? num : Math.Min(Pp, PpTotal)); if (flag) { text = text + "nowPP " + Pp; LocalLog.AccumulateLastTraceLog(text); } parallelVfxPlayer.Register(new PpChangeVfx(this)); this.OnChangePP.Call(PpTotal - ppTotal); this.OnAddPpTotal.Call(PpTotal - ppTotal, Pp, IsPlayer, ownerCard, bySkill); if (skillProcessor != null) { StartSkillWhenChangePPTotal(skillProcessor); } return parallelVfxPlayer; } public VfxBase SetPpTotal(int pp, bool isUpdatePp, SkillProcessor skillProcessor) { return AddPpTotal(pp - PpTotal, isUpdatePp, skillProcessor); } public SkillProcessor GetTurnEndSkillProcess() { SkillProcessor skillProcessor = new SkillProcessor(); List list = new List(); list.AddRange(HandCardList); list.AddRange(_opponentBattlePlayer.HandCardList); list.AddRange(ClassAndInPlayCardList); list.AddRange(_opponentBattlePlayer.ClassAndInPlayCardList); list.AddRange(DeckSkillCardList); list.AddRange(_opponentBattlePlayer.DeckSkillCardList); int num = list.Count(); for (int i = 0; i < num; i++) { list[i].TurnEndSkillProcess(skillProcessor); } return skillProcessor; } public virtual VfxBase TurnEnd() { BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); SequentialVfxPlayer turnEndVfx = SequentialVfxPlayer.Create(); if (this.OnTurnEndStart != null) { this.OnTurnEndStart.Call(); } BattleLogManager.GetInstance().BeginLogBlockTurnChangeReactive(); turnEndVfx.Register(BattleView.SetIsNowTurnEnd(flg: true)); SkillProcessor turnEndSkillProcess = GetTurnEndSkillProcess(); VfxBase vfx = turnEndSkillProcess.Process(battlePlayerPair); turnEndVfx.Register(vfx); List list = new List(); list.AddRange(ClassAndInPlayCardList); list.AddRange(_opponentBattlePlayer.ClassAndInPlayCardList); for (int i = 0; i < list.Count; i++) { list[i].CheckPreviousTurnAttacked(); } ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); foreach (BattleCardBase inPlayCard in InPlayCards) { parallelVfxPlayer.Register(inPlayCard.TurnEndPostProcess()); } turnEndVfx.Register(parallelVfxPlayer); VfxBase[] allFuncCallResults = this.OnTurnEnd.GetAllFuncCallResults(turnEndSkillProcess); foreach (VfxBase vfx2 in allFuncCallResults) { turnEndVfx.Register(vfx2); } allFuncCallResults = OnTurnEndSkillAfter.GetAllFuncCallResults(turnEndSkillProcess); foreach (VfxBase vfx3 in allFuncCallResults) { turnEndVfx.Register(vfx3); } turnEndVfx.Register(turnEndSkillProcess.Process(battlePlayerPair)); turnEndVfx.Register(UpdateInPlayBattleCardIconLabel()); turnEndVfx.Register(InstantVfx.Create(delegate { if (HandCardList.Count <= 0) { turnEndVfx.Register(BattleView.HandUnfocus()); } })); TurnPlayCards.Clear(); TurnDrawCards.Clear(); TurnDrawTokenCardsWithId.Clear(); TurnBurialRiteCards.Clear(); TurnFusionCards.Clear(); TurnNecromanceCount = 0; _turnUsedEpCount = 0; TurnResonanceStartCount = 0; _opponentBattlePlayer.TurnResonanceStartCount = 0; BattleLogManager.GetInstance().EndLogBlockTurnChangeReactive(); turnEndVfx.Register(BattleMgr.JudgeBattleResult()); if (!BattleMgr.IsRecovery) { turnEndVfx.Register(InstantVfx.Create(delegate { int count = ClassAndInPlayCardList.Count; for (int k = 0; k < count; k++) { BattleCardBase card = ClassAndInPlayCardList[k]; if (!card.BattleCardView.GameObject.activeSelf) { turnEndVfx.Register(InstantVfx.Create(delegate { card.BattleCardView.GameObject.SetActive(value: true); if (card.IsInplay) { card.SetOnDraw(draw: false); } })); } } })); } OnPreTurnEndComplete.Call(); if (!Class.IsDead && !_opponentBattlePlayer.Class.IsDead) { IsSelfTurn = false; VfxBase allFuncVfxResults = this.OnTurnEndFinish.GetAllFuncVfxResults(); turnEndVfx.Register(allFuncVfxResults); } OnPostTurnEndComplete.Call(); turnEndVfx.Register(BattleView.SetIsNowTurnEnd(flg: false)); LocalLog.RecordTurnEndIfLoadErrorOccured(); return turnEndVfx; } public void DecreasesExtraTurnCount() { extraTurnCount = Math.Max(0, extraTurnCount - 1); } public void Clear() { ClearSpineObject(); ClearClassAndMainPlace(); ClearBattleCount(); } protected void ClearSpineObject() { if (Class is ClassBattleCardBase classBattleCardBase) { classBattleCardBase.ClearSpineObject(); } } public void ClearClassAndMainPlace() { HandCardList.Clear(); DeckCardList.Clear(); BattleStartDeckCardList.Clear(); DeckSkillCardList.Clear(); ClassAndInPlayCardList.Clear(); } public void ClearBattleCount() { CemeteryList.Clear(); PredictionCemeteryRandomCards.Clear(); PredictionDamageRandomCards.Clear(); PredictionBanishRandomCards.Clear(); BanishList.Clear(); NecromanceZoneList.Clear(); UniteList.Clear(); GetOnList.Clear(); BlackHole.Clear(); ChoiceBraveCardList.Clear(); ReturnList.Clear(); HealingCards.Clear(); LastTargetCardsList.Clear(); SkillSummonedCards.Clear(); SummonedCards.Clear(); EvolvedCards.Clear(); DestroyedWhenDestroyCards.Clear(); InHandCards.Clear(); SkillDiscards.Clear(); SkillBanishCards.Clear(); DrewSkillCard = null; TurnPlayCards.Clear(); TurnDrawCards.Clear(); TurnDrawTokenCardsWithId.Clear(); GamePlayCards.Clear(); GameTurnPlayCards.Clear(); GameEnhancePlayCards.Clear(); GameCrystallizedPlayCards.Clear(); OkSkillInProcess.Clear(); TurnDestroyCards.Clear(); AddToDeckCardList.Clear(); GameSummonCards.Clear(); GameSummonMomentTribe.Clear(); GamePlayMomentTribe.Clear(); GamePlayMomentSpellChargeCards.Clear(); GameUpdateDeckMomentTribe.Clear(); GameDrawCards.Clear(); GameDrawTokenCards.Clear(); GameAddUpdateDeckCards.Clear(); GameQuickAttackCards.Clear(); TurnBurialRiteCards.Clear(); GameReanimatedCards.Clear(); TurnWhenHealingCount.Clear(); GameLeftCards.Clear(); GameTurnLeftCards.Clear(); GameReturnedCards.Clear(); GameSuperSkyboundArtCards.Clear(); TurnPlayCardCountInfo.Clear(); TurnFusionCountInfo.Clear(); TurnNecromanceCount = 0; GameNecromanceCount = 0; GameUsedPpCount = 0; RallyCount = 0; DeckBanishCount = 0; GameResonanceStartCount = 0; TurnResonanceStartCount = 0; GameUsedWhiteRitualCount = 0; LastInplayWhiteRitualStack = 0; _turnUsedEpCount = 0; GameSkillReturnCardCountList.Clear(); GameSkillDiscardCountList.Clear(); GameSkillBuffCountList.Clear(); GameSkillMetamorphoseCountList.Clear(); GameSkillDiscardCount = 0; DiscardedCardList.Clear(); FusionIngredientList.Clear(); FusionIngredientAndDiscardedCardList.Clear(); ReservedCardList.Clear(); TurnEvolveCardCountInfo.Clear(); GameInplayMetamorphoseCards.Clear(); GameBurialRiteCards.Clear(); TurnStartLifeList.Clear(); TurnFusionCards.Clear(); } public BattleCardBase FindCardFromGameObject(GameObject cardObject) { return AllCards.FirstOrDefault((BattleCardBase s) => s.BattleCardView.GameObject == cardObject); } protected void AddInplayCard(BattleCardBase card, bool isGetoff = false, bool isReanimate = false) { ClassAndInPlayCardList.Add(card); if (!card.IsClass && !isGetoff) { GameSummonCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, card, BattleMgr.IsTurnEnd)); GameSummonMomentTribe.Add(new CardAndTribe(card, card.Tribe)); if (isReanimate) { GameReanimatedCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, card, BattleMgr.IsTurnEnd)); } } } public void AddRallyCount(int addCount) { RallyCount += addCount; } public VfxBase PickCard(BattleCardBase unit, SkillBase skill, SkillBaseSummon.SUMMON_TYPE summonType = SkillBaseSummon.SUMMON_TYPE.HAND, bool isGetoff = false, bool isReanimate = false) { this.OnPickCard.Call(unit); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); switch (summonType) { case SkillBaseSummon.SUMMON_TYPE.HAND: HandCardToField(unit, skill); break; case SkillBaseSummon.SUMMON_TYPE.DECK: DeckCardToField(unit, skill); sequentialVfxPlayer.Register(new DeckChangeVfx(this)); sequentialVfxPlayer.Register(new DummyDeckRemoveCardVfx(IsPlayer, 1)); break; case SkillBaseSummon.SUMMON_TYPE.TOKEN: TokenToField(unit, skill, isGetoff, isReanimate); break; case SkillBaseSummon.SUMMON_TYPE.DESTROYED: DestroyedToField(unit, skill); break; } this.OnAfterPickCard.Call(); return sequentialVfxPlayer; } public virtual void HandCardToField(BattleCardBase targetCard, SkillBase skill = null) { BattleCardBase battleCardBase = HandCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); if (battleCardBase == null) { throw new Exception("Target card was not found in hand cards."); } this.OnAddPlayCardEvent.Call(battleCardBase, arg2: false, skill); AddInplayCard(battleCardBase); HandCardList.Remove(battleCardBase); CallSkill((IBattlePlayerSkill s) => s.StopBattleHandCard, battleCardBase); this.OnAddPlayCardAfterEvent.Call(); this.OnSummonAfterEvent.Call(battleCardBase); } private bool TokenToField(BattleCardBase targetCard, SkillBase skill, bool isGetoff = false, bool isReanimate = false) { if (InPlayCards.Count() < 6) { this.OnAddPlayCardEvent.Call(targetCard, isGetoff, skill); AddInplayCard(targetCard, isGetoff, isReanimate); this.OnSummonAfterEvent.Call(targetCard); return true; } return false; } public bool CemeteryConsumption(int num, BattleCardBase necromanceCard, SkillProcessor skillprocessor, bool isFusion) { if (CemeteryList.Count < num) { return false; } if (num == -1) { num = 0; } for (int i = 0; i < num; i++) { BattleCardBase item = CemeteryList.First(); NecromanceZoneList.Add(item); CemeteryList.Remove(item); } SuccessNecromance(necromanceCard, skillprocessor, num, isFusion); return true; } public void SuccessNecromance(BattleCardBase necromanceCard, SkillProcessor skillprocessor, int necromanceCount, bool isFusion) { int turnNecromanceCount = TurnNecromanceCount + 1; TurnNecromanceCount = turnNecromanceCount; GameNecromanceCount += necromanceCount; this.OnNecromance.Call(necromanceCard, skillprocessor, necromanceCount, isFusion); } public VfxBase GainCemetery(int gainCount) { if (gainCount > CemeteryList.Count()) { gainCount = CemeteryList.Count(); } for (int i = 0; i < gainCount; i++) { BattleCardBase item = CemeteryList.First(); NecromanceZoneList.Add(item); CemeteryList.Remove(item); } return this.OnAddCemeteryAfterEvent.GetAllFuncVfxResults(); } protected VfxBase FieldCardToHandCard(BattleCardBase targetCard, SkillBase skill) { BattleCardBase battleCardBase = ClassAndInPlayCardList.Single((BattleCardBase c) => c == targetCard); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); sequentialVfxPlayer.Register(battleCardBase.RemoveFromInPlay()); if (HandCardList.Count >= 9) { VfxBase vfx = CardToCemetery(battleCardBase, skill, CEMETERY_TYPE.FIELD_RETURN_HAND_OVER); sequentialVfxPlayer.Register(vfx); return sequentialVfxPlayer; } ClassAndInPlayCardList.Remove(battleCardBase); HandCardAddList(battleCardBase, NetworkBattleDefine.NetworkCardPlaceState.Field, skill); return sequentialVfxPlayer; } protected void HandCardAddList(BattleCardBase targetCard, NetworkBattleDefine.NetworkCardPlaceState fromState, SkillBase skill, bool isOpen = false) { InHandCards.Add(targetCard); this.OnAddHandCardEvent.Call(targetCard, fromState, isOpen, skill); HandCardList.Add(targetCard); CallSkill((IBattlePlayerSkill s) => s.StartBattleHandCard, targetCard); this.OnAddHandCardAfterEvent.Call(); } public VfxBase CardToCemetery(BattleCardBase targetCard, SkillBase skill, CEMETERY_TYPE cemeteryType = CEMETERY_TYPE.NORMAL, bool wasRandom = false) { if (CemeteryList.Any((BattleCardBase c) => c == targetCard)) { return NullVfx.GetInstance(); } BattleCardBase battleCardBase = ClassAndInPlayCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); BattleCardBase battleCardBase2 = HandCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); BattleCardBase battleCardBase3 = DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); if (battleCardBase == null && battleCardBase2 == null && battleCardBase3 == null) { return NullVfx.GetInstance(); } this.OnAddCemeteryEvent.Call(targetCard, cemeteryType, arg3: false, skill); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); BattleCardBase battleCardBase4 = null; if (battleCardBase != null) { ClassAndInPlayCardList.Remove(battleCardBase); battleCardBase4 = battleCardBase; if (battleCardBase.IsUnit && cemeteryType != CEMETERY_TYPE.FIELD_RETURN_HAND_OVER && !BattleMgr.IsVirtualBattle) { BattleLogManager.GetInstance().AddLogDestFollower(BattleLogWindow.BattleLogType.Destruction, battleCardBase); } } else { battleCardBase4 = ClassAndInPlayCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); } if (battleCardBase4 == null && battleCardBase2 != null) { HandCardList.Remove(battleCardBase2); CallSkill((IBattlePlayerSkill s) => s.StopBattleHandCard, battleCardBase2); battleCardBase4 = battleCardBase2; } if (battleCardBase4 == null && battleCardBase3 != null) { DeckCardList.Remove(battleCardBase3); sequentialVfxPlayer.Register(CreateUpdateDeckCountLabelVfx()); battleCardBase4 = battleCardBase3; } VfxBase vfxBase = NullVfx.GetInstance(); if (battleCardBase4 != null) { CemeteryList.Add(battleCardBase4); if (!battleCardBase4.IsClass) { vfxBase = battleCardBase4.UnloadResource(); sequentialVfxPlayer.Register(this.OnAddCemeteryAfterEvent.GetAllFuncVfxResults()); this.OnLeaveAfterEvent.Call(battleCardBase4); } if (wasRandom) { PredictionCemeteryRandomCards.Add(battleCardBase4); } } return SequentialVfxPlayer.Create(vfxBase, sequentialVfxPlayer); } public VfxBase CardToVehicleZone(BattleCardBase targetCard, SkillBase skill) { if (CemeteryList.Any((BattleCardBase c) => c == targetCard)) { return NullVfx.GetInstance(); } if (!ClassAndInPlayCardList.Any((BattleCardBase c) => c == targetCard)) { return NullVfx.GetInstance(); } SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); this.OnGeton.Call(targetCard, skill); ClassAndInPlayCardList.Remove(targetCard); GetOnList.Add(targetCard); sequentialVfxPlayer.Register(targetCard.UnloadResource()); return sequentialVfxPlayer; } public VfxBase DummyCardToCemetery(BattleCardBase targetCard, SkillBase skill = null) { this.OnAddCemeteryEvent.Call(targetCard, CEMETERY_TYPE.NORMAL, arg3: false, skill); CemeteryList.Add(targetCard); return this.OnAddCemeteryAfterEvent.GetAllFuncVfxResults(); } public VfxBase ClearDestroyedAndDiscardedCardList(SkillBase skill) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); int count = CemeteryList.Count; this.OnAddBlackHole.Call(CemeteryList, skill); this.OnAddBlackHole.Call(NecromanceZoneList, skill); BlackHole.AddRange(CemeteryList); BlackHole.AddRange(NecromanceZoneList); CemeteryList.Clear(); NecromanceZoneList.Clear(); DestroyedWhenDestroyCards.Clear(); for (int i = 0; i < DiscardedCardList.Count; i++) { FusionIngredientAndDiscardedCardList.Remove(DiscardedCardList[i]); } DiscardedCardList.Clear(); for (int j = 0; j < count; j++) { parallelVfxPlayer.Register(DummyCardToCemetery(CardCreatorBase.GetDummyInstance(), skill)); } return parallelVfxPlayer; } public VfxBase RemoveSpellCardFromHand(BattleCardBase targetSpellCard) { if (targetSpellCard.IsChoiceBraveSkillCard) { return NullVfx.GetInstance(); } BattleCardBase battleCardBase = HandCardList.SingleOrDefault((BattleCardBase c) => c == targetSpellCard); if (battleCardBase == null) { throw new Exception("Target card was not found in hand cards."); } this.OnSpellPlayEvent.Call(battleCardBase); HandCardList.Remove(battleCardBase); return NullVfx.GetInstance(); } public VfxBase AddSpellCardToCemetery(BattleCardBase targetSpellCard) { if (CemeteryList.Any((BattleCardBase c) => c == targetSpellCard)) { return NullVfx.GetInstance(); } if (!targetSpellCard.IsChoiceBraveSkillCard) { CemeteryList.Add(targetSpellCard); } else { ChoiceBraveCardList.Add(targetSpellCard); } BattleMgr.VfxMgr.RegisterImmediateVfx(this.OnAddCemeteryAfterEvent.GetAllFuncVfxResults()); return targetSpellCard.UnloadResource(); } public VfxBase CardToBanishZone(BattleCardBase targetCard, SkillBase skill, bool registerEvent = true, bool wasRandom = false, bool isOpen = false) { targetCard.DeathTypeInfo.BanishDestroy = true; if (BanishList.Any((BattleCardBase c) => c == targetCard)) { return NullVfx.GetInstance(); } if (registerEvent) { bool arg = isOpen || (skill is Skill_banish && skill.OnSelfTurnEndStart != 0 && skill.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => f.Text.Contains("hand_self"))); this.OnAddBanishEvent.Call(targetCard, skill, arg); } BattleCardBase battleCardBase = null; if (ClassAndInPlayCardList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { battleCardBase = ClassAndInPlayCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); ClassAndInPlayCardList.Remove(ClassAndInPlayCardList.SingleOrDefault((BattleCardBase c) => c == targetCard)); BattleCardBase battleCardBase2 = battleCardBase.VirtualClone(this, _opponentBattlePlayer); GameLeftCards.Add(battleCardBase2); GameTurnLeftCards.Add(new TurnAndCard(IsSelfTurn ? Turn : BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn, battleCardBase2, BattleMgr.IsTurnEnd)); } else if (HandCardList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { battleCardBase = HandCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); HandCardList.Remove(battleCardBase); CallSkill((IBattlePlayerSkill s) => s.StopBattleHandCard, battleCardBase); } else if (DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { battleCardBase = DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); if (battleCardBase == null) { throw new Exception("Target card was not found in either field, hand or deck."); } DeckCardList.Remove(battleCardBase); battleCardBase.SelfBattlePlayer.DeckBanishCount++; } if (battleCardBase == null) { return NullVfx.GetInstance(); } BanishList.Add(battleCardBase); SkillBanishCards.Add(battleCardBase); if (wasRandom) { PredictionBanishRandomCards.Add(battleCardBase); } this.OnAddBanishAfterEvent.Call(targetCard); this.OnLeaveAfterEvent.Call(targetCard); return battleCardBase.UnloadResource(); } public VfxBase CardToUniteZone(BattleCardBase targetCard, SkillBase skill) { targetCard.DeathTypeInfo.BanishDestroy = true; if (UniteList.Any((BattleCardBase c) => c == targetCard)) { return NullVfx.GetInstance(); } this.OnAddUniteEvent.Call(targetCard, skill); ClassAndInPlayCardList.Remove(targetCard); UniteList.Add(targetCard); this.OnAddUniteAfterEvent.Call(targetCard); this.OnLeaveAfterEvent.Call(targetCard); return targetCard.UnloadResource(); } private void DeckCardToField(BattleCardBase targetCard, SkillBase skill) { BattleCardBase battleCardBase = DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard); if (battleCardBase == null) { throw new Exception("Target card is not found from deck cards."); } this.OnAddPlayCardEvent.Call(battleCardBase, arg2: false, skill); AddInplayCard(battleCardBase); DeckCardList.Remove(battleCardBase); this.OnSummonAfterEvent.Call(battleCardBase); } private void DestroyedToField(BattleCardBase targetCard, SkillBase skill) { BattleCardBase battleCardBase = null; battleCardBase = CemeteryList.SingleOrDefault((BattleCardBase c) => c == targetCard); if (battleCardBase == null) { battleCardBase = NecromanceZoneList.SingleOrDefault((BattleCardBase c) => c == targetCard); } if (battleCardBase == null) { throw new Exception("Target card is not found from destroyed cards."); } this.OnAddPlayCardEvent.Call(battleCardBase, arg2: false, skill); AddInplayCard(battleCardBase); CemeteryList.Remove(battleCardBase); NecromanceZoneList.Remove(battleCardBase); this.OnSummonAfterEvent.Call(battleCardBase); } public virtual VfxBase CardDrawVfx(IEnumerable DrawList, bool skipShuffle = false, bool isOpenDrawSkill = false) { return NullVfx.GetInstance(); } private VfxBase DrawCard(BattleCardBase targetCard, SkillBase skill, bool isOpen = false, bool isToken = false, bool isReservation = false) { bool flag = false; if (!isToken && DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { DeckCardList.Remove(targetCard); if (!BattleMgr.IsVirtualBattle) { flag = true; StatusPanelControl.SetDeck(DeckCardList.Count); } } if (HandCardList.Count >= 9) { return NullVfx.GetInstance(); } if (isToken) { HandCardAddList(targetCard, isReservation ? NetworkBattleDefine.NetworkCardPlaceState.Reservation : NetworkBattleDefine.NetworkCardPlaceState.None, skill, isOpen); return CreateUpdateDeckCountLabelVfx(); } targetCard.ResetCardParameterInHand(); HandCardAddList(targetCard, NetworkBattleDefine.NetworkCardPlaceState.Deck, skill, isOpen); ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); if (DeckCardList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { DeckCardList.Remove(targetCard); parallelVfxPlayer.Register(InstantVfx.Create(delegate { StatusPanelControl.SetDeck(DeckCardList.Count); })); } else if (NecromanceZoneList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { NecromanceZoneList.Remove(targetCard); parallelVfxPlayer.Register(InstantVfx.Create(delegate { targetCard.BattleCardView.ResetCardView(targetCard.BaseParameter); })); } else if (CemeteryList.SingleOrDefault((BattleCardBase c) => c == targetCard) != null) { CemeteryList.Remove(targetCard); parallelVfxPlayer.Register(InstantVfx.Create(delegate { targetCard.BattleCardView.ResetCardView(targetCard.BaseParameter); })); } if (flag) { return parallelVfxPlayer; } return SequentialVfxPlayer.Create(parallelVfxPlayer, CreateUpdateDeckCountLabelVfx()); } public virtual VfxBase CreateUpdateDeckCountLabelVfx() { return InstantVfx.Create(delegate { StatusPanelControl.SetDeck(DeckCardList.Count); }); } protected virtual VfxBase CreateUpdateClassInfoVfx(bool playEffect) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); parallelVfxPlayer.Register(InstantVfx.Create(delegate { StatusPanelControl.SetHandCount(HandCardList.Count); })); parallelVfxPlayer.Register(InstantVfx.Create(delegate { ClassInformationUIController.ShowInfomation(playEffect); })); return parallelVfxPlayer; } private void EvolveProcess(BattleCardBase card, bool isSkill) { if (!CheckNotConsumeEpCard(card)) { GainCurrentEpCount(card.SkillApplyInformation.GetEp()); _gameUsedEpCount += card.SkillApplyInformation.GetEp(); _turnUsedEpCount += card.SkillApplyInformation.GetEp(); } if (!isSkill) { _cumulativeEvolutionCount++; } } public bool UseEpCount(int count) { if (CurrentEpCount >= count) { GainCurrentEpCount(count); _gameUsedEpCount += count; _turnUsedEpCount += count; return true; } return false; } public VfxBase AddDeckTokenCards(List cards, SkillProcessor skillProcessor, string updateType, SkillBase skill, bool isOpen) { if (updateType == "change") { DeckClear(skill); } for (int i = 0; i < cards.Count; i++) { AddToDeck(cards[i], callEvent: true, skill); } this.OnUpdateDeck.Call(skill.SkillPrm.ownerCard, cards, IsPlayer, updateType == "change", isOpen); return NullVfx.GetInstance(); } public void CallOnChangeDeckAfterEvent(int previousCount, SkillProcessor skillProcessor, List summonCards) { this.OnChangeDeckAfterEvent.Call(previousCount, skillProcessor, summonCards); } public void DeckClear(SkillBase skill) { this.OnClearDeck.Call(); this.OnAddBlackHole.Call(DeckCardList, skill); BlackHole.AddRange(DeckCardList); DeckCardList.Clear(); } public void AddToDeck(BattleCardBase card, bool callEvent = false, SkillBase skill = null) { if (callEvent) { this.OnAddDeckEvent.Call(card, skill); } DeckCardList.Add(card); if (card.HasDeckSelfSkill) { AddDeckSkillCard(card); } if (BattleMgr.XorShiftRandom(card.IsPlayer) != null && BattleMgr.XorShiftRandom(card.IsPlayer).IsActive && BattleMgr.IsMulliganEnd) { AddToDeckCardList.Add(card); } } public void AddDeckSkillCard(BattleCardBase card) { DeckSkillCardList.Add(card); DeckSkillCardList = DeckSkillCardList.OrderBy((BattleCardBase c) => c.Index).ToList(); } public void RemoveOriginalAndAddDeckSkillCard(BattleCardBase card) { DeckSkillCardList.RemoveAll((BattleCardBase c) => c.Index == card.Index); AddDeckSkillCard(card); } private void AddToDeckCardIndexChange() { if (AddToDeckCardList.Count == 0 && _opponentBattlePlayer.AddToDeckCardList.Count == 0) { return; } if (AddToDeckCardList.Count > 0 && BattleMgr.XorShiftRandom(AddToDeckCardList.First().IsPlayer) != null && BattleMgr.XorShiftRandom(AddToDeckCardList.First().IsPlayer).IsActive && BattleMgr.IsMulliganEnd) { for (int i = 0; i < AddToDeckCardList.Count; i++) { if (AddToDeckCardList[i].IsInDeck) { int changeInt = BattleMgr.XorShiftRandom(AddToDeckCardList[i].IsPlayer).GetChangeInt(DeckCardList.Count()); BattleCardBase battleCardBase = DeckCardList[changeInt]; int index = AddToDeckCardList[i].Index; AddToDeckCardList[i].SetIndex(battleCardBase.Index); this.OnIndexChange.Call(index, battleCardBase.Index, IsPlayer); battleCardBase.SetIndex(index); DeckCardList.Sort((BattleCardBase a, BattleCardBase b) => a.Index - b.Index); } } } AddToDeckCardList.Clear(); if (_opponentBattlePlayer.AddToDeckCardList.Count > 0) { _opponentBattlePlayer.AddToDeckCardIndexChange(); } } public VfxBase ReplaceInPlay(BattleCardBase originalCard, BattleCardBase newCard, SkillProcessor skillProcessor, bool isMetamorphose = false) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); ClassAndInPlayCardList.Insert(ClassAndInPlayCardList.IndexOf(originalCard), newCard); ClassAndInPlayCardList.Remove(originalCard); sequentialVfxPlayer.Register(originalCard.RemoveFromInPlay()); sequentialVfxPlayer.Register(originalCard.RemoveFromInPlayAfter(skillProcessor)); sequentialVfxPlayer.Register(StartSkillWhenChangeInplay(null, new List { newCard }, skillProcessor, !isMetamorphose, null, null, isReplace: true)); if (isMetamorphose) { this.OnMetamorphoseAfterEvent.Call(originalCard, newCard); } return sequentialVfxPlayer; } public VfxBase ReplaceInHand(BattleCardBase originalCard, BattleCardBase newCard, SkillProcessor skillProcessor) { SequentialVfxPlayer result = SequentialVfxPlayer.Create(); HandCardList.Insert(HandCardList.IndexOf(originalCard), newCard); HandCardList.Remove(originalCard); StartSkillWhenChangeInplaySelfHand(new List { newCard }, skillProcessor); return result; } public void RegisterSkill(IBattlePlayerSkill battlePlayerSkill) { _skillList.Add(battlePlayerSkill); } public void UnregisterSkill(IBattlePlayerSkill battlePlayerSkill) { _skillList.Remove(battlePlayerSkill); } private void CallSkill(Func> getFunc, BattleCardBase targetCard) { foreach (IBattlePlayerSkill skill in _skillList) { getFunc(skill)(targetCard); } } public virtual VfxBase UsePp(int pp, bool isNewReplayMoveTurn = false) { Pp -= pp; AddGameUsedPp(pp); return NullVfx.GetInstance(); } public void AddGameUsedPp(int pp) { GameUsedPpCount += pp; } public VfxBase UseBp(int bp, bool isVariableCost, bool isSelf) { Bp -= bp; int bp2 = Bp; return m_vfxCreator.CreateUseBp(bp2, bp, () => BattleView.GetBPLabelPosition(), isVariableCost, isSelf); } public virtual VfxBase MoveToHand(List cardsToMoveToHand) { return NullVfx.GetInstance(); } public virtual VfxBase MoveToDeck(List cardsToMoveToDeck) { return new MoveToDeckVfx(cardsToMoveToDeck, IsPlayer); } protected virtual VfxWith> LotteryRandomDrawCard(int drawCount, SkillProcessor skillProcessor) { List list = new List(); if (CheckShortageDeck(drawCount, skillProcessor, out var _)) { return new VfxWith>(SendShortageDeck(), list); } if (BattleManagerBase.IsRandomDraw) { list = SkillRandomSelectFilter.Filtering(drawCount, DeckCardList, BattleMgr).ToList(); } else { int num = Math.Min(drawCount, DeckCardList.Count); for (int i = 0; i < num; i++) { list.Add(DeckCardList[i]); } } return new VfxWith>(NullVfx.GetInstance(), list); } public VfxWith> RandomCardDraw(int drawCount, SkillProcessor skillProcessor) { VfxWith> vfxWith = LotteryRandomDrawCard(drawCount, skillProcessor); VfxWith> vfxWith2 = DrawCards(vfxWith.Value, skillProcessor); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); sequentialVfxPlayer.Register(vfxWith2.Vfx); sequentialVfxPlayer.Register(vfxWith.Vfx); return new VfxWith>(sequentialVfxPlayer, vfxWith2.Value); } public VfxWith> DrawManagement(List drawCards, SkillProcessor skillProcessor, bool isVisible, bool shortageDeck, SkillBase.SkillResultInfo resultInfo, SkillBase skill) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); VfxWith> vfxWith = DrawCards(drawCards, skillProcessor, isVisible, isMulligan: false, isToken: false, skill != null, skill, isReservation: false, resultInfo); if (vfxWith.Value.Count() <= 0 && !shortageDeck) { resultInfo.drawCards = new List(); return new VfxWith>(NullVfxWithLoading.GetInstance(), new List()); } if (resultInfo != null) { resultInfo.drawCards = ConvertToSkillInfoCollection(vfxWith.Value); } if (IsPlayer || GameMgr.GetIns().IsAdminWatch || isVisible || BattleMgr is SingleBattleMgr) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); foreach (BattleCardBase card in drawCards) { int cost = card.Cost; List costList = card.BattleCardView.GetUseCostList(card.Cost); bool isInHand = card.IsInHand; parallelVfxPlayer.Register(InstantVfx.Create(delegate { if (card.BaseCost != cost) { card.BattleCardView.UpdateCost(costList, isGenerateInHand: true, playEffect: true, isInHand); } })); } sequentialVfxPlayer.Register(parallelVfxPlayer); } if (IsPlayer) { sequentialVfxPlayer.Register(new PlayerDrawCardVfx(drawCards, isVisible)); sequentialVfxPlayer.Register(new PlayerEndDrawVfx(drawCards)); } else { if (!(GameMgr.GetIns().IsAdminWatch && isVisible)) { sequentialVfxPlayer.Register(new OpponentDrawCardVfx(drawCards, isVisible)); } sequentialVfxPlayer.Register(new OpponentDrawCardToHandVfx(drawCards, 0.4f, isVisible)); } VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(); vfxWithLoadingSequential.RegisterToMainVfx(InstantVfx.Create(delegate { foreach (BattleCardBase drawCard in drawCards) { drawCard.BattleCardView.HideCanPlayEffect(); } })); vfxWithLoadingSequential.RegisterToMainVfx(vfxWith.Vfx); vfxWithLoadingSequential.RegisterToMainVfx(sequentialVfxPlayer); if (shortageDeck) { vfxWithLoadingSequential.RegisterToMainVfx(SendShortageDeck()); } vfxWithLoadingSequential.RegisterToMainVfx(InstantVfx.Create(delegate { UpdateHandCardsPlayability(); })); return new VfxWith>(vfxWithLoadingSequential, vfxWith.Value); } public VfxWith> DrawCards(IEnumerable drawList, SkillProcessor skillProcessor, bool isOpen = false, bool isMulligan = false, bool isToken = false, bool isSkillDraw = false, SkillBase skill = null, bool isReservation = false, SkillBase.SkillResultInfo skillResultInfo = null, int tokenDrawSkillId = -1) { if (skillResultInfo != null) { skillResultInfo.drewOverHandLimitCards = new List(); } if (!drawList.Any()) { return new VfxWith>(NullVfx.GetInstance(), drawList); } int count = DeckCardList.Count; ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create(); foreach (BattleCardBase card in drawList) { SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); List list = new List(); list.Add(card); bool num = HandCardList.Count >= 9; if (num) { list.RemoveAt(0); this.OnAddCemeteryEvent.Call(card, CEMETERY_TYPE.DECK_DRAW_HAND_OVER, isOpen, skill); CemeteryList.Add(card); skillConditionCheckerOption.DrewOverHandLimitCards.Add(card); skillResultInfo?.drewOverHandLimitCards.Add(card); BattleMgr.VfxMgr.RegisterImmediateVfx(this.OnAddCemeteryAfterEvent.GetAllFuncVfxResults()); int cost = card.Cost; List costList = card.BattleCardView.GetUseCostList(card.Cost); parallelVfxPlayer.Register(InstantVfx.Create(delegate { if (card.BaseCost != cost) { card.BattleCardView.UpdateCost(costList, isGenerateInHand: true, playEffect: true, isForceUpdate: true); } })); } skillConditionCheckerOption.InHandCard = ConvertToSkillInfoCollection(list); parallelVfxPlayer.Register(DrawCard(card, skill, isOpen, isToken, isReservation)); parallelVfxPlayer2.Register(card.StartHandEffect()); if (!isMulligan) { StartSkillWhenChangeInplaySelfHand(new List { card }, skillProcessor); } if (!num) { StartSkillWhenAddToHand(skillProcessor, skillConditionCheckerOption); } } if (!isToken) { CallOnChangeDeckAfterEvent(count, skillProcessor, new List()); } sequentialVfxPlayer.Register(SequentialVfxPlayer.Create(parallelVfxPlayer, parallelVfxPlayer2)); if (!isMulligan) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); SkillConditionCheckerOption skillConditionCheckerOption2 = new SkillConditionCheckerOption(); if (skill != null) { DrewSkillCard = skill.SkillPrm.ownerCard; } List list2 = new List(); List list3 = new List(); if (isToken) { list2.AddRange(drawList); skillConditionCheckerOption2.TokenDrewCards.AddRange(list2); } else { list3.AddRange(drawList); skillConditionCheckerOption2.DeckDrewCards.AddRange(list3); } foreach (BattleCardBase item in drawList.Where((BattleCardBase c) => c.IsInHand)) { skillProcessor.Register(item.Skills.CreateWhenDraw(skillProcessor, playerInfoPair, skillConditionCheckerOption2)); item.DrawTurn = ((item.SelfBattlePlayer.IsSelfTurn && !BattleMgr.IsTurnEnd) ? item.SelfBattlePlayer.Turn : (item.SelfBattlePlayer.Turn + 1)); } if (!IsPlayer) { IEnumerable enumerable = drawList.Where((BattleCardBase c) => c.Skills.Any((SkillBase s) => s.OnWhenDraw != 0 && s.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessOpenCard))); foreach (BattleCardBase item2 in enumerable) { item2.LastDrawOpenCard = enumerable.LastOrDefault(); } } List list4 = new List(HandCardList); list4.AddRange(ClassAndInPlayCardList); foreach (BattleCardBase item3 in list4.Where((BattleCardBase c) => !drawList.Contains(c))) { SkillProcessor.ProcessInfo info = item3.Skills.CreateWhenDrawOther(list3, list2, skillProcessor, new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer), isSkillDraw); skillProcessor.Register(info); } if (!isToken) { int count2 = TurnDrawCards.Count; TurnDrawCards.AddRange(drawList); GameDrawCards.AddRange(drawList); this.OnDrawCards.Call(count2, TurnDrawCards.Count, drawList.ToList(), this, isOpen); } else { GameDrawTokenCards.AddRange(drawList); if (tokenDrawSkillId != -1) { for (int num2 = 0; num2 < drawList.Count(); num2++) { TurnDrawTokenCardsWithId.Add(new CardAndId(drawList.ElementAt(num2), tokenDrawSkillId)); } } } } VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(); vfxWithLoadingSequential.RegisterVfxWithLoading(VfxWithLoading.Create(BattleMgr.LoadCardResources(drawList.ToList()))); vfxWithLoadingSequential.RegisterToMainVfx(sequentialVfxPlayer); return new VfxWith>(vfxWithLoadingSequential, drawList); } public bool CheckShortageDeck(int drawNum, SkillProcessor skillProcessor, out bool isActiveChangeShortageDeck) { bool flag = drawNum > DeckCardList.Count; isActiveChangeShortageDeck = false; if (!IsChangeShortageDeck) { IsShortageDeck = flag; return IsShortageDeck; } if (IsChangeShortageDeck && flag) { StartSkillWhenShortageDeck(skillProcessor); isActiveChangeShortageDeck = true; } return false; } public void CallRecordingMulliganStart(List cards) { this.OnMulliganStart.Call(this, cards); } public virtual VfxBase CallRecordingMulligan(IList abandonCards, IList completeCards) { this.OnMulliganEnd.Call(abandonCards, completeCards); return NullVfx.GetInstance(); } protected virtual void PlayerActive() { } public virtual void UpdateHandCardsPlayability(bool areArrowsForcedOff = false) { } public VfxBase UpdateHandCardsCost(bool playEffect = true, bool isOnlyFixedUseCost = false) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); int i = 0; for (int count = HandCardList.Count; i < count; i++) { parallelVfxPlayer.Register(HandCardList[i].CalcHandCost(playEffect, isOnlyFixedUseCost)); } return parallelVfxPlayer; } public void ApplyFixedUseCostInfo() { HandParameter.IconLayout currentIconLayout = BattleCardView.GetCurrentIconLayout(); HandControl.ArrangeType type = (PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.FIXEDUSE_COST_INFO) ? HandControl.ArrangeType.Flat : HandControl.ArrangeType.Fan); NetworkBattleManagerBase networkBattleMgr = BattleManagerBase.GetIns() as NetworkBattleManagerBase; UpdateHandCostViewStrategy(); InitHandParameterIconPos(currentIconLayout); BattleView.HandView.ChangeArrangeType(type); if (networkBattleMgr != null && networkBattleMgr.IsSkillSelectTiming) { BattleMgr.VfxMgr.RegisterImmediateVfx(SequentialVfxPlayer.Create(UpdateHandCardsCost(playEffect: false, isOnlyFixedUseCost: true), WaitEventVfx.Create(() => !networkBattleMgr.IsSkillSelectTiming), UpdateHandCardsCost(playEffect: false))); } else { BattleMgr.VfxMgr.RegisterImmediateVfx(UpdateHandCardsCost(playEffect: false)); } } private void UpdateHandCostViewStrategy() { int i = 0; for (int count = HandCardList.Count; i < count; i++) { HandCardList[i].UpdateCostViewStrategy(); } } public void InitHandParameterIconPos(HandParameter.IconLayout layout) { int i = 0; for (int count = HandCardList.Count; i < count; i++) { HandCardList[i].InitHandParameterIconPos(layout); } } public VfxWithLoadingSequential AddSpellChargeCountVfx(List targetCardList, List addCountList) { List list = new List(); List list2 = new List(); List list3 = new List(); for (int i = 0; i < targetCardList.Count; i++) { BattleCardBase battleCardBase = targetCardList[i]; int num = addCountList[i]; battleCardBase.AddSpellChargeCount(num); if ((!battleCardBase.IsPlayer && !GameMgr.GetIns().IsAdminWatch) || battleCardBase.IsInDeck) { continue; } for (int j = 0; j < num; j++) { list.Add(battleCardBase); if (num >= Skill_spell_charge.SPELL_CHARGE_SUMMARY_COUNT) { list2.Add(num); list3.Add(Skill_spell_charge.SPELL_CHARGE_SUMMARY_INTERVAL); break; } list2.Add(1); list3.Add(Skill_spell_charge.SPELL_CHARGE_INTERVAL); } } return new SpellChargeSkillActivationVfx(list, list2, list3); } public abstract EffectBattle GetSkillEffect(string skillEffectPath); public abstract Vector3 GetFieldCenterPosition(); public void StartSkillWhenChangeInplaySelfHand(List inHandCards, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { cardsOrderBySkillActivation[i].Skills.CreateAndRegisterWhenChangeInplaySelfhandInfo(inHandCards, skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2); } } public VfxBase StartSkillWhenChangeInplay(List inHandCards, List inPlayCards, SkillProcessor skillProcessor, bool isSummonCheck = true, Func inplayCheckFunc = null, SkillConditionCheckerOption option = null, bool isReplace = false) { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); BattlePlayerPair battlePlayerPair2 = new BattlePlayerPair(_opponentBattlePlayer, this); if (inPlayCards != null && !isReplace && isSummonCheck) { sequentialVfxPlayer.Register(this.OnAfterSummonCardEvent.GetAllFuncVfxResults(skillProcessor, inPlayCards)); } List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true); List cardsOrderBySkillActivation2 = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: true, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation2.Count; i++) { sequentialVfxPlayer.Register(cardsOrderBySkillActivation2[i].Skills.RegisterAndProcessWhenChangeInplayImmediateInfo((cardsOrderBySkillActivation2[i].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2)); } for (int j = 0; j < cardsOrderBySkillActivation.Count; j++) { cardsOrderBySkillActivation[j].Skills.CreateAndRegisterWhenChangeInplaySelfhandInfo(inHandCards, skillProcessor, (cardsOrderBySkillActivation[j].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2); } for (int k = 0; k < cardsOrderBySkillActivation2.Count; k++) { cardsOrderBySkillActivation2[k].Skills.CreateAndRegisterWhenChangeInplayInfo(inPlayCards, skillProcessor, (cardsOrderBySkillActivation2[k].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2, isSummonCheck, inplayCheckFunc, option); } return sequentialVfxPlayer; } public VfxBase StartSkillWhenChangeClassLife(SkillProcessor skillProcessor) { SequentialVfxPlayer result = SequentialVfxPlayer.Create(); BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); BattlePlayerPair battlePlayerPair2 = new BattlePlayerPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true); List cardsOrderBySkillActivation2 = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: false, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { cardsOrderBySkillActivation[i].Skills.CreateAndRegisterWhenChangeClassLifeSelfHandInfo(skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2); } for (int j = 0; j < cardsOrderBySkillActivation2.Count; j++) { cardsOrderBySkillActivation2[j].Skills.CreateAndRegisterWhenChangeClassLifeInplayInfo(skillProcessor, (cardsOrderBySkillActivation2[j].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2); } return result; } public VfxBase StartSkillWhenChangePPTotal(SkillProcessor skillProcessor) { SequentialVfxPlayer result = SequentialVfxPlayer.Create(); BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); BattlePlayerPair battlePlayerPair2 = new BattlePlayerPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: false, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { cardsOrderBySkillActivation[i].Skills.CreateAndRegisterWhenChangePPTotalInfo(skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2); } return result; } public void StartSkillWhenAddToHand(SkillProcessor skillProcessor, SkillConditionCheckerOption option) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, BattleMgr is SingleBattleMgr, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { cardsOrderBySkillActivation[i].Skills.CreateAndRegisterWhenAddToHandInfo(skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, option); } } public void StartSkillWhenDestroyOther(BattleCardBase destroyCard, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: true, containsHand: false, containsClass: false, containsInplay: false, containsDeck: false, (BattleCardBase card) => card != destroyCard); for (int num = 0; num < cardsOrderBySkillActivation.Count; num++) { skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateWhenDestroyOtherInfo(destroyCard, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2)); } } public void StartSkillWhenReturnOther(BattleCardBase returnedCard, SkillProcessor skillProcessor, List cantAttackAllReturnCards) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true, containsDeck: false, (BattleCardBase card) => card != returnedCard); for (int num = 0; num < cardsOrderBySkillActivation.Count; num++) { skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateWhenReturnOtherInfo(returnedCard, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, cantAttackAllReturnCards)); } } public void StartSkillWhenReturnSkillActivate(List returnedCards, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenReturnSkillActivateInfo(returnedCards, skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2)); } } public VfxBase StartSkillWhenPlayOtherEnhanceAndAccelerateAndCrystallize(BattleCardBase playedCard, bool isEnhance, SkillProcessor skillProcessor) { ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(); if (playedCard.IsChoiceBraveSkillCard) { return parallelVfxPlayer; } BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); foreach (BattleCardBase item in SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: true, containsHand: false, containsClass: false, containsInplay: false, containsDeck: false, (BattleCardBase card) => card != playedCard)) { foreach (SkillBase skill in item.Skills) { VfxWith vfxWith = item.Skills.CreateWhenPlayOtherEnhanceAndAccelerateAndCrystallizeInfo(skill, playedCard, isEnhance ? playedCard : null, skillProcessor, (item.SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2); skillProcessor.Register(vfxWith.Value); parallelVfxPlayer.Register(vfxWith.Vfx); } } return parallelVfxPlayer; } public VfxBase StartSkillWhenSummonOther(BattleCardBase summonedCard, SkillProcessor skillProcessor, bool isReanimate = false, List ignoreCheckCard = null) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true, containsDeck: false, (BattleCardBase card) => ignoreCheckCard == null || ignoreCheckCard.Count == 0 || !ignoreCheckCard.Contains(card)); for (int num = 0; num < cardsOrderBySkillActivation.Count; num++) { if (cardsOrderBySkillActivation[num] != summonedCard) { skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateWhenSummonOtherInfo(summonedCard, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, isReanimate)); } skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateWhenSummonSelfAndOtherInfo(summonedCard, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, isReanimate)); } return NullVfx.GetInstance(); } public void StartSkillWhenFusionOther(List fusionIngredientCards, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = new List(); list.AddRange(ClassAndInPlayCardList); foreach (BattleCardBase item in list) { skillProcessor.Register(item.Skills.CreateWhenFusionOtherInfo(skillProcessor, playerInfoPair, fusionIngredientCards)); } } public void StartSkillWhenUseEpSelfAndOther(SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenUseEpSelfAndOtherInfo(skillProcessor, playerInfoPair)); } } public VfxBase StartSkillWhenHealingSelfAndOther(List healingCards, SkillProcessor skillProcessor, List healAmountList) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true); if (cardsOrderBySkillActivation.Any()) { TurnAndIntValue turnAndIntValue = TurnWhenHealingCount.FirstOrDefault((TurnAndIntValue t) => t.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && t.Turn == Turn); if (turnAndIntValue != null) { turnAndIntValue.Increment(); } else { TurnWhenHealingCount.Add(new TurnAndIntValue(1, Turn, BattleMgr.BattlePlayer.IsSelfTurn)); } } for (int num = 0; num < cardsOrderBySkillActivation.Count; num++) { skillProcessor.Register(cardsOrderBySkillActivation[num].Skills.CreateWhenHealingSelfAndOtherInfo(healingCards, skillProcessor, (cardsOrderBySkillActivation[num].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, healAmountList)); } return NullVfx.GetInstance(); } public VfxBase StartSkillWhenDamageSelfAndOther(SkillBase skill, List damageCards, SkillProcessor skillProcessor, int defDamage, int fixedDamage) { if (damageCards != null) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true, containsDeck: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenDamageSelfAndOtherInfo(skill, damageCards, skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, defDamage, fixedDamage)); } } return NullVfx.GetInstance(); } public void StartSkillWhenBurialRiteOther(BattleCardBase burialRiteCard, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: true, containsInplay: true, containsDeck: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenBurialRiteOther(burialRiteCard, skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2)); } } public void StartSkillWhenBanishOther(BattleCardBase banishedCard, SkillProcessor skillProcessor, bool isInplay) { BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); BattlePlayerReadOnlyInfoPair battlePlayerReadOnlyInfoPair2 = new BattlePlayerReadOnlyInfoPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: true, containsClass: true, containsInplay: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenBanishOther(banishedCard, skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerReadOnlyInfoPair : battlePlayerReadOnlyInfoPair2, isInplay)); } } public void StartSkillWhenUseWhiteRitualStack(SkillProcessor skillProcessor, SkillConditionCheckerOption checkerOption) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = HandCardList.ToList(); list.AddRange(ClassAndInPlayCardList); list.AddRange(DeckSkillCardList); for (int i = 0; i < list.Count; i++) { skillProcessor.Register(list[i].Skills.CreateWhenUseWhiteRitualStackInfo(skillProcessor, playerInfoPair, checkerOption)); } } public void StartSkillWhenResonanceStart(SkillProcessor skillProcessor, List SummonCardList) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = HandCardList.ToList(); list.AddRange(ClassAndInPlayCardList); list.AddRange(DeckSkillCardList); for (int i = 0; i < list.Count; i++) { BattleCardBase card = list[i]; if (!SummonCardList.Any((BattleCardBase s) => s == card)) { skillProcessor.Register(card.Skills.CreateWhenResonanceStart(skillProcessor, playerInfoPair)); } } } public VfxBase StartSkillWhenPpHealing(SkillProcessor skillProcessor) { List list = ClassAndInPlayCardList.ToList(); BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); for (int i = 0; i < list.Count; i++) { skillProcessor.Register(list[i].Skills.CreateWhenPpHealingInfo(skillProcessor, playerInfoPair)); } return NullVfx.GetInstance(); } public void StartSkillWhenBuffDebuffSelfAndOther(IEnumerable targetCards, IEnumerable inplayTargetCards, SkillProcessor skillProcessor) { if (targetCards.Count() != 0) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = ClassAndInPlayCardList.ToList(); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); List inplayDebuffingCards = (skillConditionCheckerOption.InplayBuffingCards = ConvertToSkillInfoCollection(inplayTargetCards)); skillConditionCheckerOption.InplayDebuffingCards = inplayDebuffingCards; for (int i = 0; i < list.Count; i++) { skillProcessor.Register(list[i].Skills.CreateWhenBuffDebuffSelfAndOtherInfo(skillProcessor, playerInfoPair, skillConditionCheckerOption)); } } } public void StartSkillWhenBuffSelfAndOther(IEnumerable buffingCards, IEnumerable inplayBuffingCards, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = ClassAndInPlayCardList.ToList(); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); skillConditionCheckerOption.InplayBuffingCards = ConvertToSkillInfoCollection(inplayBuffingCards); if (buffingCards.Count() > 0) { for (int i = 0; i < list.Count; i++) { skillProcessor.Register(list[i].Skills.CreateWhenBuffSelfAndOtherInfo(skillProcessor, playerInfoPair, skillConditionCheckerOption)); } } } public void StartSkillWhenDebuffSelfAndOther(IEnumerable debuffingCards, IEnumerable inplayDebuffingCards, SkillProcessor skillProcessor) { if (debuffingCards.Count() != 0) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); List list = ClassAndInPlayCardList.ToList(); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); skillConditionCheckerOption.InplayDebuffingCards = ConvertToSkillInfoCollection(inplayDebuffingCards); for (int i = 0; i < list.Count; i++) { skillProcessor.Register(list[i].Skills.CreateWhenDebuffSelfAndOtherInfo(skillProcessor, playerInfoPair, skillConditionCheckerOption)); } } } public void StartSkillWhenDebuffIncludeSetMaxLife(BattleCardBase debuffingCard, IEnumerable inplayDebuffingCards, SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); skillConditionCheckerOption.InplayDebuffingCards = ConvertToSkillInfoCollection(inplayDebuffingCards); skillProcessor.Register(debuffingCard.Skills.CreateWhenDebuffIncludeSetMaxLifeInfo(skillProcessor, playerInfoPair, skillConditionCheckerOption)); } public void StartSkillWhenShortageDeck(SkillProcessor skillProcessor) { BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(this, _opponentBattlePlayer); skillProcessor.Register(Class.Skills.CreateWhenShortageDeck(skillProcessor, playerInfoPair)); } public void StartSkillWhenShortageDeckWinSkillActivate(List shortageDeckWinCards, SkillProcessor skillProcessor) { BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); BattlePlayerPair battlePlayerPair2 = new BattlePlayerPair(_opponentBattlePlayer, this); SkillConditionCheckerOption skillConditionCheckerOption = new SkillConditionCheckerOption(); skillConditionCheckerOption.ShortageDeckWinCards = ConvertToSkillInfoCollection(shortageDeckWinCards); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenShortageDeckWinSkillActivate(skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2, skillConditionCheckerOption)); } } public VfxBase StartSkillWhenBattleStart(SkillProcessor skillProcessor) { BattlePlayerPair battlePlayerPair = new BattlePlayerPair(this, _opponentBattlePlayer); BattlePlayerPair battlePlayerPair2 = new BattlePlayerPair(_opponentBattlePlayer, this); List cardsOrderBySkillActivation = SkillCollectionBase.GetCardsOrderBySkillActivation(this, _opponentBattlePlayer, isAll: false, containsHand: false, containsClass: true); for (int i = 0; i < cardsOrderBySkillActivation.Count; i++) { skillProcessor.Register(cardsOrderBySkillActivation[i].Skills.CreateWhenBattleStartInfo(skillProcessor, (cardsOrderBySkillActivation[i].SelfBattlePlayer == this) ? battlePlayerPair : battlePlayerPair2)); } return skillProcessor.Process(battlePlayerPair); } public static List ConvertToSkillInfoCollection(IEnumerable cards) { if (cards == null) { return new List(); } List list = new List(); foreach (BattleCardBase card in cards) { list.Add(card); } return list; } public static List> ConvertToSkillInfoCollectionList(List> cardsList) { if (cardsList == null) { return new List>(); } List> list = new List>(); foreach (List cards in cardsList) { List item = cards.ToList().ConvertAll(ConvertIReadOnlyBattleCardInfo); list.Add(item); } return list; } public static IReadOnlyBattleCardInfo ConvertIReadOnlyBattleCardInfo(BattleCardBase card) { return card; } public void AddLastTargetCardsList(BattleCardBase addCard) { if (LastTargetCardsList.Count > 0) { LastTargetCardsList.First().Add(addCard); return; } List list = new List(); List item = new List(); list.Add(addCard); LastTargetCardsList.Add(list); _opponentBattlePlayer.LastTargetCardsList.Add(item); } public List GetLastTargetCardsList(int index) { if (0 <= index && index < LastTargetCardsList.Count) { return LastTargetCardsList[index]; } return new List(); } public void SkillsEndProcess() { ReturnList.Clear(); LastTargetCardsList.Clear(); InHandCards.Clear(); HealingCards.Clear(); SkillSummonedCards.Clear(); SummonedCards.Clear(); SkillDiscards.Clear(); SkillBanishCards.Clear(); DrewSkillCard = null; OkSkillInProcess.Clear(); LastInplayWhiteRitualStack = 0; Class.SkillApplyInformation.ReservationAllDepriveRepeatSkill(); } public void OnCallOneSkillProcess() { if (OnEndOneSkillProcess != null) { OnEndOneSkillProcess(); OnEndOneSkillProcess = null; } } public VfxBase SendShortageDeck() { return this.OnShortageDeck.GetAllFuncVfxResults(); } public void CopyToVirtualBase(BattlePlayerBase target, BattlePlayerBase virtualOpponentBattlePlayer, CloneActualFlags cloneFlags) { target._opponentBattlePlayer = virtualOpponentBattlePlayer; target._skillList = _skillList.ToList(); target.Pp = Pp; target._ppTotal = _ppTotal; target.SetCurrentEpCount(CurrentEpCount); target.EvolveWaitTurnCount = EvolveWaitTurnCount; target.NowTurnEvol = NowTurnEvol; target._gameUsedEpCount = _gameUsedEpCount; target._turnUsedEpCount = _turnUsedEpCount; target.HandCardList = CloneCardList(HandCardList, target, virtualOpponentBattlePlayer, cloneFlags.Hand); target.DeckCardList = CloneCardList(DeckCardList, target, virtualOpponentBattlePlayer, cloneFlags.Deck); target.BattleStartDeckCardList = CloneCardList(BattleStartDeckCardList, target, virtualOpponentBattlePlayer, cloneFlags.Deck); target.ClassAndInPlayCardList = CloneCardList(ClassAndInPlayCardList, target, virtualOpponentBattlePlayer, cloneFlags.InPlay); target.CemeteryList = CloneCardList(CemeteryList, target, virtualOpponentBattlePlayer, cloneFlags.Cemetery); if (target.ClassAndInPlayCardList.Count > 0 && target.ClassAndInPlayCardList[0] is ClassBattleCardBase) { target._class = target.ClassAndInPlayCardList[0]; } else { BattleCardBase battleCardBase = target.CemeteryList.FirstOrDefault((BattleCardBase c) => c is ClassBattleCardBase); if (battleCardBase != null) { target._class = battleCardBase; } else { target._class = _class.VirtualClone(target, virtualOpponentBattlePlayer); } } target.BanishList = CloneCardList(BanishList, target, virtualOpponentBattlePlayer, cloneFlags.Banish); target.FusionIngredientList = CloneCardList(FusionIngredientList, target, virtualOpponentBattlePlayer, cloneFlags.FusionMaterial); target.NecromanceZoneList = CloneCardList(NecromanceZoneList, target, virtualOpponentBattlePlayer, cloneFlags.NecromanceZone); target.UniteList = CloneCardList(UniteList, target, virtualOpponentBattlePlayer, cloneFlags.Unite); target.GetOnList = CloneCardList(GetOnList, target, virtualOpponentBattlePlayer, cloneFlags.GetOn); target.SummonedCards = CloneCardList(SummonedCards, target, virtualOpponentBattlePlayer, isActualClone: true); target.IsSelfTurn = IsSelfTurn; target.DrewSkillCard = DrewSkillCard; List list = new List(); list.AddRange(target.HandCardList); list.AddRange(target.ClassAndInPlayCardList); list.AddRange(target.DeckCardList); list.AddRange(target.CemeteryList); list.AddRange(target.BanishList); list.AddRange(target.NecromanceZoneList); list.AddRange(target.FusionIngredientList); list.AddRange(target.UniteList); list.AddRange(target.GetOnList); target.ReturnList = FindClonedIdCards(list, ReturnList); List> list2 = new List>(); foreach (List lastTargetCards in LastTargetCardsList) { list2.Add(FindClonedIdCards(list, lastTargetCards)); } target.LastTargetCardsList = list2; target.InHandCards = FindClonedIdCards(list, InHandCards); target.SkillDiscards = FindClonedIdCards(list, SkillDiscards); target.SkillBanishCards = FindClonedIdCards(list, SkillBanishCards); target.TurnPlayCards = FindClonedIdCards(list, TurnPlayCards); target.TurnDrawCards = FindClonedIdCards(list, TurnDrawCards); target.TurnDrawTokenCardsWithId = new List(); int i; for (i = 0; i < TurnDrawTokenCardsWithId.Count; i++) { target.TurnDrawTokenCardsWithId.Add(new CardAndId(list.FirstOrDefault((BattleCardBase c) => c.EquelsID(TurnDrawTokenCardsWithId[i].Card)), TurnDrawTokenCardsWithId[i].Id)); } target.GamePlayCards = FindClonedIdCards(list, GamePlayCards); target.GameCrystallizedPlayCards = FindClonedIdCards(list, GameCrystallizedPlayCards); target.OkSkillInProcess = OkSkillInProcess.ToList(); target.GameInplayMetamorphoseCards = FindClonedIdCards(list, GameInplayMetamorphoseCards); target.GameBurialRiteCards = FindClonedIdCards(list, GameBurialRiteCards); target.TurnBurialRiteCards = FindClonedIdCards(list, TurnBurialRiteCards); target.EvolvedCards = FindClonedIdCards(AllCards, EvolvedCards); target.GameDrawCards = FindClonedIdCards(list, GameDrawCards); target.GameDrawTokenCards = FindClonedIdCards(list, GameDrawTokenCards); target.GameAddUpdateDeckCards = FindClonedIdCards(list, GameAddUpdateDeckCards); target.GameLeftCards = FindClonedIdCards(list, GameLeftCards); target.GameSuperSkyboundArtCards = FindClonedIdCards(list, GameSuperSkyboundArtCards); List list3 = FindClonedIdCards(list, GameTurnLeftCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num = 0; num < list3.Count; num++) { target.GameTurnLeftCards.Add(new TurnAndCard(GameTurnLeftCards[num].Turn, GameTurnLeftCards[num].IsSelfTurn, list3[num], GameTurnLeftCards[num].IsTurnEnd)); } List list4 = FindClonedIdCards(list, GameSummonCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num2 = 0; num2 < list4.Count; num2++) { target.GameSummonCards.Add(new TurnAndCard(GameSummonCards[num2].Turn, GameSummonCards[num2].IsSelfTurn, list4[num2], GameSummonCards[num2].IsTurnEnd)); } for (int num3 = 0; num3 < GameSummonMomentTribe.Count; num3++) { target.GameSummonMomentTribe.Add(new CardAndTribe(GameSummonMomentTribe[num3].Card, GameSummonMomentTribe[num3].Tribes)); } for (int num4 = 0; num4 < GamePlayMomentTribe.Count; num4++) { target.GamePlayMomentTribe.Add(new CardAndTribe(GamePlayMomentTribe[num4].Card, GamePlayMomentTribe[num4].Tribes)); } for (int num5 = 0; num5 < GamePlayMomentSpellChargeCards.Count; num5++) { target.GamePlayMomentSpellChargeCards.Add(GamePlayMomentSpellChargeCards[num5].Card); } for (int num6 = 0; num6 < GameUpdateDeckMomentTribe.Count; num6++) { target.GameUpdateDeckMomentTribe.Add(new CardAndTribe(GameUpdateDeckMomentTribe[num6].Card, GameUpdateDeckMomentTribe[num6].Tribes)); } List list5 = FindClonedIdCards(list, GameReanimatedCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num7 = 0; num7 < list5.Count; num7++) { target.GameReanimatedCards.Add(new TurnAndCard(GameReanimatedCards[num7].Turn, GameReanimatedCards[num7].IsSelfTurn, list5[num7], GameReanimatedCards[num7].IsTurnEnd)); } List list6 = FindClonedIdCards(list, GameReturnedCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num8 = 0; num8 < list6.Count; num8++) { target.GameReturnedCards.Add(new TurnAndCard(GameReturnedCards[num8].Turn, GameReturnedCards[num8].IsSelfTurn, list6[num8], GameReturnedCards[num8].IsTurnEnd)); } List list7 = FindClonedIdCards(list, GameTurnPlayCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num9 = 0; num9 < list7.Count; num9++) { target.GameTurnPlayCards.Add(new TurnAndCard(GameTurnPlayCards[num9].Turn, GameTurnPlayCards[num9].IsSelfTurn, list7[num9], GameTurnPlayCards[num9].IsTurnEnd)); } List list8 = FindClonedIdCards(list, GameEnhancePlayCards.Select((TurnAndCard c) => c.Card as BattleCardBase)); for (int num10 = 0; num10 < list8.Count; num10++) { target.GameEnhancePlayCards.Add(new TurnAndCard(GameEnhancePlayCards[num10].Turn, GameEnhancePlayCards[num10].IsSelfTurn, list8[num10], GameEnhancePlayCards[num10].IsTurnEnd)); } for (int num11 = 0; num11 < TurnPlayCardCountInfo.Count; num11++) { TurnAndIntValue turnAndIntValue = TurnPlayCardCountInfo[num11]; target.TurnPlayCardCountInfo.Add(new TurnAndIntValue(turnAndIntValue.Value, turnAndIntValue.Turn, turnAndIntValue.IsSelfTurn)); } for (int num12 = 0; num12 < TurnFusionCountInfo.Count; num12++) { TurnAndIntValue turnAndIntValue2 = TurnFusionCountInfo[num12]; target.TurnFusionCountInfo.Add(new TurnAndIntValue(turnAndIntValue2.Value, turnAndIntValue2.Turn, turnAndIntValue2.IsSelfTurn)); } target.extraTurnCount = extraTurnCount; target.cardTotalNum = cardTotalNum; for (int num13 = 0; num13 < TurnEvolveCardCountInfo.Count; num13++) { TurnAndIntValue turnAndIntValue3 = TurnEvolveCardCountInfo[num13]; target.TurnEvolveCardCountInfo.Add(new TurnAndIntValue(turnAndIntValue3.Value, turnAndIntValue3.Turn, turnAndIntValue3.IsSelfTurn)); } target.IsShortageDeck = IsShortageDeck; target.RallyCount = RallyCount; target.DeckBanishCount = DeckBanishCount; target.GameResonanceStartCount = GameResonanceStartCount; target.TurnResonanceStartCount = TurnResonanceStartCount; target.GameNecromanceCount = GameNecromanceCount; target.GameUsedPpCount = GameUsedPpCount; target.GameUsedWhiteRitualCount = GameUsedWhiteRitualCount; target.LastInplayWhiteRitualStack = LastInplayWhiteRitualStack; for (int num14 = 0; num14 < GameSkillReturnCardCountList.Count; num14++) { TurnAndIntValue turnAndIntValue4 = GameSkillReturnCardCountList[num14]; target.GameSkillReturnCardCountList.Add(new TurnAndIntValue(turnAndIntValue4.Value, turnAndIntValue4.Turn, turnAndIntValue4.IsSelfTurn)); } for (int num15 = 0; num15 < GameSkillDiscardCountList.Count; num15++) { TurnAndIntValue turnAndIntValue5 = GameSkillDiscardCountList[num15]; target.GameSkillDiscardCountList.Add(new TurnAndIntValue(turnAndIntValue5.Value, turnAndIntValue5.Turn, turnAndIntValue5.IsSelfTurn)); } for (int num16 = 0; num16 < GameSkillBuffCountList.Count; num16++) { TurnAndIntValue turnAndIntValue6 = GameSkillBuffCountList[num16]; target.GameSkillBuffCountList.Add(new TurnAndIntValue(turnAndIntValue6.Value, turnAndIntValue6.Turn, turnAndIntValue6.IsSelfTurn)); } for (int num17 = 0; num17 < GameSkillMetamorphoseCountList.Count; num17++) { TurnAndIntValue turnAndIntValue7 = GameSkillMetamorphoseCountList[num17]; target.GameSkillMetamorphoseCountList.Add(new TurnAndIntValue(turnAndIntValue7.Value, turnAndIntValue7.Turn, turnAndIntValue7.IsSelfTurn)); } target.GameSkillDiscardCount = GameSkillDiscardCount; } private List CloneCardList(ICollection sourceCards, BattlePlayerBase virtualSelfBattlePlayer, BattlePlayerBase virtualOpponentBattlePlayer, bool isActualClone) { if (isActualClone) { List list = new List(sourceCards.Count); for (int i = 0; i < sourceCards.Count; i++) { list.Add(sourceCards.ElementAt(i).VirtualClone(virtualSelfBattlePlayer, virtualOpponentBattlePlayer)); } return list; } List list2 = new List(sourceCards.Count); for (int j = 0; j < sourceCards.Count; j++) { list2.Add(CardCreatorBase.CreateDummyInstance()); } return list2; } private List FindClonedIdCards(IEnumerable clonedCardList, IEnumerable findIdCardList) { List list = new List(); if (findIdCardList == null) { return list; } foreach (BattleCardBase uniqId in findIdCardList) { if (uniqId != null) { BattleCardBase battleCardBase = clonedCardList.SingleOrDefault((BattleCardBase c) => c.EquelsID(uniqId)); if (battleCardBase != null) { list.Add(battleCardBase); } } } return list; } public bool CheckPlayableCards() { List handCardList = HandCardList; for (int i = 0; i < handCardList.Count; i++) { if (handCardList[i].Movable(isCheckOnDraw: false, isSkipSelecting: true)) { return true; } } return false; } public bool CheckAttackableCards() { List inPlayCardList = InPlayCards.ToList(); int i = 0; while (i < inPlayCardList.Count) { if (inPlayCardList[i].Attackable) { IEnumerable source = _opponentBattlePlayer.InPlayCards.Where((BattleCardBase c) => c.IsUnit && !c.CantBeFocusedAttack(inPlayCardList[i])); if (!inPlayCardList[i].IsCantAttackClass || source.Any()) { IEnumerable source2 = source.Where((BattleCardBase c) => c.SkillApplyInformation.IsGuard); if ((!inPlayCardList[i].SkillApplyInformation.IsSkillCantAtkUnitNotHasGuard || source2.Any() || !inPlayCardList[i].IsCantAttackClass) && (!inPlayCardList[i].SkillApplyInformation.IsSkillCantAtkUnit || !source2.Any() || inPlayCardList[i].SkillApplyInformation.IsIgnoreGuard) && (!inPlayCardList[i].SkillApplyInformation.IsSkillCantAtkUnitBaseCardId || ((!source2.Any() || !source2.All((BattleCardBase c) => inPlayCardList[i].SkillApplyInformation.CantAtkUnitBaseCardIdList.Contains(c.BaseParameter.BaseCardId)) || inPlayCardList[i].SkillApplyInformation.IsIgnoreGuard) && (!source.Any() || !source.All((BattleCardBase c) => inPlayCardList[i].SkillApplyInformation.CantAtkUnitBaseCardIdList.Contains(c.BaseParameter.BaseCardId)) || !inPlayCardList[i].IsCantAttackClass)))) { return true; } } } int num = i + 1; i = num; } return false; } public bool CheckNotConsumeEpCard(BattleCardBase card) { foreach (BattleCardBase inPlayCard in InPlayCards) { if (inPlayCard.SkillApplyInformation.CheckNotConsumeEpCard(card)) { return true; } } return false; } public IEnumerable GetSpecificTurnDestroyCards(TurnPlayerInfo turnPlayerInfo) { BattleManagerBase ins = BattleManagerBase.GetIns(); bool isCheckSelf = IsPlayer == turnPlayerInfo.IsSelfPlayer; int turn = (isCheckSelf ? ins.BattlePlayer.Turn : ins.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return from c in TurnDestroyCards where c.IsSelfTurn == isCheckSelf && c.Turn == turn select c.Card; } public VfxBase UpdateInPlayBattleCardIconLabel() { SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(); for (int i = 1; i < ClassAndInPlayCardList.Count; i++) { if (!(ClassAndInPlayCardList[i].BattleCardView.BattleCardIconAnimations == null) && ClassAndInPlayCardList[i].BattleCardView.BattleCardIconAnimations.HasInductionNumberSkill()) { sequentialVfxPlayer.Register(ClassAndInPlayCardList[i].BattleCardView.UpdateBattleCardIconLabelNumber(ClassAndInPlayCardList[i], ClassAndInPlayCardList[i].Skills)); } } return sequentialVfxPlayer; } public int GetSpecificTurnWhenHealingCount(TurnPlayerInfo turnPlayerInfo, bool isTextKeyword) { bool isCheckSelf = IsPlayer == turnPlayerInfo.IsSelfPlayer; if (isTextKeyword && isCheckSelf == IsPlayer && !IsSelfTurn) { return 0; } int turn = (isCheckSelf ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return TurnWhenHealingCount.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == isCheckSelf && c.Turn == turn)?.Value ?? 0; } public int GetSpecificTurnSkillReturnCardCount(TurnPlayerInfo turnPlayerInfo) { bool isCheckSelf = turnPlayerInfo.IsSelfPlayer; int turn = ((IsPlayer == isCheckSelf) ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return GameSkillReturnCardCountList.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == isCheckSelf && c.Turn == turn)?.Value ?? 0; } public int GetSpecificTurnSkillDiscardCount(TurnPlayerInfo turnPlayerInfo) { bool isCheckSelf = turnPlayerInfo.IsSelfPlayer; int turn = ((IsPlayer == isCheckSelf) ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return GameSkillDiscardCountList.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == isCheckSelf && c.Turn == turn)?.Value ?? 0; } public int GetSpecificTurnEnhanceCardCount(TurnPlayerInfo turnPlayerInfo) { bool isSelfPlayer = turnPlayerInfo.IsSelfPlayer; int num = ((IsPlayer == isSelfPlayer) ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); num -= turnPlayerInfo.TurnOffset; List list = new List(); for (int i = 0; i < GameEnhancePlayCards.Count; i++) { if (GameEnhancePlayCards[i].Turn == num && GameEnhancePlayCards[i].IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn) { list.Add(GameEnhancePlayCards[i].Card); } } return list.Count; } public int GetCurrentTurnPlayCount() { return TurnPlayCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && c.Turn == BattleMgr.CurrentTurn)?.Value ?? 0; } public void AddCurrentTrunPlayCount(int count) { TurnAndIntValue turnAndIntValue = TurnPlayCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && c.Turn == BattleMgr.CurrentTurn); if (turnAndIntValue != null) { turnAndIntValue.AddValue(count); } else { TurnPlayCardCountInfo.Add(new TurnAndIntValue(count, BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn)); } } public int GetSpecificTurnPlayCount(TurnPlayerInfo turnPlayerInfo) { bool isCheckSelf = IsPlayer == turnPlayerInfo.IsSelfPlayer; int turn = (isCheckSelf ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return TurnPlayCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == isCheckSelf && c.Turn == turn)?.Value ?? 0; } public void AddCurrentTurnFusionCount(int count) { TurnAndIntValue turnAndIntValue = TurnFusionCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && c.Turn == BattleMgr.CurrentTurn); if (turnAndIntValue != null) { turnAndIntValue.AddValue(count); } else { TurnFusionCountInfo.Add(new TurnAndIntValue(count, BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn)); } } public void AddCurrentEvolvePlayCount(int count) { TurnAndIntValue turnAndIntValue = TurnEvolveCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && c.Turn == BattleMgr.CurrentTurn); if (turnAndIntValue != null) { turnAndIntValue.AddValue(count); } else { TurnEvolveCardCountInfo.Add(new TurnAndIntValue(count, BattleMgr.CurrentTurn, BattleMgr.BattlePlayer.IsSelfTurn)); } } public int GetCurrentTurnEvolveCount() { return TurnEvolveCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == BattleMgr.BattlePlayer.IsSelfTurn && c.Turn == BattleMgr.CurrentTurn)?.Value ?? 0; } public int GetSpecificTurnEvolveCount(TurnPlayerInfo turnPlayerInfo) { bool isCheckSelf = IsPlayer == turnPlayerInfo.IsSelfPlayer; int turn = (isCheckSelf ? BattleMgr.BattlePlayer.Turn : BattleMgr.BattleEnemy.Turn); turn -= turnPlayerInfo.TurnOffset; return TurnEvolveCardCountInfo.FirstOrDefault((TurnAndIntValue c) => c.IsSelfTurn == isCheckSelf && c.Turn == turn)?.Value ?? 0; } public int GetAttachTurnBySkillId(string id) { for (int i = 0; i < Class.Skills.Count(); i++) { if (Class.Skills.ElementAt(i).GetAttachSkill is Skill_attach_skill skill_attach_skill && skill_attach_skill.SaveTurnSkillId == id) { return skill_attach_skill.AttachedTurn; } } return 0; } public VfxWithLoading CreateTokenSpawnVfx(BattleCardBase firstToken) { Color color; switch (firstToken.Clan) { case CardBasePrm.ClanType.MIN: color = Global.EFFECT_COLOR_ELF; break; case CardBasePrm.ClanType.ROYAL: color = Global.EFFECT_COLOR_ROYAL; break; case CardBasePrm.ClanType.WITCH: color = Global.EFFECT_COLOR_WITCH_1; break; case CardBasePrm.ClanType.DRAGON: color = Global.EFFECT_COLOR_DRAGON; break; case CardBasePrm.ClanType.NECRO: color = Global.EFFECT_COLOR_NECROMANCER; break; case CardBasePrm.ClanType.VAMPIRE: color = Global.EFFECT_COLOR_VANPIRE; break; case CardBasePrm.ClanType.BISHOP: color = Global.EFFECT_COLOR_BISHOP; break; case CardBasePrm.ClanType.NEMESIS: color = Global.EFFECT_COLOR_NEMESIS; break; default: color = Color.clear; break; } Func getEffectSpawnPoint = () => firstToken.BattleCardView.GameObject.transform.position; EffectBattle effectBattle = null; SkillBase.WaitEffectLoadVfx loadingVfx = new SkillBase.WaitEffectLoadVfx("cmn_token_draw_1", EffectMgr.EngineType.SHURIKEN, "se_cmn_token_draw_1", BattleMgr.BattleResourceMgr, delegate(EffectBattle eb) { effectBattle = eb; }); DelaySetupVfx mainVfx = new DelaySetupVfx(() => new SkillEffectBattleVfx(effectBattle, firstToken.BattleCardView, BattleMgr.BattleResourceMgr, getEffectSpawnPoint, getEffectSpawnPoint, 0f, 0f, EffectMgr.MoveType.DIRECT, IsPlayer, color)); return VfxWithLoading.Create(loadingVfx, mainVfx); } public void CallOnTokenDraw(BattleCardBase owner, List drawList, List targets, bool isPlayer, bool isOpen, bool isReserved) { this.OnTokenDrawCards.Call(owner, drawList, targets, isPlayer, isOpen, isReserved); } public void CallOnCreateReservedCards(BattleCardBase owner, List drawList, bool isPlayer) { this.OnCreateReservedCards.Call(owner, drawList, isPlayer); } public void CallOnCostChange(BattleCardBase card, List targets, List addList, List setList, List isCostUpList, bool isHalf, bool isSpellCharge, bool isOpenCard) { this.OnCostChange.Call(card, targets, addList, setList, isCostUpList, isHalf, isSpellCharge, isOpenCard); } public void CallOnRemoveCostChange(List targetList, bool isSpellCharge, bool isAdd) { this.OnRemoveCostChange.Call(targetList, isSpellCharge, isAdd); } public void CallOnPowerUp(BattleCardBase card, List cards, int offense, int life, int multiplyOffense, int multiplyLife, int maxLife) { this.OnPowerUp.Call(card, cards, offense, life, multiplyOffense, multiplyLife, maxLife); } public void CallOnPowerDownStart() { this.OnPowerDownStart.Call(); } public void CallOnPowerDown(BattleCardBase card, List cards, int offense, int life, int maxLife, bool isSet) { this.OnPowerDown.Call(card, cards, offense, life, maxLife, isSet); } public void CallOnDeprivePowerUp(List targetList) { this.OnDeprivePowerUp.Call(targetList); } public void CallOnDeprivePowerDown(List targetList) { this.OnDeprivePowerDown.Call(targetList); } public void CallOnSpellCharge(BattleCardBase card, List targets, List addList) { this.OnSpellCharge.Call(card, targets, addList); } public void CallOnDrain(int heal) { this.OnDrain.Call(heal); } public void CallOnSkillDamageStart(BattleCardBase card) { this.OnSkillDamageStart.Call(card); } public void CallOnDamage(List cards, List effectTargets, List damageList) { this.OnDamage.Call(cards, effectTargets, damageList); } public void CallOnHeal(BattleCardBase ownerCard, List cards, List healList) { this.OnHeal.Call(ownerCard, cards, healList); } public void CallOnDiscard(List targets) { this.OnDiscard.Call(targets); } public void CallOnSkillDestroyOrBanish(BattleCardBase card, bool isBurialRite = false, bool isOpen = false) { this.OnSkillDestroyOrBanish.Call(card, isBurialRite, isOpen); } public void CallOnPlayVoiceOnDeath(BattleCardBase card) { this.OnPlayVoiceOnDeath.Call(card); } public void CallOnSkillReturn() { this.OnSkillReturn.Call(); } public void CallOnAddPp(int addPpCount, BattleCardBase card) { this.OnAddPp.Call(addPpCount, IsPlayer, card); } public void CallOnAddBp(int addBpCount, BattleCardBase card) { this.OnAddBp.Call(addBpCount, IsPlayer, card); } public void CallOnEpModifier(BattleCardBase card, int epCount, bool isAdd) { this.OnEpModifier.Call(card, epCount, IsPlayer, isAdd); } public void CallOnBeforeSkillEvolve(BattleCardBase card, List targets) { this.OnBeforeSkillEvolve.Call(card, targets); } public void CallOnEvolveMeWhenAttack(BattleCardBase card) { this.OnEvolveMeWhenAttack.Call(card); } public void CallOnAfterSkillEvolve(List targets) { this.OnAfterSkillEvolve.Call(targets); } public void CallOnPlayCard(BattleCardBase originalCard, BattleCardBase playCard, bool isChoiceBrave) { this.OnPlayCard.Call(originalCard, playCard, isChoiceBrave); } public void CallOnWhenPlayEffect(SkillCollectionBase.WhenPlayEffectType whenPlayEffectType, BattleCardBase target, bool isInvoked) { this.OnWhenPlayEffect.Call(whenPlayEffectType, target, isInvoked); } public void CallOnChantCountChange(BattleCardBase card, List targets, int changeCount) { this.OnChantCountChange.Call(card, targets, changeCount); } public void CallOnChangeWhiteRitualStack(BattleCardBase target, int changeCount, bool isDestroy = false) { this.OnChangeWhiteRitualStack.Call(target, changeCount, isDestroy); } public void CallOnChangeMaxAttackableCount(BattleCardBase card, List targets, int changeCount) { this.OnChangeMaxAttackableCount.Call(card, targets, changeCount); } public void CallOnMetamorphose(BattleCardBase card, List targets, int cardId) { this.OnMetamorphose.Call(card, targets, cardId); } public void CallOnFusionMetamorphose(int fusionMetamorphoseCardId) { this.OnFusionMetamorphose.Call(fusionMetamorphoseCardId); } public void CallOnOpenCard(BattleCardBase card) { this.OnOpenCard.Call(card); } public void CallOnUnite(BattleCardBase ownerCard, List targets, BattleCardBase uniteCard) { this.OnUnite.Call(ownerCard, targets, uniteCard); } public void CallOnRemoveLatestOperationJsonData(NetworkBattleReceiver.ReplayOperationType type) { this.OnRemoveLatestOperationJsonData.Call(type); } public void CallOnEmotion(ClassCharaPrm.EmotionType emotionType) { this.OnEmotion.Call(emotionType, IsPlayer); } public void CallOnClearDestroyedCardList(bool isPlayer) { this.OnClearDestroyedCardList.Call(isPlayer); } }