using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Horn : Artifact { private IPlayer _discardPlayer; public Horn() : base(Source.Renaissance, Traits.CardOrdering) { } public override void TearDown(IGame game) { base.TearDown(game); if (_discardPlayer != null) _discardPlayer.CardsDiscarding -= Player_CardsDiscarding; _discardPlayer = null; } public override void TakenBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.TakenBy(player); if (_discardPlayer != null) _discardPlayer.CardsDiscarding -= Player_CardsDiscarding; _discardPlayer = player; _discardPlayer.CardsDiscarding += Player_CardsDiscarding; } public override void ReturnedBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.ReturnedBy(player); player.CardsDiscarding -= Player_CardsDiscarding; _discardPlayer = null; } private void Player_CardsDiscarding(object sender, CardsDiscardEventArgs e) { if (e.HandledBy.Contains(this) || e.GetResolver(Type) != null || (e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside)) return; var foundBorderGuard = e.Cards.FirstOrDefault(c => c is BorderGuard); if (foundBorderGuard != null) e.AddResolver(Type, new CardsDiscardResolver(sender as IPlayer, this, Resource.PutCardOnYourDeck.Replace("{card}", foundBorderGuard.ToString()), Player_Action)); } internal void Player_Action(IPlayer player, ref CardsDiscardEventArgs e) { var foundBorderGuard = e.Cards.FirstOrDefault(c => c is BorderGuard); e.Cards.Remove(foundBorderGuard); var thisCard = player.RetrieveCardFrom(player.InPlay.Contains(foundBorderGuard) ? DeckLocation.InPlay : DeckLocation.SetAside, foundBorderGuard); player.AddCardToDeck(thisCard, DeckPosition.Top); e.HandledBy.Add(this); } } }