diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index cc7e82b6501..fc824738fb9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -484,33 +484,7 @@ public class PumpAi extends PumpAiBase { } else if (sa.getParam("AILogic").equals("SacOneEach")) { // each player sacrifices one permanent, e.g. Vaevictis, Asmadi the Dire - grab the worst for allied and // the best for opponents - sa.resetTargets(); - for (Player p : game.getPlayers()) { - CardCollection targetable = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa)); - if (!targetable.isEmpty()) { - if (p.isOpponentOf(ai)) { - sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); - } else { - CardCollection priorityTgts = new CardCollection(); - for (Card c : targetable) { - if (c.canBeSacrificed() && (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) && !c.equals(sa.getHostCard())) { - priorityTgts.add(c); - } - } - if (!priorityTgts.isEmpty()) { - sa.getTargets().add(priorityTgts.getFirst()); - } else { - targetable.remove(sa.getHostCard()); - if (!targetable.isEmpty()) { - sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); - } else { - sa.getTargets().add(sa.getHostCard()); // sac self only as a last resort - } - } - } - } - } - return true; + return SacrificeAi.doSacOneEachLogic(ai, sa); } if (isFight) { return FightAi.canFightAi(ai, sa, attack, defense); diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index 4cef29c7ef5..97ebb3004df 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -4,8 +4,10 @@ import forge.ai.ComputerUtil; import forge.ai.ComputerUtilCard; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; +import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.keyword.Keyword; @@ -157,4 +159,41 @@ public class SacrificeAi extends SpellAbilityAi { return true; } + public static boolean doSacOneEachLogic(Player ai, SpellAbility sa) { + Game game = ai.getGame(); + + sa.resetTargets(); + for (Player p : game.getPlayers()) { + CardCollection targetable = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), CardPredicates.isTargetableBy(sa)); + if (!targetable.isEmpty()) { + CardCollection priorityTgts = new CardCollection(); + if (p.isOpponentOf(ai)) { + priorityTgts.addAll(CardLists.filter(targetable, CardPredicates.canBeSacrificedBy(sa))); + if (!priorityTgts.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getBestAI(priorityTgts)); + } else { + sa.getTargets().add(ComputerUtilCard.getBestAI(targetable)); + } + } else { + for (Card c : targetable) { + if (c.canBeSacrificedBy(sa) && (c.hasSVar("SacMe") || (c.isCreature() && ComputerUtilCard.evaluateCreature(c) <= 135)) && !c.equals(sa.getHostCard())) { + priorityTgts.add(c); + } + } + if (!priorityTgts.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(priorityTgts, false, false, false, false)); + } else { + targetable.remove(sa.getHostCard()); + if (!targetable.isEmpty()) { + sa.getTargets().add(ComputerUtilCard.getWorstPermanentAI(targetable, true, true, true, false)); + } else { + sa.getTargets().add(sa.getHostCard()); // sac self only as a last resort + } + } + } + } + } + return true; + } + }