internal static void Generate10Random(IList <DominionCard> resultList, IList <DominionCard> sourceList, IList <DominionCard> allCards, IList <DominionCard> itemsToReplace) { bool isReplacingItems = itemsToReplace != null && itemsToReplace.Count > 0 && sourceList.Count <= 10; bool isReducingItems = itemsToReplace != null && itemsToReplace.Count > 0 && sourceList.Count > 10; var cardPicker = new UniqueCardPicker(allCards); if (isReplacingItems) { cardPicker.ExcludeCards(itemsToReplace); if (itemsToReplace != null) { foreach (DominionCard cardToReplace in itemsToReplace) { for (int i = 0; i < resultList.Count; ++i) { if (resultList[i] == cardToReplace) { var nextCard = cardPicker.GetCard(c => true); if (nextCard == null) { resultList.Remove(cardToReplace); i--; // do this index again } else { resultList[i] = nextCard; } } } } } } else if (sourceList.Count < 10) { var listRemoved = new List <DominionCard>(); foreach (var card in resultList) { if (!sourceList.Contains(card)) { listRemoved.Add(card); } } foreach (var card in listRemoved) { resultList.Remove(card); } } else if (isReducingItems) { foreach (var card in itemsToReplace) { resultList.Remove(card); } } else { resultList.Clear(); } while (resultList.Count < 10) { DominionCard currentCard = cardPicker.GetCard(c => true); if (currentCard == null) { break; } resultList.Add(currentCard); } }
internal static bool GenerateRandom( int targetCount, ref DominionCard baneCard, IList <DominionCard> resultList, IList <DominionCard> sourceList, IEnumerable <DominionCard> allCards, IEnumerable <DominionCard> itemsToReplace) { bool isReplacingItems = itemsToReplace != null && itemsToReplace.Any() && sourceList.Count <= targetCount; bool isReducingItems = itemsToReplace != null && itemsToReplace.Any() && sourceList.Count > targetCount; var cardPicker = new UniqueCardPicker(allCards.Select(c => c.dominionCard)); bool isCleanRoll = false; if (isReplacingItems) { cardPicker.ExcludeCards(itemsToReplace.Select(c => c.dominionCard)); } baneCard = DominionCard.Create(cardPicker.GetCard(c => c.DefaultCoinCost == 2 || c.DefaultCoinCost == 3)); if (isReplacingItems) { foreach (DominionCard cardToReplace in itemsToReplace) { for (int i = 0; i < resultList.Count; ++i) { if (resultList[i] == cardToReplace) { var nextCard = cardPicker.GetCard(c => true); if (nextCard == null) { resultList.Remove(cardToReplace); i--; // do this index again } else { resultList[i] = DominionCard.Create(nextCard); } } } } } else if (sourceList.Count < targetCount && sourceList.Count > 0) { var listRemoved = new List <DominionCard>(); foreach (var card in resultList) { if (!sourceList.Contains(card)) { listRemoved.Add(card); } } foreach (var card in listRemoved) { resultList.Remove(card); } } else if (isReducingItems) { foreach (var card in itemsToReplace) { resultList.Remove(card); } } else { resultList.Clear(); isCleanRoll = true; } while (resultList.Count < targetCount) { Dominion.Card currentCard = cardPicker.GetCard(c => true); if (currentCard == null) { break; } resultList.Add(DominionCard.Create(currentCard)); } return(isCleanRoll); }