using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Villain : Card { public Villain() : base(Categories.Action | Categories.Attack, Source.Renaissance, Location.Kingdom, Traits.AffectOthers | Traits.Component | Traits.Discard | Traits.PlusCoffer | Traits.Terminal) { BaseCost = new Cost(5); Benefit.Coffers = 2; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var enumerator = player._Game.GetPlayersStartingWithEnumerator(player); enumerator.MoveNext(); while (enumerator.MoveNext()) { var attackee = enumerator.Current; // Skip if the attack is blocked (Moat, Lighthouse, etc.) if (IsAttackBlocked[attackee]) continue; if (attackee.Hand.Count >= 5) { bool predicate(Card c) => attackee._Game.ComputeCost(c).Coin.Value >= 2; if (attackee.Hand.LookThrough(predicate).Any()) { var choice = new Choice("Choose a card to discard.", this, attackee.Hand[predicate], ChoiceOutcome.Discard, attackee); var result = attackee.MakeChoice(choice); attackee.Discard(DeckLocation.Hand, result.Cards); } else { attackee.ReturnHand(attackee.RevealHand()); } } } } } }