using DominionBase.Enums; using DominionBase.Players; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Renaissance { public class Experiment : Card { public Experiment() : base(Categories.Action, Source.Renaissance, Location.Kingdom, Traits.DeckReduction | Traits.Gainer | Traits.NetCardDraw | Traits.PlusAction | Traits.PlusCard | Traits.ReactToGain) { BaseCost = new Cost(3); Benefit.Actions = 1; Benefit.Cards = 2; } 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; } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); if (player.InPlay.Contains(PhysicalCard)) { player.RetrieveCardFrom(DeckLocation.InPlay, PhysicalCard); var supply = (ISupply)player._Game.Table[Type]; player.Lose(this); supply.AddTo(this); player._Game.SendMessage(player, this, "Return", supply); } } 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; // Experiment gain chain is explicitly not allowed if (e.Source != null && e.Source.Type == Type) return; e.Resolvers[key] = new CardGainResolver(player, this, "GainExperiment", "Gain another Experiment", Player_GainExperiment, true); } internal void Player_GainExperiment(IPlayer player, ref CardGainEventArgs e) { player.Gain((ISupply)player._Game.Table[Type], this); e.HandledBy.Add(this); } } }