3877 lines
126 KiB
C#
3877 lines
126 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using Cute;
|
|
using UnityEngine;
|
|
using Wizard;
|
|
using Wizard.Battle;
|
|
using Wizard.Battle.Card.InnerOptions;
|
|
using Wizard.Battle.Resource;
|
|
using Wizard.Battle.View;
|
|
using Wizard.Battle.View.Vfx;
|
|
|
|
public abstract class BattleCardBase : IReadOnlyBattleCardInfo, IBattleCardUniqueID
|
|
{
|
|
public class BuildInfo
|
|
{
|
|
public GameObject GameObject;
|
|
|
|
public int CardId;
|
|
|
|
public BattlePlayerBase SelfBattlePlayer;
|
|
|
|
public BattlePlayerBase OpponentBattlePlayer;
|
|
|
|
public IBattlePlayerReadOnlyInfo SelfBattlePlayerReadOnlyInfo;
|
|
|
|
public List<SkillCreator.SkillBuildInfo> NormalSkillBuildInfos;
|
|
|
|
public List<SkillCreator.SkillBuildInfo> EvolveSkillBuildInfos;
|
|
|
|
public bool IsPlayer;
|
|
|
|
public int BattleCardIndex;
|
|
|
|
public CardInnerOptionsBase InnerOptions;
|
|
|
|
public BattleManagerBase BattleMgr;
|
|
|
|
public IBattleResourceMgr ResourceMgr;
|
|
|
|
public BuildInfo(GameObject _gameObject, int _cardId, BattlePlayerBase _selfBattlePlayer, BattlePlayerBase _opponentBattlePlayer, IBattlePlayerReadOnlyInfo _selfBattlePlayerReadOnlyInfo, List<SkillCreator.SkillBuildInfo> _normalSkillBuildInfos, List<SkillCreator.SkillBuildInfo> _evolveSkillBuildInfos, bool _isPlayer, int _battleCardIndex, CardInnerOptionsBase _innerOptions, BattleManagerBase _battleMgr, IBattleResourceMgr _resourceMgr)
|
|
{
|
|
GameObject = _gameObject;
|
|
CardId = _cardId;
|
|
SelfBattlePlayer = _selfBattlePlayer;
|
|
OpponentBattlePlayer = _opponentBattlePlayer;
|
|
SelfBattlePlayerReadOnlyInfo = _selfBattlePlayerReadOnlyInfo;
|
|
NormalSkillBuildInfos = _normalSkillBuildInfos;
|
|
EvolveSkillBuildInfos = _evolveSkillBuildInfos;
|
|
IsPlayer = _isPlayer;
|
|
BattleCardIndex = _battleCardIndex;
|
|
InnerOptions = _innerOptions;
|
|
BattleMgr = _battleMgr;
|
|
ResourceMgr = _resourceMgr;
|
|
}
|
|
|
|
public BuildInfo VirtualClone(BattlePlayerBase virtualSelfBattlePlayer, BattlePlayerBase virtualOpponentBattlePlayer)
|
|
{
|
|
return new BuildInfo(null, CardId, virtualSelfBattlePlayer, virtualOpponentBattlePlayer, virtualSelfBattlePlayer, new List<SkillCreator.SkillBuildInfo>(NormalSkillBuildInfos), new List<SkillCreator.SkillBuildInfo>(EvolveSkillBuildInfos), IsPlayer, BattleCardIndex, InnerOptions.VirtualClone(), BattleMgr, ResourceMgr);
|
|
}
|
|
}
|
|
|
|
public class DeathTypeInformation
|
|
{
|
|
public bool WhenDestroy;
|
|
|
|
public bool DestroyedByKiller;
|
|
|
|
public bool ChantDestroy;
|
|
|
|
public bool MysteriesDestroy;
|
|
|
|
public bool BanishDestroy;
|
|
|
|
public bool BurialRite;
|
|
|
|
public bool UseFusionIngredient;
|
|
|
|
public bool UseFusionMetamorphoseIngredient;
|
|
|
|
public bool LeaveByGetOn;
|
|
|
|
public DeathTypeInformation()
|
|
{
|
|
WhenDestroy = false;
|
|
DestroyedByKiller = false;
|
|
ChantDestroy = false;
|
|
MysteriesDestroy = false;
|
|
BanishDestroy = false;
|
|
BurialRite = false;
|
|
UseFusionIngredient = false;
|
|
UseFusionMetamorphoseIngredient = false;
|
|
LeaveByGetOn = false;
|
|
}
|
|
|
|
public DeathTypeInformation Clone()
|
|
{
|
|
return (DeathTypeInformation)MemberwiseClone();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
WhenDestroy = false;
|
|
DestroyedByKiller = false;
|
|
ChantDestroy = false;
|
|
MysteriesDestroy = false;
|
|
BanishDestroy = false;
|
|
BurialRite = false;
|
|
UseFusionIngredient = false;
|
|
UseFusionMetamorphoseIngredient = false;
|
|
LeaveByGetOn = false;
|
|
}
|
|
}
|
|
|
|
public class ParameterChangeInformation
|
|
{
|
|
public int CurrentAtk;
|
|
|
|
public int BaseAtk;
|
|
|
|
public int CurrentHealth;
|
|
|
|
public int MaxHealth;
|
|
|
|
public int BaseHealth;
|
|
|
|
public ParameterChangeInformation(int currentAtk, int baseAtk, int currentHealth, int maxHealth, int baseHealth)
|
|
{
|
|
CurrentAtk = currentAtk;
|
|
BaseAtk = baseAtk;
|
|
CurrentHealth = currentHealth;
|
|
MaxHealth = maxHealth;
|
|
BaseHealth = baseHealth;
|
|
}
|
|
}
|
|
|
|
public class ItWasDamagedCounter
|
|
{
|
|
public int SelfTurnDamage { get; private set; }
|
|
|
|
public int OpponentTurnDamage { get; private set; }
|
|
|
|
public ItWasDamagedCounter()
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
public ItWasDamagedCounter(int selfTurnDamage, int opponentTurnDamage)
|
|
{
|
|
SelfTurnDamage = selfTurnDamage;
|
|
OpponentTurnDamage = opponentTurnDamage;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
SelfTurnDamage = 0;
|
|
OpponentTurnDamage = 0;
|
|
}
|
|
|
|
public void AddDamageCount(bool selfTurn)
|
|
{
|
|
if (selfTurn)
|
|
{
|
|
SelfTurnDamage++;
|
|
}
|
|
else
|
|
{
|
|
OpponentTurnDamage++;
|
|
}
|
|
}
|
|
|
|
public int GetDamageCount(bool selfTurn)
|
|
{
|
|
if (selfTurn)
|
|
{
|
|
return SelfTurnDamage;
|
|
}
|
|
return OpponentTurnDamage;
|
|
}
|
|
}
|
|
|
|
private struct DamageClipping
|
|
{
|
|
public int ClippingMax;
|
|
|
|
public int GiveCount;
|
|
|
|
public DamageClipping(int clippingMax, int count)
|
|
{
|
|
ClippingMax = clippingMax;
|
|
GiveCount = count;
|
|
}
|
|
}
|
|
|
|
public struct TransformInformation
|
|
{
|
|
public BattleCardBase OriginalCard { get; private set; }
|
|
|
|
public TransformType Type { get; private set; }
|
|
|
|
public TransformInformation(TransformType type, BattleCardBase card)
|
|
{
|
|
Type = type;
|
|
OriginalCard = card;
|
|
}
|
|
}
|
|
|
|
public struct SkillActivationInfo
|
|
{
|
|
public long SkillId { get; private set; }
|
|
|
|
public SkillBase Skill { get; private set; }
|
|
|
|
public SkillActivationInfo(long skillId, SkillBase skill)
|
|
{
|
|
SkillId = skillId;
|
|
Skill = skill;
|
|
}
|
|
}
|
|
|
|
public enum CHECK_CONDITION_MUTATIONSKILL_TYPE
|
|
{
|
|
NONE,
|
|
NOT_HAVE_MUTATION_SKILL,
|
|
SELECT_ACCELERATE_SKILL_NOT_ACTIVE,
|
|
CRYSTALLIZE_SKILL_ACTIVE,
|
|
SELECT_CRYSTALLIZE_SKILL_NOT_ACTIVE,
|
|
NOT_PLAY,
|
|
PLAY
|
|
}
|
|
|
|
public enum TransformType
|
|
{
|
|
None,
|
|
Accelerate,
|
|
Crystallize,
|
|
Choice,
|
|
Metamorphose
|
|
}
|
|
|
|
public class DestroyedBySkillInfo
|
|
{
|
|
public enum DestroyedBySkillAbility
|
|
{
|
|
None,
|
|
WhenPlay,
|
|
Accelerate,
|
|
Crystallize,
|
|
WhenDestroy
|
|
}
|
|
|
|
public DestroyedBySkillAbility Ability { get; private set; }
|
|
|
|
public int BaseCardId { get; private set; }
|
|
|
|
public string Player { get; private set; }
|
|
|
|
public DestroyedBySkillInfo(DestroyedBySkillAbility ability, int baseCardId, bool isDestroyedBySelf)
|
|
{
|
|
Ability = ability;
|
|
BaseCardId = baseCardId;
|
|
Player = (isDestroyedBySelf ? "me" : "op");
|
|
}
|
|
}
|
|
|
|
public class BanishInfo
|
|
{
|
|
public enum BanishPlace
|
|
{
|
|
None,
|
|
Hand,
|
|
Field,
|
|
Deck
|
|
}
|
|
|
|
public int Turn { get; private set; }
|
|
|
|
public bool IsSelfTurn { get; private set; }
|
|
|
|
public BanishPlace Place { get; private set; }
|
|
|
|
public BanishInfo(int turn, bool isSelfTurn, BanishPlace place)
|
|
{
|
|
Turn = turn;
|
|
IsSelfTurn = isSelfTurn;
|
|
Place = place;
|
|
}
|
|
}
|
|
|
|
public class AttackCountInfo
|
|
{
|
|
public Skill_attack_count Skill { get; private set; }
|
|
|
|
public int Count { get; private set; }
|
|
|
|
public AttackCountInfo(Skill_attack_count skill, int count)
|
|
{
|
|
Skill = skill;
|
|
Count = count;
|
|
}
|
|
|
|
public virtual int CalcAttackCount(int baseAttackCount)
|
|
{
|
|
return baseAttackCount;
|
|
}
|
|
}
|
|
|
|
public class SetAttackCountInfo : AttackCountInfo
|
|
{
|
|
public SetAttackCountInfo(Skill_attack_count skill, int count)
|
|
: base(skill, count)
|
|
{
|
|
}
|
|
|
|
public override int CalcAttackCount(int baseAttackCount)
|
|
{
|
|
return base.Count;
|
|
}
|
|
}
|
|
|
|
public class AddAttackCountInfo : AttackCountInfo
|
|
{
|
|
public AddAttackCountInfo(Skill_attack_count skill, int count)
|
|
: base(skill, count)
|
|
{
|
|
}
|
|
|
|
public override int CalcAttackCount(int baseAttackCount)
|
|
{
|
|
return baseAttackCount + base.Count;
|
|
}
|
|
}
|
|
|
|
public class AttackOpponentResult
|
|
{
|
|
public VfxBase attackVfx { get; private set; }
|
|
|
|
public VfxBase damageVfx { get; private set; }
|
|
|
|
public DamageResult damageResult { get; private set; }
|
|
|
|
public AttackOpponentResult(VfxBase _attackVfx, VfxBase _damageVfx, DamageResult _damageResult)
|
|
{
|
|
attackVfx = _attackVfx;
|
|
damageVfx = _damageVfx;
|
|
damageResult = _damageResult;
|
|
}
|
|
}
|
|
|
|
public struct DamageParam
|
|
{
|
|
public int Damage;
|
|
|
|
public BattleCardBase OwnerCard { get; private set; }
|
|
|
|
public DamageParam(int damage, BattleCardBase card, string damageType = "_OPT_NULL_", CardBasePrm.ClanType damageClan = CardBasePrm.ClanType.NONE)
|
|
{
|
|
List<DamageModifier> list = card.SkillApplyInformation.AddDamageList.Where((DamageModifier m) => m.IsEffective(damageType, damageClan, isUseClass: false)).ToList();
|
|
list.AddRange(card.SelfBattlePlayer.Class.SkillApplyInformation.AddDamageList.Where((DamageModifier m) => m.IsEffective(damageType, damageClan, isUseClass: true)));
|
|
list.Sort((DamageModifier a, DamageModifier b) => a.OrderCount - b.OrderCount);
|
|
for (int num = 0; num < list.Count; num++)
|
|
{
|
|
damage = list[num].Calc(damage);
|
|
}
|
|
Damage = damage;
|
|
OwnerCard = card;
|
|
}
|
|
}
|
|
|
|
public class DamageResult
|
|
{
|
|
public VfxBase Vfx { get; private set; }
|
|
|
|
public VfxBase PreDamageVfx { get; private set; }
|
|
|
|
public VfxBase PostDamageVfx { get; private set; }
|
|
|
|
public int DamageApplied { get; private set; }
|
|
|
|
public int GainLife { get; private set; }
|
|
|
|
public bool IsReflectedDamage { get; private set; }
|
|
|
|
public DamageResult(VfxBase _vfx, int _damageApplied, int _gainLife, VfxBase _preDamageVfx = null, VfxBase _postDamageVfx = null, bool isReflectedDamage = false)
|
|
{
|
|
Vfx = _vfx;
|
|
DamageApplied = _damageApplied;
|
|
GainLife = _gainLife;
|
|
IsReflectedDamage = isReflectedDamage;
|
|
PreDamageVfx = ((_preDamageVfx == null) ? NullVfx.GetInstance() : _preDamageVfx);
|
|
PostDamageVfx = ((_postDamageVfx == null) ? NullVfx.GetInstance() : _postDamageVfx);
|
|
}
|
|
}
|
|
|
|
public struct HealParam
|
|
{
|
|
public int HealAmount;
|
|
|
|
public HealParam(int healAmount, BattleCardBase owner, BattleCardBase target, bool applyModifier = true)
|
|
{
|
|
if (applyModifier)
|
|
{
|
|
List<HealModifier> list = owner.SelfBattlePlayer.Class.SkillApplyInformation.HealModifierList.ToList();
|
|
list.AddRange(owner.OpponentBattlePlayer.Class.SkillApplyInformation.HealModifierList);
|
|
list.Sort((HealModifier a, HealModifier b) => a.OrderCount - b.OrderCount);
|
|
for (int num = 0; num < list.Count; num++)
|
|
{
|
|
healAmount = list[num].Calc(healAmount, owner, target);
|
|
}
|
|
}
|
|
HealAmount = healAmount;
|
|
}
|
|
}
|
|
|
|
public class HealResult
|
|
{
|
|
public int HealAmount { get; private set; }
|
|
|
|
public VfxBase HealVfx { get; private set; }
|
|
|
|
public VfxBase PrehealVfxVfx { get; private set; }
|
|
|
|
public VfxBase PosthealVfxVfx { get; private set; }
|
|
|
|
public HealResult(int healAmount, VfxBase _healVfx, VfxBase _prehealVfxVfx = null, VfxBase _posthealVfxVfx = null)
|
|
{
|
|
HealAmount = healAmount;
|
|
HealVfx = _healVfx;
|
|
PrehealVfxVfx = ((_prehealVfxVfx == null) ? NullVfx.GetInstance() : _prehealVfxVfx);
|
|
PosthealVfxVfx = ((_posthealVfxVfx == null) ? NullVfx.GetInstance() : _posthealVfxVfx);
|
|
}
|
|
}
|
|
|
|
public class CopySkillInfo
|
|
{
|
|
public VfxBase Vfx { get; private set; }
|
|
|
|
public bool IsEvolutionSkill { get; private set; }
|
|
|
|
public SkillBaseCopy NewCopySkill { get; private set; }
|
|
|
|
public List<SkillBase> CopiedSkillList { get; private set; }
|
|
|
|
public List<BuffInfo> AttachBuffs { get; private set; }
|
|
|
|
public CopySkillInfo(VfxBase vfx, bool isEvolutionSkill, SkillBaseCopy copySkill, List<SkillBase> copiedSkillList, List<BuffInfo> buffs)
|
|
{
|
|
Vfx = vfx;
|
|
IsEvolutionSkill = isEvolutionSkill;
|
|
NewCopySkill = copySkill;
|
|
CopiedSkillList = copiedSkillList;
|
|
AttachBuffs = buffs;
|
|
}
|
|
}
|
|
|
|
private const string CONDITION_CHARGE_COUNT = "charge_count";
|
|
|
|
private const string TARGET_CONDITION_CHARGE_COUNT = "self.charge_count";
|
|
|
|
private const string ME_INPLAY_CLASS_COUNT = "{me.inplay.class.count}";
|
|
|
|
private BattleCardBase _finalMetamorphoseCard;
|
|
|
|
protected BuildInfo _buildInfo;
|
|
|
|
public List<BattleCardBase> ReplayNoConsumeEpBuffInfoNameList = new List<BattleCardBase>();
|
|
|
|
protected SkillCollectionBase _normalSkillCollection;
|
|
|
|
protected SkillCollectionBase _evolveSkillCollection;
|
|
|
|
private CardParameter _baseParameter;
|
|
|
|
private CardParameter _evolveToOtherCardBaseParameter;
|
|
|
|
public readonly IBattlePlayerReadOnlyInfo SelfBattlePlayerReadOnlyInfo;
|
|
|
|
private bool _isOndraw;
|
|
|
|
public const int NONE_COST = -1;
|
|
|
|
public const int DEFAULT_SKILL_ACTIVATED_COUNT = 1;
|
|
|
|
public const int DEFAULT_THIS_TURN_SKILL_ACTIVATED_COUNT = 0;
|
|
|
|
private int _skillActivatedCountWrapValue = -1;
|
|
|
|
private int _skillActivatedCount;
|
|
|
|
private int _normalIndividualId = -1;
|
|
|
|
private int _evolutionIndividualId = -1;
|
|
|
|
private List<CardBasePrm.TribeType> _tribeCache;
|
|
|
|
private List<CardBasePrm.TribeInfo> _lastTribeInfo = new List<CardBasePrm.TribeInfo>();
|
|
|
|
private int _playedCost = -1;
|
|
|
|
private int _lastCost = -1;
|
|
|
|
public readonly List<ICardCostModifier> CostModifierList;
|
|
|
|
public List<AttackCountInfo> attackCountinfo;
|
|
|
|
private static StringBuilder _extractedText = new StringBuilder(512);
|
|
|
|
public BattleCardBase Card
|
|
{
|
|
get
|
|
{
|
|
if (MetamorphoseCard != null)
|
|
{
|
|
return MetamorphoseCard.Card;
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
|
|
public virtual bool IsClass => false;
|
|
|
|
public virtual bool IsUnit => false;
|
|
|
|
public virtual bool IsSpell => false;
|
|
|
|
public virtual bool IsField => false;
|
|
|
|
public virtual bool IsChantField => false;
|
|
|
|
public virtual bool IsSpecialSkill => false;
|
|
|
|
public BattleCardBase LastDrawOpenCard { get; set; }
|
|
|
|
public BattleCardBase MetamorphoseCard { get; set; }
|
|
|
|
public BattleCardBase FinalMetamorphoseCard
|
|
{
|
|
get
|
|
{
|
|
if (_finalMetamorphoseCard == null && MetamorphoseCard != null)
|
|
{
|
|
_finalMetamorphoseCard = MetamorphoseCard;
|
|
}
|
|
while (_finalMetamorphoseCard != null && _finalMetamorphoseCard.MetamorphoseCard != null)
|
|
{
|
|
_finalMetamorphoseCard = _finalMetamorphoseCard.MetamorphoseCard;
|
|
}
|
|
return _finalMetamorphoseCard;
|
|
}
|
|
}
|
|
|
|
public int MetamorphoseCount
|
|
{
|
|
get
|
|
{
|
|
int num = 0;
|
|
BattleCardBase metamorphoseCard = MetamorphoseCard;
|
|
while (metamorphoseCard != null)
|
|
{
|
|
metamorphoseCard = metamorphoseCard.MetamorphoseCard;
|
|
num++;
|
|
}
|
|
return num;
|
|
}
|
|
}
|
|
|
|
public BattleCardBase ReplayBuffInfoCard { get; set; }
|
|
|
|
public int PlayedTurn { get; protected set; }
|
|
|
|
public DeathTypeInformation DeathTypeInfo { get; protected set; }
|
|
|
|
public BuildInfo GetBuildInfo => _buildInfo;
|
|
|
|
public int UpdateBuildInfoBeforeCardId { get; private set; } = -1;
|
|
|
|
public string UpdateBuildInfoBeforeCardName { get; private set; } = string.Empty;
|
|
|
|
public bool IsChoiceEvolutionCardBeforeUpdateBuildInfo => UpdateBuildInfoBeforeCardId / 1000000 == 910;
|
|
|
|
public List<SkillCreator.SkillBuildInfo> NormalSkillBuildInfos => _buildInfo.NormalSkillBuildInfos;
|
|
|
|
public List<SkillCreator.SkillBuildInfo> EvolveSkillBuildInfos => _buildInfo.EvolveSkillBuildInfos;
|
|
|
|
public IEnumerable<BattleCardBase> GetCopiedCardList
|
|
{
|
|
get
|
|
{
|
|
List<SkillCreator.SkillBuildInfo> list = new List<SkillCreator.SkillBuildInfo>();
|
|
list.AddRange(NormalSkillBuildInfos);
|
|
list.AddRange(EvolveSkillBuildInfos);
|
|
return (from b in list
|
|
where b._previousSkillOwner != null
|
|
select b._previousSkillOwner).Distinct();
|
|
}
|
|
}
|
|
|
|
public List<BuffInfo> BuffInfoList { get; private set; }
|
|
|
|
public List<BuffInfo> ReplayBuffInfoList { get; set; } = new List<BuffInfo>();
|
|
|
|
public List<BuffInfo> ReplayAllCopyBuffInfoList { get; set; } = new List<BuffInfo>();
|
|
|
|
public List<NetworkBattleReceiver.ReplayBuffInfoLabel> ReplayBuffInfoLabelList { get; set; } = new List<NetworkBattleReceiver.ReplayBuffInfoLabel>();
|
|
|
|
protected CardInnerOptionsBase InnerOptions => _buildInfo.InnerOptions;
|
|
|
|
public IBattleResourceMgr ResourceMgr => _buildInfo.ResourceMgr;
|
|
|
|
public IBattleCardView BattleCardView { get; protected set; }
|
|
|
|
public virtual int Index => _buildInfo.BattleCardIndex;
|
|
|
|
public BattlePlayerBase SelfBattlePlayer { get; protected set; }
|
|
|
|
public BattlePlayerBase OpponentBattlePlayer { get; protected set; }
|
|
|
|
public CardParameter BaseParameter
|
|
{
|
|
get
|
|
{
|
|
if (_evolveToOtherCardBaseParameter != null)
|
|
{
|
|
return _evolveToOtherCardBaseParameter;
|
|
}
|
|
return _baseParameter;
|
|
}
|
|
private set
|
|
{
|
|
_baseParameter = value;
|
|
}
|
|
}
|
|
|
|
public SkillCollectionBase Skills { get; protected set; }
|
|
|
|
public SkillCollectionBase NormalSkills => _normalSkillCollection;
|
|
|
|
public SkillCollectionBase EvolutionSkills => _evolveSkillCollection;
|
|
|
|
public TransformInformation TransformInfo { get; set; }
|
|
|
|
public ISkillApplyInformation SkillApplyInformation { get; protected set; }
|
|
|
|
public bool HasAnySkill { get; private set; }
|
|
|
|
public bool IsTokenLoad { get; set; }
|
|
|
|
public bool IsPlayer { get; private set; }
|
|
|
|
public bool IsFirstTurn { get; protected set; }
|
|
|
|
public bool IsOnMove { get; private set; }
|
|
|
|
public bool IsSelfTurn => SelfBattlePlayer.IsSelfTurn;
|
|
|
|
public virtual bool IsOnDraw
|
|
{
|
|
get
|
|
{
|
|
return _isOndraw;
|
|
}
|
|
private set
|
|
{
|
|
_isOndraw = value;
|
|
if (value)
|
|
{
|
|
OnStartDraw.Call();
|
|
}
|
|
}
|
|
}
|
|
|
|
public Action OnStartDraw { get; set; }
|
|
|
|
public virtual bool IsActionCard => false;
|
|
|
|
public virtual bool IsEvolution => false;
|
|
|
|
public virtual bool IsEvolvedOnWhenLeave => false;
|
|
|
|
public bool IsEvolDrunkenness
|
|
{
|
|
get
|
|
{
|
|
if (IsFirstTurn && IsSummonDrunkenness)
|
|
{
|
|
return !SkillApplyInformation.IsQuick;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public virtual bool IsCantAttackClass
|
|
{
|
|
get
|
|
{
|
|
if (!GameMgr.GetIns().IsNewReplayBattle)
|
|
{
|
|
if (!SelfBattlePlayer.Class.IsCantAttackClass && !SkillApplyInformation.IsSkillCantAtkClass && !IsEvolDrunkenness)
|
|
{
|
|
if (IsFirstTurn && SkillApplyInformation.IsRush)
|
|
{
|
|
return !SkillApplyInformation.IsQuick;
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
return IsCantAttackClassOnReplay;
|
|
}
|
|
}
|
|
|
|
public bool IsCantAttackClassOnReplay { get; set; }
|
|
|
|
public bool IsCantAttackClassOnlyEvolDrunkenness
|
|
{
|
|
get
|
|
{
|
|
if (!SelfBattlePlayer.Class.IsCantAttackClass && !SkillApplyInformation.IsSkillCantAtkClass && IsEvolDrunkenness)
|
|
{
|
|
if (IsFirstTurn && SkillApplyInformation.IsRush)
|
|
{
|
|
return SkillApplyInformation.IsQuick;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool IsSummonDrunkenness { get; set; }
|
|
|
|
public bool IsPreviousTurnAttacked { get; set; }
|
|
|
|
public bool IsSelectedDuringSelectingBurialRiteTarget { get; set; }
|
|
|
|
public bool IsCantAttack
|
|
{
|
|
get
|
|
{
|
|
if (IsCantAttackClass)
|
|
{
|
|
return SkillApplyInformation.IsSkillCantAtkUnit;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public List<int> ReplaySkillDescriptionValueList { get; set; } = new List<int>();
|
|
|
|
public List<int> ReplayEvoSkillDescriptionValueList { get; set; } = new List<int>();
|
|
|
|
public List<int> ReplayBuffDetailSkillDescriptionValueList { get; set; } = new List<int>();
|
|
|
|
public List<int> ReplayBuffDetailEvoSkillDescriptionValueList { get; set; } = new List<int>();
|
|
|
|
public virtual bool IsCantActivateFanfare => false;
|
|
|
|
public int SpellChargeCount { get; protected set; }
|
|
|
|
public int ChantCount => SkillApplyInformation.GetChantCount(BaseParameter.ChantCount);
|
|
|
|
public int ExecutedFixedUseCostIndex { get; set; }
|
|
|
|
public bool IsExecutedEarthRite { get; set; }
|
|
|
|
public bool IsSkillLost { get; set; }
|
|
|
|
public bool IsReanimate { get; set; }
|
|
|
|
public ItWasDamagedCounter DamagedCounter { get; private set; }
|
|
|
|
public bool HasSkillActivatedCountWrapValue => _skillActivatedCountWrapValue != -1;
|
|
|
|
public int SkillActivatedCount
|
|
{
|
|
get
|
|
{
|
|
if (_skillActivatedCountWrapValue == -1)
|
|
{
|
|
return _skillActivatedCount;
|
|
}
|
|
int num;
|
|
for (num = _skillActivatedCount; num > _skillActivatedCountWrapValue; num -= _skillActivatedCountWrapValue)
|
|
{
|
|
}
|
|
return num;
|
|
}
|
|
protected set
|
|
{
|
|
_skillActivatedCount = value;
|
|
}
|
|
}
|
|
|
|
public int ThisTurnSkillActivatedCount { get; protected set; }
|
|
|
|
public int NormalIndividualId
|
|
{
|
|
get
|
|
{
|
|
if (_normalIndividualId == -1)
|
|
{
|
|
return _normalSkillCollection.GetIndividualId();
|
|
}
|
|
return _normalIndividualId;
|
|
}
|
|
set
|
|
{
|
|
_normalIndividualId = value;
|
|
}
|
|
}
|
|
|
|
public int EvolutionIndividualId
|
|
{
|
|
get
|
|
{
|
|
if (_evolutionIndividualId == -1)
|
|
{
|
|
return _evolveSkillCollection.GetIndividualId();
|
|
}
|
|
return _evolutionIndividualId;
|
|
}
|
|
set
|
|
{
|
|
_evolutionIndividualId = value;
|
|
}
|
|
}
|
|
|
|
public List<SkillActivationInfo> SkillActivationList { get; set; }
|
|
|
|
public bool AlreadyInactiveSkillActivateCountBySimultaneousDestroyedCardList { get; private set; }
|
|
|
|
public bool ActiveSkillActivateCountBySimultaneousDestroyedCardList { get; set; }
|
|
|
|
public bool AlreadyInactiveSkillActivateCountBySimultaneousBuffingCards { get; private set; }
|
|
|
|
public bool ActiveSkillActivateCountBySimultaneousBuffingCards { get; set; }
|
|
|
|
public bool AlreadyInactiveSkillActivateCountBySimultaneousSummonedCard { get; private set; }
|
|
|
|
public bool ActiveSkillActivateCountBySimultaneousSummonedCard { get; set; }
|
|
|
|
public bool HasSpellCharge
|
|
{
|
|
get
|
|
{
|
|
if (IsClass)
|
|
{
|
|
return false;
|
|
}
|
|
if (Skills.Any((SkillBase s) => s.OnWhenSpellChargeStart != 0))
|
|
{
|
|
return true;
|
|
}
|
|
if (Skills.Any((SkillBase s) => Regex.IsMatch(s.CallCountText, "CHARGE_COUNT")))
|
|
{
|
|
return true;
|
|
}
|
|
if (Skills.Any((SkillBase s) => s.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter t) => t.Lhs.Contains("charge_count"))))
|
|
{
|
|
return true;
|
|
}
|
|
if (BaseParameter.SkillTarget.Contains("self.charge_count"))
|
|
{
|
|
return true;
|
|
}
|
|
string oddChargeCountText = SkillFilterCreator.ContentKeyword.odd_charge_count.ToStringCustom();
|
|
string evenChargeCountText = SkillFilterCreator.ContentKeyword.even_charge_count.ToStringCustom();
|
|
return Skills.Any((SkillBase s) => s.IsRefVariable("CHARGE_COUNT") || s.IsRefVariable(oddChargeCountText) || s.IsRefVariable(evenChargeCountText));
|
|
}
|
|
}
|
|
|
|
public bool IsFusionable
|
|
{
|
|
get
|
|
{
|
|
SkillBase skillBase = Skills.FirstOrDefault((SkillBase s) => s is Skill_fusion);
|
|
if (skillBase == null)
|
|
{
|
|
return false;
|
|
}
|
|
if (IsAlreadyFusionInThisTurn)
|
|
{
|
|
return false;
|
|
}
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
SkillConditionCheckerOption option = new SkillConditionCheckerOption();
|
|
if (skillBase.GetSelectableCards(playerInfoPair, option).Count() == 0)
|
|
{
|
|
return false;
|
|
}
|
|
if (!skillBase.CheckCondition(playerInfoPair, option, isPrePlay: true))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public bool IsAlreadyFusionInThisTurn => SkillApplyInformation.FusionIngredients.Any((FusionIngredientInfo c) => c.FusionTurn == SelfBattlePlayer.Turn);
|
|
|
|
public List<BattleCardBase> FusionIngredients => SkillApplyInformation.FusionIngredients.Select((FusionIngredientInfo f) => f.Card).ToList();
|
|
|
|
public int FusionedTurn { get; protected set; }
|
|
|
|
public List<BattleCardBase> GetOnCards => SkillApplyInformation.GetOnCards.ToList();
|
|
|
|
public bool IsChoiceEvolutionCard => CardId / 1000000 == 910;
|
|
|
|
public List<BattleCardBase> GetOffCards { get; set; }
|
|
|
|
public bool CanPlayAsChoiceBraveCard
|
|
{
|
|
get
|
|
{
|
|
if (CardMaster.IsChoiceBraveCardCheck(CardId) && Cost <= SelfBattlePlayer.Bp)
|
|
{
|
|
if (Skills.Any((SkillBase s) => s.IsUserSelectType))
|
|
{
|
|
return Skills.CheckWhenPlaySelectTargetSkillCondition;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public virtual CHECK_CONDITION_MUTATIONSKILL_TYPE IsCheckActiveMutationSkill
|
|
{
|
|
get
|
|
{
|
|
using (IEnumerator<SkillBase> enumerator = Skills.GetEnumerator())
|
|
{
|
|
if (enumerator.MoveNext())
|
|
{
|
|
if (!(enumerator.Current is Skill_pp_fixeduse skill_pp_fixeduse))
|
|
{
|
|
return CHECK_CONDITION_MUTATIONSKILL_TYPE.NOT_HAVE_MUTATION_SKILL;
|
|
}
|
|
if (skill_pp_fixeduse.IsMutationFixedUseCost)
|
|
{
|
|
Skill_transform accelerateOrCrystallizeTransformSkill = GetAccelerateOrCrystallizeTransformSkill();
|
|
if (accelerateOrCrystallizeTransformSkill != null)
|
|
{
|
|
BattleCardBase battleCardBase = SelfBattlePlayer.BattleMgr.CreateTransformCardRegisterVfx(this, accelerateOrCrystallizeTransformSkill.TransformId, accelerateOrCrystallizeTransformSkill.SkillPrm.ownerCard.IsPlayer);
|
|
if (battleCardBase.Skills.Any((SkillBase t) => t.IsUserSelectType))
|
|
{
|
|
IEnumerable<SkillBase> selectTypeSkill = battleCardBase.GetSelectTypeSkill();
|
|
if (selectTypeSkill != null && selectTypeSkill.Count() > 0 && (battleCardBase.BaseParameter.CharType != CardBasePrm.CharaType.SPELL || (battleCardBase as SpellBattleCard).IsSelectableSkillTarget()))
|
|
{
|
|
return (battleCardBase.BaseParameter.CharType == CardBasePrm.CharaType.SPELL) ? CHECK_CONDITION_MUTATIONSKILL_TYPE.PLAY : CHECK_CONDITION_MUTATIONSKILL_TYPE.CRYSTALLIZE_SKILL_ACTIVE;
|
|
}
|
|
return (battleCardBase.BaseParameter.CharType == CardBasePrm.CharaType.SPELL) ? CHECK_CONDITION_MUTATIONSKILL_TYPE.SELECT_ACCELERATE_SKILL_NOT_ACTIVE : CHECK_CONDITION_MUTATIONSKILL_TYPE.SELECT_CRYSTALLIZE_SKILL_NOT_ACTIVE;
|
|
}
|
|
return (battleCardBase.BaseParameter.CharType == CardBasePrm.CharaType.SPELL) ? CHECK_CONDITION_MUTATIONSKILL_TYPE.PLAY : CHECK_CONDITION_MUTATIONSKILL_TYPE.CRYSTALLIZE_SKILL_ACTIVE;
|
|
}
|
|
}
|
|
return CHECK_CONDITION_MUTATIONSKILL_TYPE.NOT_PLAY;
|
|
}
|
|
}
|
|
return CHECK_CONDITION_MUTATIONSKILL_TYPE.NONE;
|
|
}
|
|
}
|
|
|
|
public virtual bool BaseMovable => Movable();
|
|
|
|
public virtual bool IsInHand => SelfBattlePlayer.HandCardList.Contains(this);
|
|
|
|
public virtual bool IsInDeck => SelfBattlePlayer.DeckCardList.Contains(this);
|
|
|
|
public virtual bool IsInplay => SelfBattlePlayer.ClassAndInPlayCardList.Contains(this);
|
|
|
|
public virtual bool IsInCemetery => SelfBattlePlayer.CemeteryList.Contains(this);
|
|
|
|
public virtual bool IsInNecromanceZone => SelfBattlePlayer.NecromanceZoneList.Contains(this);
|
|
|
|
public virtual bool IsFusionIngredient => SelfBattlePlayer.FusionIngredientList.Contains(this);
|
|
|
|
public bool IsDestroyedByKiller { get; protected set; }
|
|
|
|
public bool IsDestroyedBySkill { get; protected set; }
|
|
|
|
public virtual bool IsDead
|
|
{
|
|
get
|
|
{
|
|
if (!IsLifeZeroDead && !IsDestroyedByKiller)
|
|
{
|
|
return IsDestroyedBySkill;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public virtual bool IsLifeZeroDead => Life <= 0;
|
|
|
|
public int DestroyedTurn { get; private set; }
|
|
|
|
public bool IsDestroySelfTurn { get; private set; }
|
|
|
|
public List<DestroyedBySkillInfo> DestroyedBySkillList { get; private set; }
|
|
|
|
public BanishInfo BanishedInfo { get; private set; }
|
|
|
|
public SkillBase DiscardedSkill { get; private set; }
|
|
|
|
public SkillBase ReturnedSkill { get; private set; }
|
|
|
|
public bool HasDeckSelfSkill => Skills.Any((SkillBase s) => s.IsDeckSelfSkill);
|
|
|
|
public int AttackableCount { get; set; }
|
|
|
|
public virtual bool Attackable
|
|
{
|
|
get
|
|
{
|
|
if (!GameMgr.GetIns().IsNewReplayBattle)
|
|
{
|
|
if (AttackableCount <= 0 || (IsSummonDrunkenness && (!IsSummonDrunkenness || !IsEvolution)) || IsCantAttack)
|
|
{
|
|
if (SkillApplyInformation.IsInfiniteAttack && !IsSummonDrunkenness)
|
|
{
|
|
return !IsCantAttack;
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
return AttackableOnReplay;
|
|
}
|
|
}
|
|
|
|
public bool AttackableOnReplay { get; set; }
|
|
|
|
public virtual List<CardBasePrm.TribeType> Tribe
|
|
{
|
|
get
|
|
{
|
|
if (SkillApplyInformation == null || SkillApplyInformation.TribeSkinInfo.Count == 0)
|
|
{
|
|
return BaseParameter.Tribe;
|
|
}
|
|
if (_tribeCache != null && _lastTribeInfo != null && _lastTribeInfo.SequenceEqual(SkillApplyInformation.TribeSkinInfo))
|
|
{
|
|
return _tribeCache;
|
|
}
|
|
List<CardBasePrm.TribeType> list = new List<CardBasePrm.TribeType>(BaseParameter.Tribe);
|
|
for (int i = 0; i < SkillApplyInformation.TribeSkinInfo.Count(); i++)
|
|
{
|
|
if (SkillApplyInformation.TribeSkinInfo[i].TribeTypeList != null)
|
|
{
|
|
switch (SkillApplyInformation.TribeSkinInfo[i].ChangeType)
|
|
{
|
|
case CardBasePrm.TribeChangeType.CHANGE:
|
|
list = SkillApplyInformation.TribeSkinInfo[i].TribeTypeList;
|
|
break;
|
|
case CardBasePrm.TribeChangeType.ADD:
|
|
list.AddRange(SkillApplyInformation.TribeSkinInfo[i].TribeTypeList);
|
|
break;
|
|
default:
|
|
list = SkillApplyInformation.TribeSkinInfo[i].TribeTypeList;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
_tribeCache = list.Distinct().ToList();
|
|
if (_tribeCache.Count >= 2 && _tribeCache.Contains(CardBasePrm.TribeType.ALL))
|
|
{
|
|
_tribeCache.Remove(CardBasePrm.TribeType.ALL);
|
|
}
|
|
_lastTribeInfo.Clear();
|
|
_lastTribeInfo.AddRange(SkillApplyInformation.TribeSkinInfo);
|
|
return _tribeCache;
|
|
}
|
|
}
|
|
|
|
public virtual CardBasePrm.ClanType Clan
|
|
{
|
|
get
|
|
{
|
|
if (SkillApplyInformation.ClanSkinInfo.Count <= 0)
|
|
{
|
|
return BaseParameter.Clan;
|
|
}
|
|
return SkillApplyInformation.ClanSkinInfo.Last();
|
|
}
|
|
}
|
|
|
|
public int CardId => _buildInfo.CardId;
|
|
|
|
public int EquitedCardId
|
|
{
|
|
get
|
|
{
|
|
if (IsChoiceEvolutionCard)
|
|
{
|
|
return BaseParameter.BaseCardId;
|
|
}
|
|
DataMgr.SpecialBattleSetting specialBattleSettingInfo = GameMgr.GetIns().GetDataMgr().SpecialBattleSettingInfo;
|
|
if (specialBattleSettingInfo == null)
|
|
{
|
|
return CardId;
|
|
}
|
|
Dictionary<int, int> idOverridePairDict = specialBattleSettingInfo.IdOverridePairDict;
|
|
if (idOverridePairDict == null)
|
|
{
|
|
return CardId;
|
|
}
|
|
if (idOverridePairDict.ContainsKey(CardId))
|
|
{
|
|
return idOverridePairDict[CardId];
|
|
}
|
|
return CardId;
|
|
}
|
|
}
|
|
|
|
public int Cost
|
|
{
|
|
get
|
|
{
|
|
int num = BaseParameter.Cost;
|
|
if (IsChoiceBraveSkillCard)
|
|
{
|
|
return num;
|
|
}
|
|
for (int i = 0; i < CostModifierList.Count; i++)
|
|
{
|
|
ICardCostModifier cardCostModifier = CostModifierList[i];
|
|
if (!(cardCostModifier is CostHalfModifier))
|
|
{
|
|
num = cardCostModifier.CalcCost(num);
|
|
}
|
|
}
|
|
for (int j = 0; j < CostModifierList.Count; j++)
|
|
{
|
|
ICardCostModifier cardCostModifier2 = CostModifierList[j];
|
|
if (cardCostModifier2 is CostHalfModifier)
|
|
{
|
|
num = cardCostModifier2.CalcCost(num);
|
|
}
|
|
}
|
|
return Math.Max(0, num);
|
|
}
|
|
}
|
|
|
|
public int BaseCost => BaseParameter.Cost;
|
|
|
|
public int Atk => SkillApplyInformation.GetAtk();
|
|
|
|
public int BaseAtk
|
|
{
|
|
get
|
|
{
|
|
if (!IsEvolution)
|
|
{
|
|
return BaseParameter.Atk;
|
|
}
|
|
return BaseParameter.EvoAtk;
|
|
}
|
|
}
|
|
|
|
public int Life => SkillApplyInformation.GetLife();
|
|
|
|
public int MaxLife => SkillApplyInformation.GetMaxLife();
|
|
|
|
public int[] GenericValueArray => SkillApplyInformation.SkillGenericValueArray;
|
|
|
|
public virtual int BaseMaxLife
|
|
{
|
|
get
|
|
{
|
|
if (!IsEvolution)
|
|
{
|
|
return BaseParameter.Life;
|
|
}
|
|
return BaseParameter.EvoLife;
|
|
}
|
|
}
|
|
|
|
public int PlayedCost => _playedCost;
|
|
|
|
public int LastCost => _lastCost;
|
|
|
|
public int MaxAttackableCount
|
|
{
|
|
get
|
|
{
|
|
int num = 1;
|
|
for (int i = 0; i < attackCountinfo.Count; i++)
|
|
{
|
|
num = attackCountinfo[i].CalcAttackCount(num);
|
|
}
|
|
return num;
|
|
}
|
|
}
|
|
|
|
public DamageParam DamageCalculationAtkTypeAttack => new DamageParam(SkillApplyInformation.IsAttackByLifeTypeAttack ? Life : Atk, this, SkillFilterCreator.ContentKeyword.unit.ToString(), Clan);
|
|
|
|
public DamageParam DamageCalculationAtkTypeBeAttacked => new DamageParam(SkillApplyInformation.IsAttackByLifeTypeBeAttacked ? Life : Atk, this, SkillFilterCreator.ContentKeyword.unit.ToString(), Clan);
|
|
|
|
public ICardVfxCreator VfxCreator { get; protected set; }
|
|
|
|
public bool AreCanPlayConditionsFulfilled => this.OnCheckCanPlay.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public bool AreCanAttackConditionsFulfilled => this.OnCheckCanAttack.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public bool AreCanBeAttackedConditionsFulfilled => this.OnCheckCanBeAttacked.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public bool AreCanBeSelectedConditionsFulfilled => this.OnCheckCanBeSelected.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public bool AreCanShowDetailConditionsFulfilled => this.OnCheckCanShowDetail.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public bool AreCanEvolveConditionsFulfilled => this.OnCheckCanEvolve.GetAllFuncCallResults().All((bool condition) => condition);
|
|
|
|
public int FixedUseCost => CalcFixedUseCost(SelfBattlePlayer.Pp);
|
|
|
|
public List<int> UseCostList
|
|
{
|
|
get
|
|
{
|
|
List<int> list = new List<int>();
|
|
List<int> list2 = new List<int>();
|
|
int pp = SelfBattlePlayer.Pp;
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
if (Skills.ElementAt(i) is Skill_pp_fixeduse skill_pp_fixeduse)
|
|
{
|
|
if (skill_pp_fixeduse.IsAccelerateOrCrystallize)
|
|
{
|
|
list2.Add(skill_pp_fixeduse._fixedUsePP);
|
|
}
|
|
else
|
|
{
|
|
list.Add(skill_pp_fixeduse._fixedUsePP);
|
|
}
|
|
}
|
|
}
|
|
List<int> list3 = new List<int>();
|
|
if (!list.Any() && !list2.Any())
|
|
{
|
|
return list3;
|
|
}
|
|
if (IsSelectedDuringSelectingBurialRiteTarget)
|
|
{
|
|
return list3;
|
|
}
|
|
if (!IsCantActivateFanfare)
|
|
{
|
|
list3.AddRange(list.Where((int c) => c <= pp).Reverse());
|
|
}
|
|
if ((!list.Any((int c) => c <= Cost) || IsCantActivateFanfare) && Cost <= pp)
|
|
{
|
|
list3.Add(Cost);
|
|
}
|
|
list3.AddRange(list2.Where((int c) => pp >= c && c < Cost).Reverse());
|
|
list3.AddRange(list2.Where((int c) => pp < c && c < Cost));
|
|
if (!list.Any((int c) => c <= Cost) && pp < Cost)
|
|
{
|
|
list3.Add(Cost);
|
|
}
|
|
if (!IsCantActivateFanfare)
|
|
{
|
|
list3.AddRange(list.Where((int c) => pp < c));
|
|
}
|
|
list3.AddRange(list2.Where((int c) => Cost <= c));
|
|
if (list.Any((int c) => c <= Cost))
|
|
{
|
|
list3.Add(Cost);
|
|
}
|
|
if (IsCantActivateFanfare)
|
|
{
|
|
list3.AddRange(list);
|
|
}
|
|
return list3;
|
|
}
|
|
}
|
|
|
|
public bool HasSkillFixedUseCost => FixedUseCost != -1;
|
|
|
|
public bool HasSkillAccelerate => Skills.Any((SkillBase s) => s.OnWhenAccelerate != 0);
|
|
|
|
public bool HasSkillCrystallize => Skills.Any((SkillBase s) => s.OnWhenCrystallize != 0);
|
|
|
|
public bool HasSkillEnhance => Skills.Any((SkillBase s) => s.IsEnhance());
|
|
|
|
public bool HasSkillDestroyWhiteRitual => HasSkillDestroyTribe(CardBasePrm.TribeType.WHITE_RITUAL);
|
|
|
|
public bool HasSkillStackWhiteRitual => Skills.Any((SkillBase s) => s is Skill_stack_white_ritual);
|
|
|
|
public bool HasSkillBurialRite
|
|
{
|
|
get
|
|
{
|
|
if (!NormalSkills.Any((SkillBase s) => s.IsBurialRite))
|
|
{
|
|
return EvolutionSkills.Any((SkillBase s) => s.IsBurialRite);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public bool HasSkillNecromance { get; private set; }
|
|
|
|
public bool HasSkillWhenDestroy
|
|
{
|
|
get
|
|
{
|
|
if (IsInDeck)
|
|
{
|
|
if (!NormalSkills.Any((SkillBase s) => s.IsWhenDestroySkill))
|
|
{
|
|
return EvolutionSkills.Any((SkillBase s) => s.IsWhenDestroySkill);
|
|
}
|
|
return true;
|
|
}
|
|
return Skills.Any((SkillBase s) => s.IsWhenDestroySkill);
|
|
}
|
|
}
|
|
|
|
public bool HasSkillReanimate
|
|
{
|
|
get
|
|
{
|
|
if (!NormalSkills.Any((SkillBase s) => s is Skill_summon_token && (s as Skill_summon_token).IsReanimate))
|
|
{
|
|
return EvolutionSkills.Any((SkillBase s) => s is Skill_summon_token && (s as Skill_summon_token).IsReanimate);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public bool HasSkillFusion => NormalSkills.Any((SkillBase s) => s is Skill_fusion);
|
|
|
|
public bool HasWhenAttack => Skills.Any((SkillBase s) => s.IsBeforAttackSkill);
|
|
|
|
public bool HasWhenFight => Skills.Any((SkillBase s) => s.IsWhenFightSkill);
|
|
|
|
public bool HasFusionSkill => Skills.Any((SkillBase s) => s is Skill_fusion);
|
|
|
|
public bool HasNoSelectFusionSkill => Skills.Any((SkillBase s) => s.IsNoSelectFusionSkill);
|
|
|
|
public bool IsChoiceBraveSkillCard { get; set; }
|
|
|
|
public bool HasSkillWhenEvolve => EvolutionSkills.Any((SkillBase s) => s.IsWhenEvolveSkill);
|
|
|
|
public bool HasUnionBurst
|
|
{
|
|
get
|
|
{
|
|
string unionBurstString = SkillFilterCreator.ContentKeyword.union_burst_count.ToString();
|
|
if (Skills.Any((SkillBase s) => s.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter t) => t.Lhs.Contains(unionBurstString))))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool HasSkyboundArt
|
|
{
|
|
get
|
|
{
|
|
string skyboundArtString = SkillFilterCreator.ContentKeyword.skybound_art_count.ToString();
|
|
return Skills.Any((SkillBase s) => s.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter t) => t.Lhs.Contains(skyboundArtString)));
|
|
}
|
|
}
|
|
|
|
public bool HasSuperSkyboundArt
|
|
{
|
|
get
|
|
{
|
|
string superSkyboundArtString = SkillFilterCreator.ContentKeyword.super_skybound_art_count.ToString();
|
|
return Skills.Any((SkillBase s) => s.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter t) => t.Lhs.Contains(superSkyboundArtString)));
|
|
}
|
|
}
|
|
|
|
public bool IsLegend => BaseParameter.Rarity >= 4;
|
|
|
|
public int DrawTurn { get; set; }
|
|
|
|
public bool IsHaveBurialRiteJudgeBothFlag
|
|
{
|
|
get
|
|
{
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
foreach (SkillBase skill in Skills)
|
|
{
|
|
List<SkillConditionBurialRite> list = skill.ConditionFilterCollection.ConditionCheckerFilterList.FindAll((ISkillConditionChecker x) => x is SkillConditionBurialRite).ConvertAll((ISkillConditionChecker x) => x as SkillConditionBurialRite);
|
|
if (list == null)
|
|
{
|
|
continue;
|
|
}
|
|
if (!flag)
|
|
{
|
|
flag = list.Find((SkillConditionBurialRite x) => x.judgeFlg) != null;
|
|
}
|
|
if (!flag2)
|
|
{
|
|
flag2 = list.Find((SkillConditionBurialRite x) => !x.judgeFlg) != null;
|
|
}
|
|
}
|
|
return flag && flag2;
|
|
}
|
|
}
|
|
|
|
public bool IsBuffDetail
|
|
{
|
|
get
|
|
{
|
|
if (IsShowBuffDetail || IsRecordingBuffDetail)
|
|
{
|
|
return !IsRecordingExceptBuffDetail;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool IsShowBuffDetail { get; set; }
|
|
|
|
public bool IsRecordingBuffDetail { get; set; }
|
|
|
|
public bool IsRecordingExceptBuffDetail { get; set; }
|
|
|
|
public bool IsRecordingFusionInfo { get; set; }
|
|
|
|
public event Func<bool, SkillProcessor, VfxBase> OnRemoveFromInPlayAfterOneTime;
|
|
|
|
public event Func<SkillProcessor, VfxBase> OnBeforeEvolve;
|
|
|
|
public event Action<bool> OnEvolveEvent;
|
|
|
|
public event Func<VfxBase> OnPlay;
|
|
|
|
public event Func<VfxBase> OnFinishWhenPlaySkill;
|
|
|
|
public event Func<BattleCardBase, SkillProcessor, VfxBase> OnDestroy;
|
|
|
|
public event Func<BattleCardBase, SkillProcessor, VfxBase> OnBanish;
|
|
|
|
public event Func<BattleCardBase, SkillProcessor, VfxBase> OnReturnCard;
|
|
|
|
public event Func<BattleCardBase, SkillProcessor, VfxBase> OnMetamorphose;
|
|
|
|
public event Func<BattleCardBase, SkillProcessor, VfxBase> OnGetOn;
|
|
|
|
public event Action<SkillBase, ICardCostModifier> OnAddCostState;
|
|
|
|
public event Action<SkillBase, ICardCostModifier> OnRemoveCostState;
|
|
|
|
public event Func<VfxBase> OnAfterAddDamage;
|
|
|
|
public event Action<BattleCardBase, SkillBase> OnAttachSkill;
|
|
|
|
public event Action<BattleCardBase> OnCopySkillComplete;
|
|
|
|
public event Func<SkillBase, SkillProcessor, BattleCardBase, VfxBase> OnLoseSkillOneTime;
|
|
|
|
public event Func<SkillProcessor, VfxBase> OnDamageAfter;
|
|
|
|
public event Func<SkillProcessor, VfxBase> OnGiveDamage;
|
|
|
|
public event Func<SkillProcessor, VfxBase> OnReflectionAfter;
|
|
|
|
public event Action OnResetCardParameter;
|
|
|
|
public event Action<List<BattleCardBase>> OnFusionEvent;
|
|
|
|
public event Action OnTurnStart;
|
|
|
|
public event Func<bool> OnCheckCanPlay;
|
|
|
|
public event Func<bool> OnCheckCanAttack;
|
|
|
|
public event Func<bool> OnCheckCanBeAttacked;
|
|
|
|
public event Func<bool> OnCheckCanBeSelected;
|
|
|
|
public event Func<bool> OnCheckCanShowDetail;
|
|
|
|
public event Func<bool> OnCheckCanEvolve;
|
|
|
|
public void SetPlayedTurnNow()
|
|
{
|
|
PlayedTurn = SelfBattlePlayer.Turn;
|
|
}
|
|
|
|
private void ResetUpdateBuildInfo()
|
|
{
|
|
UpdateBuildInfoBeforeCardId = -1;
|
|
UpdateBuildInfoBeforeCardName = string.Empty;
|
|
}
|
|
|
|
public void UpdateBuildInfoAndSkillCollection(int cardId, bool isFoil, bool isNotUpdateAtkLife = false)
|
|
{
|
|
UpdateBuildInfoBeforeCardId = BaseParameter.NormalCardId;
|
|
UpdateBuildInfoBeforeCardName = BaseParameter.CardName;
|
|
SkillCreator.CardSkillsBuildInfo cardSkillsBuildInfo = SkillCreator.CreateBuildInfo(CardMaster.GetInstanceForBattle().GetCardParameterFromId(cardId));
|
|
_buildInfo = new BuildInfo(_buildInfo.GameObject, isFoil ? (cardId + 1) : cardId, _buildInfo.SelfBattlePlayer, _buildInfo.OpponentBattlePlayer, _buildInfo.SelfBattlePlayer, cardSkillsBuildInfo.normalSkillBuildInfos, cardSkillsBuildInfo.evolveSkillBuildInfos, _buildInfo.IsPlayer, _buildInfo.BattleCardIndex, _buildInfo.InnerOptions, _buildInfo.BattleMgr, _buildInfo.ResourceMgr);
|
|
int evoAtk = BaseParameter.EvoAtk;
|
|
int evoLife = BaseParameter.EvoLife;
|
|
_evolveToOtherCardBaseParameter = CardMaster.GetInstanceForBattle().GetCardParameterFromId(_buildInfo.CardId).Clone();
|
|
InitSkillCollection();
|
|
if (isNotUpdateAtkLife)
|
|
{
|
|
_evolveToOtherCardBaseParameter.UpdateEvoAtkLife(evoAtk, evoLife);
|
|
}
|
|
}
|
|
|
|
public void ResetChoiceEvolutionCardBuildInfo()
|
|
{
|
|
UpdateBuildInfoAndSkillCollection(BaseParameter.BaseCardId, BaseParameter.IsFoil);
|
|
if (!SelfBattlePlayer.BattleMgr.IsRecovery || IsPlayer)
|
|
{
|
|
BattleCardView.CardTemplate.NormalNameLabelTemp.text = BaseParameter.CardName;
|
|
Global.SetRepositionNameLabel(BattleCardView.CardTemplate.NormalNameLabelTemp, BaseParameter.CardName, is2D: false);
|
|
BattleCardView.InitializeVoiceInfo(CardId);
|
|
for (int i = 0; i < NormalSkills.Count(); i++)
|
|
{
|
|
NormalSkills.ElementAt(i).SetInductionVoiceIndex();
|
|
}
|
|
for (int j = 0; j < EvolutionSkills.Count(); j++)
|
|
{
|
|
EvolutionSkills.ElementAt(j).SetInductionVoiceIndex();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void UpdateChoiceEvolutionBeforeCard(int cardId, string cardName)
|
|
{
|
|
UpdateBuildInfoBeforeCardId = cardId;
|
|
UpdateBuildInfoBeforeCardName = cardName;
|
|
}
|
|
|
|
public void ResetReplayBuffInfo()
|
|
{
|
|
ReplayBuffInfoList.Clear();
|
|
ReplayNoConsumeEpBuffInfoNameList.Clear();
|
|
ReplayBuffInfoLabelList.Clear();
|
|
}
|
|
|
|
public virtual string SkillDescription(BattlePlayerBase.SideLogInfo sideLogInfo = null, bool isSkipOption = false, BuffInfo buff = null, string divergenceId = "", List<int> skillDescriptionValueList = null, List<int> sideLogDescriptionValueList = null)
|
|
{
|
|
return ConvertSkillDescription(BaseParameter.SkillDescription, sideLogInfo, isSkipOption, buff, divergenceId, skillDescriptionValueList, (IsBuffDetail && sideLogInfo == null && ReplayBuffDetailSkillDescriptionValueList.Count > 0) ? ReplayBuffDetailSkillDescriptionValueList : ((sideLogDescriptionValueList != null) ? sideLogDescriptionValueList : ReplaySkillDescriptionValueList));
|
|
}
|
|
|
|
public virtual string EvoSkillDescription(BattlePlayerBase.SideLogInfo sideLogInfo = null, bool isSkipOption = false, BuffInfo buff = null, string divergenceId = "", List<int> skillDescriptionValueList = null, List<int> sideLogDescriptionValueList = null)
|
|
{
|
|
return ConvertSkillDescription(BaseParameter.EvoSkillDescription, sideLogInfo, isSkipOption, buff, divergenceId, skillDescriptionValueList, (IsBuffDetail && sideLogInfo == null && ReplayBuffDetailEvoSkillDescriptionValueList.Count > 0) ? ReplayBuffDetailEvoSkillDescriptionValueList : ((sideLogDescriptionValueList != null) ? sideLogDescriptionValueList : ReplayEvoSkillDescriptionValueList));
|
|
}
|
|
|
|
public string CopiedSkillDescription(string skillDescription, List<int> skillDescriptionValueList)
|
|
{
|
|
return ConvertSkillDescription(skillDescription, null, isSkipOption: false, null, "", skillDescriptionValueList, null);
|
|
}
|
|
|
|
public string CopiedEvoSkillDescription(string skillDescription, List<int> skillDescriptionValueList)
|
|
{
|
|
return ConvertSkillDescription(skillDescription, null, isSkipOption: false, null, "", skillDescriptionValueList, null);
|
|
}
|
|
|
|
public string CopiedSkillDescriptionInReplay(BuffInfo buff, List<int> copiedSkillDescriptionValueList)
|
|
{
|
|
return ConvertSkillDescription(BaseParameter.SkillDescription, null, isSkipOption: false, buff, "", null, copiedSkillDescriptionValueList);
|
|
}
|
|
|
|
public string CopiedEvoSkillDescriptionInReplay(BuffInfo buff, List<int> copiedEvoSkillDescriptionValueList)
|
|
{
|
|
return ConvertSkillDescription(BaseParameter.EvoSkillDescription, null, isSkipOption: false, buff, "", null, copiedEvoSkillDescriptionValueList);
|
|
}
|
|
|
|
public virtual bool CantBeFocusedAttack(BattleCardBase attackCard)
|
|
{
|
|
if (SkillApplyInformation.IsSneak)
|
|
{
|
|
return true;
|
|
}
|
|
if (SkillApplyInformation.NotBeAttackedInfoList.Any((NotBeAttackedInfo s) => !s.CheckAttacked(attackCard)))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool CanEvolution(bool isSkill, bool isSelfBattlePlayer)
|
|
{
|
|
BattlePlayerBase battlePlayerBase = (isSelfBattlePlayer ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
if (isSkill)
|
|
{
|
|
if (!IsEvolution)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
else if (battlePlayerBase.EvolveWaitTurnCount <= 0 && battlePlayerBase.NowTurnEvol && (battlePlayerBase.CurrentEpCount - SkillApplyInformation.GetEp() >= 0 || battlePlayerBase.CheckNotConsumeEpCard(this)) && !IsEvolution && !SkillApplyInformation.CantEvolutionList.Any((int f) => (f & Skill_cant_evolution.BIT_FLAG_EPUSE) != 0))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public void IncrementSkillActivatedCount()
|
|
{
|
|
SkillActivatedCount++;
|
|
ThisTurnSkillActivatedCount++;
|
|
}
|
|
|
|
public void SetSkillActivatedCount(int value)
|
|
{
|
|
SkillActivatedCount = value;
|
|
}
|
|
|
|
public void SetSkillActivatedCountWrapValue(int value)
|
|
{
|
|
_skillActivatedCountWrapValue = value;
|
|
}
|
|
|
|
public void ResetSkillActivateCountBySimultaneousDestroyedCardList()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousDestroyedCardList = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousDestroyedCardList = false;
|
|
}
|
|
|
|
public void InactiveSkillActivateCountBySimultaneousDestroyedCardList()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousDestroyedCardList = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousDestroyedCardList = true;
|
|
}
|
|
|
|
public void ResetSkillActivateCountBySimultaneousBuffingCards()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousBuffingCards = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousBuffingCards = false;
|
|
}
|
|
|
|
public void InactiveSkillActivateCountBySimultaneousBuffingCards()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousBuffingCards = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousBuffingCards = true;
|
|
}
|
|
|
|
public void ResetSkillActivateCountBySimultaneousSummonedCard()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousSummonedCard = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousSummonedCard = false;
|
|
}
|
|
|
|
public void InactiveSkillActivateCountBySimultaneousSummonedCard()
|
|
{
|
|
ActiveSkillActivateCountBySimultaneousSummonedCard = false;
|
|
AlreadyInactiveSkillActivateCountBySimultaneousSummonedCard = true;
|
|
}
|
|
|
|
protected virtual bool GetIsMovableOnView()
|
|
{
|
|
if (IsOnDraw)
|
|
{
|
|
return false;
|
|
}
|
|
return Movable(isCheckOnDraw: false);
|
|
}
|
|
|
|
public virtual bool Movable(bool isCheckOnDraw = true, bool isSkipSelecting = false, CHECK_CONDITION_MUTATIONSKILL_TYPE type = CHECK_CONDITION_MUTATIONSKILL_TYPE.NONE, bool isRecording = false)
|
|
{
|
|
if (SelfBattlePlayer.Class.SkillApplyInformation.IsCantPlay(this, type))
|
|
{
|
|
return false;
|
|
}
|
|
if (!SelfBattlePlayer.HandCardList.Contains(this))
|
|
{
|
|
return false;
|
|
}
|
|
if (SelfBattlePlayer.Pp < Cost && FixedUseCost == -1)
|
|
{
|
|
return false;
|
|
}
|
|
if (!IsSelfTurn)
|
|
{
|
|
return false;
|
|
}
|
|
if (SelfBattlePlayer.Class.IsDead || OpponentBattlePlayer.Class.IsDead)
|
|
{
|
|
return false;
|
|
}
|
|
if (!InnerOptions.CheckMovable(SelfBattlePlayer.BattleView, BattleCardView, isCheckOnDraw && IsOnDraw, isSkipSelecting, isRecording))
|
|
{
|
|
return false;
|
|
}
|
|
if (!SelfBattlePlayer.IsPlayer && GameMgr.GetIns().IsAdminWatch)
|
|
{
|
|
if (isCheckOnDraw && IsOnDraw)
|
|
{
|
|
return false;
|
|
}
|
|
if (BattleCardView._hasCardEnteredPlayQueue)
|
|
{
|
|
return false;
|
|
}
|
|
if (SelfBattlePlayer.BattleView.IsSelecting && !isSkipSelecting)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
SkillConditionCheckerOption checkerOption = new SkillConditionCheckerOption();
|
|
if (Skills.Any((SkillBase s) => s is Skill_can_play_self && !s.CheckCondition(playerInfoPair, checkerOption, isPrePlay: true)))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public Skill_transform GetAccelerateOrCrystallizeTransformSkill()
|
|
{
|
|
BattlePlayerReadOnlyInfoPair pair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
SkillConditionCheckerOption option = new SkillConditionCheckerOption();
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
if (Skills.ElementAt(i) is Skill_pp_fixeduse { IsAccelerateOrCrystallize: false } skill_pp_fixeduse && !IsCantActivateFanfare && skill_pp_fixeduse.CheckCondition(pair, option, isPrePlay: true))
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
return (Skill_transform)Skills.LastOrDefault((SkillBase s) => (s.OnWhenAccelerate != 0 || s.OnWhenCrystallize != 0) && s is Skill_transform && s.CheckCondition(pair, option, isPrePlay: true));
|
|
}
|
|
|
|
public bool IsMutationMovable(CHECK_CONDITION_MUTATIONSKILL_TYPE type)
|
|
{
|
|
if (type == CHECK_CONDITION_MUTATIONSKILL_TYPE.SELECT_ACCELERATE_SKILL_NOT_ACTIVE)
|
|
{
|
|
return false;
|
|
}
|
|
if (SelfBattlePlayer.InPlayCards.Count() >= 5)
|
|
{
|
|
switch (type)
|
|
{
|
|
case CHECK_CONDITION_MUTATIONSKILL_TYPE.CRYSTALLIZE_SKILL_ACTIVE:
|
|
case CHECK_CONDITION_MUTATIONSKILL_TYPE.SELECT_CRYSTALLIZE_SKILL_NOT_ACTIVE:
|
|
return false;
|
|
default:
|
|
return false;
|
|
case CHECK_CONDITION_MUTATIONSKILL_TYPE.NONE:
|
|
case CHECK_CONDITION_MUTATIONSKILL_TYPE.PLAY:
|
|
break;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void SetDestroyedBySkillList(SkillBase skill)
|
|
{
|
|
DestroyedBySkillList = new List<DestroyedBySkillInfo>();
|
|
if (skill == null)
|
|
{
|
|
return;
|
|
}
|
|
bool isDestroyedBySelf = skill.SkillPrm.ownerCard.SelfBattlePlayer.IsPlayer == SelfBattlePlayer.IsPlayer;
|
|
if (skill.IsWhenPlaySkill)
|
|
{
|
|
DestroyedBySkillList.Add(new DestroyedBySkillInfo(DestroyedBySkillInfo.DestroyedBySkillAbility.WhenPlay, skill.SkillPrm.ownerCard.BaseParameter.BaseCardId, isDestroyedBySelf));
|
|
TransformInformation transformInfo = skill.SkillPrm.ownerCard.TransformInfo;
|
|
switch (transformInfo.Type)
|
|
{
|
|
case TransformType.Accelerate:
|
|
DestroyedBySkillList.Add(new DestroyedBySkillInfo(DestroyedBySkillInfo.DestroyedBySkillAbility.Accelerate, transformInfo.OriginalCard.BaseParameter.BaseCardId, isDestroyedBySelf));
|
|
break;
|
|
case TransformType.Crystallize:
|
|
DestroyedBySkillList.Add(new DestroyedBySkillInfo(DestroyedBySkillInfo.DestroyedBySkillAbility.Crystallize, transformInfo.OriginalCard.BaseParameter.BaseCardId, isDestroyedBySelf));
|
|
break;
|
|
}
|
|
}
|
|
else if (skill.IsWhenDestroySkill)
|
|
{
|
|
DestroyedBySkillList.Add(new DestroyedBySkillInfo(DestroyedBySkillInfo.DestroyedBySkillAbility.WhenDestroy, skill.SkillPrm.ownerCard.BaseParameter.BaseCardId, isDestroyedBySelf));
|
|
}
|
|
else
|
|
{
|
|
DestroyedBySkillList.Add(new DestroyedBySkillInfo(DestroyedBySkillInfo.DestroyedBySkillAbility.None, skill.SkillPrm.ownerCard.BaseParameter.BaseCardId, isDestroyedBySelf));
|
|
}
|
|
}
|
|
|
|
public void SetBanishedInfo(BanishInfo.BanishPlace place)
|
|
{
|
|
BattlePlayerBase battlePlayerBase = (SelfBattlePlayer.IsSelfTurn ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
BanishedInfo = new BanishInfo(battlePlayerBase.Turn, battlePlayerBase.IsPlayer, place);
|
|
}
|
|
|
|
public void SetDiscardedSkill(SkillBase discardedSkill)
|
|
{
|
|
DiscardedSkill = discardedSkill;
|
|
}
|
|
|
|
public void SetReturnedSkill(SkillBase returnedSkill)
|
|
{
|
|
ReturnedSkill = returnedSkill;
|
|
}
|
|
|
|
public bool IsTribe(CardBasePrm.TribeType tribe)
|
|
{
|
|
if (Tribe != null)
|
|
{
|
|
return Tribe.Contains(tribe);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool HasMoreDamageThan(BattleCardBase other)
|
|
{
|
|
return SkillApplyInformation.HasMoreDamageThan(other.SkillApplyInformation);
|
|
}
|
|
|
|
protected void ResetPlayedCost()
|
|
{
|
|
_playedCost = -1;
|
|
}
|
|
|
|
protected void ResetLastCost()
|
|
{
|
|
_lastCost = -1;
|
|
}
|
|
|
|
public void GiveAttackCount(Skill_attack_count skill, int count)
|
|
{
|
|
if (skill.IsAddAttackCount())
|
|
{
|
|
attackCountinfo.Add(new AddAttackCountInfo(skill, count));
|
|
}
|
|
else if (skill.IsSetAttackCount())
|
|
{
|
|
attackCountinfo.Add(new SetAttackCountInfo(skill, count));
|
|
}
|
|
}
|
|
|
|
public void DepriveAttackCount(Skill_attack_count skill)
|
|
{
|
|
attackCountinfo.RemoveAll((AttackCountInfo s) => s.Skill == skill);
|
|
}
|
|
|
|
public void ClearAttackCount()
|
|
{
|
|
attackCountinfo.Clear();
|
|
}
|
|
|
|
public void CallOnAttachSkill(BattleCardBase card, SkillBase skill)
|
|
{
|
|
if (card.IsClass)
|
|
{
|
|
skill.SetAndAddPublishedActiveSkillCount();
|
|
}
|
|
this.OnAttachSkill.Call(card, skill);
|
|
}
|
|
|
|
public Action ForceAttackOff()
|
|
{
|
|
if (BattleManagerBase.GetIns().IsRecovery)
|
|
{
|
|
return delegate
|
|
{
|
|
};
|
|
}
|
|
Func<bool> forceAttackOffFunc = () => false;
|
|
OnCheckCanAttack += forceAttackOffFunc;
|
|
return delegate
|
|
{
|
|
OnCheckCanAttack -= forceAttackOffFunc;
|
|
};
|
|
}
|
|
|
|
public bool HasSkillWhenPlay(bool isOnlyNoSelect)
|
|
{
|
|
if (isOnlyNoSelect)
|
|
{
|
|
bool hasChoiceTransform = NormalSkills.Any((SkillBase s) => s.OnWhenChoicePlayStart != 0 && s is Skill_transform);
|
|
if (NormalSkills.Any((SkillBase s) => s.IsWhenPlaySkill))
|
|
{
|
|
return !NormalSkills.Any((SkillBase s) => (s.IsWhenPlaySkill && (s.IsUserSelectType || s.IsBurialRite)) || (!hasChoiceTransform && s.OnWhenChoicePlayStart != 0));
|
|
}
|
|
return false;
|
|
}
|
|
return NormalSkills.Any((SkillBase s) => s.IsWhenPlaySkill);
|
|
}
|
|
|
|
public int GetCurrentAtkBuff()
|
|
{
|
|
if (IsEvolution)
|
|
{
|
|
return SkillApplyInformation.GetAtk(ignoreLowerLimit: true) - BaseParameter.EvoAtk;
|
|
}
|
|
return SkillApplyInformation.GetAtk(ignoreLowerLimit: true) - BaseParameter.Atk;
|
|
}
|
|
|
|
public int GetCurrentLifeBuff()
|
|
{
|
|
if (IsEvolution)
|
|
{
|
|
return SkillApplyInformation.GetMaxLife() - BaseParameter.EvoLife;
|
|
}
|
|
return SkillApplyInformation.GetMaxLife() - BaseParameter.Life;
|
|
}
|
|
|
|
public bool IsMutationPlayPp(int pp)
|
|
{
|
|
int num = CalcFixedUseCost(pp, skipCondition: true);
|
|
if (-1 != num && num <= pp)
|
|
{
|
|
return pp < Cost;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public Skill_pp_fixeduse GetAccelerateOrCrystallizeSkill(int currentPp)
|
|
{
|
|
Skill_pp_fixeduse result = null;
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
if (Skills.ElementAt(i) is Skill_pp_fixeduse skill_pp_fixeduse && skill_pp_fixeduse._fixedUsePP <= currentPp && skill_pp_fixeduse._fixedUsePP < Cost && currentPp < Cost)
|
|
{
|
|
result = skill_pp_fixeduse;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public int CalcFixedUseCost(int currentPp, bool skipCondition = false)
|
|
{
|
|
int num = -1;
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
if (Skills.ElementAt(i) is Skill_pp_fixeduse skill_pp_fixeduse && currentPp >= skill_pp_fixeduse._fixedUsePP)
|
|
{
|
|
bool flag = skill_pp_fixeduse.CheckCondition(playerInfoPair, new SkillConditionCheckerOption(), isPrePlay: true);
|
|
bool num2 = flag && num < skill_pp_fixeduse._fixedUsePP;
|
|
bool flag2 = (skipCondition || flag) && skill_pp_fixeduse._fixedUsePP < Cost && currentPp < Cost;
|
|
if (num2 || flag2)
|
|
{
|
|
num = skill_pp_fixeduse._fixedUsePP;
|
|
}
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public int GetPaidFixedCost()
|
|
{
|
|
if (ExecutedFixedUseCostIndex != -1 && Skills.ElementAt(ExecutedFixedUseCostIndex) is Skill_pp_fixeduse skill_pp_fixeduse)
|
|
{
|
|
return skill_pp_fixeduse._fixedUsePP;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
public bool CheckConditionFixedUseCost(bool isPrePlay)
|
|
{
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
if (Skills.ElementAt(i) is Skill_pp_fixeduse skill_pp_fixeduse && skill_pp_fixeduse.CheckCondition(new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer), new SkillConditionCheckerOption(), isPrePlay))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected bool IsFixedUseEnable(int labelCost)
|
|
{
|
|
if (Skills.Any((SkillBase s) => s is Skill_pp_fixeduse && (s as Skill_pp_fixeduse)._fixedUsePP == labelCost && ((s as Skill_pp_fixeduse)._fixedUsePP < Cost || !(s as Skill_pp_fixeduse).IsAccelerateOrCrystallize)))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool HasSkillDestroyTribe(CardBasePrm.TribeType tribe)
|
|
{
|
|
if (_normalSkillCollection != null && HasSkillDestroyTribeInner(tribe, _normalSkillCollection))
|
|
{
|
|
return true;
|
|
}
|
|
if (_evolveSkillCollection != null && HasSkillDestroyTribeInner(tribe, _evolveSkillCollection))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool HasSkillDestroyTribeInner(CardBasePrm.TribeType tribe, SkillCollectionBase skills)
|
|
{
|
|
if (skills == null)
|
|
{
|
|
return false;
|
|
}
|
|
for (int i = 0; i < skills.Count(); i++)
|
|
{
|
|
for (int j = 0; j < skills.ElementAt(i).PreprocessList.Count; j++)
|
|
{
|
|
if (skills.ElementAt(i).PreprocessList[j] is SkillPreprocessDestroyTribe skillPreprocessDestroyTribe && tribe == skillPreprocessDestroyTribe.GetDestroyTribe())
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private CardParameter CreateClassParameter(bool isPlayer)
|
|
{
|
|
DataMgr dataMgr = GameMgr.GetIns().GetDataMgr();
|
|
return new CardParameter((CardBasePrm.ClanType)(isPlayer ? dataMgr.GetPlayerClassId() : dataMgr.GetEnemyClassId()));
|
|
}
|
|
|
|
public void ChangeClassClanParameter()
|
|
{
|
|
DataMgr dataMgr = GameMgr.GetIns().GetDataMgr();
|
|
BaseParameter.ChangeClanParameter((CardBasePrm.ClanType)(IsPlayer ? dataMgr.GetPlayerClassId() : dataMgr.GetEnemyClassId()));
|
|
}
|
|
|
|
public void CreateParameter()
|
|
{
|
|
if (CardMaster.IsClass(_buildInfo.CardId))
|
|
{
|
|
BaseParameter = CreateClassParameter(IsPlayer);
|
|
}
|
|
else
|
|
{
|
|
BaseParameter = CardMaster.GetInstanceForBattle().GetCardParameterFromId(_buildInfo.CardId);
|
|
}
|
|
}
|
|
|
|
public BattleCardBase(BuildInfo buildInfo)
|
|
{
|
|
_buildInfo = buildInfo;
|
|
IsTokenLoad = false;
|
|
SelfBattlePlayer = buildInfo.SelfBattlePlayer;
|
|
OpponentBattlePlayer = buildInfo.OpponentBattlePlayer;
|
|
SelfBattlePlayerReadOnlyInfo = buildInfo.SelfBattlePlayerReadOnlyInfo;
|
|
IsPlayer = buildInfo.IsPlayer;
|
|
CreateParameter();
|
|
CostModifierList = new List<ICardCostModifier>();
|
|
attackCountinfo = new List<AttackCountInfo>();
|
|
SpellChargeCount = 0;
|
|
ExecutedFixedUseCostIndex = -1;
|
|
DamagedCounter = new ItWasDamagedCounter();
|
|
GetOffCards = new List<BattleCardBase>();
|
|
IsSummonDrunkenness = true;
|
|
IsOnMove = false;
|
|
IsOnDraw = true;
|
|
ResetPlayedCost();
|
|
ResetLastCost();
|
|
PlayedTurn = -1;
|
|
DeathTypeInfo = new DeathTypeInformation();
|
|
BuffInfoList = new List<BuffInfo>();
|
|
SkillActivationList = new List<SkillActivationInfo>();
|
|
_skillActivatedCount = 1;
|
|
ThisTurnSkillActivatedCount = 0;
|
|
InitSkillCollection();
|
|
Skills = _normalSkillCollection;
|
|
IsSkillLost = false;
|
|
IsReanimate = false;
|
|
HasAnySkill = (NormalSkills != null && NormalSkills.Any((SkillBase skill) => !(skill is Skill_none) && !skill.IsAttachedSkill)) || (EvolutionSkills != null && EvolutionSkills.Any((SkillBase skill) => !(skill is Skill_none) && !skill.IsAttachedSkill));
|
|
HasSkillNecromance = (NormalSkills != null && NormalSkills.Any((SkillBase skill) => skill.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessNecromance) && !skill.IsAttachedSkill)) || (EvolutionSkills != null && EvolutionSkills.Any((SkillBase skill) => skill.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessNecromance) && !skill.IsAttachedSkill));
|
|
OnPlay += delegate
|
|
{
|
|
BattleCardView.HideCanPlayEffect();
|
|
return NullVfx.GetInstance();
|
|
};
|
|
}
|
|
|
|
public virtual void Setup(bool createNullView = false, bool isRecreate = false)
|
|
{
|
|
BattleCardView = CreateView(CreateViewBuildInfo(_buildInfo), createNullView);
|
|
VfxCreator = CreateVfxCreator(IsPlayer, BattleCardView, createNullView);
|
|
if (!createNullView)
|
|
{
|
|
foreach (SkillBase normalSkill in NormalSkills)
|
|
{
|
|
normalSkill.SetInductionVoiceIndex();
|
|
}
|
|
foreach (SkillBase evolutionSkill in EvolutionSkills)
|
|
{
|
|
evolutionSkill.SetInductionVoiceIndex();
|
|
}
|
|
}
|
|
if (SkillApplyInformation == null)
|
|
{
|
|
SkillApplyInformation = CreateSkillApplyInformation(this, VfxCreator);
|
|
SkillApplyInformation.InitializeInformation();
|
|
}
|
|
if (!isRecreate)
|
|
{
|
|
DrawTurn = -1;
|
|
}
|
|
DestroyedTurn = -1;
|
|
DestroyedBySkillList = new List<DestroyedBySkillInfo>();
|
|
BanishedInfo = new BanishInfo(-1, isSelfTurn: false, BanishInfo.BanishPlace.None);
|
|
}
|
|
|
|
public void RecreateView(GameObject cardGameObject)
|
|
{
|
|
_buildInfo.GameObject = cardGameObject;
|
|
Setup(createNullView: false, isRecreate: true);
|
|
SkillApplyInformation.ReSetupVfxCreator(VfxCreator);
|
|
}
|
|
|
|
protected virtual void InitSkillCollection()
|
|
{
|
|
_normalSkillCollection = CreateSkillCondition(_buildInfo.NormalSkillBuildInfos, _buildInfo.SelfBattlePlayer, _buildInfo.OpponentBattlePlayer, _buildInfo.ResourceMgr);
|
|
_evolveSkillCollection = CreateSkillCondition(_buildInfo.EvolveSkillBuildInfos, _buildInfo.SelfBattlePlayer, _buildInfo.OpponentBattlePlayer, _buildInfo.ResourceMgr);
|
|
}
|
|
|
|
public void SetIndex(int setIndex)
|
|
{
|
|
_buildInfo.BattleCardIndex = setIndex;
|
|
}
|
|
|
|
public virtual void UpdateSkillCollection()
|
|
{
|
|
}
|
|
|
|
protected virtual BattleCardView.BuildInfo CreateViewBuildInfo(BuildInfo baseBuildInfo)
|
|
{
|
|
Func<bool> getIsTouchable = null;
|
|
if (baseBuildInfo.SelfBattlePlayer != null)
|
|
{
|
|
getIsTouchable = baseBuildInfo.SelfBattlePlayer.BattleView.IsTouchable;
|
|
}
|
|
return new BattleCardView.BuildInfo(this, new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer), baseBuildInfo.GameObject, SelfBattlePlayer.BattleCamera, SelfBattlePlayer.BackGround, baseBuildInfo.ResourceMgr, getIsTouchable, () => GetIsMovableOnView(), () => IsOnMove, (int cost) => IsFixedUseEnable(cost), () => !IsActionCard, () => Attackable && IsInplay && IsSelfTurn, () => IsCantAttackClass, GetHandCardFrameEffectType);
|
|
}
|
|
|
|
protected virtual IBattleCardView CreateView(BattleCardView.BuildInfo buildInfo, bool IsNullView)
|
|
{
|
|
if (IsNullView)
|
|
{
|
|
return new NullBattleCardView(buildInfo);
|
|
}
|
|
return new BattleCardView(buildInfo);
|
|
}
|
|
|
|
protected SkillCollectionBase CreateSkillCondition(IEnumerable<SkillCreator.SkillBuildInfo> buildInfos, BattlePlayerBase selfBattlPlayer, BattlePlayerBase opponentBattlePlayer, IBattleResourceMgr resourceMgr)
|
|
{
|
|
if (buildInfos == null)
|
|
{
|
|
return null;
|
|
}
|
|
SkillCollectionBase skillCollectionBase = CreateSkillCollection();
|
|
List<SkillPreprocessBase> list = null;
|
|
SkillCreator skillCreator = CreateSkillCreator(selfBattlPlayer, opponentBattlePlayer, resourceMgr);
|
|
foreach (SkillCreator.SkillBuildInfo buildInfo in buildInfos)
|
|
{
|
|
SkillBase skillBase = skillCreator.Create(buildInfo, list);
|
|
skillCollectionBase.Add(skillBase);
|
|
if (skillBase.PreprocessList.Any())
|
|
{
|
|
if (skillBase.PreprocessList.Any((SkillPreprocessBase p) => p is SkillPreprocessReferencePrevious))
|
|
{
|
|
list.AddRange(skillBase.PreprocessList);
|
|
}
|
|
else
|
|
{
|
|
list = skillBase.PreprocessList.ToList();
|
|
}
|
|
}
|
|
}
|
|
skillCollectionBase.Complete();
|
|
return skillCollectionBase;
|
|
}
|
|
|
|
public virtual SkillCreator CreateSkillCreator(BattlePlayerBase selfBattlPlayer, BattlePlayerBase opponentBattlePlayer, IBattleResourceMgr resourceMgr)
|
|
{
|
|
return new SkillCreator(this, selfBattlPlayer, opponentBattlePlayer, resourceMgr);
|
|
}
|
|
|
|
protected virtual SkillCollectionBase CreateSkillCollection()
|
|
{
|
|
return new SkillCollectionBase(this);
|
|
}
|
|
|
|
public virtual VfxBase TurnStart(SkillProcessor skillProcessor)
|
|
{
|
|
if (IsInplay)
|
|
{
|
|
this.OnTurnStart.Call();
|
|
AttackableCount = MaxAttackableCount;
|
|
IsFirstTurn = false;
|
|
IsSummonDrunkenness = false;
|
|
}
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
skillProcessor.Register(Skills.CreateTurnStartInfo(skillProcessor, playerInfoPair));
|
|
return Skills.RegisterAndProcessWhenTurnStartImmediateInfo(new BattlePlayerPair(SelfBattlePlayer, OpponentBattlePlayer));
|
|
}
|
|
|
|
public virtual VfxBase OpponentTurnStart(SkillProcessor skillProcessor)
|
|
{
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
skillProcessor.Register(Skills.CreateTurnStartInfo(skillProcessor, playerInfoPair));
|
|
return Skills.RegisterAndProcessWhenTurnStartImmediateInfo(new BattlePlayerPair(SelfBattlePlayer, OpponentBattlePlayer));
|
|
}
|
|
|
|
public virtual void Necromance(BattleCardBase necromanceCard, SkillProcessor skillProcessor, int necromanceCount)
|
|
{
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
skillProcessor.Register(Skills.CreateNecromanceInfo(necromanceCard, skillProcessor, playerInfoPair, necromanceCount));
|
|
}
|
|
|
|
public virtual VfxBase TurnEndPostProcess()
|
|
{
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual void TurnEndSkillProcess(SkillProcessor skillProcessor)
|
|
{
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
skillProcessor.Register(Skills.CreateTurnEndInfo(skillProcessor, playerInfoPair));
|
|
ThisTurnSkillActivatedCount = 0;
|
|
}
|
|
|
|
public void CheckPreviousTurnAttacked()
|
|
{
|
|
if (SelfBattlePlayer.IsSelfTurn && IsInplay)
|
|
{
|
|
IsPreviousTurnAttacked = AttackableCount < MaxAttackableCount;
|
|
}
|
|
}
|
|
|
|
public virtual VfxBase Draw(Vector3 Pos)
|
|
{
|
|
return VfxCreator.CreateDraw(Pos, IsLegend);
|
|
}
|
|
|
|
public virtual VfxBase Moving(Vector3 Pos)
|
|
{
|
|
return VfxCreator.CreateMoving(Pos);
|
|
}
|
|
|
|
protected virtual VfxBase StartPlayCard()
|
|
{
|
|
foreach (BattleCardBase handCard in SelfBattlePlayer.HandCardList)
|
|
{
|
|
if (handCard != this)
|
|
{
|
|
handCard.BattleCardView.areArrowsForcedOff = false;
|
|
handCard.BattleCardView.UpdateMovability();
|
|
}
|
|
}
|
|
if (!GameMgr.GetIns().IsNewReplayBattle)
|
|
{
|
|
SelfBattlePlayer.CantPlayChoiceBrave = false;
|
|
SelfBattlePlayer.BattleView.UpdateChoiceBraveButtonPulsateEffectAndSprite();
|
|
}
|
|
BattleCardView.HideHandCardInfo();
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public VfxWith<SkillProcessor.ProcessInfo> PlayCard(SkillProcessor skillProcessor, SkillConditionCheckerOption option, bool isInplayGeneration = false, BattleCardBase originalCard = null)
|
|
{
|
|
SequentialVfxPlayer sequentialVfx = SequentialVfxPlayer.Create();
|
|
IsSummonDrunkenness = true;
|
|
AttackableCount = MaxAttackableCount;
|
|
VfxBase instance = NullVfx.GetInstance();
|
|
if (!IsChoiceBraveSkillCard)
|
|
{
|
|
int useCost = Cost;
|
|
if (CheckConditionFixedUseCost(isPrePlay: true))
|
|
{
|
|
useCost = CalcFixedUseCost(SelfBattlePlayer.Pp);
|
|
List<SkillBase> list = Skills.Where((SkillBase s) => s is Skill_pp_fixeduse && !(s as Skill_pp_fixeduse).IsAccelerateOrCrystallize).ToList();
|
|
SkillBase item = list.SingleOrDefault((SkillBase s) => (s as Skill_pp_fixeduse)._fixedUsePP == useCost);
|
|
ExecutedFixedUseCostIndex = list.IndexOf(item);
|
|
}
|
|
instance = SelfBattlePlayer.UsePp(useCost);
|
|
_playedCost = useCost;
|
|
_lastCost = useCost;
|
|
SelfBattlePlayer.SummonedCards.Add(this);
|
|
}
|
|
else
|
|
{
|
|
instance = SelfBattlePlayer.UseBp(Cost, BaseParameter.IsVariableCost, IsPlayer);
|
|
_playedCost = Cost;
|
|
}
|
|
VfxBase vfxBase = StartPlayCard();
|
|
sequentialVfx.Register(ParallelVfxPlayer.Create(instance, vfxBase));
|
|
sequentialVfx.Register(SetUpInplay());
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
VfxWith<SkillProcessor.ProcessInfo> vfxWith = (isInplayGeneration ? new VfxWith<SkillProcessor.ProcessInfo>(NullVfx.GetInstance(), null) : Skills.CreateWhenPlayInfo(this, skillProcessor, playerInfoPair, option));
|
|
VfxBase allFuncVfxResults = this.OnPlay.GetAllFuncVfxResults();
|
|
sequentialVfx.Register(allFuncVfxResults);
|
|
sequentialVfx.Register(vfxWith.Vfx);
|
|
SelfBattlePlayer.CallOnPlayCard((originalCard != null) ? originalCard : this, this, IsChoiceBraveSkillCard);
|
|
SelfBattlePlayer.AddRallyCount(SelfBattlePlayer.SummonedCards.Where((BattleCardBase c) => c.IsInplay && c.IsUnit).Count());
|
|
sequentialVfx.Register(InstantVfx.Create(delegate
|
|
{
|
|
if (SelfBattlePlayer.HandCardList.Count <= 0)
|
|
{
|
|
sequentialVfx.Register(SelfBattlePlayer.BattleView.HandUnfocus());
|
|
}
|
|
}));
|
|
sequentialVfx.Register(InstantVfx.Create(delegate
|
|
{
|
|
MotionUtils.SetLayerAll(BattleCardView.CardTemplate.CardNormalTemp.gameObject, 10);
|
|
}));
|
|
return new VfxWith<SkillProcessor.ProcessInfo>(sequentialVfx, vfxWith.Value);
|
|
}
|
|
|
|
public virtual VfxWith<SkillProcessor.ProcessInfo> PlayChoiceCard(SkillProcessor skillProcessor, SkillConditionCheckerOption option)
|
|
{
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
return Skills.CreateWhenChoicePlayInfo(skillProcessor, playerInfoPair, option);
|
|
}
|
|
|
|
public VfxBase FinishWhenPlaySkill()
|
|
{
|
|
VfxBase[] allFuncCallResults = this.OnFinishWhenPlaySkill.GetAllFuncCallResults();
|
|
if (allFuncCallResults.IsNotNullOrEmpty())
|
|
{
|
|
return SequentialVfxPlayer.Create(allFuncCallResults);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public virtual VfxBase DestroyInPlay(SkillProcessor skillProcessor, bool useDestroy = true, SkillBase destroyedSkill = null)
|
|
{
|
|
if (IsDead)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
if (IsChoiceEvolutionCard)
|
|
{
|
|
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
UpdateBuildInfoAndSkillCollection(BaseParameter.BaseCardId, BaseParameter.IsFoil, isNotUpdateAtkLife: true);
|
|
}));
|
|
}
|
|
sequentialVfxPlayer.Register(RemoveFromInPlay());
|
|
VfxBase allFuncVfxResults = this.OnDestroy.GetAllFuncVfxResults(this, skillProcessor);
|
|
if (!SelfBattlePlayer.ClassAndInPlayCardList.Contains(this))
|
|
{
|
|
DeathTypeInfo.WhenDestroy = Skills._skillTimingInfo.IsWhenDestroy;
|
|
VfxBase vfx = VfxCreator.CreateDestroy(DeathTypeInfo, SelfBattlePlayer);
|
|
sequentialVfxPlayer.Register(vfx);
|
|
}
|
|
sequentialVfxPlayer.Register(allFuncVfxResults);
|
|
BattlePlayerBase battlePlayerBase = (SelfBattlePlayer.IsSelfTurn ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
DestroyedTurn = battlePlayerBase.Turn;
|
|
IsDestroySelfTurn = battlePlayerBase.IsPlayer;
|
|
return sequentialVfxPlayer;
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual VfxBase DestroyInHand(SkillProcessor skillProcessor)
|
|
{
|
|
BattlePlayerBase battlePlayerBase = (SelfBattlePlayer.IsSelfTurn ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
DestroyedTurn = battlePlayerBase.Turn;
|
|
IsDestroySelfTurn = battlePlayerBase.IsPlayer;
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(StopSpellCharge());
|
|
VfxBase allFuncVfxResults = this.OnDestroy.GetAllFuncVfxResults(this, skillProcessor);
|
|
if (!SelfBattlePlayer.HandCardList.Contains(this))
|
|
{
|
|
VfxBase vfx = VfxCreator.CreateDestroyHand(DeathTypeInfo, SelfBattlePlayer);
|
|
BattleCardView.HideCanPlayEffect();
|
|
sequentialVfxPlayer.Register(vfx);
|
|
}
|
|
sequentialVfxPlayer.Register(allFuncVfxResults);
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxBase Banish(SkillProcessor skillProcessor, bool isReturn = false)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
if (IsChoiceEvolutionCard)
|
|
{
|
|
if (isReturn)
|
|
{
|
|
UpdateBuildInfoAndSkillCollection(BaseParameter.BaseCardId, BaseParameter.IsFoil);
|
|
if (!SelfBattlePlayer.BattleMgr.IsRecovery || IsPlayer)
|
|
{
|
|
BattleCardView.CardTemplate.NormalNameLabelTemp.text = BaseParameter.CardName;
|
|
Global.SetRepositionNameLabel(BattleCardView.CardTemplate.NormalNameLabelTemp, BaseParameter.CardName, is2D: false);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
UpdateBuildInfoAndSkillCollection(BaseParameter.BaseCardId, BaseParameter.IsFoil, isNotUpdateAtkLife: true);
|
|
}));
|
|
}
|
|
}
|
|
sequentialVfxPlayer.Register(this.OnBanish.GetAllFuncVfxResults(this, skillProcessor));
|
|
if (!isReturn)
|
|
{
|
|
sequentialVfxPlayer.Register(VfxCreator.CreateBanish(DeathTypeInfo, SelfBattlePlayer));
|
|
}
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxWithLoading BanishInHand(SkillProcessor skillProcessor)
|
|
{
|
|
VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(this.OnBanish.GetAllFuncVfxResults(this, skillProcessor));
|
|
if (!SelfBattlePlayer.HandCardList.Contains(this))
|
|
{
|
|
vfxWithLoadingSequential.RegisterVfxWithLoading(VfxCreator.CreateBanishHand(DeathTypeInfo, SelfBattlePlayer));
|
|
}
|
|
return vfxWithLoadingSequential;
|
|
}
|
|
|
|
public virtual VfxBase BanishInDeck(SkillProcessor skillProcessor)
|
|
{
|
|
return this.OnBanish.GetAllFuncVfxResults(this, skillProcessor);
|
|
}
|
|
|
|
public virtual VfxBase GetOn(Transform vehicleCardTrans, IBattleCardView vehicleCardView, SkillProcessor skillProcessor, bool isReturn = false)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(this.OnGetOn.GetAllFuncVfxResults(this, skillProcessor));
|
|
sequentialVfxPlayer.Register(VfxCreator.CreateGeton(vehicleCardTrans, vehicleCardView, DeathTypeInfo, SelfBattlePlayer));
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxBase UniteInPlay(SkillProcessor skillProcessor, SkillBase skill)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(LoseSkill());
|
|
sequentialVfxPlayer.Register(SkillApplyInformation.AllSkillEffectStop());
|
|
sequentialVfxPlayer.Register(RemoveFromInPlay());
|
|
sequentialVfxPlayer.Register(SelfBattlePlayer.UniteCard(this, skillProcessor, skill));
|
|
sequentialVfxPlayer.Register(VfxCreator.CreateBanish(DeathTypeInfo, SelfBattlePlayer));
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxWithLoading FusionMaterialized(SkillProcessor skillProcessor, BattleCardBase fusionCard, bool isFusionMetamorphose)
|
|
{
|
|
fusionCard.SkillApplyInformation.AddFusionIngredientCard(this);
|
|
FusionedTurn = SelfBattlePlayer.Turn;
|
|
DeathTypeInfo.UseFusionIngredient = true;
|
|
DeathTypeInfo.UseFusionMetamorphoseIngredient = isFusionMetamorphose;
|
|
VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(this.OnBanish.GetAllFuncVfxResults(this, skillProcessor));
|
|
vfxWithLoadingSequential.RegisterVfxWithLoading(VfxCreator.CreateFusionHand(SelfBattlePlayer, fusionCard.BattleCardView, isFusionMetamorphose));
|
|
return vfxWithLoadingSequential;
|
|
}
|
|
|
|
public virtual VfxBase Metamorphose(SkillProcessor SkillProcessor)
|
|
{
|
|
return this.OnMetamorphose.GetAllFuncVfxResults(this, SkillProcessor);
|
|
}
|
|
|
|
public VfxWithLoadingSequential SkillPlayCard(bool isPlayer, SkillBaseSummon.SUMMON_TYPE summonType, SkillProcessor skillProcessor, SkillBase skill, bool isGetoff = false, bool isReanimate = false)
|
|
{
|
|
_lastCost = Cost;
|
|
VfxBase vfxBase = SelfBattlePlayer.PickCard(this, skill, summonType, isGetoff, isReanimate);
|
|
VfxBase vfxBase2 = SetUpInplay();
|
|
IsReanimate = isReanimate;
|
|
if (summonType == SkillBaseSummon.SUMMON_TYPE.HAND)
|
|
{
|
|
skillProcessor.Register(Skills.CreateWhenHandToNotPlayInfo(skillProcessor, new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer), new SkillConditionCheckerOption()));
|
|
}
|
|
return VfxWithLoadingSequential.Create(vfxBase, vfxBase2);
|
|
}
|
|
|
|
public VfxBase StartHandEffect()
|
|
{
|
|
if (SelfBattlePlayer.IsPlayer || GameMgr.GetIns().IsAdminWatch)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
if (SpellChargeCount > 0 && HasSpellCharge && IsInHand)
|
|
{
|
|
sequentialVfxPlayer.Register(new HandEffectLoopStartVfx(BattleCardView, () => IsActionCard, HandEffectLoopStartVfx.HandEffectType.SpellCharge));
|
|
}
|
|
return sequentialVfxPlayer;
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual VfxBase RecoveryAttackCount()
|
|
{
|
|
AttackableCount = MaxAttackableCount;
|
|
return InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView._inPlayFrameEffect.UpdateCanAttackEffect();
|
|
});
|
|
}
|
|
|
|
public virtual VfxBase StopSpellCharge()
|
|
{
|
|
return new HandEffectLoopEndVfx(BattleCardView);
|
|
}
|
|
|
|
public virtual VfxBase CreateMoveToHandVfx()
|
|
{
|
|
if (IsPlayer)
|
|
{
|
|
return new PlayerDrawCardToHandVfx(this);
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public VfxBase CreateShowLogVfx(float time, SkillBase skill, bool isEvolve, string SkillDescription)
|
|
{
|
|
if (PlayerPrefsWrapper.GetBool(PlayerPrefsWrapper.SHOW_SIDE_LOG))
|
|
{
|
|
BattlePlayerBase.SideLogInfo sideLogInfo = new BattlePlayerBase.SideLogInfo(skill);
|
|
return new ShowSideLogVfx(this, skill, SelfBattlePlayer.BattleView.GetSideLogControl(isSkillTargetSelect: false), (SkillDescription == string.Empty) ? GetCardSkillDescription(sideLogInfo, isEvolve) : SkillDescription, time, isEvol: false, sideLogInfo);
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual AttackOpponentResult AttackOpponent(BattleCardBase target, DamageParam damageParam, SkillProcessor skillProcessor, bool IsChallenge)
|
|
{
|
|
return new AttackOpponentResult(NullVfx.GetInstance(), NullVfx.GetInstance(), null);
|
|
}
|
|
|
|
public void SetOnMove(bool move)
|
|
{
|
|
IsOnMove = move;
|
|
}
|
|
|
|
public void SetOnDraw(bool draw)
|
|
{
|
|
IsOnDraw = draw;
|
|
}
|
|
|
|
public IEnumerable<SkillBase> GetSelectTypeSkill(bool isEvolve = false, bool isFusion = false, bool isRegister = false, bool isEvolutionSimpleProcessor = false, bool isChoiceCheck = false)
|
|
{
|
|
SkillCollectionBase skillCollectionBase = (isEvolve ? EvolutionSkills : Skills);
|
|
NetworkBattleManagerBase networkBattleManagerBase = SelfBattlePlayer.BattleMgr as NetworkBattleManagerBase;
|
|
GameMgr ins = GameMgr.GetIns();
|
|
if (!ins.IsAdminWatch && !ins.IsAINetwork && networkBattleManagerBase != null)
|
|
{
|
|
NetworkBattleReceiver.ReceiveData receiveData = networkBattleManagerBase.networkBattleData.GetReceiveData();
|
|
if (Index == receiveData.playCardIndex && !isEvolutionSimpleProcessor && !isChoiceCheck)
|
|
{
|
|
List<int> list = new List<int>();
|
|
for (int i = 0; i < receiveData.OpponentTargetDataList.Count; i++)
|
|
{
|
|
list.AddRange(receiveData.OpponentTargetDataList[i].SelectSkillIndexList);
|
|
}
|
|
list = list.Distinct().ToList();
|
|
if (list.Count > 0)
|
|
{
|
|
List<SkillBase> list2 = new List<SkillBase>();
|
|
for (int j = 0; j < list.Count; j++)
|
|
{
|
|
if (list[j] < skillCollectionBase.Count())
|
|
{
|
|
list2.Add(skillCollectionBase.ElementAt(list[j]));
|
|
continue;
|
|
}
|
|
LocalLog.AccumulateTraceLog("SelectSkillIndex " + list[j] + " out of range. CardId:" + CardId + " &&" + StackTraceUtility.ExtractStackTrace());
|
|
}
|
|
return list2;
|
|
}
|
|
}
|
|
}
|
|
BattlePlayerReadOnlyInfoPair readOnlyInfoPair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
BattleCardBase battleCardBase = SelfBattlePlayer.Class;
|
|
bool isActivateFanfare = (!IsUnit || !battleCardBase.SkillApplyInformation.IsCantActivateFanfareUnit) && (!IsField || !battleCardBase.SkillApplyInformation.IsCantActivateFanfareField);
|
|
IEnumerable<SkillBase> selectTypeSkill = skillCollectionBase.GetSelectTypeSkill(isEvolve, isFusion, isActivateFanfare, readOnlyInfoPair);
|
|
if (isRegister && SelfBattlePlayer.BattleMgr is NetworkBattleManagerBase networkBattleManagerBase2)
|
|
{
|
|
for (int k = 0; k < selectTypeSkill.Count(); k++)
|
|
{
|
|
networkBattleManagerBase2.AddRegisterSelectTypeSkillIndexList(skillCollectionBase.IndexOf(selectTypeSkill.ElementAt(k)));
|
|
}
|
|
}
|
|
return selectTypeSkill;
|
|
}
|
|
|
|
public virtual VfxBase StartAttack(BattleCardBase underAttackCard, BattlePlayerPair battlePlayerPair)
|
|
{
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual DamageResult ApplyDamage(SkillBase skill, DamageParam damage, bool doesAttackerPossessKiller, bool isReflectedDamage, SkillProcessor skillProcessor, BattleCardBase reflectCard)
|
|
{
|
|
DamagedCounter.AddDamageCount(SelfBattlePlayer.IsSelfTurn);
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
if (this.OnDamageAfter != null)
|
|
{
|
|
sequentialVfxPlayer.Register(this.OnDamageAfter.GetAllFuncVfxResults(skillProcessor));
|
|
}
|
|
if (reflectCard != null && reflectCard.OnReflectionAfter != null)
|
|
{
|
|
sequentialVfxPlayer.Register(reflectCard.OnReflectionAfter.GetAllFuncVfxResults(skillProcessor));
|
|
}
|
|
BattleCardBase battleCardBase = damage.OwnerCard.SelfBattlePlayer.Class;
|
|
if (battleCardBase != damage.OwnerCard && battleCardBase.SkillApplyInformation.AddDamageList.Count() > 0 && battleCardBase.OnGiveDamage != null)
|
|
{
|
|
sequentialVfxPlayer.Register(battleCardBase.OnGiveDamage.GetAllFuncVfxResults(skillProcessor));
|
|
}
|
|
if (damage.OwnerCard.OnGiveDamage != null)
|
|
{
|
|
sequentialVfxPlayer.Register(damage.OwnerCard.OnGiveDamage.GetAllFuncVfxResults(skillProcessor));
|
|
}
|
|
return new DamageResult(sequentialVfxPlayer, 0, 0);
|
|
}
|
|
|
|
public virtual HealResult ApplyHealing(HealParam healParam, SkillProcessor skillProcessor)
|
|
{
|
|
return new HealResult(-1, NullVfx.GetInstance());
|
|
}
|
|
|
|
protected VfxBase CreateVfxWithCardPlayabilityRefresh(VfxBase originalVfx)
|
|
{
|
|
return SequentialVfxPlayer.Create(originalVfx, InstantVfx.Create(delegate
|
|
{
|
|
SelfBattlePlayer.UpdateHandCardsPlayability();
|
|
}));
|
|
}
|
|
|
|
public virtual VfxBase Evolution(bool isSkill, SkillProcessor skillProcessor, SkillConditionCheckerOption option, Func<BattleCardBase, IBattleResourceMgr, EvolveVfxBase> getEvolveVfxFunc = null)
|
|
{
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public void CallOnFusionEvent(List<BattleCardBase> ingredientCards)
|
|
{
|
|
this.OnFusionEvent.Call(ingredientCards);
|
|
}
|
|
|
|
public VfxBase Fusion(SkillProcessor skillProcessor, List<BattleCardBase> ingredientCards, bool isFusionMetamorphose)
|
|
{
|
|
if (!isFusionMetamorphose)
|
|
{
|
|
SetActiveSkillCount();
|
|
}
|
|
skillProcessor.Register(Skills.CreateWhenFusionInfo(ingredientCards, skillProcessor, new BattlePlayerPair(SelfBattlePlayer, OpponentBattlePlayer)));
|
|
for (int i = 0; i < ingredientCards.Count; i++)
|
|
{
|
|
skillProcessor.Register(ingredientCards[i].Skills.CreateWhenFusionedInfo(skillProcessor, new BattlePlayerPair(SelfBattlePlayer, OpponentBattlePlayer)));
|
|
}
|
|
BattlePlayerBase battlePlayerBase = (IsSelfTurn ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
BattlePlayerBase obj = (IsSelfTurn ? OpponentBattlePlayer : SelfBattlePlayer);
|
|
battlePlayerBase.StartSkillWhenFusionOther(ingredientCards, skillProcessor);
|
|
obj.StartSkillWhenFusionOther(ingredientCards, skillProcessor);
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public virtual void InitializeParameterOnWhenReturn()
|
|
{
|
|
InitSkillApplyInformationOnWhenReturn();
|
|
}
|
|
|
|
protected virtual void InitSkillApplyInformationOnWhenReturn()
|
|
{
|
|
SkillApplyInformation.InitializeInformation(isReturnCard: true);
|
|
SkillApplyInformation.ClearParameterModifier();
|
|
ClearCostModifier();
|
|
TransformInfo = default(TransformInformation);
|
|
int normalIndividualId = NormalIndividualId;
|
|
int evolutionIndividualId = EvolutionIndividualId;
|
|
SkillApplyInformation.AttachedSkillsInfo.Clear();
|
|
_normalSkillCollection.Clear();
|
|
_evolveSkillCollection.Clear();
|
|
SkillCreator.CardSkillsBuildInfo cardSkillsBuildInfo = SkillCreator.CreateBuildInfo(CardMaster.GetInstanceForBattle().GetCardParameterFromId(CardId));
|
|
_buildInfo.NormalSkillBuildInfos = cardSkillsBuildInfo.normalSkillBuildInfos;
|
|
_buildInfo.EvolveSkillBuildInfos = cardSkillsBuildInfo.evolveSkillBuildInfos;
|
|
foreach (SkillBase item in CreateSkillCondition(cardSkillsBuildInfo.normalSkillBuildInfos, SelfBattlePlayer, OpponentBattlePlayer, _buildInfo.ResourceMgr))
|
|
{
|
|
_normalSkillCollection.Add(item);
|
|
item.SetInductionVoiceIndex();
|
|
item.SetIndividualId(normalIndividualId);
|
|
}
|
|
foreach (SkillBase item2 in CreateSkillCondition(cardSkillsBuildInfo.evolveSkillBuildInfos, SelfBattlePlayer, OpponentBattlePlayer, _buildInfo.ResourceMgr))
|
|
{
|
|
_evolveSkillCollection.Add(item2);
|
|
item2.SetInductionVoiceIndex();
|
|
item2.SetIndividualId(evolutionIndividualId);
|
|
}
|
|
Skills = _normalSkillCollection;
|
|
Skills.Complete();
|
|
}
|
|
|
|
public virtual VfxBase ReturnCard(SkillProcessor skillProcessor)
|
|
{
|
|
if (IsChoiceEvolutionCard)
|
|
{
|
|
ResetChoiceEvolutionCardBuildInfo();
|
|
}
|
|
InitSkill();
|
|
SpellChargeCount = 0;
|
|
SkillApplyInformation.ForceDepriveChantCount();
|
|
SkillApplyInformation.ForceDepriveBuffLife();
|
|
_skillActivatedCount = 1;
|
|
ThisTurnSkillActivatedCount = 0;
|
|
VfxBase[] allFuncCallResults = this.OnReturnCard.GetAllFuncCallResults(this, skillProcessor);
|
|
ClearCostModifier();
|
|
BattleCardView.InitHandParameter();
|
|
UpdateCostViewStrategy(isForceUpdate: true);
|
|
BattleCardView.UpdateCost(BattleCardView.GetUseCostList(BaseParameter.Cost), isGenerateInHand: false);
|
|
ClearBuffInfo();
|
|
ResetPlayedCost();
|
|
ResetLastCost();
|
|
ExecutedFixedUseCostIndex = -1;
|
|
IsExecutedEarthRite = false;
|
|
IsSkillLost = false;
|
|
IsReanimate = false;
|
|
DamagedCounter.Clear();
|
|
GetOffCards.Clear();
|
|
ResetUpdateBuildInfo();
|
|
return ParallelVfxPlayer.Create(allFuncCallResults);
|
|
}
|
|
|
|
public void FlagCardAsDestroyedByKiller()
|
|
{
|
|
IsDestroyedByKiller = true;
|
|
DeathTypeInfo.DestroyedByKiller = true;
|
|
}
|
|
|
|
public virtual void ResetFlagCardAsDestroyed()
|
|
{
|
|
IsDestroyedBySkill = false;
|
|
IsDestroyedByKiller = false;
|
|
}
|
|
|
|
public virtual void FlagCardAsDestroyedBySkill()
|
|
{
|
|
IsDestroyedBySkill = true;
|
|
}
|
|
|
|
public VfxBase CreateMaskCardInPlayVfx()
|
|
{
|
|
return VfxCreator.CreateMaskCardInPlay();
|
|
}
|
|
|
|
public void AddCostModifier(ICardCostModifier modifier, SkillBase skill, bool eventCall = true)
|
|
{
|
|
if (eventCall && skill != null)
|
|
{
|
|
this.OnAddCostState.Call(skill, modifier);
|
|
}
|
|
if (modifier.IsClearBeforeModifier)
|
|
{
|
|
CostModifierList.RemoveAll((ICardCostModifier c) => !c.IsResidentModifier);
|
|
}
|
|
CostModifierList.Add(modifier);
|
|
}
|
|
|
|
public void RemoveCostModifier(SkillBase skill, ICardCostModifier modifier)
|
|
{
|
|
this.OnRemoveCostState.Call(skill, modifier);
|
|
CostModifierList.Remove(modifier);
|
|
}
|
|
|
|
public void ClearCostModifier()
|
|
{
|
|
CostModifierList.Clear();
|
|
}
|
|
|
|
public int CalculateFinalDamageAmount(int damageAmount, bool isSkillDamage = false, bool isSpellDamage = false, ParallelVfxPlayer lifeLowerLimitEffectVfx = null)
|
|
{
|
|
bool flag = !isSkillDamage && !isSpellDamage;
|
|
if (SkillApplyInformation.IsShieldAll || (isSkillDamage && SkillApplyInformation.IsShieldSkill) || (isSpellDamage && SkillApplyInformation.IsShieldSpell) || (flag && SkillApplyInformation.IsShieldAttack))
|
|
{
|
|
return 0;
|
|
}
|
|
damageAmount -= SkillApplyInformation.GetDamageCutAmount(isSkillDamage ? DamageCutInfo.DamageType.SKILL : DamageCutInfo.DamageType.ALL);
|
|
damageAmount = SkillApplyInformation.GetClippingDamage(damageAmount, lifeLowerLimitEffectVfx);
|
|
return Mathf.Max(damageAmount, 0);
|
|
}
|
|
|
|
public int HealLife(int healAmount, int turn, bool isSelfTurn)
|
|
{
|
|
int life = Life;
|
|
SkillApplyInformation.HealLife(healAmount, turn, isSelfTurn);
|
|
return Life - life;
|
|
}
|
|
|
|
public virtual string GetCardSkillDescription(BattlePlayerBase.SideLogInfo sideLogInfo, bool? isForceGetEvolveText = null)
|
|
{
|
|
return SkillDescription(sideLogInfo);
|
|
}
|
|
|
|
public VfxBase LoseSkill(SkillBase loseSkill = null, SkillProcessor skillProcessor = null)
|
|
{
|
|
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
|
|
IsSkillLost = true;
|
|
AttackableCount = ((AttackableCount >= MaxAttackableCount) ? 1 : 0);
|
|
NormalSkills.Clear();
|
|
NormalSkills.InitTimingInfo();
|
|
EvolutionSkills.Clear();
|
|
EvolutionSkills.InitTimingInfo();
|
|
SkillApplyInformation.AttachedSkillsInfo.Clear();
|
|
SkillApplyInformation.AttachedSkillsInfo.AttachedSkills.InitTimingInfo();
|
|
_buildInfo.NormalSkillBuildInfos.Clear();
|
|
_buildInfo.EvolveSkillBuildInfos.Clear();
|
|
parallelVfxPlayer.Register(SkillApplyInformation.AllSkillEffectStop());
|
|
SkillApplyInformation.InitializeInformationWithoutLifeOffenseModifier();
|
|
parallelVfxPlayer.Register(ParallelVfxPlayer.Create(this.OnLoseSkillOneTime.GetAllFuncCallResults(loseSkill, skillProcessor, this)));
|
|
this.OnLoseSkillOneTime = null;
|
|
RemoveBuffInfo((BuffInfo buff) => !(buff.SkillFrom is Skill_powerup) && !(buff.SkillFrom is Skill_power_down));
|
|
parallelVfxPlayer.Register(BattleCardView.InitializeBattleCardIcon(this, Skills));
|
|
if (IsFirstTurn)
|
|
{
|
|
IsSummonDrunkenness = true;
|
|
}
|
|
else
|
|
{
|
|
IsSummonDrunkenness = false;
|
|
}
|
|
bool isSelfTurn = SelfBattlePlayer.IsSelfTurn;
|
|
return SequentialVfxPlayer.Create(parallelVfxPlayer, SkillApplyInformation.AllSkillEffectRestart(), InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView._inPlayFrameEffect.UpdateCanAttackEffect(null, isSelfTurn);
|
|
}));
|
|
}
|
|
|
|
public CopySkillInfo CopySkill(BattleCardBase targetCard, string copySkillType, bool isRemain)
|
|
{
|
|
SkillFilterCreator.ContentKeyword skillType = (SkillFilterCreator.ContentKeyword)Enum.Parse(typeof(SkillFilterCreator.ContentKeyword), copySkillType, ignoreCase: true);
|
|
List<SkillBase> copySkills = GetCopySkill(targetCard.Skills, skillType);
|
|
bool isEvolutionSkill = targetCard.EvolutionSkills.Any((SkillBase skill) => skill == copySkills.FirstOrDefault());
|
|
int num = 0;
|
|
List<SkillBase> list = new List<SkillBase>();
|
|
foreach (SkillBase item in copySkills)
|
|
{
|
|
if (!isRemain)
|
|
{
|
|
targetCard.Skills.Remove(item);
|
|
if (!targetCard.IsEvolution)
|
|
{
|
|
List<SkillBase> list2 = new List<SkillBase>();
|
|
foreach (SkillBase evolutionSkill in targetCard.EvolutionSkills)
|
|
{
|
|
if (item.IsSameSkill(evolutionSkill))
|
|
{
|
|
list2.Add(evolutionSkill);
|
|
}
|
|
}
|
|
foreach (SkillBase item2 in list2)
|
|
{
|
|
targetCard.EvolutionSkills.Remove(item2);
|
|
}
|
|
}
|
|
}
|
|
if (item.GetAttachSkill == null)
|
|
{
|
|
num++;
|
|
}
|
|
}
|
|
List<SkillCreator.SkillBuildInfo> copiedSkillBuildInfoList = new List<SkillCreator.SkillBuildInfo>();
|
|
if (num > 0)
|
|
{
|
|
string timing = skillType.ToStringCustom();
|
|
copiedSkillBuildInfoList.AddRange(SettingRobSkillInfo(targetCard, timing, targetCard.IsEvolution, isRemain));
|
|
}
|
|
foreach (SkillBase item3 in _normalSkillCollection)
|
|
{
|
|
if (item3.GetAttachSkill != null)
|
|
{
|
|
list.Add(item3);
|
|
}
|
|
}
|
|
_normalSkillCollection.Clear();
|
|
_evolveSkillCollection.Clear();
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(SkillApplyInformation.AllSkillEffectStop());
|
|
CombineVirtualCardSkill(this);
|
|
AttachedSkillInformation attachedSkillsInfo = targetCard.SkillApplyInformation.AttachedSkillsInfo;
|
|
List<SkillBase> copySkill = GetCopySkill(attachedSkillsInfo.AttachedSkills, skillType);
|
|
List<BuffInfo> list3 = new List<BuffInfo>();
|
|
foreach (SkillBase item4 in copySkill)
|
|
{
|
|
int index = attachedSkillsInfo.AttachedSkills.IndexOf(item4);
|
|
Skill_attach_skill creatorSkill = attachedSkillsInfo.CreatorSkillList[index] as Skill_attach_skill;
|
|
string text = attachedSkillsInfo.OwnerCardNameList[index];
|
|
int num2 = attachedSkillsInfo.OwnerCardIdList[index];
|
|
long duplicateBanNum = attachedSkillsInfo.DuplicateBanNum[index];
|
|
if (isRemain)
|
|
{
|
|
SkillBase attachSkill = targetCard.SkillApplyInformation.CloneAttachSkill(SkillApplyInformation as SkillApplyInformation, creatorSkill);
|
|
SkillBase.BuffInfoContainer buffInfo = creatorSkill.GetBuffInfo(targetCard);
|
|
if (buffInfo != null)
|
|
{
|
|
buffInfo = buffInfo.Clone();
|
|
buffInfo._targetCard = this;
|
|
buffInfo._attachSkill = attachSkill;
|
|
buffInfo._buffInfo = buffInfo._buffInfo.Clone();
|
|
buffInfo._buffInfo.IsCopied = true;
|
|
buffInfo._buffInfo.IsCopiedEvolutionSkill = creatorSkill.SkillPrm.ownerCard.EvolutionSkills.Any((SkillBase s) => s == creatorSkill);
|
|
buffInfo._buffInfo.SetPreviousOwner(creatorSkill.SkillPrm.ownerCard);
|
|
AddBuffInfo(buffInfo._buffInfo);
|
|
creatorSkill.AddBuffInfo(buffInfo);
|
|
list3.Add(buffInfo._buffInfo);
|
|
}
|
|
else
|
|
{
|
|
BuffInfo buffInfo2 = creatorSkill.AddBuffInfoIfNeeded(this);
|
|
buffInfo2.SetPreviousOwner(creatorSkill.SkillPrm.ownerCard);
|
|
buffInfo2.IsCopied = true;
|
|
buffInfo2.IsCopiedEvolutionSkill = creatorSkill.SkillPrm.ownerCard.EvolutionSkills.Any((SkillBase s) => s == creatorSkill);
|
|
buffInfo = new SkillBase.BuffInfoContainer(this, buffInfo2, -1, "", null, 0L);
|
|
buffInfo._attachSkill = attachSkill;
|
|
creatorSkill.AddBuffInfo(buffInfo);
|
|
list3.Add(buffInfo._buffInfo);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int index2 = attachedSkillsInfo.CreatorSkillIndexList[index];
|
|
item4.SkillPrm.ownerCard = this;
|
|
item4.SkillPrm.selfBattlePlayer = SelfBattlePlayer;
|
|
item4.SkillPrm.opponentBattlePlayer = OpponentBattlePlayer;
|
|
SkillApplyInformation.AttachSkill(item4.SkillPrm.buildInfo, item4.SkillPrm.resourceMgr, text, num2, duplicateBanNum, creatorSkill);
|
|
targetCard.SkillApplyInformation.AttachedSkillsInfo.Remove(item4, text, num2, duplicateBanNum, creatorSkill, index2);
|
|
SkillBase.BuffInfoContainer buffInfoContainer = creatorSkill.PopBuffInfo(targetCard);
|
|
if (buffInfoContainer == null)
|
|
{
|
|
CardParameter baseParameter = creatorSkill.SkillPrm.ownerCard.BaseParameter;
|
|
BuffInfo buffInfo3 = new BuffInfo(baseParameter.BaseCardId, baseParameter.NormalCardId, creatorSkill);
|
|
buffInfoContainer = new SkillBase.BuffInfoContainer(targetCard, buffInfo3, -1, "", null, 0L);
|
|
}
|
|
buffInfoContainer._buffInfo.IsCopied = true;
|
|
buffInfoContainer._buffInfo.IsCopiedEvolutionSkill = creatorSkill.SkillPrm.ownerCard.EvolutionSkills.Any((SkillBase s) => s == creatorSkill);
|
|
buffInfoContainer._buffInfo.SetPreviousOwner(creatorSkill.SkillPrm.ownerCard);
|
|
targetCard.RemoveBuffInfo(buffInfoContainer._buffInfo);
|
|
buffInfoContainer._targetCard = this;
|
|
AddBuffInfo(buffInfoContainer._buffInfo);
|
|
creatorSkill.AddBuffInfo(buffInfoContainer);
|
|
list3.Add(buffInfoContainer._buffInfo);
|
|
}
|
|
}
|
|
Skills.Complete();
|
|
SetActiveSkillCount();
|
|
targetCard.SkillApplyInformation.AttachedSkillsInfo.AttachedSkills.InitTimingInfo();
|
|
SkillApplyInformation.AttachedSkillsInfo.AttachedSkills.InitTimingInfo();
|
|
targetCard.NormalSkills.InitTimingInfo();
|
|
NormalSkills.InitTimingInfo();
|
|
targetCard.EvolutionSkills.InitTimingInfo();
|
|
EvolutionSkills.InitTimingInfo();
|
|
sequentialVfxPlayer.Register(targetCard.BattleCardView.InitializeBattleCardIcon(targetCard, targetCard.Skills));
|
|
sequentialVfxPlayer.Register(BattleCardView.InitializeBattleCardIcon(this, Skills));
|
|
sequentialVfxPlayer.Register(SkillApplyInformation.AllSkillEffectRestart());
|
|
this.OnCopySkillComplete.Call(this);
|
|
SkillBaseCopy copySkill2 = Skills.Where((SkillBase s) => s is SkillBaseCopy && s.OptionValue.GetString(SkillFilterCreator.ContentKeyword.ability, "NONE") == skillType.ToString()).FirstOrDefault() as SkillBaseCopy;
|
|
List<SkillBase> copiedSkillList = Skills.Where((SkillBase s) => copiedSkillBuildInfoList.Contains(s.SkillPrm.buildInfo)).ToList();
|
|
return new CopySkillInfo(sequentialVfxPlayer, isEvolutionSkill, copySkill2, copiedSkillList, list3);
|
|
}
|
|
|
|
private List<SkillCreator.SkillBuildInfo> SettingRobSkillInfo(BattleCardBase targetCard, string timing, bool isEvolution, bool isRemain)
|
|
{
|
|
List<SkillCreator.SkillBuildInfo> list = new List<SkillCreator.SkillBuildInfo>();
|
|
bool flag = false;
|
|
List<SkillCreator.SkillBuildInfo> list2 = (isEvolution ? targetCard._buildInfo.EvolveSkillBuildInfos : targetCard._buildInfo.NormalSkillBuildInfos);
|
|
foreach (SkillCreator.SkillBuildInfo skillInfo in list2)
|
|
{
|
|
if (!(skillInfo._timing == timing))
|
|
{
|
|
continue;
|
|
}
|
|
flag = true;
|
|
_buildInfo.NormalSkillBuildInfos.Add(skillInfo);
|
|
if (_buildInfo.EvolveSkillBuildInfos.IsNotNullOrEmpty())
|
|
{
|
|
_buildInfo.EvolveSkillBuildInfos.Add(skillInfo);
|
|
}
|
|
if (skillInfo._previousSkillOwner == null)
|
|
{
|
|
skillInfo._previousSkillOwner = targetCard;
|
|
}
|
|
OnRemoveFromInPlayAfterOneTime += delegate
|
|
{
|
|
if (!IsDead)
|
|
{
|
|
_buildInfo.NormalSkillBuildInfos.Remove(skillInfo);
|
|
if (_buildInfo.EvolveSkillBuildInfos.Contains(skillInfo))
|
|
{
|
|
_buildInfo.EvolveSkillBuildInfos.Remove(skillInfo);
|
|
}
|
|
}
|
|
return NullVfx.GetInstance();
|
|
};
|
|
list.Add(skillInfo);
|
|
}
|
|
if (flag || !isEvolution)
|
|
{
|
|
if (!isRemain)
|
|
{
|
|
list2.RemoveAll((SkillCreator.SkillBuildInfo b) => b._timing == timing);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
list.AddRange(SettingRobSkillInfo(targetCard, timing, isEvolution: false, isRemain));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private List<SkillBase> GetCopySkill(SkillCollectionBase skills, SkillFilterCreator.ContentKeyword skillType)
|
|
{
|
|
List<SkillBase> list = new List<SkillBase>();
|
|
foreach (SkillBase skill in skills)
|
|
{
|
|
switch (skillType)
|
|
{
|
|
case SkillFilterCreator.ContentKeyword.when_destroy:
|
|
if (skill.IsWhenDestroySkill)
|
|
{
|
|
list.Add(skill);
|
|
}
|
|
break;
|
|
case SkillFilterCreator.ContentKeyword.when_attack:
|
|
if (skill.IsBeforAttackSkill)
|
|
{
|
|
list.Add(skill);
|
|
}
|
|
break;
|
|
case SkillFilterCreator.ContentKeyword.when_fight:
|
|
if (skill.IsWhenFightSkill)
|
|
{
|
|
list.Add(skill);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public virtual VfxBase RemoveFromInPlay()
|
|
{
|
|
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
|
|
if (!IsClass)
|
|
{
|
|
parallelVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView.BattleCardIconAnimations.ClearAllSkillIcons();
|
|
}));
|
|
parallelVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView.HideAttackFinished();
|
|
}));
|
|
}
|
|
return parallelVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxBase RemoveFromInPlayAfter(SkillProcessor skillProcessor, bool isReturn = false)
|
|
{
|
|
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create(this.OnRemoveFromInPlayAfterOneTime.GetAllFuncCallResults(isReturn, skillProcessor));
|
|
this.OnRemoveFromInPlayAfterOneTime = null;
|
|
ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create(this.OnLoseSkillOneTime.GetAllFuncCallResults(null, skillProcessor, this));
|
|
this.OnLoseSkillOneTime = null;
|
|
return ParallelVfxPlayer.Create(parallelVfxPlayer, parallelVfxPlayer2);
|
|
}
|
|
|
|
protected virtual ICardVfxCreator CreateVfxCreator(bool isPlayer, IBattleCardView battleCardView, bool isNullView)
|
|
{
|
|
if (isNullView)
|
|
{
|
|
return NullCardVfxCreator.GetInstance();
|
|
}
|
|
return new CardVfxCreatorBase(isPlayer, this, battleCardView, _buildInfo.ResourceMgr);
|
|
}
|
|
|
|
protected virtual ISkillApplyInformation CreateSkillApplyInformation(BattleCardBase card, ICardVfxCreator vfxCreator)
|
|
{
|
|
return new SkillApplyInformation(card, vfxCreator);
|
|
}
|
|
|
|
public ParameterChangeInformation CreateParameterChangeInfo()
|
|
{
|
|
return new ParameterChangeInformation(Atk, BaseAtk, Life, MaxLife, BaseMaxLife);
|
|
}
|
|
|
|
public void AddBuffInfo(BuffInfo buffInfo)
|
|
{
|
|
BuffInfoList.Add(buffInfo);
|
|
}
|
|
|
|
public void InsertBuffInfo(BuffInfo buffInfo, int index)
|
|
{
|
|
if (index >= BuffInfoList.Count)
|
|
{
|
|
index = BuffInfoList.Count;
|
|
}
|
|
BuffInfoList.Insert(index, buffInfo);
|
|
}
|
|
|
|
public void RemoveBuffInfo(BuffInfo buffInfo)
|
|
{
|
|
BuffInfoList.Remove(buffInfo);
|
|
}
|
|
|
|
public void RemoveBuffInfo(Predicate<BuffInfo> condition)
|
|
{
|
|
BuffInfoList.RemoveAll(condition);
|
|
}
|
|
|
|
public bool IsContainBuffInfo(BuffInfo buffInfo)
|
|
{
|
|
return BuffInfoList.Contains(buffInfo);
|
|
}
|
|
|
|
public void ClearBuffInfo()
|
|
{
|
|
BuffInfoList.Clear();
|
|
}
|
|
|
|
public void ShallowCopyBuffInfoList(BattleCardBase originalCard)
|
|
{
|
|
BuffInfoList = originalCard.BuffInfoList;
|
|
this.OnResetCardParameter = originalCard.OnResetCardParameter;
|
|
}
|
|
|
|
public VfxBase AfterAddDamage()
|
|
{
|
|
VfxBase allFuncVfxResults = this.OnAfterAddDamage.GetAllFuncVfxResults();
|
|
this.OnAfterAddDamage = null;
|
|
return allFuncVfxResults;
|
|
}
|
|
|
|
public virtual VfxBase SetUpInplay()
|
|
{
|
|
ResetCardParameter();
|
|
IsFirstTurn = true;
|
|
SetOnMove(move: false);
|
|
AttackableCount = MaxAttackableCount;
|
|
IsSummonDrunkenness = true;
|
|
IsOnDraw = true;
|
|
SetActiveSkillCount();
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public void SetActiveSkillCount()
|
|
{
|
|
_normalSkillCollection.SetAndAddPublishedActiveSkillsCount();
|
|
_evolveSkillCollection.SetAndAddPublishedActiveSkillsCount();
|
|
}
|
|
|
|
public virtual void ResetCardParameter()
|
|
{
|
|
IsDestroyedByKiller = false;
|
|
IsDestroyedBySkill = false;
|
|
DeathTypeInfo.DestroyedByKiller = false;
|
|
DeathTypeInfo.MysteriesDestroy = false;
|
|
DeathTypeInfo.WhenDestroy = false;
|
|
ClearCostModifier();
|
|
this.OnResetCardParameter.Call();
|
|
}
|
|
|
|
public void ResetCardParameterInHand()
|
|
{
|
|
IsDestroyedByKiller = false;
|
|
IsDestroyedBySkill = false;
|
|
DeathTypeInfo.DestroyedByKiller = false;
|
|
DeathTypeInfo.MysteriesDestroy = false;
|
|
DeathTypeInfo.WhenDestroy = false;
|
|
}
|
|
|
|
public HandCardFrameEffectType GetHandCardFrameEffectType()
|
|
{
|
|
return GetHandCardFrameEffectType(isNewReplayRecord: false);
|
|
}
|
|
|
|
public HandCardFrameEffectType GetHandCardFrameEffectType(bool isNewReplayRecord)
|
|
{
|
|
HandCardFrameEffectType handCardFrameEffectType = HandCardFrameEffectType.NONE;
|
|
BattlePlayerReadOnlyInfoPair pair = new BattlePlayerReadOnlyInfoPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
SkillConditionCheckerOption option = new SkillConditionCheckerOption();
|
|
List<SkillBase> list = new List<SkillBase>();
|
|
list.AddRange(NormalSkills);
|
|
list.AddRange(EvolutionSkills);
|
|
for (int i = 0; i < list.Count(); i++)
|
|
{
|
|
SkillBase skill = list[i];
|
|
if (skill == null)
|
|
{
|
|
continue;
|
|
}
|
|
HandCardFrameEffectType handCardFrameEffectType2 = skill.SkillPrm.buildInfo._handCardFrameEffectType;
|
|
if ((handCardFrameEffectType < handCardFrameEffectType2 || (handCardFrameEffectType == HandCardFrameEffectType.LIGHT_BLUE && skill is Skill_pp_fixeduse)) && skill.VisualCheckCondition(pair, option, isPrePlay: true) && skill.PreprocessList.All((SkillPreprocessBase p) => p.IsRight(pair, option)))
|
|
{
|
|
handCardFrameEffectType = handCardFrameEffectType2;
|
|
if ((GameMgr.GetIns().IsWatchBattle || isNewReplayRecord) && handCardFrameEffectType == HandCardFrameEffectType.YELLOW && (skill.ConditionTargetFilter is SkillTargetDeckFilter || skill.ConditionFilterCollection.VariableCompareFilter.Any((SkillVariableComareFilter c) => c.Text.Contains("deck") && RegisterSkillConditionCheck.IsSkillConditionCheck(skill))))
|
|
{
|
|
handCardFrameEffectType = HandCardFrameEffectType.NONE;
|
|
}
|
|
}
|
|
}
|
|
return handCardFrameEffectType;
|
|
}
|
|
|
|
protected string ConvertSkillDescription(string text, BattlePlayerBase.SideLogInfo sideLogInfo, bool isSkipOption, BuffInfo buff, string divergenceId, List<int> skillDescriptionValueList, List<int> replaySkillDescriptionValueList)
|
|
{
|
|
SelfBattlePlayer.SideLogSkill = sideLogInfo;
|
|
OpponentBattlePlayer.SideLogSkill = sideLogInfo;
|
|
bool num = sideLogInfo != null;
|
|
bool isRobBuff = buff != null && buff.IsCopied;
|
|
string text2 = (text.Contains("<<${") ? GetSkillDescriptionVariables(text) : text);
|
|
bool flag = IsInHand || (text2.Contains("{me.inplay.class.count}") && (text2.Contains(SkillFilterCreator.ContentKeyword.hand.ToString()) || text2.Contains(SkillFilterCreator.ContentKeyword.deck.ToString())));
|
|
if (num && !isSkipOption && !IsPlayer && !GameMgr.GetIns().IsAdminWatch && flag)
|
|
{
|
|
isSkipOption = true;
|
|
}
|
|
Action<SkillOptionValue> setupOptionValue = (isSkipOption ? null : ((Action<SkillOptionValue>)delegate(SkillOptionValue optionValue)
|
|
{
|
|
BattleCardBase battleCardBase = ((!isRobBuff) ? this : ((buff.SkillFrom != null) ? buff.SkillFrom.SkillPrm.ownerCard : buff.OwnerCard));
|
|
bool flag2 = isRobBuff && SelfBattlePlayer != battleCardBase.SelfBattlePlayer;
|
|
BattlePlayerReadOnlyInfoPair playerInfoPair = new BattlePlayerReadOnlyInfoPair(flag2 ? OpponentBattlePlayer : SelfBattlePlayer, flag2 ? SelfBattlePlayer : OpponentBattlePlayer);
|
|
SkillBase skill = null;
|
|
if (text.Contains(SkillFilterCreator.ContentKeyword.is_individual.ToString()))
|
|
{
|
|
skill = SelfBattlePlayer.Class.Skills.FirstOrDefault((SkillBase s) => s.HasIndividualId && s.IsAttachedSkill && s.GetAttachSkill.SkillPrm.ownerCard.Index == Index);
|
|
}
|
|
SkillCollectionBase.SetupOptionValue(optionValue, playerInfoPair, battleCardBase, skill);
|
|
}));
|
|
string result = ConvertSkillDescriptionText(text, setupOptionValue, IsPlayer, divergenceId, skillDescriptionValueList, replaySkillDescriptionValueList);
|
|
SelfBattlePlayer.SideLogSkill = null;
|
|
OpponentBattlePlayer.SideLogSkill = null;
|
|
return result;
|
|
}
|
|
|
|
private string GetSkillDescriptionVariables(string originalText)
|
|
{
|
|
if (originalText == null || originalText == string.Empty)
|
|
{
|
|
return string.Empty;
|
|
}
|
|
string text = string.Empty;
|
|
string text2 = originalText;
|
|
int num = 0;
|
|
while (true)
|
|
{
|
|
num++;
|
|
if (num >= 21)
|
|
{
|
|
Debug.LogError("Maybe infinity loop. OriginalText=" + originalText);
|
|
break;
|
|
}
|
|
string variableNumberText = GetVariableNumberText(text2);
|
|
if (variableNumberText == string.Empty)
|
|
{
|
|
break;
|
|
}
|
|
if (variableNumberText.Contains('?'))
|
|
{
|
|
List<string> list = variableNumberText.Split('?').ToList();
|
|
text2 = text2.Replace("<<" + list[0] + "?" + list[1] + "?" + list[2] + ">>", string.Empty);
|
|
text = text + list[1] + list[2];
|
|
}
|
|
}
|
|
return text;
|
|
}
|
|
|
|
private static string GetDefaultValue(string expression)
|
|
{
|
|
if (expression.Contains(SkillFilterCreator.ContentKeyword.union_burst_count.ToStringCustom()))
|
|
{
|
|
return 10.ToString();
|
|
}
|
|
if (expression.Contains(SkillFilterCreator.ContentKeyword.super_skybound_art_count.ToStringCustom()))
|
|
{
|
|
return 15.ToString();
|
|
}
|
|
if (expression.Contains(SkillFilterCreator.ContentKeyword.skybound_art_count.ToStringCustom()))
|
|
{
|
|
return 10.ToString();
|
|
}
|
|
if (expression.Contains(SkillFilterCreator.ContentKeyword.fixed_generic_value.ToStringCustom()))
|
|
{
|
|
return (-1).ToString();
|
|
}
|
|
if (expression.Contains(SkillFilterCreator.ContentKeyword.white_ritual_stack.ToStringCustom()))
|
|
{
|
|
return 1.ToString();
|
|
}
|
|
return "0";
|
|
}
|
|
|
|
private static string CreateDefaultOptionValue(string expression)
|
|
{
|
|
if (expression.Contains('{'))
|
|
{
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
int num = 0;
|
|
int count = 0;
|
|
for (int i = 0; i < expression.Length; i++)
|
|
{
|
|
if (expression[i] == '{')
|
|
{
|
|
flag = true;
|
|
num = i;
|
|
}
|
|
if (expression[i] == '}')
|
|
{
|
|
flag2 = true;
|
|
count = ((i != expression.Length) ? (i - num + 1) : (i - num));
|
|
}
|
|
if (flag && flag2)
|
|
{
|
|
string defaultValue = GetDefaultValue(expression);
|
|
expression = expression.Remove(num, count);
|
|
expression = expression.Insert(num, defaultValue);
|
|
i = 0;
|
|
flag = false;
|
|
flag2 = false;
|
|
}
|
|
}
|
|
}
|
|
return expression;
|
|
}
|
|
|
|
public static string ConvertSkillDescriptionText(string originalText, Action<SkillOptionValue> setupOptionValue = null, bool isPlayer = false, string divergenceId = "", List<int> valueList = null, List<int> replaySkillDescriptionValueList = null)
|
|
{
|
|
if (originalText == null || originalText == "")
|
|
{
|
|
return null;
|
|
}
|
|
string text = originalText;
|
|
int num = 0;
|
|
List<string> list = new List<string>();
|
|
Dictionary<string, int> dictionary = new Dictionary<string, int>();
|
|
while (true)
|
|
{
|
|
num++;
|
|
if (num >= 21)
|
|
{
|
|
Debug.LogError("Maybe infinity loop. OriginalText=" + originalText);
|
|
break;
|
|
}
|
|
Match match = Regex.Match(text, "<<([^>]+(>[^>])*)+>>");
|
|
string variableNumberText = GetVariableNumberText(text);
|
|
if (variableNumberText == string.Empty)
|
|
{
|
|
break;
|
|
}
|
|
string text2 = variableNumberText;
|
|
bool flag = text2.Contains('?');
|
|
List<string> list2 = null;
|
|
if (flag)
|
|
{
|
|
list2 = text2.Split('?').ToList();
|
|
text2 = list2[0];
|
|
}
|
|
bool flag2 = text2.StartsWith("$", StringComparison.Ordinal);
|
|
if (flag && flag2)
|
|
{
|
|
text2 = text2.Remove(0, 1);
|
|
}
|
|
Action<SkillOptionValue> action = setupOptionValue;
|
|
bool flag3 = action == null;
|
|
if (flag3)
|
|
{
|
|
if (!flag2)
|
|
{
|
|
text2 = CreateDefaultOptionValue(text2);
|
|
}
|
|
action = SetupDefaultOptionValue;
|
|
}
|
|
bool isSkillDescriptionExpressionValueDefault = !flag2;
|
|
if (flag)
|
|
{
|
|
isSkillDescriptionExpressionValueDefault = ((flag3 || !GameMgr.GetIns().IsNewReplayBattle || text2.Contains("(divergence_id=")) ? EvalExpressionAndCondition(isSkillDescriptionExpressionValueDefault, text2, flag2, flag3, divergenceId, action, dictionary) : (replaySkillDescriptionValueList[num - 1] == 1));
|
|
string empty = string.Empty;
|
|
empty = ((!isSkillDescriptionExpressionValueDefault) ? list2[2] : list2[1]);
|
|
valueList?.Add(isSkillDescriptionExpressionValueDefault ? 1 : 0);
|
|
text = text.Replace("<<" + list2[0] + "?" + list2[1] + "?" + list2[2] + ">>", empty);
|
|
continue;
|
|
}
|
|
SkillOptionValue skillOptionValue = new SkillOptionValue("v=" + text2);
|
|
action(skillOptionValue);
|
|
isSkillDescriptionExpressionValueDefault = IsSkillDescriptionExpressionValueDefault(text2, action, dictionary);
|
|
string text3 = "";
|
|
string text4 = "";
|
|
if (isSkillDescriptionExpressionValueDefault)
|
|
{
|
|
Match match2 = Regex.Match(text, "\\[[\\w\\d]+\\]([^[]*<<([^>])+>>[^[]*)\\[-\\]");
|
|
MatchCollection matchCollection = Regex.Matches(text, "\\[[\\w\\d]+\\]([^[]*<<([^>])+>>[^[]*)\\[-\\]|<<([^>]+(>[^>])*)+>>");
|
|
if (match2.Success && matchCollection[0].Value == match2.Value)
|
|
{
|
|
match = match2;
|
|
string value = match.Groups[1].Value;
|
|
Match match3 = Regex.Match(value, "<<([^>]+(>[^>])*)+>>");
|
|
text3 = value.Substring(0, match3.Index);
|
|
text4 = value.Substring(match3.Index + match3.Length);
|
|
}
|
|
}
|
|
string text5 = text.Substring(0, match.Index) + text3;
|
|
string text6 = text4 + text.Substring(match.Index + match.Length);
|
|
if (Regex.Match(text, "{<<([^>])+>>@").Success)
|
|
{
|
|
text = text5 + list.Count + text6;
|
|
int item = ((flag3 || !GameMgr.GetIns().IsNewReplayBattle) ? skillOptionValue.GetInt(SkillFilterCreator.ContentKeyword.v) : replaySkillDescriptionValueList[num - 1]);
|
|
list.Add(item.ToString());
|
|
valueList?.Add(item);
|
|
}
|
|
else
|
|
{
|
|
int item2 = ((flag3 || !GameMgr.GetIns().IsNewReplayBattle) ? skillOptionValue.GetInt(SkillFilterCreator.ContentKeyword.v) : replaySkillDescriptionValueList[num - 1]);
|
|
text = text5 + item2 + text6;
|
|
valueList?.Add(item2);
|
|
}
|
|
}
|
|
text = Data.SystemText.Convert(text, list.ToArray());
|
|
return text.Replace("\\n", "\n");
|
|
}
|
|
|
|
private static bool EvalExpressionAndCondition(bool isSkillDescriptionExpressionValueDefault, string expression, bool isNewExpression, bool isNotBattleScene, string divergenceId, Action<SkillOptionValue> setupOptVal, Dictionary<string, int> evalConditionCache)
|
|
{
|
|
string[] array = expression.Split('|');
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
string text = array[i];
|
|
if (isNewExpression)
|
|
{
|
|
if (isNotBattleScene)
|
|
{
|
|
isSkillDescriptionExpressionValueDefault = false;
|
|
}
|
|
else if (text.StartsWith("(divergence_id="))
|
|
{
|
|
text = text.Substring(1, text.Length - 2);
|
|
string text2 = text.Split('=')[1];
|
|
isSkillDescriptionExpressionValueDefault |= text2 == divergenceId;
|
|
}
|
|
else
|
|
{
|
|
isSkillDescriptionExpressionValueDefault |= EvalNewExpressionAndCondition(text, setupOptVal, evalConditionCache);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
isSkillDescriptionExpressionValueDefault &= EvalOldExpressionAndCondition(text, setupOptVal, evalConditionCache);
|
|
}
|
|
}
|
|
return isSkillDescriptionExpressionValueDefault;
|
|
}
|
|
|
|
private static bool EvalNewExpressionAndCondition(string expression, Action<SkillOptionValue> setupOptionValue, Dictionary<string, int> cache)
|
|
{
|
|
bool flag = true;
|
|
string[] array = expression.Split('&');
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
SkillTextVariableComareFilter skillTextVariableComareFilter = new SkillTextVariableComareFilter(array[i]);
|
|
SkillOptionValue skillOptionValue = new SkillOptionValue("v=" + skillTextVariableComareFilter.Lhs);
|
|
setupOptionValue(skillOptionValue);
|
|
if (cache.ContainsKey(skillTextVariableComareFilter.Lhs))
|
|
{
|
|
skillTextVariableComareFilter.LhsFilteringResult = cache[skillTextVariableComareFilter.Lhs];
|
|
}
|
|
else
|
|
{
|
|
cache[skillTextVariableComareFilter.Lhs] = skillTextVariableComareFilter.FilteringLhs(skillOptionValue);
|
|
}
|
|
if (cache.ContainsKey(skillTextVariableComareFilter.Rhs))
|
|
{
|
|
skillTextVariableComareFilter.RhsFilteringResult = cache[skillTextVariableComareFilter.Rhs];
|
|
}
|
|
else
|
|
{
|
|
cache[skillTextVariableComareFilter.Rhs] = skillTextVariableComareFilter.FilteringRhs(skillOptionValue);
|
|
}
|
|
flag &= skillTextVariableComareFilter.Filtering(skillOptionValue);
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
private static bool EvalOldExpressionAndCondition(string expression, Action<SkillOptionValue> setupOptionValue, Dictionary<string, int> cache)
|
|
{
|
|
bool flag = false;
|
|
string[] array = expression.Split('&');
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
string text = array[i];
|
|
bool flag2 = false;
|
|
if (!text.Contains("+1"))
|
|
{
|
|
text += "+1";
|
|
flag2 = true;
|
|
}
|
|
SkillOptionValue obj = new SkillOptionValue("v=" + text);
|
|
setupOptionValue(obj);
|
|
bool flag3 = (flag2 ? (!IsSkillDescriptionExpressionValueDefault(text, setupOptionValue, cache)) : IsSkillDescriptionExpressionValueDefault(text, setupOptionValue, cache));
|
|
flag = flag || flag3;
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
private static string GetVariableNumberText(string text)
|
|
{
|
|
_extractedText.Length = 0;
|
|
int num = 0;
|
|
for (int i = 0; i < text.Length - 1; i++)
|
|
{
|
|
if (text[i] == '<' && text[i + 1] == '<')
|
|
{
|
|
if (num > 0)
|
|
{
|
|
_extractedText.Append(text[i]);
|
|
_extractedText.Append(text[i + 1]);
|
|
}
|
|
i++;
|
|
num++;
|
|
}
|
|
else if (text[i] == '>' && text[i + 1] == '>')
|
|
{
|
|
num--;
|
|
if (num <= 0)
|
|
{
|
|
break;
|
|
}
|
|
_extractedText.Append(text[i]);
|
|
_extractedText.Append(text[i + 1]);
|
|
i++;
|
|
}
|
|
else if (num > 0)
|
|
{
|
|
_extractedText.Append(text[i]);
|
|
}
|
|
}
|
|
return _extractedText.ToString();
|
|
}
|
|
|
|
private static void SetupDefaultOptionValue(SkillOptionValue optionValue)
|
|
{
|
|
optionValue.SetVariable("PLAY_COUNT", "0");
|
|
optionValue.SetVariable("HAND_COUNT", "0");
|
|
optionValue.SetVariable("HAND_SPACE_COUNT", "0");
|
|
optionValue.SetVariable("CHANT_COUNT", "0");
|
|
optionValue.SetVariable("CHARGE_COUNT", "0");
|
|
optionValue.SetVariable("DROP_COUNT", "0");
|
|
optionValue.SetVariable("RETURN_COUNT", "0");
|
|
optionValue.SetVariable("INPLAY_ME_COUNT", "0");
|
|
optionValue.SetVariable("INPLAY_OP_COUNT", "0");
|
|
optionValue.SetVariable("INPLAY_UNIT_ME_COUNT", "0");
|
|
optionValue.SetVariable("INPLAY_UNIT_OP_COUNT", "0");
|
|
optionValue.SetVariable("CLASS_ME_LIFE", "0");
|
|
optionValue.SetVariable("CLASS_OP_LIFE", "0");
|
|
optionValue.SetVariable("ADD_CHARGE_COUNT", "0");
|
|
optionValue.SetVariable("ADD_ODD_CHARGE_COUNT", "0");
|
|
optionValue.SetVariable("ADD_EVEN_CHARGE_COUNT", "0");
|
|
}
|
|
|
|
private static bool IsSkillDescriptionExpressionValueDefault(string expression, Action<SkillOptionValue> setupOptionValue, Dictionary<string, int> cache)
|
|
{
|
|
string expression2 = string.Copy(expression);
|
|
expression2 = CreateDefaultOptionValue(expression2);
|
|
SkillOptionValue skillOptionValue = new SkillOptionValue("v=" + expression2);
|
|
SetupDefaultOptionValue(skillOptionValue);
|
|
int num;
|
|
if (cache.ContainsKey(expression))
|
|
{
|
|
num = cache[expression];
|
|
}
|
|
else
|
|
{
|
|
SkillOptionValue skillOptionValue2 = new SkillOptionValue("v=" + expression);
|
|
setupOptionValue(skillOptionValue2);
|
|
num = (cache[expression] = skillOptionValue2.GetInt(SkillFilterCreator.ContentKeyword.v));
|
|
}
|
|
return skillOptionValue.GetInt(SkillFilterCreator.ContentKeyword.v) == num;
|
|
}
|
|
|
|
public virtual VfxBase LoadResource(bool isLogging = false)
|
|
{
|
|
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
|
|
parallelVfxPlayer.Register(BattleCardView.LoadChoiceTransformCardsResources(this));
|
|
parallelVfxPlayer.Register(BattleCardView.LoadResource());
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(parallelVfxPlayer);
|
|
if (isLogging)
|
|
{
|
|
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
LocalLog.AccumulateLastTraceLog("Loaded" + CardId);
|
|
}));
|
|
}
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public virtual VfxBase UnloadResource()
|
|
{
|
|
return BattleCardView.UnloadResource();
|
|
}
|
|
|
|
protected void OnEvolve(bool isSkill)
|
|
{
|
|
this.OnEvolveEvent(isSkill);
|
|
}
|
|
|
|
protected VfxBase OnBeforeEvolveEvent(SkillProcessor skillProcessor)
|
|
{
|
|
return this.OnBeforeEvolve.GetAllFuncVfxResults(skillProcessor);
|
|
}
|
|
|
|
protected void InitSkill()
|
|
{
|
|
Skills = _normalSkillCollection;
|
|
}
|
|
|
|
public virtual VfxBase RecoveryInPlay(int inPlayIndex, bool newReplayMoveTurn = false)
|
|
{
|
|
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create();
|
|
sequentialVfxPlayer.Register(new SummonCardPreperationVfx(this));
|
|
sequentialVfxPlayer.Register(new ChangeInPlayViewVfx(BattleCardView));
|
|
sequentialVfxPlayer.Register(CreateMaskCardInPlayVfx());
|
|
sequentialVfxPlayer.Register(InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView.GameObject.transform.localPosition = InPlayCardControl.CalcPosition(SelfBattlePlayer.InPlayCards.Count(), inPlayIndex, IsPlayer);
|
|
BattleCardView.GameObject.SetLayer(10, isSetChildren: true);
|
|
BattleCardView.GameObject.SetActive(value: true);
|
|
BattleCardView.isHiddenFromInPlayView = false;
|
|
SetOnDraw(draw: false);
|
|
}));
|
|
if (!newReplayMoveTurn)
|
|
{
|
|
sequentialVfxPlayer.Register(BattleCardView.BattleCardIconAnimations.Initialize(this, Skills));
|
|
}
|
|
sequentialVfxPlayer.Register(SkillApplyInformation.AllSkillEffectStop());
|
|
sequentialVfxPlayer.Register(SkillApplyInformation.AllSkillEffectRestart());
|
|
return sequentialVfxPlayer;
|
|
}
|
|
|
|
public abstract BattleCardBase VirtualClone(BattlePlayerBase selfBattlePlayer, BattlePlayerBase opponentBattlePlayer);
|
|
|
|
protected void CopyToVirtualCardBase(BattleCardBase target)
|
|
{
|
|
target.PlayedTurn = PlayedTurn;
|
|
target.DeathTypeInfo = DeathTypeInfo.Clone();
|
|
target.BaseParameter = BaseParameter;
|
|
target.IsTokenLoad = IsTokenLoad;
|
|
target.IsFirstTurn = IsFirstTurn;
|
|
target.IsOnMove = IsOnMove;
|
|
target.SpellChargeCount = SpellChargeCount;
|
|
target.SkillActivatedCount = SkillActivatedCount;
|
|
target.ThisTurnSkillActivatedCount = ThisTurnSkillActivatedCount;
|
|
target.IsSummonDrunkenness = IsSummonDrunkenness;
|
|
target.IsPreviousTurnAttacked = IsPreviousTurnAttacked;
|
|
target.IsDestroyedByKiller = IsDestroyedByKiller;
|
|
target.IsDestroyedBySkill = IsDestroyedBySkill;
|
|
target.AttackableCount = AttackableCount;
|
|
target._playedCost = _playedCost;
|
|
target._lastCost = _lastCost;
|
|
target.IsSkillLost = IsSkillLost;
|
|
target.IsReanimate = IsReanimate;
|
|
target.DamagedCounter = new ItWasDamagedCounter(DamagedCounter.GetDamageCount(selfTurn: true), DamagedCounter.GetDamageCount(selfTurn: false));
|
|
target.GetOffCards = GetOffCards;
|
|
target.TransformInfo = TransformInfo;
|
|
for (int i = 0; i < CostModifierList.Count; i++)
|
|
{
|
|
target.CostModifierList.Add(CostModifierList[i].Clone());
|
|
}
|
|
for (int j = 0; j < attackCountinfo.Count; j++)
|
|
{
|
|
if (attackCountinfo[j].Skill.IsAddAttackCount())
|
|
{
|
|
target.attackCountinfo.Add(new AddAttackCountInfo(attackCountinfo[j].Skill, attackCountinfo[j].Count));
|
|
}
|
|
else if (attackCountinfo[j].Skill.IsSetAttackCount())
|
|
{
|
|
target.attackCountinfo.Add(new SetAttackCountInfo(attackCountinfo[j].Skill, attackCountinfo[j].Count));
|
|
}
|
|
}
|
|
if (IsEvolution && EvolutionSkills.Count() > 0)
|
|
{
|
|
target.Skills = target.EvolutionSkills;
|
|
}
|
|
target.SkillApplyInformation = SkillApplyInformation.Clone(target);
|
|
target._buildInfo = _buildInfo.VirtualClone(SelfBattlePlayer, OpponentBattlePlayer);
|
|
target.HasSkillNecromance = HasSkillNecromance;
|
|
target.Setup();
|
|
}
|
|
|
|
public virtual VfxBase CombineVirtualCardSkill(BattleCardBase target)
|
|
{
|
|
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
|
|
IsSkillLost = false;
|
|
foreach (SkillBase item in CreateSkillCondition(target._buildInfo.NormalSkillBuildInfos, SelfBattlePlayer, OpponentBattlePlayer, _buildInfo.ResourceMgr))
|
|
{
|
|
_normalSkillCollection.Add(item);
|
|
}
|
|
foreach (SkillBase item2 in CreateSkillCondition(target._buildInfo.EvolveSkillBuildInfos, SelfBattlePlayer, OpponentBattlePlayer, _buildInfo.ResourceMgr))
|
|
{
|
|
item2.ConditionCheckerList = item2.ConditionCheckerList.Where((ISkillConditionChecker c) => !(c is SkillPreprocessEvolutionEndStop)).ToList();
|
|
item2.PreprocessList = item2.PreprocessList.Where((SkillPreprocessBase c) => !(c is SkillPreprocessEvolutionEndStop)).ToList();
|
|
_evolveSkillCollection.Add(item2);
|
|
}
|
|
Skills = ((IsEvolution && EvolutionSkills.Count() > 0) ? _evolveSkillCollection : _normalSkillCollection);
|
|
SkillApplyInformation.Combine(target.SkillApplyInformation);
|
|
int count = target.BuffInfoList.Count;
|
|
for (int num = 0; num < count; num++)
|
|
{
|
|
BuffInfo buffInfo = target.BuffInfoList[num];
|
|
if (!(buffInfo.SkillFrom is Skill_powerup) && !(buffInfo.SkillFrom is Skill_power_down) && !BuffInfoList.Contains(buffInfo))
|
|
{
|
|
AddBuffInfo(buffInfo);
|
|
}
|
|
}
|
|
Skills.Complete();
|
|
CostModifierList.AddRange(target.CostModifierList);
|
|
attackCountinfo.AddRange(target.attackCountinfo);
|
|
if (!SelfBattlePlayer.BattleMgr.IsVirtualBattle && !SelfBattlePlayer.BattleMgr.IsRecovery)
|
|
{
|
|
parallelVfxPlayer.Register(SequentialVfxPlayer.Create(SkillApplyInformation.AllSkillEffectRestart(), InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView._inPlayFrameEffect.UpdateCanAttackEffect();
|
|
}), BattleCardView.BattleCardIconAnimations.Initialize(this, Skills)));
|
|
}
|
|
return parallelVfxPlayer;
|
|
}
|
|
|
|
public void SetSpellChargeCount(int num)
|
|
{
|
|
if (num != -1)
|
|
{
|
|
SpellChargeCount = num;
|
|
}
|
|
}
|
|
|
|
public void AddSpellChargeCount(int num)
|
|
{
|
|
SpellChargeCount += num;
|
|
}
|
|
|
|
public VfxBase GetSpellChargeLoopEffect(int num)
|
|
{
|
|
Func<bool> getIsActionCard = () => IsActionCard || IsInplay || BattleCardView._hasCardEnteredPlayQueue;
|
|
if (SpellChargeCount == 0 && num > 0)
|
|
{
|
|
return new HandEffectLoopStartVfx(BattleCardView, getIsActionCard, HandEffectLoopStartVfx.HandEffectType.SpellCharge);
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public BattleCardBase GetDamageReflectionTarget(bool isSkillDamage)
|
|
{
|
|
if (SkillApplyInformation.IsReflectionClass && (isSkillDamage || SkillApplyInformation.ReflectionInfoList.Any((ReflectionInfo b) => b.Type == ReflectionInfo.DamageType.ALL)))
|
|
{
|
|
return OpponentBattlePlayer.Class;
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public VfxBase CalcHandCost(bool playEffect = true, bool isOnlyFixedUseCost = false)
|
|
{
|
|
if (SelfBattlePlayer.BattleMgr.IsRecovery)
|
|
{
|
|
return NullVfx.GetInstance();
|
|
}
|
|
if (IsInHand)
|
|
{
|
|
List<int> costList = BattleCardView.GetUseCostList(Cost);
|
|
return InstantVfx.Create(delegate
|
|
{
|
|
BattleCardView.UpdateCost(costList, isGenerateInHand: true, playEffect, isForceUpdate: false, isOnlyFixedUseCost);
|
|
});
|
|
}
|
|
return NullVfx.GetInstance();
|
|
}
|
|
|
|
public void UpdateCostViewStrategy(bool isForceUpdate = false)
|
|
{
|
|
BattleCardView.UpdateCostViewStrategy(isForceUpdate);
|
|
}
|
|
|
|
public void InitHandParameterIconPos(HandParameter.IconLayout layout)
|
|
{
|
|
BattleCardView.InitHandParameterIconPos(layout);
|
|
}
|
|
|
|
public IEnumerable<BattleCardBase> AsIEnumerable()
|
|
{
|
|
yield return this;
|
|
}
|
|
|
|
public bool IsHoverActionCard()
|
|
{
|
|
if (IsClass)
|
|
{
|
|
return false;
|
|
}
|
|
if (IsOnMove)
|
|
{
|
|
return false;
|
|
}
|
|
if (IsOnDraw)
|
|
{
|
|
return false;
|
|
}
|
|
if (!GameMgr.GetIns().IsAdmin && !IsPlayer && IsInHand)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public List<SkillBase> GetSelectSkillsNoDuplication(List<SkillBase> skills)
|
|
{
|
|
List<SkillBase> list = new List<SkillBase>();
|
|
BattlePlayerPair playerInfoPair = new BattlePlayerPair(SelfBattlePlayer, OpponentBattlePlayer);
|
|
SkillConditionCheckerOption option = new SkillConditionCheckerOption();
|
|
for (int i = 0; i < skills.Count; i++)
|
|
{
|
|
SkillBase skillBase = skills[i];
|
|
int val = ((skillBase.IsBurialRite && !skillBase.IsUserSelectType) ? 1 : skillBase.GetSelectableCards(playerInfoPair, option, isSkipForceSelect: true).Count());
|
|
int num = Math.Min(skillBase.GetSkillSelectCount(), val);
|
|
for (int j = 0; j < num; j++)
|
|
{
|
|
list.Add(skillBase);
|
|
}
|
|
}
|
|
if (list.Count == 0)
|
|
{
|
|
list.AddRange(skills);
|
|
}
|
|
return list;
|
|
}
|
|
|
|
public int GetBurialRiteCount(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption option, bool isPrePlay)
|
|
{
|
|
if (BattleManagerBase.GetIns().BattlePlayer.PlayerBattleView._isEvolutionSkillSelect)
|
|
{
|
|
return EvolutionSkills.Count((SkillBase s) => s.CheckConditionWithoutBurialRite(playerInfoPair, option, isPrePlay));
|
|
}
|
|
return Skills.Count((SkillBase s) => s.CheckConditionWithoutBurialRite(playerInfoPair, option, isPrePlay));
|
|
}
|
|
|
|
public void ReplaceParameterAndSkillOnDeck(int id)
|
|
{
|
|
_buildInfo.CardId = id;
|
|
CreateParameter();
|
|
InitSkillApplyInformationOnWhenReturn();
|
|
}
|
|
|
|
public bool HasInductionSkill()
|
|
{
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
SkillBase skillBase = Skills.ElementAt(i);
|
|
if (skillBase.IsInductionSkill && skillBase.SkillPrm.buildInfo._icon == "induction")
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public bool HasInductionNumberSkill()
|
|
{
|
|
for (int i = 0; i < Skills.Count(); i++)
|
|
{
|
|
SkillBase skillBase = Skills.ElementAt(i);
|
|
if (skillBase.IsInductionSkill && skillBase.SkillPrm.buildInfo._icon != "induction" && skillBase.SkillPrm.buildInfo._icon.Contains("induction"))
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public int GetInductionLabelNumber()
|
|
{
|
|
SkillBase skillBase = Skills.FirstOrDefault((SkillBase s) => s.IsInductionSkill && s.SkillPrm.buildInfo._icon != "induction" && s.SkillPrm.buildInfo._icon.Contains("induction"));
|
|
if (skillBase == null)
|
|
{
|
|
return -1;
|
|
}
|
|
SkillOptionValue skillOptionValue = new SkillOptionValue(skillBase.SkillPrm.buildInfo._icon);
|
|
skillOptionValue.SetupFilterVariable(BattleManagerBase.GetIns().GetBattlePlayerInfoPair(IsPlayer), this, isPrePlay: false, null);
|
|
return skillOptionValue.GetInt(SkillFilterCreator.ContentKeyword.induction);
|
|
}
|
|
|
|
public bool HasStackWhiteRitualAndOtherIconSkill()
|
|
{
|
|
if (HasSkillStackWhiteRitual)
|
|
{
|
|
if (!HasInductionSkill() && !HasInductionNumberSkill())
|
|
{
|
|
return HasSkillWhenDestroy;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|