using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class Barge : Card { private IPlayer _turnStartedPlayer; public Barge() : base(Categories.Action | Categories.Duration, Source.Menagerie, Location.Kingdom, Traits.ConditionalBenefit | Traits.NetCardDraw | Traits.PlusBuy | Traits.PlusCard | Traits.Terminal) { BaseCost = new Cost(5); } public override void TearDown(IGame game) { base.TearDown(game); if (_turnStartedPlayer != null) { _turnStartedPlayer.TurnEnded -= Player_TurnEnded; _turnStartedPlayer.TurnStarted -= Player_TurnStarted; } _turnStartedPlayer = null; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var choiceTurn = new Choice(Resource.ChooseOne, this, this, new List { Resource.Now, Resource.NextTurn }, player); var resultTurn = player.MakeChoice(choiceTurn); if (resultTurn.Options.Count > 0) { if (resultTurn.Options[0] == Resource.Now) { TakeBenefit(player); CanCleanUpPlayed.Add(true); } else { CanCleanUpPlayed.Add(false); _turnStartedPlayer = player; _turnStartedPlayer.TurnEnded += Player_TurnEnded; } } } private void Player_TurnEnded(object sender, TurnEndedEventArgs e) { _turnStartedPlayer.TurnEnded -= Player_TurnEnded; _turnStartedPlayer.TurnStarted += Player_TurnStarted; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, Resource.ResolveCard.Replace("{card}", PhysicalCard.ToString()), Player_Action, true); } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { ResolveDuration(e.Player); CanCleanUpPlayed.Remove(false); e.Player.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } public override void ResolveDuration(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.ResolveDuration(player); TakeBenefit(player); } private void TakeBenefit(IPlayer player) { player.ReceiveBenefit(this, new CardBenefit { Cards = 3, Buys = 1 }); } } }