protected override async Task ActAsync(IActionHost host) { var trashes = await host.SelectCards("Choose cards to trash.", Zone.DeckTop(2)); if (trashes.Any()) { host.Trash(trashes, Zone.Deck); } if (trashes.Length < 2) { var discards = await host.SelectCards("Choose cards to discard.", Zone.DeckTop(trashes.Length == 1 ? 1 : 2)); if (discards.Any()) { host.Discard(discards, Zone.Deck); } else if (!trashes.Any()) { var orderedCards = await host.OrderCards("Put these cards back in any order.", Zone.DeckTop(2)); host.Reorder(orderedCards, Zone.Deck); } } }
protected override async Task ReactAsync(IActionHost host) { host.DrawCards(2); var discarded = await host.SelectCards("Choose cards to discard.", Zone.Hand, 3, 3); host.Discard(discarded); }
protected override async Task ActAsync(IActionHost host) { var discarded = await host.SelectCards("Choose cards to discard."); host.Discard(discarded); host.AddCoins(discarded.Length); }
protected override async Task ActAsync(IActionHost host) { host.DrawCards(1); host.AddActions(1); var handSize = host.Count(Zone.Hand); if (handSize >= 2 && await host.YesNo("Mill", "<run>Discard 2 cards for</run><sym>+coin2?</sym>")) { if (handSize > 2) { var discarded = await host.SelectCards("Choose cards to discard.", 2, 2); host.Discard(discarded); } else { host.Discard(Zone.Hand); } if (handSize > 1) { host.AddCoins(2); } } }
protected override async Task ActAsync(IActionHost host) { host.AddActions(1); var discarded = await host.SelectCards("Choose any number of cards to discard."); host.Discard(discarded); host.DrawCards(discarded.Length); }
protected override async Task ActAsync(IActionHost host) { var cards = await host.SelectCards("Choose cards to trash.", 0, 4); if (cards.Any()) { host.Trash(cards); } }
protected override async Task ActAsync(IActionHost host) { host.DrawCards(3); host.AddActions(1); var discarded = await host.SelectCards("Choose cards to discard.", 3, 3); host.Discard(discarded); }
protected override async Task ReactAsync(IActionHost host) { host.DrawCards(2); var put = await host.SelectCards("Choose cards to put back.", Zone.Hand, 2, 2); host.PutOnDeck(put); var ordered = await host.OrderCards("Choose the order of the cards put back.", Zone.DeckTop(2)); host.Reorder(ordered, Zone.Deck); }
protected override async Task ActAsync(IActionHost host) { var handSize = host.Count(Zone.Hand); var trashed = handSize <= 2 ? host.Examine(Zone.Hand) : await host.SelectCards("Choose cards to trash.", Zone.Hand, 2, 2); host.Trash(trashed); if (trashed.Count() == 2) { await host.Gain("Silver", Zone.Hand); } }
protected override async Task ActAsync(IActionHost host) { host.DrawCards(1); host.AddActions(1); var selected = await host.SelectCards("Choose up to one card from your discard pile.", Zone.Discard, 0, 1); if (selected.Any()) { host.PutOnDeck(selected.Single(), Zone.Discard); } }
protected override async Task ActAsync(IActionHost host) { host.AddActions(2); var gained = await host.SelectCards( "Choose a card to gain, or none.", Zone.SupplyAvailable, card => card.Types.Contains(CardType.Action) && card.GetCost(host).LessThan(6), 0, 1 ); await host.Gain(gained); }
protected override async Task OnDiscardFromPlayAsync(IActionHost host) { var playedTreasures = host.Examine(Zone.RecentPlays).Any(card => card.Types.Contains(CardType.Treasure)); if (playedTreasures) { var putBack = await host.SelectCards( "Choose a Treasure, or none, to put back onto your deck.", Zone.InPlay, card => card.Types.Contains(CardType.Treasure), 0, 1 ); host.PutOnDeck(putBack, Zone.InPlay); } }
protected override async Task ActAsync(IActionHost host) { var revealed = await host.SelectCard("Choose a card to reveal."); if (revealed != null) { host.Reveal(revealed); var hand = host.Examine(Zone.Hand); var copies = hand.Where(c => c == revealed); var returned = await host.SelectCards("Choose copies to return.", copies); host.ReturnToSupply(returned); await host.Attack(target => target.Gain(revealed)); } }
protected override async Task ActAsync(IActionHost host) { await host.ChooseOne("Steward", new NamedOption("+2 Cards", () => host.DrawCards(2)), new NamedOption("<sym>+coin2</sym>", () => host.AddCoins(2)), new NamedOption("Trash 2 cards", async() => { var handSize = host.Count(Zone.Hand); if (handSize > 2) { var trashed = await host.SelectCards("Choose cards to trash.", Zone.Hand, 2, 2); host.Trash(trashed); } else { host.Trash(Zone.Hand); } }) ); }
protected override async Task ActAsync(IActionHost host) { host.DrawCards(1); host.AddActions(1); host.AddCoins(1); var emptyPiles = host.Count(Zone.SupplyEmpty); var handSize = host.Count(Zone.Hand); var toDiscard = Math.Min(emptyPiles, handSize); if (toDiscard > 0) { var discarded = await host.SelectCards( toDiscard == 1? "Choose a card to discard." : $"Choose {toDiscard} cards to discard.", toDiscard, toDiscard ); host.Discard(discarded); } }
protected override async Task ActAsync(IActionHost host) { host.DrawCards(2); var selections = new Dictionary <IActionHost, string>(); await host.AllPlayers(async player => { var selected = await player.SelectCard("Choose a card to pass to your left.", Zone.Hand); selections[player] = selected.Name; }); foreach (var kvp in selections) { kvp.Key.PassCard(kvp.Key.GetPlayerToLeft(), kvp.Value); } var trashed = await host.SelectCards("Choose up to one card to trash.", Zone.Hand, 0, 1); if (trashed.Any()) { host.Trash(trashed); } }
protected override async Task ActAsync(IActionHost host) { var trashed = new List <ICard>(); await host.Attack(async player => { var top2 = player.Reveal(Zone.DeckTop(2)); var treasures = top2.OfType <ITreasureCard>(); if (treasures.Any()) { if (treasures.Count() == 1 || treasures.First().Equals(treasures.Last())) { var soleTreasure = treasures.First(); player.Trash(soleTreasure, Zone.Deck); trashed.Add(soleTreasure); } else { var chosenTreasure = await host.SelectCard("Choose a Treasure to trash.", treasures); player.Trash(chosenTreasure, Zone.Deck); trashed.Add(chosenTreasure); } } }); if (trashed.Any()) { var gained = await host.SelectCards("Choose trashed Treasures to gain.", trashed); if (gained.Any()) { await host.GainFrom(gained, Zone.Trash); } } }
// no numbers public static Task <T[]> SelectCards <T>(this IActionHost host, string prompt, Zone source, Func <IEnumerable <ICard>, IEnumerable <T> > filter) where T : ICard { return(host.SelectCards(prompt, source, filter, null, null)); }
// no filter or zone public static Task <ICard[]> SelectCards(this IActionHost host, string prompt) { return(host.SelectCards <ICard>(prompt, Zone.Hand, x => x, null, null)); }
public static async Task <T> SelectCard <T>(this IActionHost host, string prompt, IEnumerable <T> choices) where T : ICard { var cards = await host.SelectCards <T>(prompt, Zone.Hand, _ => choices, 1, 1); return(cards.SingleOrDefault()); }
public static Task <T[]> SelectCards <T>(this IActionHost host, string prompt, IEnumerable <T> choices, int min, int max) where T : ICard { return(host.SelectCards <T>(prompt, Zone.Hand, _ => choices, min, max)); }
public static Task <T[]> SelectCards <T>(this IActionHost host, string prompt, Func <IEnumerable <ICard>, IEnumerable <T> > filter, int min, int max) where T : ICard { return(host.SelectCards <T>(prompt, Zone.Hand, filter, min, max)); }
public static async Task <ICard> SelectCard(this IActionHost host, string prompt, Zone source, Func <ICard, bool> filter) { var cards = await host.SelectCards <ICard>(prompt, source, cs => cs.Where(filter), 1, 1); return(cards.SingleOrDefault()); }
public static Task <ICard[]> SelectCards(this IActionHost host, string prompt, int min, int max) { return(host.SelectCards <ICard>(prompt, Zone.Hand, x => x, min, max)); }
public static async Task <ICard> SelectCard(this IActionHost host, string prompt) { var cards = await host.SelectCards <ICard>(prompt, Zone.Hand, x => x, 1, 1); return(cards.SingleOrDefault()); }
public static async Task <T> SelectCard <T>(this IActionHost host, string prompt, Func <IEnumerable <ICard>, IEnumerable <T> > filter) where T : ICard { var cards = await host.SelectCards <T>(prompt, Zone.Hand, filter, 1, 1); return(cards.SingleOrDefault()); }
// simple predicate public static Task <ICard[]> SelectCards(this IActionHost host, string prompt, Zone source, Func <ICard, bool> filter, int?min, int?max) { return(host.SelectCards <ICard>(prompt, source, cs => cs.Where(filter), min, max)); }