using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class LostInTheWoods : State { private IPlayer _turnStartedPlayer; public LostInTheWoods() : base(Source.Nocturne, Traits.ConditionalBenefit | Traits.Discard) { } public override bool CanBeMultiples => false; public override void TearDown(IGame game) { base.TearDown(game); if (_turnStartedPlayer != null) _turnStartedPlayer.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } public override void TakenBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.TakenBy(player); if (_turnStartedPlayer != null) _turnStartedPlayer.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = player; _turnStartedPlayer.TurnStarted += Player_TurnStarted; } public override void ReturnedBy(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.ReturnedBy(player); player.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (e.HandledBy.Contains(key)) return; if (!e.Resolvers.ContainsKey(key)) e.Resolvers[key] = new TurnStartedResolver(e.Player, this, $"Resolve {this}", Player_Action, true); } internal void Player_Action(IPlayer player, ref TurnStartedEventArgs e) { var choice = new Choice("You may discard a card to receive a Boon.", this, player.Hand, ChoiceOutcome.Discard, player, minimum: 0); var result = player.MakeChoice(choice); if (result.Cards.Any()) { player.Discard(DeckLocation.Hand, result.Cards); var supply = (IBoonSupply)player._Game.Table.SpecialPiles[TypeClass.Boons]; supply.TurnOverNextAndReceive(player); } e.HandledBy.Add(ToString()); } } }