mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
- More logic for Vaevictis, moved the relevant logic to SacrificeAi for clarity, only called from Pump now.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user