package com.vdom.core; import java.util.ArrayList; import java.util.List; import com.vdom.api.ActionCard; import com.vdom.api.Card; import com.vdom.api.TreasureCard; import com.vdom.api.VictoryCard; public abstract class QuickPlayPlayer extends BasePlayer { protected static final Card[] TRASH_CARDS = new Card[] { Cards.curse, Cards.estate, Cards.copper }; // public static QuickPlayPlayer instance = new QuickPlayPlayer(); public QuickPlayPlayer() { // Set mid game to 0, because usually the late game logic is better. // Better fix would be to keep the turnCount accurate for the game. midGame = 0; } @Override public String getPlayerName() { return "Quick Play"; } @Override public Card doAction(MoveContext context) { // Should never be called return null; } @Override public Card doBuy(MoveContext context) { // Should never be called return null; } public Card[] getTrashCards() { return TRASH_CARDS; } public boolean shouldAutoPlay_workshop_cardToObtain(MoveContext context) { return false; } public boolean shouldAutoPlay_feast_cardToObtain(MoveContext context) { return false; } public boolean shouldAutoPlay_remodel_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_remodel_cardToObtain(MoveContext context, int maxCost, boolean potion) { return false; } public boolean shouldAutoPlay_militia_attack_cardsToKeep(MoveContext context) { int canDiscard = 0; int total = 0; for (Card card : getHand()) { total++; if (card instanceof VictoryCard) { canDiscard++; } else { for(Card trash : getTrashCards()) { if(trash.equals(card)) { canDiscard++; break; } } } } if(total - canDiscard <= 3) { return true; } return false; } public boolean shouldAutoPlay_chancellor_shouldDiscardDeck(MoveContext context) { return true; } public boolean shouldAutoPlay_mine_treasureFromHandToUpgrade(MoveContext context) { return true; } public boolean shouldAutoPlay_chapel_cardsToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_cellar_cardsToDiscard(MoveContext context) { return false; } public boolean shouldAutoPlay_library_shouldKeepAction(MoveContext context, ActionCard action) { if(context.getActionsLeft() == 0) { return true; } return false; } public boolean shouldAutoPlay_spy_shouldDiscard(MoveContext context, Player targetPlayer, Card card) { return true; } public boolean shouldAutoPlay_scryingPool_shouldDiscard(MoveContext context, Player targetPlayer, Card card) { return true; } public boolean shouldAutoPlay_secretChamber_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_secretChamber_cardsToPutOnDeck(MoveContext context) { return false; } public boolean shouldAutoPlay_pawn_chooseOptions(MoveContext context) { return false; } public boolean shouldAutoPlay_torturer_attack_chooseOption(MoveContext context) { return true; } public boolean shouldAutoPlay_steward_chooseOption(MoveContext context) { return false; } public boolean shouldAutoPlay_steward_cardsToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_swindler_cardToSwitch(MoveContext context, int cost, boolean potion) { return true; } public boolean shouldAutoPlay_torturer_attack_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_courtyard_cardToPutBackOnDeck(MoveContext context) { return false; } public boolean shouldAutoPlay_baron_shouldDiscardEstate(MoveContext context) { return true; } public boolean shouldAutoPlay_ironworks_cardToObtain(MoveContext context) { return false; } public boolean shouldAutoPlay_masquerade_cardToPass(MoveContext context) { return false; } public boolean shouldAutoPlay_masquerade_cardToTrash(MoveContext context) { return true; } public boolean shouldAutoPlay_miningVillage_shouldTrashMiningVillage(MoveContext context) { return false; } public boolean shouldAutoPlay_saboteur_cardToObtain(MoveContext context, int maxCost, boolean potion) { return false; } public boolean shouldAutoPlay_topOfDeck_orderCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_scout_orderCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_mandarin_orderCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_nobles_chooseOptions(MoveContext context) { return true; } public boolean shouldAutoPlay_tradingPost_cardsToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_wishingWell_cardGuess(MoveContext context) { return true; } public boolean shouldAutoPlay_upgrade_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_upgrade_cardToObtain(MoveContext context, int exactCost, boolean potion) { return false; } public boolean shouldAutoPlay_minion_chooseOption(MoveContext context) { return true; } public boolean shouldAutoPlay_ghostShip_attack_cardsToPutBackOnDeck(MoveContext context) { return false; } public boolean shouldAutoPlay_warehouse_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_salvager_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_pirateShip_takeTreasure(MoveContext context) { return true; } public boolean shouldAutoPlay_nativeVillage_takeCards(MoveContext context) { if(nativeVillage == null || nativeVillage.isEmpty()) { return true; } return false; } public boolean shouldAutoPlay_smugglers_cardToObtain(MoveContext context) { return true; } public boolean shouldAutoPlay_island_cardToSetAside(MoveContext context) { return true; } public boolean shouldAutoPlay_haven_cardToSetAside(MoveContext context) { return false; } public boolean shouldAutoPlay_navigator_shouldDiscardTopCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_navigator_cardOrder(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_embargo_supplyToEmbargo(MoveContext context) { return false; } public boolean shouldAutoPlay_lookout_cardToTrash(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_lookout_cardToDiscard(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_ambassador_revealedCard(MoveContext context) { return true; } public boolean shouldAutoPlay_ambassador_returnToSupplyFromHand(MoveContext context, Card card) { return true; } public boolean shouldAutoPlay_pearlDiver_shouldMoveToTop(MoveContext context, Card card) { return true; } public boolean shouldAutoPlay_explorer_shouldRevealProvince(MoveContext context) { return true; } public boolean shouldAutoPlay_university_actionCardToObtain(MoveContext context) { return false; } public boolean shouldAutoPlay_apprentice_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_transmute_cardToTrash(MoveContext context) { return true; } public boolean shouldAutoPlay_alchemist_backOnDeck(MoveContext context) { return false; } public boolean shouldAutoPlay_herbalist_backOnDeck(MoveContext context, TreasureCard[] cards) { return true; } public boolean shouldAutoPlay_apothecary_cardsForDeck(MoveContext context, ArrayList<Card> cards) { return true; } public boolean shouldAutoPlay_bishop_cardToTrashForVictoryTokens(MoveContext context) { return true; } public boolean shouldAutoPlay_bishop_cardToTrash(MoveContext context) { return true; } public boolean shouldAutoPlay_expand_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_expand_cardToObtain(MoveContext context, int maxCost, boolean potion) { return false; } public boolean shouldAutoPlay_forge_cardsToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_forge_cardToObtain(MoveContext context, int exactCost) { return false; } public boolean shouldAutoPlay_goons_attack_cardsToKeep(MoveContext context) { return false; } public boolean shouldAutoPlay_mint_treasureToMint(MoveContext context) { int treasureCount = 0; for(Card c : getHand()) { if(c instanceof TreasureCard) { treasureCount++; } } if(treasureCount <= 1) { return true; } for(Card c : getHand()) { if(c instanceof TreasureCard && !(c.equals(Cards.copper) || c.equals(Cards.silver) || c.equals(Cards.gold) || c.equals(Cards.platinum))) { return false; } } return true; } public boolean shouldAutoPlay_mountebank_attack_shouldDiscardCurse(MoveContext context) { return false; } public boolean shouldAutoPlay_rabble_attack_cardOrder(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_tradeRoute_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_vault_cardsToDiscardForGold(MoveContext context) { return false; } public boolean shouldAutoPlay_vault_cardsToDiscardForCard(MoveContext context) { return false; } public boolean shouldAutoPlay_contraband_cardPlayerCantBuy(MoveContext context) { return true; } public boolean shouldAutoPlay_kingsCourt_cardToPlay(MoveContext context) { return false; } public boolean shouldAutoPlay_throneRoom_cardToPlay(MoveContext context) { return false; } public boolean shouldAutoPlay_loan_shouldTrashTreasure(MoveContext context, Card treasure) { return false; } public boolean shouldAutoPlay_royalSeal_shouldPutCardOnDeck(MoveContext context, Card card) { return true; } public boolean shouldAutoPlay_watchTower_chooseOption(MoveContext context, Card card) { return true; } public boolean shouldAutoPlay_treasureCardsToPlayInOrder(MoveContext context) { return true; } public boolean shouldAutoPlay_golem_cardOrder(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_hamlet_cardToDiscardForAction(MoveContext context) { int actionCards = 0; int trashCards = 0; for(Card c : getHand()) { if(c instanceof ActionCard) { actionCards++; } for(Card trash : getTrashCards()) { if(c.equals(trash)) { trashCards++; } } } if(actionCards == 0) { return true; } if(actionCards > 0 && trashCards > 0) { return true; } return false; } public boolean shouldAutoPlay_hamlet_cardToDiscardForBuy(MoveContext context) { return true; } public boolean shouldAutoPlay_hornOfPlenty_cardToObtain(MoveContext context, int maxCost) { return false; } public boolean shouldAutoPlay_horseTraders_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_jester_chooseOption(MoveContext context, Player targetPlayer, Card card) { return true; } public boolean shouldAutoPlay_remake_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_remake_cardToObtain(MoveContext context, int exactCost, boolean potion) { return false; } public boolean shouldAutoPlay_tournament_shouldRevealProvince(MoveContext context) { return true; } public boolean shouldAutoPlay_tournament_chooseOption(MoveContext context) { return false; } public boolean shouldAutoPlay_tournament_choosePrize(MoveContext context) { return false; } public boolean shouldAutoPlay_youngWitch_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_followers_attack_cardsToKeep(MoveContext context) { return false; } public boolean shouldAutoPlay_trustySteed_chooseOptions(MoveContext context) { return false; } public boolean shouldAutoPlay_mine_treasureToObtain(MoveContext context, int maxCost, boolean potion) { return true; } public boolean shouldAutoPlay_bureaucrat_cardToReplace(MoveContext context) { return false; } public boolean shouldAutoPlay_thief_treasureToTrash(MoveContext context, TreasureCard[] treasures) { return true; } public boolean shouldAutoPlay_thief_treasuresToGain(MoveContext context, TreasureCard[] treasures) { return true; } public boolean shouldAutoPlay_pirateShip_treasureToTrash(MoveContext context, TreasureCard[] treasures) { return true; } public boolean shouldAutoPlay_tunnel_shouldReveal(MoveContext context) { return true; } public boolean shouldAutoPlay_duchess_shouldGainBecauseOfDuchy(MoveContext context) { return true; } public boolean shouldAutoPlay_duchess_shouldDiscardCardFromTopOfDeck(MoveContext context, Card card) { for(Card trash : getTrashCards()) { if(trash.equals(card)) { return true; } } if(isOnlyVictory(card)) { return true; } return false; } public boolean shouldAutoPlay_foolsGold_shouldTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_trader_shouldGainSilverInstead(MoveContext context, Card card) { if(isTrashCard(card)) { return true; } return false; } public boolean shouldAutoPlay_trader_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_oasis_cardToDiscard(MoveContext context) { for(Card c : getHand()) { if(isTrashCard(c) || isOnlyTreasure(c)) { return true; } } return false; } public boolean shouldAutoPlay_jackOfAllTrades_shouldDiscardCardFromTopOfDeck(MoveContext context, Card card) { if(isTrashCard(card) || isOnlyVictory(card)) { return true; } return false; } public boolean shouldAutoPlay_jackOfAllTrades_nonTreasureToTrash(MoveContext context) { return true; // for(Card card : getHand()) { // if(isTrashCard(card) && !(card instanceof TreasureCard)) { // return true; // } // } // // return false; } public boolean shouldAutoPlay_nobleBrigand_silverOrGoldToTrash(MoveContext context, TreasureCard[] silverOrGoldCards) { return true; } public boolean shouldAutoPlay_oracle_shouldDiscard(MoveContext context, Player player, ArrayList<Card> cards) { return true; } public boolean shouldAutoPlay_oracle_orderCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_develop_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_develop_lowCardToGain(MoveContext context, int cost, boolean potion) { return false; } public boolean shouldAutoPlay_develop_highCardToGain(MoveContext context, int cost, boolean potion) { return false; } public boolean shouldAutoPlay_develop_orderCards(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_cartographer_cardsFromTopOfDeckToDiscard(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_cartographer_cardOrder(MoveContext context, Card[] cards) { return true; } public boolean shouldAutoPlay_spiceMerchant_chooseOption(MoveContext context) { return false; } public boolean shouldAutoPlay_spiceMerchant_treasureToTrash(MoveContext context) { for(Card card : getHand()) { for(Card trash : getTrashCards()) { if(trash.equals(card) && (card instanceof TreasureCard)) { return true; } } } return false; } public boolean shouldAutoPlay_embassy_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_illGottenGains_gainCopper(MoveContext context) { return true; } public boolean shouldAutoPlay_haggler_cardToObtain(MoveContext context, int maxCost, boolean potion) { return false; } public boolean shouldAutoPlay_scheme_actionToPutOnTopOfDeck(MoveContext context, ActionCard[] actions) { return false; } public boolean shouldAutoPlay_inn_cardsToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_inn_shuffleCardBackIntoDeck(MoveContext context, ActionCard card) { return true; } public boolean shouldAutoPlay_farmland_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_farmland_cardToObtain(MoveContext context, int exactCost, boolean potion) { return false; } public boolean shouldAutoPlay_stables_treasureToDiscard(MoveContext context) { return false; } public boolean shouldAutoPlay_borderVillage_cardToObtain(MoveContext context) { return false; } public boolean shouldAutoPlay_mandarin_cardToReplace(MoveContext context) { return false; } public boolean shouldAutoPlay_rats_cardToTrash(MoveContext context) { return false; } public boolean shouldAutoPlay_pillage_opponentCardToDiscard(MoveContext context) { return true; } public boolean shouldAutoPlay_margrave_attack_cardsToKeep(MoveContext context) { return shouldAutoPlay_militia_attack_cardsToKeep(context); } public boolean shouldAutoPlay_revealBane(MoveContext context) { return true; } public boolean shouldAutoPlay_selectPutBackOption(MoveContext context, List<PutBackOption> putBacks) { return true; } public boolean shouldAutoPlay_walledVillage_backOnDeck(MoveContext context) { return false; } public boolean shouldAutoPlay_envoy_opponentCardToDiscard(MoveContext context) { return false; } public boolean shouldAutoPlay_cultist_shouldPlayNext(MoveContext context) { return true; } public boolean shouldAutoPlay_urchin_shouldTrashForMercenary(MoveContext context) { return true; } public boolean shouldAutoPlay_madman_shouldReturnToPile(MoveContext context) { return true; } public boolean shouldAutoPlay_procession_cardToObtain(MoveContext context, int maxCost, boolean potion) { return false; } public boolean shouldAutoPlay_bandOfMisfits_actionCardToImpersonate(MoveContext context) { return false; } public boolean shouldAutoPlay_taxman_treasureToObtain(MoveContext context, int maxCost) { return true; } }