using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Menagerie { public class Transport : Event { public Transport() : base(Source.Menagerie, 3, Traits.CardOrdering | Traits.Exiler | Traits.Gainer) { } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var choiceOption = new Choice(Resource.ChooseOne, this, new ICardBaseCollection(), new List { Resource.ExileActionSupply, Resource.TopdeckExiledAction }, player); var resultOption = player.MakeChoice(choiceOption); if (!resultOption.Options.Any()) return; if (resultOption.Options[0] == Resource.ExileActionSupply) { var exileableSupplies = new SupplyCollection(player._Game.Table.TableEntities.FindAll( supply => supply.TopCard != null && supply.TopCard.Category.HasFlag(Categories.Action) )); var choiceExile = new Choice(Resource.ExileActionSupply, this, exileableSupplies, ChoiceOutcome.Trash, player, false); var resultExile = player.MakeChoice(choiceExile); if (resultExile.Supply != null) { var toExile = resultExile.Supply.Take(); player.AddCardInto(TypeClass.Exile, toExile); toExile.ReceivedBy(player); player._Game.SendMessage(player, this, "Exile", toExile); } } else if (resultOption.Options[0] == Resource.TopdeckExiledAction && player.PlayerMats.ContainsKey(TypeClass.Exile)) { var availableCardsFromExile = player.PlayerMats[TypeClass.Exile].FindAll(c => c.Category.HasFlag(Categories.Action)); var choiceTopdeck = new Choice(Resource.TopdeckExiledAction, this, availableCardsFromExile, ChoiceOutcome.Select, player); var resultTopdeck = player.MakeChoice(choiceTopdeck); if (resultTopdeck.Cards.Any()) { var cardToTopdeck = resultTopdeck.Cards[0]; player.AddCardToDeck(player.PlayerMats[TypeClass.Exile].Retrieve(player, cardToTopdeck), DeckPosition.Top); } } } } }