using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class Monastery : Card { public Monastery() : base(Categories.Night, Source.Nocturne, Location.Kingdom, Traits.DeckReduction | Traits.RemoveCurses | Traits.RemoveFromHand | Traits.Trasher) { BaseCost = new Cost(2); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); // This can possibly change on an on-trash ability, so store it first. int gainedCount = player.CurrentTurn.CardsGained.Count; for (var i = 0; i < gainedCount; i++) { var trashables = new ItemCollection(player.Hand) { new Universal.Blank() }; trashables.AddRange(player.InPlayAndSetAside[c => c is Universal.Copper]); var choiceTrash = new Choice(Resource.ChooseToTrashOptional, this, trashables, ChoiceOutcome.Trash, player, minimum: 0); var resultTrash = player.MakeChoice(choiceTrash); if (resultTrash.Cards.Any()) { var cardToTrash = player.RetrieveCardFrom(player.Hand.Contains(resultTrash.Cards[0]) ? DeckLocation.Hand : DeckLocation.InPlayAndSetAside, resultTrash.Cards[0]); player.Trash(this, cardToTrash); } else { // If no card was trashed, break out of the loop and stop offering to trash break; } } } } }