using DominionBase.Enums; using DominionBase.Players; using DominionBase.Properties; using System.Diagnostics.Contracts; namespace DominionBase.Cards.Menagerie { public class Hostelry : Card { public Hostelry() : base(Categories.Action, Source.Menagerie, Location.Kingdom, Traits.Cantrip | Traits.Discard | Traits.Gainer | Traits.IncludesExtraPiles | Traits.PlusAction | Traits.PlusCard | Traits.PlusMultipleActions | Traits.ReactToGain) { BaseCost = new Cost(4); Benefit.Cards = 1; Benefit.Actions = 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 SetupSupply(IGame game, ISupply supply) { Contract.Requires(game != null, "game cannot be null"); base.SetupSupply(game, supply); Horse.SetupSupply(game); } 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; } private void Player_CardGained(object sender, Players.CardGainEventArgs e) { var player = sender as IPlayer; var key = TypeClass.Hostelry.ToString(); // This is not the card you are looking for if (e.Card != this || e.Resolvers.ContainsKey(key) || e.HandledBy.Contains(this) || e.IsLostTrackOf) return; e.Resolvers[key] = new CardGainResolver(player, this, "ResolveCard", $"Resolve {Name}", Player_GainHostelry, true); } internal void Player_GainHostelry(IPlayer player, ref Players.CardGainEventArgs e) { var treasureCards = player.Hand[Categories.Treasure]; var choice = new Choice(Resource.DiscardTreasuresForHorses, this, treasureCards, ChoiceOutcome.Discard, player, minimum: 0, maximum: treasureCards.Count); var result = player.MakeChoice(choice); player.AddCardsInto(DeckLocation.Revealed, result.Cards); player.Discard(DeckLocation.Hand, player.RetrieveCardsFrom(DeckLocation.Revealed, result.Cards)); if (result.Cards.Count > 0) player.Gain((ISupply)player._Game.Table.SpecialPiles[TypeClass.Horse], this, result.Cards.Count); e.HandledBy.Add(this); } } }