using DominionBase.Enums; using DominionBase.Piles; using DominionBase.Players; using DominionBase.Properties; using System.Collections.Generic; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class Sleigh : Card { private CardGainedEventHandler _CardGainedHandler; public Sleigh() : base(Categories.Action | Categories.Reaction, Source.Menagerie, Location.Kingdom, Traits.CardOrdering | Traits.Discard | Traits.Gainer | Traits.IncludesExtraPiles | Traits.ReactToGain | Traits.Terminal) { BaseCost = new Cost(2); } public override void SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); Horse.SetupSupply(game); } public override void FollowInstructions(IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.FollowInstructions(player); player.Gain((ISupply)player._Game.Table.SpecialPiles[TypeClass.Horse], this, 2); } public override void AddedTo(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.AddedTo(location, player); if (location == DeckLocation.Hand) { if (_CardGainedHandler != null) player.CardGained -= _CardGainedHandler; _CardGainedHandler = new CardGainedEventHandler(Player_CardGained); player.CardGained += _CardGainedHandler; } } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = Type.ToString(); // Already been cancelled -- don't need to process this one // If the card has been "lost track of", then we can skip revealing it // We also need to make sure we're in the player's hand and we can be revealed if (e.Cancelled || e.IsLostTrackOf || player != Owner || !player.Hand.Contains(PhysicalCard) || e.Resolvers.ContainsKey(key)) return; e.Resolvers[key] = new CardGainResolver(player, this, "DiscardCard", Resource.DiscardCard.Replace("{card}", PhysicalCard.ToString()), Player_DiscardSleigh, false); } internal void Player_DiscardSleigh(IPlayer player, ref Players.CardGainEventArgs e) { player.Discard(DeckLocation.Hand, this); var moveChoice = new Choice(Resource.HandOrTopDeck.Replace("{card}", e.Card.ToString()), this, e.Card, new List { Resource.PutIntoHand, Resource.PutOnDeck }, player); var moveResult = player.MakeChoice(moveChoice); if (moveResult.Options[0] == Resource.PutIntoHand) { e.Cancelled = true; player.RetrieveCardFrom(e.Location, e.Card); e.Location = DeckLocation.Hand; e.Position = DeckPosition.Top; } else { e.Cancelled = true; player.RetrieveCardFrom(e.Location, e.Card); e.Location = DeckLocation.Deck; e.Position = DeckPosition.Top; } e.HandledBy.Add(Type); } public override void RemovedFrom(DeckLocation location, IPlayer player) { Contract.Requires(player != null, "player cannot be null"); base.RemovedFrom(location, player); if (_CardGainedHandler != null) player.CardGained -= _CardGainedHandler; _CardGainedHandler = null; } } }