using DominionBase.Currencies; using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Menagerie { public class Displace : Card { public Displace() : base(Categories.Action, Source.Menagerie, Location.Kingdom, Traits.Exiler | Traits.Gainer | Traits.RemoveFromHand | Traits.Terminal) { BaseCost = new Cost(5); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var choiceExile = new Choice(Resource.ChooseCardToExile, this, player.Hand, ChoiceOutcome.Trash, player); var resultExile = player.MakeChoice(choiceExile); if (resultExile.Cards.Any()) { var exiledCard = resultExile.Cards[0]; player.AddCardInto(TypeClass.Exile, player.RetrieveCardFrom(DeckLocation.Hand, exiledCard)); player._Game.SendMessage(player, this, "Exile", exiledCard); var exiledCardCost = player._Game.ComputeCost(exiledCard); var gainableSupplies = new SupplyCollection(player._Game.Table.TableEntities.FindAll( supply => supply.CanGain() && supply.CurrentCost <= exiledCardCost + new Coin(2) && supply.TopCard.Name != exiledCard.Name )); var choice = new Choice(Resource.GainCard, this, gainableSupplies, ChoiceOutcome.Gain, player, false); var result = player.MakeChoice(choice); if (result.Supply != null) player.Gain(result.Supply, this); } else { player._Game.SendMessage(player, this, "Exile"); } } } }