using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public delegate void BorderGuardRevealEventHandler(object sender, BorderGuardRevealEventArgs e); public class BorderGuard : Card { public event BorderGuardRevealEventHandler BorderGuardRevealing; public BorderGuard() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.Discard | Traits.PlusAction | Traits.PlusCard) { BaseCost = new Cost(2); Benefit.Actions = 1; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var bgreArgs = new BorderGuardRevealEventArgs(2); BorderGuardRevealing?.Invoke(this, bgreArgs); var cardsRevealed = player.Draw(bgreArgs.CardsToReveal, DeckLocation.Revealed); var allActions = cardsRevealed.Count == bgreArgs.CardsToReveal && cardsRevealed.All(c => c.Category.HasFlag(Categories.Action)); var handChoice = new Choice("Choose a card to put into your hand", this, cardsRevealed, ChoiceOutcome.Select, player); var handResult = player.MakeChoice(handChoice); if (handResult.Cards.Any()) { cardsRevealed.Remove(handResult.Cards[0]); var rc = player.RetrieveCardsFrom(DeckLocation.Revealed, c => c == handResult.Cards[0]); player.AddCardsToHand(rc); } player.DiscardRevealed(); if (allActions) { var choiceOption = new Choice(Resource.ChooseOne, this, this, new List { Resource.TakeLantern, Resource.TakeHorn }, player, minimum: 1, maximum: 1); var resultOption = player.MakeChoice(choiceOption); var optionChosen = resultOption.Options.FirstOrDefault(); if (optionChosen == Resource.TakeLantern) player.Take(TypeClass.Lantern); else if (optionChosen == Resource.TakeHorn) player.Take(TypeClass.Horn); } } } public class BorderGuardRevealEventArgs : EventArgs { public int CardsToReveal { get; set; } public BorderGuardRevealEventArgs(int cardsToReveal) { CardsToReveal = cardsToReveal; } } }