using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Sewers : Project { public Sewers() : base(Source.Renaissance, 3, Traits.DeckReduction | Traits.RemoveCurses | Traits.RemoveFromHand | Traits.Trasher) { } public override void TearDown(IGame game) { foreach (var tp in PurchasedPlayers) tp.Trashed -= Player_Trashed; base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var tp = PurchasedPlayers.Find(p => p == player); if (tp != null) tp.Trashed -= Player_Trashed; else PurchasedPlayers.Add(player); player.Trashed += Player_Trashed; } private void Player_Trashed(object sender, TrashEventArgs e) { var player = sender as IPlayer; if (e.HandledBy.Contains(TypeClass.Sewers) || e.Source == this) return; if (!e.Resolvers.ContainsKey(TypeClass.Sewers)) e.Resolvers[TypeClass.Sewers] = new TrashResolver(player, this, $"Resolve {this}", Player_Action, true); } internal void Player_Action(IPlayer player, ref TrashEventArgs e) { var choice = new Choice(Resource.ChooseACardToTrash, this, player.Hand, ChoiceOutcome.Trash, player, minimum: 0); var result = player.MakeChoice(choice); if (result.Cards.Any()) { player.Trash(this, player.RetrieveCardFrom(DeckLocation.Hand, result.Cards[0])); } e.HandledBy.Add(TypeClass.Sewers); } } }