using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class SecretCave : Card { private IPlayer _turnStartedPlayer; public SecretCave() : base(Categories.Action | Categories.Duration, Source.Nocturne, Location.Kingdom, Traits.Cantrip | Traits.ConditionalBenefit | Traits.Discard | Traits.PlusAction | Traits.PlusCard | Traits.PlusCoin) { BaseCost = new Cost(3); Benefit.Cards = 1; Benefit.Actions = 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 MagicLamp(); game.Table.Copper.AddTo(card); card.SetupCard(game); } } 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); player.TurnStarted -= Player_TurnStarted; var choiceYesNo = Choice.CreateYesNoChoice("You may discard 3 cards.", this, this, player, null); var resultYesNo = player.MakeChoice(choiceYesNo); if (resultYesNo.Options[0] == Resource.Yes) { var choice = new Choice("Discard 3 cards", this, player.Hand, ChoiceOutcome.Discard, player, minimum: 3, maximum: 3); var result = player.MakeChoice(choice); player.Discard(DeckLocation.Hand, result.Cards); if (result.Cards.Count == 3) { CanCleanUpPlayed.Add(false); _turnStartedPlayer = player; _turnStartedPlayer.TurnEnded += Player_TurnEnded; } else CanCleanUpPlayed.Add(true); } } 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); player.ReceiveBenefit(this, new CardBenefit { Currency = new Currency(3) }); } } }