using System.Collections.Generic; namespace Wizard; public static class AIFusionCountUtility { public static int GetFusionCount(AIVirtualCard tagOwner, List argList, List playPtn, AISituationInfo situation) { List allFusionIngredientsList = tagOwner.GetAllFusionIngredientsList(situation); if (allFusionIngredientsList == null || allFusionIngredientsList.Count <= 0) { return 0; } argList.Reverse(); return AIFilteringUtility.MultipleFiltering(allFusionIngredientsList, argList, tagOwner, playPtn, situation)?.Count ?? 0; } public static int GetFusionCountAtOnce(AIVirtualCard tagOwner, List argList, List playPtn, AISituationInfo situation) { if (situation == null || !situation.Actor.IsSameCard(tagOwner)) { return 0; } List list = null; if (situation is AIFusionSituationInfo || situation is AIVirtualTargetSelectAction { ActionType: AIOperationType.FUSION }) { if (situation.IsTargetExists(AIScriptTokenArgType.TARGET_SELECT)) { argList.Reverse(); list = AIFilteringUtility.MultipleFiltering(situation.GetSituationTarget(AIScriptTokenArgType.TARGET_SELECT).Targets, argList, tagOwner, playPtn, situation); } } else { AIConsoleUtility.LogError("AIFusionCountUtility.GetFusionCountAtOnce(): Unexpected situation type. Not fusion situation."); } return list?.Count ?? 0; } public static int GetNowFusionCount(AIVirtualCard tagOwner, List filters, List playPtn) { if (tagOwner.FusionIngredients == null) { return 0; } return AIFilteringUtility.MultipleFiltering(tagOwner.FusionIngredients.CardList, filters, tagOwner, playPtn, null)?.Count ?? 0; } public static int GetFusionNameCount(AIVirtualCard tagOwner, List argList, List playPtn, AISituationInfo situation) { List allFusionIngredientsList = tagOwner.GetAllFusionIngredientsList(situation); if (allFusionIngredientsList == null || allFusionIngredientsList.Count <= 0) { return 0; } argList.Reverse(); return AIFilteringUtility.GetCardNameCountFromList(allFusionIngredientsList, argList, tagOwner, playPtn, situation); } public static int GetFusedCardCountInGame(AIVirtualCard tagOwner, List filter, List playPtn, AISituationInfo situation, bool isWithoutSameId) { List list = (tagOwner.IsAlly ? tagOwner.SelfField.AllyGameFusedCards : tagOwner.SelfField.EnemyGameFusedCards); if (list == null || list.Count <= 0) { return 0; } List list2 = AIFilteringUtility.MultipleFiltering(list, filter, tagOwner, playPtn, situation, isBlockDeadCard: false); if (list2 == null) { return 0; } int count = list2.Count; if (isWithoutSameId) { HashSet hashSet = new HashSet(); for (int i = 0; i < list2.Count; i++) { hashSet.Add(list2[i].BaseId); } count = hashSet.Count; } return count; } private static List GetAllFusionIngredientsList(this AIVirtualCard card, AISituationInfo situation) { List list = null; if (card.FusionIngredients != null && card.FusionIngredients.HasFusionIngredients) { list = new List(card.FusionIngredients.CardList); } else if (card.BeforeTransformCard != null && card.BeforeTransformCard.FusionIngredients != null && card.BeforeTransformCard.FusionIngredients.HasFusionIngredients) { list = new List(card.BeforeTransformCard.FusionIngredients.CardList); } if (situation != null && situation is AIFusionSituationInfo aIFusionSituationInfo && aIFusionSituationInfo.Actor.IsSameCard(card) && aIFusionSituationInfo.IsTargetExists(AIScriptTokenArgType.TARGET_SELECT)) { list = AIParamQuery.AddRangeToList(aIFusionSituationInfo.GetSituationTarget(AIScriptTokenArgType.TARGET_SELECT).Targets, list); } return list; } }