using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class Tracker : Fate { private CardGainedEventHandler _cardGainedEventHandler; public Tracker() : base(Categories.Action, Location.Kingdom, Traits.ConditionalBenefit | Traits.PlusCoin | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(2); Benefit.Currency.Coin.Value = 1; } public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); for (var i = 0; i < game.Players.Count; i++) { Card card = new Pouch(); game.Table.Copper.AddTo(card); card.SetupCard(game); } } 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 -= _cardGainedEventHandler; _cardGainedEventHandler = null; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var supply = (IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons]; supply.TurnOverNextAndReceive(player); } public override void AddedTo(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.AddedTo(location, player); if (location == DeckLocation.InPlay) { if (_cardGainedEventHandler != null) player.CardGained -= _cardGainedEventHandler; _cardGainedEventHandler = new CardGainedEventHandler(Player_CardGained); player.CardGained += _cardGainedEventHandler; } } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.Tracker.ToString(); // Already been cancelled -- don't need to process this one if (e.Cancelled || e.Resolvers.ContainsKey(key)) return; e.Resolvers[key] = new CardGainResolver(player, this, "PutOnDeck", Resource.PutOnDeck, Player_Action, false); } internal void Player_Action(IPlayer player, ref Players.CardGainEventArgs e) { e.Cancelled = true; e.Location = DeckLocation.Deck; e.Position = DeckPosition.Top; e.HandledBy.Add(TypeClass.Tracker); } public override void RemovedFrom(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.RemovedFrom(location, player); if (_cardGainedEventHandler != null) player.CardGained -= _cardGainedEventHandler; _cardGainedEventHandler = null; } } }