Ejemplo n.º 1
0
        protected override async Task ActAsync(IActionHost host)
        {
            await host.Attack(async target =>
            {
                var revealed = target.RevealUntil(card => card.GetCost(host).GreaterThan(2));
                if (revealed.Any())
                {
                    var trashed = revealed.Last();
                    target.Trash(trashed, Zone.Revealed);

                    var gained = await target.SelectCards(
                        "Choose a card to gain, or none.",
                        Zone.SupplyAvailable,
                        card => card.GetCost(host).LessThanOrEqual(trashed.GetCost(host).Minus(2)),
                        0, 1
                        );
                    if (gained.Any())
                    {
                        await target.Gain(gained.Single());
                    }

                    target.Discard(revealed.Take(revealed.Length - 1).ToArray(), Zone.Revealed);
                }
            });
        }
Ejemplo n.º 2
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.DrawCards(1);
            host.AddActions(1);

            await host.Attack(target => target.Gain("Curse"));
        }
Ejemplo n.º 3
0
        protected override async Task ActAsync(IActionHost host)
        {
            var trashed = await host.SelectCard("Choose a card to trash.", Zone.Hand);

            if (trashed != null)
            {
                var cost = trashed.GetCost(host);
                host.Trash(trashed);

                var gained = await host.SelectCard(
                    "Choose a card to gain.",
                    Zone.SupplyAvailable,
                    card => card.GetCost(host).LessThanOrEqual(cost.Plus(2))
                    );

                if (gained != null)
                {
                    if (gained.Types.Contains(CardType.Action) || gained.Types.Contains(CardType.Treasure))
                    {
                        await host.Gain(gained, Zone.Deck);
                    }
                    else
                    {
                        await host.Gain(gained);
                    }

                    if (gained.Types.Contains(CardType.Victory))
                    {
                        await host.Attack(target => target.Gain("Curse"));
                    }
                }
            }
        }
Ejemplo n.º 4
0
        protected override async Task ActAsync(IActionHost host)
        {
            await host.Gain("Gold");

            var trashed = new List <ICard>();

            await host.Attack(async player =>
            {
                var top2 = player.Reveal(Zone.DeckTop(2));

                var trashed = false;
                foreach (var card in top2)
                {
                    if (!trashed && card.Types.Contains(CardType.Treasure) && card.Name != "Copper")
                    {
                        trashed = true;
                        player.Trash(card, Zone.Deck);
                    }
                    else
                    {
                        player.Discard(card, Zone.Deck);
                    }
                }
            });
        }
Ejemplo n.º 5
0
 protected override async Task ActAsync(IActionHost host)
 {
     await host.Attack(async target =>
     {
         target.Discard(Zone.DeckTop(1));
         await target.Gain("Curse", Zone.Deck);
     });
 }
Ejemplo n.º 6
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.AddCoins(2);

            await host.Attack(player => player.Count(Zone.Hand) > 3, async player =>
            {
                var n = player.Count(Zone.Hand) - 3;
                var discardedCards = await player.SelectCards(n == 1 ? "Choose a card to discard." : $"Choose {n} cards to discard.", n, n);
                player.Discard(discardedCards);
            });
        }
Ejemplo n.º 7
0
 protected override async Task ActAsync(IActionHost host)
 {
     host.DrawCards(2);
     await host.Attack(target => target.Count(Zone.Hand) >= 4, async target =>
     {
         while (target.Count(Zone.Hand) > 3)
         {
             var put = await target.SelectCard("Choose a card to put onto your deck");
             target.PutOnDeck(put);
         }
     });
 }
Ejemplo n.º 8
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));
            }
        }
Ejemplo n.º 9
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.AddCoins(2);

            await host.Attack(target =>
            {
                var hand = target.Examine(Zone.Hand);
                if (hand.Any(card => card.Name == "Copper"))
                {
                    target.Discard("Copper");
                }
                else
                {
                    target.Reveal(Zone.Hand);
                }
            });
        }
