예제 #1
0
파일: Mill.cs 프로젝트: gulbanana/cardgame
        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);
                }
            }
        }
예제 #2
0
        protected override async Task ActAsync(IActionHost host)
        {
            host.DrawCards(2);
            host.AddActions(1);

            var inserted = await host.SelectCard("Choose a card to put in your deck.", Zone.Hand);

            var deckSize = host.Count(Zone.Deck);

            if (deckSize == 0)
            {
                host.PutOnDeck(inserted);
            }
            else
            {
                var options = Enumerable.Range(0, deckSize + 1).Select(i =>
                {
                    var label =
                        i == 0 ? "Top" :
                        i == deckSize ? "Bottom" :
                        i.ToString();
                    return(new NamedOption(label, () => host.InsertIntoDeck(inserted.Name, i)));
                });
                await host.ChooseOne($"Choose where to put {inserted.Name}.", options.ToArray());
            }
        }
예제 #3
0
        protected override async Task ActAsync(IActionHost host)
        {
            var setAside = new List <string>();

            while (host.Count(Zone.Hand) < 7)
            {
                var drawn = host.DrawCards(1).SingleOrDefault();
                if (drawn == null)
                {
                    break;                // no cards left in deck or discard
                }
                if (drawn.Types.Contains(CardType.Action))
                {
                    var shouldSkip = await host.YesNo("Library", $@"<spans>
                        <run>Skip drawing</run>
                        <card>{drawn.Name}</card>
                        <run>and put it into your discard pile?</run>
                    </spans>");

                    if (shouldSkip)
                    {
                        setAside.Add(drawn.Name);
                    }
                }
            }

            if (setAside.Any())
            {
                host.Discard(setAside.ToArray());
            }
        }
예제 #4
0
 protected override void Act(IActionHost host)
 {
     host.DrawCards(2);
     if (host.Count(Zone.Hand) <= 5)
     {
         host.AddActions(2);
     }
 }
예제 #5
0
 protected override void Act(IActionHost host)
 {
     if (host.Count(Zone.Hand) > 0)
     {
         host.Discard(Zone.Hand);
     }
     else
     {
         host.CompleteDuration();
     }
 }
예제 #6
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);
            }
        }
예제 #7
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);
            }
        }
예제 #8
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);
         }
     })
                          );
 }
예제 #9
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);
                }
            })
                                 );
        }
예제 #10
0
        public async Task <Cost> GetValueAsync(IActionHost host)
        {
            var total = host.Count(Zone.Deck) + host.Count(Zone.Discard);

            return(total / 5);
        }