- More logic for Vaevictis, moved the relevant logic to SacrificeAi for clarity, only called from Pump now.

This commit is contained in:
Agetian
2018-12-11 08:35:01 +03:00
parent 9fec411bd5
commit d362f275e5
2 changed files with 40 additions and 27 deletions

View File

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

View File

@@ -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;
}
}