Files
gamer147 0d9d8acae0 feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
2026-06-05 16:57:20 -04:00

2055 lines
70 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using Cute;
using LitJson;
using UnityEngine;
using Wizard;
using Wizard.Battle;
using Wizard.Battle.Operation;
using Wizard.Battle.Resource;
using Wizard.Battle.Touch;
using Wizard.Battle.UI;
using Wizard.Battle.View;
using Wizard.Battle.View.Vfx;
public abstract class SkillBase
{
public class BuffInfoContainer
{
public BattleCardBase _targetCard;
public BuffInfo _buffInfo;
public SkillBase _attachSkill;
public long _duplicateBanNum;
public int _intValue;
public string _stringValue;
public NotConsumeEpModifierInfo _notConsumeEpModifierInfo;
public ICardCostModifier CostModifier;
public ICardOffenseModifier OffenseModifier;
public ICardLifeModifier LifeModifier;
public const int INVALID_INT_VALUE = -1;
public const int INVALID_DUPLICATE_VALUE = 0;
public const string INVALID_STRING_VALUE = "";
public BuffInfoContainer(BattleCardBase targetCard, BuffInfo buffInfo, int intValue = -1, string stringValue = "", SkillBase attachSkill = null, long duplicateBanNum = 0L, NotConsumeEpModifierInfo notConsumeEpModifierInfo = null, ICardCostModifier costModifire = null, ICardOffenseModifier offenseModifire = null, ICardLifeModifier lifeModifire = null)
{
_targetCard = targetCard;
_buffInfo = buffInfo;
_attachSkill = attachSkill;
_duplicateBanNum = duplicateBanNum;
_intValue = intValue;
_stringValue = stringValue;
_notConsumeEpModifierInfo = notConsumeEpModifierInfo;
CostModifier = costModifire;
OffenseModifier = offenseModifire;
LifeModifier = lifeModifire;
}
public BuffInfoContainer Clone()
{
return (BuffInfoContainer)MemberwiseClone();
}
}
public class ExecutionBelongInfo
{
public bool IsDeck;
public bool IsHand;
public bool IsField;
public bool IsDestroy;
public bool IsFusionIngredient;
public bool IsSpell;
public ExecutionBelongInfo()
{
IsDeck = false;
IsHand = false;
IsField = false;
IsDestroy = false;
IsSpell = false;
}
public void SetBelong(BattlePlayerBase player, BattleCardBase card)
{
if (player.DeckCardList.Any((BattleCardBase c) => c == card))
{
IsDeck = true;
}
else if (player.HandCardList.Any((BattleCardBase c) => c == card))
{
IsHand = true;
}
else if (player.ClassAndInPlayCardList.Any((BattleCardBase c) => c == card))
{
IsField = true;
}
else if (player.CemeteryList.Any((BattleCardBase c) => c == card) || player.BanishList.Any((BattleCardBase c) => c == card) || player.NecromanceZoneList.Any((BattleCardBase c) => c == card))
{
IsDestroy = true;
}
else if (player.FusionIngredientList.Any((BattleCardBase c) => c == card))
{
IsFusionIngredient = true;
}
if (card.IsSpell)
{
IsSpell = true;
}
}
public bool CheckBelong(BattlePlayerBase player, BattleCardBase card, SkillConditionCheckerOption checkerOption, bool isOnWhenReturn = false)
{
if (IsSpell && card.IsSpell && card == checkerOption.PlayedCard)
{
return true;
}
if (IsDeck && player.DeckCardList.Any((BattleCardBase c) => c == card))
{
return true;
}
if (IsHand && player.HandCardList.Any((BattleCardBase c) => c == card))
{
return true;
}
if (IsField && player.ClassAndInPlayCardList.Any((BattleCardBase c) => c == card))
{
return true;
}
if (IsDestroy && (player.CemeteryList.Any((BattleCardBase c) => c == card) || player.BanishList.Any((BattleCardBase c) => c == card) || player.NecromanceZoneList.Any((BattleCardBase c) => c == card)))
{
return true;
}
if (IsFusionIngredient && player.FusionIngredientList.Any((BattleCardBase c) => c == card))
{
return true;
}
if (isOnWhenReturn && IsField && (player.CemeteryList.Any((BattleCardBase c) => c == card) || player.HandCardList.Any((BattleCardBase c) => c == card)))
{
return true;
}
return false;
}
}
public class SkillResultInfo
{
public List<IReadOnlyBattleCardInfo> drawCards;
public List<IReadOnlyBattleCardInfo> drewOverHandLimitCards;
public List<BattleCardBase> AddLastTargetCards;
public List<List<BattleCardBase>> SelfLastTargetCards;
public List<List<BattleCardBase>> OpponentLastTargetCards;
public List<IReadOnlyBattleCardInfo> UpdatedDeckCards;
public SkillResultInfo()
{
drawCards = new List<IReadOnlyBattleCardInfo>();
drewOverHandLimitCards = new List<IReadOnlyBattleCardInfo>();
AddLastTargetCards = new List<BattleCardBase>();
SelfLastTargetCards = new List<List<BattleCardBase>>();
OpponentLastTargetCards = new List<List<BattleCardBase>>();
UpdatedDeckCards = new List<IReadOnlyBattleCardInfo>();
}
}
public class CallParameter
{
public IEnumerable<BattleCardBase> targetCards;
public SkillProcessor skillProcessor;
public SkillResultInfo calledSkillResultInfo;
}
public class WaitEffectLoadVfx : SequentialVfxPlayer
{
public VfxBase LoadVfx { get; private set; }
public string EffectPath { get; private set; }
public WaitEffectLoadVfx(string effectPath, EffectMgr.EngineType engineType, string sePath, IBattleResourceMgr resourceMgr, Action<EffectBattle> loadEndCallback)
{
if (!BattleManagerBase.GetIns().IsRecovery)
{
EffectPath = effectPath;
WaitCallbackVfx waitCallbackVfx = new WaitCallbackVfx();
LoadVfx = resourceMgr.LoadAndCreateEffectBattleInstance(effectPath, engineType, sePath, delegate(EffectBattle eb)
{
loadEndCallback.Call(eb);
waitCallbackVfx.Callback();
});
Register(LoadVfx);
Register(waitCallbackVfx);
}
}
}
protected List<BuffInfoContainer> buffInfoContainer;
public const int PUBLISHED_ACTIVE_SKILL_COUNT_DEFAULT = -1;
public bool IsNotAssignPublishedActiveSkillCount;
private uint _stopTiming;
public const string PARAM_INDUCTION_ICON = "induction";
public const string OPTION_NULL = "_OPT_NULL_";
private string _inductionSkillVoice;
private string _inductionEvolutionSkillVoice;
public string SkillTimingText;
public const uint CALL_NONE = 0u;
public const uint CALL_START = 1u;
public uint OnWhenPlayStart;
public uint OnWhenHandToNotPlayStart;
public uint OnWhenDestroyStart;
public uint OnWhenDestroyOtherStart;
public uint OnWhenReturnStart;
public uint OnWhenReturnOtherStart;
public uint OnWhenReturnSkillActivateStart;
public uint OnWhenNecromance;
public uint OnWhenUseWhiteRitualStack;
public uint OnBeforeAttackStart;
public uint OnBeforeAttackSelfAndOtherStart;
public uint OnAfterAttackStart;
public uint OnAfterAttackSelfAndOtherStart;
public uint OnSelfTurnStartStart;
public uint OnWhenTurnStartStartImmediate;
public uint OnSelfTurnEndStart;
public uint OnOpponentTurnStartStart;
public uint OnOpponentTurnEndStart;
public uint OnDisCardStart;
public uint OnDisCardOtherStart;
public uint OnWhenUseEpSelfAndOtherStart;
public uint OnWhenEvolveStart;
public uint OnWhenEvolveOtherStart;
public uint OnWhenEvolveSelfAndOtherStart;
public uint OnWhenEvolveBeforeStart;
public uint OnWhenPlayOtherStart;
public uint OnWhenSummonStart;
public uint OnWhenSummonOtherStart;
public uint OnWhenSummonSelfAndOtherStart;
public uint OnWhenSpellChargeStart;
public uint OnInHandStart;
public uint OnInHandStopStart;
public uint OnWhenHealingSelfAndOtherStart;
public uint OnWhenHealOtherStart;
public uint OnWhenDamageStart;
public uint OnWhenDamageSelfAndOtherStart;
public uint OnWhenFightStart;
public uint OnWhenBuffStart;
public uint OnWhenAddToDeckStart;
public uint OnWhenEnhanceStart;
public uint OnWhenAccelerateStart;
public uint OnWhenCrystallizeStart;
public uint OnWhenBurialRiteOther;
public uint OnWhenChoicePlayStart;
public uint OnWhenChoiceEvolveStart;
public uint OnWhenChoiceBrave;
public uint OnWhenBanish;
public uint OnWhenBanishOther;
public uint OnWhenResonanceStart;
public uint OnWhenAccelerate;
public uint OnWhenCrystallize;
public uint OnWhenLeave;
public uint OnWhenDraw;
public uint OnWhenDrawOtherStart;
public uint OnWhenPpHealStart;
public uint OnWhenFusion;
public uint OnWhenFusioned;
public uint OnWhenFusionMetamorphose;
public uint OnAfterFightStart;
public uint OnWhenChantCountChangeStart;
public uint OnWhenChantCountGain;
public uint OnWhenChantCountGainSelfAndOther;
public uint OnWhenFusionOtherStart;
public uint OnWhenGetOnStart;
public uint OnWhenGetOff;
public uint OnWhenLeaveOther;
public uint OnWhenAttachAbility;
public uint OnWhenBuffSelfAndOther;
public uint OnWhenDebuffSelfAndOther;
public uint OnWhenDebuffIncludeSetMaxLife;
public uint OnWhenHealing;
public uint OnWhenShortageDeck;
public uint OnWhenShortageDeckWinSkillActivate;
public uint OnWhenSpecialLose;
public uint OnWhenChangeInPlayImmediate;
public uint OnWhenChangeInPlay;
public uint OnWhenChangeInplaySelfhand;
public uint OnWhenChangeClassLifeInplay;
public uint OnWhenChangeClassLifeSelfhand;
public uint OnWhenChangePPTotal;
public uint OnWhenDrawPriority;
public uint OnWhenAddToHand;
public uint OnSelfTurnStartPriority;
public uint OnWhenBattleStart;
protected bool _isResidentSkillStartFlag;
private List<BattleCardBase> _targetCards;
private const string SUPER_SKYBOUND_ART_TRUE_CONDITION = "{self.super_skybound_art_count}<={me.inplay.class.turn}";
public Func<Func<VfxBase>, VfxBase> CreateInductionSkillActivationVfxFunc;
protected bool? _isMakeFoil = false;
private readonly string[] _previousGetSideLogKeyword = new string[4]
{
SkillFilterCreator.ContentKeyword.fixed_generic_value.ToString(),
SkillFilterCreator.ContentKeyword.activated_random_array.ToString(),
SkillFilterCreator.ContentKeyword.skill_summoned_card_list.ToString(),
SkillFilterCreator.ContentKeyword.distinct_base_card_and_random_index.ToString()
};
protected bool IsContainSelfFilter
{
get
{
if (ApplyAndFilter.Count > 0)
{
return ApplyAndFilter.Any((ApplySkillTargetFilterCollection f) => f.TargetFilter is SkillTargetSelfFilter || f.TargetFilter is SkillTargetHandSelfFilter);
}
if (!(ApplyingTargetFilter is SkillTargetSelfFilter))
{
return ApplyingTargetFilter is SkillTargetHandSelfFilter;
}
return true;
}
}
protected virtual bool IsBattleLog => !SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.IsVirtualBattle;
public bool IsHaveLastTarget
{
get
{
if (ApplyingTargetFilter is NetworkSkillTargetLastTargetFilter)
{
return true;
}
if (ApplyAndFilter.Count > 0)
{
for (int i = 0; i < ApplyAndFilter.Count; i++)
{
if (ApplyAndFilter[i].TargetFilter is NetworkSkillTargetLastTargetFilter)
{
return true;
}
}
}
return false;
}
}
public virtual bool IsAllowDestroyTarget => false;
public bool SelectCompleteFlag { get; set; }
public bool IsInvoked { get; protected set; }
public ExecutionInfoCreatorBase _executionInfoCreator { get; protected set; }
public ExecutionBelongInfo _executionBelongInfo { get; protected set; }
public int PublishedActiveSkillCount { get; protected set; }
public string Option { get; private set; }
public int CallCount => OptionValue.ParseInt(CallCountTextValue);
public string CallCountTextValue { get; set; }
public string CallCountText { get; protected set; }
public SkillParameter SkillPrm { get; private set; }
public SkillOptionValue OptionValue { get; set; }
public bool IsUserSelectType
{
get
{
if (!(ApplySelectFilter is SkillUserSelectFilter))
{
return this is Skill_select;
}
return true;
}
}
public bool IsEmptyHandedUserSelectType
{
get
{
if (ApplySelectFilter is SkillUserSelectFilter)
{
return ((SkillUserSelectFilter)ApplySelectFilter).IsEmptyHanded;
}
return false;
}
}
public bool IsBurialRite => PreprocessList.Any((SkillPreprocessBase s) => s is SkillPreprocessBurialRite);
public bool IsRandomUntilDrawSkill
{
get
{
if (this is Skill_draw)
{
return ApplySelectFilter is SkillRandomSelectUntilFilter;
}
return false;
}
}
public bool IsInductionIcon { get; set; }
public ConditionSkillFilterCollection ConditionFilterCollection { get; private set; }
public ISkillBattlePlayerFilter ConditionBattlePlayerFilter
{
get
{
return ConditionFilterCollection.BattlePlayerFilter;
}
set
{
ConditionFilterCollection.BattlePlayerFilter = value;
}
}
public List<ISkillConditionChecker> ConditionCheckerList
{
get
{
return ConditionFilterCollection.ConditionCheckerFilterList;
}
set
{
ConditionFilterCollection.ConditionCheckerFilterList = value;
}
}
public ISkillTargetFilter ConditionTargetFilter
{
get
{
return ConditionFilterCollection.TargetFilter;
}
set
{
ConditionFilterCollection.TargetFilter = value;
}
}
public List<ISkillCardFilter> ConditionCardFilterList => ConditionFilterCollection.CardFilterList;
public ApplySkillTargetFilterCollection ApplyFilterCollection { get; private set; }
public ISkillBattlePlayerFilter ApplyBattlePlayerFilter
{
get
{
return ApplyFilterCollection.BattlePlayerFilter;
}
set
{
ApplyFilterCollection.BattlePlayerFilter = value;
}
}
public ISkillTargetFilter ApplyingTargetFilter
{
get
{
return ApplyFilterCollection.TargetFilter;
}
set
{
ApplyFilterCollection.TargetFilter = value;
}
}
public List<ISkillCardFilter> ApplyCardFilterList => ApplyFilterCollection.CardFilterList;
public List<ISkillCustomSelectFilter> ApplyCustomSelectFilterList => ApplyFilterCollection.ApplyCustomSelectFilterList;
public List<ISkillExclutionFilter> ApplyExclutionFilterList => ApplyFilterCollection.ApplyExclutionFilterList;
public ISkillSelectFilter ApplySelectFilter
{
get
{
return ApplyFilterCollection.ApplySelectFilter;
}
set
{
ApplyFilterCollection.ApplySelectFilter = value;
}
}
public List<ApplySkillTargetFilterCollection> ApplyAndFilter => ApplyFilterCollection.ApplyAndFilter;
public Dictionary<BattleCardBase, List<int>> ApplyAndFilterIndexes { get; private set; } = new Dictionary<BattleCardBase, List<int>>();
public virtual bool IsChoiceType => false;
public bool IsAttachedSkill { get; private set; }
public bool IsAttachedInplaySkill { get; private set; }
public int IndividualId { get; private set; } = -1;
public bool HasIndividualId => IndividualId != -1;
public bool IsDuplicateBanSelfSkill { get; private set; }
public string DuplicateBanSkillNum { get; private set; } = string.Empty;
public string InductionSkillVoice
{
get
{
if (!SkillPrm.ownerCard.IsEvolution)
{
return _inductionSkillVoice;
}
return _inductionEvolutionSkillVoice;
}
}
public List<SkillPreprocessBase> PreprocessList { get; set; }
public IEnumerable<IReadOnlyBattleCardInfo> SkillDrewCards { get; private set; }
public bool IsAllResidentTiming
{
get
{
if (!IsResidentTiming)
{
return IsHandResident;
}
return true;
}
}
public bool IsResidentTiming
{
get
{
if (OnWhenChangeInPlayImmediate == 0 && OnWhenChangeInPlay == 0 && OnWhenChangeClassLifeInplay == 0 && OnWhenChangePPTotal == 0 && OnWhenDrawPriority == 0 && OnWhenAddToHand == 0 && OnSelfTurnStartPriority == 0)
{
return OnWhenTurnStartStartImmediate != 0;
}
return true;
}
}
public bool IsHandResident
{
get
{
if (OnWhenChangeInplaySelfhand == 0)
{
return OnWhenChangeClassLifeSelfhand != 0;
}
return true;
}
}
public bool IsResidentSkillStartFlag => _isResidentSkillStartFlag;
public virtual bool ShowSideLog
{
get
{
if (!GameMgr.GetIns().IsAdmin && !SkillPrm.ownerCard.IsPlayer && SkillPrm.ownerCard.IsInHand && !PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessOpenCard) && OnWhenReturnStart == 0 && OnWhenLeave == 0)
{
return OnWhenGetOff != 0;
}
return true;
}
}
public virtual bool IsShowSideLogSkillType => true;
public virtual bool IsTargetIndicate => true;
public virtual bool IsVisibleTarget { get; protected set; }
public bool IsWhenPlaySkill => OnWhenPlayStart != 0;
public bool IsWhenDestroySkill => OnWhenDestroyStart != 0;
public bool IsWhenEvolveSkill => OnWhenEvolveStart != 0;
public bool IsBeforAttackSkill => OnBeforeAttackStart != 0;
public bool IsBeforeAttackSelfAndOtherSkill => OnBeforeAttackSelfAndOtherStart != 0;
public bool IsAfterAttackSelfAndOtherSkill => OnAfterAttackSelfAndOtherStart != 0;
public bool IsWhenFightSkill => OnWhenFightStart != 0;
public virtual bool IsInductionSkill => IsInductionIcon;
public SkillBase GetAttachSkill
{
get
{
ISkillApplyInformation skillApplyInformation = SkillPrm.ownerCard.SkillApplyInformation;
if (skillApplyInformation != null && skillApplyInformation.AttachedSkillsInfo != null)
{
for (int i = 0; i < skillApplyInformation.AttachedSkillsInfo.AttachedSkills.Count(); i++)
{
if (skillApplyInformation.AttachedSkillsInfo.AttachedSkills.ToList()[i] == this)
{
return skillApplyInformation.AttachedSkillsInfo.CreatorSkillList.ToList()[i];
}
}
}
return null;
}
}
public bool IsNoSelectFusionSkill
{
get
{
if (this is Skill_fusion)
{
return GetSkillSelectCount() == 0;
}
return false;
}
}
public bool IsActivity { get; protected set; }
public bool IsReferencePreviousSkill { get; protected set; }
public bool Used { get; protected set; }
public bool UsedRandom { get; protected set; }
public bool IsScanConditionOk { get; protected set; }
public bool IsOnceCallTiming { get; protected set; }
protected virtual bool IsMakeFoil
{
get
{
if (GetAttachSkill != null)
{
return GetAttachSkill.SkillPrm.ownerCard.BaseParameter.IsFoil;
}
if (SkillPrm.ownerCard is ClassBattleCardBase)
{
if (_isMakeFoil.HasValue)
{
return _isMakeFoil.Value;
}
return false;
}
return SkillPrm.ownerCard.BaseParameter.IsFoil;
}
}
public bool IsDeckSelfSkill
{
get
{
if (!(ConditionTargetFilter is SkillTargetDeckSelfFilter))
{
return ApplyingTargetFilter is SkillTargetDeckSelfFilter;
}
return true;
}
}
public bool IsTargetChoiceSelectSkill => ApplyingTargetFilter is SkillTargetChosenCardsFilter;
public event Action<SkillBase> OnBeforeProcess;
public event Action<SkillBase, List<BattleCardBase>, SkillConditionCheckerOption> OnSkillStart;
public event Func<SkillBase, List<BattleCardBase>, SkillConditionCheckerOption, SkillProcessor, VfxBase> OnSkillEnd;
public event Action<SkillBase, IEnumerable<BattleCardBase>> OnCalcApplyTargets;
public event Action<SkillBase, List<BattleCardBase>, SkillProcessor> OnSkillStopStart;
public event Func<SkillBase, List<BattleCardBase>, SkillConditionCheckerOption, SkillProcessor, VfxBase> OnSkillStopEnd;
public event Action<SkillBase> OnInactiveSkill;
public void CloneBuffInfoContainer(List<BattleCardBase> selfCloneCards, List<BattleCardBase> oppCloneCards, SkillBase sourceSkill)
{
if (sourceSkill == null || sourceSkill.buffInfoContainer == null)
{
return;
}
if (this.buffInfoContainer == null)
{
this.buffInfoContainer = new List<BuffInfoContainer>();
}
for (int i = 0; i < sourceSkill.buffInfoContainer.Count; i++)
{
BuffInfoContainer buffInfoContainer = sourceSkill.buffInfoContainer[i].Clone();
BattleCardBase battleCardBase = selfCloneCards.FindFromCardId(buffInfoContainer._targetCard);
if (battleCardBase == null)
{
battleCardBase = oppCloneCards.FindFromCardId(buffInfoContainer._targetCard);
}
buffInfoContainer._targetCard = battleCardBase;
this.buffInfoContainer.Add(buffInfoContainer);
}
}
public bool IsAddLogIfResident(BattleCardBase target, bool isBuffInfo = false)
{
if (isBuffInfo && target.IsClass && target == SkillPrm.ownerCard)
{
if (!(this is Skill_shield))
{
return this is Skill_damage_cut;
}
return true;
}
if (!IsAllResidentTiming)
{
return true;
}
if (target != SkillPrm.ownerCard)
{
return true;
}
return false;
}
public BuffInfo AddBuffInfoIfNeeded(BattleCardBase target, BattleCardBase previousOwner = null)
{
if (!IsAddLogIfResident(target, isBuffInfo: true))
{
return null;
}
CardParameter cardParameter = ((previousOwner != null) ? previousOwner.BaseParameter : SkillPrm.ownerCard.BaseParameter);
BuffInfo buffInfo = new BuffInfo(cardParameter.BaseCardId, cardParameter.NormalCardId, this);
target.AddBuffInfo(buffInfo);
return buffInfo;
}
public BuffInfo InsertBuffInfoIfNeeded(BattleCardBase target, int index, bool isBaseCardId = false)
{
if (!IsAddLogIfResident(target, isBuffInfo: true))
{
return null;
}
CardParameter baseParameter = SkillPrm.ownerCard.BaseParameter;
BuffInfo buffInfo = new BuffInfo(isBaseCardId ? baseParameter.BaseCardId : baseParameter.CardId, baseParameter.NormalCardId, this);
target.InsertBuffInfo(buffInfo, index);
return buffInfo;
}
public virtual void AddIndividualIdSkillBuffLog(Skill_attach_skill attachSkill, BattleCardBase target)
{
}
public void UpdateClassBuffIfActive(BattleCardBase target)
{
if (SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.IsVirtualBattle)
{
return;
}
IDetailPanelControl detailPanelControl = SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.DetailMgr.DetailPanelControl;
if (detailPanelControl.IsShow)
{
GameMgr.GetIns().GetDataMgr();
List<BattlePlayerBase.MyRotationBonusCondition> list = new List<BattlePlayerBase.MyRotationBonusCondition>();
list.AddRange(target.SelfBattlePlayer.BonusConditionList);
if (detailPanelControl._card != null && detailPanelControl._card.IsClass && detailPanelControl._card.IsPlayer == target.IsPlayer)
{
detailPanelControl.UpdateBuffInfo(target, list);
}
}
}
public void AddBuffInfo(BuffInfoContainer buff)
{
buffInfoContainer.Add(buff);
}
public bool IsContainCardInBuffInfo(BattleCardBase card)
{
return buffInfoContainer.Any((BuffInfoContainer b) => b._targetCard == card);
}
public void ReplaceBuffInfoTargetCard(BattleCardBase oldCard, BattleCardBase newCard)
{
IEnumerable<BuffInfoContainer> enumerable = buffInfoContainer.Where((BuffInfoContainer b) => b._targetCard == oldCard);
if (!enumerable.Any())
{
return;
}
foreach (BuffInfoContainer item in enumerable)
{
item._targetCard = newCard;
}
}
public void ReplaceBuffInfoSkill(BattleCardBase targetCard, SkillBase skill)
{
List<BuffInfoContainer> list = buffInfoContainer.Where((BuffInfoContainer b) => b._targetCard == targetCard).ToList();
for (int num = 0; num < list.Count; num++)
{
list[num]._attachSkill = skill;
}
}
public BuffInfoContainer PopBuffInfo(BattleCardBase card)
{
BuffInfoContainer buffInfoContainer = this.buffInfoContainer.FirstOrDefault((BuffInfoContainer b) => b._targetCard == card);
if (buffInfoContainer != null)
{
this.buffInfoContainer.Remove(buffInfoContainer);
}
return buffInfoContainer;
}
public BuffInfoContainer GetBuffInfo(BattleCardBase card)
{
return buffInfoContainer.FirstOrDefault((BuffInfoContainer b) => b._targetCard == card);
}
public List<BuffInfoContainer> GetBuffInfoContainer()
{
return buffInfoContainer;
}
public void SetInvoked(bool flag)
{
IsInvoked = flag;
}
public bool IsHaveApplicableTargetFilter<T>()
{
if (!(ApplyingTargetFilter is T))
{
return ApplyAndFilter.Any((ApplySkillTargetFilterCollection f) => f.TargetFilter is T);
}
return true;
}
public void InitSetIndividualId()
{
if (Option.Contains(SkillFilterCreator.ContentKeyword.is_individual.ToString()) || SkillPrm.buildInfo._preprocess.Contains(SkillFilterCreator.ContentKeyword.is_individual.ToString()))
{
IndividualId = SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.NextIndividualId;
}
}
public void SetIndividualId(int id, bool isForce = false)
{
if (isForce || Option.Contains(SkillFilterCreator.ContentKeyword.is_individual.ToString()) || SkillPrm.buildInfo._preprocess.Contains(SkillFilterCreator.ContentKeyword.is_individual.ToString()))
{
IndividualId = id;
}
}
public void SetDuplicateBanSkillNum()
{
string text = OptionValue.GetString(SkillFilterCreator.ContentKeyword.duplicate_ban, string.Empty);
if (text != string.Empty)
{
IsDuplicateBanSelfSkill = text.Split(':')[0] == "self_skill";
DuplicateBanSkillNum = text.Split(':')[1];
}
}
public void SetIsResidentSkillStartFlag(bool flg)
{
_isResidentSkillStartFlag = flg;
}
public void CallOnCalcApplyTargets(SkillBase skill, IEnumerable<BattleCardBase> unapprovedCards)
{
this.OnCalcApplyTargets.Call(skill, unapprovedCards);
}
public SkillBase(SkillParameter skillPrm, string option)
{
PublishedActiveSkillCount = -1;
IsActivity = false;
SkillPrm = skillPrm;
OnSkillEnd += delegate(SkillBase skill, List<BattleCardBase> targets, SkillConditionCheckerOption checkeroption, SkillProcessor skillProcessor)
{
if (skill.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter x) => x.Text.Contains("{self.super_skybound_art_count}<={me.inplay.class.turn}")) && skill.SkillPrm.ownerCard.NormalSkills.Where((SkillBase x) => x.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter y) => y.Text.Contains("{self.super_skybound_art_count}<={me.inplay.class.turn}"))).First() == skill)
{
skill.SkillPrm.selfBattlePlayer.GameSuperSkyboundArtCards.Add(skill.SkillPrm.ownerCard);
}
return NullVfx.GetInstance();
};
OptionValue = new SkillOptionValue(skillPrm.buildInfo._parsedOption);
Option = option;
IsInductionIcon = skillPrm.buildInfo._icon.Contains("induction");
buffInfoContainer = new List<BuffInfoContainer>();
ConditionFilterCollection = new ConditionSkillFilterCollection();
ConditionCheckerList = new List<ISkillConditionChecker>();
ApplyFilterCollection = new ApplySkillTargetFilterCollection();
PreprocessList = new List<SkillPreprocessBase>();
if (skillPrm.ownerCard.SelfBattlePlayer.BattleMgr is NetworkBattleManagerBase && !GameMgr.GetIns().IsAINetwork)
{
if (GameMgr.GetIns().IsReplayBattle)
{
_executionInfoCreator = new ReplayExecutionInfoCreator(this);
}
else
{
_executionInfoCreator = new NetworkExecutionInfoCreator(this);
}
}
else
{
_executionInfoCreator = new SingleExecutionInfoCreator(this);
}
_executionBelongInfo = new ExecutionBelongInfo();
IsReferencePreviousSkill = GetIsReferencePreviousSkill();
}
public SkillProcessor.ProcessInfo CreateStopProcessInfoResidentSkill(bool isPlayer, SkillProcessor skillProcessor, BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption checkerOption)
{
return new SkillProcessor.StopProcessInfoResidentSkill(SkillPrm.ownerCard, this, isPlayer, skillProcessor, playerInfoPair, checkerOption);
}
private bool GetIsReferencePreviousSkill()
{
return Data.Master.WhenPlayEffectKeywordMaster.Any((string key) => SkillPrm.buildInfo._checkTargetKeywords.Contains(key));
}
public void SetAndAddPublishedActiveSkillCount()
{
if (!SkillPrm.selfBattlePlayer.BattleMgr.IsVirtualBattle && !(this is Skill_none) && !IsNotAssignPublishedActiveSkillCount)
{
PublishedActiveSkillCount = SkillPrm.selfBattlePlayer.BattleMgr.AllPublishedActiveSkillCount;
SkillPrm.selfBattlePlayer.BattleMgr.AllPublishedActiveSkillCount++;
SkillPrm.selfBattlePlayer.BattleMgr.AddPublishedSkillList(this);
}
}
public void SetPublishedActiveSkillCount(int count)
{
if (!SkillPrm.selfBattlePlayer.BattleMgr.IsVirtualBattle && !(this is Skill_none) && PublishedActiveSkillCount == -1)
{
PublishedActiveSkillCount = count;
}
}
public void SetCallCountText(string text)
{
CallCountText = text;
}
public bool CheckCondition(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
bool result = false;
if (SkillPrm.ownerCard.IsCantActivateFanfare && IsWhenPlaySkill)
{
return result;
}
result = _executionInfoCreator.CheckCondition(playerInfoPair, option, isPrePlay);
if (result && !isPrePlay)
{
_executionBelongInfo.SetBelong(SkillPrm.ownerCard.SelfBattlePlayer, SkillPrm.ownerCard);
}
return result;
}
public bool CheckConditionAI(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
bool result = false;
if (SkillPrm.ownerCard.IsCantActivateFanfare && IsWhenPlaySkill)
{
return result;
}
result = _executionInfoCreator.CheckCondition(playerInfoPair, option, isPrePlay);
if (result && !isPrePlay)
{
_executionBelongInfo.SetBelong(SkillPrm.ownerCard.SelfBattlePlayer, SkillPrm.ownerCard);
}
return result;
}
public void SetScanCondition(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
IsScanConditionOk = _executionInfoCreator.CheckScanCondition(playerInfoPair, option, isPrePlay);
}
public bool VisualCheckCondition(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
bool result = false;
if (SkillPrm.ownerCard.IsCantActivateFanfare && IsWhenPlaySkill)
{
return result;
}
if ((ApplyingTargetFilter is SkillTargetHandFilter || ApplyingTargetFilter is SkillTargetHandOtherSelfFilter) && IsUserSelectType && GetSelectableCards(playerInfoPair, option).Count() == 0)
{
return false;
}
return _executionInfoCreator.VisualCheckCondition(playerInfoPair, option, isPrePlay);
}
public VfxBase Preprocess(SkillProcessor skillProcessor, SkillConditionCheckerOption checkerOptionr)
{
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
foreach (SkillPreprocessBase preprocess in PreprocessList)
{
BattlePlayerPair playerPair = new BattlePlayerPair(SkillPrm.selfBattlePlayer, SkillPrm.opponentBattlePlayer);
VfxBase vfx = preprocess.Start(playerPair, this, skillProcessor, OptionValue, checkerOptionr);
parallelVfxPlayer.Register(vfx);
}
return parallelVfxPlayer;
}
public IEnumerable<BattleCardBase> CalcApplyTargets(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, ref int targetCount, bool isCheckInHand = false)
{
return _executionInfoCreator.CalcApplyTargets(playerInfoPair, option, ref targetCount, isCheckInHand);
}
public IEnumerable<BattleCardBase> GetSelectableCards(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isSkipForceSelect = false, List<BattleCardBase> selectedCards = null)
{
return _executionInfoCreator.GetSelectableCards(playerInfoPair, option, isSkipForceSelect, selectedCards);
}
public IEnumerable<IReadOnlyBattleCardInfo> FilteringSneakTarget(IEnumerable<IReadOnlyBattleCardInfo> targets)
{
if (IsUserSelectType)
{
return targets.Where((IReadOnlyBattleCardInfo c) => (!c.SkillApplyInformation.CantBeFocusedSkill && (!(SkillPrm.ownerCard is SpellBattleCard) || !c.SkillApplyInformation.CantBeFocusedSpell)) || SkillPrm.ownerCard.IsPlayer == c.IsPlayer);
}
return targets;
}
public IEnumerable<IReadOnlyBattleCardInfo> FilteringByTargetFilter(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option)
{
if (ApplyAndFilter.Count > 0)
{
List<IReadOnlyBattleCardInfo> list = new List<IReadOnlyBattleCardInfo>();
for (int i = 0; i < ApplyAndFilter.Count; i++)
{
IEnumerable<IBattlePlayerReadOnlyInfo> battlePlayerInfos = ApplyAndFilter[i].BattlePlayerFilter.Filtering(playerInfoPair);
list.AddRange(ApplyAndFilter[i].TargetFilter.Filtering(battlePlayerInfos, option));
}
return list.Distinct();
}
IEnumerable<IBattlePlayerReadOnlyInfo> battlePlayerInfos2 = ApplyBattlePlayerFilter.Filtering(playerInfoPair);
return ApplyingTargetFilter.Filtering(battlePlayerInfos2, option);
}
public IEnumerable<IReadOnlyBattleCardInfo> FilteringForceSelectTargets(IEnumerable<IReadOnlyBattleCardInfo> targets)
{
if (IsUserSelectType && targets.Any((IReadOnlyBattleCardInfo c) => c.SkillApplyInformation.IsForceSkillTarget && c.IsPlayer != SkillPrm.ownerCard.IsPlayer))
{
return targets.Where((IReadOnlyBattleCardInfo c) => c.SkillApplyInformation.IsForceSkillTarget && SkillPrm.ownerCard.IsPlayer != c.IsPlayer);
}
return targets;
}
protected VfxWithLoading CreateSkillEffect(IBattleResourceMgr resourceMgr, IEnumerable<BattleCardBase> targetCards, bool isFollowInHand = false, bool addToLastOperation = false, bool skipCallOnEffect = false)
{
if (!SkillPrm.ownerCard.IsPlayer && !GameMgr.GetIns().IsAdminWatch && ApplyingTargetFilter is SkillTargetHandSelfFilter)
{
return NullVfxWithLoading.GetInstance();
}
if (!skipCallOnEffect)
{
SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.OperateMgr.CallOnEffect(SkillPrm.buildInfo, isFollowInHand, isTargetPosition: false, addToLastOperation, OnWhenFusioned != 0);
}
if (BattleManagerBase.GetIns().IsRecovery)
{
return NullVfxWithLoading.GetInstance();
}
Func<Vector3> func = SkillPrm.afterFallPos;
if (SkillPrm.ownerCard.IsSpell || OnWhenFusioned != 0)
{
func = () => SkillPrm.selfBattlePlayer.Class.BattleCardView.GameObject.transform.position;
}
if (string.IsNullOrEmpty(SkillPrm.buildInfo._effectPath))
{
return NullVfxWithLoading.GetInstance();
}
switch (SkillPrm.buildInfo._effectTargetType)
{
case EffectMgr.TargetType.NONE:
return NullVfxWithLoading.GetInstance();
case EffectMgr.TargetType.NONE_WAIT:
return VfxWithLoading.Create(WaitVfx.Create(SkillPrm.buildInfo._effectTime));
case EffectMgr.TargetType.SINGLE:
if (isFollowInHand)
{
return CreateSingleFollowInHandVfx(targetCards, SkillPrm.buildInfo._effectPath, SkillPrm.buildInfo._sePath);
}
return CreateSingleVfx(resourceMgr, func, targetCards, addToLastOperation);
case EffectMgr.TargetType.AREA_SELF:
return CreateAreaVfx(resourceMgr, func, SkillPrm.selfBattlePlayer.GetFieldCenterPosition());
case EffectMgr.TargetType.AREA_OPPONENT:
return CreateAreaVfx(resourceMgr, func, SkillPrm.opponentBattlePlayer.GetFieldCenterPosition());
case EffectMgr.TargetType.AREA_ALL:
return CreateAreaVfx(resourceMgr, func, Vector3.zero);
case EffectMgr.TargetType.SINGLE_ONLY_OPPONENT:
{
List<BattleCardBase> targetCards2 = targetCards.Where((BattleCardBase s) => s.IsPlayer != SkillPrm.ownerCard.IsPlayer).ToList();
return CreateSingleVfx(resourceMgr, func, targetCards2, addToLastOperation);
}
default:
return NullVfxWithLoading.GetInstance();
}
}
public VfxWithLoading CreateSkillEffectFromPath(string effectPath, string sePath, IBattleResourceMgr resourceMgr, EffectMgr.EngineType engineType, EffectMgr.MoveType moveType, Func<Vector3> getEffectStartPoint, Func<Vector3> getEffectEndPoint, float animationTime, Color color)
{
if (string.IsNullOrEmpty(effectPath))
{
return NullVfxWithLoading.GetInstance();
}
EffectBattle effectBattle = null;
WaitEffectLoadVfx loadingVfx = new WaitEffectLoadVfx(effectPath, engineType, sePath, resourceMgr, delegate(EffectBattle eb)
{
effectBattle = eb;
});
DelaySetupVfx mainVfx = new DelaySetupVfx(() => new SkillEffectBattleVfx(effectBattle, SkillPrm.ownerCard.BattleCardView, SkillPrm.resourceMgr, getEffectStartPoint, getEffectEndPoint, 0f, animationTime, moveType, SkillPrm.ownerCard.IsPlayer, color));
return VfxWithLoading.Create(loadingVfx, mainVfx);
}
public static VfxWithLoading CreateSingleFollowInHandVfx(IEnumerable<BattleCardBase> targetCards, string effectPath, string sePath)
{
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create();
foreach (BattleCardBase targetCard in targetCards)
{
GameObject effectGameObject = null;
WaitLoadEffectAndSetSeVfx vfx = new WaitLoadEffectAndSetSeVfx(effectPath, sePath, delegate(GameObject e)
{
effectGameObject = e;
});
parallelVfxPlayer.Register(vfx);
PlayEffectAndSeVfx vfx2 = new PlayEffectAndSeVfx(() => effectGameObject, targetCard.BattleCardView.Transform, isFollow: false, isFollowPosition: false, isFollowAll: true);
parallelVfxPlayer2.Register(vfx2);
}
return VfxWithLoading.Create(parallelVfxPlayer, parallelVfxPlayer2);
}
protected VfxWithLoading CreateSingleVfx(IBattleResourceMgr resourceMgr, Func<Vector3> getEffectStartPoint, IEnumerable<BattleCardBase> targetCards, bool addToLastOperation = false)
{
return CreateSingleVfx(resourceMgr, getEffectStartPoint, targetCards, SkillPrm.ownerCard.IsPlayer, SkillPrm.ownerCard.BattleCardView, SkillPrm.buildInfo._effectPath, SkillPrm.buildInfo._engineType, SkillPrm.buildInfo._sePath, SkillPrm.buildInfo._effectMoveType, SkillPrm.buildInfo._effectTargetType, SkillPrm.buildInfo._effectTime);
}
public static VfxWithLoading CreateSingleVfx(IBattleResourceMgr resourceMgr, Func<Vector3> getEffectStartPoint, IEnumerable<BattleCardBase> targetCards, bool isPlayer, IBattleCardView battleCardView, string effectPath, EffectMgr.EngineType engineType, string sePath, EffectMgr.MoveType effectMoveType, EffectMgr.TargetType effectTargetType, float effectTime)
{
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create();
for (int i = 0; i < targetCards.Count(); i++)
{
BattleCardBase targetCard = targetCards.ElementAt(i);
EffectBattle effectBattle = null;
parallelVfxPlayer.Register(new WaitEffectLoadVfx(effectPath, engineType, sePath, resourceMgr, delegate(EffectBattle eb)
{
effectBattle = eb;
}));
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
sequentialVfxPlayer.Register(new DelaySetupVfx(() => new SkillEffectBattleVfx(effectBattle, getEffectStartPoint, resourceMgr, () => targetCard.BattleCardView.CardWrapObject.transform.position, 0f, isPlayer, battleCardView, effectMoveType, effectTargetType, effectTime, targetCard.BattleCardView)));
parallelVfxPlayer2.Register(sequentialVfxPlayer);
}
return VfxWithLoading.Create(parallelVfxPlayer, parallelVfxPlayer2);
}
private VfxWithLoading CreateAreaVfx(IBattleResourceMgr resourceMgr, Func<Vector3> effectStartPoint, Vector3 effectEndPoint)
{
return CreateAreaVfx(resourceMgr, effectStartPoint, effectEndPoint, SkillPrm.ownerCard.IsPlayer, SkillPrm.ownerCard.BattleCardView, SkillPrm.buildInfo._effectPath, SkillPrm.buildInfo._engineType, SkillPrm.buildInfo._sePath, SkillPrm.buildInfo._effectMoveType, SkillPrm.buildInfo._effectTargetType, SkillPrm.buildInfo._effectTime);
}
public static VfxWithLoading CreateAreaVfx(IBattleResourceMgr resourceMgr, Func<Vector3> effectStartPoint, Vector3 effectEndPoint, bool isPlayer, IBattleCardView battleCardView, string effectPath, EffectMgr.EngineType engineType, string sePath, EffectMgr.MoveType effectMoveType, EffectMgr.TargetType effectTargetType, float effectTime)
{
EffectBattle effectBattle = null;
WaitEffectLoadVfx loadingVfx = new WaitEffectLoadVfx(effectPath, engineType, sePath, resourceMgr, delegate(EffectBattle eb)
{
effectBattle = eb;
});
DelaySetupVfx mainVfx = new DelaySetupVfx(() => new SkillEffectBattleVfx(effectBattle, effectStartPoint, resourceMgr, () => effectEndPoint, 0f, isPlayer, battleCardView, effectMoveType, effectTargetType, effectTime, battleCardView));
return VfxWithLoading.Create(loadingVfx, mainVfx);
}
private VfxBase AttachEffectToCard(BattleCardBase targetCard, Func<EffectBattle> getEffectBattle)
{
return InstantVfx.Create(delegate
{
EffectBattle effectBattle = getEffectBattle();
effectBattle.transform.localScale = targetCard.BattleCardView.Transform.localScale;
effectBattle.transform.SetParent(targetCard.BattleCardView.Transform);
effectBattle.transform.localPosition = Vector3.zero;
effectBattle.transform.localRotation = Quaternion.identity;
});
}
public abstract VfxWithLoading Start(CallParameter parameter);
public virtual VfxWithLoading Stop(SkillProcessor skillProcessor)
{
this.OnSkillStopStart.Call(this, _targetCards, skillProcessor);
return NullVfxWithLoading.GetInstance();
}
protected void StopEnd(SkillProcessor skillProcessor)
{
this.OnSkillStopEnd.Call(this, _targetCards, new SkillConditionCheckerOption(), skillProcessor);
}
public virtual VfxWithLoading RemoveAfter()
{
return NullVfxWithLoading.GetInstance();
}
public virtual bool IsRefVariable(string variableName)
{
return Regex.IsMatch(Option, variableName);
}
public virtual void SkillCreateEnd()
{
}
public int GetSkillSelectCount()
{
if (IsChoiceType)
{
return ChoiceUtility.GetNumberOfCardsToSelect(this);
}
if (IsBurialRite && !IsUserSelectType)
{
return 1;
}
if (ApplySelectFilter is SkillUserSelectFilter skillUserSelectFilter)
{
return skillUserSelectFilter.CalcCount(OptionValue);
}
if (this is Skill_select)
{
return 1;
}
return 0;
}
protected string GetEachOption()
{
return OptionValue.GetString(SkillFilterCreator.ContentKeyword.each, string.Empty);
}
protected int GetEachOptionValue(string getValueOption, BattleCardBase card)
{
return getValueOption switch
{
"life" => card.Life,
"attack" => card.Atk,
_ => -1,
};
}
public void SetStopTiming(uint stopTiming)
{
_stopTiming = stopTiming;
}
public void SetIsAttachSkill(bool flag, bool isInplay)
{
IsAttachedSkill = flag;
IsAttachedInplaySkill = flag && isInplay;
}
public bool IsStopTiming()
{
if (IsAllResidentTiming)
{
return IsResidentSkillStartFlag;
}
return false;
}
public SkillProcessor.ProcessInfo CreateProcessInfo(bool isPlayer, SkillProcessor skillProcessor, BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption checkerOption, bool isInductionSkill)
{
return new SkillProcessor.ProcessInfoSkill(SkillPrm.ownerCard, this, isPlayer, skillProcessor, playerInfoPair, checkerOption);
}
public VfxBase CallStart(SkillProcessor skillProcessor, BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption checkerOption, CallParameter parameter, SkillProcessor.ProcessCallType callType = SkillProcessor.ProcessCallType.Start, bool isLoop = false)
{
this.OnBeforeProcess.Call(this);
bool flag = false;
SkillBase skill = this;
checkerOption.SkillDrewCards = parameter.calledSkillResultInfo.drawCards.ToList();
SkillDrewCards = checkerOption.SkillDrewCards;
checkerOption.SkillUpdatedDeckCards = parameter.calledSkillResultInfo.UpdatedDeckCards.ToList();
checkerOption.DrewOverHandLimitCards = parameter.calledSkillResultInfo.drewOverHandLimitCards.ToList();
checkerOption.ProcessSkillList = skillProcessor.GetProcessSkillList();
parameter.calledSkillResultInfo.SelfLastTargetCards = skill.SkillPrm.ownerCard.SelfBattlePlayer.LastTargetCardsList;
parameter.calledSkillResultInfo.OpponentLastTargetCards = skill.SkillPrm.ownerCard.OpponentBattlePlayer.LastTargetCardsList;
SkillCollectionBase.SetupOptionValue(skill.OptionValue, playerInfoPair, SkillPrm.ownerCard, skill, checkerOption);
int num = skill.CallCount;
if (skill is Skill_summon_token)
{
int max = 6 - skill.SkillPrm.ownerCard.SelfBattlePlayer.InPlayCards.Count();
num = Mathf.Clamp(num, 1, max);
}
VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create();
BattleManagerBase.GetIns().OperateMgr.CallOnSkillVfxStart();
for (int i = 0; i < num; i++)
{
if (SkillPrm.selfBattlePlayer.Class.IsDead || SkillPrm.opponentBattlePlayer.Class.IsDead)
{
continue;
}
if (!skill.PreprocessList.All((SkillPreprocessBase p) => p.IsRight(playerInfoPair, checkerOption, PreexecutionCheck: true, callType == SkillProcessor.ProcessCallType.ResidentStop)) || !LightCheckAvailable(skill, checkerOption))
{
checkerOption.IsRefPrev = false;
break;
}
string skillDescription = string.Empty;
JsonData sideLogCardData = null;
bool isDeckSelf = (skill is Skill_summon_card || skill is Skill_draw || skill is Skill_token_draw || skill is Skill_summon_token) && IsDeckSelfSkill;
bool isInHand = skill.SkillPrm.ownerCard.IsInHand;
if (skill.SkillPrm.ownerCard.BaseParameter.SkillDescription.Contains("skill_activated_count") && skill.SkillPrm.ownerCard.HasSkillActivatedCountWrapValue)
{
skillDescription = skill.SkillPrm.ownerCard.GetCardSkillDescription(new BattlePlayerBase.SideLogInfo(skill), SkillPrm.ownerCard.IsEvolution);
sideLogCardData = BattleManagerBase.GetIns().OperateMgr.CallOnCreateSideLogCardData(skill.SkillPrm.ownerCard, skill, isDeckSelf, isInHand);
}
VfxBase vfxToRegister = skill.Preprocess(skillProcessor, checkerOption);
checkerOption.IsRefPrev = true;
vfxWithLoadingSequential.RegisterToMainVfx(vfxToRegister);
int targetCount = 0;
VfxWith<List<BattleCardBase>, Dictionary<int, BattleCardBase>> vfxWith = _executionInfoCreator.FixedSkillApplyTarget(skill.SkillPrm.CreateInfoPair(), checkerOption, ref targetCount);
skill.Used = true;
if (ApplySelectFilter is SimulateRandomSelectFilter)
{
skill.UsedRandom = true;
}
List<IReadOnlyBattleCardInfo> nextTargetCards = new List<IReadOnlyBattleCardInfo>();
if (vfxWith.Value_1.Count() > 0)
{
nextTargetCards = GetNextBattleCard(vfxWith.Value_1, vfxWith.Value_1.ToList()[0].SelfBattlePlayer);
}
this.OnSkillStart.Call(this, vfxWith.Value_1, checkerOption);
bool flag2 = CheckAvailableTargets(skill, vfxWith.Value_1, checkerOption);
VfxBase vfxBase = null;
bool flag3 = IsSkipInduction(callType);
if (!flag && !flag3)
{
vfxBase = CreateSkillInductionEffect();
vfxWithLoadingSequential.RegisterToMainVfx(vfxBase);
flag = true;
}
bool isEvolve = SkillPrm.ownerCard.IsEvolution || (SkillPrm.ownerCard.IsEvolvedOnWhenLeave && (skill.OnWhenLeave != 0 || skill.OnWhenReturnStart != 0));
if (IsPreviousGetSideLogText(skill.SkillPrm.ownerCard.BaseParameter.SkillDescription))
{
skillDescription = skill.SkillPrm.ownerCard.GetCardSkillDescription(new BattlePlayerBase.SideLogInfo(skill), isEvolve);
sideLogCardData = BattleManagerBase.GetIns().OperateMgr.CallOnCreateSideLogCardData(skill.SkillPrm.ownerCard, skill, isDeckSelf, isInHand);
}
bool flag4 = true;
if (callType == SkillProcessor.ProcessCallType.ResidentStop && ConditionCheckerList.Where((ISkillConditionChecker c) => c is SkillConditionTurn).Any((ISkillConditionChecker t) => !t.IsRight(playerInfoPair, checkerOption)))
{
flag4 = false;
}
bool flag5 = !(ApplyingTargetFilter is SkillTargetChosenCardsFilter) || (ApplyingTargetFilter is SkillTargetChosenCardsFilter && skill.IsWhenEvolveSkill);
if (!flag3 && skill.ShowSideLog && CheckShowSideLogCondition(vfxWith.Value_1, flag2, callType) && skill.OnWhenSpellChargeStart == 0 && !skill.IsChoiceType && flag5 && i == 0 && !isLoop && flag4 && IsShowSideLogSkillType)
{
SideLogControl sideLogControl = skill.SkillPrm.ownerCard.SelfBattlePlayer.BattleView.GetSideLogControl(isSkillTargetSelect: false);
bool isOnSummonOrReturnTiming = sideLogControl != null && sideLogControl.IsOnSummonOrReturnTimingSkill(skill);
skillProcessor.OnSkillStart += delegate
{
BattleManagerBase.GetIns().OperateMgr.CallOnCreateSideLog(skill.SkillPrm.ownerCard, skill, isEvolve, isOnSummonOrReturnTiming, isDeckSelf, isInHand, sideLogCardData);
return skill.SkillPrm.ownerCard.CreateShowLogVfx(3f, skill, isEvolve, skillDescription);
};
}
if (flag2)
{
parameter.targetCards = vfxWith.Value_1;
VfxWithLoading vfxWithLoading;
if (callType == SkillProcessor.ProcessCallType.ResidentStop)
{
vfxWithLoading = skill.Stop(parameter.skillProcessor);
}
else
{
if (skill.IsBattleLog)
{
BattleLogManager.GetInstance().InsertExclusionTargetListLog(skill);
}
vfxWithLoading = skill.Start(parameter);
skillProcessor.AddProcessSkilList(this);
}
if (vfxBase != null && !(vfxBase is NullVfx) && !(vfxWithLoading.MainVfx is NullVfx))
{
vfxWithLoadingSequential.RegisterToMainVfx(vfxBase);
}
vfxWithLoadingSequential.RegisterVfxWithLoading(vfxWithLoading);
}
vfxWithLoadingSequential.RegisterToMainVfx(vfxWith.Vfx);
if (!(this is Skill_select) && !(this is Skill_copy_skill))
{
List<BattleCardBase> list = vfxWith.Value_2.Values.ToList();
if (list.Count > 0)
{
SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.OperateMgr.CallOnShowIndependentEffect(list);
}
}
vfxWithLoadingSequential.RegisterToMainVfx(this.OnSkillEnd.GetAllFuncVfxResults(this, vfxWith.Value_1, checkerOption, parameter.skillProcessor));
List<BattleCardBase> value_ = vfxWith.Value_1;
foreach (KeyValuePair<int, BattleCardBase> item3 in vfxWith.Value_2)
{
value_.Insert(item3.Key, item3.Value);
}
if (OnWhenChangeInPlayImmediate == 0)
{
List<BattleCardBase> list2 = value_.Where((BattleCardBase c) => skill.SkillPrm.ownerCard.IsPlayer == c.IsPlayer).ToList();
List<BattleCardBase> list3 = value_.Where((BattleCardBase c) => skill.SkillPrm.ownerCard.IsPlayer != c.IsPlayer).ToList();
list2.AddRange(parameter.calledSkillResultInfo.AddLastTargetCards.Where((BattleCardBase c) => skill.SkillPrm.ownerCard.IsPlayer == c.IsPlayer).ToList());
list3.AddRange(parameter.calledSkillResultInfo.AddLastTargetCards.Where((BattleCardBase c) => skill.SkillPrm.ownerCard.IsPlayer != c.IsPlayer).ToList());
skill.SkillPrm.ownerCard.SelfBattlePlayer.LastTargetCardsList.Insert(0, new List<BattleCardBase>());
skill.SkillPrm.ownerCard.OpponentBattlePlayer.LastTargetCardsList.Insert(0, new List<BattleCardBase>());
parameter.calledSkillResultInfo.AddLastTargetCards.Clear();
if (!IsHandResident)
{
for (int num2 = 0; num2 < list2.Count; num2++)
{
BattleCardBase item = list2[num2];
skill.SkillPrm.ownerCard.SelfBattlePlayer.LastTargetCardsList.First().Add(item);
}
for (int num3 = 0; num3 < list3.Count; num3++)
{
BattleCardBase item2 = list3[num3];
skill.SkillPrm.ownerCard.OpponentBattlePlayer.LastTargetCardsList.First().Add(item2);
}
}
}
_targetCards = vfxWith.Value_1.ToList();
checkerOption.NextTargetCards = nextTargetCards;
if (OptionValue.HasInfoByName(SkillFilterCreator.ContentKeyword.save_target))
{
skill.SkillPrm.ownerCard.SkillApplyInformation.SaveTargetList(_targetCards);
}
if (OptionValue.HasInfoByName(SkillFilterCreator.ContentKeyword.save_target_card_id))
{
skill.SkillPrm.ownerCard.SkillApplyInformation.SaveTargetList(_targetCards);
string[] array = OptionValue.GetString(SkillFilterCreator.ContentKeyword.save_target_card_id).Split(':');
long num4 = long.Parse(array[0]);
if (array.Count() > 1 && array[1] == SkillFilterCreator.ContentKeyword.is_individual.ToString())
{
num4 += IndividualId;
}
skill.SkillPrm.selfBattlePlayer.Class.SkillApplyInformation.SaveTargetCardId(num4, _targetCards.Select((BattleCardBase c) => c.BaseParameter.NormalCardId).ToList());
}
checkerOption.SetCheckerOptionTransientValue(SkillPrm.ownerCard.SelfBattlePlayer, SkillPrm.ownerCard.OpponentBattlePlayer);
}
if (BattleManagerBase.GetIns() is NetworkBattleManagerBase && (SkillPrm.selfBattlePlayer.Class.IsDead || SkillPrm.opponentBattlePlayer.Class.IsDead))
{
BattleManagerBase.GetIns().LethalPublishedActiveSkillCount = NetworkBattleGenericTool.GetPublishSkillCount(this);
BattleManagerBase.GetIns().LethalMovementCount = NetworkBattleGenericTool.GetSkillMovementNum(this);
}
BattleManagerBase.GetIns().OperateMgr.CallOnSkillVfxEnd();
return vfxWithLoadingSequential;
}
protected virtual bool CheckShowSideLogCondition(IEnumerable<BattleCardBase> targets, bool isTargetsAvailable, SkillProcessor.ProcessCallType type)
{
return true;
}
protected void AddLastTarget(CallParameter parameter, List<BattleCardBase> cards)
{
foreach (BattleCardBase card in cards)
{
parameter.calledSkillResultInfo.AddLastTargetCards.Add(card);
}
}
private List<IReadOnlyBattleCardInfo> GetNextBattleCard(IEnumerable<BattleCardBase> nowTarget, BattlePlayerBase player)
{
List<IReadOnlyBattleCardInfo> list = new List<IReadOnlyBattleCardInfo>();
if (ApplyCustomSelectFilterList.Any((ISkillCustomSelectFilter s) => s is SkillInOrderFromOldestFilter))
{
SkillInOrderFromOldestFilter obj = (SkillInOrderFromOldestFilter)ApplyCustomSelectFilterList.SingleOrDefault((ISkillCustomSelectFilter s) => s is SkillInOrderFromOldestFilter);
List<IReadOnlyBattleCardInfo> list2 = obj.OldTargets.ToList();
IReadOnlyBattleCardInfo readOnlyBattleCardInfo = obj.OldTargets.SingleOrDefault((IReadOnlyBattleCardInfo s) => s.IsClass);
list2.Remove(readOnlyBattleCardInfo);
if (list2.Count > 0 && nowTarget.Count() > 0)
{
int num = list2.IndexOf(nowTarget.Last());
if (nowTarget.Last().IsClass && list2.Count <= 0)
{
list.Add(readOnlyBattleCardInfo);
}
else if (nowTarget.Last().IsClass && list2.Count > 0)
{
list.Add(list2[0]);
}
else if (num != -1 && list2.Count > num + 1)
{
list.Add(list2[num + 1]);
}
else if (readOnlyBattleCardInfo != null)
{
list.Add(readOnlyBattleCardInfo);
}
}
else if (readOnlyBattleCardInfo != null)
{
list.Add(readOnlyBattleCardInfo);
}
}
return list;
}
public void SetSkillVoiceIndex(int voiceIndex)
{
if (voiceIndex == -1)
{
return;
}
int num;
IReadOnlyVoiceInfo readOnlyVoiceInfo;
if (BattleManagerBase.GetIns().IsRecovery)
{
num = ((GetAttachSkill.SkillPrm.ownerCard.BattleCardView is NullBattleCardView) ? 1 : 0);
if (num != 0)
{
readOnlyVoiceInfo = CardVoiceInfoCache.GetCardVoiceInfoForBattle(GetAttachSkill.SkillPrm.ownerCard.CardId);
goto IL_006c;
}
}
else
{
num = 0;
}
readOnlyVoiceInfo = GetAttachSkill.SkillPrm.ownerCard.BattleCardView.VoiceInfo;
goto IL_006c;
IL_006c:
IReadOnlyVoiceInfo readOnlyVoiceInfo2 = readOnlyVoiceInfo;
if (num != 0 && GetAttachSkill is Skill_attach_skill skill_attach_skill)
{
readOnlyVoiceInfo2.AddAttachSkillVoice(skill_attach_skill.BuildInfo._voice);
}
GetAttachSkill.SkillPrm.ownerCard.BattleCardView.VoiceInfo.AddAttachSkillVoice((GetAttachSkill as Skill_attach_skill).BuildInfo._voice);
_inductionSkillVoice = readOnlyVoiceInfo2.GetAttachSkillVoice(voiceIndex);
_inductionEvolutionSkillVoice = readOnlyVoiceInfo2.GetAttachSkillVoice(voiceIndex);
}
public void SetInductionVoiceIndex(bool isSpecialWin = false, bool isNewReplayRecordInRecovery = false)
{
if (!IsInductionSkill && !isSpecialWin)
{
return;
}
BattleCardBase ownerCard = SkillPrm.ownerCard;
IBattleCardView battleCardView = SkillPrm.ownerCard.BattleCardView;
if ((battleCardView == null || battleCardView is NullBattleCardView || ownerCard.SelfBattlePlayer.BattleMgr.IsVirtualBattle || IsAttachedSkill) && !isNewReplayRecordInRecovery)
{
return;
}
IReadOnlyVoiceInfo readOnlyVoiceInfo = (isNewReplayRecordInRecovery ? CardVoiceInfoCache.GetCardVoiceInfoForBattle(ownerCard.CardId) : battleCardView.VoiceInfo);
if (readOnlyVoiceInfo == null)
{
return;
}
int num = ownerCard.NormalSkills.IndexOf(this);
if (num != -1 && ownerCard.IsSpell && ownerCard.NormalSkills.FirstOrDefault() is Skill_spell_charge)
{
num--;
}
if (num != -1)
{
_inductionSkillVoice = readOnlyVoiceInfo.GetSkillVoice(isEvolution: false, num).Voice;
string[] array = _inductionSkillVoice.Split('|');
if (array.Length >= 2)
{
_inductionSkillVoice = array[0];
_inductionEvolutionSkillVoice = array[1];
}
}
if (_inductionEvolutionSkillVoice == null)
{
int num2 = ownerCard.EvolutionSkills.IndexOf(this);
if (num2 != -1)
{
_inductionEvolutionSkillVoice = readOnlyVoiceInfo.GetSkillVoice(isEvolution: true, num2).Voice;
}
else if (num != -1)
{
_inductionEvolutionSkillVoice = _inductionSkillVoice;
}
}
}
protected VfxBase CreateSkillActivationVoiceVfx()
{
if (BattleManagerBase.GetIns().IsRecovery)
{
return NullVfx.GetInstance();
}
string text = (SkillPrm.ownerCard.IsEvolution ? _inductionEvolutionSkillVoice : _inductionSkillVoice);
if (ReadOnlyVoiceInfo.IsInvalidFileName(text))
{
return NullVfx.GetInstance();
}
IBattleCardView battleCardView = SkillPrm.ownerCard.BattleCardView;
string text2 = battleCardView.VoiceInfo.VoiceId;
if (string.IsNullOrEmpty(text2) && !string.IsNullOrEmpty(text) && text != "NONE".ToLower())
{
text2 = text.Split(new string[1] { "_" }, StringSplitOptions.None)[0];
}
return VfxWithLoading.Create(new WaitLoadVoiceResourceVfx(battleCardView, text2), new PlayCRISoundVfx(battleCardView, text));
}
private bool LightCheckAvailable(SkillBase skill, SkillConditionCheckerOption checkerOption)
{
if (skill.IsWhenDestroySkill || skill.OnDisCardStart != 0 || skill.OnWhenChoicePlayStart != 0 || skill.OnWhenChoiceEvolveStart != 0 || skill.OnWhenBanish != 0 || skill.OnWhenLeave != 0 || skill.OnWhenGetOff != 0)
{
return true;
}
if (skill.SkillPrm.ownerCard.IsDead)
{
return false;
}
if (skill.SkillPrm.ownerCard.IsInHand && !skill.SkillPrm.ownerCard.IsSpell && skill.OnWhenPlayStart != 0)
{
return false;
}
if (!skill._executionBelongInfo.CheckBelong(skill.SkillPrm.ownerCard.SelfBattlePlayer, skill.SkillPrm.ownerCard, checkerOption, skill.OnWhenReturnStart != 0))
{
return false;
}
return true;
}
private bool CheckAvailableTargets(SkillBase skill, IEnumerable<BattleCardBase> targets, SkillConditionCheckerOption checkerOption)
{
if (skill.IsWhenDestroySkill || skill.OnDisCardStart != 0 || skill.OnWhenBanish != 0 || skill.OnWhenLeave != 0 || skill.OnWhenGetOff != 0)
{
return true;
}
if (skill.SkillPrm.ownerCard.IsDead)
{
return false;
}
if (skill.OnWhenChoicePlayStart != 0 || skill.OnWhenChoiceEvolveStart != 0)
{
return true;
}
if (!skill._executionBelongInfo.CheckBelong(skill.SkillPrm.ownerCard.SelfBattlePlayer, skill.SkillPrm.ownerCard, checkerOption, skill.OnWhenReturnStart != 0))
{
return false;
}
if (targets.Count() == 0 && !skill.IsTargetIndicate)
{
return true;
}
if (skill.ApplyingTargetFilter is SkillTargetDestroyedCardListFilter || skill.ApplyingTargetFilter is SkillTargetDestroyedCardFilter)
{
return true;
}
if (targets.Any((BattleCardBase c) => c.IsDead) && skill is SkillBaseSummon)
{
return true;
}
if (skill is Skill_stack_white_ritual || skill is Skill_change_white_ritual_stack)
{
return true;
}
if (!targets.Any((BattleCardBase t) => !t.IsDead))
{
return skill.IsAllowDestroyTarget;
}
return true;
}
public bool DoesSkillFulfillActivationConditions(BattlePlayerReadOnlyInfoPair playerInfoPair, bool ignoreHandSkill, bool isPrePlay)
{
if (ignoreHandSkill && IsHandResident)
{
return false;
}
return CheckCondition(playerInfoPair, new SkillConditionCheckerOption(), isPrePlay);
}
private VfxBase CreateSkillInductionEffect()
{
if (IsInductionSkill && !SkillPrm.ownerCard.IsDead && !SkillPrm.ownerCard.IsInHand)
{
VfxBase inductionVoiceVfx = CreateSkillActivationVoiceVfx();
return ParallelVfxPlayer.Create(CreateInductionSkillActivationVfxFunc.GetAllFuncVfxResults(() => inductionVoiceVfx), new ReactiveSkillActivationVfx(SkillPrm.ownerCard));
}
return NullVfx.GetInstance();
}
public bool IsTargetInOpponentHand()
{
if ((SkillPrm.ownerCard.IsPlayer && ApplyBattlePlayerFilter is OpponentBattlePlayerFilter) || (!SkillPrm.ownerCard.IsPlayer && ApplyBattlePlayerFilter is SelfBattlePlayerFilter))
{
return IsTargetInHand();
}
return false;
}
public bool IsTargetInHand()
{
if (ApplyAndFilter.Count > 0)
{
if (ApplyAndFilter.Any((ApplySkillTargetFilterCollection f) => f.TargetFilter is SkillTargetHandFilter || f.TargetFilter is SkillTargetHandOtherSelfFilter || f.TargetFilter is SkillTargetSkillDrewCardFilter))
{
return true;
}
}
else if (ApplyingTargetFilter is SkillTargetHandFilter || ApplyingTargetFilter is SkillTargetHandOtherSelfFilter || ApplyingTargetFilter is SkillTargetSkillDrewCardFilter)
{
return true;
}
List<SkillTargetLastTargetFilter> list = new List<SkillTargetLastTargetFilter>();
if (ApplyAndFilter.Count > 0)
{
list = (from f in ApplyAndFilter
select f.TargetFilter as SkillTargetLastTargetFilter into f
where f != null
select f).ToList();
}
else if (ApplyingTargetFilter is SkillTargetLastTargetFilter)
{
list.Add(ApplyingTargetFilter as SkillTargetLastTargetFilter);
}
for (int num = 0; num < list.Count; num++)
{
if (list[num] == null)
{
continue;
}
int lastTargetIndex = list[num].LastTargetIndex;
bool num2 = ApplyBattlePlayerFilter is SelfBattlePlayerFilter || ApplyingTargetFilter is BothBattlePlayerFilter;
bool flag = ApplyBattlePlayerFilter is OpponentBattlePlayerFilter || ApplyingTargetFilter is BothBattlePlayerFilter;
if (num2)
{
List<BattleCardBase> lastTargetCardsList = SkillPrm.selfBattlePlayer.GetLastTargetCardsList(lastTargetIndex);
if (lastTargetCardsList != null && lastTargetCardsList.Any((BattleCardBase c) => SkillPrm.selfBattlePlayer.HandCardList.Any((BattleCardBase cc) => cc.EquelsID(c))))
{
return true;
}
}
if (flag)
{
List<BattleCardBase> lastTargetCardsList2 = SkillPrm.opponentBattlePlayer.GetLastTargetCardsList(lastTargetIndex);
if (lastTargetCardsList2 != null && lastTargetCardsList2.Any((BattleCardBase c) => SkillPrm.opponentBattlePlayer.HandCardList.Any((BattleCardBase cc) => cc.EquelsID(c))))
{
return true;
}
}
}
return false;
}
public bool IsCheckLastTarget()
{
if (!(ConditionTargetFilter is SkillTargetLastTargetFilter))
{
return ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => f.Lhs.Contains(SkillFilterCreator.ContentKeyword.last_target.ToString()));
}
return true;
}
public static T GetSkillLastOrDefaultBeforeTargetSkill<T>(SkillBase targetSkill) where T : SkillBase
{
List<SkillBase> list = targetSkill.SkillPrm.ownerCard.Skills.ToList();
int num = list.FindIndex((SkillBase s) => s == targetSkill);
if (num <= -1)
{
return null;
}
list.RemoveRange(num, list.Count - num);
return (T)list.LastOrDefault((SkillBase s) => s is T);
}
public List<BattleCardBase> GetDrewCardInHand()
{
IEnumerable<BattleCardBase> source = SkillDrewCards.Select((IReadOnlyBattleCardInfo c) => (BattleCardBase)c);
BattlePlayerBase owner = SkillPrm.ownerCard.SelfBattlePlayer;
return source.Where((BattleCardBase c) => owner.HandCardList.Any((BattleCardBase cc) => cc.EquelsID(c))).ToList();
}
public bool IsNeedCheckConditionOnScan()
{
if (ConditionFilterCollection.ConditionCheckerFilterList.Count < 1)
{
return ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => f.Lhs.Contains(SkillFilterCreator.ContentKeyword.charge_count.ToString()));
}
return true;
}
public bool IsEnhance()
{
if (!IsWhenPlaySkill)
{
return false;
}
if (ConditionCheckerList.FirstOrDefault((ISkillConditionChecker f) => f is SkillConditionPP && ((f as SkillConditionPP).Operator == ">=" || (f as SkillConditionPP).Operator == ">")) is SkillConditionPP skillConditionPP)
{
int pp = skillConditionPP.PpBorder;
return SkillPrm.ownerCard.NormalSkills.Any((SkillBase s) => s.ConditionCheckerList.Any((ISkillConditionChecker f) => f is SkillConditionPP && (f as SkillConditionPP).PpBorder == pp));
}
return false;
}
protected virtual bool IsSkipInduction(SkillProcessor.ProcessCallType callType)
{
if (callType == SkillProcessor.ProcessCallType.ResidentStop)
{
return ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => f.Lhs.Contains("me.hand.count") && f.Rhs == "9");
}
return false;
}
public void ChacheIsMakeFoil()
{
_isMakeFoil = IsMakeFoil;
}
public bool IsLastTargetDiscardOrBanishSkill(SkillConditionCheckerOption option, bool isOnlyCheckBanish = false)
{
if (option == null)
{
return false;
}
if (!ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter f) => f.Lhs.Contains(SkillFilterCreator.ContentKeyword.last_target.ToString())))
{
return false;
}
List<SkillBase> list = new List<SkillBase>(option.ProcessSkillList);
SkillBase skillBase = list.LastOrDefault();
if (skillBase == null)
{
return false;
}
while (skillBase.ApplyingTargetFilter is SkillTargetLastTargetFilter || !skillBase.IsUserSelectType || (!(skillBase.ApplyBattlePlayerFilter is SelfBattlePlayerFilter) && !(skillBase.ApplyBattlePlayerFilter is BothBattlePlayerFilter)))
{
list.Remove(skillBase);
skillBase = list.LastOrDefault();
if (skillBase == null)
{
return false;
}
}
if ((!isOnlyCheckBanish && skillBase is Skill_discard) || skillBase is Skill_banish)
{
return true;
}
return false;
}
public bool IsSameSkill(SkillBase skill)
{
bool num = skill.SkillPrm.ownerCard == SkillPrm.ownerCard;
bool flag = skill.SkillPrm.buildInfo.IsSameSkill(SkillPrm.buildInfo);
bool flag2 = skill.IsAttachedSkill == IsAttachedSkill;
bool flag3 = true;
bool flag4 = skill.IndividualId == IndividualId;
if (skill.IsAttachedSkill && IsAttachedSkill && skill.GetAttachSkill != null && GetAttachSkill != null)
{
flag3 = skill.GetAttachSkill.SkillPrm.ownerCard == GetAttachSkill.SkillPrm.ownerCard;
}
return num && flag && flag2 && flag3 && flag4;
}
public bool CheckConditionWithoutBurialRite(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
bool result = false;
List<ISkillConditionChecker> conditionCheckerFilterList = ConditionFilterCollection.ConditionCheckerFilterList.ToList();
ConditionFilterCollection.ConditionCheckerFilterList = ConditionFilterCollection.ConditionCheckerFilterList.Where((ISkillConditionChecker p) => !(p is SkillPreprocessBurialRite)).ToList();
bool notCheckBuriaRiteCondition = false;
if (_executionInfoCreator is NetworkExecutionInfoCreator networkExecutionInfoCreator)
{
notCheckBuriaRiteCondition = networkExecutionInfoCreator.IsNotCheckBuriaRiteCondition;
networkExecutionInfoCreator.SetNotCheckBuriaRiteCondition(value: false);
}
if (PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessBurialRite) && _executionInfoCreator.CheckCondition(playerInfoPair, option, isPrePlay))
{
result = true;
}
ConditionFilterCollection.ConditionCheckerFilterList = conditionCheckerFilterList;
if (_executionInfoCreator is NetworkExecutionInfoCreator networkExecutionInfoCreator2)
{
networkExecutionInfoCreator2.SetNotCheckBuriaRiteCondition(notCheckBuriaRiteCondition);
}
return result;
}
public bool CheckConditionWithoutChosenCard(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
{
ISkillTargetFilter targetFilter = null;
List<ISkillCardFilter> cardFilter = null;
bool flag = false;
if (ConditionFilterCollection.TargetFilter is SkillTargetChosenCardsFilter)
{
targetFilter = ConditionFilterCollection.TargetFilter;
ConditionFilterCollection.TargetFilter = new SkillTargetSelfFilter(SkillPrm.ownerCard);
cardFilter = ConditionFilterCollection.CardFilterList.ToList();
ConditionFilterCollection.CardFilterList.Clear();
flag = true;
}
bool result = _executionInfoCreator.CheckCondition(playerInfoPair, option, isPrePlay);
if (flag)
{
ConditionFilterCollection.TargetFilter = targetFilter;
ConditionFilterCollection.SetCardFilter(cardFilter);
}
return result;
}
public virtual void SetEventAfterReplace(BattleCardBase card, BuffInfo buff)
{
}
private bool IsPreviousGetSideLogText(string text)
{
return _previousGetSideLogKeyword.Any(text.Contains);
}
public void SetIsOnceCallTiming()
{
IsOnceCallTiming = OnWhenPlayStart + OnWhenHandToNotPlayStart + OnWhenDestroyStart + OnWhenReturnStart + OnBeforeAttackStart + OnAfterAttackStart + OnSelfTurnStartStart + OnSelfTurnEndStart + OnOpponentTurnStartStart + OnOpponentTurnEndStart + OnDisCardStart + OnWhenEvolveStart + OnWhenEvolveBeforeStart + OnWhenPlayOtherStart + OnWhenSummonStart + OnInHandStart + OnInHandStopStart + OnWhenFightStart + OnWhenChoicePlayStart + OnWhenChoiceEvolveStart + OnWhenChoiceBrave + OnWhenBanish + OnWhenAccelerate + OnWhenCrystallize + OnWhenLeave + OnWhenDraw + OnWhenFusion + OnAfterFightStart + OnWhenGetOnStart + OnWhenGetOff + OnWhenShortageDeck + OnWhenBattleStart != 0;
}
public virtual void SetOnLoseEvent(BattleCardBase target, BuffInfo buff, BuffInfoContainer container)
{
}
protected void CallOnUpdateSkillEffect(List<BattleCardBase> targetCards, bool updateAttackEffect = false)
{
if (GameMgr.GetIns().IsNetworkBattle)
{
SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.OperateMgr.CallOnUpdateSkillEffect(targetCards, updateAttackEffect);
}
}
public void CallOnInactiveSkill()
{
this.OnInactiveSkill.Call(this);
}
}