using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class Cemetery : Card { public Cemetery() : base(Categories.Victory, Source.Nocturne, Location.Kingdom, Traits.DeckReduction | Traits.ReactToGain | Traits.RemoveCurses | Traits.RemoveFromHand | Traits.Trasher) { BaseCost = new Cost(4); VictoryPoints = 2; } public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); for (var i = 0; i < game.Players.Count; i++) { Card card = new HauntedMirror(); game.Table.Copper.AddTo(card); card.SetupCard(game); } } public override void SetupCard(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.SetupCard(game); foreach (var player in game.Players) player.CardGained += Player_CardGained; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) player.CardGained -= Player_CardGained; } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.Cemetery.ToString(); // This is not the card you are looking for if (e.Card != this || e.Resolvers.ContainsKey(key) || e.HandledBy.Contains(this)) return; e.Resolvers[key] = new CardGainResolver(player, this, "TrashCards", Resource.TrashCards, Player_GainCemetery, true); } internal void Player_GainCemetery(IPlayer player, ref CardGainEventArgs e) { var choiceTrash = new Choice(Resource.Trash4, this, player.Hand, ChoiceOutcome.Trash, player, minimum: 0, maximum: 4); var resultTrash = player.MakeChoice(choiceTrash); player.Trash(this, player.RetrieveCardsFrom(DeckLocation.Hand, resultTrash.Cards)); e.HandledBy.Add(this); } } }