using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Priest : Card { private int trashTriggerCount = 0; private IPlayer trashingPlayer = null; public Priest() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.DeckReduction | Traits.PlusCoin | Traits.ReactToTrashing | Traits.RemoveCurses | Traits.RemoveFromHand | Traits.Terminal | Traits.Trasher) { BaseCost = new Cost(4); Benefit.Currency.Coin.Value = 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.Trashed -= Player_Trashed; player.TurnEnded -= Player_TurnEnded; } } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var choiceTrash = new Choice(Resource.TrashACardFromYourHand, this, player.Hand, ChoiceOutcome.Trash, player); var resultTrash = player.MakeChoice(choiceTrash); if (resultTrash.Cards.Any()) player.Trash(this, player.RetrieveCardsFrom(DeckLocation.Hand, resultTrash.Cards)); if (trashTriggerCount++ == 0) { trashingPlayer = player; player.Trashed += Player_Trashed; player._Game.CurrentTurn.Player.TurnEnded += Player_TurnEnded; } } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { e.Player.TurnEnded -= Player_TurnEnded; trashingPlayer.Trashed -= Player_Trashed; trashingPlayer = null; trashTriggerCount = 0; } private void Player_Trashed(object sender, TrashEventArgs e) { var player = sender as IPlayer; if (e.HandledBy.Contains(this)) return; e.Resolvers[TypeClass.Priest] = new TrashResolver(player, this, $"Gain {2 * trashTriggerCount}", Player_Trashed, true); } internal void Player_Trashed(IPlayer player, ref TrashEventArgs e) { player.ReceiveBenefit(this, new CardBenefit { Currency = new Currency(2 * trashTriggerCount * e.TrashedCards.Count(c => c.Category.HasFlag(Categories.Card))) }); e.HandledBy.Add(this); } } }