Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard/AIScriptExpressionCalculator.cs
gamer147 957af3d1ec feat(battle-engine): full Unity/VFX/god-object shims + expanded copy closure (2570 files)
Authored Unity primitive/object-model shim, VFX layer (control-flow-preserving, InstantVfx never invokes its action -- headless suppression), god-object stubs (GameMgr/EffectMgr/UIManager with faithfully-extracted nested enums), View/UI/Touch tree, LitJson+BetterList+Tuple copied, third-party stubs. Discovered Roslyn header-error masking: fixing class-header type errors unmasks body references, so the true copy closure is ~2570 files (was 782 under masking). Errors: masked-25720 -> 268; our shim files compile clean. Remaining: ~50 residual shim/external types, 24 NGUI UI-base overrides, static-type fixes, plus likely 1-2 more unmask waves.
2026-06-05 17:22:20 -04:00

1385 lines
62 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Wizard;
public class AIScriptExpressionCalculator
{
public static float CalculateExpression(List<AIScriptTokenBase> iPolish, List<int> playPtn, AIVirtualField field, AIVirtualCard tagOwner, AISituationInfo situation)
{
if (iPolish == null || iPolish.Count <= 0)
{
return 0f;
}
if (iPolish.Count == 1 && iPolish[0] is AIScriptNumericToken)
{
return iPolish[0].Value;
}
if (playPtn == null)
{
playPtn = EnemyAI.EmptyPlayPtn;
}
return Calculation(iPolish, playPtn, field, tagOwner, situation);
}
private static float Calculation(List<AIScriptTokenBase> expr, List<int> playPtn, AIVirtualField field, AIVirtualCard tagOwner, AISituationInfo situation)
{
Stack<AIScriptTokenBase> stack = new Stack<AIScriptTokenBase>();
int count = expr.Count;
for (int i = 0; i < count; i++)
{
AIScriptTokenBase aIScriptTokenBase = expr[i];
if (aIScriptTokenBase is AIScriptNumericToken || aIScriptTokenBase is AIScriptArgumentToken || aIScriptTokenBase is AIScriptIDToken)
{
stack.Push(aIScriptTokenBase);
}
else if (aIScriptTokenBase is AIScriptVariableToken)
{
AIScriptTokenBase aIScriptTokenBase2 = CalculateVariableToken(aIScriptTokenBase, playPtn, field, tagOwner, situation);
if (aIScriptTokenBase2 != null)
{
stack.Push(aIScriptTokenBase2);
}
}
else if (aIScriptTokenBase is AIScriptFunctionToken)
{
int argCount = ((AIScriptFunctionToken)aIScriptTokenBase).ArgCount;
List<AIScriptTokenBase> list = new List<AIScriptTokenBase>();
for (int j = 0; j < argCount; j++)
{
AIScriptTokenBase item = stack.Pop();
list.Add(item);
}
stack.Push(CalculateFunctionToken(list, aIScriptTokenBase as AIScriptFunctionToken, field, playPtn, tagOwner, situation));
}
else
{
float value = stack.Pop().Value;
float value2 = stack.Pop().Value;
float value3 = CalculateByOperatorSymbol(aIScriptTokenBase.Type, value2, value);
stack.Push(new AIScriptNumericToken(value3));
}
}
if (stack.Count > 1 || stack.Count <= 0)
{
return 0f;
}
return stack.Pop().Value;
}
public static float CalculateByOperatorSymbol(AIScriptTokenType symbol, float left, float right)
{
switch (symbol)
{
case AIScriptTokenType.PLUS:
return left + right;
case AIScriptTokenType.MINUS:
return left - right;
case AIScriptTokenType.MULTI:
return left * right;
case AIScriptTokenType.DIV:
return left / right;
case AIScriptTokenType.REMAIN:
return left % right;
case AIScriptTokenType.MORE_THAN:
if (!(left > right))
{
return 0f;
}
return 1f;
case AIScriptTokenType.MORE_EQUAL:
if (!(left >= right))
{
return 0f;
}
return 1f;
case AIScriptTokenType.LESS_THAN:
if (!(left < right))
{
return 0f;
}
return 1f;
case AIScriptTokenType.LESS_EQUAL:
if (!(left <= right))
{
return 0f;
}
return 1f;
case AIScriptTokenType.EQUAL:
if (left != right)
{
return 0f;
}
return 1f;
case AIScriptTokenType.MAX:
return Mathf.Max(left, right);
case AIScriptTokenType.MIN:
return Mathf.Min(left, right);
case AIScriptTokenType.OR:
if (!(left > 0f) && !(right > 0f))
{
return 0f;
}
return 1f;
case AIScriptTokenType.AND:
if (!(left > 0f) || !(right > 0f))
{
return 0f;
}
return 1f;
default:
return 0f;
}
}
public static AIScriptTokenBase CalculateVariableToken(AIScriptTokenBase token, List<int> playPtn, AIVirtualField field, AIVirtualCard tagOwner, AISituationInfo situation)
{
_ = token is AIScriptVariableToken;
switch (((AIScriptVariableToken)token).VariableType)
{
case AIScriptTokenVariableType.NOW_TURN:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyTurnCount : field.EnemyTurnCount);
case AIScriptTokenVariableType.COUNTDOWN:
return new AIScriptNumericToken(tagOwner.ChantCount);
case AIScriptTokenVariableType.REINCARNATION_MAX:
return new AIScriptNumericToken(AIReincarnationUtility.EvalMaxReincarnationBonus(tagOwner, playPtn));
case AIScriptTokenVariableType.SPELLBOOST:
return new AIScriptNumericToken(tagOwner.SpellboostCount);
case AIScriptTokenVariableType.FIELD_SPACE:
return new AIScriptNumericToken(field.GetPredictiveAllyFieldSpace());
case AIScriptTokenVariableType.ALLY_UNIT_MIN:
return new AIScriptNumericToken(field.CalcMinEvaluateValue(playPtn, isAlly: true));
case AIScriptTokenVariableType.ALLY_UNIT_MAX:
return new AIScriptNumericToken(field.CalcMaxEvaluateValue(playPtn, isAlly: true));
case AIScriptTokenVariableType.ALLY_ATTACKABLE_ATK_MAX:
return new AIScriptNumericToken(field.GetMaxAllyAttackableUnitAttack(playPtn, tagOwner.IsAlly));
case AIScriptTokenVariableType.ALLY_NON_ATTACKABLE_ATK_MAX:
return new AIScriptNumericToken(field.GetMaxAllyNonAttackableUnitAttack(playPtn));
case AIScriptTokenVariableType.ALLY_MAX_ATTACKABLE_LIFE:
return new AIScriptNumericToken(field.GetAllyMaxAttackableLife(tagOwner.IsAlly));
case AIScriptTokenVariableType.ENEMY_UNIT_MIN:
return new AIScriptNumericToken(field.CalcMinEvaluateValue(EnemyAI.EmptyPlayPtn, isAlly: false));
case AIScriptTokenVariableType.ENEMY_UNIT_MAX:
return new AIScriptNumericToken(field.CalcMaxEvaluateValue(EnemyAI.EmptyPlayPtn, isAlly: false));
case AIScriptTokenVariableType.HAND_COUNT_E:
return new AIScriptNumericToken(field.AI.OPPONENT.HandCardList.Count);
case AIScriptTokenVariableType.DECK_COUNT_E:
return new AIScriptNumericToken(field.AI.PlayerPair.Opponent.DeckCardList.Count);
case AIScriptTokenVariableType.PLAYPTN_COUNT:
{
int allPlayedCountInTurn = field.PlayedCardContainer.GetAllPlayedCountInTurn(tagOwner.IsAlly);
if (playPtn != null)
{
return new AIScriptNumericToken(playPtn.Count + allPlayedCountInTurn + AIEvaluateBonusFromOhterUtility.GetPlayPlusCount(field, playPtn));
}
return new AIScriptNumericToken(allPlayedCountInTurn);
}
case AIScriptTokenVariableType.MEMBER_MAX_LIFE:
return new AIScriptNumericToken(field.GetMemberMaxLife(playPtn, tagOwner.IsAlly));
case AIScriptTokenVariableType.MEMBER_ATK_SUM:
return new AIScriptNumericToken(field.GetMemberAtkSum(playPtn, tagOwner.IsAlly));
case AIScriptTokenVariableType.MEMBER_LIFE_SUM:
return new AIScriptNumericToken(field.GetMemberLifeSum(playPtn, tagOwner.IsAlly));
case AIScriptTokenVariableType.INPLAY_ATTACK_SUM_TO_LEADER:
return new AIScriptNumericToken(field.GetInplayAttackSumToLeader(tagOwner.IsAlly));
case AIScriptTokenVariableType.ATTACK_TARGET_ATK_MAX:
return new AIScriptNumericToken(field.GetAttackTargetMaxAtk(tagOwner));
case AIScriptTokenVariableType.SUMMON_DRUNKEN_ATK_MAX:
return new AIScriptNumericToken(field.GetSummonDrunkenAtkMax(tagOwner));
case AIScriptTokenVariableType.ENEMY_MIN_ATK:
return new AIScriptNumericToken(field.GetEnemyInPlayMinAttack());
case AIScriptTokenVariableType.ENEMY_MAX_ATK:
return new AIScriptNumericToken(field.GetEnemyInPlayMaxAttack());
case AIScriptTokenVariableType.ENEMY_ATK_SUM:
return new AIScriptNumericToken(field.GetInplayAttackSumToLeader(isAlly: false));
case AIScriptTokenVariableType.ALLY_INPLAY_MAX_ATK:
return new AIScriptNumericToken(field.GetAllyInplayMaxAttack());
case AIScriptTokenVariableType.GRAVE_COUNT:
return new AIScriptNumericToken(field.VirtualCemetery.GetCemeteryCount(tagOwner.IsAlly));
case AIScriptTokenVariableType.ALLY_MAX_PP:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyPpTotal : field.EnemyPpTotal);
case AIScriptTokenVariableType.ENEMY_MAX_PP:
return new AIScriptNumericToken((!tagOwner.IsAlly) ? field.AllyPpTotal : field.EnemyPpTotal);
case AIScriptTokenVariableType.REST_PP:
return new AIScriptNumericToken((tagOwner != null) ? field.AI.PlayPtnRecorder.GetRestPp(playPtn, field) : 0);
case AIScriptTokenVariableType.NOW_REST_PP:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyPp : field.EnemyPp);
case AIScriptTokenVariableType.ALLY_EP:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyEvolutionCount : field.EnemyEvolutionCount);
case AIScriptTokenVariableType.ENEMY_EP:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.EnemyEvolutionCount : field.AllyEvolutionCount);
case AIScriptTokenVariableType.OWN_ATK:
return new AIScriptNumericToken(tagOwner.Attack);
case AIScriptTokenVariableType.OWN_LIFE:
return new AIScriptNumericToken(tagOwner.Life);
case AIScriptTokenVariableType.OWN_COST:
return new AIScriptNumericToken(tagOwner.Cost);
case AIScriptTokenVariableType.OWN_BASE_ATK:
return new AIScriptNumericToken(tagOwner.DefaultAttack);
case AIScriptTokenVariableType.OWN_BASE_LIFE:
return new AIScriptNumericToken(tagOwner.DefaultLife);
case AIScriptTokenVariableType.KILLER_ATTACK_VALUE:
return new AIScriptNumericToken(tagOwner.EvalKillerAttackValue(playPtn, situation));
case AIScriptTokenVariableType.ENHANCE_COST:
return new AIScriptNumericToken(AIEnhanceUtility.GetEnhanceCost(tagOwner, field, playPtn));
case AIScriptTokenVariableType.PLAY_ACTOR_ENHANCE_COST:
if (situation == null || situation.ActionType != AIOperationType.PLAY || situation.Actor == null)
{
return new AIScriptNumericToken(-1f);
}
return new AIScriptNumericToken(AIEnhanceUtility.GetEnhanceCost(situation.Actor, field, playPtn));
case AIScriptTokenVariableType.ACCELERATE_COST:
return new AIScriptNumericToken(AIAccelerateUtility.GetAccelerateCost(tagOwner, field, playPtn));
case AIScriptTokenVariableType.CHOICE_TRANSFORM_COST:
return new AIScriptNumericToken(tagOwner.GetChoiceTransformCost(field, playPtn));
case AIScriptTokenVariableType.BASE_SKILL_COUNT:
return new AIScriptNumericToken(tagOwner.GetBaseSkillCount());
case AIScriptTokenVariableType.LAST_LIFE:
return new AIScriptNumericToken(tagOwner.LastLife);
case AIScriptTokenVariableType.MAX_ATTACKABLE_COUNT:
return new AIScriptNumericToken(tagOwner.MaxAttackableCount);
case AIScriptTokenVariableType.HAND_MIN_COST:
if (tagOwner != null && !tagOwner.IsAlly)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(field.GetHandMinCost(tagOwner));
case AIScriptTokenVariableType.HAND_MAX_COST:
if (!tagOwner.IsAlly)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(field.GetHandMaxCost(tagOwner));
case AIScriptTokenVariableType.UNION_BURST_COUNT:
{
int num3 = 0;
if (tagOwner.HasUnionBurst)
{
num3 = tagOwner.UnionBurstCount;
}
return new AIScriptNumericToken(num3);
}
case AIScriptTokenVariableType.CONSUME_EP:
return new AIScriptNumericToken((!tagOwner.IsNotConsumeEp) ? 1 : 0);
case AIScriptTokenVariableType.LAST_HEAL_AMOUNT:
return new AIScriptNumericToken(tagOwner.LastHealAmount);
case AIScriptTokenVariableType.JUST_BEFORE_TURN_DAMAGE:
return new AIScriptNumericToken(field.JustBeforeTurnLeaderDamage);
case AIScriptTokenVariableType.RALLY_COUNT:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyRallyCount : field.EnemyRallyCount);
case AIScriptTokenVariableType.SKYBOUND_ART_COUNT:
{
int num2 = 0;
if (tagOwner.HasSkyboundArt)
{
num2 = tagOwner.SkyboundArtCount;
}
return new AIScriptNumericToken(num2);
}
case AIScriptTokenVariableType.SUPER_SKYBOUND_ART_COUNT:
{
int num = 0;
if (tagOwner.HasSuperSkyboundArt)
{
num = tagOwner.SuperSkyboundArtCount;
}
return new AIScriptNumericToken(num);
}
case AIScriptTokenVariableType.USED_EP_COUNT:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.UsedEpCount : 0);
case AIScriptTokenVariableType.USED_PP_COUNT:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.UsedPpCount : 0);
case AIScriptTokenVariableType.EARTH_RITE_COUNT:
return new AIScriptNumericToken(AIGetPreprocessInformationUtility.GetEarthRiteCount(tagOwner, situation));
case AIScriptTokenVariableType.NECROMANCE_COUNT:
return new AIScriptNumericToken(AIGetPreprocessInformationUtility.GetNecromanceCount(tagOwner, situation));
case AIScriptTokenVariableType.USED_STACK_COUNT:
return new AIScriptNumericToken(tagOwner.IsAlly ? field.AllyGameUsedStackCount : field.EnemyGameUsedStackCount);
case AIScriptTokenVariableType.DEFAULT_DAMAGE:
return new AIScriptNumericToken(situation.GetCurrentProcessDefaultDamage());
case AIScriptTokenVariableType.NEXT_PLAY_PRIORITY:
{
AISinglePlayptnRecord bestPlayPtnRecord = field.AI.BestPlayPtnRecord;
if (bestPlayPtnRecord == null)
{
AIConsoleUtility.LogError("NEXT_PLAY_PRIORITY: BestPlayPtnRecord is null! Wrong use timing.");
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(bestPlayPtnRecord.FirstPlayCardPriority);
}
case AIScriptTokenVariableType.NECROMANCED_COUNT_IN_GAME:
return new AIScriptNumericToken(field.GetNecromanceCountInGame(situation, tagOwner.IsAlly));
case AIScriptTokenVariableType.IS_EVO_TURN:
return new AIScriptNumericToken((field.AI.ALLY.EvolveWaitTurnCount <= 0) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ABLE_EVO:
return new AIScriptNumericToken(tagOwner.IsAbleEvolution() ? 1f : 0f);
case AIScriptTokenVariableType.IS_F_ADV:
return new AIScriptNumericToken((field.AI.FieldAdvantage >= 0f) ? 1f : 0f);
case AIScriptTokenVariableType.IS_F_DISADV:
return new AIScriptNumericToken((field.AI.FieldAdvantage < 0f) ? 1f : 0f);
case AIScriptTokenVariableType.IS_AWAKE:
return new AIScriptNumericToken(SkillConditionAwake.IsAwake(tagOwner.IsAlly ? field.AllyPpTotal : field.EnemyPpTotal) ? 1f : 0f);
case AIScriptTokenVariableType.IS_BERSERK:
return new AIScriptNumericToken(AIBerserkUtility.IsToBeBerserk(field, null, situation, tagOwner.IsAlly) ? 1f : 0f);
case AIScriptTokenVariableType.IS_TO_BE_BERSERK:
return new AIScriptNumericToken(AIBerserkUtility.IsToBeBerserk(field, playPtn, situation, tagOwner.IsAlly) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ON_FIELD:
return new AIScriptNumericToken(tagOwner.IsOnField ? 1f : 0f);
case AIScriptTokenVariableType.IS_IN_HAND:
return new AIScriptNumericToken(tagOwner.IsInHand ? 1f : 0f);
case AIScriptTokenVariableType.IS_IN_PLAYPTN:
return new AIScriptNumericToken(playPtn.Contains(field.AllyHandCards.FindIndex((AIVirtualCard c) => c.CardIndex == tagOwner.CardIndex)) ? 1f : 0f);
case AIScriptTokenVariableType.IS_OWNER_TURN:
return new AIScriptNumericToken(tagOwner.IsSelfTurn ? 1f : 0f);
case AIScriptTokenVariableType.IS_ALLY:
return new AIScriptNumericToken(tagOwner.IsAlly ? 1f : 0f);
case AIScriptTokenVariableType.IS_ENEMY:
return new AIScriptNumericToken(tagOwner.IsAlly ? 0f : 1f);
case AIScriptTokenVariableType.IS_ALLY_FIRST:
return new AIScriptNumericToken(field.AI.IsAllyFirst ? 1f : 0f);
case AIScriptTokenVariableType.IS_SNEAK:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.SNEAK, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_KILLER:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.KILLER, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_MEDUSA:
return new AIScriptNumericToken(tagOwner.IsDestroyWhenAttack ? 1f : 0f);
case AIScriptTokenVariableType.IS_EVOLVED:
return new AIScriptNumericToken((tagOwner.IsUseEvo || tagOwner.IsEvolution) ? 1f : 0f);
case AIScriptTokenVariableType.IS_EVOLVING:
return new AIScriptNumericToken(tagOwner.IsUseEvo ? 1f : 0f);
case AIScriptTokenVariableType.IS_GUARD:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.GUARD, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_RUSH:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.RUSH, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_PLAYOUT_ATTACKER:
return new AIScriptNumericToken(AttackSelectControl.IsAttackPossible(tagOwner, tagOwner.SelfField.EnemyClass, tagOwner.BaseCard.OpponentBattlePlayer) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ENHANCED:
return new AIScriptNumericToken(tagOwner.IsEnhanced(field, playPtn, situation) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ACCELERATE:
return new AIScriptNumericToken(tagOwner.IsAccelerated(field, playPtn, situation) ? 1f : 0f);
case AIScriptTokenVariableType.IS_CRYSTALIZE:
return new AIScriptNumericToken(tagOwner.IsCrystalize(field, playPtn, situation) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ATTACK_LEADER:
if (situation != null && situation is AIVirtualAttackInfo aIVirtualAttackInfo)
{
return new AIScriptNumericToken((aIVirtualAttackInfo.AttackTarget != null && aIVirtualAttackInfo.AttackTarget.IsLeader) ? 1f : 0f);
}
return new AIScriptNumericToken(0f);
case AIScriptTokenVariableType.IS_FANFARE:
return new AIScriptNumericToken(field.IsEnableIgnoreFanfareBonus(playPtn) ? 0f : 1f);
case AIScriptTokenVariableType.IS_SKILL_REMOVED:
return new AIScriptNumericToken(tagOwner.IsSkillLost ? 1f : 0f);
case AIScriptTokenVariableType.IS_BARBAROSSA:
return new AIScriptNumericToken(field.AI.IsOpponentBarbarossaDestroyed ? 1f : 0f);
case AIScriptTokenVariableType.IS_RESONANCE:
return new AIScriptNumericToken(field.IsResonance(tagOwner.IsAlly) ? 1f : 0f);
case AIScriptTokenVariableType.IS_LETHAL:
return new AIScriptNumericToken(field.AI.IsLethal(tagOwner, field, playPtn, situation) ? 1f : 0f);
case AIScriptTokenVariableType.IS_USED_EVO:
return new AIScriptNumericToken(field.AI.ALLY.NowTurnEvol ? 0f : 1f);
case AIScriptTokenVariableType.IS_FIRST_TURN:
return new AIScriptNumericToken(tagOwner.IsFirstTurn ? 1f : 0f);
case AIScriptTokenVariableType.IS_DAMAGED:
return new AIScriptNumericToken((tagOwner.MaxLife - tagOwner.Life > 0) ? 1f : 0f);
case AIScriptTokenVariableType.IS_DELAY_HEAL:
return new AIScriptNumericToken(tagOwner.IsDelayHeal(field, situation) ? 1f : 0f);
case AIScriptTokenVariableType.IS_NOT_ATTACK_YET:
return new AIScriptNumericToken(tagOwner.IsNotAttackYet ? 1f : 0f);
case AIScriptTokenVariableType.IS_LEADER:
return new AIScriptNumericToken(tagOwner.IsLeader ? 1f : 0f);
case AIScriptTokenVariableType.IS_GET_ON:
return new AIScriptNumericToken(tagOwner.IsGetOn ? 1f : 0f);
case AIScriptTokenVariableType.IS_SKILL_SUMMONED:
return new AIScriptNumericToken((tagOwner.IsOnField && tagOwner.IsSkillSummoned) ? 1f : 0f);
case AIScriptTokenVariableType.IS_UNTOUCHABLE:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.UNTOUCHABLE, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_FORCE_TARGETING:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.FORCE_TARGETING, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_QUICK:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.QUICK, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_NOT_BE_ATTACKED:
return new AIScriptNumericToken(((situation != null && situation.ActionType == AIOperationType.ATTACK) ? tagOwner.IsCantUnderAttack(field.ParamQuery, situation.Actor, playPtn, field) : tagOwner.IsCantUnderAnyAttack()) ? 1f : 0f);
case AIScriptTokenVariableType.IS_IN_SIMULATION:
return new AIScriptNumericToken(field.AI.IsInVirutalSimulation ? 1f : 0f);
case AIScriptTokenVariableType.IS_IGNORE_GUARD:
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(tagOwner, AIScriptTokenArgType.IGNORE_GUARD, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
case AIScriptTokenVariableType.IS_ATTACKED:
return new AIScriptNumericToken(tagOwner.IsAttacked ? 1f : 0f);
case AIScriptTokenVariableType.IS_ONEMORELASTWORD_TAGGED:
return new AIScriptNumericToken(AIOneMoreLastwordUtility.IsHoldingOneMoreLastword(tagOwner, field) ? 1f : 0f);
case AIScriptTokenVariableType.IS_DRAIN:
return new AIScriptNumericToken(tagOwner.IsDrain ? 1f : 0f);
default:
return null;
}
}
public static AIScriptTokenBase CalculateFunctionToken(List<AIScriptTokenBase> argList, AIScriptFunctionToken funcToken, AIVirtualField field, List<int> playPtn, AIVirtualCard tagOwner, AISituationInfo situation)
{
if (argList.Count != funcToken.ArgCount)
{
return null;
}
AIVirtualCard aIVirtualCard = null;
AIVirtualCard aIVirtualCard2 = null;
if (situation is AIVirtualAttackInfo aIVirtualAttackInfo)
{
aIVirtualCard2 = aIVirtualAttackInfo.AttackTarget;
aIVirtualCard = ((situation.Actor.IsAlly != tagOwner.IsAlly) ? aIVirtualAttackInfo.Actor : aIVirtualAttackInfo.AttackTarget);
}
switch (funcToken.FuncType)
{
case AIScriptTokenFuncType.MEMBER_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(field.GetFieldCountCardList(playPtn), argList, tagOwner, playPtn, situation)?.Count ?? 0);
case AIScriptTokenFuncType.POW:
{
float value2 = argList[1].Value;
float value3 = argList[0].Value;
return new AIScriptNumericToken(Mathf.Pow(value2, value3));
}
case AIScriptTokenFuncType.CEILING:
return new AIScriptNumericToken(Mathf.Ceil(argList[0].Value));
case AIScriptTokenFuncType.FLOOR:
return new AIScriptNumericToken(Mathf.Floor(argList[0].Value));
case AIScriptTokenFuncType.EVAL_RANDOM_MULTI_DAMAGE:
{
argList.Reverse();
AIRandomMultiDamageEvaluator.CreateEvalRandomDamageArgList(argList, out var filters, out var damage6, out var count6);
return new AIScriptNumericToken(AIRandomMultiDamageEvaluator.EvaluateRandomDamageAverage(tagOwner, field, playPtn, situation, filters, damage6, count6));
}
case AIScriptTokenFuncType.EVAL_RANDOM_MULTI_DAMAGE_MAX:
{
argList.Reverse();
AIRandomMultiDamageEvaluator.CreateEvalRandomDamageArgList(argList, out var filters2, out var damage7, out var count7);
return new AIScriptNumericToken(AIRandomMultiDamageEvaluator.EvaluateRandomDamageMax(tagOwner, field, playPtn, filters2, situation, damage7, count7));
}
case AIScriptTokenFuncType.EVAL_INSTANT_ATTACK:
{
int attack2 = (int)argList[2].Value;
int life2 = (int)argList[1].Value;
int count5 = (int)argList[0].Value;
return new AIScriptNumericToken(AIInstantAttackUtility.EvalInstantAttack(attack2, life2, count5, playPtn, tagOwner, situation));
}
case AIScriptTokenFuncType.EVAL_RUSH:
{
int attack = (int)argList[2].Value;
int life = (int)argList[1].Value;
int count4 = (int)argList[0].Value;
bool isRush = true;
return new AIScriptNumericToken(AIInstantAttackUtility.EvalInstantAttack(attack, life, count4, playPtn, tagOwner, situation, isRush));
}
case AIScriptTokenFuncType.INPLAY_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(field.CardListSet.BothInplayCards, argList, tagOwner, playPtn, situation)?.Count ?? 0);
case AIScriptTokenFuncType.PLAYOUT_ATTACKER_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIPlayoutAttackerCountUtility.GetPlayoutAttackerCount(field, tagOwner, playPtn, argList, situation));
case AIScriptTokenFuncType.BEFORE_PLAYPTN_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIPlayPtnUtility.GetBeforePlayPtnCount(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.PLAY_TOKEN_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIPlayTokenSimulationUtility.GetPlayTokenCount(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.EVO_COUNT_IN_GAME:
return new AIScriptNumericToken(field.GetEvolutionCountInGame(tagOwner, ((AIScriptArgumentToken)argList[0]).ArgumentType));
case AIScriptTokenFuncType.EVO_COUNT_IN_PREVIOUS_TURN:
return new AIScriptNumericToken(field.GetEvolutionCountInPreviousTurn(tagOwner, ((AIScriptArgumentToken)argList[0]).ArgumentType));
case AIScriptTokenFuncType.HAND_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIHandCountUtility.GetHandCount(field, argList, tagOwner, situation, playPtn));
case AIScriptTokenFuncType.HAND_NAME_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIHandCountUtility.GetHandNameCount(field, argList, tagOwner, situation, playPtn));
case AIScriptTokenFuncType.SKILL_COUNT_FROM_ID:
{
int iD6 = ((AIScriptIDToken)argList[0]).ID;
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(AISkillCountFromIdUtility.GetSkillCountFromID(argList, iD6, tagOwner, playPtn, situation));
}
case AIScriptTokenFuncType.TAG_COUNT_FROM_ID:
{
int iD5 = ((AIScriptIDToken)argList[0]).ID;
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(AITagCountFromIdUtility.GetTagCountFromId(tagOwner, iD5, argList, field, playPtn, situation));
}
case AIScriptTokenFuncType.EVAL_CHANT_COUNT_CHANGE:
{
int amount2 = (int)argList[0].Value;
return new AIScriptNumericToken(AICountdownChangeUtility.EvalChantCountChange(tagOwner, amount2, playPtn, isSelect: true, situation));
}
case AIScriptTokenFuncType.EVAL_CHANT_COUNT_CHANGE_ALL:
{
int amount = (int)argList[0].Value;
return new AIScriptNumericToken(AICountdownChangeUtility.EvalChantCountChange(tagOwner, amount, playPtn, isSelect: false, situation));
}
case AIScriptTokenFuncType.EVAL_ALL_DAMAGE:
{
List<AIScriptTokenBase> list19 = new List<AIScriptTokenBase>();
for (int num25 = argList.Count - 1; num25 > 0; num25--)
{
list19.Add(argList[num25]);
}
int damage8 = (int)argList[0].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalMultiAllDamage(tagOwner, field, list19, playPtn, situation, damage8, 1));
}
case AIScriptTokenFuncType.EVAL_TARGETING_DAMAGE:
{
List<AIScriptTokenBase> list12 = new List<AIScriptTokenBase>();
for (int num18 = argList.Count - 1; num18 > 0; num18--)
{
list12.Add(argList[num18]);
}
int damage3 = (int)argList[0].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalTargetingDamage(tagOwner, field, list12, playPtn, situation, damage3));
}
case AIScriptTokenFuncType.EVAL_TARGETING_AND_RANDOM_MULTI_DAMAGE:
{
if (argList.Count < 5)
{
return new AIScriptNumericToken(0f);
}
new List<AIScriptTokenBase>();
int num12 = 0;
argList.Reverse();
for (int num13 = 1; num13 < argList.Count; num13++)
{
if (argList[num13] is AIScriptNumericToken)
{
num12 = num13;
break;
}
}
List<AIScriptTokenBase> range3 = argList.GetRange(0, num12);
List<AIScriptTokenBase> range4 = argList.GetRange(num12 + 1, argList.Count - num12 - 3);
int targetDamage = (int)argList[num12].Value;
int randomDamage = (int)argList[argList.Count - 2].Value;
int randomDamageCount = (int)argList[argList.Count - 1].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalTargetingDamageAndRandomMultiSelectDamage(tagOwner, field, range3, range4, playPtn, situation, targetDamage, randomDamage, randomDamageCount));
}
case AIScriptTokenFuncType.EVAL_ALL_MULTI_DAMAGE:
{
List<AIScriptTokenBase> list2 = new List<AIScriptTokenBase>();
for (int num3 = argList.Count - 2; num3 > 0; num3--)
{
list2.Add(argList[num3]);
}
int damage = (int)argList[1].Value;
int damageCount = (int)argList[0].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalMultiAllDamage(tagOwner, field, list2, playPtn, situation, damage, damageCount));
}
case AIScriptTokenFuncType.EVAL_ALL_DESTROY:
argList.Reverse();
return new AIScriptNumericToken(AIDestroySimulationUtility.EvalAllDestroy(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.EVAL_TARGETING_DESTROY:
argList.Reverse();
return new AIScriptNumericToken(AIDestroySimulationUtility.EvalTargetingDestroy(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.EVAL_TARGETING_OTHER_DESTROY:
{
AIScriptTokenBase aIScriptTokenBase = argList[0];
argList.RemoveAt(0);
int select_count = 0;
if (aIScriptTokenBase is AIScriptNumericToken)
{
select_count = (int)(aIScriptTokenBase as AIScriptNumericToken).Value;
}
argList.Reverse();
int num4 = 0;
int num5 = 1;
while (argList != null && num5 < argList.Count)
{
if (argList != null && argList.Count > 0 && argList[num5] is AIScriptArgumentToken aIScriptArgumentToken6 && aIScriptArgumentToken6.IsSideArgType())
{
num4 = num5;
}
num5++;
}
List<AIScriptTokenBase> range = argList.GetRange(0, num4);
List<AIScriptTokenBase> range2 = argList.GetRange(num4, argList.Count - num4);
return new AIScriptNumericToken(AIDestroySimulationUtility.EvalTargetingOtherDestroy(range, range2, tagOwner, playPtn, situation, select_count));
}
case AIScriptTokenFuncType.EVAL_TARGETING_MULTI_DESTROY:
{
int num29 = 0;
if (argList[0] is AIScriptNumericToken aIScriptNumericToken2)
{
num29 = (int)aIScriptNumericToken2.Value;
}
if (num29 == 0)
{
return new AIScriptNumericToken(0f);
}
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(AIDestroySimulationUtility.EvalTargetingMultiDestroy(argList, num29, tagOwner, playPtn, situation));
}
case AIScriptTokenFuncType.EVAL_ALL_BOUNCE:
argList.Reverse();
return new AIScriptNumericToken(field?.EvalAllBounce(argList, tagOwner, playPtn) ?? 0f);
case AIScriptTokenFuncType.EVAL_TARGETING_BOUNCE:
argList.Reverse();
return new AIScriptNumericToken(field?.EvalTargetingBounce(argList, tagOwner, playPtn) ?? 0f);
case AIScriptTokenFuncType.EVAL_TARGETING_BANISH:
argList.Reverse();
return new AIScriptNumericToken((field != null) ? AIBanishSimulationUtility.EvalTargetingBanish(argList, playPtn, field, tagOwner, situation) : 0f);
case AIScriptTokenFuncType.EVAL_RANDOM_BANISH:
{
int count3 = (int)argList[0].Value;
List<AIScriptTokenBase> list5 = new List<AIScriptTokenBase>();
for (int num9 = argList.Count - 1; num9 > 0; num9--)
{
list5.Add(argList[num9]);
}
return new AIScriptNumericToken((field != null) ? AIBanishSimulationUtility.EvalRandomBanish(list5, tagOwner, field, playPtn, count3, situation) : 0f);
}
case AIScriptTokenFuncType.EVAL_ALL_BANISH:
argList.Reverse();
return new AIScriptNumericToken(AIBanishSimulationUtility.EvalAllBanish(argList, tagOwner, field, playPtn, situation));
case AIScriptTokenFuncType.EVAL_RANDOM_DESTROY:
{
int count2 = (int)argList[0].Value;
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(AIDestroySimulationUtility.EvalRandomDestroy(argList, count2, tagOwner, playPtn, situation));
}
case AIScriptTokenFuncType.EVAL_RANDOM_BOUNCE:
{
int count = (int)argList[0].Value;
argList.Reverse();
return new AIScriptNumericToken(field?.EvalRandomBounce(argList.GetRange(0, argList.Count - 1), tagOwner, field, playPtn, count) ?? 0f);
}
case AIScriptTokenFuncType.EVAL_TARGETING_HEAL:
{
List<AIScriptTokenBase> list4 = new List<AIScriptTokenBase>();
for (int num7 = argList.Count - 1; num7 > 0; num7--)
{
list4.Add(argList[num7]);
}
int heal2 = (int)argList[0].Value;
return new AIScriptNumericToken(AIHealSimulationUtility.EvalTargetingHeal(tagOwner, list4, playPtn, heal2));
}
case AIScriptTokenFuncType.EVAL_ALL_HEAL:
{
List<AIScriptTokenBase> list3 = new List<AIScriptTokenBase>();
for (int num6 = argList.Count - 1; num6 > 0; num6--)
{
list3.Add(argList[num6]);
}
int heal = (int)argList[0].Value;
return new AIScriptNumericToken(AIHealSimulationUtility.EvalAllHeal(tagOwner, list3, playPtn, heal));
}
case AIScriptTokenFuncType.EVAL_TARGETING_METAMORPHOSE:
{
List<AIScriptTokenBase> list = new List<AIScriptTokenBase>();
for (int num2 = argList.Count - 1; num2 > 0; num2--)
{
list.Add(argList[num2]);
}
float value = 0f;
if (argList[0] is AIScriptIDToken)
{
int iD = ((AIScriptIDToken)argList[0]).ID;
value = AIMetamorphoseSimulationUtility.EvalTargetingMetamorphose(tagOwner, field, list, iD, playPtn, situation);
}
return new AIScriptNumericToken(value);
}
case AIScriptTokenFuncType.EVAL_RANDOM_METAMORPHOSE:
{
if (argList.Count < 2)
{
return new AIScriptNumericToken(0f);
}
List<AIScriptTokenBase> list18 = new List<AIScriptTokenBase>();
for (int num24 = argList.Count - 1; num24 > 1; num24--)
{
list18.Add(argList[num24]);
}
int count8 = (int)argList[0].Value;
float value6 = 0f;
if (argList[1] is AIScriptIDToken)
{
int iD4 = ((AIScriptIDToken)argList[1]).ID;
value6 = AIMetamorphoseSimulationUtility.EvalRandomMetamorphose(tagOwner, field, list18, iD4, playPtn, count8, situation);
}
return new AIScriptNumericToken(value6);
}
case AIScriptTokenFuncType.EVAL_ALL_METAMORPHOSE:
{
List<AIScriptTokenBase> list17 = new List<AIScriptTokenBase>();
for (int num23 = argList.Count - 1; num23 > 0; num23--)
{
list17.Add(argList[num23]);
}
float value5 = 0f;
if (argList[0] is AIScriptIDToken)
{
int iD3 = ((AIScriptIDToken)argList[0]).ID;
value5 = AIMetamorphoseSimulationUtility.EvalAllMetamorphose(tagOwner, field, list17, iD3, playPtn, situation);
}
return new AIScriptNumericToken(value5);
}
case AIScriptTokenFuncType.EVAL_ALL_BUFF:
return new AIScriptNumericToken(AIBuffEvaluationUtility.EvalAllBuff(tagOwner, field, argList, playPtn, situation));
case AIScriptTokenFuncType.EVAL_RANDOM_BUFF:
return new AIScriptNumericToken(AIBuffEvaluationUtility.EvalRandomBuff(tagOwner, field, argList, playPtn, situation));
case AIScriptTokenFuncType.EVAL_TARGETING_BUFF:
return new AIScriptNumericToken(AIBuffEvaluationUtility.EvalTargetingBuff(tagOwner, field, argList, playPtn, situation));
case AIScriptTokenFuncType.EVAL_ECHO_DAMAGE:
{
List<AIScriptTokenBase> list11 = new List<AIScriptTokenBase>();
for (int num17 = argList.Count - 1; num17 > 0; num17--)
{
list11.Add(argList[num17]);
}
int damage2 = (int)argList[0].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalEchoDamage(tagOwner, field, list11, damage2, playPtn, situation));
}
case AIScriptTokenFuncType.EVAL_LEADER_DAMAGE:
{
int damageAmount = (int)argList[0].Value;
AIScriptTokenArgType argumentType3 = ((AIScriptArgumentToken)argList[1]).ArgumentType;
AIVirtualCard aIVirtualCard4 = null;
switch (argumentType3)
{
case AIScriptTokenArgType.ENEMY_CLASS:
aIVirtualCard4 = (tagOwner.IsAlly ? field.EnemyClass : field.AllyClass);
break;
case AIScriptTokenArgType.ALLY_CLASS:
aIVirtualCard4 = (tagOwner.IsAlly ? field.AllyClass : field.EnemyClass);
break;
default:
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(AILeaderLifeEvaluationUtility.Evaluate(aIVirtualCard4.Life - aIVirtualCard4.SimulateDamageAmount(damageAmount, isSkillDamage: true, tagOwner.IsSpell), aIVirtualCard4.Life, aIVirtualCard4.IsAlly, tagOwner.IsAlly));
}
case AIScriptTokenFuncType.EVAL_LEADER_HEAL:
{
int originalHealValue = (int)argList[0].Value;
AIScriptTokenArgType argumentType4 = ((AIScriptArgumentToken)argList[1]).ArgumentType;
AIVirtualCard aIVirtualCard5 = null;
switch (argumentType4)
{
case AIScriptTokenArgType.ENEMY_CLASS:
aIVirtualCard5 = (tagOwner.IsAlly ? field.EnemyClass : field.AllyClass);
break;
case AIScriptTokenArgType.ALLY_CLASS:
aIVirtualCard5 = (tagOwner.IsAlly ? field.AllyClass : field.EnemyClass);
break;
}
if (aIVirtualCard5 == null || aIVirtualCard5.Life <= 0)
{
return new AIScriptNumericToken(0f);
}
originalHealValue = AIHealSimulationUtility.CalcHealModifier(aIVirtualCard5, playPtn, situation, originalHealValue);
return new AIScriptNumericToken(AILeaderLifeEvaluationUtility.Evaluate(Mathf.Min(aIVirtualCard5.Life + originalHealValue, aIVirtualCard5.MaxLife), aIVirtualCard5.Life, aIVirtualCard5.IsAlly, tagOwner.IsAlly));
}
case AIScriptTokenFuncType.DECK_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIDeckSimulationUtility.GetFilteredDeck(argList, tagOwner, field, playPtn, situation)?.Count ?? 0);
case AIScriptTokenFuncType.IS_CLASH_TARGET:
if (aIVirtualCard == null)
{
return new AIScriptNumericToken(0f);
}
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard, null, argList, playPtn, tagOwner, situation) ? 1f : 0f);
case AIScriptTokenFuncType.IS_ATTACK_TARGET:
{
if (aIVirtualCard2 == null)
{
return new AIScriptNumericToken(0f);
}
AIScriptArgumentToken obj = (AIScriptArgumentToken)argList[0];
AIScriptTokenArgType argumentType2 = obj.ArgumentType;
_ = obj.IsNot;
return new AIScriptNumericToken(AISkillSimulationUtility.HasSkill(aIVirtualCard2, argumentType2, tagOwner.SelfField.AI, playPtn) ? 1f : 0f);
}
case AIScriptTokenFuncType.IS_SELECTED_TARGET:
{
AIScriptTokenArgType aIScriptTokenArgType2 = AIScriptTokenArgType.NONE;
if (argList[0] is AIScriptArgumentToken aIScriptArgumentToken10)
{
aIScriptTokenArgType2 = aIScriptArgumentToken10.ArgumentType;
}
if (aIScriptTokenArgType2 != AIScriptTokenArgType.TARGET_SELECT && aIScriptTokenArgType2 != AIScriptTokenArgType.SECOND_TARGET_SELECT)
{
return new AIScriptNumericToken(0f);
}
AISelectedTargetInfo situationTarget = situation.GetSituationTarget(aIScriptTokenArgType2);
if (situationTarget == null || !situationTarget.HasTarget)
{
return new AIScriptNumericToken(0f);
}
argList.RemoveAt(0);
argList.Reverse();
List<AIVirtualCard> targets = situationTarget.Targets;
bool flag = false;
for (int num26 = 0; num26 < targets.Count; num26++)
{
if (AIFilteringUtility.CheckMatchTargetFiltering(targets[num26], null, argList, playPtn, tagOwner, situation))
{
flag = true;
break;
}
}
return new AIScriptNumericToken(flag ? 1f : 0f);
}
case AIScriptTokenFuncType.IS_NEXT_PLAY:
if (playPtn == null || playPtn.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.CheckMatchTargetFiltering(field.AllyHandCards[playPtn[0]], field.AllyHandCards, argList, playPtn, tagOwner, situation) ? 1 : 0);
case AIScriptTokenFuncType.LIFE:
argList.Reverse();
return new AIScriptNumericToken(AIGetStatusUtility.GetLife(tagOwner, field, playPtn, situation, argList));
case AIScriptTokenFuncType.ATTACK:
argList.Reverse();
return new AIScriptNumericToken(AIGetStatusUtility.GetAttack(tagOwner, field, playPtn, situation, argList));
case AIScriptTokenFuncType.EVAL_RANDOM_MULTI_SELECT_DAMAGE:
{
List<AIScriptTokenBase> list16 = new List<AIScriptTokenBase>();
for (int num20 = argList.Count - 1; num20 > 0; num20--)
{
list16.Add(argList[num20]);
}
int damage5 = (int)argList[0].Value;
int selectCount = (int)argList[1].Value;
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalRandomMultiSelectDamage(tagOwner, field, list16, playPtn, situation, damage5, selectCount));
}
case AIScriptTokenFuncType.EVAL_DIVIDED_DAMAGE:
{
AIScriptTokenBase aIScriptTokenBase4 = argList[0];
int damage4 = (int)aIScriptTokenBase4.Value;
argList.Remove(aIScriptTokenBase4);
argList.Reverse();
List<AIVirtualCard> candidates = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothClassAndInplayCards, argList, tagOwner, playPtn, situation);
return new AIScriptNumericToken(AIDamageSimulationUtility.EvalOldestDamage(tagOwner, candidates, field, damage4, playPtn, situation));
}
case AIScriptTokenFuncType.DECK_NAME_COUNT:
{
argList.Reverse();
List<AIVirtualCard> filteredDeck2 = AIDeckSimulationUtility.GetFilteredDeck(argList, tagOwner, field, playPtn, situation);
return new AIScriptNumericToken((filteredDeck2 != null) ? AIFilteringUtility.GetCardNameCountFromList(filteredDeck2, argList, tagOwner, playPtn, situation) : 0);
}
case AIScriptTokenFuncType.BROKEN_COUNT:
{
float num10 = 0f;
AIScriptTokenBase aIScriptTokenBase2 = argList[0];
int num11 = (int)aIScriptTokenBase2.Value;
if (num11 == 142)
{
argList.Remove(aIScriptTokenBase2);
}
argList.Reverse();
List<AIVirtualCard> list6 = AIFilteringUtility.MultipleFiltering(tagOwner.IsAlly ? field.CardListSet.AllyDestroyedCards : field.CardListSet.EnemyDestroyedCards, argList, tagOwner, playPtn, null, isBlockDeadCard: false);
if (num11 == 142)
{
if (list6 != null)
{
foreach (AIVirtualCard item in list6)
{
if (item.DeadTurn)
{
num10 += 1f;
}
}
}
return new AIScriptNumericToken(num10);
}
num10 = ((list6 != null) ? ((float)list6.Count) : 0f);
return new AIScriptNumericToken(num10);
}
case AIScriptTokenFuncType.BROKEN_NAME_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.GetCardNameCountFromList(tagOwner.IsAlly ? field.CardListSet.AllyDestroyedCards : field.CardListSet.EnemyDestroyedCards, argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.BROKEN_COST_SUM:
argList.Reverse();
return new AIScriptNumericToken(AIBrokenCostSumUtility.GetBrokenCostSum(field, tagOwner, argList, playPtn, situation));
case AIScriptTokenFuncType.LEAVE_NAME_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.GetCardNameCountFromList(tagOwner.IsAlly ? field.CardListSet.AllyLeftCards : field.CardListSet.EnemyLeftCards, argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.LEAVE_COUNT:
{
AIScriptTokenBase aIScriptTokenBase5 = argList[0];
int num30 = (int)aIScriptTokenBase5.Value;
if (num30 == 142)
{
argList.Remove(aIScriptTokenBase5);
}
argList.Reverse();
List<AIVirtualCard> targets2 = ((num30 != 142) ? (tagOwner.IsAlly ? field.CardListSet.AllyLeftCards : field.CardListSet.EnemyLeftCards) : (tagOwner.IsAlly ? field.CardListSet.AllyLeftCardsThisTurn : field.CardListSet.EnemyLeftCardsThisTurn));
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(targets2, argList, tagOwner, playPtn, situation, isBlockDeadCard: false)?.Count ?? 0);
}
case AIScriptTokenFuncType.DESTROYED_COUNT:
{
AIScriptIDToken aIScriptIDToken2 = argList[0] as AIScriptIDToken;
float num27 = 0f;
if (aIScriptIDToken2 != null)
{
int iD7 = aIScriptIDToken2.ID;
foreach (AIVirtualCard enemyDestroyedCard in field.CardListSet.EnemyDestroyedCards)
{
if (!enemyDestroyedCard.IsUnit)
{
continue;
}
List<BattleCardBase.DestroyedBySkillInfo> destroyedBySkillList = enemyDestroyedCard.BaseCard.DestroyedBySkillList;
for (int num28 = 0; num28 < destroyedBySkillList.Count; num28++)
{
if (destroyedBySkillList.ElementAt(num28).BaseCardId == iD7)
{
num27 += 1f;
}
}
}
}
return new AIScriptNumericToken(num27);
}
case AIScriptTokenFuncType.IS_TRIBE:
{
AIScriptTokenArgType argumentType6 = ((AIScriptArgumentToken)argList[0]).ArgumentType;
return new AIScriptNumericToken(tagOwner.IsTribe(argumentType6) ? 1f : 0f);
}
case AIScriptTokenFuncType.PLAYED_COUNT:
argList.Reverse();
return new AIScriptNumericToken(field.PlayedCardContainer.GetPlayedCountInTurn(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.PLAYED_COUNT_IN_GAME:
argList.Reverse();
return new AIScriptNumericToken(field.PlayedCardContainer.GetPlayedCountInGame(argList, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.PLAYED_COUNT_IN_PREVIOUS_TURN:
argList.Reverse();
if (argList[0] is AIScriptArgumentToken aIScriptArgumentToken9 && aIScriptArgumentToken9.IsSideArgType(includeBoth: false))
{
bool isAllyList = tagOwner.IsAlly == (aIScriptArgumentToken9.ArgumentType == AIScriptTokenArgType.ALLY);
return new AIScriptNumericToken(field.PlayedCardContainer.GetPlayedCountInPreviousTurn(isAllyList, argList, tagOwner, playPtn, situation));
}
AIConsoleUtility.LogError("PLAYED_COUNT_IN_PREVIOUS_TURN error!! side parameter is missing");
return new AIScriptNumericToken(0f);
case AIScriptTokenFuncType.PLAYED_NAME_COUNT:
{
AIScriptTokenArgType turnOrGame = AIScriptTokenArgType.NONE;
if (argList[0] is AIScriptArgumentToken aIScriptArgumentToken8)
{
turnOrGame = aIScriptArgumentToken8.ArgumentType;
}
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(field.PlayedCardContainer.GetPlayedNameCount(argList, turnOrGame, tagOwner, playPtn, situation));
}
case AIScriptTokenFuncType.RANDOM:
{
if (argList[0].Value == 0f)
{
return new AIScriptNumericToken(0f);
}
int num21 = field.AI.ALLY.DeckCardList.Count;
for (int num22 = 0; num22 < field.AllyHandCards.Count; num22++)
{
num21 += field.AllyHandCards[num22].BaseCost;
}
return new AIScriptNumericToken((float)num21 % argList[0].Value);
}
case AIScriptTokenFuncType.IS_REANIMATE:
{
int cost = (int)argList[0].Value;
return new AIScriptNumericToken(AIReanimateSimulationUtility.IsReanimate(tagOwner, cost) ? 1f : 0f);
}
case AIScriptTokenFuncType.DAMAGE_COUNT:
{
argList.Reverse();
AIScriptTokenArgType argumentType5 = ((AIScriptArgumentToken)argList[0]).ArgumentType;
if (argumentType5 != AIScriptTokenArgType.TURN && argumentType5 != AIScriptTokenArgType.GAME)
{
return new AIScriptNumericToken(0f);
}
int num19 = 0;
if (argList.Count == 1)
{
num19 = AIPlayerLifeSimulationUtility.GetAllSelfTurnDamageCount(tagOwner, field, playPtn, argumentType5);
}
else
{
switch (((AIScriptArgumentToken)argList[1]).ArgumentType)
{
case AIScriptTokenArgType.PLAYED:
num19 = AIPlayerLifeSimulationUtility.GetSelfTurnDamageCountAtPlayed(tagOwner, field, playPtn, argumentType5);
break;
case AIScriptTokenArgType.PLAYPTN:
num19 = AIPlayerLifeSimulationUtility.GetSelfTurnDamageCountAtPlayPtn(tagOwner, field, playPtn);
break;
case AIScriptTokenArgType.BEFORE_PLAYPTN:
num19 = AIPlayerLifeSimulationUtility.GetSelfTurnDamageCountAtBeforePlayPtn(tagOwner, field, playPtn, argumentType5);
break;
}
}
return new AIScriptNumericToken(num19);
}
case AIScriptTokenFuncType.HEAL_COUNT:
return new AIScriptNumericToken(AIHealCountUtility.GetHealCount(tagOwner, field, situation, playPtn, argList));
case AIScriptTokenFuncType.FORCED_EXCHANGE:
{
int attackLimit = (int)argList[0].Value;
return new AIScriptNumericToken(field.EvalForcedExchangeVirtual(attackLimit, playPtn));
}
case AIScriptTokenFuncType.TOTAL_DAMAGE:
return new AIScriptNumericToken(field.GetTotalDamage(argList, tagOwner, situation));
case AIScriptTokenFuncType.EVAL_REANIMATE:
return new AIScriptNumericToken(AIEvalReanimateUtility.EvalReanimate(tagOwner, playPtn, situation, argList));
case AIScriptTokenFuncType.FUSION_COUNT:
return new AIScriptNumericToken(AIFusionCountUtility.GetFusionCount(tagOwner, argList, playPtn, situation));
case AIScriptTokenFuncType.NOW_FUSION_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIFusionCountUtility.GetNowFusionCount(tagOwner, argList, playPtn));
case AIScriptTokenFuncType.FUSION_COUNT_AT_ONCE:
return new AIScriptNumericToken(AIFusionCountUtility.GetFusionCountAtOnce(tagOwner, argList, playPtn, situation));
case AIScriptTokenFuncType.FUSION_NAME_COUNT:
return new AIScriptNumericToken(AIFusionCountUtility.GetFusionNameCount(tagOwner, argList, playPtn, situation));
case AIScriptTokenFuncType.IS_SKILL_OCCURRED:
return new AIScriptNumericToken(tagOwner.IsSkillOccurred(field, playPtn, situation, argList) ? 1f : 0f);
case AIScriptTokenFuncType.SKILL_ACTIVATE_COUNT:
return new AIScriptNumericToken(tagOwner.GetSkillActivateCount(field, playPtn, situation, argList));
case AIScriptTokenFuncType.HAND_MAX_ATTACK:
{
argList.Reverse();
argList.Add(new AIScriptArgumentToken(AIScriptTokenArgType.MAX_ATTACK, isNot: false));
List<AIVirtualCard> list9 = AIFilteringUtility.MultipleFiltering(field.AllyHandCards, argList, tagOwner, playPtn, situation);
if (list9 == null || list9.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(list9[0].Attack);
}
case AIScriptTokenFuncType.DECK_MAX_COST:
{
argList.Reverse();
List<AIVirtualCard> filteredDeck = AIDeckSimulationUtility.GetFilteredDeck(argList, tagOwner, field, playPtn, situation);
if (filteredDeck == null || filteredDeck.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(filteredDeck.Max((AIVirtualCard c) => c.BaseCost));
}
case AIScriptTokenFuncType.INPLAY_LARGEST_LIFE:
{
argList.Reverse();
List<AIVirtualCard> list7 = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothInplayCards, argList, tagOwner, playPtn, situation);
if (list7 == null || list7.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(list7.Max((AIVirtualCard c) => c.Life));
}
case AIScriptTokenFuncType.LEADER_MAX_LIFE:
{
if (!(argList[0] is AIScriptArgumentToken aIScriptArgumentToken5))
{
return new AIScriptNumericToken(0f);
}
AIVirtualCard aIVirtualCard3 = null;
if (aIScriptArgumentToken5.ArgumentType == AIScriptTokenArgType.OPPONENT)
{
aIVirtualCard3 = (tagOwner.IsAlly ? field.EnemyClass : field.AllyClass);
}
else if (aIScriptArgumentToken5.ArgumentType == AIScriptTokenArgType.ALLY)
{
aIVirtualCard3 = (tagOwner.IsAlly ? field.AllyClass : field.EnemyClass);
}
if (aIVirtualCard3 == null)
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(aIVirtualCard3.MaxLife);
}
case AIScriptTokenFuncType.IS_DISCARD_TARGET:
argList.Reverse();
return new AIScriptNumericToken(AIDiscardUtility.IsMatchedDiscardTarget(tagOwner, argList, playPtn, situation) ? 1f : 0f);
case AIScriptTokenFuncType.DISCARD_COUNT:
if (!(argList[0] is AIScriptArgumentToken aIScriptArgumentToken2))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(AIDiscardUtility.GetDiscardCount(aIScriptArgumentToken2.ArgumentType, tagOwner, playPtn, situation));
case AIScriptTokenFuncType.BOUNCE_COUNT:
if (argList[0] is AIScriptArgumentToken { ArgumentType: var argumentType })
{
return new AIScriptNumericToken(AIBounceSimulationUtility.GetBounceCount(field, situation, argumentType));
}
return new AIScriptNumericToken(0f);
case AIScriptTokenFuncType.EMOTE_PLAY_COUNT:
{
int category = (int)argList[0].Value;
return new AIScriptNumericToken(field.AI.EmoteMng.GetEmotePlayCount(category));
}
case AIScriptTokenFuncType.DRAW_COUNT:
return GetDrawCountResultToken(argList, tagOwner, field, playPtn);
case AIScriptTokenFuncType.MEMBER_MAX_ATK:
argList.Reverse();
return new AIScriptNumericToken(field.GetMemberMaxAttack(tagOwner, argList, playPtn, situation));
case AIScriptTokenFuncType.IS_BURIAL_RITE:
argList.Reverse();
return new AIScriptNumericToken(AIBurialUtility.IsBurialRite(situation, argList, field) ? 1f : 0f);
case AIScriptTokenFuncType.BURIAL_COUNT:
if (!(argList[0] is AIScriptArgumentToken aIScriptArgumentToken13))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(AIBurialRiteSimulationUtility.GetBurialCount(aIScriptArgumentToken13.ArgumentType, field));
case AIScriptTokenFuncType.RESONANCE_START_COUNT:
if (!(argList[0] is AIScriptArgumentToken aIScriptArgumentToken11) || !(argList[1] is AIScriptArgumentToken aIScriptArgumentToken12))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(GetResonanceStartCount(tagOwner, field, aIScriptArgumentToken12.ArgumentType, aIScriptArgumentToken11.ArgumentType));
case AIScriptTokenFuncType.SUMMON_COUNT:
{
if (!AISummonCountUtility.ClassificateSummonCountArgument(argList, out var filters3, out var turnOrGame2, out var playedType))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(AISummonCountUtility.GetSummonCount(tagOwner, filters3, turnOrGame2, playedType, playPtn, situation));
}
case AIScriptTokenFuncType.BUFF_COUNT:
return new AIScriptNumericToken(AIBuffCountUtility.GetBuffCount(tagOwner, field, situation, playPtn, argList));
case AIScriptTokenFuncType.IS_HOLDING_BATTLE_SKILL:
if (!(argList[0] is AIScriptTextToken aIScriptTextToken2))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(tagOwner.IsHoldingBattleSkill(aIScriptTextToken2.Text) ? 1 : 0);
case AIScriptTokenFuncType.IS_LEADER_HOLDING_BATTLE_SKILL:
if (!(argList[0] is AIScriptTextToken aIScriptTextToken))
{
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(field.AllyClass.IsHoldingBattleSkill(aIScriptTextToken.Text) ? 1 : 0);
case AIScriptTokenFuncType.STACK_COUNT:
{
if (argList.Count <= 0 || !(argList[0] is AIScriptArgumentToken aIScriptArgumentToken7))
{
return new AIScriptNumericToken(0f);
}
if (aIScriptArgumentToken7.ArgumentType != AIScriptTokenArgType.ALLY && aIScriptArgumentToken7.ArgumentType != AIScriptTokenArgType.OPPONENT)
{
return new AIScriptNumericToken(0f);
}
bool isAlly = tagOwner.IsAlly ^ (aIScriptArgumentToken7.ArgumentType == AIScriptTokenArgType.OPPONENT);
return new AIScriptNumericToken(AIStackCountUtility.GetStackCount(field, isAlly));
}
case AIScriptTokenFuncType.OWN_DESTROY_COUNT:
{
List<AIVirtualCard> ownDestroyedCards = situation.GetOwnDestroyedCards();
if (ownDestroyedCards == null)
{
return new AIScriptNumericToken(0f);
}
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(ownDestroyedCards, argList, tagOwner, playPtn, situation, isBlockDeadCard: false)?.Count ?? 0);
}
case AIScriptTokenFuncType.IS_SELECTABLE:
{
float value4 = argList[0].Value;
argList.RemoveAt(0);
argList.Reverse();
return new AIScriptNumericToken(AIIsSelectableUtility.IsSelectable(argList, value4, tagOwner, field, playPtn, situation) ? 1 : 0);
}
case AIScriptTokenFuncType.IS_ENEMY_AI_ID:
return new AIScriptNumericToken((argList[0].Value == (float)EnemyAI.EnemyAIID) ? 1f : 0f);
case AIScriptTokenFuncType.ADD_HAND_COUNT:
{
AIScriptTokenBase aIScriptTokenBase3 = argList[0];
AIScriptTokenArgType aIScriptTokenArgType = (AIScriptTokenArgType)aIScriptTokenBase3.Value;
if (aIScriptTokenArgType != AIScriptTokenArgType.TURN && aIScriptTokenArgType != AIScriptTokenArgType.GAME)
{
AIConsoleUtility.LogError("ADD_HAND_COUNT Arg Error : Last arg is only valid TURN or GAME");
return new AIScriptNumericToken(0f);
}
argList.Remove(aIScriptTokenBase3);
argList.Reverse();
List<AIVirtualCard> list13 = new List<AIVirtualCard>();
switch (aIScriptTokenArgType)
{
case AIScriptTokenArgType.TURN:
{
List<AIVirtualCard> list15 = (tagOwner.IsAlly ? field.AllyTurnHandAddedCards : field.EnemyTurnHandAddedCards);
if (list15 != null && list15.Count > 0)
{
list13.AddRange(list15);
}
break;
}
case AIScriptTokenArgType.GAME:
{
List<AIVirtualCard> list14 = (tagOwner.IsAlly ? field.AllyGameHandAddedCards : field.EnemyGameHandAddedCards);
if (list14 != null && list14.Count > 0)
{
list13.AddRange(list14);
}
break;
}
}
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(list13, argList, tagOwner, playPtn, situation)?.Count ?? 0);
}
case AIScriptTokenFuncType.BASE_COST:
{
argList.Reverse();
List<AIVirtualCard> list10 = AIFilteringUtility.MultipleFiltering(field.CardListSet.AllReferableCards, argList, tagOwner, playPtn, situation, isBlockDeadCard: false);
if (list10 == null || list10.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
if (list10.Count > 1)
{
AIConsoleUtility.LogError("BASE_COST Func : Error!!! Multiple cards have been selected");
}
return new AIScriptNumericToken(list10[0].BaseCost);
}
case AIScriptTokenFuncType.RECEIVED_DAMAGE_SUM:
{
argList.Reverse();
List<AIVirtualCard> list8 = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothClassAndInplayCards, argList, tagOwner, playPtn, situation);
if (list8 == null || list8.Count <= 0)
{
return new AIScriptNumericToken(0f);
}
float num14 = 0f;
for (int num15 = 0; num15 < field.DamagedCardsByLastAction.Count; num15++)
{
Tuple<AIVirtualCard, int> tuple = field.DamagedCardsByLastAction[num15];
for (int num16 = 0; num16 < list8.Count; num16++)
{
AIVirtualCard card = list8[num16];
if (tuple.first.IsSameCard(card))
{
num14 += (float)tuple.second;
}
}
}
return new AIScriptNumericToken(num14);
}
case AIScriptTokenFuncType.IS_PLAYER_CHARA_ID:
if (argList == null || argList.Count <= 0)
{
AIConsoleUtility.LogError("IS_PLAYER_CHARA_ID error!! argList is invalid");
return new AIScriptNumericToken(0f);
}
if (argList[0] is AIScriptNumericToken aIScriptNumericToken)
{
int num8 = (int)aIScriptNumericToken.Value;
return new AIScriptNumericToken((field.AI.PlayerCharaId == num8) ? 1f : 0f);
}
return new AIScriptNumericToken(0f);
case AIScriptTokenFuncType.FUSION_COUNT_IN_GAME:
argList.Reverse();
return new AIScriptNumericToken(AIFusionCountUtility.GetFusedCardCountInGame(tagOwner, argList, playPtn, situation, isWithoutSameId: false));
case AIScriptTokenFuncType.FUSION_NAME_COUNT_IN_GAME:
argList.Reverse();
return new AIScriptNumericToken(AIFusionCountUtility.GetFusedCardCountInGame(tagOwner, argList, playPtn, situation, isWithoutSameId: true));
case AIScriptTokenFuncType.IS_PLAYER_ABILITY_ID:
if (argList != null && argList.Count > 0 && argList[0] is AIScriptIDToken { ID: var iD2 })
{
return new AIScriptNumericToken(field.AI.HasPlayerAbilityId(iD2) ? 1f : 0f);
}
return new AIScriptNumericToken(0f);
case AIScriptTokenFuncType.BANISH_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIBanishSimulationUtility.GetInplayBanishedCount(tagOwner, field, playPtn, situation, argList));
case AIScriptTokenFuncType.HAND_BANISH_COUNT:
argList.Reverse();
return new AIScriptNumericToken(AIBanishSimulationUtility.GetHandBanishedCount(tagOwner, field, playPtn, situation, argList));
case AIScriptTokenFuncType.IS_BOTH_CLASS:
{
if (argList == null || argList.Count <= 1)
{
AIConsoleUtility.LogError("IS_BOTH_CLASS error!! arg count is not enough");
return new AIScriptNumericToken(0f);
}
argList.Reverse();
CardBasePrm.ClanType clanType = CardBasePrm.ClanType.NONE;
CardBasePrm.ClanType clanType2 = CardBasePrm.ClanType.NONE;
if (argList[0] is AIScriptArgumentToken aIScriptArgumentToken3 && aIScriptArgumentToken3.IsSideArgType(includeBoth: false))
{
bool num = tagOwner.IsAlly == (aIScriptArgumentToken3.ArgumentType == AIScriptTokenArgType.ALLY);
clanType = (num ? field.AllyClass.Clan : field.EnemyClass.Clan);
clanType2 = (num ? field.AI.AISubClassType : field.AI.PlayerSubClassType);
for (int i = 1; i < argList.Count; i++)
{
if (argList[i] is AIScriptArgumentToken aIScriptArgumentToken4)
{
CardBasePrm.ClanType clanType3 = AIPlayTagInitializingUtility.ConvertTokenArgTypeToClanType(aIScriptArgumentToken4.ArgumentType);
if (clanType3 != CardBasePrm.ClanType.NONE && (clanType == clanType3 || clanType2 == clanType3))
{
return new AIScriptNumericToken(1f);
}
}
}
return new AIScriptNumericToken(0f);
}
AIConsoleUtility.LogError("IS_BOTH_CLASS error!! side parameter is invalid");
return new AIScriptNumericToken(0f);
}
case AIScriptTokenFuncType.EVAL_ATTACK_REMOVE:
return new AIScriptNumericToken(AIEvalAttackRemoveUtility.EvalAttackRemove(tagOwner, field, playPtn, situation, argList));
case AIScriptTokenFuncType.ADDED_DECK_COUNT_IN_GAME:
argList.Reverse();
return new AIScriptNumericToken(AIFilteringUtility.MultipleFiltering(tagOwner.IsAlly ? field.AllyGameAddUpdateDeckCards : field.EnemyGameAddUpdateDeckCards, argList, tagOwner, playPtn, situation)?.Count ?? 0);
default:
return new AIScriptNumericToken(0f);
}
}
private static int GetResonanceStartCount(AIVirtualCard tagOwner, AIVirtualField field, AIScriptTokenArgType side, AIScriptTokenArgType gameOrTurn)
{
if (side != AIScriptTokenArgType.ALLY)
{
_ = 85;
}
if (gameOrTurn != AIScriptTokenArgType.GAME)
{
_ = 142;
}
if ((side == AIScriptTokenArgType.ALLY && tagOwner.IsAlly) || (side == AIScriptTokenArgType.OPPONENT && !tagOwner.IsAlly))
{
if (gameOrTurn == AIScriptTokenArgType.GAME)
{
return field.AllyGameResonanceStartCount;
}
return field.AllyTurnResonanceStartCount;
}
if (gameOrTurn == AIScriptTokenArgType.GAME)
{
return field.EnemyGameResonanceStartCount;
}
return field.EnemyTurnResonanceStartCount;
}
private static AIScriptNumericToken GetDrawCountResultToken(List<AIScriptTokenBase> argList, AIVirtualCard owner, AIVirtualField field, List<int> playPtn)
{
if (argList.Count <= 0 || argList.Count > 2)
{
AIConsoleUtility.LogError("DRAW_COUNT error!! argList.Count == " + argList.Count);
return new AIScriptNumericToken(0f);
}
AIScriptTokenArgType aIScriptTokenArgType = AIScriptTokenArgType.NONE;
AIScriptTokenArgType range = AIScriptTokenArgType.NONE;
if (argList[argList.Count - 1] is AIScriptArgumentToken aIScriptArgumentToken)
{
aIScriptTokenArgType = aIScriptArgumentToken.ArgumentType;
}
if (argList.Count > 1 && argList[argList.Count - 2] is AIScriptArgumentToken aIScriptArgumentToken2)
{
range = aIScriptArgumentToken2.ArgumentType;
}
if (aIScriptTokenArgType != AIScriptTokenArgType.TURN && aIScriptTokenArgType != AIScriptTokenArgType.GAME)
{
AIConsoleUtility.LogError("DRAW_COUNT error!!! period == " + aIScriptTokenArgType);
return new AIScriptNumericToken(0f);
}
return new AIScriptNumericToken(AIDrawCountUtility.GetDrawCount(owner, field, playPtn, aIScriptTokenArgType, range));
}
}