using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class SilkMerchant : Card { public SilkMerchant() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.Component | Traits.NetCardDraw | Traits.PlusBuy | Traits.PlusCard | Traits.PlusCoffer | Traits.PlusVillager | Traits.ReactToGain | Traits.ReactToTrashing | Traits.Terminal) { BaseCost = new Cost(4); Benefit.Cards = 2; Benefit.Buys = 1; } 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; player.Trashed += Player_Trashed; } } 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; player.Trashed -= Player_Trashed; } } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.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, "GainTokens", Resource.GainCoffersAndVillager, Player_GainSilkMerchant, true); } private void Player_Trashed(object sender, TrashEventArgs e) { // Already being processed or been handled -- don't need to process this one if (e.Resolvers.ContainsKey(Type) || e.HandledBy.Contains(this)) return; if (e.TrashedCards.Contains(PhysicalCard)) e.Resolvers[Type] = new TrashResolver(e.CurrentPlayer, this, Resource.GainCoffersAndVillager, Player_TrashSilkMerchant, true); } internal void Player_GainSilkMerchant(IPlayer player, ref CardGainEventArgs e) { GainOrTrashBenefit(player); e.HandledBy.Add(this); } internal void Player_TrashSilkMerchant(IPlayer player, ref TrashEventArgs e) { GainOrTrashBenefit(player); e.HandledBy.Add(this); } private void GainOrTrashBenefit(IPlayer player) { player.ReceiveBenefit(this, new CardBenefit { Coffers = 1, Villagers = 1 }); } } }