diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java index df4e8b43f5c..c8c5331068f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java @@ -306,17 +306,16 @@ public class ComputerUtilAbility { a1 += getSpellAbilityPriority(a); b1 += getSpellAbilityPriority(b); - int diff = b1 - a1; - - // If both are creature spells with roughly the same priority sort them after - if (safeToEvaluateCreatures && Math.abs(diff) < 4 && a.getApi() == ApiType.PermanentCreature && b.getApi() == ApiType.PermanentCreature) { - return 0; + // If both are creature spells sort them after + if (safeToEvaluateCreatures) { + a1 += Math.round(ComputerUtilCard.evaluateCreature(a) / 100f); + b1 += Math.round(ComputerUtilCard.evaluateCreature(b) / 100f); } - return diff; + return b1 - a1; } - private int getSpellAbilityPriority(SpellAbility sa) { + private static int getSpellAbilityPriority(SpellAbility sa) { int p = 0; Card source = sa.getHostCard(); final Player ai = source == null ? sa.getActivatingPlayer() : source.getController(); @@ -395,6 +394,7 @@ public class ComputerUtilAbility { }; public static List sortCreatureSpells(List all) { + // try to smoothen power creeping by making CMC less of a factor List creatures = AiController.filterListByApi(Lists.newArrayList(all), ApiType.PermanentCreature); Collections.sort(creatures, ComputerUtilCard.EvaluateCreatureSpellComparator); int idx = 0; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index ac1ecda800f..9127805e45d 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -570,13 +570,8 @@ public class ComputerUtilCard { public static final Comparator EvaluateCreatureSpellComparator = new Comparator() { @Override public int compare(final SpellAbility a, final SpellAbility b) { - // only reorder if generic priorities can't decide - // TODO ideally we could reuse the value - int comp = ComputerUtilAbility.saEvaluator.compareEvaluator(a, b, true); - if (comp == 0) { - return evaluateCreature(b) - evaluateCreature(a); - } - return comp; + // TODO ideally we could reuse the value from the previous pass with false + return ComputerUtilAbility.saEvaluator.compareEvaluator(a, b, true); } };