using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Nocturne { public class Raider : Card { private IPlayer _turnStartedPlayer; public Raider() : base(Categories.Night | Categories.Duration | Categories.Attack, Source.Nocturne, Location.Kingdom, Traits.AffectOthers | Traits.Discard | Traits.PlusCoin) { BaseCost = new Cost(6); DurationBenefit.Currency.Coin.Value = 3; } public override void TearDown(IGame game) { base.TearDown(game); if (_turnStartedPlayer != null) _turnStartedPlayer.TurnStarted -= Player_TurnStarted; _turnStartedPlayer = null; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); var enumerator = player._Game.GetPlayersStartingWithEnumerator(player); enumerator.MoveNext(); while (enumerator.MoveNext()) { var attackee = enumerator.Current; // Skip if the attack is blocked (Moat, Lighthouse, etc.) if (IsAttackBlocked[attackee]) continue; if (attackee.Hand.Count < 5) continue; var toDiscard = attackee.Hand[c => player.InPlayAndSetAside.Any(pc => pc.Name == c.Name)]; if (toDiscard.Any()) { var choice = new Choice("Choose a card to discard.", this, attackee.Hand[c => player.InPlayAndSetAside.Any(pc => pc.Name == c.Name)], ChoiceOutcome.Discard, attackee); var result = attackee.MakeChoice(choice); attackee.Discard(DeckLocation.Hand, result.Cards); } else attackee.ReturnHand(attackee.RevealHand()); } CanCleanUpPlayed.Add(false); _turnStartedPlayer = player; _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; } } }