示例#1
0
        /// <summary>
        /// Check if there are any additional cards that need to be added based
        /// on the rules picked and the cards in the result
        /// </summary>
        /// <param name="settings">The settings which define what additional cards to add</param>
        /// <param name="result">The result to add the additional cards to</param>
        public static void AddAdditionalCards(SettingsViewModel settings, PickerResult result)
        {
            if (result.Cards.Count == 0)
            {
                return;
            }

            result.AdditionalStuff = new List <string>();
            if (result.HasCard("Young Witch"))
            {
                // TODO: There is a bug where a bane card doesn't get selected occasionally.
                // This likely occurs when the 'pool' of cards doesn't contain any cost 2-3 cards.
                Card bane = result.Pool.FirstOrDefault(c => c.Cost == "2" || c.Cost == "3");
                if (bane != null)
                {
                    result.Pool.Remove(bane);
                    result.Cards.Add(bane.WithGroup(new CardGroup(CardGroupType.BaneRequired, Card.FromName("Young Witch"))));
                }
                else
                {
                    result.AdditionalStuff.Add("No card available for Bane in selected sets");
                }
            }

            // The rest of these cards are non-pickable cards so they don't need to be moved
            // from the pool and can just be added directly.
            {
                bool usePlatinumColony = false;
                switch (ConfigurationModel.Instance.PickPlatinumColony)
                {
                case PlatinumColonyOption.Randomly:
                    usePlatinumColony = result.Cards[random.Next(result.Cards.Count)].InSet(CardSet.Prosperity);
                    break;

                case PlatinumColonyOption.AlwaysWithProsperity:
                    usePlatinumColony = result.HasCard(c => c.InSet(CardSet.Prosperity));
                    break;

                case PlatinumColonyOption.Always:
                    usePlatinumColony = true;
                    break;
                }
                if (usePlatinumColony)
                {
                    CardGroup prosperityGroup = new CardGroup(CardGroupType.SelectedProsperity);
                    result.Cards.Add((Card.FromName("Platinum")).WithGroup(prosperityGroup));
                    result.Cards.Add((Card.FromName("Colony")).WithGroup(prosperityGroup));
                }
            }

            {
                bool useShelters = false;
                switch (ConfigurationModel.Instance.PickSheltersOrEstates)
                {
                case SheltersOption.Randomly:
                    useShelters = result.Cards[random.Next(result.Cards.Count)].InSet(CardSet.DarkAges);
                    break;

                case SheltersOption.AlwaysWithDarkAges:
                    useShelters = result.HasCard(c => c.InSet(CardSet.Prosperity));
                    break;

                case SheltersOption.Always:
                    useShelters = true;
                    break;
                }
                if (useShelters)
                {
                    result.Cards.Add((Card.FromName("Shelters")).WithGroup(new CardGroup(CardGroupType.SelectedDarkAges)));
                }
            }
            if (result.HasCard("Tournament"))
            {
                result.Cards.Add((Card.FromName("Prizes")).WithGroup(new CardGroup(CardGroupType.OtherRequired, Card.FromName("Tournament"))));
            }
            var requireLooter = result.CardsOfType(CardType.Looter).ToList();

            if (requireLooter.Any())
            {
                result.Cards.Add((Card.FromName("Ruins")).WithGroup(new CardGroup(CardGroupType.OtherRequired, requireLooter)));
            }
            var requireSpoils = result.Cards.Where(c => c.ContainsText("Spoils")).ToList();

            // Is this any better, or should we prefer being explicit.
            // var requireSpoils = (result.HasCard("Bandit Camp") || result.HasCard("Marauder") || result.HasCard("Pillage"))
            if (requireSpoils.Any())
            {
                result.Cards.Add((Card.FromName("Spoils")).WithGroup(new CardGroup(CardGroupType.OtherRequired, requireSpoils)));
            }
            if (result.HasCard("Hermit"))
            {
                result.Cards.Add((Card.FromName("Madman")).WithGroup(new CardGroup(CardGroupType.OtherRequired, Card.FromName("Hermit"))));
            }
            if (result.HasCard("Urchin"))
            {
                result.Cards.Add((Card.FromName("Mercenary")).WithGroup(new CardGroup(CardGroupType.OtherRequired, Card.FromName("Urchin"))));
            }
            if (result.HasCard("Page"))
            {
                var pageGroup = new CardGroup(CardGroupType.OtherRequired, Card.FromName("Page"));
                result.Cards.Add((Card.FromName("Treasure Hunter")).WithGroup(pageGroup));
                result.Cards.Add((Card.FromName("Warrior")).WithGroup(pageGroup));
                result.Cards.Add((Card.FromName("Hero")).WithGroup(pageGroup));
                result.Cards.Add((Card.FromName("Champion")).WithGroup(pageGroup));
            }
            if (result.HasCard("Peasant"))
            {
                var peasantGroup = new CardGroup(CardGroupType.OtherRequired, Card.FromName("Peasant"));
                result.Cards.Add((Card.FromName("Soldier")).WithGroup(peasantGroup));
                result.Cards.Add((Card.FromName("Fugitive")).WithGroup(peasantGroup));
                result.Cards.Add((Card.FromName("Disciple")).WithGroup(peasantGroup));
                result.Cards.Add((Card.FromName("Teacher")).WithGroup(peasantGroup));
            }
            var requirePotion = result.Cards.Where(c => c.HasPotion).ToList();

            if (requirePotion.Any())
            {
                result.Cards.Add((Card.FromName("Potion")).WithGroup(new CardGroup(CardGroupType.OtherRequired, requirePotion)));
            }
            var requireCurse = result.CardsWhere(c => c.ContainsText("Curse")).ToList();

            if (requireCurse.Any())
            {
                var curse = Card.FromName("Curse");
                result.Cards.Add(curse.WithGroup(new CardGroup(CardGroupType.OtherRequired, requireCurse)));
            }
            if (ConfigurationModel.Instance.PickEvents != EventsOption.Never)
            {
                bool hasEventsSet   = result.HasCard(c => c.InSet(CardSet.Adventures) || c.InSet(CardSet.Empires));
                int  numberOfEvents = 0;
                switch (ConfigurationModel.Instance.PickEvents)
                {
                case EventsOption.Randomly:
                    numberOfEvents = random.Next(0, 3);
                    break;

                case EventsOption.RandomlyWithSet:
                    if (hasEventsSet)
                    {
                        numberOfEvents = random.Next(0, 3);
                    }
                    break;

                case EventsOption.Always:
                    numberOfEvents = 2;
                    break;

                case EventsOption.AlwaysWithSet:
                    if (hasEventsSet)
                    {
                        numberOfEvents = 2;
                    }
                    break;
                }

                if (numberOfEvents > 0)
                {
                    var eventsGroup = new CardGroup(CardGroupType.Events);
                    var events      = Cards.AllCards.Where(c => c.IsType(CardType.Event) || c.IsType(CardType.Landmark))
                                      .OrderBy(_ => Guid.NewGuid())
                                      .Take(numberOfEvents)
                                      .Select(e => e.WithGroup(eventsGroup));
                    result.Cards.AddRange(events);
                }
            }
            if (ConfigurationModel.Instance.ShowExtras)
            {
                if (result.HasCard("Native Village"))
                {
                    result.AdditionalStuff.Add("Native Village Mat");
                }
                if (result.HasCard("Island"))
                {
                    result.AdditionalStuff.Add("Island Mat");
                }
                if (result.HasCard("Pirate Ship"))
                {
                    result.AdditionalStuff.Add("Pirate Ship Mat");
                }
                if (result.HasCard("Trade Route"))
                {
                    result.AdditionalStuff.Add("Trade Route Mat");
                }
                if (result.HasCardType(CardType.Reserve))
                {
                    result.AdditionalStuff.Add("Tavern Mat");
                }
                if (result.HasCard("Embargo"))
                {
                    result.AdditionalStuff.Add("Embargo Tokens");
                }
                if (result.HasCard("Baker") || result.HasCard("Butcher") || result.HasCard("Candlestick Maker") || result.HasCard("Merchant Guild") || result.HasCard("Pirate Ship") || result.HasCard("Plaza") || result.HasCard("Trade Route"))
                {
                    result.AdditionalStuff.Add("Coin Tokens");
                }
                if (result.HasCard(c => !c.IsType(CardType.Victory | CardType.Curse) && c.ContainsText("{VP}")))
                {
                    result.AdditionalStuff.Add("Victory Point Tokens");
                }
                result.AdditionalStuff = result.AdditionalStuff.Distinct().OrderBy(s => s).ToList();
            }
        }