using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; using System.Linq; namespace DominionBase.Cards.Renaissance { public class Innovation : Project { public Innovation() : base(Source.Renaissance, 6, Traits.ReactToGain) { } public override void TearDown(IGame game) { foreach (var cgp in PurchasedPlayers) cgp.CardGained -= Player_CardGained; base.TearDown(game); } public override void Bought(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.Bought(player); var cgp = PurchasedPlayers.Find(p => p == player); if (cgp != null) cgp.CardGained -= Player_CardGained; else PurchasedPlayers.Add(player); player.CardGained += Player_CardGained; } private void Player_CardGained(object sender, CardGainEventArgs e) { var player = sender as IPlayer; var key = ToString(); // Already been cancelled -- don't need to process this one // If the card has been "lost track of", then we can skip calling it // Also if it's not the current player's turn or if it's not an Action card // or if it's not the first Action card gained in the turn if (e.Cancelled || e.IsLostTrackOf || e.Resolvers.ContainsKey(key) || player != player._Game.ActivePlayer || e.HandledBy.Contains(TypeClass.Innovation) || !e.Card.Category.HasFlag(Categories.Action) || player.CurrentTurn.CardsGained.Any(cg => cg.Category.HasFlag(Categories.Action) && cg != e.Card) ) return; e.Resolvers[key] = new CardGainResolver(player, this, "SetAsideCard", Resource.SetAsideFor.Replace("{card}", this.ToString()), Player_SetAside, false); } internal void Player_SetAside(IPlayer player, ref CardGainEventArgs e) { var c = player.RetrieveCardFrom(e.Location, e.Card); e.Cancelled = true; e.Location = DeckLocation.PlayerMat; player._Game.SendMessage(player, this, "SetAside", c); player.Actions++; player.AddCardInto(DeckLocation.InPlay, c); player.PlayCardInternal(c.LogicalCard, modifier: $" from {Name}"); e.HandledBy.Add(this); } } }