Check if looter (draw + discard) effects are worthwhile
(Player ai, SpellAbility sa)
| 182 | * Check if looter (draw + discard) effects are worthwhile |
| 183 | */ |
| 184 | private boolean canLoot(Player ai, SpellAbility sa) { |
| 185 | final SpellAbility sub = sa.findSubAbilityByType(ApiType.Discard); |
| 186 | if (sub != null) { |
| 187 | final Card source = sa.getHostCard(); |
| 188 | final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); |
| 189 | |
| 190 | int numHand = ai.getCardsIn(ZoneType.Hand).size(); |
| 191 | if ("Jace, Vryn's Prodigy".equals(sourceName) && ai.getCardsIn(ZoneType.Graveyard).size() > 3) { |
| 192 | return !ai.isCardInPlay("Jace, Telepath Unbound"); |
| 193 | } |
| 194 | if (source.isSpell() && ai.getCardsIn(ZoneType.Hand).contains(source)) { |
| 195 | numHand--; // remember to count looter card if it is a spell in hand |
| 196 | } |
| 197 | int numDraw = 1; |
| 198 | |
| 199 | if (sa.hasParam("NumCards")) { |
| 200 | String numDrawStr = sa.getParam("NumCards"); |
| 201 | if (numDrawStr.equals("X") && sa.getSVar(numDrawStr).equals("Count$Converge")) { |
| 202 | numDraw = ComputerUtilMana.getConvergeCount(sa, ai); |
| 203 | } else { |
| 204 | numDraw = AbilityUtils.calculateAmount(source, numDrawStr, sa); |
| 205 | } |
| 206 | } |
| 207 | int numDiscard = 1; |
| 208 | if (sub.hasParam("NumCards")) { |
| 209 | numDiscard = AbilityUtils.calculateAmount(source, sub.getParam("NumCards"), sub); |
| 210 | } |
| 211 | if (numHand == 0 && numDraw == numDiscard) { |
| 212 | return false; // no looting since everything is dumped |
| 213 | } |
| 214 | if (numHand + numDraw < numDiscard) { |
| 215 | return false; // net loss of cards |
| 216 | } |
| 217 | } |
| 218 | return true; |
| 219 | } |
| 220 | |
| 221 | private boolean targetAI(final Player ai, final SpellAbility sa, final boolean mandatory) { |
| 222 | final Card source = sa.getHostCard(); |
no test coverage detected