private static void BuildPurchaseOrder(ParameterBuilderAndRetreiver builder, Card[] cards) { var purchaseAcceptances = new List<CardAcceptanceDescription>(); // do the end game purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Province, CountSource.CountAllOwned, Cards.Gold, Comparison.GreaterThan, builder.Next(defaultValue:2, defaultLowerBound:0))); purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Duchy, CountSource.CountOfPile, Cards.Province, Comparison.LessThanEqual, builder.Next(defaultValue: 3, defaultLowerBound: 0))); purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Estate, CountSource.CountOfPile, Cards.Province, Comparison.LessThanEqual, builder.Next(defaultValue: 1, defaultLowerBound: 0))); // add cards costing more than gold foreach (Card card in cards.Where(c => c.DefaultCoinCost >= Cards.Gold.DefaultCoinCost).OrderBy(c => c.DefaultCoinCost)) { purchaseAcceptances.Add(new CardAcceptanceDescription(card, CountSource.CountAllOwned, card, Comparison.LessThanEqual, builder.Next(defaultValue: 0, defaultLowerBound: 0))); } purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Gold)); // add cards costing more than potion and less than gold foreach (Card card in cards.Where(c => c.DefaultCoinCost >= Cards.Potion.DefaultCoinCost && c.DefaultCoinCost < Cards.Gold.DefaultCoinCost).OrderBy(c => c.DefaultCoinCost)) { purchaseAcceptances.Add(new CardAcceptanceDescription(card, CountSource.CountAllOwned, card, Comparison.LessThanEqual, builder.Next(defaultValue: 0, defaultLowerBound: 0))); } if (cards.Where(card => card.potionCost != 0).Any()) { purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Potion, CountSource.CountAllOwned, Cards.Potion, Comparison.LessThanEqual, builder.Next(defaultValue: 1, defaultLowerBound: 0))); } // add cards costing mor than silver foreach (Card card in cards.Where(c => c.DefaultCoinCost >= Cards.Silver.DefaultCoinCost && c.DefaultCoinCost < Cards.Potion.DefaultCoinCost).OrderBy(c => c.DefaultCoinCost)) { purchaseAcceptances.Add(new CardAcceptanceDescription(card, CountSource.CountAllOwned, card, Comparison.LessThanEqual, builder.Next(defaultValue: 0, defaultLowerBound: 0))); } purchaseAcceptances.Add(new CardAcceptanceDescription(Cards.Silver)); // cards costing less than silver foreach (Card card in cards.Where(c => c.DefaultCoinCost < Cards.Silver.DefaultCoinCost).OrderBy(c => c.DefaultCoinCost)) { purchaseAcceptances.Add(new CardAcceptanceDescription(card, CountSource.CountAllOwned, card, Comparison.LessThanEqual, builder.Next(defaultValue: 0, defaultLowerBound: 0))); } builder.description = new PickByPriorityDescription(purchaseAcceptances.ToArray()); }