private boolean pumpMandatoryTarget( final Player ai, final SpellAbility sa, final boolean mandatory) { final Game game = ai.getGame(); List<Card> list = game.getCardsIn(ZoneType.Battlefield); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Player opp = ai.getOpponent(); list = CardLists.getValidCards( list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); list = CardLists.getTargetableCards(list, sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { sa.resetTargets(); return false; } // Remove anything that's already been targeted for (final Card c : sa.getTargets().getTargetCards()) { list.remove(c); } List<Card> pref; List<Card> forced; final Card source = sa.getHostCard(); if (sa.isCurse()) { pref = CardLists.filterControlledBy(list, opp); forced = CardLists.filterControlledBy(list, ai); } else { pref = CardLists.filterControlledBy(list, ai); forced = CardLists.filterControlledBy(list, opp); } while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) { if (pref.isEmpty()) { break; } Card c; if (CardLists.getNotType(pref, "Creature").isEmpty()) { c = ComputerUtilCard.getBestCreatureAI(pref); } else { c = ComputerUtilCard.getMostExpensivePermanentAI(pref, sa, true); } pref.remove(c); sa.getTargets().add(c); } while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { if (forced.isEmpty()) { break; } Card c; if (CardLists.getNotType(forced, "Creature").isEmpty()) { c = ComputerUtilCard.getWorstCreatureAI(forced); } else { c = ComputerUtilCard.getCheapestPermanentAI(forced, sa, true); } forced.remove(c); sa.getTargets().add(c); } if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) { sa.resetTargets(); return false; } return true; } // pumpMandatoryTarget()