using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class Necromancer : Card { private readonly CardCollection flippedOverCards = new CardCollection(); public Necromancer() : base(Categories.Action, Source.Nocturne, Location.Kingdom, Traits.ConditionalBenefit) { BaseCost = new Cost(4); } public override bool Finalize(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); if (base.Finalize(game, supply)) return true; // Add Zombies to the Trash game.Table.Trash.Add(new ZombieApprentice()); game.Table.Trash.Add(new ZombieMason()); game.Table.Trash.Add(new ZombieSpy()); return false; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var availableCards = player._Game.Table.Trash[c => c.Category.HasFlag(Categories.Action) && !c.Category.HasFlag(Categories.Duration) && c.Facing == Facing.FaceUp && c != this ]; var choice = new Choice("Choose a face-up non-Duration Action card to play", this, availableCards, ChoiceOutcome.Select, player); var result = player.MakeChoice(choice); if (result.Cards.Any()) { var card = result.Cards[0]; card.ModifiedBy = this; player.Actions++; var previousPlayerMode = player.PutCardIntoPlay(card); var logicalCard = card.LogicalCard; player.PlayCard(logicalCard, previousPlayerMode); player.FlipFaceDown(card); flippedOverCards.Add(card); player.TurnEnded += Player_TurnEnded; } else player.PlayNothing(); } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { IPlayer player = (IPlayer)sender; player.TurnEnded -= Player_TurnEnded; foreach (var card in flippedOverCards) player.FlipFaceUp(card); flippedOverCards.Clear(); } } }