using System.Collections.Generic; namespace Wizard; public class AIOtherEvoDamage : AIOtherEvoTagArgument { private AIPolishConvertedExpression _damage; private AIPolishConvertedExpression _count; private const int DAMAGE_ARG_OFFSET = 2; private const int COUNT_ARG_OFFSET = 1; protected override int SELECT_TYPE_ARG_OFFSET => 3; public AIOtherEvoDamage(string text) : base(text) { } protected override void InitExpressions(string text) { base.InitExpressions(text); _damage = _exprList[_exprList.Count - 2]; _count = _exprList[_exprList.Count - 1]; } public override bool IsTargetGoingToDie(AIVirtualCard owner, AIVirtualCard candidate, AISituationInfo situation) { if (candidate.IsIndependent) { return false; } AIVirtualField selfField = owner.SelfField; List bestPlayPtn = selfField.BestPlayPtn; if (!IsCertainlyIncludeTarget(owner, candidate, situation)) { return false; } int damage = GetDamage(owner, selfField, bestPlayPtn, situation); int count = GetCount(owner, selfField, bestPlayPtn, situation); return candidate.SimulateDamageAmount(damage, isSkillDamage: true, owner.IsSpell) * count >= candidate.Life; } protected override void RunTagMethod(List targets, AIVirtualField field, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation) { base.RunTagMethod(targets, field, tagOwner, playPtn, situation); if (targets == null || targets.Count <= 0) { return; } int damage = GetDamage(tagOwner, field, playPtn, situation); int count = GetCount(tagOwner, field, playPtn, situation); switch (base.SelectType) { case AIScriptTokenArgType.ALL_SELECT: { for (int j = 0; j < count; j++) { AIDamageSimulationUtility.DamageAll(targets, tagOwner, field, damage, situation); } break; } case AIScriptTokenArgType.RANDOM_SELECT: { for (int i = 0; i < count; i++) { AIDamageSimulationUtility.DamageRandom(targets, tagOwner, field, damage, situation); } break; } } } public override AIRemovalType GetRemovalType() { return AIRemovalType.Damage; } private int GetDamage(AIVirtualCard tagOwner, AIVirtualField field, List playPtn, AISituationInfo situation) { if (_damage == null) { AIConsoleUtility.LogError("AIOtherEvoDamage error!! _damage is null"); return 0; } return (int)_damage.EvalArg(tagOwner, playPtn, field, situation); } private int GetCount(AIVirtualCard tagOwner, AIVirtualField field, List playPtn, AISituationInfo situation) { if (_count == null) { AIConsoleUtility.LogError("AIOtherEvoDamage error!! _count is null"); return 0; } return (int)_count.EvalArg(tagOwner, playPtn, field, situation); } }