protected override async Task ActAsync(IActionHost host) { host.AddCoins(2); var top5 = host.Examine(Zone.DeckTop(5)); var namesBuilder = new StringBuilder(); { for (var i = 0; i < top5.Length; i++) { var suffix = (i == top5.Length - 1) ? "" : (i == top5.Length - 2) ? " and" : ","; namesBuilder.Append($"<card suffix='{suffix}'>{top5[i].Name}</card>"); } } var names = namesBuilder.ToString(); await host.ChooseOne("Navigator", new NamedOption($"<run>Discard cards:</run>{names}.", () => host.Discard(top5, Zone.Deck)), new NamedOption("<run>Put cards back on deck.</run>", async() => { var reordered = await host.OrderCards("Navigator", Zone.DeckTop(5)); host.Reorder(reordered, Zone.DeckTop(5)); }) ); }
protected override async Task ActAsync(IActionHost host) { host.AddActions(2); var cards = host.Examine(Zone.PlayerMat("NativeVillageMat")); await host.ChooseOne("Native Village", new NamedOption("Add card to mat.", () => { var topDeck = host.Examine(Zone.DeckTop(1)); host.PutOnMat("NativeVillageMat", topDeck, Zone.Deck); }), new NamedOption($"Retrieve all cards ({(cards.Any() ? cards.Length.ToString() : "none")}).", () => { host.PutIntoHand(Zone.PlayerMat("NativeVillageMat")); }) ); }
protected override async Task OnDiscardFromPlayAsync(IActionHost host) { var bought = host.Examine(Zone.RecentBuys); var boughtVictories = bought.Any(card => card.Types.Contains(CardType.Victory)); if (!boughtVictories && await host.YesNo("Treasury", "<run>Put</run><card>Treasury</card><run>back onto your deck?</run>")) { host.PutOnDeck("Treasury", Zone.Discard); } }
public static ICard[] Reveal(this IActionHost host, Zone from) { var cards = host.Examine(from); if (cards.Any()) { host.Reveal(cards, from); } return(cards); }
protected override async Task OnDiscardFromPlayAsync(IActionHost host) { // XXX RAW you choose discard order, but we elide that for UI reasons. in practice we trigger all IReactor discards first var playedPotion = host.Examine(Zone.InPlay).Any(card => card.Name == "Potion"); if (playedPotion && await host.YesNo("Alchemist", "<run>Put</run><card>Alchemist</card><run>back onto your deck?</run>")) { host.PutOnDeck("Alchemist", Zone.Discard); } }
protected override async Task ActAsync(IActionHost host) { host.Trash("TreasureMap", Zone.InPlay); var hand = host.Examine(Zone.Hand); if (hand.Any(card => card.Name == "TreasureMap")) { host.Trash("TreasureMap", Zone.Hand); await host.Gain(new[] { "Gold", "Gold", "Gold", "Gold" }, Zone.Deck); } }
protected override async Task ActAsync(IActionHost host) { if (host.Examine(Zone.Hand).Any(card => card is Base.Copper)) { if (await host.YesNo("Moneylender", $@"Do you want to trash a Copper?")) { host.Trash("Copper"); host.AddCoins(3); } } }
protected override void Act(IActionHost host) { if (host.Examine(Zone.RecentPlays).Any(card => card.Name == "Outpost") || host.PreviousPlayer == host.Player) { host.CompleteDuration(); } else { host.InsertExtraTurn(host.Player, host.Player); } }
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 bottomCard = host.Examine(Zone.DeckBottom).SingleOrDefault(); if (bottomCard != null && await host.YesNo("Pearl Diver", $"<run>Put</run><card>{bottomCard.Name}</card><run>on top of your deck?</run>")) { host.PutOnDeck(bottomCard, Zone.DeckBottom); } }
protected override async Task ActAsync(IActionHost host) { var hand = host.Examine(Zone.Hand); if (hand.Names().Contains("Province") && await host.YesNo("Explorer", "<run>Reveal a</run><card>Province</card><run>from your hand?</run>")) { host.Reveal("Province"); await host.Gain("Gold", Zone.Hand); } else { await host.Gain("Silver", Zone.Hand); } }
protected override async Task ActAsync(IActionHost host) { var lastGains = host.Examine(Zone.RecentGains, host.GetPlayerToRight()).Where(c => c.GetCost(host).LessThanOrEqual(6)); if (lastGains.Count() == 1) { await host.Gain(lastGains.Single()); } else if (lastGains.Count() > 1) { var gainedCopy = await host.SelectCard("Choose a card to gain.", lastGains); await host.Gain(gainedCopy); } }
protected override async Task ActAsync(IActionHost host) { host.AddCoins(2); var discarded = host.Examine(Zone.DeckTop(1)).SingleOrDefault(); if (discarded != null && discarded.Types.Contains(CardType.Action)) { host.Discard(discarded, Zone.Deck); if (await host.YesNo("Vassal", $"<card prefix='Play ' suffix='?'>{discarded.Name}</card>")) { await host.PlayCard(discarded.Name, Zone.Discard); } } }
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) { host.AddBuys(1); var hand = host.Examine(Zone.Hand); if (hand.Any(card => card.Name == "Estate")) { if (await host.YesNo("Baron", @"<run>Discard an</run> <card>Estate</card> <run>for</run> <sym>+coin4?</sym>")) { host.Discard("Estate"); host.AddCoins(4); return; } } await host.Gain("Estate"); }
public static void PutIntoHand(this IActionHost host, Zone from) { var cards = host.Examine(from); host.PutIntoHand(cards, from); }
public static async Task <ICard[]> OrderCards(this IActionHost host, string prompt, Zone @in) { var sourceCards = host.Examine(@in); return(await host.OrderCards(prompt, sourceCards.Names())); }