Ejemplo n.º 10
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.AddActions(1);

            await host.ChooseOne("Minion",
                                 new NamedOption("<sym>+coin2</sym>", () => host.AddCoins(2)),
                                 new NamedOption("<run>More</run><card suffix='s!'>Minion</card>", async() =>
            {
                host.Discard(Zone.Hand);
                host.DrawCards(4);
                await host.Attack(target => target.Count(Zone.Hand) >= 5, target =>
                {
                    target.Discard(Zone.Hand);
                    target.DrawCards(4);
                });
            })
                                 );
        }
Ejemplo n.º 11
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.AddCoins(2);

            await host.Attack(async target =>
            {
                var topDeck = target.Examine(Zone.DeckTop(1)).SingleOrDefault();
                if (topDeck != null)
                {
                    var topDeckCost = topDeck.GetCost(host);

                    target.Trash(topDeck, Zone.Deck);

                    var gained = await host.SelectCard(
                        $"Choose a card for {target.Player} to gain.",
                        Zone.SupplyAvailable,
                        card => card.GetCost(host).Equals(topDeckCost)
                        );
                    await target.Gain(gained);
                }
            });
        }
Ejemplo n.º 12
0
        protected override async Task ActAsync(IActionHost host)
        {
            await host.Gain("Silver", Zone.Deck);

            await host.Attack(async player =>
            {
                var hand = player.Examine(Zone.Hand);
                if (hand.Any(card => card.Types.Contains(CardType.Victory)))
                {
                    var onTop = await player.SelectCard(
                        "Choose a card to put onto your deck.",
                        Zone.Hand,
                        cards => cards.OfType <IVictoryCard>()
                        );
                    player.Reveal(onTop, Zone.Hand);
                    player.PutOnDeck(onTop, Zone.Hand);
                }
                else
                {
                    player.Reveal(Zone.Hand);
                }
            });
        }
Ejemplo n.º 13
0
        protected override async Task ActAsync(IActionHost host)
        {
            var tokens = host.Count(Zone.PlayerMat("PirateShipMat"));

            await host.ChooseOne("Pirate Ship",
                                 new NamedOption($"<sym>+coin1</sym><run>per Coin token (+${tokens}).</run>", () =>
            {
                host.AddCoins(tokens);
            }),
                                 new NamedOption("Raid for Treasures!", async() =>
            {
                var anyTrashes = false;
                await host.Attack(async target =>
                {
                    var top2 = target.Reveal(Zone.DeckTop(2));
                    var top2Treasures = top2.OfType <ITreasureCard>();
                    if (top2Treasures.Count() == 1)
                    {
                        target.Trash(top2Treasures.Single(), Zone.Deck);
                        anyTrashes = true;
                    }
                    else if (top2Treasures.Count() == 2)
                    {
                        var trashed = await host.SelectCard($"Choose a Treasure for {target.Player} to trash.", top2Treasures);
                        target.Trash(trashed, Zone.Deck);
                        anyTrashes = true;
                    }
                    target.Discard(top2.Without(top2Treasures).ToArray(), Zone.Deck);
                });

                if (anyTrashes)
                {
                    host.PutOnMat("PirateShipMat", "Coin", Zone.Create);
                }
            })
                                 );
        }
Ejemplo n.º 14
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);
                }
            }
        }
Ejemplo n.º 15
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.DrawCards(3);

            await host.Attack(async target =>
            {
                await target.ChooseOne("Torturer",
                                       new NamedOption("Discard 2 cards", async() =>
                {
                    var handSize = target.Count(Zone.Hand);
                    if (handSize > 2)
                    {
                        var discarded = await target.SelectCards("Choose cards to discard.", Zone.Hand, 2, 2);
                        target.Discard(discarded);
                    }
                    else
                    {
                        target.Discard(Zone.Hand);
                    }
                }),
                                       new NamedOption("Gain a Curse", () => target.Gain("Curse", Zone.Hand))
                                       );
            });
        }