using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class StarChart : Project { public StarChart() : base(Source.Renaissance, 3, Traits.CardOrdering) { } public override void TearDown(IGame game) { foreach (var pp in PurchasedPlayers) pp.Shuffling -= Player_Shuffling; base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var pp = PurchasedPlayers.Find(p => p == player); if (pp != null) pp.Shuffling -= Player_Shuffling; else PurchasedPlayers.Add(player); player.Shuffling += Player_Shuffling; } private void Player_Shuffling(object sender, ShuffleEventArgs e) { if (e.HandledBy.Contains(Type) || e.Resolvers.ContainsKey(Type)) return; e.Resolvers[Type] = new ShuffleResolver(e.Player, this, $"Resolve {Name}", (IPlayer player, ref ShuffleEventArgs sea) => { var deck = e.ShuffleCards.OfType(); var choiceTop = new Choice("Cards are being shuffled. You may choose one to go on top", this, deck, ChoiceOutcome.Select, e.Player, minimum: 0, maximum: 1); var resultTop = e.Player.MakeChoice(choiceTop); if (resultTop.Cards.Any()) { var toTop = resultTop.Cards[0]; sea.ShuffleCards.Remove(toTop); e.Player.AddCardInto(DeckLocation.Deck, toTop, DeckPosition.Bottom); } e.HandledBy.Add(Type); }, false); } } }