using System.Collections.Generic; using System.Linq; namespace Wizard; public static class AIDestroySimulationUtility { public static float CalcEvalDestroy(AIVirtualCard card, List playPtn, AISituationInfo situation, bool useIgnoreBreak) { return (card.EvaluateValueOnField(playPtn, situation, useStyle: true, doesUseLostLife: true, useOthersTag: true, useIgnoreBreak) - card.GetAllBreakBonus(playPtn, useIgnoreBreak) - card.GetAllLeaveBonus(playPtn, useIgnoreBreak)) * (card.IsAlly ? (-1f) : 1f); } public static float EvalTargetingDestroy(List filters, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation) { List list = AIFilteringUtility.MultipleFiltering(tagOwner.SelfField.CardListSet.BothInplayCards, filters, tagOwner, playPtn, situation); if (list == null || list.Count <= 0) { return 0f; } list = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(list, tagOwner, playPtn); int num = 0; float num2 = float.MinValue; for (int i = 0; i < list.Count; i++) { AIVirtualCard aIVirtualCard = list[i]; if (aIVirtualCard.IsAlly == tagOwner.IsAlly || (!aIVirtualCard.IsUntouchable && !aIVirtualCard.IsSneak)) { num++; float num3 = 0f; if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsIndestructible) { num3 = CalcEvalDestroy(aIVirtualCard, playPtn, situation, useIgnoreBreak: false); } if (num3 > num2) { num2 = num3; } } } if (num == 0) { num2 = 0f; } return num2; } public static float EvalTargetingOtherDestroy(List target_filters, List destroy_filters, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation, int select_count) { AIVirtualField selfField = tagOwner.SelfField; List list = AIFilteringUtility.MultipleFiltering(selfField.CardListSet.BothInplayCards, target_filters, tagOwner, playPtn, situation); if (list == null || list.Count <= 0) { return 0f; } List list2 = null; List list3 = new List(); for (int i = 0; i < list.Count; i++) { AIVirtualCard aIVirtualCard = list[i]; if (aIVirtualCard.IsUntouchable || aIVirtualCard.IsSneak) { if (list2 == null) { list2 = new List(); } list2.Add(aIVirtualCard); bool flag = AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard, selfField.AllyHandCards, destroy_filters, playPtn, tagOwner, situation); if (aIVirtualCard.IsIndependent || aIVirtualCard.IsIndestructible || !flag) { list3.Add(0f); continue; } float item = CalcEvalDestroy(aIVirtualCard, playPtn, situation, useIgnoreBreak: false); list3.Add(item); } } if (list2 != null && list.Count - list2.Count < select_count) { return 0f; } List list4 = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(list, tagOwner, playPtn); List list5 = null; for (int j = 0; j < list4.Count; j++) { if (list5 == null) { list5 = new List(); } AIVirtualCard aIVirtualCard2 = list4[j]; bool flag2 = AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard2, selfField.AllyHandCards, destroy_filters, playPtn, tagOwner, situation); if (aIVirtualCard2.IsIndependent || aIVirtualCard2.IsIndestructible || !flag2) { list5.Add(0f); continue; } float item2 = CalcEvalDestroy(aIVirtualCard2, playPtn, situation, useIgnoreBreak: false); list5.Add(item2); } list5?.Sort((float score0, float score1) => (int)(score1 - score0)); List list6 = new List(); for (int num = 0; num < list.Count; num++) { int num2 = 0; for (num2 = 0; num2 < list4.Count; num2++) { if (list[num].Equals(list4[num2])) { num2 = 99999999; break; } } int num3 = 0; num3 = 0; while (list2 != null && num3 < list2.Count) { if (list[num].Equals(list2[num3])) { num3 = 99999999; break; } num3++; } if (num2 != 99999999 && num3 != 99999999) { list6.Add(list[num]); } } List list7 = null; if (list6.Count > 0) { list7 = new List(); for (int num4 = 0; num4 < list6.Count; num4++) { AIVirtualCard aIVirtualCard3 = list6[num4]; bool flag3 = AIFilteringUtility.CheckMatchTargetFiltering(aIVirtualCard3, selfField.AllyHandCards, destroy_filters, playPtn, tagOwner, situation); if (aIVirtualCard3.IsIndependent || aIVirtualCard3.IsIndestructible || !flag3) { list7.Add(0f); continue; } float item3 = CalcEvalDestroy(aIVirtualCard3, playPtn, situation, useIgnoreBreak: false); list7.Add(item3); } list7.Sort((float score0, float score1) => (int)(score1 - score0)); } List list8 = new List(); if (list3 != null) { list8.AddRange(list3); } if (list7 != null) { list8.AddRange(list7); } if (list5 != null) { list8.AddRange(list5); } int num5 = list.Count - select_count; if (num5 >= list8.Count) { return 0f; } float num6 = 0f; for (int num7 = 0; num7 < num5; num7++) { num6 += list8[num7]; } return num6; } public static float EvalTargetingMultiDestroy(List filter, int selectableCount, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation) { float num = 0f; List list = AIFilteringUtility.MultipleFiltering(tagOwner.SelfField.CardListSet.BothInplayCards, filter, tagOwner, playPtn, situation); if (list == null || list.Count <= 0) { return 0f; } list.RemoveAll((AIVirtualCard c) => c.IsAlly != tagOwner.IsAlly && (c.IsUntouchable || c.IsSneak)); if (list.Count <= selectableCount) { for (int num2 = 0; num2 < list.Count; num2++) { AIVirtualCard aIVirtualCard = list[num2]; if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsIndestructible) { float num3 = CalcEvalDestroy(aIVirtualCard, playPtn, situation, useIgnoreBreak: false); num += num3; } } return num; } List list2 = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(list, tagOwner, playPtn); if (list2.Count <= selectableCount) { for (int num4 = 0; num4 < list2.Count; num4++) { AIVirtualCard aIVirtualCard2 = list2[num4]; num += CalcEvalDestroy(aIVirtualCard2, playPtn, situation, useIgnoreBreak: false); list.Remove(aIVirtualCard2); selectableCount--; if (selectableCount <= 0) { return num; } } } else { list = list2; } Dictionary dictionary = new Dictionary(); for (int num5 = 0; num5 < list.Count; num5++) { AIVirtualCard aIVirtualCard3 = list[num5]; dictionary.Add(aIVirtualCard3, CalcEvalDestroy(aIVirtualCard3, playPtn, situation, useIgnoreBreak: false)); } for (int num6 = 0; num6 < selectableCount; num6++) { float num7 = float.MinValue; AIVirtualCard aIVirtualCard4 = null; for (int num8 = 0; num8 < list.Count; num8++) { AIVirtualCard aIVirtualCard5 = list[num8]; float num9 = dictionary[aIVirtualCard5]; if (num9 > num7) { num7 = num9; aIVirtualCard4 = aIVirtualCard5; } } num += num7; if (aIVirtualCard4 != null) { list.Remove(aIVirtualCard4); dictionary.Remove(aIVirtualCard4); } } return num; } public static float EvalAllDestroy(List argList, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation) { List list = AIFilteringUtility.MultipleFiltering(tagOwner.SelfField.CardListSet.BothInplayCards, argList, tagOwner, playPtn, situation); if (list == null || list.Count == 0) { return 0f; } float num = 0f; for (int i = 0; i < list.Count; i++) { AIVirtualCard aIVirtualCard = list[i]; if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsIndestructible) { float num2 = CalcEvalDestroy(aIVirtualCard, playPtn, situation, useIgnoreBreak: false); num += num2; } } return num; } public static float EvalRandomDestroy(List argList, int count, AIVirtualCard tagOwner, List playPtn, AISituationInfo situation) { AIVirtualField selfField = tagOwner.SelfField; if (count == 0) { return 0f; } List list = AIFilteringUtility.MultipleFiltering(selfField.CardListSet.BothInplayCards, argList, tagOwner, playPtn, situation); if (list == null || list.Count == 0) { return 0f; } float num = 0f; if (list.Count <= count) { for (int i = 0; i < list.Count; i++) { AIVirtualCard aIVirtualCard = list[i]; if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsIndestructible) { float num2 = CalcEvalDestroy(aIVirtualCard, playPtn, situation, useIgnoreBreak: false); num += num2; } } return num; } List list2 = new List(); for (int j = 0; j < list.Count; j++) { list2.Add(j); } List 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 && !aIVirtualCard2.IsIndestructible) { float num3 = CalcEvalDestroy(aIVirtualCard2, playPtn, situation, useIgnoreBreak: false); num += num3; } } } return num / (float)list3.Count; } public static void ExecuteTargetSelectDestroy(AIVirtualCard owner, List targets, AIVirtualField field, List playPtn, AISituationInfo situation, AIScriptTokenArgType selectType, int selectCount = 1) { if (situation == null) { AIConsoleUtility.LogError("ExecuteTargetSelectDestroy() Error!! situation is null!!!!!"); } else if (situation.IsTargetExists(selectType)) { AISkillSimulationUtility.DestroyTarget(situation, targets, selectType); } else { DestroyTargetPrediction(owner, targets, field, playPtn, situation, selectCount, selectType); } } private static void DestroyTargetPrediction(AIVirtualCard tagOwner, List candidates, AIVirtualField field, List playPtn, AISituationInfo situation, int selectCount, AIScriptTokenArgType whichTarget) { AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(candidates, tagOwner, playPtn); if (selectCount <= 1) { AIVirtualCard target = AISimulationRemovalUtility.SelectRemovalTarget(candidates, tagOwner, field, playPtn, situation, AISelectTargetPattern.Best, AIRemovalType.Destroy); situation.SetSingleTargetInInfo(target, TargetSelectType.Default, whichTarget); AISkillSimulationUtility.DestroyTarget(situation, candidates, whichTarget); } else { List targets = AISimulationRemovalUtility.SelectMultipleRemovalTargets(candidates, tagOwner, field, playPtn, situation, AISelectTargetPattern.Best, AIRemovalType.Destroy, selectCount); situation.SetMultipleTargetsInInfo(targets, TargetSelectType.Default, AIRemovalType.Destroy, whichTarget); AISkillSimulationUtility.DestroyTarget(situation, candidates, whichTarget); } } }