Example #1
0
        public Kingdom(IList<CardModel> cards, IList<CardModel> prohibitedCards, CardModel bane, GameSets allowedSets, int numPlayers, CardUseType usesColonies, CardUseType usesShelters, StartingHandType startingHandType, bool useRandomCardsFromChosenSetsOnly)
        {
            this.Bane = bane;
            this.NumPlayers = numPlayers;
            this.AllowedSets = allowedSets;
            if (prohibitedCards == null)
            {
                prohibitedCards = new List<CardModel>();
            }
            List<CardModel> newCards = new List<CardModel>();
            if (cards != null)
            {
                newCards.AddRange(cards);
            }
            this.Cards = newCards;

            int need = 10 - this.Cards.Count;
            if (need > 0)
            {
                IEnumerable<CardModel> randomFilteredCards = RandomAllCardSet.RandomCardIDs.Where(c => !this.Cards.Any(cc => cc.Name == c.Name) && !prohibitedCards.Any(cc => cc.Name == c.Name) && (this.Bane == null || this.Bane.Name != c.Name) && (c.GameSet & this.AllowedSets) != 0).OrderBy(c => Randomizer.Next());
                newCards.AddRange(randomFilteredCards.Take(need));
                need = 10 - this.Cards.Count;
                if (need > 0)
                {
                    IEnumerable<CardModel> randomAllCards = RandomAllCardSet.RandomCardIDs.Where(c => !this.Cards.Any(cc => cc.Name == c.Name) && (this.Bane == null || this.Bane.Name != c.Name)).OrderBy(c => Randomizer.Next());
                    newCards.AddRange(randomAllCards.Take(need));
                }
            }

            this.InitializeBlackMarket(useRandomCardsFromChosenSetsOnly, prohibitedCards);
            if (this.Cards.Any(card => card is YoungWitch))
            {
                if (this.Bane == null)
                {
                    // add a bane card if it hasn't been set already
                    IEnumerable<CardModel> baneCards = RandomAllCardSet.RandomCardIDs.Where(c => (c.GetBaseCost() == 2 || c.GetBaseCost() == 3) && !c.CostsPotion && !this.Cards.Any(cc => cc.Name == c.Name) && (this.BlackMarketDeck == null || !this.BlackMarketDeck.Any(cc => cc.Name == c.Name)) && (c.GameSet & this.AllowedSets) != 0);
                    if (useRandomCardsFromChosenSetsOnly)
                    {
                        IEnumerable<CardModel> filteredBaneCards = baneCards.Where(c => this.Cards.Any(cc => c.GameSet == cc.GameSet) && !prohibitedCards.Any(cc => cc.Name == c.Name));
                        if(filteredBaneCards.Any())
                        {
                            baneCards = filteredBaneCards;
                        }
                    }

                    CardModel baneChoice = baneCards.ElementAt(Randomizer.Next(baneCards.Count()));
                    this.Bane = baneChoice;
                }
                if (this.Bane is BlackMarket)
                {
                    this.InitializeBlackMarket(useRandomCardsFromChosenSetsOnly, prohibitedCards);
                }
                this.Cards.Add(this.Bane);
            }

            newCards.Sort(new Comparison<CardModel>((CardModel lhs, CardModel rhs) =>
            {
                if (lhs.CostsPotion && !rhs.CostsPotion) return 1;
                if (rhs.CostsPotion && !lhs.CostsPotion) return -1;
                if (lhs.GetBaseCost() != rhs.GetBaseCost()) return lhs.GetBaseCost() - rhs.GetBaseCost();
                return lhs.Name.CompareTo(rhs.Name);
            }));

            switch (usesColonies)
            {
                case CardUseType.Random:
                    this.UsesColonies = Randomizer.Next(2) == 1;
                    break;

                case CardUseType.RandomByCardsFromSet:
                    this.UsesColonies = this.Cards.Count(card => card is ProsperityCardModel) > Randomizer.Next(10);
                    break;

                case CardUseType.Use:
                    this.UsesColonies = true;
                    break;

                case CardUseType.DoNotUse:
                    this.UsesColonies = false;
                    break;
            }

            switch (usesShelters)
            {
                case CardUseType.Random:
                    this.UsesShelters = Randomizer.Next(2) == 1;
                    break;

                case CardUseType.RandomByCardsFromSet:
                    this.UsesShelters = this.Cards.Count(card => card is DarkAgesCardModel) > Randomizer.Next(10);
                    break;

                case CardUseType.Use:
                    this.UsesShelters = true;
                    break;

                case CardUseType.DoNotUse:
                    this.UsesShelters = false;
                    break;
            }

            this.CreateStartingDecks(startingHandType);

            this.VictoryCardCount = this.NumPlayers < 3 ? 8 : 12;
        }
Example #2
0
 public Kingdom(IList<CardModel> cards, IList<CardModel> prohibitedCards, CardModel bane, GameSets allowedSets, int numPlayers, CardUseType usesColonies, CardUseType usesShelters, StartingHandType startingHandType)
     : this(cards, prohibitedCards, bane, allowedSets, numPlayers, usesColonies, usesShelters, startingHandType, false)
 {
 }