MCPcopy Create free account
hub / github.com/Card-Forge/forge / canLoot

Method canLoot

forge-ai/src/main/java/forge/ai/ability/DrawAi.java:184–219  ·  view source on GitHub ↗

Check if looter (draw + discard) effects are worthwhile

(Player ai, SpellAbility sa)

Source from the content-addressed store, hash-verified

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();

Callers 1

checkApiLogicMethod · 0.95

Calls 14

getAbilitySourceNameMethod · 0.95
isSpellMethod · 0.95
getConvergeCountMethod · 0.95
calculateAmountMethod · 0.95
findSubAbilityByTypeMethod · 0.80
getHostCardMethod · 0.65
sizeMethod · 0.65
containsMethod · 0.65
getSVarMethod · 0.65
getCardsInMethod · 0.45
equalsMethod · 0.45
isCardInPlayMethod · 0.45

Tested by

no test coverage detected