Example #1
0
        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);
                }
            }
        }
Example #2
0
        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);
        }
Example #3
0
        protected override async Task ActAsync(IActionHost host)
        {
            var discarded = await host.SelectCards("Choose cards to discard.");

            host.Discard(discarded);
            host.AddCoins(discarded.Length);
        }
Example #4
0
        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);
                }
            }
        }
Example #5
0
        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);
        }
Example #6
0
        protected override async Task ActAsync(IActionHost host)
        {
            var cards = await host.SelectCards("Choose cards to trash.", 0, 4);

            if (cards.Any())
            {
                host.Trash(cards);
            }
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #9
0
        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);
            }
        }
Example #10
0
        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);
            }
        }
Example #11
0
        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);
        }
Example #12
0
        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);
            }
        }
Example #13
0
        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));
            }
        }
Example #14
0
 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);
         }
     })
                          );
 }
Example #15
0
        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);
            }
        }
Example #16
0
        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);
            }
        }
Example #17
0
        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);
                }
            }
        }
Example #18
0
 // 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));
 }
Example #19
0
 // 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));
 }
Example #20
0
        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());
        }
Example #21
0
 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));
 }
Example #22
0
 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));
 }
Example #23
0
        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());
        }
Example #24
0
 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));
 }
Example #25
0
        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());
        }
Example #26
0
        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());
        }
Example #27
0
 // 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));
 }