diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 4e4cfd75e3e..9448c9c73ba 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -40,6 +40,8 @@ import forge.card.mana.ManaCost; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.game.CardTraitBase; +import forge.game.CardTraitPredicates; import forge.game.Direction; import forge.game.Game; import forge.game.GameEntity; @@ -1607,6 +1609,10 @@ public class AiController { return filterList(input, SpellAbilityPredicates.isApi(type)); } + private List filterListByAiLogic(List list, final String logic) { + return filterList(list, CardTraitPredicates.hasParam("AiLogic", logic)); + } + public List chooseModeForAbility(SpellAbility sa, int min, int num, boolean allowRepeat) { if (simPicker != null) { return simPicker.chooseModeForAbility(sa, min, num, allowRepeat); @@ -1632,6 +1638,42 @@ public class AiController { return true; } + + public ReplacementEffect chooseSingleReplacementEffect(List list, + Map runParams) { + // no need to choose anything + if (list.size() <= 1) { + return Iterables.getFirst(list, null); + } + + if (runParams.containsKey("Event")) { + // replace lifegain effects + if ("GainLife".equals(runParams.get("Event"))) { + List noGain = filterListByAiLogic(list, "NoLife"); + List loseLife = filterListByAiLogic(list, "LoseLife"); + List doubleLife = filterListByAiLogic(list, "DoubleLife"); + List lichDraw = filterListByAiLogic(list, "LichDraw"); + + if (!noGain.isEmpty()) { + // no lifegain is better than lose life + return Iterables.getFirst(noGain, null); + } else if (!loseLife.isEmpty()) { + // lose life before double life to prevent lose double + return Iterables.getFirst(loseLife, null); + } else if (!lichDraw.isEmpty()) { + // lich draw before double life to prevent to draw to much + return Iterables.getFirst(lichDraw, null); + } else if (!doubleLife.isEmpty()) { + // other than that, do double life + return Iterables.getFirst(doubleLife, null); + } + } + } + + // AI logic for choosing which replacement effect to apply + // happens here. + return Iterables.getFirst(list, null); + } } diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 58db8e764db..3901cc25bfc 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -603,9 +603,7 @@ public class PlayerControllerAi extends PlayerController { @Override public ReplacementEffect chooseSingleReplacementEffect(String prompt, List possibleReplacers, Map runParams) { - // AI logic for choosing which replacement effect to apply - // happens here. - return possibleReplacers.get(0); + return brains.chooseSingleReplacementEffect(possibleReplacers, runParams); } @Override