using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Nocturne { public class NightWatchman : Card { public NightWatchman() : base(Categories.Night, Source.Nocturne, Location.Kingdom, Traits.CardOrdering | Traits.Discard | Traits.ReactToGain) { BaseCost = new Cost(3); } public override void SetupCard(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.SetupCard(game); foreach (var player in game.Players) player.CardGained += Player_CardGained; } public override void TearDown(IGame game) { Contract.Requires(game != null, "game cannot be null"); base.TearDown(game); foreach (var player in game.Players) player.CardGained -= Player_CardGained; } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.NightWatchman.ToString(); // This is not the card you are looking for if (e.Card != this || e.Resolvers.ContainsKey(key) || e.HandledBy.Contains(this)) return; e.Resolvers[key] = new CardGainResolver(player, this, "PutIntoHand", $"Put {PhysicalCard} into your hand", Player_GainNightWatchman, true); } internal void Player_GainNightWatchman(IPlayer player, ref Players.CardGainEventArgs e) { e.Cancelled = true; e.IsLostTrackOf = true; e.Location = DeckLocation.Hand; e.HandledBy.Add(this); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); player.Draw(5, DeckLocation.Private); var choiceDiscard = new Choice(Resource.ChooseDiscards, this, player.Private, ChoiceOutcome.Discard, player, minimum: 0, maximum: player.Private.Count); var resultDiscard = player.MakeChoice(choiceDiscard); player.Discard(DeckLocation.Private, resultDiscard.Cards); var replaceChoice = new Choice(Resource.ChooseOrderToTopdeck, this, player.Private, ChoiceOutcome.Select, player, isOrdered: true, minimum: player.Private.Count, maximum: player.Private.Count); var replaceResult = player.MakeChoice(replaceChoice); player.AddCardsToDeck(player.RetrieveCardsFrom(DeckLocation.Private, replaceResult.Cards), DeckPosition.Top); } } }