using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Menagerie { public class SeizeTheDay : Event { private TurnEndedEventHandler _turnEndedEventHandler; public SeizeTheDay() : base(Source.Menagerie, 4, Traits.None) { } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); if (_turnEndedEventHandler != null) foreach (var player in game.Players) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = null; base.TearDown(game); } public override bool CanBuy(IPlayer player, Currency currency) { Contract.Requires(player != null, "player cannot be null"); if (player._Game.TurnsTaken.Any(t => t.Player == player && t.CardsBought.Contains(this))) return false; return base.CanBuy(player, currency); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); if (player._Game.TurnsTaken.Count(t => t.Player == player && t.CardsBought.Contains(this)) == 1) { if (_turnEndedEventHandler != null) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = new TurnEndedEventHandler(Player_TurnEnded); player.TurnEnded += _turnEndedEventHandler; } } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { var player = sender as IPlayer; e.NextPlayer = e.Player; e.NextGrantedBy = this; if (_turnEndedEventHandler != null) player.TurnEnded -= _turnEndedEventHandler; _turnEndedEventHandler = null; } } }