using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Silos : Project { public Silos() : base(Source.Renaissance, 4, Traits.Discard) { } public override void TearDown(IGame game) { foreach (var tsp in PurchasedPlayers) tsp.TurnStarted -= Player_TurnStarted; base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var tsp = PurchasedPlayers.Find(p => p == player); if (tsp != null) tsp.TurnStarted -= Player_TurnStarted; else PurchasedPlayers.Add(player); player.TurnStarted += Player_TurnStarted; } private void Player_TurnStarted(object sender, TurnStartedEventArgs e) { var key = ToString(); if (e.HandledBy.Contains(key) || !e.Player.Hand[Universal.TypeClass.Copper].Any()) 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 coppers = player.Hand[Universal.TypeClass.Copper]; var choice = new Choice("Discard any number of Coppers", this, coppers, ChoiceOutcome.Discard, player, minimum: 0, maximum: coppers.Count); var result = player.MakeChoice(choice); if (result.Cards.Any()) { var toDraw = result.Cards.Count; player.Discard(DeckLocation.Hand, result.Cards); // The bad thing about converting this from ReceiveBenefit to DrawHand is that we lose the source of the action // Should think about updating DrawHand to accept a "source" object player.DrawHand(toDraw); //player.ReceiveBenefit(this, new CardBenefit { Cards = toDraw }); } e.HandledBy.Add(ToString()); } } }