using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Menagerie { public class WayOfTheFrog : Way { private readonly List triggers = new List(); public WayOfTheFrog() : base(Source.Menagerie, Traits.CardOrdering | Traits.PlusAction) { Benefit.Actions = 1; } public override void FollowAlternateInstructions(IPlayer player, Card playedCard) { Contract.Requires(player != null, "player cannot be null"); Contract.Requires(playedCard != null, "playedCard cannot be null"); base.FollowAlternateInstructions(player, playedCard); if (!triggers.Any()) player.CardsDiscarding += Player_CardsDiscarding; triggers.Add(playedCard); } private void Player_CardsDiscarding(object sender, CardsDiscardEventArgs e) { if (e.FromLocation != DeckLocation.InPlay && e.FromLocation != DeckLocation.SetAside && e.FromLocation != DeckLocation.InPlayAndSetAside) return; var player = sender as IPlayer; var matchingCards = e.Cards.Where(c => triggers.Contains(c)).ToList(); if (!matchingCards.Any()) { player.CardsDiscarding -= Player_CardsDiscarding; return; } foreach (var matchingCard in matchingCards) { e.AddResolver(Type, matchingCard.Type, new CardsDiscardResolver(sender as IPlayer, this, Resource.PutCardOnYourDeck.Replace("{card}", matchingCard.ToString()), (IPlayer playerAction, ref CardsDiscardEventArgs eAction) => { e.Cards.Remove(matchingCard); var thisCard = playerAction.RetrieveCardFrom(playerAction.InPlay.Contains(matchingCard) ? DeckLocation.InPlay : DeckLocation.SetAside, matchingCard); playerAction.AddCardToDeck(thisCard, DeckPosition.Top); triggers.Remove(matchingCard); }, true) ); } } } }