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);
        }
Exemple #3
0
        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);
        }