using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class HauntedMirror : Card { public HauntedMirror() : base(Categories.Treasure | Categories.Heirloom, Source.Nocturne, Location.Invisible, Traits.Gainer | Traits.IncludesExtraPiles | Traits.PlusCoin | Traits.ReactToTrashing) { BaseCost = new Cost(0); Benefit.Currency.Coin.Value = 1; } public override void SetupCard(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.SetupCard(game); Ghost.SetupSupply(game); foreach (var player in game.Players) player.Trashed += Player_Trashed; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) player.Trashed -= Player_Trashed; } private void Player_Trashed(object sender, TrashEventArgs e) { var player = sender as IPlayer; // Already being processed or been handled -- don't need to process this one if (e.Resolvers.ContainsKey(TypeClass.HauntedMirror) || e.HandledBy.Contains(this)) return; if (e.TrashedCards.Contains(PhysicalCard)) e.Resolvers[TypeClass.HauntedMirror] = new TrashResolver(player, this, "Discard an Action to gain a Ghost", Player_DiscardAction, true); } internal void Player_DiscardAction(IPlayer player, ref TrashEventArgs e) { var choice = new Choice("Discard an Action card.", this, player.Hand[Categories.Action], ChoiceOutcome.Discard, player, minimum: 0); var result = player.MakeChoice(choice); if (result.Cards.Any()) { player.Discard(DeckLocation.Hand, result.Cards); player.Gain((ISupply)player._Game.Table[TypeClass.Ghost], this); } e.HandledBy.Add(this); } } }