public CardConstraintMatcher( bool requirePlusBuy, bool requireVillage, bool requirePlusCard, bool requireTrashing, bool requireAttack, bool requireReactionWhenAttack, bool requireAtLeast3FromAnExpansion, Dominion.Card[] requiredCards, Dominion.Card[] restrictedCards, Dominion.Card[] startingCards, IEnumerable<Dominion.Card> allCards ) { this.requirePlusBuy = requirePlusBuy; this.requireVillage = requireVillage; this.requirePlusCard = requirePlusCard; this.requireTrashing = requireTrashing; this.requireAttack = requireAttack; this.requireReactionWhenAttack = requireReactionWhenAttack; this.requireAtLeast3FromAnExpansion = requireAtLeast3FromAnExpansion; this.RequiredCards = requiredCards; this.RestrictedCards = restrictedCards; this.enabledExpansions = new List<Dominion.Expansion>(); this.currentCards = new List<Dominion.Card>(); this.missingRequiredCards = new List<Dominion.Card>(); this.uniqueCardPicker = new Dominion.UniqueCardPicker(allCards, MainPage.random); this.uniqueCardPicker.ExcludeCards(requiredCards); this.uniqueCardPicker.ExcludeCards(restrictedCards); this.uniqueCardPicker.ExcludeCards(startingCards); foreach (var card in startingCards) this.currentCards.Add(card); foreach(var card in requiredCards) { if (!this.currentCards.Contains(card)) { this.missingRequiredCards.Add(card); } } }
public void RandomizeEvents(Random random) { int cEventsToInclude = 0; int cLandmarksToInclude = 0; var allEventsCards = Dominion.Cards.AllCardsList.Where(c => c is Event).Select(c => (Event)c).ToArray(); var allLandmarkCards = Dominion.Cards.AllCardsList.Where(c => c is Landmark).Select(c => (Landmark)c).ToArray(); var allProjectCards = Dominion.Cards.AllCardsList.Where(c => c is Project).Select(c => (Project)c).ToArray(); int cEventRemaining = allEventsCards.Length; int totalKingdomCount = Dominion.Cards.AllKingdomCardsList.Length; for (int i = 0; i < 10; ++i) { int roll = random.Next(totalKingdomCount); if (roll <= cEventRemaining) { cEventsToInclude++; cEventRemaining--; i--; } else { totalKingdomCount--; } } var cardPicker = new Dominion.UniqueCardPicker <Event>(allEventsCards, random); this.events.Clear(); PopulateCardListToCount <Event>(cEventsToInclude, this.events, cardPicker, c => true); var cardPicker2 = new Dominion.UniqueCardPicker <Landmark>(allLandmarkCards, random); this.landmarks.Clear(); PopulateCardListToCount <Landmark>(cLandmarksToInclude, this.landmarks, cardPicker2, c => true); }
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 Dominion.UniqueCardPicker <Dominion.Card>(allCards.Select(c => c.dominionCard), MainPage.random); 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); }
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 Dominion.UniqueCardPicker(allCards.Select(c => c.dominionCard), MainPage.random); 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; }
public void RandomizeEvents(Random random) { int cEventsToInclude = 0; int cEventRemaining = 20; int totalKingdomCount = Dominion.Cards.AllKingdomCards().Count(); for (int i = 0; i < 10; ++i) { int roll = random.Next(totalKingdomCount); if (roll <= cEventRemaining) { cEventsToInclude++; cEventRemaining--; i--; continue; } totalKingdomCount--; } var allEventsCards = Dominion.Cards.AllCards().Where(c => c.isEvent).ToArray<Dominion.Card>(); var cardPicker = new Dominion.UniqueCardPicker(allEventsCards, random); this.events.Clear(); PopulateCardListToCount(cEventsToInclude, this.events, cardPicker, c => true); }