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.
2055 lines
70 KiB
C#
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);
|
|
}
|
|
}
|