using DominionBase.Enums; using DominionBase.Players; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class TheRiversGift : Boon { private readonly Dictionary _turnEndedEventHandlers = new Dictionary(); private CleaningUpEventHandler _CleaningUpEventHandler; public TheRiversGift() : base(Source.Nocturne, Traits.PlusCard | Traits.NetCardDraw) { } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) { player.CleaningUp -= _CleaningUpEventHandler; foreach (var handler in _turnEndedEventHandlers) player.TurnEnded -= handler.Value; } _CleaningUpEventHandler = null; _turnEndedEventHandlers.Clear(); } public override bool Receive(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Receive(player); var boons = (IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons]; player.KeepBoon(boons, this); if (player._Game.ActivePlayer == player) { _CleaningUpEventHandler = new CleaningUpEventHandler(Player_CleaningUp); player.CleaningUp += _CleaningUpEventHandler; } _turnEndedEventHandlers[player] = new TurnEndedEventHandler(Player_TurnEnded); // At the end of the current player's turn, not necessarily the player who's receiving it's turn player._Game.CurrentTurn.Player.TurnEnded += _turnEndedEventHandlers[player]; return false; } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { var player = (IPlayer)sender; foreach (var handler in _turnEndedEventHandlers) { handler.Key.ReceiveBenefit(this, new CardBenefit { Cards = 1 }); player.TurnEnded -= handler.Value; } _turnEndedEventHandlers.Clear(); } private void Player_CleaningUp(object sender, CleaningUpEventArgs e) { if (e.Resolvers.ContainsKey(TypeClass.TheRiversGift)) return; e.Resolvers[TypeClass.TheRiversGift] = new CleaningUpResolver(this, $"Return {this}", Player_Action, true); } internal void Player_Action(IPlayer player, ref CleaningUpEventArgs e) { player.ReturnBoon((IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons], this); player.CleaningUp -= _CleaningUpEventHandler; } } }