using DominionBase.Enums; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class Druid : Fate { public Druid() : base(Categories.Action, Location.Kingdom, Traits.ConditionalBenefit | Traits.PlusBuy) { BaseCost = new Cost(2); Benefit.Buys = 1; } public override string SpecialPresetKey => "Druid Boon"; public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); var druidBoons = new DruidBoons("Druid Boons", game); var boons = (Boons)game.Table.SpecialPiles[TypeClass.Boons]; if (game.Settings.Preset != null) { var boonsToGet = game.Settings.Preset.CardCards[game.Settings.Preset.Cards.First(c => c.Type == Type)].OfType(); while (boons.DrawCount > 0) { var boon = boons.TakeBoon(); if (boonsToGet.Any(b => b.Name == boon.Name)) druidBoons.Add(boon); else boons.ReturnBoon(boon); if (druidBoons.Count >= 3) break; } } while (druidBoons.Count < 3) druidBoons.Add(boons.TakeBoon()); // Put the discarded Boons back and shuffle them if (boons.TopDiscard != null) boons.Shuffle(); game.Table.SpecialPiles.Add(TypeClass.DruidBoons, druidBoons); } public override void CheckSetup(Preset preset, string cardName, IRandomizable card) { Contract.Requires(preset != null, "preset cannot be null"); // This should usually be null if (card == null) card = CardCollection.GetAllCards(c => c.Category == Categories.Boon && c.Name == cardName).FirstOrDefault(); base.CheckSetup(preset, cardName, card); if (!preset.CardCards.ContainsKey(this)) preset.CardCards[this] = new List(); preset.CardCards[this].Add(card); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var boons = (IEnumerable)player._Game.Table.SpecialPiles[TypeClass.DruidBoons]; var choiceBoon = new Choice(Resource.ReceiveSetAsideBoon, this, boons, player); var resultBoon = player.MakeChoice(choiceBoon); if (resultBoon.Boons.Any()) resultBoon.Boons.First().Receive(player); } } }