using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class Sheepdog : Card { private CardGainedEventHandler _CardGainedHandler; public Sheepdog() : base(Categories.Action | Categories.Reaction, Source.Menagerie, Location.Kingdom, Traits.NetCardDraw | Traits.PlusCard | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(3); Benefit.Cards = 2; } 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; } public override void AddedTo(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.AddedTo(location, player); if (location == DeckLocation.Hand) { if (_CardGainedHandler != null) player.CardGained -= _CardGainedHandler; _CardGainedHandler = new CardGainedEventHandler(Player_CardGained); player.CardGained += _CardGainedHandler; } } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.ToString(); // Already been cancelled -- don't need to process this one // We also need to make sure we're in the player's hand and we can be revealed if (e.Cancelled || player != Owner || !player.Hand.Contains(PhysicalCard) || e.Resolvers.ContainsKey(key)) return; e.Resolvers[key] = new CardGainResolver(player, this, "PlayCard", Resource.PlayCard.Replace("{card}", PhysicalCard.ToString()), Player_Action, false); } internal void Player_Action(IPlayer player, ref CardGainEventArgs e) { if (player.Hand.Contains(PhysicalCard)) { player.Actions++; player.PlayCard(PhysicalCard, DeckLocation.InPlay); e.HandledBy.Add(this); } } public override void RemovedFrom(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.RemovedFrom(location, player); if (_CardGainedHandler != null) player.CardGained -= _CardGainedHandler; _CardGainedHandler = null; } } }