using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class WayOfTheSeal : Way { private readonly Dictionary _cardGainedHandlers = new Dictionary(); public WayOfTheSeal() : base(Source.Menagerie, Traits.PlusCoin | Traits.Terminal) { Benefit.Currency.Coin.Value = 1; } public override void Finalize(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.Finalize(game); foreach (var player in game.Players) player.TurnEnded += Player_TurnEnded; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); foreach (var player in game.Players) player.TurnEnded -= Player_TurnEnded; foreach (var handlers in _cardGainedHandlers) { for (var i = 0; i < handlers.Value; i++) handlers.Key.CardGained -= Player_CardGained; } base.TearDown(game); } public override void FollowAlternateInstructions(IPlayer player, Card playedCard) { Contract.Requires(player != default(IPlayer), "player cannot be null"); Contract.Requires(playedCard != default(Card), "playedCard cannot be null"); base.FollowAlternateInstructions(player, playedCard); if (!_cardGainedHandlers.ContainsKey(player)) _cardGainedHandlers[player] = 0; _cardGainedHandlers[player]++; player.CardGained += Player_CardGained; } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.ToString(); // Already been cancelled -- don't need to process this one if (e.Cancelled || e.Resolvers.ContainsKey(key) || e.IsLostTrackOf) return; e.Resolvers[key] = new CardGainResolver(player, this, "PutOnDeck", Resource.PutOnDeck, (IPlayer playerAction, ref Players.CardGainEventArgs eAction) => { e.Cancelled = true; e.Location = DeckLocation.Deck; e.Position = DeckPosition.Top; e.HandledBy.Add(Type); }, false); } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { // Clear out all handlers, regardless of whose turn it is foreach (var handlers in _cardGainedHandlers) { for (var i = 0; i < handlers.Value; i++) handlers.Key.CardGained -= Player_CardGained; } _cardGainedHandlers.Clear(); } } }