using System.Collections.Generic; namespace Wizard; public class AIWhenPlayHandBuff : AIWhenPlayTagArgument { private AIPolishConvertedExpression _attackBuff; private AIPolishConvertedExpression _lifeBuff; private const int ATK_BUFF_ARG_OFFSET = 2; private const int LIFE_BUFF_ARG_OFFSET = 1; protected override int SELECT_TYPE_OFFSET => 3; public AIWhenPlayHandBuff(string text) : base(text) { } protected override void InitExpressions(string text) { base.InitExpressions(text); _attackBuff = _exprList[_exprList.Count - 2]; _lifeBuff = _exprList[_exprList.Count - 1]; } protected override List GetCandidateRange(AIVirtualField field) { return field.GetSimulationHandCards(); } protected override void CreateLegalSelectTypes() { base.LegalSelectTypes = new AIScriptTokenArgType[3] { AIScriptTokenArgType.ALL_SELECT, AIScriptTokenArgType.RANDOM_SELECT, AIScriptTokenArgType.TARGET_SELECT }; } public override TargetSelectType GetTargetSelectType() { return TargetSelectType.NormalRuleBase; } public override List GetTargetsFromField(AIVirtualCard owner, AIVirtualField field, List playPtn, AISituationInfo situation, bool isBlockDead = true) { List candidateRange = GetCandidateRange(field); return GetFilteredTargets(candidateRange, owner, playPtn, situation, isBlockDead); } public override List GetFilteredTargets(List candidates, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation, bool isBlockDead = true) { List filteredTargets = base.GetFilteredTargets(candidates, tagOwner, playPtn, situation, isBlockDead); filteredTargets?.RemoveAll((AIVirtualCard c) => !c.IsInHand || c.IsSameCard(tagOwner) || !c.IsUnit); return filteredTargets; } public override void Execute(AIVirtualCard tagOwner, AIVirtualField field, List playPtn, AISituationInfo situation = null) { List targetsFromField = GetTargetsFromField(tagOwner, field, playPtn, situation); if (targetsFromField != null && targetsFromField.Count > 0) { AIBuffExecutingInfo_old buffExecutingInfo_old = AIBuffSimulationUtility.GetBuffExecutingInfo_old(tagOwner, field, situation, playPtn, _attackBuff, _lifeBuff); switch (base.SelectType) { case AIScriptTokenArgType.ALL_SELECT: AIHandBuffSimulationUtility.ExecuteHandBuffAll(targetsFromField, buffExecutingInfo_old, situation); break; case AIScriptTokenArgType.RANDOM_SELECT: AIHandBuffSimulationUtility.ExecuteHandBuffRandom(targetsFromField, buffExecutingInfo_old, playPtn, situation); break; case AIScriptTokenArgType.TARGET_SELECT: ExecuteTargetSelectHandBuff(targetsFromField, buffExecutingInfo_old, situation); break; } } } public override void RegisterRuleBaseTargets(List candidates, AIVirtualCard actor, AIVirtualField field, AIVirtualTargetSelectAction situation, ref List targetList) { base.RegisterRuleBaseTargets(candidates, actor, field, situation, ref targetList); AIVirtualCard aIVirtualCard = AIHandBuffSimulationUtility.SelectHandBuffTarget(candidates, AISelectTargetPattern.Best, EnemyAI.EmptyPlayPtn, situation); if (aIVirtualCard != null) { targetList = AIParamQuery.AddElementToList(aIVirtualCard, targetList); } } private void ExecuteTargetSelectHandBuff(List candidates, AIBuffExecutingInfo_old buffInfo, AISituationInfo situation) { if (situation != null && situation.IsTargetExists(base.SelectType)) { AIHandBuffSimulationUtility.ExecuteHandBuffTargetSelect(buffInfo, base.SelectType, situation); } else { AIHandBuffSimulationUtility.ExecuteHandBuffBestTarget(candidates, buffInfo, situation); } } }