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

2696 lines
90 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using Cute;
using UnityEngine;
using Wizard.Battle;
namespace Wizard;
public class AIVirtualField
{
public class AIVirtualFieldSearchCardOption
{
public bool IsSearchFromDeck;
public bool IsOutputCannotFindError;
public bool IsSearchFromBeforeLatestActionDeck;
public BattleCardRealTargetInformation.TargetRange OptionalSearchRange;
public static AIVirtualFieldSearchCardOption DefaultOption { get; } = new AIVirtualFieldSearchCardOption
{
IsSearchFromDeck = true,
IsOutputCannotFindError = true,
IsSearchFromBeforeLatestActionDeck = false,
OptionalSearchRange = BattleCardRealTargetInformation.TargetRange.Default
};
}
public List<int> BestPlayPtn = new List<int>();
public AIParamQuery ParamQuery;
public AIStyleQuery StyleQuery;
public List<AIVirtualCard> AllyInplayCards;
public List<AIVirtualCard> EnemyInplayCards;
public List<AIVirtualCard> AllyHandCards;
private List<AIVirtualCard> _latestActionEnemyHandCards;
private List<AIVirtualCard> _enemyHandCards;
public AIVirtualCard AllyClass;
public AIVirtualCard EnemyClass;
public int AllyTurnCount;
public int EnemyTurnCount;
public int AllyDeckCount;
public int OpponentDeckCount;
public int AllyEvolutionCount;
public int EnemyEvolutionCount;
public int AllyPp;
public int AllyPpTotal;
public int EnemyPp;
public int EnemyPpTotal;
public int UsedEpCount;
public int UsedPpCount;
public AIVirtualCard EvoUsedCard;
public float EvoBonus;
public int EvoHandPlus;
public float EpValue;
public bool IsLeftTurnEvol;
public bool IsExceededWaitEvolveTurn;
public float SimulationExtraBonus;
public bool IsBreakBeforePlayKilled;
private int NextTurnLeaderDamage;
public int ActionLength;
public Queue<Tuple<AIVirtualCard, AIVirtualCard>> EnemyTokenQueue = new Queue<Tuple<AIVirtualCard, AIVirtualCard>>();
public int TokenIndex;
public bool IsNoInstantAttack;
public int AllyCardTotalNum;
public int EnemyCardTotalNum;
public AIVirtualTurnEndInfo CommonAllyTurnEndSituation;
public AIVirtualTurnEndInfo CommonEnemyTurnEndSituation;
private AIPlayedCardContainer _playedCardContainer;
private bool _isPlayptnSimulationField;
public int AllyEvolvedCountInGame;
public int AllyEvolvedCountInPreviousTurn;
public int EnemyEvolvedCountInGame;
public int EnemyEvolvedCountInPreviousTurn;
public int AllyDamageCountInGame;
public int AllyDamageCountInTurn;
public int EnemyDamageCountInGame;
public int AllyNecromancedCountInGame;
public int EnemyNecromancedCountInGame;
private bool _isCreateTemporaryPlayPtnRecord;
private static ulong[] PRIME_NUMBERS_FOR_BEST_PLAYPTN = new ulong[9] { 15361uL, 15373uL, 15377uL, 15383uL, 15391uL, 15401uL, 15413uL, 15427uL, 15439uL };
public EnemyAI AI { get; set; }
public CardListsForReference CardListSet { get; private set; }
public BattlePlayerBase AllyBattlePlayer => AllyClass.SelfBattlePlayer;
public BattlePlayerBase EnemyBattlePlayer => EnemyClass.SelfBattlePlayer;
public AIDummyDeckContainer DummyDeckContainer { get; private set; }
public AIVirtualCemetery VirtualCemetery { get; private set; }
public int AllyRallyCount { get; private set; }
public int EnemyRallyCount { get; private set; }
public int JustBeforeTurnLeaderDamage { get; private set; }
public AIHealRecorderCollection HealRecorderCollection { get; private set; }
public int TurnDrawCount { get; private set; }
public int GameDrawCount { get; private set; }
public int VirtualDrawCount { get; private set; }
public int TurnBounceCount { get; private set; }
public int GameBounceCount { get; private set; }
public int AllyGameResonanceStartCount { get; private set; }
public int AllyTurnResonanceStartCount { get; private set; }
public int EnemyGameResonanceStartCount { get; private set; }
public int EnemyTurnResonanceStartCount { get; private set; }
public int AllyGameUsedStackCount { get; private set; }
public int EnemyGameUsedStackCount { get; private set; }
public List<AIVirtualCard> AllyTurnHandAddedCards { get; private set; }
public List<AIVirtualCard> AllyGameHandAddedCards { get; private set; }
public List<AIVirtualCard> EnemyTurnHandAddedCards { get; private set; }
public List<AIVirtualCard> EnemyGameHandAddedCards { get; private set; }
public int CurrentTurnCount { get; private set; } = -1;
public List<AIVirtualCard> AllyGameFusedCards { get; private set; }
public List<AIVirtualCard> EnemyGameFusedCards { get; private set; }
public List<AICannotPlayInformation> CannotPlayInformationList { get; private set; }
public List<Tuple<AIVirtualCard, int>> DamagedCardsByLastAction { get; set; } = new List<Tuple<AIVirtualCard, int>>();
public AITagPreprocessCollectionContainer TagPreprocessContainer { get; set; }
public AIDamageModifierCollection DamageModifierCollection { get; set; }
public bool IsLatestActionField { get; private set; }
public List<AIVirtualCard> AllyGameEnhancePlayCards { get; private set; }
public List<AIVirtualCard> EnemyGameEnhancePlayCards { get; private set; }
public AIPlayedCardContainer PlayedCardContainer => _playedCardContainer;
public bool IsRemovedPlayPtnCard { get; private set; }
public AISinglePlayptnRecord BestPlayptnRecordOnSim { get; private set; }
public List<AIVirtualCard> AllyGameAddUpdateDeckCards { get; private set; }
public List<AIVirtualCard> EnemyGameAddUpdateDeckCards { get; private set; }
public AISummonedCardContainer SummonedCardContainer { get; private set; }
public event Action OnAfterLeaderAttackSimulation;
public static AIVirtualField CreateTemporaryVirtualField(EnemyAI ai, AIParamQuery paramQuery, AIStyleQuery styleQuery, BattlePlayerPair pair, List<int> bestPlayPtn, AIVirtualFieldBuildParameterCollction buildParameters)
{
AIVirtualField aIVirtualField = new AIVirtualField(ai, paramQuery, styleQuery, pair, bestPlayPtn, buildParameters);
ai.tokenManager.UpdateTokenPool(aIVirtualField);
aIVirtualField.InitializeBothDefValue();
return aIVirtualField;
}
public AIVirtualField(EnemyAI ai, AIParamQuery paramQuery, AIStyleQuery styleQuery, BattlePlayerPair pair, List<int> bestPlayPtn, AIVirtualFieldBuildParameterCollction buildParameters)
{
AI = ai;
BestPlayPtn = new List<int>(bestPlayPtn);
ParamQuery = paramQuery;
StyleQuery = styleQuery;
EvoUsedCard = null;
EvoBonus = 0f;
EvoHandPlus = 0;
EpValue = 0f;
SimulationExtraBonus = 0f;
this.OnAfterLeaderAttackSimulation = null;
_playedCardContainer = ((buildParameters.PlayedCardContainer == null) ? new AIPlayedCardContainer() : buildParameters.PlayedCardContainer.Clone());
VirtualCemetery = new AIVirtualCemetery(pair.Self.CemeteryList.Count, pair.Opponent.CemeteryList.Count);
AllyDeckCount = ai.ALLY.DeckCardList.Count;
OpponentDeckCount = ai.OPPONENT.DeckCardList.Count;
DummyDeckContainer = new AIDummyDeckContainer();
AllyRallyCount = ai.ALLY.RallyCount;
EnemyRallyCount = ai.OPPONENT.RallyCount;
JustBeforeTurnLeaderDamage = pair.Self.Class.SkillApplyInformation.GetSpecificTurnDamageValue(pair.Self.Class, new TurnPlayerInfo(SkillFilterCreator.ContentKeyword.op.ToStringCustom(), 0));
HealRecorderCollection = ((buildParameters.HealRecorderCollection == null) ? new AIHealRecorderCollection() : buildParameters.HealRecorderCollection.Clone());
IsBreakBeforePlayKilled = false;
AllyTurnCount = ai.ALLY.Turn;
EnemyTurnCount = ai.OPPONENT.Turn;
AllyEvolutionCount = ai.ALLY.CurrentEpCount;
EnemyEvolutionCount = ai.OPPONENT.CurrentEpCount;
AllyPp = ai.ALLY.Pp;
AllyPpTotal = ai.ALLY.PpTotal;
EnemyPp = ai.OPPONENT.Pp;
EnemyPpTotal = ai.OPPONENT.PpTotal;
UsedEpCount = pair.Self.GameUsedEpCount;
UsedPpCount = pair.Self.GameUsedPpCount;
IsNoInstantAttack = false;
IsLatestActionField = false;
if (buildParameters.CannotPlayInfoList != null)
{
CannotPlayInformationList = new List<AICannotPlayInformation>(buildParameters.CannotPlayInfoList);
}
ActionLength = 0;
PairToVirtualCards(pair);
InitializeCardTags(buildParameters);
TurnDrawCount = pair.Self.TurnDrawCards.Count;
GameDrawCount = pair.Self.GameDrawCards.Count;
VirtualDrawCount = 0;
List<BattlePlayerBase.TurnAndCard> gameReturnedCards = pair.Self.GameReturnedCards;
List<BattlePlayerBase.TurnAndCard> gameReturnedCards2 = pair.Opponent.GameReturnedCards;
GameBounceCount = gameReturnedCards.Count;
int turn = pair.Self.Turn;
int num = 0;
for (int i = 0; i < GameBounceCount; i++)
{
if (gameReturnedCards[i].Turn == turn)
{
num++;
}
}
for (int j = 0; j < gameReturnedCards2.Count; j++)
{
if (gameReturnedCards2[j].Turn == turn)
{
num++;
}
}
TurnBounceCount = num;
GameBounceCount += gameReturnedCards2.Count;
AllyGameResonanceStartCount = pair.Self.GameResonanceStartCount;
AllyTurnResonanceStartCount = pair.Self.TurnResonanceStartCount;
EnemyGameResonanceStartCount = pair.Opponent.GameResonanceStartCount;
EnemyTurnResonanceStartCount = pair.Opponent.TurnResonanceStartCount;
AllyGameUsedStackCount = pair.Self.GameUsedWhiteRitualCount;
EnemyGameUsedStackCount = pair.Opponent.GameUsedWhiteRitualCount;
List<IReadOnlyBattleCardInfo> list = ParamQuery.GetBrokenAll(pair.Self.Class).ToList();
int turn2 = BattleManagerBase.GetIns().CurrentTurn;
List<IReadOnlyBattleCardInfo> list2 = new List<IReadOnlyBattleCardInfo>();
list2.AddRange(pair.Self.SkillInfoNecromanceZoneCards);
list2.AddRange(pair.Self.SkillInfoCemeterys);
IEnumerable<IReadOnlyBattleCardInfo> source = list2.Where((IReadOnlyBattleCardInfo pp) => pp.IsDead && !(pp is NullBattleCard) && pp.DestroyedTurn == turn2 && pp.IsDestroySelfTurn == pair.Self.IsPlayer);
for (int num2 = 0; num2 < list.Count; num2++)
{
IReadOnlyBattleCardInfo card = list[num2];
bool isDestroyTurn = source.Any((IReadOnlyBattleCardInfo c) => card == c);
AIVirtualCard aIVirtualCard = new AIVirtualCard((BattleCardBase)card, this);
NonReferableVirtualCardBuildParameterCollection destroyedCardBuildParameter = buildParameters.GetDestroyedCardBuildParameter(aIVirtualCard);
AIAttachedTagCollection attachedTagCollection = destroyedCardBuildParameter?.AttachedTags;
AIRemovedTagCollection removedTagCollection = destroyedCardBuildParameter?.RemovedTags;
aIVirtualCard.InitializeTags(ParamQuery, attachedTagCollection, removedTagCollection);
CardListSet.AddAllyDestroyedCard(aIVirtualCard, isDestroyTurn);
}
List<IReadOnlyBattleCardInfo> list3 = ParamQuery.GetBrokenAll(pair.Opponent.Class).ToList();
for (int num3 = 0; num3 < list3.Count; num3++)
{
AIVirtualCard aIVirtualCard2 = new AIVirtualCard((BattleCardBase)list3[num3], this);
NonReferableVirtualCardBuildParameterCollection destroyedCardBuildParameter2 = buildParameters.GetDestroyedCardBuildParameter(aIVirtualCard2);
AIAttachedTagCollection attachedTagCollection2 = destroyedCardBuildParameter2?.AttachedTags;
AIRemovedTagCollection removedTagCollection2 = destroyedCardBuildParameter2?.RemovedTags;
aIVirtualCard2.InitializeTags(ParamQuery, attachedTagCollection2, removedTagCollection2);
CardListSet.AddEnemyDestroyedCard(aIVirtualCard2);
}
if (pair.Self.GameLeftCards != null)
{
List<BattleCardBase> gameLeftCards = pair.Self.GameLeftCards;
for (int num4 = 0; num4 < gameLeftCards.Count; num4++)
{
AIVirtualCard card2 = new AIVirtualCard(gameLeftCards[num4], this);
CardListSet.AddAllyLeftCard(card2);
}
}
if (pair.Opponent.GameLeftCards != null)
{
List<BattleCardBase> gameLeftCards2 = pair.Opponent.GameLeftCards;
for (int num5 = 0; num5 < gameLeftCards2.Count; num5++)
{
AIVirtualCard card3 = new AIVirtualCard(gameLeftCards2[num5], this);
CardListSet.AddEnemyLeftCard(card3);
}
}
if (pair.Self.SkillInfoGameTurnLeftCards != null)
{
foreach (BattlePlayerBase.TurnAndCard skillInfoGameTurnLeftCard in pair.Self.SkillInfoGameTurnLeftCards)
{
if (turn2 == skillInfoGameTurnLeftCard.Turn)
{
AIVirtualCard card4 = new AIVirtualCard((BattleCardBase)skillInfoGameTurnLeftCard.Card, this);
CardListSet.AddAllyLeftCardThisTurn(card4);
}
}
}
if (pair.Opponent.SkillInfoGameTurnLeftCards != null)
{
foreach (BattlePlayerBase.TurnAndCard skillInfoGameTurnLeftCard2 in pair.Opponent.SkillInfoGameTurnLeftCards)
{
if (turn2 == skillInfoGameTurnLeftCard2.Turn)
{
AIVirtualCard card5 = new AIVirtualCard((BattleCardBase)skillInfoGameTurnLeftCard2.Card, this);
CardListSet.AddEnemyLeftCardThisTurn(card5);
}
}
}
if (pair.Self.GameBurialRiteCards != null && pair.Self.GameBurialRiteCards.Count > 0)
{
List<BattleCardBase> gameBurialRiteCards = pair.Self.GameBurialRiteCards;
for (int num6 = 0; num6 < gameBurialRiteCards.Count; num6++)
{
AIVirtualCard card6 = new AIVirtualCard(gameBurialRiteCards[num6], this);
CardListSet.AddAllyBurialCard(card6);
}
}
if (pair.Opponent.GameBurialRiteCards != null && pair.Opponent.GameBurialRiteCards.Count > 0)
{
List<BattleCardBase> gameBurialRiteCards2 = pair.Opponent.GameBurialRiteCards;
for (int num7 = 0; num7 < gameBurialRiteCards2.Count; num7++)
{
AIVirtualCard card7 = new AIVirtualCard(gameBurialRiteCards2[num7], this);
CardListSet.AddEnemyBurialCard(card7);
}
}
if (pair.Self.SkillInfoFusionIngredientList != null)
{
foreach (BattleCardBase skillInfoFusionIngredient in pair.Self.SkillInfoFusionIngredientList)
{
AIVirtualCard element = new AIVirtualCard(skillInfoFusionIngredient, this);
AllyGameFusedCards = AIParamQuery.AddElementToList(element, AllyGameFusedCards);
}
}
if (pair.Opponent.SkillInfoFusionIngredientList != null)
{
foreach (BattleCardBase skillInfoFusionIngredient2 in pair.Opponent.SkillInfoFusionIngredientList)
{
AIVirtualCard element2 = new AIVirtualCard(skillInfoFusionIngredient2, this);
EnemyGameFusedCards = AIParamQuery.AddElementToList(element2, EnemyGameFusedCards);
}
}
List<BattleCardBase> banishList = pair.Self.BanishList;
if (banishList != null && banishList.Any())
{
for (int num8 = 0; num8 < banishList.Count; num8++)
{
BattleCardBase battleCardBase = banishList[num8];
if (!battleCardBase.IsClass)
{
AIVirtualCard card8 = new AIVirtualCard(battleCardBase, this);
CardListSet.AddBanishedCard(card8);
}
}
}
List<BattleCardBase> banishList2 = pair.Opponent.BanishList;
if (banishList2 != null && banishList2.Any())
{
for (int num9 = 0; num9 < banishList2.Count; num9++)
{
BattleCardBase battleCardBase2 = banishList2[num9];
if (!battleCardBase2.IsClass)
{
AIVirtualCard card9 = new AIVirtualCard(battleCardBase2, this);
CardListSet.AddBanishedCard(card9);
}
}
}
AllyTurnHandAddedCards = new List<AIVirtualCard>();
AllyGameHandAddedCards = new List<AIVirtualCard>();
EnemyTurnHandAddedCards = new List<AIVirtualCard>();
EnemyGameHandAddedCards = new List<AIVirtualCard>();
if (AllyClass != null)
{
BattlePlayerBase allyBattlePlayer = AllyBattlePlayer;
if (allyBattlePlayer.TurnDrawCards != null)
{
for (int num10 = 0; num10 < allyBattlePlayer.TurnDrawCards.Count; num10++)
{
BattleCardBase card10 = allyBattlePlayer.TurnDrawCards[num10];
AllyTurnHandAddedCards.Add(new AIVirtualCard(card10, this));
}
}
if (allyBattlePlayer.GameDrawCards != null)
{
for (int num11 = 0; num11 < allyBattlePlayer.GameDrawCards.Count; num11++)
{
BattleCardBase card11 = allyBattlePlayer.GameDrawCards[num11];
AllyGameHandAddedCards.Add(new AIVirtualCard(card11, this));
}
}
if (allyBattlePlayer.GameDrawTokenCards != null)
{
for (int num12 = 0; num12 < allyBattlePlayer.GameDrawTokenCards.Count; num12++)
{
BattleCardBase card12 = allyBattlePlayer.GameDrawTokenCards[num12];
AllyGameHandAddedCards.Add(new AIVirtualCard(card12, this));
}
}
}
if (EnemyClass != null)
{
BattlePlayerBase enemyBattlePlayer = EnemyBattlePlayer;
if (enemyBattlePlayer.TurnDrawCards != null)
{
for (int num13 = 0; num13 < enemyBattlePlayer.TurnDrawCards.Count; num13++)
{
BattleCardBase card13 = enemyBattlePlayer.TurnDrawCards[num13];
EnemyTurnHandAddedCards.Add(new AIVirtualCard(card13, this));
}
}
if (enemyBattlePlayer.GameDrawCards != null)
{
for (int num14 = 0; num14 < enemyBattlePlayer.GameDrawCards.Count; num14++)
{
BattleCardBase card14 = enemyBattlePlayer.GameDrawCards[num14];
EnemyGameHandAddedCards.Add(new AIVirtualCard(card14, this));
}
}
if (enemyBattlePlayer.GameDrawTokenCards != null)
{
for (int num15 = 0; num15 < enemyBattlePlayer.GameDrawTokenCards.Count; num15++)
{
BattleCardBase card15 = enemyBattlePlayer.GameDrawTokenCards[num15];
EnemyGameHandAddedCards.Add(new AIVirtualCard(card15, this));
}
}
}
AllyGameEnhancePlayCards = new List<AIVirtualCard>();
EnemyGameEnhancePlayCards = new List<AIVirtualCard>();
if (pair.Self.GameEnhancePlayCards != null && pair.Self.GameEnhancePlayCards.Count > 0)
{
List<BattlePlayerBase.TurnAndCard> gameEnhancePlayCards = pair.Self.GameEnhancePlayCards;
for (int num16 = 0; num16 < gameEnhancePlayCards.Count; num16++)
{
AllyGameEnhancePlayCards.Add(new AIVirtualCard((BattleCardBase)gameEnhancePlayCards[num16].Card, this));
}
}
if (pair.Opponent.GameEnhancePlayCards != null && pair.Opponent.GameEnhancePlayCards.Count > 0)
{
List<BattlePlayerBase.TurnAndCard> gameEnhancePlayCards2 = pair.Opponent.GameEnhancePlayCards;
for (int num17 = 0; num17 < gameEnhancePlayCards2.Count; num17++)
{
EnemyGameEnhancePlayCards.Add(new AIVirtualCard((BattleCardBase)gameEnhancePlayCards2[num17].Card, this));
}
}
int a = CardListSet.BothClassAndInplayCards.Min((AIVirtualCard c) => c.CardIndex);
TokenIndex = Mathf.Max(a, 0) - 1;
CurrentTurnCount = (pair.Self.IsSelfTurn ? AI.TurnCount : AI.OpponentTurnCount);
AllyCardTotalNum = AllyBattlePlayer.cardTotalNum;
EnemyCardTotalNum = EnemyBattlePlayer.cardTotalNum;
IsLeftTurnEvol = AllyBattlePlayer.NowTurnEvol;
IsExceededWaitEvolveTurn = AllyBattlePlayer.EvolveWaitTurnCount <= 0;
TagPreprocessContainer = ((buildParameters.TagPreprocessContainer == null) ? new AITagPreprocessCollectionContainer() : buildParameters.TagPreprocessContainer.Clone(this));
DamageModifierCollection = ((buildParameters.DamageModifierCollection == null) ? new AIDamageModifierCollection() : buildParameters.DamageModifierCollection.Clone(this));
CommonAllyTurnEndSituation = new AIVirtualTurnEndInfo(AllyClass);
CommonEnemyTurnEndSituation = new AIVirtualTurnEndInfo(EnemyClass);
AllyEvolvedCountInGame = AllyBattlePlayer.EvolvedCards.Count;
EnemyEvolvedCountInGame = EnemyBattlePlayer.EvolvedCards.Count;
TurnPlayerInfo turnPlayerInfo = new TurnPlayerInfo(SkillFilterCreator.ContentKeyword.me.ToStringCustom(), 1);
AllyEvolvedCountInPreviousTurn = AllyBattlePlayer.GetSpecificTurnEvolveCount(turnPlayerInfo);
EnemyEvolvedCountInPreviousTurn = EnemyBattlePlayer.GetSpecificTurnEvolveCount(turnPlayerInfo);
AllyDamageCountInGame = AllyBattlePlayer.Class.DamagedCounter.GetDamageCount(selfTurn: true);
AllyDamageCountInTurn = 0;
EnemyDamageCountInGame = EnemyBattlePlayer.Class.DamagedCounter.GetDamageCount(selfTurn: true);
AllyNecromancedCountInGame = AllyBattlePlayer.GameNecromanceCount;
EnemyNecromancedCountInGame = EnemyBattlePlayer.GameNecromanceCount;
AllyGameAddUpdateDeckCards = new List<AIVirtualCard>();
EnemyGameAddUpdateDeckCards = new List<AIVirtualCard>();
List<BattleCardBase> gameAddUpdateDeckCards = pair.Self.GameAddUpdateDeckCards;
if (gameAddUpdateDeckCards != null && gameAddUpdateDeckCards.Count > 0)
{
for (int num18 = 0; num18 < gameAddUpdateDeckCards.Count; num18++)
{
AllyGameAddUpdateDeckCards.Add(new AIVirtualCard(gameAddUpdateDeckCards[num18].Card, this));
}
}
List<BattleCardBase> gameAddUpdateDeckCards2 = pair.Opponent.GameAddUpdateDeckCards;
if (gameAddUpdateDeckCards2 != null && gameAddUpdateDeckCards2.Count > 0)
{
for (int num19 = 0; num19 < gameAddUpdateDeckCards2.Count; num19++)
{
EnemyGameAddUpdateDeckCards.Add(new AIVirtualCard(gameAddUpdateDeckCards2[num19].Card, this));
}
}
SummonedCardContainer = new AISummonedCardContainer();
SummonedCardContainer.LoadSummonedCardList(this, pair.Self, pair.Opponent);
}
private void PairToVirtualCards(BattlePlayerPair pair)
{
CardListSet = new CardListsForReference();
AllyClass = new AIVirtualCard(pair.Self.Class, this);
CardListSet.AddAllyClass(AllyClass);
EnemyClass = new AIVirtualCard(pair.Opponent.Class, this);
CardListSet.AddEnemyClass(EnemyClass);
List<BattleCardBase> list = pair.Opponent.InPlayCards.ToList();
int count = list.Count;
List<BattleCardBase> list2 = pair.Self.InPlayCards.ToList();
int count2 = list2.Count;
AllyHandCards = new List<AIVirtualCard>();
for (int i = 0; i < pair.Self.HandCardList.Count; i++)
{
AIVirtualCard aIVirtualCard = new AIVirtualCard(pair.Self.HandCardList[i], this);
AllyHandCards.Add(aIVirtualCard);
CardListSet.AddHandCard(aIVirtualCard);
}
_enemyHandCards = new List<AIVirtualCard>();
for (int j = 0; j < pair.Opponent.HandCardList.Count; j++)
{
EnemyHandVirtualCard enemyHandVirtualCard = new EnemyHandVirtualCard(pair.Opponent.HandCardList[j], this);
_enemyHandCards.Add(enemyHandVirtualCard);
CardListSet.AddHandCard(enemyHandVirtualCard);
}
AllyInplayCards = new List<AIVirtualCard>();
for (int k = 0; k < count2; k++)
{
AIVirtualCard aIVirtualCard2 = new AIVirtualCard(list2[k], this);
AllyInplayCards.Add(aIVirtualCard2);
CardListSet.AddAllyInplayCard(aIVirtualCard2);
}
EnemyInplayCards = new List<AIVirtualCard>();
for (int l = 0; l < count; l++)
{
AIVirtualCard aIVirtualCard3 = new AIVirtualCard(list[l], this);
EnemyInplayCards.Add(aIVirtualCard3);
CardListSet.AddEnemyInplayCard(aIVirtualCard3);
}
}
private void InitializeCardTags(AIVirtualFieldBuildParameterCollction buildParameter)
{
for (int i = 0; i < CardListSet.AllReferableCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.AllReferableCards[i];
aIVirtualCard.InitializeTags(ParamQuery, null, null);
CardListSet.TagClassification(aIVirtualCard);
aIVirtualCard.FindBuildParameterAndApply(buildParameter);
}
if (IsLatestActionField)
{
for (int j = 0; j < _latestActionEnemyHandCards.Count; j++)
{
AIVirtualCard aIVirtualCard2 = _latestActionEnemyHandCards[j];
NonReferableVirtualCardBuildParameterCollection enemyHandCardBuildParameter = buildParameter.GetEnemyHandCardBuildParameter(aIVirtualCard2);
AIAttachedTagCollection attachedTagCollection = enemyHandCardBuildParameter?.AttachedTags;
AIRemovedTagCollection removedTagCollection = enemyHandCardBuildParameter?.RemovedTags;
aIVirtualCard2.InitializeTags(ParamQuery, attachedTagCollection, removedTagCollection);
CardListSet.TagClassification(aIVirtualCard2);
}
}
else
{
for (int k = 0; k < _enemyHandCards.Count; k++)
{
AIVirtualCard aIVirtualCard3 = _enemyHandCards[k];
NonReferableVirtualCardBuildParameterCollection enemyHandCardBuildParameter2 = buildParameter.GetEnemyHandCardBuildParameter(aIVirtualCard3);
AIAttachedTagCollection attachedTagCollection2 = enemyHandCardBuildParameter2?.AttachedTags;
AIRemovedTagCollection removedTagCollection2 = enemyHandCardBuildParameter2?.RemovedTags;
aIVirtualCard3.InitializeTags(ParamQuery, attachedTagCollection2, removedTagCollection2);
CardListSet.TagClassification(aIVirtualCard3);
}
}
}
public void InitializeBothDefValue()
{
Dictionary<int, int> dictionary = new Dictionary<int, int>();
for (int i = 0; i < CardListSet.BothInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.BothInplayCards[i];
aIVirtualCard.UpdateValue(ParamQuery, StyleQuery, EnemyAI.EmptyPlayPtn, doesUseLostLife: true);
aIVirtualCard.SetDefaultValue();
if (!aIVirtualCard.IsAlly && !aIVirtualCard.IsDead && aIVirtualCard.IsNoInstantAttack(this, BestPlayPtn))
{
IsNoInstantAttack = true;
}
if (aIVirtualCard.TagCollectionContainer.ReferringOtherInplayIds == null)
{
continue;
}
for (int j = 0; j < aIVirtualCard.TagCollectionContainer.ReferringOtherInplayIds.Count; j++)
{
int key = aIVirtualCard.TagCollectionContainer.ReferringOtherInplayIds[j];
if (dictionary.ContainsKey(key))
{
dictionary[key]++;
}
else
{
dictionary.Add(key, 1);
}
}
}
for (int k = 0; k < CardListSet.BothInplayCards.Count; k++)
{
AIVirtualCard aIVirtualCard2 = CardListSet.BothInplayCards[k];
if (dictionary.ContainsKey(aIVirtualCard2.BaseId))
{
aIVirtualCard2.ReferringSelfCount = dictionary[aIVirtualCard2.BaseId];
}
}
}
public int GetReferenceId(int originalId)
{
int key = originalId - originalId % 10;
if (AI.ReferenceIdTable == null || !AI.ReferenceIdTable.ContainsKey(key))
{
return -1;
}
return AI.ReferenceIdTable[key];
}
public List<string> GetReferenceTribe(int baseCardId)
{
List<string> list = new List<string>();
if (AI.ReferenceTribeTable == null || !AI.ReferenceTribeTable.Any())
{
return list;
}
for (int i = 0; i < AI.ReferenceTribeTable.Count; i++)
{
KeyValuePair<string, List<int>> keyValuePair = AI.ReferenceTribeTable.ElementAt(i);
if (keyValuePair.Value.Contains(baseCardId))
{
list.Add(keyValuePair.Key);
}
}
return list;
}
public void WhenCardLeaveFromField(AIVirtualCard leaveCard, AISituationInfo situation)
{
TagPreprocessContainer.SimulateWhenLeaveInfo(leaveCard, situation);
bool flag = !leaveCard.IsAlly && IsNoInstantAttack;
bool flag2 = leaveCard.TagCollectionContainer.ReferringOtherInplayIds != null;
IsNoInstantAttack = false;
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.BothClassAndInplayCards[i];
if (!IsNoInstantAttack && !aIVirtualCard.IsAlly && !aIVirtualCard.IsDead && flag && aIVirtualCard.IsNoInstantAttack(this, BestPlayPtn))
{
IsNoInstantAttack = true;
}
if (flag2 && leaveCard.TagCollectionContainer.ReferringOtherInplayIds.Contains(aIVirtualCard.BaseId) && aIVirtualCard.ReferringSelfCount > 0)
{
aIVirtualCard.ReferringSelfCount--;
}
}
}
public void IsNoInstantAttackRecheck()
{
IsNoInstantAttack = false;
for (int i = 0; i < EnemyInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = EnemyInplayCards[i];
if (!aIVirtualCard.IsDead && aIVirtualCard.IsNoInstantAttack(this, BestPlayPtn))
{
IsNoInstantAttack = true;
break;
}
}
}
public AIVirtualField(AIVirtualField originalField, bool isLatestAction = false, bool isPlayptnSimulation = false)
{
IsLatestActionField = isLatestAction;
AI = originalField.AI;
BestPlayPtn = new List<int>(originalField.BestPlayPtn);
ParamQuery = originalField.ParamQuery;
StyleQuery = originalField.StyleQuery;
_playedCardContainer = originalField.PlayedCardContainer.Clone();
EvoBonus = originalField.EvoBonus;
EvoHandPlus = originalField.EvoHandPlus;
EpValue = originalField.EpValue;
SimulationExtraBonus = originalField.SimulationExtraBonus;
VirtualCemetery = new AIVirtualCemetery(originalField.VirtualCemetery.GetCemeteryCount(isAlly: true), originalField.VirtualCemetery.GetCemeteryCount(isAlly: false));
AllyDeckCount = originalField.AllyDeckCount;
OpponentDeckCount = originalField.OpponentDeckCount;
AllyRallyCount = originalField.AllyRallyCount;
EnemyRallyCount = originalField.EnemyRallyCount;
JustBeforeTurnLeaderDamage = originalField.JustBeforeTurnLeaderDamage;
HealRecorderCollection = originalField.HealRecorderCollection.Clone();
if (originalField.CannotPlayInformationList != null)
{
CannotPlayInformationList = new List<AICannotPlayInformation>(originalField.CannotPlayInformationList);
}
AllyTurnCount = originalField.AllyTurnCount;
EnemyTurnCount = originalField.EnemyTurnCount;
AllyEvolutionCount = originalField.AllyEvolutionCount;
EnemyEvolutionCount = originalField.EnemyEvolutionCount;
AllyPp = originalField.AllyPp;
AllyPpTotal = originalField.AllyPpTotal;
EnemyPp = originalField.EnemyPp;
EnemyPpTotal = originalField.EnemyPpTotal;
UsedEpCount = originalField.UsedEpCount;
UsedPpCount = originalField.UsedPpCount;
NextTurnLeaderDamage = originalField.NextTurnLeaderDamage;
IsBreakBeforePlayKilled = originalField.IsBreakBeforePlayKilled;
IsNoInstantAttack = originalField.IsNoInstantAttack;
TokenIndex = originalField.TokenIndex;
this.OnAfterLeaderAttackSimulation = null;
TurnDrawCount = originalField.TurnDrawCount;
GameDrawCount = originalField.GameDrawCount;
VirtualDrawCount = originalField.VirtualDrawCount;
TurnBounceCount = originalField.TurnBounceCount;
GameBounceCount = originalField.GameBounceCount;
AllyGameResonanceStartCount = originalField.AllyGameResonanceStartCount;
AllyTurnResonanceStartCount = originalField.AllyTurnResonanceStartCount;
EnemyGameResonanceStartCount = originalField.EnemyGameResonanceStartCount;
EnemyTurnResonanceStartCount = originalField.EnemyTurnResonanceStartCount;
AllyGameUsedStackCount = originalField.AllyGameUsedStackCount;
EnemyGameUsedStackCount = originalField.EnemyGameUsedStackCount;
CardListSet = new CardListsForReference();
AllyClass = new AIVirtualCard(originalField.AllyClass, this);
EnemyClass = new AIVirtualCard(originalField.EnemyClass, this);
CardListSet.AddAllyClass(AllyClass);
CardListSet.AddEnemyClass(EnemyClass);
AllyHandCards = new List<AIVirtualCard>();
for (int i = 0; i < originalField.AllyHandCards.Count; i++)
{
AIVirtualCard aIVirtualCard = new AIVirtualCard(originalField.AllyHandCards[i], this);
AllyHandCards.Add(aIVirtualCard);
CardListSet.AddHandCard(aIVirtualCard);
}
List<AIVirtualCard> enemyHandCardList = originalField.GetEnemyHandCardList();
if (IsLatestActionField)
{
_latestActionEnemyHandCards = new List<AIVirtualCard>();
if (originalField.IsLatestActionField)
{
for (int j = 0; j < enemyHandCardList.Count; j++)
{
AIVirtualCard aIVirtualCard2 = new AIVirtualCard(enemyHandCardList[j], this);
_latestActionEnemyHandCards.Add(aIVirtualCard2);
CardListSet.AddHandCard(aIVirtualCard2);
}
}
else
{
for (int k = 0; k < enemyHandCardList.Count; k++)
{
AIVirtualCard aIVirtualCard3 = new AIVirtualCard(enemyHandCardList[k].BaseCard, this);
aIVirtualCard3.InitializeEnemyHandParameter();
_latestActionEnemyHandCards.Add(aIVirtualCard3);
CardListSet.AddHandCard(aIVirtualCard3);
}
}
}
else
{
_enemyHandCards = new List<AIVirtualCard>();
for (int l = 0; l < enemyHandCardList.Count; l++)
{
EnemyHandVirtualCard enemyHandVirtualCard = new EnemyHandVirtualCard(enemyHandCardList[l].BaseCard, this);
_enemyHandCards.Add(enemyHandVirtualCard);
CardListSet.AddHandCard(enemyHandVirtualCard);
}
}
AllyInplayCards = new List<AIVirtualCard>();
for (int m = 0; m < originalField.AllyInplayCards.Count; m++)
{
AIVirtualCard aIVirtualCard4 = new AIVirtualCard(originalField.AllyInplayCards[m], this);
AllyInplayCards.Add(aIVirtualCard4);
CardListSet.AddAllyInplayCard(aIVirtualCard4);
}
EnemyInplayCards = new List<AIVirtualCard>();
for (int n = 0; n < originalField.EnemyInplayCards.Count; n++)
{
AIVirtualCard aIVirtualCard5 = new AIVirtualCard(originalField.EnemyInplayCards[n], this);
EnemyInplayCards.Add(aIVirtualCard5);
CardListSet.AddEnemyInplayCard(aIVirtualCard5);
}
if (IsLatestActionField && !originalField.IsLatestActionField)
{
for (int num = 0; num < _latestActionEnemyHandCards.Count; num++)
{
AIVirtualCard aIVirtualCard6 = enemyHandCardList[num];
AIAttachedTagCollection attachedTags = aIVirtualCard6.TagCollectionContainer.AttachedTags;
AIRemovedTagCollection removedTagCollection = aIVirtualCard6.TagCollectionContainer.RemovedTagCollection;
_latestActionEnemyHandCards[num].InitializeTags(ParamQuery, attachedTags, removedTagCollection);
AI.tokenManager.AddTokenFromCard(_latestActionEnemyHandCards[num]);
}
}
for (int num2 = 0; num2 < originalField.CardListSet.AllyDestroyedCards.Count; num2++)
{
AIVirtualCard card = new AIVirtualCard(originalField.CardListSet.AllyDestroyedCards[num2], this);
CardListSet.AddAllyDestroyedCard(card, originalField.CardListSet.AllyDestroyedCards[num2].DeadTurn);
}
for (int num3 = 0; num3 < originalField.CardListSet.EnemyDestroyedCards.Count; num3++)
{
AIVirtualCard card2 = new AIVirtualCard(originalField.CardListSet.EnemyDestroyedCards[num3], this);
CardListSet.AddEnemyDestroyedCard(card2);
}
for (int num4 = 0; num4 < originalField.CardListSet.AllyLeftCards.Count; num4++)
{
AIVirtualCard card3 = new AIVirtualCard(originalField.CardListSet.AllyLeftCards[num4], this);
CardListSet.AddAllyLeftCard(card3);
}
for (int num5 = 0; num5 < originalField.CardListSet.EnemyLeftCards.Count; num5++)
{
AIVirtualCard card4 = new AIVirtualCard(originalField.CardListSet.EnemyLeftCards[num5], this);
CardListSet.AddEnemyLeftCard(card4);
}
for (int num6 = 0; num6 < originalField.CardListSet.AllyLeftCardsThisTurn.Count; num6++)
{
AIVirtualCard card5 = new AIVirtualCard(originalField.CardListSet.AllyLeftCardsThisTurn[num6], this);
CardListSet.AddAllyLeftCardThisTurn(card5);
}
for (int num7 = 0; num7 < originalField.CardListSet.EnemyLeftCardsThisTurn.Count; num7++)
{
AIVirtualCard card6 = new AIVirtualCard(originalField.CardListSet.EnemyLeftCardsThisTurn[num7], this);
CardListSet.AddEnemyLeftCardThisTurn(card6);
}
for (int num8 = 0; num8 < originalField.CardListSet.AllyBurialCards.Count; num8++)
{
AIVirtualCard card7 = new AIVirtualCard(originalField.CardListSet.AllyBurialCards[num8], this);
CardListSet.AddAllyBurialCard(card7);
}
for (int num9 = 0; num9 < originalField.CardListSet.EnemyBurialCards.Count; num9++)
{
AIVirtualCard card8 = new AIVirtualCard(originalField.CardListSet.EnemyBurialCards[num9], this);
CardListSet.AddEnemyBurialCard(card8);
}
if (originalField.AllyGameFusedCards != null)
{
for (int num10 = 0; num10 < originalField.AllyGameFusedCards.Count; num10++)
{
AIVirtualCard element = new AIVirtualCard(originalField.AllyGameFusedCards[num10], this);
AllyGameFusedCards = AIParamQuery.AddElementToList(element, AllyGameFusedCards);
}
}
if (originalField.EnemyGameFusedCards != null)
{
for (int num11 = 0; num11 < originalField.EnemyGameFusedCards.Count; num11++)
{
AIVirtualCard element2 = new AIVirtualCard(originalField.EnemyGameFusedCards[num11], this);
EnemyGameFusedCards = AIParamQuery.AddElementToList(element2, EnemyGameFusedCards);
}
}
List<AIVirtualCard> banishedCards = originalField.CardListSet.BanishedCards;
if (banishedCards != null && banishedCards.Any())
{
for (int num12 = 0; num12 < banishedCards.Count; num12++)
{
CardListSet.AddBanishedCard(banishedCards[num12]);
}
}
ActionLength = originalField.ActionLength;
EvoUsedCard = null;
if (originalField.EvoUsedCard != null)
{
for (int num13 = 0; num13 < AllyInplayCards.Count; num13++)
{
AIVirtualCard aIVirtualCard7 = AllyInplayCards[num13];
if (aIVirtualCard7.CardIndex == originalField.EvoUsedCard.CardIndex)
{
EvoUsedCard = aIVirtualCard7;
}
}
}
DummyDeckContainer = originalField.DummyDeckContainer.Clone(this);
AllyTurnHandAddedCards = originalField.AllyTurnHandAddedCards;
AllyGameHandAddedCards = originalField.AllyGameHandAddedCards;
EnemyTurnHandAddedCards = originalField.EnemyTurnHandAddedCards;
EnemyGameHandAddedCards = originalField.EnemyGameHandAddedCards;
CurrentTurnCount = originalField.CurrentTurnCount;
AllyCardTotalNum = originalField.AllyCardTotalNum;
EnemyCardTotalNum = originalField.EnemyCardTotalNum;
IsLeftTurnEvol = originalField.IsLeftTurnEvol;
IsExceededWaitEvolveTurn = originalField.IsExceededWaitEvolveTurn;
for (int num14 = 0; num14 < originalField.DamagedCardsByLastAction.Count; num14++)
{
Tuple<AIVirtualCard, int> item = originalField.DamagedCardsByLastAction[num14];
DamagedCardsByLastAction.Add(item);
}
TagPreprocessContainer = originalField.TagPreprocessContainer.Clone(this);
DamageModifierCollection = originalField.DamageModifierCollection.Clone(this);
CommonAllyTurnEndSituation = new AIVirtualTurnEndInfo(AllyClass);
CommonEnemyTurnEndSituation = new AIVirtualTurnEndInfo(EnemyClass);
AllyGameEnhancePlayCards = originalField.AllyGameEnhancePlayCards;
EnemyGameEnhancePlayCards = originalField.EnemyGameEnhancePlayCards;
AllyEvolvedCountInGame = originalField.AllyEvolvedCountInGame;
EnemyEvolvedCountInGame = originalField.EnemyEvolvedCountInGame;
AllyEvolvedCountInPreviousTurn = originalField.AllyEvolvedCountInPreviousTurn;
EnemyEvolvedCountInPreviousTurn = originalField.EnemyEvolvedCountInPreviousTurn;
AllyDamageCountInGame = originalField.AllyDamageCountInGame;
AllyDamageCountInTurn = originalField.AllyDamageCountInTurn;
EnemyDamageCountInGame = originalField.EnemyDamageCountInGame;
AllyNecromancedCountInGame = originalField.AllyNecromancedCountInGame;
EnemyNecromancedCountInGame = originalField.EnemyNecromancedCountInGame;
AllyGameAddUpdateDeckCards = new List<AIVirtualCard>(originalField.AllyGameAddUpdateDeckCards);
EnemyGameAddUpdateDeckCards = new List<AIVirtualCard>(originalField.EnemyGameAddUpdateDeckCards);
SummonedCardContainer = originalField.SummonedCardContainer.Clone();
_isPlayptnSimulationField = isPlayptnSimulation;
}
public float EvaluateField()
{
ulong hash = GetHash();
if (AI.FieldHashAndValueTable.ContainsKey(hash))
{
return AI.FieldHashAndValueTable[hash];
}
if (AllyClass == null || EnemyClass == null)
{
return 0f;
}
float num = 0f;
for (int i = 0; i < CardListSet.AllyClassAndInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.AllyClassAndInplayCards[i];
num += aIVirtualCard.UpdateValue(ParamQuery, StyleQuery, BestPlayPtn, doesUseLostLife: true);
if (aIVirtualCard.IsUnit && aIVirtualCard.IsRecoveredAttackableCount && AI.PlaySkipInfo != null)
{
bool isRush = aIVirtualCard.IsRush && aIVirtualCard.IsFirstTurn;
num += AIInstantAttackUtility.EvalInstantAttack(aIVirtualCard.Attack, aIVirtualCard.Life, aIVirtualCard.AttackableCount, EnemyAI.EmptyPlayPtn, aIVirtualCard, null, isRush);
}
}
for (int j = 0; j < AllyHandCards.Count; j++)
{
AIVirtualCard aIVirtualCard2 = AllyHandCards[j];
num += aIVirtualCard2.GetHandBonus(BestPlayPtn, null, isIgnoreInFusion: false);
if ((aIVirtualCard2.IsUnit || aIVirtualCard2.IsLeader) && !aIVirtualCard2.IsDead)
{
num += StyleQuery.GetBarrierBonus(aIVirtualCard2);
}
}
float num2 = 0f;
for (int k = 0; k < CardListSet.EnemyClassAndInplayCards.Count; k++)
{
AIVirtualCard aIVirtualCard3 = CardListSet.EnemyClassAndInplayCards[k];
num2 += aIVirtualCard3.UpdateValue(ParamQuery, StyleQuery, EnemyAI.EmptyPlayPtn, doesUseLostLife: true);
if ((!aIVirtualCard3.IsUnit && !aIVirtualCard3.IsLeader) || aIVirtualCard3.IsDead)
{
continue;
}
if (aIVirtualCard3.IsUnit)
{
num2 += 0.001f * (float)aIVirtualCard3.Attack;
if (aIVirtualCard3.IsKiller)
{
num2 += 0.001f * (float)(aIVirtualCard3.Attack + aIVirtualCard3.Life);
}
}
num2 += StyleQuery.GetBarrierBonus(aIVirtualCard3);
}
float num3 = num - num2 + SimulationExtraBonus;
AIVirtualField currentVirtualField = AI.CurrentVirtualField;
num3 -= (float)(EnemyPpTotal - currentVirtualField.EnemyPpTotal) * 4f;
num3 += (float)(AllyPpTotal - currentVirtualField.AllyPpTotal) * 4f;
float dEFAULT_HAND_BONUS = HandBonusTagCollection.DEFAULT_HAND_BONUS;
num3 -= (float)(GetEnemyHandCardList().Count - currentVirtualField.GetEnemyHandCardList().Count) * dEFAULT_HAND_BONUS;
num3 += (float)(AllyHandCards.Count - currentVirtualField.AllyHandCards.Count) * dEFAULT_HAND_BONUS;
if (AllyClass.IsDead)
{
num3 -= 9999f;
}
else if (EnemyClass.IsDead)
{
float num4 = num3 + 9999f + (float)(EnemyClass.DefLife - EnemyClass.Life);
AI.FieldHashAndValueTable.Add(hash, num4);
return num4;
}
List<AIVirtualCard> selfRemainings = AllyInplayCards.FindAll((AIVirtualCard attacker) => attacker.IsUnit && !attacker.IsDead);
List<AIVirtualCard> opponentRemainings = EnemyInplayCards.FindAll((AIVirtualCard c) => c.IsUnit && !c.IsDead);
num3 += AIReincarnationUtility.CalcReincarnationValueAfterSimulation(this, BestPlayPtn, null, selfRemainings, opponentRemainings);
if (EvoUsedCard != null)
{
num3 += EvoBonus;
int num5 = ((BestPlayPtn.Count > 0) ? 9 : 8);
float num6 = (float)Mathf.Max(EvoHandPlus + AI.ALLY.HandCardList.Count - num5, 0) * 2f;
num3 -= num6;
if (AI.CurrentBattleSimEvoCard != null && AI.CurrentBattleSimEvoCard.IsAttackable(EnemyAI.EmptyPlayPtn))
{
float num7 = (float)(AllyEvolutionCount - AI.CurrentBattleBeforeSimEvoEvolCount) * EpValue;
num3 += num7;
}
else
{
float num8 = (float)(AllyEvolutionCount - AI.ALLY.CurrentEpCount) * EpValue;
num3 += num8;
}
}
float num9 = AILeaderLifeEvaluationUtility.Evaluate(EnemyClass.Life, EnemyClass.DefLife, isAllyLeader: false, isAllyOwner: true);
num3 += num9;
NextTurnLeaderDamage = 0;
NextTurnLeaderDamage = AI.CalcHandNextTurnDamage(this);
if (!EnemyClass.IsAllShield && EnemyClass.Life <= NextTurnLeaderDamage)
{
num3 += 500f;
}
if (AllyClass.Life != AllyClass.DefLife)
{
float num10 = AILeaderLifeEvaluationUtility.Evaluate(AllyClass.Life, AllyClass.DefLife, isAllyLeader: true, isAllyOwner: true);
num3 += num10;
}
try
{
AI.FieldHashAndValueTable.Add(hash, num3);
return num3;
}
catch (Exception)
{
return num3;
}
}
public AIVirtualCard SearchVirtualCard(BattleCardBase baseCard, AIVirtualFieldSearchCardOption searchOption = null)
{
if (searchOption == null)
{
searchOption = AIVirtualFieldSearchCardOption.DefaultOption;
}
for (int i = 0; i < CardListSet.AllReferableCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.AllReferableCards[i];
if (baseCard.IsPlayer == aIVirtualCard.IsPlayer && baseCard.Index == aIVirtualCard.CardIndex)
{
return aIVirtualCard;
}
}
List<AIVirtualCard> enemyHandCardList = GetEnemyHandCardList();
for (int j = 0; j < enemyHandCardList.Count; j++)
{
AIVirtualCard aIVirtualCard2 = enemyHandCardList[j];
if (baseCard.IsPlayer == aIVirtualCard2.IsPlayer && baseCard.Index == aIVirtualCard2.CardIndex)
{
return aIVirtualCard2;
}
}
if (searchOption.IsSearchFromDeck)
{
List<AIVirtualCard> list = ((!searchOption.IsSearchFromBeforeLatestActionDeck) ? (AI.IsAllyCard(baseCard) ? AI.AllyDeckCards : AI.EnemyDeckCards) : (AI.IsAllyCard(baseCard) ? AI.BeforeLatestActionAllyDeckCards : AI.BeforeLatestActionEnemyDeckCards));
for (int k = 0; k < list.Count; k++)
{
AIVirtualCard aIVirtualCard3 = list[k];
if (baseCard.IsPlayer == aIVirtualCard3.IsPlayer && baseCard.Index == aIVirtualCard3.CardIndex)
{
return aIVirtualCard3;
}
}
}
AIVirtualCard aIVirtualCard4 = null;
if (searchOption.OptionalSearchRange == BattleCardRealTargetInformation.TargetRange.DestroyedCardList)
{
aIVirtualCard4 = SearchVirtualCardFromDestroyedCardList(baseCard);
}
if (aIVirtualCard4 != null)
{
return aIVirtualCard4;
}
if (searchOption.IsOutputCannotFindError)
{
AIConsoleUtility.LogError($"SearchVirtualCard : AIVirtualCard not found. ID:{baseCard.CardId} Index:{baseCard.Index}");
}
return null;
}
private AIVirtualCard SearchVirtualCardFromDestroyedCardList(BattleCardBase baseCard)
{
List<AIVirtualCard> list = (AI.IsAllyCard(baseCard) ? CardListSet.AllyDestroyedCards : CardListSet.EnemyDestroyedCards);
if (list == null || list.Count <= 0)
{
return null;
}
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (baseCard.IsPlayer == aIVirtualCard.IsPlayer && baseCard.Index == aIVirtualCard.CardIndex)
{
return aIVirtualCard;
}
}
return null;
}
public AIVirtualCard SearchVirtualCard(AIVirtualCard baseCard, AIVirtualFieldSearchCardOption searchOption = null)
{
if (searchOption == null)
{
searchOption = AIVirtualFieldSearchCardOption.DefaultOption;
}
for (int i = 0; i < CardListSet.AllReferableCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.AllReferableCards[i];
if (baseCard.IsSameCard(aIVirtualCard))
{
return aIVirtualCard;
}
}
List<AIVirtualCard> enemyHandCardList = GetEnemyHandCardList();
for (int j = 0; j < enemyHandCardList.Count; j++)
{
AIVirtualCard aIVirtualCard2 = enemyHandCardList[j];
if (baseCard.IsSameCard(aIVirtualCard2))
{
return aIVirtualCard2;
}
}
if (searchOption.IsSearchFromDeck)
{
List<AIVirtualCard> list = (baseCard.IsAlly ? AI.AllyDeckCards : AI.EnemyDeckCards);
for (int k = 0; k < list.Count; k++)
{
AIVirtualCard aIVirtualCard3 = list[k];
if (baseCard.IsSameCard(aIVirtualCard3))
{
return aIVirtualCard3;
}
}
}
if (searchOption.IsOutputCannotFindError)
{
AIConsoleUtility.LogError("SearchVirtualCard : AIVirtualCard not found");
}
return null;
}
public List<AIVirtualCard> GetEnemyHandCardList()
{
if (IsLatestActionField)
{
return _latestActionEnemyHandCards;
}
return _enemyHandCards;
}
public List<AIVirtualCard> GetSimulationHandCards()
{
if (IsLatestActionField)
{
List<AIVirtualCard> list = new List<AIVirtualCard>(AllyHandCards);
list.AddRange(_latestActionEnemyHandCards);
return list;
}
return AllyHandCards;
}
public float EvaluateThreaten()
{
ulong hash = GetHash();
if (AI.FieldHashAndThreatenTable.ContainsKey(hash))
{
return AI.FieldHashAndThreatenTable[hash];
}
List<AIVirtualCard> list = EnemyInplayCards.FindAll((AIVirtualCard c) => c.IsUnit && !c.IsDead);
if (list.Count <= 0)
{
try
{
float num = EvaluateTurnEndTagThreaten(null, null, AllyClass, AllyClass.Life);
AI.FieldHashAndThreatenTable.Add(hash, num);
return num;
}
catch (Exception)
{
return 0f;
}
}
List<int[]> list2 = AIMathematicsLibrary.EnumerateIndexListPermutations(list.Count);
float num2 = float.MinValue;
bool flag = true;
for (int num3 = -1; num3 < AllyInplayCards.Count; num3++)
{
AIVirtualCard aIVirtualCard = ((num3 >= 0) ? AllyInplayCards[num3] : AllyClass);
if (aIVirtualCard.IsDead || aIVirtualCard.IsIndependent || aIVirtualCard.IsAmulet || aIVirtualCard.IsSneak)
{
continue;
}
List<int[]> successPatterns = new List<int[]>();
for (int num4 = 0; num4 < list2.Count; num4++)
{
int[] array = list2[num4];
if (!IsCurrentPermListIncludedInSuccessPatterns(successPatterns, array))
{
Tuple<int, int>[] array2 = new Tuple<int, int>[array.Length];
for (int num5 = 0; num5 < list.Count; num5++)
{
AIVirtualCard aIVirtualCard2 = list[num5];
array2[num5] = new Tuple<int, int>(aIVirtualCard2.Attack, aIVirtualCard2.Life);
}
flag = false;
float num6 = EvaluateSimpleAttack(list, array, array2, aIVirtualCard, successPatterns);
if (num6 > num2)
{
num2 = num6;
}
}
}
}
if (flag)
{
num2 = 0f;
}
try
{
AI.FieldHashAndThreatenTable.Add(hash, num2);
return num2;
}
catch (Exception)
{
return num2;
}
}
private Tuple<int, int>[] CalculateEvoStats(List<AIVirtualCard> attackers, Tuple<int, int>[] status)
{
if (attackers == null || attackers.Count <= 0)
{
return status;
}
int num = 0;
int num2 = 0;
int num3 = 0;
for (int i = 0; i < attackers.Count; i++)
{
AIVirtualCard aIVirtualCard = attackers[i];
if (!aIVirtualCard.IsEvolution && (aIVirtualCard.IsNotConsumeEp || EnemyEvolutionCount > 0))
{
int evoAttackPlus = aIVirtualCard.EvoAttackPlus;
if (evoAttackPlus > num)
{
num = evoAttackPlus;
num2 = aIVirtualCard.EvoLifePlus;
num3 = i;
}
}
}
status[num3].first += num;
status[num3].second += num2;
return status;
}
public float EvaluateSimpleAttack(List<AIVirtualCard> attackers, int[] attackSequence, Tuple<int, int>[] status, AIVirtualCard target, List<int[]> successPatterns)
{
int[] array = new int[attackers.Count];
for (int i = 0; i < attackers.Count; i++)
{
array[i] = attackers[i].MaxAttackableCount;
}
if (target.IsLeader)
{
status = CalculateEvoStats(attackers, status);
}
float num = 0f;
bool flag = false;
int num2 = 0;
float num3 = 0f;
int num4 = target.Life;
int j;
for (j = 0; j < attackSequence.Length; j++)
{
int num5 = attackSequence[j];
AIVirtualCard aIVirtualCard = attackers[num5];
AIVirtualAttackInfo situation = new AIVirtualAttackInfo(aIVirtualCard, target);
if (aIVirtualCard.IsCantAttackAll)
{
continue;
}
int attackDamageToCertainCard = AIAttackTagSimulator.GetAttackDamageToCertainCard(this, situation, aIVirtualCard);
float attackBonus = aIVirtualCard.GetAttackBonus(BestPlayPtn, situation);
AISimulationBuffInfoCollection aISimulationBuffInfoCollection = null;
if (CardListSet.HasOtherAttackBuffHolder)
{
aISimulationBuffInfoCollection = AIAttackTagSimulator.GetBuffInfoListWhenCertainAttack(this, situation);
}
AISimulationBuffInfo buffInfo = aISimulationBuffInfoCollection?.GetBuffInfoToCertainCard(aIVirtualCard);
for (int k = 0; k < array[num5]; k++)
{
if (!AIAttackSimulationUtility.IsExecuteAttackValuable(this, aIVirtualCard, status[num5].first, status[num5].second, attackDamageToCertainCard, buffInfo, attackBonus))
{
continue;
}
if (aIVirtualCard.IsDestroyWhenAttack)
{
if (!target.IsIndependent && !target.IsIndestructible && target.IsUnit)
{
flag = true;
}
break;
}
aISimulationBuffInfoCollection?.PseudoApplyBuffForSimpleAttack(aIVirtualCard, attackers, status);
int attackerAtk = status[num5].first;
int second = status[num5].second;
second -= attackDamageToCertainCard;
if (aIVirtualCard.IsAttackByLife)
{
attackerAtk = second;
}
if (target.IsUnit)
{
if (aIVirtualCard.TagCollectionContainer.HasTag(AIPlayTagType.ClashBonus))
{
num3 += aIVirtualCard.EvaluateClashBonus();
}
if (target.TagCollectionContainer.HasTag(AIPlayTagType.ClashBonus))
{
num3 -= target.EvaluateClashBonus();
}
}
num3 += attackBonus;
int targetAtk = target.Attack;
AIAttackTagSimulator.ExecuteAttackByLife(this, aIVirtualCard, target, ref attackerAtk, ref targetAtk);
int num6 = target.SimulateDamageAmount(AIAttackTagSimulator.GetAttackDamageToCertainCard(this, situation, target), isSkillDamage: true);
num6 += target.SimulateDamageAmount(aIVirtualCard.SimulateAttackAmount(attackerAtk, situation));
num2 += num6;
int num7 = aIVirtualCard.SimulateDamageAmount(target.SimulateAttackAmount(situation));
num4 -= num6;
second -= num7;
status[num5].second = second;
if (target.IsUnit)
{
if (aIVirtualCard.IsKiller || num4 <= 0)
{
flag = true;
num += target.Value;
}
if (target.IsKiller || second <= 0)
{
num -= aIVirtualCard.Value;
break;
}
num -= (float)num7;
if (flag)
{
break;
}
}
else if (target.IsLeader && num4 <= 0)
{
num2 = target.Life;
flag = true;
break;
}
}
if (flag)
{
break;
}
}
num += EvaluateTurnEndTagThreaten(attackers, status, target, num4);
if (target.IsLeader)
{
num += AILeaderLifeEvaluationUtility.Evaluate(AllyClass.Life - num2, AllyClass.Life, isAllyLeader: true, isAllyOwner: false);
}
num += num3;
if (flag)
{
int[] array2 = new int[j + 1];
for (int l = 0; l <= j; l++)
{
array2[l] = attackSequence[l];
}
successPatterns.Add(array2);
}
return num;
}
private float EvaluateTurnEndTagThreaten(List<AIVirtualCard> attackers, Tuple<int, int>[] status, AIVirtualCard target, int targetLife)
{
float num = 0f;
if (!CardListSet.HasEnemyTurnEndTagHolder)
{
return num;
}
Tuple<int, int>[] allInplayStatusList = new Tuple<int, int>[CardListSet.BothClassAndInplayCards.Count];
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
AIVirtualCard inplay = CardListSet.BothClassAndInplayCards[i];
if (inplay.IsSameCard(target))
{
allInplayStatusList[i] = new Tuple<int, int>(inplay.Attack, targetLife);
continue;
}
int num2 = -1;
if (attackers != null && attackers.Count > 0)
{
num2 = attackers.FindIndex((AIVirtualCard c) => c.IsSameCard(inplay));
}
if (num2 >= 0)
{
allInplayStatusList[i] = status[num2];
}
else
{
allInplayStatusList[i] = new Tuple<int, int>(inplay.Attack, inplay.Life);
}
}
for (int num3 = 0; num3 < CardListSet.EnemyTurnEndTagHolders.Count; num3++)
{
AIVirtualCard aIVirtualCard = CardListSet.EnemyTurnEndTagHolders[num3];
if (!aIVirtualCard.IsDead && !aIVirtualCard.IsSkillLost)
{
float num4 = aIVirtualCard.TagCollectionContainer.TurnEndTags.CalculateEnemyTurnEndTagThreaten(aIVirtualCard, ref allInplayStatusList);
num += (float)((!aIVirtualCard.IsAlly) ? 1 : (-1)) * num4;
}
}
return num;
}
public void ReverseAllCardIsSelfTurn()
{
for (int i = 0; i < CardListSet.AllReferableCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.AllReferableCards[i];
aIVirtualCard.IsSelfTurn = !aIVirtualCard.IsSelfTurn;
}
}
private bool IsCurrentPermListIncludedInSuccessPatterns(List<int[]> successPatterns, int[] permList)
{
for (int i = 0; i < successPatterns.Count; i++)
{
int[] array = successPatterns[i];
_ = array.Length;
_ = permList.Length;
bool flag = true;
for (int j = 0; j < array.Length; j++)
{
if (array[j] != permList[j])
{
flag = false;
break;
}
}
if (flag)
{
return true;
}
}
return false;
}
public void RegisterOtherCardAttackTags(AIVirtualAttackInfo situation)
{
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.BothClassAndInplayCards[i];
if (!aIVirtualCard.IsDead && aIVirtualCard.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenOtherAttack))
{
aIVirtualCard.TagCollectionContainer.OtherAttackTags.RegisterConditionPassedTagProgress(this, aIVirtualCard, situation);
}
}
}
public void ApplyOtherEvolveTags(AISituationInfo situation, AIVirtualCard evolver)
{
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.BothClassAndInplayCards[i];
if (aIVirtualCard.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenOtherEvo))
{
aIVirtualCard.TagCollectionContainer.OtherEvoTags.RegisterPassedConditionTags(aIVirtualCard, evolver, this, BestPlayPtn, situation);
}
if (aIVirtualCard.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenSelfAndOtherEvo))
{
aIVirtualCard.TagCollectionContainer.SelfAndOtherEvoTags.RegisterPassedConditionTags(aIVirtualCard, evolver, this, BestPlayPtn, situation);
}
}
}
public void RecoverPp(int amount)
{
AllyPp = Mathf.Min(AllyPp + amount, AllyPpTotal);
}
public bool CheckDestroyByEvoTags(AISituationInfo situation, AIVirtualCard destroyTarget)
{
if (situation.ActionType != AIOperationType.EVOLVE)
{
AIConsoleUtility.LogError("AIVirtualField.CheckDestroyByEvoTags() eorror!! situation.ActionType is not EVOLVE");
return false;
}
AIVirtualCard actor = situation.Actor;
if (actor.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenEvo) && actor.TagCollectionContainer.EvoTags.CheckDestroyByEvolveTags(actor, situation, destroyTarget))
{
return true;
}
List<AIVirtualCard> otherEvoTagHolders = CardListSet.OtherEvoTagHolders;
if (otherEvoTagHolders == null)
{
return false;
}
for (int i = 0; i < otherEvoTagHolders.Count; i++)
{
AIVirtualCard aIVirtualCard = otherEvoTagHolders[i];
if (!aIVirtualCard.IsSameCard(actor) && aIVirtualCard.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenOtherEvo) && aIVirtualCard.TagCollectionContainer.OtherEvoTags.CheckDestroyByOtherEvoTags(aIVirtualCard, destroyTarget, this, BestPlayPtn, situation))
{
return true;
}
if (aIVirtualCard.TagCollectionContainer.HasTagCollection(TagCollectionType.WhenSelfAndOtherEvo) && aIVirtualCard.TagCollectionContainer.SelfAndOtherEvoTags.CheckDestroyBySelfAndOtherEvoTags(aIVirtualCard, destroyTarget, this, BestPlayPtn, situation))
{
return true;
}
}
return false;
}
public bool IsNoSkipAttackInPlayPtn()
{
if (BestPlayPtn == null)
{
return false;
}
for (int i = 0; i < BestPlayPtn.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[BestPlayPtn[i]];
if (aIVirtualCard.TagCollectionContainer.HasTag(AIPlayTagType.NoSkipAttack) && aIVirtualCard.TagCollectionContainer.NoSkipAttackTags.IsNoSkipAttack(aIVirtualCard, BestPlayPtn, ParamQuery))
{
return true;
}
}
return false;
}
public int GetInplayAttackSumToLeader(bool isAlly)
{
if (isAlly)
{
return AllyInplayCards.Sum((AIVirtualCard card) => (card.IsUnit && AIAttackSimulationUtility.IsAttackPossible(this, card.AttackLeaderSituation)) ? card.Attack : 0);
}
return EnemyInplayCards.Sum((AIVirtualCard card) => (!card.IsDead) ? card.Attack : 0);
}
public float GetInplayTotalValue()
{
return GetInplayFollowerTotalValue(EnemyAI.EmptyPlayPtn, isAlly: true) - GetInplayFollowerTotalValue(EnemyAI.EmptyPlayPtn, isAlly: false);
}
public float GetInplayFollowerTotalValue(List<int> playPtn, bool isAlly)
{
float num = 0f;
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
int count = list.Count;
for (int i = 0; i < count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (aIVirtualCard.IsUnit)
{
num += aIVirtualCard.EvaluateValueOnField(playPtn, null, useStyle: true);
}
}
return num;
}
public int GetAllyMaxAttackableLife(bool isAlly)
{
int num = 0;
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
for (int i = 0; i < list.Count; i++)
{
if (list[i].IsAttackable(EnemyAI.EmptyPlayPtn) && list[i].Life > num)
{
num = list[i].Life;
}
}
return num;
}
public int GetMemberMaxAttack(AIVirtualCard tagOwner, List<AIScriptTokenBase> filters, List<int> playPtn, AISituationInfo situation)
{
if (tagOwner == null)
{
return 0;
}
int num = 0;
if (tagOwner.IsAlly && playPtn.IsNotNullOrEmpty())
{
for (int i = 0; i < playPtn.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[playPtn[i]];
if (aIVirtualCard.IsUnit && AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard, AllyHandCards, filters, playPtn, tagOwner, situation) && aIVirtualCard.Attack > num)
{
num = aIVirtualCard.Attack;
}
if (aIVirtualCard.IsSameCard(tagOwner))
{
break;
}
}
}
List<AIVirtualCard> list = (tagOwner.IsAlly ? AllyInplayCards : EnemyInplayCards);
for (int j = 0; j < list.Count; j++)
{
AIVirtualCard aIVirtualCard2 = list[j];
if (!aIVirtualCard2.IsDead && aIVirtualCard2.IsUnit && AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard2, list, filters, playPtn, tagOwner, situation) && aIVirtualCard2.Attack > num)
{
num = aIVirtualCard2.Attack;
}
}
return num;
}
public int GetMemberMaxLife(List<int> playPtn, bool isAlly)
{
int num = 0;
if (isAlly && playPtn.IsNotNullOrEmpty())
{
for (int i = 0; i < playPtn.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[playPtn[i]];
if (aIVirtualCard.IsUnit && aIVirtualCard.Life > num)
{
num = aIVirtualCard.Life;
}
}
}
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
for (int j = 0; j < list.Count; j++)
{
AIVirtualCard aIVirtualCard2 = list[j];
if (aIVirtualCard2.IsUnit && aIVirtualCard2.Life > num)
{
num = aIVirtualCard2.Life;
}
}
return num;
}
public int GetEnemyInPlayMinAttack()
{
if (EnemyInplayCards.IsNotNullOrEmpty() && EnemyInplayCards.Any((AIVirtualCard c) => c.IsUnit && !c.IsDead))
{
int b = EnemyInplayCards.Min((AIVirtualCard card) => (!card.IsUnit || card.IsDead) ? int.MaxValue : card.Attack);
return Mathf.Max(0, b);
}
return 0;
}
public int GetEnemyInPlayMaxAttack()
{
if (EnemyInplayCards.IsNotNullOrEmpty())
{
int b = EnemyInplayCards.Max((AIVirtualCard card) => (card.IsUnit && !card.IsDead) ? card.Attack : 0);
return Mathf.Max(0, b);
}
return 0;
}
public int GetAllyInplayMaxAttack()
{
if (AllyInplayCards == null || AllyInplayCards.Count <= 0)
{
return 0;
}
int num = 0;
for (int i = 0; i < AllyInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyInplayCards[i];
if (aIVirtualCard.IsUnit && !aIVirtualCard.IsDead && aIVirtualCard.Attack > num)
{
num = aIVirtualCard.Attack;
}
}
return num;
}
public int GetMaxAllyAttackableUnitAttack(List<int> playPtn, bool isAlly)
{
int num = 0;
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
for (int i = 0; i < list.Count; i++)
{
if (list[i].IsUnit && list[i].IsAttackable(playPtn) && list[i].Attack > num)
{
num = list[i].Attack;
}
}
return num;
}
public int GetMaxAllyNonAttackableUnitAttack(List<int> playPtn)
{
int num = 0;
for (int i = 0; i < AllyInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyInplayCards[i];
if (aIVirtualCard.IsUnit && !aIVirtualCard.IsAttackable(playPtn) && (aIVirtualCard.AttackableCount != 0 || aIVirtualCard.MaxAttackableCount <= 0))
{
int attack = aIVirtualCard.Attack;
if (attack > num)
{
num = attack;
}
}
}
return num;
}
public int GetAttackTargetMaxAtk(AIVirtualCard tagOwner)
{
int num = 0;
List<AIVirtualCard> list = (tagOwner.IsAlly ? EnemyInplayCards : AllyInplayCards);
bool flag = list.Any((AIVirtualCard card) => card.IsUnit && !card.IsCantUnderAnyAttack() && card.IsGuard);
bool isIgnoreGuard = tagOwner.IsIgnoreGuard;
for (int num2 = 0; num2 < list.Count; num2++)
{
AIVirtualCard aIVirtualCard = list[num2];
if (aIVirtualCard.IsUnit && !aIVirtualCard.IsCantUnderAnyAttack() && (!flag || aIVirtualCard.IsGuard || isIgnoreGuard) && aIVirtualCard.Attack > num)
{
num = aIVirtualCard.Attack;
}
}
return num;
}
public int GetMemberAtkSum(List<int> playPtn, bool isAlly)
{
int num = 0;
if (isAlly && playPtn.IsNotNullOrEmpty())
{
num += AllyHandCards.Sum((AIVirtualCard card) => (playPtn.Contains(AllyHandCards.IndexOf(card)) && card.IsUnit) ? card.Attack : 0);
}
List<AIVirtualCard> source = (isAlly ? AllyInplayCards : EnemyInplayCards);
return num + source.Sum((AIVirtualCard card) => (card.IsUnit && !card.IsDead) ? card.Attack : 0);
}
public int GetMemberLifeSum(List<int> playPtn, bool isAlly)
{
int num = 0;
if (isAlly && playPtn.IsNotNullOrEmpty())
{
num += AllyHandCards.Sum((AIVirtualCard card) => (playPtn.Contains(AllyHandCards.IndexOf(card)) && card.IsUnit) ? card.Life : 0);
}
List<AIVirtualCard> source = (isAlly ? AllyInplayCards : EnemyInplayCards);
return num + source.Sum((AIVirtualCard card) => (card.IsUnit && !card.IsDead) ? card.Life : 0);
}
public int GetTotalDamage(List<AIScriptTokenBase> filters, AIVirtualCard tagOwner, AISituationInfo situation)
{
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(CardListSet.BothClassAndInplayCards, filters, tagOwner, BestPlayPtn, situation);
if (list != null && list.Count > 0)
{
int num = 0;
for (int i = 0; i < list.Count; i++)
{
num += list[i].MaxLife - list[i].Life;
}
return num;
}
return 0;
}
public int GetHandMinCost(AIVirtualCard tagOwner)
{
if (AllyHandCards.Count <= 0)
{
return 0;
}
int num = int.MaxValue;
for (int i = 0; i < AllyHandCards.Count; i++)
{
if ((tagOwner == null || tagOwner.CardIndex != AllyHandCards[i].CardIndex || tagOwner.BaseId != AllyHandCards[i].BaseId) && AllyHandCards[i].Cost < num)
{
num = AllyHandCards[i].Cost;
}
}
return num;
}
public int GetHandMaxCost(AIVirtualCard tagOwner)
{
if (AllyHandCards.Count <= 0 || !tagOwner.IsAlly)
{
return 0;
}
int num = 0;
for (int i = 0; i < AllyHandCards.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[i];
if (!tagOwner.IsSameCard(aIVirtualCard) && aIVirtualCard.BaseCost > num)
{
num = aIVirtualCard.BaseCost;
}
}
return num;
}
public int GetEvolutionCountInGame(AIVirtualCard tagOwner, AIScriptTokenArgType type)
{
switch (type)
{
case AIScriptTokenArgType.BOTH:
return AllyEvolvedCountInGame + EnemyEvolvedCountInGame;
case AIScriptTokenArgType.ALLY:
case AIScriptTokenArgType.OPPONENT:
if (type == AIScriptTokenArgType.ALLY != tagOwner.IsAlly)
{
return EnemyEvolvedCountInGame;
}
return AllyEvolvedCountInGame;
default:
AIConsoleUtility.LogError($"EVO_COUNT_IN_GAME Error!! {type} is invalid arg!!");
return 0;
}
}
public int GetEvolutionCountInPreviousTurn(AIVirtualCard tagOwner, AIScriptTokenArgType type)
{
if ((uint)(type - 84) <= 1u)
{
if (type == AIScriptTokenArgType.ALLY != tagOwner.IsAlly)
{
return EnemyEvolvedCountInPreviousTurn;
}
return AllyEvolvedCountInPreviousTurn;
}
AIConsoleUtility.LogError($"EVO_COUNT_IN_PREVIOUS_TURN Error!! {type} is invalid arg!!");
return 0;
}
public void AddRallyCount(int addCount, bool isAlly)
{
if (isAlly)
{
AllyRallyCount += addCount;
}
else
{
EnemyRallyCount += addCount;
}
}
public bool IsHandAllRemovalWaiting()
{
for (int i = 0; i < AllyHandCards.Count; i++)
{
if (AllyHandCards[i].HasWhenPlayRemovalTag())
{
return true;
}
}
return false;
}
public float EvalRandomBounce(List<AIScriptTokenBase> argList, AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, int count)
{
if (count == 0)
{
return 0f;
}
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(CardListSet.BothInplayCards, argList, tagOwner, playPtn, null);
if (!list.IsNotNullOrEmpty())
{
return 0f;
}
int restPp = AI.PlayPtnRecorder.GetRestPp(playPtn, field);
if (list.Count <= count)
{
float num = 0f;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsIndestructible)
{
float num2 = aIVirtualCard.EvaluateBounceValue(playPtn, restPp);
num2 += aIVirtualCard.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false) * (float)(aIVirtualCard.IsAlly ? 1 : (-1));
num += num2;
}
}
return num;
}
float num3 = 0f;
List<int> list2 = new List<int>();
for (int j = 0; j < list.Count; j++)
{
list2.Add(j);
}
List<int[]> list3 = AIMathematicsLibrary.EnumerateCombinations(list2, count).ToList();
for (int k = 0; k < list3.Count; k++)
{
int[] array = list3[k];
for (int l = 0; l < array.Length; l++)
{
AIVirtualCard aIVirtualCard2 = list[array[l]];
if (!aIVirtualCard2.IsIndependent)
{
float num4 = aIVirtualCard2.EvaluateBounceValue(playPtn, restPp);
num4 += aIVirtualCard2.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false) * (float)(aIVirtualCard2.IsAlly ? 1 : (-1));
num3 += num4;
}
}
}
return num3 / (float)list3.Count;
}
public float EvalTargetingBounce(List<AIScriptTokenBase> argList, AIVirtualCard tagOwner, List<int> playPtn)
{
List<AIVirtualCard> bothInplayCards = CardListSet.BothInplayCards;
bothInplayCards = AIFilteringUtility.MultipleFiltering(bothInplayCards, argList, tagOwner, playPtn, null);
if (!bothInplayCards.IsNotNullOrEmpty())
{
return 0f;
}
bothInplayCards = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(bothInplayCards, tagOwner, playPtn);
float num = float.MinValue;
for (int i = 0; i < bothInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = bothInplayCards[i];
if (!aIVirtualCard.IsDead && aIVirtualCard.IsOnField && !aIVirtualCard.IsIndependent && (aIVirtualCard.IsAlly == tagOwner.IsAlly || (!aIVirtualCard.IsUntouchable && !aIVirtualCard.IsSneak)))
{
int restPp = 0;
if (aIVirtualCard.IsAlly)
{
restPp = AI.PlayPtnRecorder.GetRestPp(playPtn, this);
}
float num2 = aIVirtualCard.EvaluateBounceValue(playPtn, restPp);
num2 += (float)(aIVirtualCard.IsAlly ? 1 : (-1)) * aIVirtualCard.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false);
if (num2 > num)
{
num = num2;
}
}
}
return num;
}
public float EvalAllBounce(List<AIScriptTokenBase> argList, AIVirtualCard tagOwner, List<int> playPtn)
{
List<AIVirtualCard> bothInplayCards = CardListSet.BothInplayCards;
bothInplayCards = AIFilteringUtility.MultipleFiltering(bothInplayCards, argList, tagOwner, playPtn, null);
if (!bothInplayCards.IsNotNullOrEmpty())
{
return 0f;
}
float num = 0f;
for (int i = 0; i < bothInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = bothInplayCards[i];
if (!aIVirtualCard.IsDead && aIVirtualCard.IsOnField && !aIVirtualCard.IsIndependent)
{
int restPp = 0;
if (aIVirtualCard.IsAlly)
{
restPp = AI.PlayPtnRecorder.GetRestPp(playPtn, this);
}
float num2 = aIVirtualCard.EvaluateBounceValue(playPtn, restPp);
num2 += (float)(aIVirtualCard.IsAlly ? 1 : (-1)) * aIVirtualCard.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false);
num += num2;
}
}
return num;
}
public float EvalForcedExchangeVirtual(int attackLimit, List<int> playPtn)
{
AIVirtualCard aIVirtualCard = null;
float num = float.MaxValue;
int num2 = 0;
for (int i = 0; i < AllyInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard2 = AllyInplayCards[i];
if (aIVirtualCard2.IsKiller)
{
continue;
}
int attack = aIVirtualCard2.Attack;
if (aIVirtualCard2.IsAttackable(EnemyAI.EmptyPlayPtn) && attack >= attackLimit)
{
float num3 = aIVirtualCard2.EvaluateValueOnField(playPtn, null, useStyle: true, doesUseLostLife: false);
if (num3 < num)
{
aIVirtualCard = aIVirtualCard2;
num = num3;
num2 = attack;
}
}
}
if (aIVirtualCard == null)
{
return 0f;
}
AIVirtualCard aIVirtualCard3 = null;
float num4 = float.MinValue;
for (int j = 0; j < EnemyInplayCards.Count; j++)
{
AIVirtualCard aIVirtualCard4 = EnemyInplayCards[j];
float num5 = aIVirtualCard4.EvaluateValueOnField(playPtn, null, useStyle: true, doesUseLostLife: false);
if (num5 > num4)
{
num4 = num5;
aIVirtualCard3 = aIVirtualCard4;
}
}
if (aIVirtualCard3 == null)
{
return 0f;
}
int life = aIVirtualCard3.Life;
if (num2 >= life || attackLimit >= life)
{
return 0f;
}
return num4 - num;
}
public void DrawCard(bool isAlly, int drawCount, List<int> playPtn, AISituationInfo situation)
{
bool num = IsResonance(isAlly);
VirtualDrawCount += drawCount;
if (isAlly)
{
AllyDeckCount -= drawCount;
}
else
{
OpponentDeckCount -= drawCount;
}
if (num || !IsResonance(isAlly))
{
return;
}
AllyTurnResonanceStartCount++;
AllyGameResonanceStartCount++;
if (CardListSet.HasResonanceHolder)
{
List<AIVirtualCard> resonanceTagHolders = CardListSet.ResonanceTagHolders;
for (int i = 0; i < resonanceTagHolders.Count; i++)
{
AIVirtualCard aIVirtualCard = resonanceTagHolders[i];
aIVirtualCard.TagCollectionContainer.ResonanceTags.RegisterPassedConditionTags(isAlly, aIVirtualCard, this, playPtn, situation);
}
}
}
public void AddDeckCard(int tokenId, int tokenCount, AIVirtualCard tagOwner, List<int> playPtn, AISituationInfo situation, bool isPseudo = false)
{
if (tokenId <= 0 || tokenCount <= 0)
{
return;
}
List<DeckVirtualCard> list = null;
AIVirtualCard tokenFromId = AI.tokenManager.GetTokenFromId(tokenId, tagOwner.IsAlly, this);
if (tokenFromId == null)
{
AIConsoleUtility.LogError("AddDeckCard: tokenCard is null");
return;
}
for (int i = 0; i < tokenCount; i++)
{
list = AIParamQuery.AddElementToList(new DeckVirtualCard(tokenFromId.BaseCard, this), list);
}
if (list == null || list.Count <= 0)
{
return;
}
bool isAlly = tagOwner.IsAlly;
List<AIVirtualCard> list2 = (isAlly ? AllyGameAddUpdateDeckCards : EnemyGameAddUpdateDeckCards);
if (isPseudo)
{
for (int j = 0; j < list.Count; j++)
{
list2.Add(list[j]);
}
return;
}
bool flag = IsResonance(isAlly);
for (int k = 0; k < list.Count; k++)
{
DummyDeckContainer.AppendDummyCard(list[k], isAlly);
list2.Add(list[k]);
}
if (flag || !IsResonance(isAlly))
{
return;
}
AllyTurnResonanceStartCount++;
AllyGameResonanceStartCount++;
if (CardListSet.HasResonanceHolder)
{
List<AIVirtualCard> resonanceTagHolders = CardListSet.ResonanceTagHolders;
for (int l = 0; l < resonanceTagHolders.Count; l++)
{
AIVirtualCard aIVirtualCard = resonanceTagHolders[l];
aIVirtualCard.TagCollectionContainer.ResonanceTags.RegisterPassedConditionTags(isAlly, aIVirtualCard, this, playPtn, situation);
}
}
}
public bool IsResonance(bool isAlly)
{
return ((isAlly ? AllyDeckCount : OpponentDeckCount) + DummyDeckContainer.GetDeck(isAlly).Count) % 2 == 0;
}
public bool IsPlagueCity()
{
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
if (CardListSet.BothClassAndInplayCards[i].IsPlagueCity(this, BestPlayPtn))
{
return true;
}
}
return false;
}
public void CallAfterLeaderAttackSimulation()
{
if (this.OnAfterLeaderAttackSimulation != null)
{
this.OnAfterLeaderAttackSimulation.Call();
}
}
public List<AIVirtualCard> GetPlayptnCards(List<int> playPtn)
{
List<AIVirtualCard> list = null;
for (int i = 0; i < playPtn.Count; i++)
{
if (playPtn[i] < AllyHandCards.Count)
{
if (list == null)
{
list = new List<AIVirtualCard>();
}
list.Add(AllyHandCards[playPtn[i]]);
}
}
return list;
}
public List<AIVirtualCard> GetMemberCardList(List<int> playPtn)
{
List<AIVirtualCard> list = new List<AIVirtualCard>(CardListSet.AllyClassAndInplayCards);
List<AIVirtualCard> playptnCards = GetPlayptnCards(playPtn);
if (playptnCards != null && playptnCards.Count > 0)
{
list.AddRange(playptnCards);
}
return list;
}
public List<AIVirtualCard> GetFieldCountCardList(List<int> playPtn)
{
List<AIVirtualCard> list = new List<AIVirtualCard>(AllyInplayCards);
List<AIVirtualCard> playptnCards = GetPlayptnCards(playPtn);
if (playptnCards != null && playptnCards.Count > 0)
{
list.AddRange(playptnCards);
}
return list;
}
public int GetSummonDrunkenAtkMax(AIVirtualCard tagOwner)
{
int num = 0;
foreach (AIVirtualCard item in AI.IsAllyCard(tagOwner) ? AllyInplayCards : EnemyInplayCards)
{
if (item.IsSummonDrunkenness && item.Attack > num)
{
num = item.Attack;
}
}
return num;
}
public List<AIVirtualCard> CreatePlayCardList(List<int> playPtn)
{
List<AIVirtualCard> list = null;
for (int i = 0; i < playPtn.Count; i++)
{
list = AIParamQuery.AddElementToList(AllyHandCards[playPtn[i]], list);
}
return list;
}
public bool IsPlayableHandList(AISinglePlayptnRecord playPtnRecord, List<AIVirtualCard> allySuicideList)
{
int num = 5 - AllyInplayCards.Count();
int num2 = allySuicideList?.Count ?? 0;
List<int> playPtn = playPtnRecord.PlayPtn;
for (int i = 0; i < playPtn.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[playPtn[i]];
int num3 = 0;
AIVirtualTargetSelectAction situation = new AIVirtualTargetSelectAction(aIVirtualCard.FindRealActor(playPtnRecord), aIVirtualCard, AIOperationType.PLAY);
int playSpaceRequired = GetPlaySpaceRequired(aIVirtualCard, playPtn, situation, needsTokenCount: false);
List<AITokenInformation> allySideTokenIdsOfPlaySituation = AIPlayTokenSimulationUtility.GetAllySideTokenIdsOfPlaySituation(this, playPtn, situation);
if (allySideTokenIdsOfPlaySituation != null)
{
num3 = allySideTokenIdsOfPlaySituation.Count;
}
num -= playSpaceRequired;
if (num < 0)
{
num2 -= -num;
if (num2 < 0)
{
return false;
}
num = 0;
}
if (StyleQuery.IsPlayBreak(aIVirtualCard, playPtn, situation))
{
num += playSpaceRequired;
}
num = Mathf.Max(num - num3, 0);
}
return true;
}
public float CalcMinEvaluateValue(List<int> playPtn, bool isAlly)
{
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
if (list.Count <= 0)
{
return 0f;
}
float num = float.MaxValue;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
float num2 = aIVirtualCard.EvaluateValueOnField(aIVirtualCard.IsAlly ? playPtn : EnemyAI.EmptyPlayPtn, null, useStyle: true);
if (num2 < num)
{
num = num2;
}
}
return num;
}
public float CalcMaxEvaluateValue(List<int> playPtn, bool isAlly)
{
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
if (list.Count <= 0)
{
return 0f;
}
float num = float.MinValue;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
float num2 = aIVirtualCard.EvaluateValueOnField(aIVirtualCard.IsAlly ? playPtn : EnemyAI.EmptyPlayPtn, null, useStyle: true);
if (num2 > num)
{
num = num2;
}
}
return num;
}
public int CalculateHandPtnRequiredSpace(AISinglePlayptnRecord playptnRecord)
{
int num = 0;
List<int> playPtn = playptnRecord.PlayPtn;
for (int i = 0; i < playPtn.Count; i++)
{
AIVirtualCard aIVirtualCard = AllyHandCards[playPtn[i]];
AIVirtualTargetSelectAction situation = new AIVirtualTargetSelectAction(aIVirtualCard.FindRealActor(playptnRecord), aIVirtualCard, AIOperationType.PLAY);
num += GetPlaySpaceRequired(aIVirtualCard, playPtn, situation);
}
return num;
}
public int GetPlaySpaceRequired(AIVirtualCard tagOwner, List<int> playPtn, AISituationInfo situation, bool needsTokenCount = true)
{
int num = 0;
if (tagOwner.IsUnit || tagOwner.IsAmulet)
{
num = ((!tagOwner.IsAccelerated(this, playPtn)) ? 1 : 0);
}
if (needsTokenCount)
{
List<AITokenInformation> allySideTokenIdsOfPlaySituation = AIPlayTokenSimulationUtility.GetAllySideTokenIdsOfPlaySituation(this, playPtn, situation);
if (allySideTokenIdsOfPlaySituation != null)
{
num += allySideTokenIdsOfPlaySituation.Count;
}
}
return num;
}
public bool IsEnableIgnoreFanfareBonus(List<int> playPtn)
{
for (int i = 0; i < CardListSet.BothClassAndInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = CardListSet.BothClassAndInplayCards[i];
if (!aIVirtualCard.IsDead && aIVirtualCard.IsEnableIgnoreFanfareBonus(playPtn))
{
return true;
}
}
return false;
}
public bool IsEnemyHasGuard()
{
for (int i = 0; i < EnemyInplayCards.Count; i++)
{
AIVirtualCard aIVirtualCard = EnemyInplayCards[i];
if (aIVirtualCard.IsGuard && !aIVirtualCard.IsSneak && !aIVirtualCard.IsSkillCantUnderAnyAttack)
{
return true;
}
}
return false;
}
public bool isForceImmediateAttack()
{
List<AIVirtualCard> forceImmediateAttackHolders = CardListSet.ForceImmediateAttackHolders;
if (forceImmediateAttackHolders == null || forceImmediateAttackHolders.Count <= 0)
{
return false;
}
for (int i = 0; i < forceImmediateAttackHolders.Count; i++)
{
if (forceImmediateAttackHolders[i].IsForceImmediateAttack(this))
{
return true;
}
}
return false;
}
public bool IsSuccess()
{
if (!AllyClass.IsDead)
{
return EnemyClass.IsDead;
}
return false;
}
public int GetPredictiveAllyFieldSpace()
{
return AI.GetAllySpaceNum() + AI.SpareSpace;
}
public int GetNecromanceCountInGame(AISituationInfo situation, bool isAllyCount)
{
int result = (isAllyCount ? AllyNecromancedCountInGame : EnemyNecromancedCountInGame);
if (situation == null || situation.PreprocessRecorder == null || !situation.PreprocessRecorder.HasRecord)
{
return result;
}
int num = 0;
for (int i = 0; i < situation.PreprocessRecorder.RecordList.Count; i++)
{
AISinglePreprocessRecord aISinglePreprocessRecord = situation.PreprocessRecorder.RecordList[i];
if (aISinglePreprocessRecord.OriginalCard.IsAlly == isAllyCount)
{
num += aISinglePreprocessRecord.NecromanceCount;
}
}
if (num > 0)
{
AIConsoleUtility.LogError("GetNecromanceCountInGame: Unexpected count detected. This func isn't implemented yet.");
}
return result;
}
public void UpdateVirtualFieldWhenEvaluation(AIVirtualCard playCard, AISituationInfo situation)
{
if (playCard.IsSpell || playCard.IsAccelerated(this, null, situation))
{
AIPlayCardSimulationUtility.UpdateFieldWhenEvaluateSpellCard(playCard, this);
}
playCard.ExecuteWhenPlayTagsForEvaluation(this, EnemyAI.EmptyPlayPtn, situation);
if (situation != null && situation.PreprocessRecorder != null && situation.PreprocessRecorder.HasRecord)
{
for (int i = 0; i < situation.PreprocessRecorder.RecordList.Count; i++)
{
AISinglePreprocessRecord aISinglePreprocessRecord = situation.PreprocessRecorder.RecordList[i];
if (aISinglePreprocessRecord.OriginalCard.IsAlly)
{
AllyNecromancedCountInGame += aISinglePreprocessRecord.NecromanceCount;
}
}
}
this.AllActivateCountHolderIncrement(situation, AIPlayTagType.PlayActivateCount, playCard);
IsNoInstantAttackRecheck();
}
public void RegisterBestPlayPtnRecord(AISinglePlayptnRecord record)
{
if (_isPlayptnSimulationField)
{
BestPlayptnRecordOnSim = record;
}
}
public void UpdateBestPlayptnRecordOnSim(List<int> addedHandIndexList)
{
if (_isPlayptnSimulationField)
{
if (addedHandIndexList != null && addedHandIndexList.Count > 0)
{
List<int> list = new List<int>(addedHandIndexList);
list.AddRange(BestPlayPtn);
BestPlayPtn = list;
}
if (!_isCreateTemporaryPlayPtnRecord)
{
BestPlayptnRecordOnSim = CreateTemporaryPlayPtnRecord(BestPlayPtn);
}
else
{
AIConsoleUtility.LogError("CreateTemporaryPlayPtnRecordで無限ループが発生しそうです");
}
}
}
public AISinglePlayptnRecord GetPlayptnRecordOnSim(List<int> playPtn)
{
if (_isPlayptnSimulationField)
{
if (BestPlayptnRecordOnSim != null)
{
if (IsBestPlayPtnRecordAndPlayPtnConsistent(playPtn))
{
return BestPlayptnRecordOnSim;
}
}
else
{
AIConsoleUtility.LogError("AIVirtualField.GetPlayptnRecordOnSim() error!! BestPlayptnRecordOnSim is null!!");
}
if (_isCreateTemporaryPlayPtnRecord)
{
AIConsoleUtility.LogError("CreateTemporaryPlayPtnRecordで無限ループが発生しそうです");
return null;
}
return CreateTemporaryPlayPtnRecord(playPtn);
}
return AI.PlayPtnRecorder.FindMatchedPlayPtnRecord(playPtn, this);
}
private AISinglePlayptnRecord CreateTemporaryPlayPtnRecord(List<int> playPtn)
{
_isCreateTemporaryPlayPtnRecord = true;
AIVirtualFieldRollBackBasicProcessor rollBackProcessor = new AIVirtualFieldRollBackBasicProcessor(this);
AISinglePlayptnRecord aISinglePlayptnRecord = new AISinglePlayptnRecord(playPtn, this, 0);
AIPlayptnRecorder.BuildSinglePlayptnRecord(playPtn, aISinglePlayptnRecord, this, rollBackProcessor);
_isCreateTemporaryPlayPtnRecord = false;
return aISinglePlayptnRecord;
}
private bool IsBestPlayPtnRecordAndPlayPtnConsistent(List<int> playPtn)
{
if (playPtn == null || BestPlayptnRecordOnSim.PlayPtn == null)
{
return false;
}
List<int> playPtn2 = BestPlayptnRecordOnSim.PlayPtn;
if (playPtn.Count != playPtn2.Count)
{
return false;
}
for (int i = 0; i < playPtn.Count; i++)
{
if (playPtn[i] != playPtn2[i])
{
return false;
}
if (playPtn[i] < 0 || AllyHandCards.Count <= playPtn[i])
{
return false;
}
AIVirtualCard aIVirtualCard = AllyHandCards[playPtn[i]];
AIVirtualCard card = BestPlayptnRecordOnSim.PlayedCardList[i].Card;
if (!aIVirtualCard.IsSameCard(card))
{
return false;
}
}
return true;
}
public void ExecuteEarthRite(bool isAlly, int count, AISituationInfo situation, bool isPseudo, AISinglePreprocessRecord record)
{
bool flag = record?.EarthRiteContainer.Any() ?? false;
List<AIVirtualCard> list = (isAlly ? AllyInplayCards : EnemyInplayCards);
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (aIVirtualCard.IsTribe(CardBasePrm.TribeType.WHITE_RITUAL) && !aIVirtualCard.IsDead && aIVirtualCard.WhiteRitualCount > 0)
{
int num = aIVirtualCard.EarthRite(count, situation, isPseudo);
count -= num;
if (!flag)
{
record.AddConsumedEarthRite(aIVirtualCard, num);
}
if (count <= 0)
{
break;
}
}
}
}
public void RemoveAllyHandCard(AIVirtualCard hand, bool isRemoveByPlay = false)
{
int num = AllyHandCards.FindIndex((AIVirtualCard c) => c.IsSameCard(hand));
if (num < 0 || AllyHandCards.Count <= num)
{
AIConsoleUtility.LogError("ExecuteDiscard() error!! " + hand.CardName + " is not found in hand");
return;
}
AllyHandCards.Remove(hand);
CardListSet.RemoveAllyHandCard(hand);
if (BestPlayPtn == null || BestPlayPtn.Count <= 0)
{
return;
}
if (BestPlayPtn.Contains(num))
{
if (!isRemoveByPlay)
{
IsRemovedPlayPtnCard = true;
}
BestPlayPtn.Remove(num);
}
for (int num2 = 0; num2 < BestPlayPtn.Count; num2++)
{
if (BestPlayPtn[num2] > num)
{
BestPlayPtn[num2]--;
}
}
}
public void RemoveEnemyHandCard(AIVirtualCard hand)
{
int num = -1;
List<AIVirtualCard> enemyHandCardList = GetEnemyHandCardList();
for (int i = 0; i < enemyHandCardList.Count; i++)
{
if (hand.IsSameCard(enemyHandCardList[i]))
{
num = i;
break;
}
}
if (num >= 0)
{
enemyHandCardList.RemoveAt(num);
}
}
public void AddCannotPlayInformation(AICannotPlayInformation info)
{
CannotPlayInformationList = AIParamQuery.AddElementToList(info, CannotPlayInformationList);
}
public void RemoveCannotPlayInformation(AIVirtualCard owner, List<AIScriptTokenBase> filters)
{
if (CannotPlayInformationList == null || CannotPlayInformationList.Count <= 0)
{
return;
}
AICannotPlayInformation aICannotPlayInformation = null;
for (int i = 0; i < CannotPlayInformationList.Count; i++)
{
AICannotPlayInformation aICannotPlayInformation2 = CannotPlayInformationList[i];
if (aICannotPlayInformation2.IsEqual(owner, filters))
{
aICannotPlayInformation = aICannotPlayInformation2;
break;
}
}
if (aICannotPlayInformation != null)
{
CannotPlayInformationList.Remove(aICannotPlayInformation);
}
}
public void SetParametersFromOtherField(AIVirtualField otherField)
{
CannotPlayInformationList = otherField.CannotPlayInformationList;
HealRecorderCollection = otherField.HealRecorderCollection;
_playedCardContainer = otherField._playedCardContainer;
}
public ulong GetHash()
{
ulong num = 0uL;
num += (ulong)((long)AllyPp * 97L);
num += (ulong)((long)AllyEvolutionCount * 4441L);
num += (ulong)((long)EnemyEvolutionCount * 1567L);
num += (ulong)((long)VirtualCemetery.GetCemeteryCount(isAlly: true) * 11503L);
num += (ulong)((long)VirtualCemetery.GetCemeteryCount(isAlly: false) * 1949L);
num += (ulong)((long)AllyDeckCount * 13219L);
num += (ulong)((long)OpponentDeckCount * 503L);
num += (ulong)((long)NextTurnLeaderDamage * 5443L);
num += (ulong)((long)EvoHandPlus * 6869L);
num += (ulong)Mathf.Floor(EvoBonus * 1000f) * 253427;
num += (ulong)Mathf.Floor(EpValue * 1000f) * 1215197;
num += (ulong)Mathf.Floor(SimulationExtraBonus * 1000f) * 241;
for (int i = 0; i < AllyHandCards.Count; i++)
{
num += AllyHandCards[i].GetHash() * 1061;
}
for (int j = 0; j < CardListSet.AllyClassAndInplayCards.Count; j++)
{
num += CardListSet.AllyClassAndInplayCards[j].GetHash() * 11299;
}
for (int k = 0; k < CardListSet.EnemyClassAndInplayCards.Count; k++)
{
num += CardListSet.EnemyClassAndInplayCards[k].GetHash() * 307;
}
if (BestPlayPtn != null && BestPlayPtn.Count > 0)
{
for (int l = 0; l < BestPlayPtn.Count; l++)
{
num += PRIME_NUMBERS_FOR_BEST_PLAYPTN[BestPlayPtn[l] % 9];
}
}
return num;
}
public ulong CalculatePlayptnHash(List<int> playPtn)
{
ulong num = 0uL;
for (int i = 0; i < playPtn.Count; i++)
{
int num2 = playPtn[i];
if (num2 >= AllyHandCards.Count)
{
return 0uL;
}
num += AllyHandCards[num2].GetHash();
}
return num;
}
public void InitializeGameStartInnerTags()
{
AI.StyleQuery.ExecuteGameStartAttachTag(this);
if (Data.CurrentFormat == Format.Avatar)
{
EnemyClass.TagCollectionContainer.CreateChoiceBraveTag(EnemyClass);
}
}
}